John's original code for patch #6210.
authorBen Pfaff <blp@gnu.org>
Tue, 25 Sep 2007 04:16:19 +0000 (04:16 +0000)
committerBen Pfaff <blp@gnu.org>
Tue, 25 Sep 2007 04:16:19 +0000 (04:16 +0000)
src/data/ChangeLog
src/data/settings.c
src/data/settings.h
src/ui/gui/ChangeLog
src/ui/gui/message-dialog.c
src/ui/gui/output-viewer.c
src/ui/gui/output-viewer.h
src/ui/gui/psppire.c
src/ui/terminal/ChangeLog
src/ui/terminal/main.c

index 0bec245b2fba9b1316d463ce8db702f0efb1e6f5..51568e785cbba6095e95c741cfc004c6374adb79 100644 (file)
@@ -1,3 +1,9 @@
+2007-09-19  John Darrington <john@darrington.wattle.id.au>
+       
+       * settings.c settings.h: Changed viewport's length and width to be 
+       owned by the user interface which uses the data library.  This allows
+       better abstraction, and makes dynamically adjustable dimensions easier.
+       
 2007-09-18  Ben Pfaff  <blp@gnu.org>
 
        * procedure.c (proc_extract_active_file_data): New function.
index b0fc89ae55e1d9b4145ff8c64f18e9bcf804b02d..095a93185408174fb211a1a713182c27c871bc10 100644 (file)
@@ -29,8 +29,8 @@
 #include "gettext.h"
 #define _(msgid) gettext (msgid)
 
-static int viewlength = 24;
-static int viewwidth = 79;
+static int *viewlength = NULL;
+static int *viewwidth = NULL;
 static bool long_view = false;
 
 static bool safer_mode = false;
@@ -74,13 +74,12 @@ static int *algorithm = &global_algorithm;
 
 static int syntax = ENHANCED;
 
-static void init_viewport (void);
-static void get_termcap_viewport (void);
+static void init_viewport (int *, int *);
 
 void
-settings_init (void)
+settings_init (int *width, int *length)
 {
-  init_viewport ();
+  init_viewport (width, length);
   i18n_init ();
 }
 
@@ -94,14 +93,14 @@ settings_done (void)
 int
 get_viewlength (void)
 {
-  return viewlength;
+  return *viewlength;
 }
 
 /* Sets the view length. */
 void
 set_viewlength (int viewlength_)
 {
-  viewlength = viewlength_;
+  *viewlength = viewlength_;
 }
 
 /* Set view width to a very long value, and prevent it from ever
@@ -110,42 +109,34 @@ void
 force_long_view (void)
 {
   long_view = true;
-  viewwidth = 9999;
 }
 
 /* Screen width. */
 int
 get_viewwidth(void)
 {
-  return viewwidth;
+  if (long_view)
+    return 9999;
+
+  return *viewwidth;
 }
 
 /* Sets the screen width. */
 void
 set_viewwidth (int viewwidth_)
 {
-  viewwidth = viewwidth_;
+  *viewwidth = viewwidth_;
 }
 
 static void
-init_viewport (void)
+init_viewport (int  *width, int *length)
 {
+  viewwidth = width;
+  viewlength = length;
+
   if (long_view)
     return;
 
-  viewwidth = viewlength = -1;
-
-  get_termcap_viewport ();
-
-  if (viewwidth < 0 && getenv ("COLUMNS") != NULL)
-    viewwidth = atoi (getenv ("COLUMNS"));
-  if (viewlength < 0 && getenv ("LINES") != NULL)
-    viewlength = atoi (getenv ("LINES"));
-
-  if (viewwidth < 0)
-    viewwidth = 79;
-  if (viewlength < 0)
-    viewlength = 24;
 }
 
 /* Whether PSPP can erase and overwrite files. */
@@ -498,38 +489,3 @@ set_syntax (enum behavior_mode mode)
 {
   syntax = mode;
 }
-\f
-/* Code that interfaces to ncurses.  This must be at the very end
-   of this file because curses.h redefines "bool" on some systems
-   (e.g. OpenBSD), causing declaration mismatches with functions
-   that have parameters or return values of type "bool". */
-#if HAVE_LIBNCURSES
-#include <curses.h>
-#include <term.h>
-
-static void
-get_termcap_viewport (void)
-{
-  char term_buffer[16384];
-  if (getenv ("TERM") == NULL)
-    return;
-  else if (tgetent (term_buffer, getenv ("TERM")) <= 0)
-    {
-      error (0,0, _("could not access definition for terminal `%s'"),
-             getenv ("TERM"));
-      return;
-    }
-
-  if (tgetnum ("li") > 0)
-    viewlength = tgetnum ("li");
-
-  if (tgetnum ("co") > 1)
-    viewwidth = tgetnum ("co") - 1;
-}
-#else /* !HAVE_LIBNCURSES */
-static void
-get_termcap_viewport (void)
-{
-  /* Nothing to do. */
-}
-#endif /* !HAVE_LIBNCURSES */
index ac4c1e202b89d4455a2ebc4f8bda075c8699b557..63e3d1fe7e294400d341503686d7fe786335c6f4 100644 (file)
@@ -20,7 +20,7 @@
 #include <stdbool.h>
 #include <stddef.h>
 
-void settings_init (void);
+void settings_init (int *, int *);
 void settings_done (void);
 
 void force_long_view (void);
index 31453f01c17913f0a1a0760b43b329d14c07c713..72d615b6156f076e5d3bce3cffe72b2fd0b744b5 100644 (file)
@@ -1,3 +1,14 @@
+2007-09-19  John Darrington <john@darrington.wattle.id.au>
+       
+       * message-dialog.c: Changed the ouput message title to be 
+       appropriate for the severity of the message.
+
+       * output-viewer.c output-viewer.h : Added a callback for the resize 
+       signal of the output viewer, and set the viewport length and
+       width accordingly.
+
+       * psppire.c: Update to new init_settings interface.
+
 2007-09-27  John Darrington <john@darrington.wattle.id.au>
 
        Addressing bug #20821:
index fca13956b1f600fb8ea141ed54df6a02e1979c8f..969758e2fbb2ede00f5633fec16519fb52736c3c 100644 (file)
@@ -103,29 +103,58 @@ popup_message (const struct msg *m)
     {
     case MSG_ERROR:
       message_type = GTK_MESSAGE_ERROR;
+      switch (m->category)
+       {
+       case MSG_SYNTAX:
+         msg = _("Script Error");
+         break;
+
+       case MSG_DATA:
+         msg = _("Data File Error");
+         break;
+
+       case MSG_GENERAL:
+       default:
+         msg = _("PSPP Error");
+         break;
+       };
       break;
     case MSG_WARNING:
       message_type = GTK_MESSAGE_WARNING;
+      switch (m->category)
+       {
+       case MSG_SYNTAX:
+         msg = _("Script Warning");
       break;
-    case MSG_NOTE:
+
+       case MSG_DATA:
+         msg = _("Data File Warning");
+         break;
+
+       case MSG_GENERAL:
     default:
-      message_type = GTK_MESSAGE_INFO;
+         msg = _("PSPP Warning");
       break;
     };
-
+      break;
+    case MSG_NOTE:
+    default:
+      message_type = GTK_MESSAGE_INFO;
   switch (m->category)
     {
     case MSG_SYNTAX:
-      msg = _("Script Error");
+         msg = _("Script Information");
       break;
 
     case MSG_DATA:
-      msg = _("Data File Error");
+         msg = _("Data File Information");
       break;
 
     case MSG_GENERAL:
     default:
-      msg = _("PSPP Error");
+         msg = _("PSPP Information");
+         break;
+       };
       break;
     };
 
index d2f46bab59173d6c21459c288c52237703e5c3b0..62dc85f1c2a4147c9cb1cff7b72059c60babf67d 100644 (file)
@@ -46,6 +46,8 @@ cancel_urgency (GtkWindow *window,  gpointer data)
 
 static struct output_viewer *the_output_viewer = NULL;
 
+int viewer_length = -1;
+int viewer_width = -1;
 
 /* Callback for the "delete" action (clicking the x on the top right
    hand corner of the window) */
@@ -64,6 +66,46 @@ on_delete (GtkWidget *w, GdkEvent *event, gpointer user_data)
 }
 
 
+/* Sets width and length according to the new size
+   of the output window */
+static void
+on_textview_resize (GtkWidget     *widget,
+                   GtkAllocation *allocation,
+                   gpointer       user_data)
+{
+  PangoContext * context ;
+  PangoLayout *layout ;
+  PangoRectangle logical;
+  GtkStyle *style;
+  gint right_margin, left_margin;
+  GtkTextView *text_view = GTK_TEXT_VIEW (widget);
+
+  context = gtk_widget_create_pango_context (widget);
+  layout = pango_layout_new (context);
+
+  style = gtk_widget_get_style (widget);
+
+  pango_layout_set_font_description (layout, style->font_desc);
+
+  /* Find the width of one character.  We can use any character, because
+     the textview has a monospaced font */
+  pango_layout_set_text (layout, "M", 1);
+
+  pango_layout_get_extents (layout,  NULL, &logical);
+
+  left_margin = gtk_text_view_get_left_margin (text_view);
+  right_margin = gtk_text_view_get_right_margin (text_view);
+
+  viewer_length = allocation->height / PANGO_PIXELS (logical.height);
+  viewer_width = (allocation->width - right_margin - left_margin)
+    / PANGO_PIXELS (logical.width);
+
+  g_object_unref (G_OBJECT (layout));
+  g_object_unref (G_OBJECT (context));
+}
+
+
+
 /*
   Create a new output viewer
 */
@@ -101,6 +143,9 @@ new_output_viewer (void)
     pango_font_description_free (font_desc);
   }
 
+  g_signal_connect (ov->textview, "size-allocate",
+                   G_CALLBACK (on_textview_resize), NULL);
+
   ov->fp = NULL;
 
   g_signal_connect (get_widget_assert (xml,"help_about"),
index 0bc148bb3c57939eec08f410acfe268f19352741..2036b66f323318265eaa7f88fa0966ffaec2d754 100644 (file)
@@ -23,6 +23,9 @@
 #include "window-manager.h"
 
 
+extern int viewer_length ;
+extern int viewer_width ;
+
 struct output_viewer * new_output_viewer (void);
 
 void reload_viewer (struct output_viewer *);
index ff155d68fe71cc66e97dff9572a06435adae7045..b874d393cf6df29b7709cf13f9398c0a043953a1 100644 (file)
@@ -85,7 +85,7 @@ initialize (void)
   fmt_init ();
   fn_init ();
   outp_init ();
-  settings_init ();
+  settings_init (&viewer_width, &viewer_length);
   fh_init ();
   the_source_stream =
     create_source_stream (
index 0e6e014d9b49b9c6f5c186ec442a67813e0a9d78..f7983110fdb801efbf9ed4888083ec88eccf78d2 100644 (file)
@@ -1,3 +1,9 @@
+2007-09-19  John Darrington <john@darrington.wattle.id.au>
+
+       * main.c: Moved get_termcap_viewport from src/data/settings.c 
+       Added a handler for SIGWINCH to call this function.  Adjusted
+       init_settings to suit new interface. 
+
 2007-09-22  Ben Pfaff  <blp@gnu.org>
 
        Bug #21128.  Reviewed by John Darrington.
index 46ded354f7e392903c61d93712d0ad8baff38610..b25350b94c4f07c6c6b21f8183697ba9a21d5a88 100644 (file)
@@ -78,6 +78,11 @@ static struct dataset * the_dataset = NULL;
 static struct lexer *the_lexer;
 static struct source_stream *the_source_stream ;
 
+static int view_length = -1;
+static int view_width = -1;
+
+static void get_termcap_viewport (int);
+
 
 /* Program entry point. */
 int
@@ -87,6 +92,7 @@ main (int argc, char **argv)
   signal (SIGSEGV, bug_handler);
   signal (SIGFPE, bug_handler);
   signal (SIGINT, interrupt_handler);
+  signal (SIGWINCH, get_termcap_viewport);
 
   set_program_name (argv[0]);
 
@@ -104,7 +110,8 @@ main (int argc, char **argv)
                          );
   prompt_init ();
   readln_initialize ();
-  settings_init ();
+  get_termcap_viewport (0);
+  settings_init (&view_width, &view_length);
   random_init ();
 
   the_dataset = create_dataset ();
@@ -224,3 +231,71 @@ terminate (bool success)
     }
   exit (success ? EXIT_SUCCESS : EXIT_FAILURE);
 }
+
+\f
+
+#include "error.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+static void
+set_fallback_viewport (void)
+{
+  if (view_width < 0 && getenv ("COLUMNS") != NULL)
+    view_width = atoi (getenv ("COLUMNS"));
+
+  if (view_length < 0 && getenv ("LINES") != NULL)
+    view_length = atoi (getenv ("LINES"));
+
+  if (view_width < 0)
+    view_width = 79;
+
+  if (view_length < 0)
+    view_length = 24;
+}
+
+/* Code that interfaces to ncurses.  This must be at the very end
+   of this file because curses.h redefines "bool" on some systems
+   (e.g. OpenBSD), causing declaration mismatches with functions
+   that have parameters or return values of type "bool". */
+#if HAVE_LIBNCURSES
+#include <curses.h>
+#include <term.h>
+
+static void
+get_termcap_viewport (int sig UNUSED)
+{
+  char term_buffer [16384];
+
+  if (getenv ("TERM") == NULL)
+    goto fallback;
+
+  else if (tgetent (term_buffer, getenv ("TERM")) <= 0)
+    {
+      error (0,0, _("could not access definition for terminal `%s'"),
+             getenv ("TERM"));
+      goto fallback;
+    }
+
+  if (tgetnum ("li") > 0)
+    view_length = tgetnum ("li");
+
+  if (tgetnum ("co") > 1)
+    view_width = tgetnum ("co") - 1;
+
+ fallback:
+  set_fallback_viewport ();
+}
+
+#else /* !HAVE_LIBNCURSES */
+
+static void
+get_termcap_viewport (int sig UNUSED)
+{
+  set_fallback_viewport ();
+}
+
+#endif /* !HAVE_LIBNCURSES */
+
+