Rewrote the recent file manager stuff
[pspp-builds.git] / src / ui / gui / psppire-syntax-window.c
index 7abf01f7eca5bd36420236925f6c18049f40b10a..b735f35cb241088b58a5ebb5fe1b120d3d0cd524 100644 (file)
 #include <libpspp/message.h>
 #include <stdlib.h>
 
+#include "psppire.h"
 #include "psppire-syntax-window.h"
 
 #include "psppire-data-window.h"
 #include "psppire-window-register.h"
+#include "psppire.h"
 #include "about.h"
 #include "psppire-syntax-window.h"
 #include "syntax-editor-source.h"
@@ -41,6 +43,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 +67,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;
@@ -255,77 +272,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 (PsppireWindow *se)
-{
-  if ( TRUE == psppire_window_get_unsaved (se))
-    {
-      gint response;
-      GtkWidget *dialog;
-
-      const gchar *description;
-      const gchar *filename = psppire_window_get_filename (se);
-
-      g_object_get (se, "description", &description, NULL);
-
-      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 %s to \"%s\"?"),
-                               description,
-                               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);
-           }
-         psppire_window_set_filename (se, filename);
-       }
-
-      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),
@@ -355,7 +309,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);
@@ -370,18 +324,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);
@@ -395,20 +347,8 @@ 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;
-}
-
-
-/* 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);
+  psppire_quit ();
 
-  save_if_modified (se);
   return FALSE;
 }
 
@@ -456,20 +396,10 @@ open_syntax_window (GtkMenuItem *menuitem, gpointer parent)
       GtkWidget *se = psppire_syntax_window_new ();
 
       if ( psppire_syntax_window_load_from_file (PSPPIRE_SYNTAX_WINDOW (se), file_name, NULL) )
-#if RECENT_LISTS_AVAILABLE
-      {
-       GtkRecentManager *manager = gtk_recent_manager_get_default();
-       gchar *uri = g_filename_to_uri (file_name, NULL, NULL);
-
-       gtk_recent_manager_remove_item (manager, uri, NULL);
-       if ( ! gtk_recent_manager_add_item (manager, uri))
-         g_warning ("Could not add item %s to recent list\n",uri);
+       {
+         add_most_recent (file_name, the_recent_mgr);
+       }
 
-       g_free (uri);
-      }
-#else
-      ;
-#endif
       gtk_widget_show (se);
     }
 
@@ -531,83 +461,82 @@ psppire_syntax_window_init (PsppireSyntaxWindow *window)
 
   gtk_widget_show_all (box);
 
-  g_signal_connect (get_object_assert (xml,"file_new_syntax"),
+  g_signal_connect (get_action_assert (xml,"file_new_syntax"),
                    "activate",
                    G_CALLBACK (create_syntax_window),
                    NULL);
 
-  g_signal_connect (get_object_assert (xml,"file_open_syntax"),
+  g_signal_connect (get_action_assert (xml,"file_open_syntax"),
                    "activate",
                    G_CALLBACK (open_syntax_window),
                    window);
 
 #if 0
-  g_signal_connect (get_object_assert (xml,"file_new_data"),
+  g_signal_connect (get_action_assert (xml,"file_new_data"),
                    "activate",
                    G_CALLBACK (create_data_window),
                    window);
 #endif
 
-  g_signal_connect (get_object_assert (xml,"help_about"),
+  g_signal_connect (get_action_assert (xml,"help_about"),
                    "activate",
                    G_CALLBACK (about_new),
                    window);
 
-  g_signal_connect (get_object_assert (xml,"help_reference"),
+  g_signal_connect (get_action_assert (xml,"help_reference"),
                    "activate",
                    G_CALLBACK (reference_manual),
                    NULL);
 
-  g_signal_connect (get_object_assert (xml, "file_save"),
+  g_signal_connect_swapped (get_action_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_action_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"),
+  g_signal_connect (get_action_assert (xml,"file_quit"),
                    "activate",
                    G_CALLBACK (on_quit),
                    window);
 
-  g_signal_connect (get_object_assert (xml,"run_all"),
+  g_signal_connect (get_action_assert (xml,"run_all"),
                    "activate",
                    G_CALLBACK (on_run_all),
                    window);
 
 
-  g_signal_connect (get_object_assert (xml,"run_selection"),
+  g_signal_connect (get_action_assert (xml,"run_selection"),
                    "activate",
                    G_CALLBACK (on_run_selection),
                    window);
 
-  g_signal_connect (get_object_assert (xml,"run_current_line"),
+  g_signal_connect (get_action_assert (xml,"run_current_line"),
                    "activate",
                    G_CALLBACK (on_run_current_line),
                    window);
 
-  g_signal_connect (get_object_assert (xml,"run_to_end"),
+  g_signal_connect (get_action_assert (xml,"run_to_end"),
                    "activate",
                    G_CALLBACK (on_run_to_end),
                    window);
 
-  g_signal_connect (get_object_assert (xml,"windows_minimise_all"),
+  g_signal_connect (get_action_assert (xml,"windows_minimise_all"),
                    "activate",
                    G_CALLBACK (psppire_window_minimise_all), NULL);
 
-  GtkUIManager *uim = GTK_UI_MANAGER (get_object_assert (xml, "uimanager1"));
+
+  {
+  GtkUIManager *uim = GTK_UI_MANAGER (get_object_assert (xml, "uimanager1", GTK_TYPE_UI_MANAGER));
 
   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);
 }
 
 
@@ -656,3 +585,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;
+}