Refactor Data and Syntax Loading
[pspp-builds.git] / src / ui / gui / psppire-data-window.c
index c82631839244e5350aae6a7b859adbcc894e91ff..16db8131a16c4970efa7380cda16c1de2b557181 100644 (file)
@@ -161,23 +161,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 +196,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 +315,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 +355,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 +417,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);
       }
@@ -884,13 +893,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 +906,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 +927,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 +962,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,20 +999,17 @@ 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;
 }
 
 
@@ -1024,8 +1028,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");
 
@@ -1098,11 +1100,11 @@ 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);
 
@@ -1201,7 +1203,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 +1587,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 +1662,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);
@@ -1674,22 +1686,22 @@ psppire_data_window_init (PsppireDataWindow *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 +1721,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 +1758,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,
@@ -1780,4 +1794,5 @@ static void
 psppire_data_window_iface_init (PsppireWindowIface *iface)
 {
   iface->save = data_save;
+  iface->load = load_file;
 }