Save window contents on closing.
[pspp-builds.git] / src / ui / gui / psppire-data-window.c
index c0f816851ba2e757b8a622ab4354409c4d85ec33..c82631839244e5350aae6a7b859adbcc894e91ff 100644 (file)
@@ -30,6 +30,8 @@
 
 #include <data/procedure.h>
 
+#include "psppire.h"
+#include "psppire-window.h"
 #include "psppire-data-window.h"
 #include "psppire-syntax-window.h"
 
@@ -71,6 +73,9 @@ static void psppire_data_window_class_init    (PsppireDataWindowClass *class);
 static void psppire_data_window_init          (PsppireDataWindow      *data_editor);
 
 
+static void psppire_data_window_iface_init (PsppireWindowIface *iface);
+
+
 GType
 psppire_data_window_get_type (void)
 {
@@ -91,9 +96,21 @@ psppire_data_window_get_type (void)
          (GInstanceInitFunc) psppire_data_window_init,
        };
 
+      static const GInterfaceInfo window_interface_info =
+       {
+         (GInterfaceInitFunc) psppire_data_window_iface_init,
+         NULL,
+         NULL
+       };
+
       psppire_data_window_type =
-       g_type_register_static (PSPPIRE_WINDOW_TYPE, "PsppireDataWindow",
+       g_type_register_static (PSPPIRE_TYPE_WINDOW, "PsppireDataWindow",
                                &psppire_data_window_info, 0);
+
+      
+      g_type_add_interface_static (psppire_data_window_type,
+                                  PSPPIRE_TYPE_WINDOW_MODEL,
+                                  &window_interface_info);
     }
 
   return psppire_data_window_type;
@@ -339,9 +356,6 @@ psppire_data_window_load_file (PsppireDataWindow *de,
     }
 
   psppire_window_set_unsaved (PSPPIRE_WINDOW (de), FALSE);
-  free (de->file_name);
-
-  de->file_name = g_strdup (file_name);
 }
 
 
@@ -376,13 +390,16 @@ open_data_dialog (GtkAction *action, PsppireDataWindow *de)
   gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
 
 
-  if (de->file_name)
-    {
-      gchar *dir_name = g_path_get_dirname (de->file_name);
-      gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog),
-                                          dir_name);
-      free (dir_name);
-    }
+  {
+    gchar *dir_name;
+    gchar *filename = NULL;
+    g_object_get (de, "filename", &filename, NULL);
+
+    dir_name = g_path_get_dirname (filename);
+    gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog),
+                                        dir_name);
+    free (dir_name);
+  }
 
   switch (gtk_dialog_run (GTK_DIALOG (dialog)))
     {
@@ -420,39 +437,38 @@ name_has_suffix (const gchar *name)
 }
 
 
-/* Append SUFFIX to the filename of DE */
-static void
-append_filename_suffix (PsppireDataWindow *de, const gchar *suffix)
-{
-  if ( ! name_has_suffix (de->file_name))
-    {
-      gchar *s = de->file_name;
-      de->file_name = g_strconcat (de->file_name, suffix, NULL);
-      g_free (s);
-    }
-}
-
 /* Save DE to file */
 static void
 save_file (PsppireDataWindow *de)
 {
+  gchar *fn = NULL;
+  GString *fnx;
   struct getl_interface *sss;
   struct string file_name ;
 
-  g_assert (de->file_name);
+  g_object_get (de, "filename", &fn, NULL);
+
+  fnx = g_string_new (fn);
+
+  if ( ! name_has_suffix (fnx->str))
+    {
+      if ( de->save_as_portable)
+       g_string_append (fnx, ".por");
+      else
+       g_string_append (fnx, ".sav");
+    }
 
   ds_init_empty (&file_name);
-  syntax_gen_string (&file_name, ss_cstr (de->file_name));
+  syntax_gen_string (&file_name, ss_cstr (fnx->str));
+  g_string_free (fnx, FALSE);
 
   if ( de->save_as_portable )
     {
-      append_filename_suffix (de, ".por");
       sss = create_syntax_string_source ("EXPORT OUTFILE=%s.",
                                         ds_cstr (&file_name));
     }
   else
     {
-      append_filename_suffix (de, ".sav");
       sss = create_syntax_string_source ("SAVE OUTFILE=%s.",
                                         ds_cstr (&file_name));
     }
@@ -483,7 +499,7 @@ on_insert_variable (GtkAction *action, gpointer data)
 
 /* Callback for data_save_as action. Prompt for a filename and save */
 static void
-data_save_as_dialog (GtkAction *action, PsppireDataWindow *de)
+data_save_as_dialog (PsppireDataWindow *de)
 {
   GtkWidget *button_sys;
   GtkWidget *dialog =
@@ -534,22 +550,28 @@ data_save_as_dialog (GtkAction *action, PsppireDataWindow *de)
     {
     case GTK_RESPONSE_ACCEPT:
       {
-       g_free (de->file_name);
-
-       de->file_name =
-         gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+       GString *filename =
+         g_string_new
+         (
+          gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog))
+          );
 
        de->save_as_portable =
          ! gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button_sys));
 
-       if ( de->save_as_portable)
-         append_filename_suffix (de, ".por");
-       else
-         append_filename_suffix (de, ".sav");
+       if ( ! name_has_suffix (filename->str))
+         {
+           if ( de->save_as_portable)
+             g_string_append (filename, ".por");
+           else
+             g_string_append (filename, ".sav");
+         }
+
+       psppire_window_set_filename (PSPPIRE_WINDOW (de), filename->str);
 
        save_file (de);
 
-       psppire_window_set_filename (PSPPIRE_WINDOW (de), de->file_name);
+       g_string_free (filename, TRUE);
       }
       break;
     default:
@@ -561,15 +583,16 @@ data_save_as_dialog (GtkAction *action, PsppireDataWindow *de)
 
 
 /* Callback for data_save action.
-   If there's an existing file name, then just save,
-   otherwise prompt for a file name, then save */
+ */
 static void
-data_save (GtkAction *action, PsppireDataWindow *de)
+data_save (PsppireWindow *de)
 {
-  if (de->file_name)
-    save_file (de);
+  const gchar *fn = psppire_window_get_filename (de);
+
+  if ( NULL != fn)
+    save_file (PSPPIRE_DATA_WINDOW (de));
   else
-    data_save_as_dialog (action, de);
+    data_save_as_dialog (PSPPIRE_DATA_WINDOW (de));
 }
 
 
@@ -583,9 +606,6 @@ new_file (GtkAction *action, PsppireDataWindow *de)
 
   execute_syntax (sss);
 
-  g_free (de->file_name);
-  de->file_name = NULL;
-
   psppire_window_set_filename (PSPPIRE_WINDOW (de), NULL);
 }
 
@@ -720,7 +740,8 @@ file_quit (GtkCheckMenuItem *menuitem, gpointer data)
      Give the user the opportunity to save any unsaved data.
   */
   g_object_unref (the_data_store);
-  gtk_main_quit ();
+
+  psppire_quit ();
 }
 
 
@@ -863,7 +884,7 @@ create_var_sheet_variable_popup_menu (PsppireDataWindow *de)
 }
 
 
-#if RECENT_LISTS_AVAILABLE
+#if RECENT_LISTS_AVAILABLE && 0
 
 static void
 on_recent_data_select (GtkMenuShell *menushell,   gpointer user_data)
@@ -1012,8 +1033,6 @@ psppire_data_window_init (PsppireDataWindow *de)
   hb = get_widget_assert (de->builder, "handlebox1");
   sb = get_widget_assert (de->builder, "status-bar");
 
-  de->file_name = NULL;
-
   de->data_editor =
     PSPPIRE_DATA_EDITOR (psppire_data_editor_new (the_var_store, the_data_store));
 
@@ -1144,8 +1163,8 @@ psppire_data_window_init (PsppireDataWindow *de)
                  "stock-id", "gtk-save",
                  NULL);
 
-    g_signal_connect (action_data_save, "activate",
-                     G_CALLBACK (data_save), de);
+    g_signal_connect_swapped (action_data_save, "activate",
+                             G_CALLBACK (data_save), de);
   }
 
 
@@ -1161,7 +1180,7 @@ psppire_data_window_init (PsppireDataWindow *de)
                  "stock-id", "gtk-save-as",
                  NULL);
 
-    g_signal_connect (action_data_save_as, "activate",
+    g_signal_connect_swapped (action_data_save_as, "activate",
                      G_CALLBACK (data_save_as_dialog), de);
   }
 
@@ -1752,3 +1771,13 @@ psppire_data_window_new (void)
                                   NULL));
 }
 
+
+
+
+\f
+
+static void
+psppire_data_window_iface_init (PsppireWindowIface *iface)
+{
+  iface->save = data_save;
+}