Greatly simplify PSPP configuration.
[pspp-builds.git] / src / ui / gui / message-dialog.c
index 525fca40e22894b6ff70823efa359cf56499d153..ccb436406c7edebcb1fdfd6d84a762d5b2960be5 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2004, 2005, 2010 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 #define _(msgid) gettext (msgid)
 #define N_(msgid) msgid
 
+#include <libpspp/assertion.h>
 #include <libpspp/message.h>
+#include <libpspp/str.h>
 #include <libpspp/msg-locator.h>
 #include "message-dialog.h"
 #include "progname.h"
 
 
 #include <gtk/gtk.h>
-#include <glade/glade.h>
 #include <glib.h>
 
 #include "helper.h"
@@ -48,8 +49,8 @@ static GQueue *late_queue;
 
 static int error_cnt, warning_cnt, note_cnt;
 
-static GladeXML *message_xml;
-static GtkDialog *message_dialog;
+static GtkBuilder *message_xml;
+static GtkWidget *message_dialog;
 
 void
 message_dialog_init (struct source_stream *ss)
@@ -59,9 +60,12 @@ message_dialog_init (struct source_stream *ss)
   late_queue = g_queue_new ();
   error_cnt = warning_cnt = note_cnt = 0;
   msg_init (ss, enqueue_msg);
-  message_xml = XML_NEW ("message-dialog.glade");
-  message_dialog = GTK_DIALOG (get_widget_assert (message_xml,
-                                                  "message-dialog"));
+  message_xml = builder_new ("message-dialog.ui");
+  message_dialog = get_widget_assert (message_xml, "message-dialog");
+
+  GTK_WIDGET_SET_FLAGS (get_widget_assert (message_xml, "close-button"),
+                       GTK_CAN_DEFAULT);
+
 }
 
 void
@@ -71,7 +75,7 @@ message_dialog_done (void)
   g_queue_free (early_queue);
   dropped_messages = 0;
   g_queue_free (late_queue);
-  gtk_widget_destroy (GTK_WIDGET (message_dialog));
+  gtk_widget_destroy (message_dialog);
   g_object_unref (message_xml);
 }
 
@@ -89,53 +93,53 @@ format_message (struct msg *m, struct string *msg)
 
   switch (m->severity)
     {
-    case MSG_ERROR:
+    case MSG_S_ERROR:
       switch (m->category)
        {
-       case MSG_SYNTAX:
+       case MSG_C_SYNTAX:
          label = _("syntax error");
          break;
 
-       case MSG_DATA:
+       case MSG_C_DATA:
          label = _("data file error");
          break;
 
-       case MSG_GENERAL:
+       case MSG_C_GENERAL:
        default:
          label = _("PSPP error");
          break;
        }
       break;
-    case MSG_WARNING:
+    case MSG_S_WARNING:
       switch (m->category)
        {
-       case MSG_SYNTAX:
+       case MSG_C_SYNTAX:
          label = _("syntax warning");
           break;
 
-       case MSG_DATA:
+       case MSG_C_DATA:
          label = _("data file warning");
          break;
 
-       case MSG_GENERAL:
+       case MSG_C_GENERAL:
         default:
          label = _("PSPP warning");
           break;
         }
       break;
-    case MSG_NOTE:
+    case MSG_S_NOTE:
     default:
       switch (m->category)
         {
-        case MSG_SYNTAX:
+        case MSG_C_SYNTAX:
          label = _("syntax information");
           break;
 
-        case MSG_DATA:
+        case MSG_C_DATA:
          label = _("data file information");
           break;
 
-        case MSG_GENERAL:
+        case MSG_C_GENERAL:
         default:
          label = _("PSPP information");
          break;
@@ -153,15 +157,17 @@ enqueue_msg (const struct msg *msg)
 
   switch (m->severity)
     {
-    case MSG_ERROR:
+    case MSG_S_ERROR:
       error_cnt++;
       break;
-    case MSG_WARNING:
+    case MSG_S_WARNING:
       warning_cnt++;
       break;
-    case MSG_NOTE:
+    case MSG_S_NOTE:
       note_cnt++;
       break;
+    case MSG_N_SEVERITIES:
+      NOT_REACHED ();
     }
 
   if (g_queue_get_length (early_queue) < MAX_EARLY_MESSAGES)
@@ -182,26 +188,37 @@ enqueue_msg (const struct msg *msg)
     }
 }
 
-gboolean
+static gboolean
 popup_messages (gpointer unused UNUSED)
 {
   GtkTextBuffer *text_buffer;
   GtkTextIter end;
   GtkTextView *text_view;
   GtkLabel *label;
-  struct string lead, msg;
+  struct string lead = DS_EMPTY_INITIALIZER;
+  struct string msg = DS_EMPTY_INITIALIZER;
   int message_cnt;
 
+  gdk_threads_enter ();
+
+  /* Set up the dialog. */
+  if (message_xml == NULL || message_dialog == NULL)
+    goto use_fallback;
+
   /* If a pointer grab is in effect, then the combination of that, and
      a modal dialog box, will cause an impossible situation.
      So don't pop it up just yet.
   */
-  if ( gdk_pointer_is_grabbed ())
-    return TRUE;
+  if ( gdk_display_pointer_is_grabbed (gtk_widget_get_display (message_dialog)))
+    {
+      ds_destroy (&lead);
+      ds_destroy (&msg);
+      gdk_threads_leave ();
+      return TRUE;
+    }
 
   /* Compose the lead-in. */
   message_cnt = error_cnt + warning_cnt + note_cnt;
-  ds_init_empty (&lead);
   if (dropped_messages == 0)
     ds_put_format (
       &lead,
@@ -227,7 +244,6 @@ popup_messages (gpointer unused UNUSED)
 
 
   /* Compose the messages. */
-  ds_init_empty (&msg);
   while (!g_queue_is_empty (early_queue))
     format_message (g_queue_pop_head (early_queue), &msg);
   if (dropped_messages)
@@ -239,14 +255,9 @@ popup_messages (gpointer unused UNUSED)
   while (!g_queue_is_empty (late_queue))
     format_message (g_queue_pop_head (late_queue), &msg);
 
-  /* Set up the dialog. */
-  if (message_xml == NULL || message_dialog == NULL)
-    goto use_fallback;
-
   text_buffer = gtk_text_buffer_new (NULL);
   gtk_text_buffer_get_end_iter (text_buffer, &end);
   gtk_text_buffer_insert (text_buffer, &end, ds_data (&msg), ds_length (&msg));
-  ds_destroy (&msg);
 
   label = GTK_LABEL (get_widget_assert (message_xml, "lead-in"));
   if (label == NULL)
@@ -258,9 +269,15 @@ popup_messages (gpointer unused UNUSED)
     goto use_fallback;
   gtk_text_view_set_buffer (text_view, text_buffer);
 
-  gtk_dialog_run (message_dialog);
-  gtk_widget_hide (GTK_WIDGET (message_dialog));
+  gtk_widget_grab_default (get_widget_assert (message_xml, "close-button"));
+  gtk_widget_grab_focus (get_widget_assert (message_xml, "close-button"));
+  gtk_dialog_run ( GTK_DIALOG (message_dialog));
+  gtk_widget_hide (message_dialog);
+
+  ds_destroy (&lead);
+  ds_destroy (&msg);
 
+  gdk_threads_leave ();
   return FALSE;
 
 use_fallback:
@@ -269,6 +286,7 @@ use_fallback:
   fputs (ds_cstr (&msg), stderr);
   ds_destroy (&lead);
   ds_destroy (&msg);
+  gdk_threads_leave ();
   return FALSE;
 }