Save window contents on closing.
[pspp-builds.git] / src / ui / gui / psppire-syntax-window.c
index a786db8040c5bcb2ec7e18df1772fd4eb536c63f..2a09c71c027b8a68380866e0011f84f31decbb57 100644 (file)
@@ -23,6 +23,7 @@
 #include <libpspp/message.h>
 #include <stdlib.h>
 
+#include "psppire.h"
 #include "psppire-syntax-window.h"
 
 #include "psppire-data-window.h"
@@ -41,6 +42,10 @@ static void psppire_syntax_window_base_init     (PsppireSyntaxWindowClass *class
 static void psppire_syntax_window_class_init    (PsppireSyntaxWindowClass *class);
 static void psppire_syntax_window_init          (PsppireSyntaxWindow      *syntax_editor);
 
+
+static void psppire_syntax_window_iface_init (PsppireWindowIface *iface);
+
+
 GType
 psppire_syntax_window_get_type (void)
 {
@@ -61,9 +66,20 @@ psppire_syntax_window_get_type (void)
        (GInstanceInitFunc) psppire_syntax_window_init,
       };
 
+      static const GInterfaceInfo window_interface_info =
+       {
+         (GInterfaceInitFunc) psppire_syntax_window_iface_init,
+         NULL,
+         NULL
+       };
+
       psppire_syntax_window_type =
-       g_type_register_static (PSPPIRE_WINDOW_TYPE, "PsppireSyntaxWindow",
+       g_type_register_static (PSPPIRE_TYPE_WINDOW, "PsppireSyntaxWindow",
                                &psppire_syntax_window_info, 0);
+
+      g_type_add_interface_static (psppire_syntax_window_type,
+                                  PSPPIRE_TYPE_WINDOW_MODEL,
+                                  &window_interface_info);
     }
 
   return psppire_syntax_window_type;
@@ -248,7 +264,6 @@ save_editor_to_file (PsppireSyntaxWindow *se,
     {
       gchar *msg = g_strdup_printf (_("Saved file \"%s\""), filename);
       gtk_statusbar_push (GTK_STATUSBAR (se->sb), se->text_context, msg);
-      psppire_window_set_filename (PSPPIRE_WINDOW (se), filename);
       gtk_text_buffer_set_modified (buffer, FALSE);
       g_free (msg);
     }
@@ -256,72 +271,14 @@ save_editor_to_file (PsppireSyntaxWindow *se,
   return result;
 }
 
-/* If the buffer's modified flag is set, then save it, and close the window.
-   Otherwise just close the window.
-*/
-static void
-save_if_modified (PsppireSyntaxWindow *se)
-{
-  if ( TRUE == gtk_text_buffer_get_modified (se->buffer))
-    {
-      gint response;
-      GtkWidget *dialog;
-
-      const gchar *filename = psppire_window_get_filename (PSPPIRE_WINDOW (se));
-
-      g_return_if_fail (filename != NULL);
-
-      dialog =
-       gtk_message_dialog_new (GTK_WINDOW (se),
-                               GTK_DIALOG_MODAL,
-                               GTK_MESSAGE_QUESTION,
-                               GTK_BUTTONS_NONE,
-                               _("Save contents of syntax editor to %s?"),
-                               filename);
-
-      gtk_dialog_add_button  (GTK_DIALOG (dialog),
-                             GTK_STOCK_YES,
-                             GTK_RESPONSE_ACCEPT);
-
-      gtk_dialog_add_button  (GTK_DIALOG (dialog),
-                             GTK_STOCK_NO,
-                             GTK_RESPONSE_REJECT);
-
-      gtk_dialog_add_button  (GTK_DIALOG (dialog),
-                             GTK_STOCK_CANCEL,
-                             GTK_RESPONSE_CANCEL);
-
-      response = gtk_dialog_run (GTK_DIALOG (dialog));
-
-      gtk_widget_destroy (dialog);
-
-      if ( response == GTK_RESPONSE_ACCEPT )
-       {
-         GError *err = NULL;
-
-         if ( ! save_editor_to_file (se, filename, &err) )
-           {
-             msg (ME, err->message);
-             g_error_free (err);
-           }
-       }
-
-      if ( response == GTK_RESPONSE_CANCEL )
-       return ;
-    }
-
-  gtk_widget_destroy (GTK_WIDGET (se));
-}
 
 /* Callback for the File->SaveAs menuitem */
 static void
-on_syntax_save_as (GtkMenuItem *menuitem, gpointer user_data)
+syntax_save_as (PsppireWindow *se)
 {
   GtkFileFilter *filter;
   gint response;
 
-  PsppireSyntaxWindow *se = PSPPIRE_SYNTAX_WINDOW (user_data);
-
   GtkWidget *dialog =
     gtk_file_chooser_dialog_new (_("Save Syntax"),
                                 GTK_WINDOW (se),
@@ -351,7 +308,7 @@ on_syntax_save_as (GtkMenuItem *menuitem, gpointer user_data)
       char *filename =
        gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog) );
 
-      if ( ! save_editor_to_file (se, filename, &err) )
+      if ( ! save_editor_to_file (PSPPIRE_SYNTAX_WINDOW (se), filename, &err) )
        {
          msg ( ME, err->message );
          g_error_free (err);
@@ -366,18 +323,16 @@ on_syntax_save_as (GtkMenuItem *menuitem, gpointer user_data)
 
 /* Callback for the File->Save menuitem */
 static void
-on_syntax_save (GtkMenuItem *menuitem, gpointer user_data)
+syntax_save (PsppireWindow *se)
 {
-  PsppireSyntaxWindow *se = PSPPIRE_SYNTAX_WINDOW (user_data);
-  const gchar *filename = psppire_window_get_filename (PSPPIRE_WINDOW (se));
-
+  const gchar *filename = psppire_window_get_filename (se);
 
   if ( filename == NULL )
-    on_syntax_save_as (menuitem, se);
+    syntax_save_as (se);
   else
     {
       GError *err = NULL;
-      save_editor_to_file (se, filename, &err);
+      save_editor_to_file (PSPPIRE_SYNTAX_WINDOW (se), filename, &err);
       if ( err )
        {
          msg (ME, err->message);
@@ -391,21 +346,9 @@ on_syntax_save (GtkMenuItem *menuitem, gpointer user_data)
 static gboolean
 on_quit (GtkMenuItem *menuitem, gpointer    user_data)
 {
-  PsppireSyntaxWindow *se = PSPPIRE_SYNTAX_WINDOW (user_data);
-  save_if_modified (se);
-  return FALSE;
-}
-
+  psppire_quit ();
 
-/* Callback for the "delete" action (clicking the x on the top right
-   hand corner of the window) */
-static gboolean
-on_delete (GtkWidget *w, GdkEvent *event, gpointer user_data)
-{
-  PsppireSyntaxWindow *se = PSPPIRE_SYNTAX_WINDOW (user_data);
-
-  save_if_modified (se);
-  return TRUE;
+  return FALSE;
 }
 
 
@@ -479,6 +422,13 @@ on_text_changed (GtkTextBuffer *buffer, PsppireSyntaxWindow *window)
   gtk_statusbar_pop (GTK_STATUSBAR (window->sb), window->text_context);
 }
 
+static void
+on_modified_changed (GtkTextBuffer *buffer, PsppireWindow *window)
+{
+  psppire_window_set_unsaved (window, gtk_text_buffer_get_modified (buffer));
+}
+
+
 extern struct source_stream *the_source_stream ;
 
 static void
@@ -500,7 +450,10 @@ psppire_syntax_window_init (PsppireSyntaxWindow *window)
 
   g_signal_connect (window->buffer, "changed", G_CALLBACK (on_text_changed), window);
 
-  //  connect_help (xml);
+  g_signal_connect (window->buffer, "modified-changed",
+                   G_CALLBACK (on_modified_changed), window);
+
+  connect_help (xml);
 
   gtk_container_add (GTK_CONTAINER (window), box);
 
@@ -544,14 +497,14 @@ psppire_syntax_window_init (PsppireSyntaxWindow *window)
                    G_CALLBACK (reference_manual),
                    NULL);
 
-  g_signal_connect (get_object_assert (xml, "file_save"),
+  g_signal_connect_swapped (get_object_assert (xml, "file_save"),
                    "activate",
-                   G_CALLBACK (on_syntax_save),
+                   G_CALLBACK (syntax_save),
                    window);
 
-  g_signal_connect (get_object_assert (xml, "file_save_as"),
+  g_signal_connect_swapped (get_object_assert (xml, "file_save_as"),
                    "activate",
-                   G_CALLBACK (on_syntax_save_as),
+                   G_CALLBACK (syntax_save_as),
                    window);
 
   g_signal_connect (get_object_assert (xml,"file_quit"),
@@ -584,16 +537,15 @@ psppire_syntax_window_init (PsppireSyntaxWindow *window)
                    "activate",
                    G_CALLBACK (psppire_window_minimise_all), NULL);
 
+
+  {
   GtkUIManager *uim = GTK_UI_MANAGER (get_object_assert (xml, "uimanager1"));
 
   PSPPIRE_WINDOW (window)->menu =
     GTK_MENU_SHELL (gtk_ui_manager_get_widget (uim,"/ui/menubar2/windows/windows_minimise_all")->parent);
-
+  }
 
   g_object_unref (xml);
-
-  g_signal_connect (window, "delete-event",
-                   G_CALLBACK (on_delete), window);
 }
 
 
@@ -601,8 +553,8 @@ GtkWidget*
 psppire_syntax_window_new (void)
 {
   return GTK_WIDGET (g_object_new (psppire_syntax_window_get_type (),
-                                  "usage", PSPPIRE_WINDOW_USAGE_SYNTAX,
                                   "filename", "Syntax",
+                                  "description", _("Syntax Editor"),
                                   NULL));
 }
 
@@ -642,3 +594,10 @@ psppire_syntax_window_load_from_file (PsppireSyntaxWindow *se,
   return TRUE;
 }
 
+\f
+
+static void
+psppire_syntax_window_iface_init (PsppireWindowIface *iface)
+{
+  iface->save = syntax_save;
+}