Remove some unnecessary casts
[pspp-builds.git] / src / ui / gui / psppire-data-window.c
index 84fc50717aa3b023ceed12768e35149fd4ccd9af..7565dbb4b7ca223c434e6527701a762b5c14af7c 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;
@@ -144,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. */
@@ -178,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");
@@ -298,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;
@@ -330,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"),
@@ -391,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);
       }
@@ -568,14 +594,14 @@ data_save_as_dialog (PsppireDataWindow *de)
 /* Callback for data_save action.
  */
 static void
-data_save (PsppireDataWindow *de)
+data_save (PsppireWindow *de)
 {
-  const gchar *fn = psppire_window_get_filename (PSPPIRE_WINDOW (de));
+  const gchar *fn = psppire_window_get_filename (de);
 
   if ( NULL != fn)
-    save_file (de);
+    save_file (PSPPIRE_DATA_WINDOW (de));
   else
-    data_save_as_dialog (de);
+    data_save_as_dialog (PSPPIRE_DATA_WINDOW (de));
 }
 
 
@@ -723,7 +749,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 ();
 }
 
 
@@ -773,15 +800,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);
 
@@ -812,7 +839,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);
 
@@ -848,7 +875,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);
 
@@ -866,13 +893,11 @@ create_var_sheet_variable_popup_menu (PsppireDataWindow *de)
 }
 
 
-#if RECENT_LISTS_AVAILABLE
-
 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));
@@ -881,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);
 }
@@ -902,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)
@@ -936,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");
@@ -974,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;
 }
 
 
@@ -997,22 +1019,6 @@ set_unsaved (gpointer w)
   psppire_window_set_unsaved (PSPPIRE_WINDOW (w), TRUE);
 }
 
-/* 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)
-{
-  PsppireDataWindow *dw = PSPPIRE_DATA_WINDOW (user_data);
-
-  if (psppire_window_query_save (PSPPIRE_WINDOW (dw)))
-    {
-      data_save (dw);
-    }
-
-  return FALSE;
-}
-
-
 static void
 psppire_data_window_init (PsppireDataWindow *de)
 {
@@ -1022,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");
 
@@ -1096,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);
 
@@ -1199,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);
 
@@ -1583,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");
+
+    GtkWidget *recent_files =
+      gtk_ui_manager_get_widget (uim,"/ui/menubar/file/file_recent-files");
 
-#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 *menu = gtk_recent_chooser_menu_new_for_manager (rm);
+    GtkWidget *menu_data =
+      gtk_recent_chooser_menu_new_for_manager (the_recent_mgr);
 
-    GtkRecentFilter *filter = gtk_recent_filter_new ();
+    GtkWidget *menu_files =
+      gtk_recent_chooser_menu_new_for_manager (the_recent_mgr);
 
-    gtk_widget_show (recent_data);
-    gtk_widget_show (recent_files);
-    gtk_widget_show (recent_separator);
+    {
+      GtkRecentFilter *filter = gtk_recent_filter_new ();
+
+      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");
 
-    gtk_recent_filter_add_pattern (filter, "*.sav");
-    gtk_recent_filter_add_pattern (filter, "*.SAV");
+      gtk_recent_chooser_set_sort_type (GTK_RECENT_CHOOSER (menu_data), GTK_RECENT_SORT_MRU);
+
+      gtk_recent_chooser_add_filter (GTK_RECENT_CHOOSER (menu_data), filter);
+    }
 
-    gtk_recent_chooser_add_filter (GTK_RECENT_CHOOSER (menu), filter);
+    gtk_menu_item_set_submenu (GTK_MENU_ITEM (recent_data), menu_data);
 
-    gtk_widget_set_sensitive (recent_data, TRUE);
-    g_signal_connect (menu, "selection-done",
-                     G_CALLBACK (on_recent_data_select), de);
 
-    gtk_menu_item_set_submenu (GTK_MENU_ITEM (recent_data), menu);
+    g_signal_connect (menu_data, "selection-done",
+                     G_CALLBACK (on_recent_data_select),
+                     de);
 
+    {
+      GtkRecentFilter *filter = gtk_recent_filter_new ();
 
-    filter = gtk_recent_filter_new ();
-    menu = gtk_recent_chooser_menu_new_for_manager (rm);
+      gtk_recent_filter_add_pattern (filter, "*.sps");
+      gtk_recent_filter_add_pattern (filter, "*.SPS");
 
-    gtk_recent_filter_add_pattern (filter, "*.sps");
-    gtk_recent_filter_add_pattern (filter, "*.SPS");
+      gtk_recent_chooser_set_sort_type (GTK_RECENT_CHOOSER (menu_files), GTK_RECENT_SORT_MRU);
 
-    gtk_recent_chooser_add_filter (GTK_RECENT_CHOOSER (menu), filter);
+      gtk_recent_chooser_add_filter (GTK_RECENT_CHOOSER (menu_files), filter);
+    }
 
-    gtk_widget_set_sensitive (recent_files, TRUE);
-    g_signal_connect (menu, "selection-done",
-                     G_CALLBACK (on_recent_files_select), de);
+    gtk_menu_item_set_submenu (GTK_MENU_ITEM (recent_files), menu_files);
+
+    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",
@@ -1648,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);
@@ -1665,29 +1679,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);
 
@@ -1707,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);
 
@@ -1744,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,
@@ -1756,9 +1772,6 @@ psppire_data_window_init (PsppireDataWindow *de)
                "varsheet-row-menu", de->var_sheet_variable_popup_menu,
                NULL);
 
-  g_signal_connect (de, "delete-event", G_CALLBACK (on_delete), de);
-
-
   gtk_widget_show (GTK_WIDGET (de->data_editor));
   gtk_widget_show (box);
 }
@@ -1772,3 +1785,14 @@ psppire_data_window_new (void)
                                   NULL));
 }
 
+
+
+
+\f
+
+static void
+psppire_data_window_iface_init (PsppireWindowIface *iface)
+{
+  iface->save = data_save;
+  iface->load = load_file;
+}