Merge branch 'master' of ssh://jmd@git.sv.gnu.org/srv/git/pspp
[pspp-builds.git] / src / ui / gui / psppire-data-window.c
index c82631839244e5350aae6a7b859adbcc894e91ff..5efb02dedb1e1ecade630d4e25af1025cb59d2c1 100644 (file)
@@ -53,7 +53,6 @@
 #include "crosstabs-dialog.h"
 #include "frequencies-dialog.h"
 #include "examine-dialog.h"
-#include "dict-display.h"
 #include "regression-dialog.h"
 #include "oneway-anova-dialog.h"
 #include "t-test-independent-samples-dialog.h"
@@ -161,23 +160,24 @@ extern PsppireVarStore *the_var_store;
 extern struct dataset *the_dataset;
 extern PsppireDataStore *the_data_store ;
 
+extern GtkRecentManager *the_recent_mgr;
 
 static void
 set_paste_menuitem_sensitivity (PsppireDataWindow *de, gboolean x)
 {
-  GObject *edit_paste = get_object_assert (de->builder, "edit_paste");
+  GtkAction *edit_paste = get_action_assert (de->builder, "edit_paste");
 
-  gtk_action_set_sensitive (GTK_ACTION (edit_paste), x);
+  gtk_action_set_sensitive (edit_paste, x);
 }
 
 static void
 set_cut_copy_menuitem_sensitivity (PsppireDataWindow *de, gboolean x)
 {
-  GObject *edit_copy = get_object_assert (de->builder, "edit_copy");
-  GObject *edit_cut = get_object_assert (de->builder, "edit_cut");
+  GtkAction *edit_copy = get_action_assert (de->builder, "edit_copy");
+  GtkAction *edit_cut = get_action_assert (de->builder, "edit_cut");
 
-  gtk_action_set_sensitive (GTK_ACTION (edit_copy), x);
-  gtk_action_set_sensitive (GTK_ACTION (edit_cut), x);
+  gtk_action_set_sensitive (edit_copy, x);
+  gtk_action_set_sensitive (edit_cut, x);
 }
 
 /* Run the EXECUTE command. */
@@ -195,8 +195,7 @@ transformation_change_callback (bool transformations_pending,
 {
   PsppireDataWindow  *de = PSPPIRE_DATA_WINDOW (data);
 
-  GtkUIManager *uim =
-    GTK_UI_MANAGER (get_object_assert (de->builder, "uimanager1"));
+  GtkUIManager *uim = GTK_UI_MANAGER (get_object_assert (de->builder, "uimanager1", GTK_TYPE_UI_MANAGER));
 
   GtkWidget *menuitem =
     gtk_ui_manager_get_widget (uim,"/ui/menubar/transform/transform_run-pending");
@@ -315,29 +314,37 @@ on_weight_change (GObject *o, gint weight_index, gpointer data)
     }
 }
 
-/* Puts FILE_NAME into the recent list.
-   If it's already in the list, it moves it to the top
-*/
+#if 0
 static void
-add_most_recent (const char *file_name)
+dump_rm (GtkRecentManager *rm)
 {
-#if RECENT_LISTS_AVAILABLE
+  GList *items = gtk_recent_manager_get_items (rm);
 
-  GtkRecentManager *manager = gtk_recent_manager_get_default();
-  gchar *uri = g_filename_to_uri (file_name, NULL, NULL);
+  GList *i;
 
-  gtk_recent_manager_remove_item (manager, uri, NULL);
+  g_print ("Recent Items:\n");
+  for (i = items; i; i = i->next)
+    {
+      GtkRecentInfo *ri = i->data;
 
-  if ( ! gtk_recent_manager_add_item (manager, uri))
-    g_warning ("Could not add item %s to recent list\n",uri);
+      g_print ("Item: %s (Mime: %s) (Desc: %s) (URI: %s)\n",
+              gtk_recent_info_get_short_name (ri),
+              gtk_recent_info_get_mime_type (ri),
+              gtk_recent_info_get_description (ri),
+              gtk_recent_info_get_uri (ri)
+              );
 
-  g_free (uri);
-#endif
+
+      gtk_recent_info_unref (ri);
+    }
+
+  g_list_free (items);
 }
+#endif
 
-void
-psppire_data_window_load_file (PsppireDataWindow *de,
-                              const gchar *file_name)
+
+static gboolean
+load_file (PsppireWindow *de, const gchar *file_name)
 {
   struct getl_interface *sss;
   struct string filename;
@@ -347,22 +354,23 @@ psppire_data_window_load_file (PsppireDataWindow *de,
 
   sss = create_syntax_string_source ("GET FILE=%s.",
                                     ds_cstr (&filename));
+
   ds_destroy (&filename);
 
   if (execute_syntax (sss) )
     {
-      psppire_window_set_filename (PSPPIRE_WINDOW (de), file_name);
-      add_most_recent (file_name);
+      psppire_window_set_filename (de, file_name);
+      return TRUE;
     }
 
-  psppire_window_set_unsaved (PSPPIRE_WINDOW (de), FALSE);
+  return FALSE;
 }
 
 
 /* Callback for the data_open action.
    Prompts for a filename and opens it */
 static void
-open_data_dialog (GtkAction *action, PsppireDataWindow *de)
+open_data_dialog (GtkAction *action, PsppireWindow *de)
 {
   GtkWidget *dialog =
     gtk_file_chooser_dialog_new (_("Open"),
@@ -408,7 +416,7 @@ open_data_dialog (GtkAction *action, PsppireDataWindow *de)
        gchar *name =
          gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
 
-       psppire_data_window_load_file (de, name);
+       psppire_window_load (de, name);
 
        g_free (name);
       }
@@ -439,14 +447,15 @@ name_has_suffix (const gchar *name)
 
 /* Save DE to file */
 static void
-save_file (PsppireDataWindow *de)
+save_file (PsppireWindow *w)
 {
   gchar *fn = NULL;
   GString *fnx;
   struct getl_interface *sss;
   struct string file_name ;
+  PsppireDataWindow *de = PSPPIRE_DATA_WINDOW (w);
 
-  g_object_get (de, "filename", &fn, NULL);
+  g_object_get (w, "filename", &fn, NULL);
 
   fnx = g_string_new (fn);
 
@@ -476,8 +485,6 @@ save_file (PsppireDataWindow *de)
   ds_destroy (&file_name);
 
   execute_syntax (sss);
-
-  psppire_window_set_unsaved (PSPPIRE_WINDOW (de), FALSE);
 }
 
 
@@ -569,7 +576,7 @@ data_save_as_dialog (PsppireDataWindow *de)
 
        psppire_window_set_filename (PSPPIRE_WINDOW (de), filename->str);
 
-       save_file (de);
+       save_file (PSPPIRE_WINDOW (de));
 
        g_string_free (filename, TRUE);
       }
@@ -590,7 +597,7 @@ data_save (PsppireWindow *de)
   const gchar *fn = psppire_window_get_filename (de);
 
   if ( NULL != fn)
-    save_file (PSPPIRE_DATA_WINDOW (de));
+    psppire_window_save (de);
   else
     data_save_as_dialog (PSPPIRE_DATA_WINDOW (de));
 }
@@ -682,6 +689,7 @@ static void
 fonts_activate (GtkMenuItem *menuitem, gpointer data)
 {
   PsppireDataWindow  *de = PSPPIRE_DATA_WINDOW (data);
+  GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (de));
   PangoFontDescription *current_font;
   gchar *font_name;
   GtkWidget *dialog =
@@ -696,8 +704,8 @@ fonts_activate (GtkMenuItem *menuitem, gpointer data)
   g_free (font_name);
 
   gtk_window_set_transient_for (GTK_WINDOW (dialog),
-                               GTK_WINDOW (get_widget_assert (de->builder,
-                                                              "data_editor")));
+                               GTK_WINDOW (toplevel));
+
   if ( GTK_RESPONSE_OK == gtk_dialog_run (GTK_DIALOG (dialog)) )
     {
       const gchar *font = gtk_font_selection_dialog_get_font_name
@@ -791,15 +799,15 @@ create_data_sheet_variable_popup_menu (PsppireDataWindow *de)
   gtk_menu_shell_append (GTK_MENU_SHELL (menu), sort_ascending);
 
 
-  g_signal_connect_swapped (G_OBJECT (sort_ascending), "activate",
+  g_signal_connect_swapped (sort_ascending, "activate",
                            G_CALLBACK (psppire_data_editor_sort_ascending),
                            de->data_editor);
 
-  g_signal_connect_swapped (G_OBJECT (sort_descending), "activate",
+  g_signal_connect_swapped (sort_descending, "activate",
                            G_CALLBACK (psppire_data_editor_sort_descending),
                            de->data_editor);
 
-  g_signal_connect_swapped (G_OBJECT (insert_variable), "activate",
+  g_signal_connect_swapped (insert_variable, "activate",
                            G_CALLBACK (gtk_action_activate),
                            de->insert_variable);
 
@@ -830,7 +838,7 @@ create_data_sheet_cases_popup_menu (PsppireDataWindow *de)
 
   gtk_menu_shell_append (GTK_MENU_SHELL (menu), insert_case);
 
-  g_signal_connect_swapped (G_OBJECT (insert_case), "activate",
+  g_signal_connect_swapped (insert_case, "activate",
                            G_CALLBACK (gtk_action_activate),
                            de->insert_case);
 
@@ -866,7 +874,7 @@ create_var_sheet_variable_popup_menu (PsppireDataWindow *de)
 
   gtk_menu_shell_append (GTK_MENU_SHELL (menu), insert_variable);
 
-  g_signal_connect_swapped (G_OBJECT (insert_variable), "activate",
+  g_signal_connect_swapped (insert_variable, "activate",
                            G_CALLBACK (gtk_action_activate),
                            de->insert_variable);
 
@@ -884,13 +892,11 @@ create_var_sheet_variable_popup_menu (PsppireDataWindow *de)
 }
 
 
-#if RECENT_LISTS_AVAILABLE && 0
-
 static void
-on_recent_data_select (GtkMenuShell *menushell,   gpointer user_data)
+on_recent_data_select (GtkMenuShell *menushell,
+                      PsppireWindow *window)
 {
   gchar *file;
-  PsppireDataWindow  *de = PSPPIRE_DATA_WINDOW (user_data);
 
   gchar *uri =
     gtk_recent_chooser_get_current_uri (GTK_RECENT_CHOOSER (menushell));
@@ -899,7 +905,7 @@ on_recent_data_select (GtkMenuShell *menushell,   gpointer user_data)
 
   g_free (uri);
 
-  psppire_data_window_load_file (de, file);
+  psppire_window_load (window, file);
 
   g_free (file);
 }
@@ -920,13 +926,14 @@ on_recent_files_select (GtkMenuShell *menushell,   gpointer user_data)
 
   se = psppire_syntax_window_new ();
 
-  psppire_syntax_window_load_from_file (PSPPIRE_SYNTAX_WINDOW (se), file, NULL);
-  gtk_widget_show (se);
+  if ( psppire_window_load (PSPPIRE_WINDOW (se), file) ) 
+    gtk_widget_show (se);
+  else
+    gtk_widget_destroy (se);
 
   g_free (file);
 }
 
-#endif
 
 static void
 enable_delete_cases (GtkWidget *w, gint case_num, gpointer data)
@@ -954,8 +961,7 @@ on_switch_sheet (GtkNotebook *notebook,
 {
   PsppireDataWindow *de = PSPPIRE_DATA_WINDOW (user_data);
 
-  GtkUIManager *uim =
-    GTK_UI_MANAGER (get_object_assert (de->builder, "uimanager1"));
+  GtkUIManager *uim = GTK_UI_MANAGER (get_object_assert (de->builder, "uimanager1", GTK_TYPE_UI_MANAGER));
 
   GtkWidget *view_data =
     gtk_ui_manager_get_widget (uim,"/ui/menubar/view/view_data");
@@ -992,27 +998,24 @@ on_switch_sheet (GtkNotebook *notebook,
 static GtkAction *
 resolve_action (GtkBuilder *builder, const gchar *action, const gchar *proxy)
 {
-  GObject *pr = NULL;
-  GObject *act = get_object_assert (builder, action);
+  GtkWidget *pr = NULL;
+  GtkAction *act = get_action_assert (builder, action);
   g_assert (GTK_IS_ACTION (act));
 
   if ( proxy )
-    {
-      pr = get_object_assert (builder, proxy);
-      g_assert (GTK_IS_WIDGET (pr));
-    }
+    pr = get_widget_assert (builder, proxy);
 
   if ( pr )
-    gtk_action_connect_proxy (GTK_ACTION (act), GTK_WIDGET (pr));
+    gtk_action_connect_proxy (act, pr);
 
-  return GTK_ACTION (act);
+  return act;
 }
 
 
 static void
 set_unsaved (gpointer w)
 {
-  psppire_window_set_unsaved (PSPPIRE_WINDOW (w), TRUE);
+  psppire_window_set_unsaved (PSPPIRE_WINDOW (w));
 }
 
 static void
@@ -1024,8 +1027,6 @@ psppire_data_window_init (PsppireDataWindow *de)
   GtkWidget *hb ;
   GtkWidget *sb ;
 
-  GtkUIManager *uim;
-
   GtkWidget *box = gtk_vbox_new (FALSE, 0);
   de->builder = builder_new ("data-editor.ui");
 
@@ -1049,15 +1050,6 @@ psppire_data_window_init (PsppireDataWindow *de)
 
   connect_help (de->builder);
 
-  g_object_ref (menubar);
-  gtk_widget_unparent (menubar);
-
-  g_object_ref (hb);
-  gtk_widget_unparent (hb);
-
-  g_object_ref (sb);
-  gtk_widget_unparent (sb);
-
   gtk_box_pack_start (GTK_BOX (box), menubar, FALSE, TRUE, 0);
   gtk_box_pack_start (GTK_BOX (box), hb, FALSE, TRUE, 0);
   gtk_box_pack_start (GTK_BOX (box), GTK_WIDGET (de->data_editor), TRUE, TRUE, 0);
@@ -1098,19 +1090,21 @@ psppire_data_window_init (PsppireDataWindow *de)
                    de);
 
 
-  g_signal_connect (get_object_assert (de->builder, "edit_copy"),
+  g_signal_connect (get_action_assert (de->builder, "edit_copy"),
                    "activate",
                    G_CALLBACK (on_edit_copy), de);
 
-  g_signal_connect (get_object_assert (de->builder, "edit_cut"),
+  g_signal_connect (get_action_assert (de->builder, "edit_cut"),
                    "activate",
                    G_CALLBACK (on_edit_cut), de);
 
 
 
   {
+    GtkWidget *toolbarbutton = get_widget_assert (de->builder, "button-open");
+
     GtkAction *action_data_open =
-      resolve_action (de->builder, "file_open_data", "button-open");
+      resolve_action (de->builder, "file_open_data", NULL);
 
     g_object_set (action_data_open,
                  "tooltip",  _("Open a data file"),
@@ -1119,6 +1113,9 @@ psppire_data_window_init (PsppireDataWindow *de)
 
     g_signal_connect (action_data_open, "activate",
                      G_CALLBACK (open_data_dialog), de);
+
+    g_signal_connect_swapped (toolbarbutton, "clicked",
+                     G_CALLBACK (gtk_action_activate), action_data_open);
   }
 
 
@@ -1201,7 +1198,7 @@ psppire_data_window_init (PsppireDataWindow *de)
   }
 
 
-  g_signal_connect (get_object_assert (de->builder, "edit_paste"), "activate",
+  g_signal_connect (get_action_assert (de->builder, "edit_paste"), "activate",
                    G_CALLBACK (on_edit_paste),
                    de);
 
@@ -1585,63 +1582,73 @@ psppire_data_window_init (PsppireDataWindow *de)
                      G_CALLBACK (regression_dialog), de);
   }
 
+  { 
+    GtkUIManager *uim = GTK_UI_MANAGER (get_object_assert (de->builder, "uimanager1", GTK_TYPE_UI_MANAGER));
 
+    GtkWidget *recent_data =
+      gtk_ui_manager_get_widget (uim,"/ui/menubar/file/file_recent-data");
 
-#if RECENT_LISTS_AVAILABLE && 0
-  {
-    GtkRecentManager *rm = gtk_recent_manager_get_default ();
-    GtkWidget *recent_data = get_object_assert (de->builder, "file_recent-data");
-    GtkWidget *recent_files = get_object_assert (de->builder, "file_recent-files");
-    GtkWidget *recent_separator = get_object_assert (de->builder, "file_separator1");
+    GtkWidget *recent_files =
+      gtk_ui_manager_get_widget (uim,"/ui/menubar/file/file_recent-files");
+
+
+    GtkWidget *menu_data =
+      gtk_recent_chooser_menu_new_for_manager (the_recent_mgr);
+
+    GtkWidget *menu_files =
+      gtk_recent_chooser_menu_new_for_manager (the_recent_mgr);
+
+    {
+      GtkRecentFilter *filter = gtk_recent_filter_new ();
 
-    GtkWidget *menu = gtk_recent_chooser_menu_new_for_manager (rm);
+      gtk_recent_filter_add_pattern (filter, "*.sav");
+      gtk_recent_filter_add_pattern (filter, "*.SAV");
+      gtk_recent_filter_add_pattern (filter, "*.por");
+      gtk_recent_filter_add_pattern (filter, "*.POR");
 
-    GtkRecentFilter *filter = gtk_recent_filter_new ();
+      gtk_recent_chooser_set_sort_type (GTK_RECENT_CHOOSER (menu_data), GTK_RECENT_SORT_MRU);
 
-    gtk_widget_show (recent_data);
-    gtk_widget_show (recent_files);
-    gtk_widget_show (recent_separator);
+      gtk_recent_chooser_add_filter (GTK_RECENT_CHOOSER (menu_data), filter);
+    }
 
-    gtk_recent_filter_add_pattern (filter, "*.sav");
-    gtk_recent_filter_add_pattern (filter, "*.SAV");
+    gtk_menu_item_set_submenu (GTK_MENU_ITEM (recent_data), menu_data);
 
-    gtk_recent_chooser_add_filter (GTK_RECENT_CHOOSER (menu), filter);
 
-    gtk_widget_set_sensitive (recent_data, TRUE);
-    g_signal_connect (menu, "selection-done",
-                     G_CALLBACK (on_recent_data_select), de);
+    g_signal_connect (menu_data, "selection-done",
+                     G_CALLBACK (on_recent_data_select),
+                     de);
 
-    gtk_menu_item_set_submenu (GTK_MENU_ITEM (recent_data), menu);
+    {
+      GtkRecentFilter *filter = gtk_recent_filter_new ();
 
+      gtk_recent_filter_add_pattern (filter, "*.sps");
+      gtk_recent_filter_add_pattern (filter, "*.SPS");
 
-    filter = gtk_recent_filter_new ();
-    menu = gtk_recent_chooser_menu_new_for_manager (rm);
+      gtk_recent_chooser_set_sort_type (GTK_RECENT_CHOOSER (menu_files), GTK_RECENT_SORT_MRU);
 
-    gtk_recent_filter_add_pattern (filter, "*.sps");
-    gtk_recent_filter_add_pattern (filter, "*.SPS");
+      gtk_recent_chooser_add_filter (GTK_RECENT_CHOOSER (menu_files), filter);
+    }
 
-    gtk_recent_chooser_add_filter (GTK_RECENT_CHOOSER (menu), filter);
+    gtk_menu_item_set_submenu (GTK_MENU_ITEM (recent_files), menu_files);
 
-    gtk_widget_set_sensitive (recent_files, TRUE);
-    g_signal_connect (menu, "selection-done",
-                     G_CALLBACK (on_recent_files_select), de);
+    g_signal_connect (menu_files, "selection-done",
+                     G_CALLBACK (on_recent_files_select),
+                     de);
 
-    gtk_menu_item_set_submenu (GTK_MENU_ITEM (recent_files), menu);
   }
-#endif
 
-  g_signal_connect (get_object_assert (de->builder,"file_new_syntax"),
+  g_signal_connect (get_action_assert (de->builder,"file_new_syntax"),
                    "activate",
                    G_CALLBACK (create_syntax_window),
                    NULL);
 
-  g_signal_connect (get_object_assert (de->builder,"file_open_syntax"),
+  g_signal_connect (get_action_assert (de->builder,"file_open_syntax"),
                    "activate",
                    G_CALLBACK (open_syntax_window),
                    de);
 
   {
-    GObject *abt = get_object_assert (de->builder, "help_about");
+    GtkAction *abt = get_action_assert (de->builder, "help_about");
     g_object_set (abt, "stock-id", "gtk-about", NULL);
     g_signal_connect (abt,
                      "activate",
@@ -1650,7 +1657,7 @@ psppire_data_window_init (PsppireDataWindow *de)
   }
 
 
-  g_signal_connect (get_object_assert (de->builder,"help_reference"),
+  g_signal_connect (get_action_assert (de->builder,"help_reference"),
                    "activate",
                    G_CALLBACK (reference_manual),
                    de);
@@ -1667,29 +1674,29 @@ psppire_data_window_init (PsppireDataWindow *de)
                    de);
 
 
-  g_signal_connect (GTK_NOTEBOOK (de->data_editor),
+  g_signal_connect (de->data_editor,
                    "switch-page",
                    G_CALLBACK (on_switch_sheet), de);
 
   gtk_notebook_set_current_page (GTK_NOTEBOOK (de->data_editor), PSPPIRE_DATA_EDITOR_VARIABLE_VIEW);
   gtk_notebook_set_current_page (GTK_NOTEBOOK (de->data_editor), PSPPIRE_DATA_EDITOR_DATA_VIEW);
 
-  g_signal_connect (get_object_assert (de->builder, "view_statusbar"),
+  g_signal_connect (get_action_assert (de->builder, "view_statusbar"),
                    "activate",
                    G_CALLBACK (status_bar_activate), de);
 
 
-  g_signal_connect (get_object_assert (de->builder, "view_gridlines"),
+  g_signal_connect (get_action_assert (de->builder, "view_gridlines"),
                    "activate",
                    G_CALLBACK (grid_lines_activate), de);
 
 
 
-  g_signal_connect (get_object_assert (de->builder, "view_data"),
+  g_signal_connect (get_action_assert (de->builder, "view_data"),
                    "activate",
                    G_CALLBACK (data_view_activate), de);
 
-  g_signal_connect (get_object_assert (de->builder, "view_variables"),
+  g_signal_connect (get_action_assert (de->builder, "view_variables"),
                    "activate",
                    G_CALLBACK (variable_view_activate), de);
 
@@ -1709,16 +1716,16 @@ psppire_data_window_init (PsppireDataWindow *de)
 
 
 
-  g_signal_connect (get_object_assert (de->builder, "file_quit"),
+  g_signal_connect (get_action_assert (de->builder, "file_quit"),
                    "activate",
                    G_CALLBACK (file_quit), de);
 
-  g_signal_connect (get_object_assert (de->builder, "transform_run-pending"),
+  g_signal_connect (get_action_assert (de->builder, "transform_run-pending"),
                    "activate",
                    G_CALLBACK (execute), de);
 
 
-  g_signal_connect (get_object_assert (de->builder, "windows_minimise_all"),
+  g_signal_connect (get_action_assert (de->builder, "windows_minimise_all"),
                    "activate",
                    G_CALLBACK (psppire_window_minimise_all), NULL);
 
@@ -1746,10 +1753,12 @@ psppire_data_window_init (PsppireDataWindow *de)
   de->data_sheet_cases_popup_menu =
     GTK_MENU (create_data_sheet_cases_popup_menu (de));
 
-  uim = GTK_UI_MANAGER (get_object_assert (de->builder, "uimanager1"));
+  {
+  GtkUIManager *uim = GTK_UI_MANAGER (get_object_assert (de->builder, "uimanager1", GTK_TYPE_UI_MANAGER));
 
   PSPPIRE_WINDOW (de)->menu =
     GTK_MENU_SHELL (gtk_ui_manager_get_widget (uim,"/ui/menubar/windows/windows_minimise_all")->parent);
+  }
 
 
   g_object_set (de->data_editor,
@@ -1779,5 +1788,6 @@ psppire_data_window_new (void)
 static void
 psppire_data_window_iface_init (PsppireWindowIface *iface)
 {
-  iface->save = data_save;
+  iface->save = save_file;
+  iface->load = load_file;
 }