Enabled deleting of variables from the datasheet
authorJohn Darrington <john@darrington.wattle.id.au>
Wed, 18 Jul 2007 04:27:29 +0000 (04:27 +0000)
committerJohn Darrington <john@darrington.wattle.id.au>
Wed, 18 Jul 2007 04:27:29 +0000 (04:27 +0000)
lib/gtksheet/gtksheet.c
src/ui/gui/data-editor.c
src/ui/gui/data-editor.glade
src/ui/gui/data-editor.h
src/ui/gui/psppire-case-file.c

index 00978dd05abc3233e81aad11a0259cfb90c1d789..72115b892aa83ca15d21c5925eba5ce3e2e3ee8c 100644 (file)
@@ -4754,6 +4754,7 @@ gtk_sheet_unselect_range (GtkSheet * sheet)
 {
   gtk_sheet_real_unselect_range (sheet, NULL);
   sheet->state = GTK_STATE_NORMAL;
+
   gtk_sheet_activate_cell (sheet,
                           sheet->active_cell.row, sheet->active_cell.col);
 }
@@ -4772,6 +4773,9 @@ gtk_sheet_real_unselect_range (GtkSheet * sheet,
   if (range->row0 < 0 || range->rowi < 0) return;
   if (range->col0 < 0 || range->coli < 0) return;
 
+  g_signal_emit (G_OBJECT (sheet), sheet_signals[SELECT_COLUMN], 0, -1);
+  g_signal_emit (G_OBJECT (sheet), sheet_signals[SELECT_ROW], 0, -1);
+
   if (gtk_sheet_range_isvisible (sheet, *range))
     gtk_sheet_draw_backing_pixmap (sheet, *range);
 
index 36150579051ef45cb9f15b8dc662a3e414c5804f..2e44c67c731ac6dd993b19c63fd3c00a5acdf95d 100644 (file)
@@ -58,9 +58,9 @@ static gint update_data_ref_entry (const GtkSheet *sheet,
 static void register_data_editor_actions (struct data_editor *de);
 
 static void insert_variable (GtkAction *, gpointer data);
-
 static void insert_case (GtkAction *a, gpointer data);
-
+static void delete_cases (GtkAction *a, gpointer data);
+static void delete_variables (GtkAction *a, gpointer data);
 
 
 /* Switch between the VAR SHEET and the DATA SHEET */
@@ -99,30 +99,24 @@ static void value_labels_toggled (GtkToggleToolButton *, gpointer);
 
 static void file_quit (GtkCheckMenuItem *, gpointer );
 
-static void on_clear_activate (GtkMenuItem *, gpointer);
-
 static void
-enable_edit_clear (GtkWidget *w, gint row, gpointer data)
+enable_delete_cases (GtkWidget *w, gint var, gpointer data)
 {
   struct data_editor *de = data;
 
-  GtkWidget *menuitem = get_widget_assert (de->xml, "edit_clear");
-
-  gtk_widget_set_sensitive (menuitem, TRUE);
+  gtk_action_set_visible (de->delete_cases, var != -1);
 }
 
-static gboolean
-disable_edit_clear (GtkWidget *w, gint x, gint y, gpointer data)
+
+static void
+enable_delete_variables (GtkWidget *w, gint var, gpointer data)
 {
   struct data_editor *de = data;
 
-  GtkWidget *menuitem = get_widget_assert (de->xml, "edit_clear");
-
-  gtk_widget_set_sensitive (menuitem, FALSE);
-
-  return FALSE;
+  gtk_action_set_visible (de->delete_variables, var != -1);
 }
 
+
 static void open_data_file (const gchar *, struct data_editor *);
 
 
@@ -241,6 +235,37 @@ new_data_editor (void)
 
   register_data_editor_actions (de);
 
+
+  de->delete_cases =
+    gtk_action_new ("clear-cases",
+                   _("Clear"),
+                   _("Delete the cases at the selected position(s)"),
+                   "pspp-clear-cases");
+
+  g_signal_connect (de->delete_cases, "activate",
+                   G_CALLBACK (delete_cases), de);
+
+  gtk_action_connect_proxy (de->delete_cases,
+                           get_widget_assert (de->xml, "edit_clear-cases"));
+
+
+  gtk_action_set_visible (de->delete_cases, FALSE);
+
+  de->delete_variables =
+    gtk_action_new ("clear-variables",
+                   _("Clear"),
+                   _("Delete the variables at the selected position(s)"),
+                   "pspp-clear-variables");
+
+  g_signal_connect (de->delete_variables, "activate",
+                   G_CALLBACK (delete_variables), de);
+
+  gtk_action_connect_proxy (de->delete_variables,
+                           get_widget_assert (de->xml, "edit_clear-variables")
+                           );
+
+  gtk_action_set_visible (de->delete_variables, FALSE);
+
   de->insert_variable =
     gtk_action_new ("insert-variable",
                    _("Insert Variable"),
@@ -447,14 +472,6 @@ new_data_editor (void)
                            G_CALLBACK (gtk_action_activate),
                            de->action_data_save_as);
 
-
-  g_signal_connect (get_widget_assert (de->xml,"edit_clear"),
-                   "activate",
-                   G_CALLBACK (on_clear_activate),
-                   de);
-
-
-
   gtk_action_connect_proxy (de->invoke_weight_cases_dialog,
                            get_widget_assert (de->xml, "data_weight-cases")
                            );
@@ -500,31 +517,26 @@ new_data_editor (void)
                    de);
 
   g_signal_connect (data_sheet,
-                   "select-row",
-                   GTK_SIGNAL_FUNC (enable_edit_clear),
+                   "select-column",
+                   G_CALLBACK (enable_delete_variables),
                    de);
 
   g_signal_connect (data_sheet,
-                   "activate",
-                   GTK_SIGNAL_FUNC (disable_edit_clear),
+                   "select-row",
+                   G_CALLBACK (enable_delete_cases),
                    de);
 
+
   g_signal_connect (var_sheet,
                    "double-click-row",
                    GTK_SIGNAL_FUNC (click2row),
                    de);
 
-  g_signal_connect (var_sheet,
+  g_signal_connect_after (var_sheet,
                    "select-row",
-                   GTK_SIGNAL_FUNC (enable_edit_clear),
-                   de);
-
-  g_signal_connect (get_widget_assert (de->xml, "variable_sheet"),
-                   "activate",
-                   GTK_SIGNAL_FUNC (disable_edit_clear),
+                   G_CALLBACK (enable_delete_variables),
                    de);
 
-
   g_signal_connect (get_widget_assert (de->xml, "notebook"),
                    "switch-page",
                    G_CALLBACK (data_var_select), de);
@@ -853,28 +865,48 @@ file_quit (GtkCheckMenuItem *menuitem, gpointer data)
   gtk_main_quit ();
 }
 
-
-/* Callback for when the Clear item in the edit menu is activated */
 static void
-on_clear_activate (GtkMenuItem *menuitem, gpointer data)
+delete_cases (GtkAction *action, gpointer data)
 {
   struct data_editor *de = data;
+  GtkSheet *data_sheet =
+    GTK_SHEET (get_widget_assert (de->xml, "data_sheet"));
+
+  GtkSheetRange range;
+
+  PsppireDataStore *data_store = PSPPIRE_DATA_STORE
+    (gtk_sheet_get_model (data_sheet) );
+
+
+  /* This shouldn't be able to happen, because the action
+     should be disabled */
+  g_return_if_fail (gtk_sheet_get_state (data_sheet)
+                   ==  GTK_SHEET_ROW_SELECTED );
+
+  gtk_sheet_get_selected_range (data_sheet, &range);
+
+  gtk_sheet_unselect_range (data_sheet);
 
-  GtkSheet *sheet  = NULL;
-  GtkSheetRange range ;
+  psppire_data_store_delete_cases (data_store, range.row0,
+                                  1 + range.rowi - range.row0);
+
+}
+
+static void
+delete_variables (GtkAction *a, gpointer data)
+{
+  struct data_editor *de = data;
+  GtkSheetRange range;
 
   GtkNotebook *notebook = GTK_NOTEBOOK (get_widget_assert (de->xml,
                                                           "notebook"));
 
   const gint page = gtk_notebook_get_current_page (notebook);
 
-  sheet = GTK_SHEET
-    (get_widget_assert (de->xml,
-                       (page == PAGE_VAR_SHEET) ? "variable_sheet" : "data_sheet"));
-
-  /* This shouldn't be able to happen, because the menuitem
-     should be disabled */
-  g_return_if_fail (gtk_sheet_get_state (sheet) == GTK_SHEET_ROW_SELECTED );
+  GtkSheet *sheet = GTK_SHEET (get_widget_assert (de->xml,
+                                                 (page == PAGE_VAR_SHEET) ?
+                                                 "variable_sheet" :
+                                                 "data_sheet"));
 
 
   gtk_sheet_get_selected_range (sheet, &range);
@@ -883,9 +915,8 @@ on_clear_activate (GtkMenuItem *menuitem, gpointer data)
     {
     case PAGE_VAR_SHEET:
       {
-       PsppireVarStore *vs = PSPPIRE_VAR_STORE
-         (gtk_sheet_get_model (sheet) );
-
+       PsppireVarStore *vs =
+         PSPPIRE_VAR_STORE (gtk_sheet_get_model (sheet));
 
        psppire_dict_delete_variables (vs->dict,
                                       range.row0,
@@ -896,23 +927,17 @@ on_clear_activate (GtkMenuItem *menuitem, gpointer data)
       break;
     case PAGE_DATA_SHEET:
       {
-       PsppireDataStore *data_store = PSPPIRE_DATA_STORE
-         (gtk_sheet_get_model (sheet) );
-
-
-       /* This shouldn't be able to happen, because the menuitem
-          should be disabled */
-       g_return_if_fail (gtk_sheet_get_state (sheet)
-                         ==  GTK_SHEET_ROW_SELECTED );
-
+       PsppireDataStore *ds =
+         PSPPIRE_DATA_STORE (gtk_sheet_get_model (sheet));
 
-       psppire_data_store_delete_cases (data_store, range.row0,
-                                        1 + range.rowi - range.row0);
+       psppire_dict_delete_variables (ds->dict,
+                                      range.col0,
+                                      1 +
+                                      range.coli -
+                                      range.col0 );
       }
       break;
-    default:
-      g_assert_not_reached ();
-    }
+    };
 
   gtk_sheet_unselect_range (sheet);
 }
index 8ca8aab4823756fa3a4d8d444344d2d78cc5de24..c34f4d541ce594b216effec0f1826c21c39594de 100644 (file)
                       </widget>
                     </child>
                     <child>
-                      <widget class="GtkMenuItem" id="edit_clear">
+                      <widget class="GtkMenuItem" id="edit_clear-variables">
                         <property name="visible">True</property>
                         <property name="sensitive">False</property>
-                        <property name="label" translatable="yes">Cl_ear</property>
+                        <property name="label" translatable="yes">Cl_ear Variables</property>
+                        <property name="use_underline">True</property>
+                      </widget>
+                   </child>
+                    <child>
+                      <widget class="GtkMenuItem" id="edit_clear-cases">
+                        <property name="visible">True</property>
+                        <property name="sensitive">False</property>
+                        <property name="label" translatable="yes">_Clear Cases</property>
                         <property name="use_underline">True</property>
                       </widget>
                     </child>
index 27dff55e9fc6af9e1f6bafbaaf08ee66326197c5..582ae227143eea5e1b8d14fbbc76387c52191a89 100644 (file)
@@ -43,6 +43,9 @@ struct data_editor
   GtkAction *insert_variable;
   GtkAction *insert_case;
 
+  GtkAction *delete_variables;
+  GtkAction *delete_cases;
+
   GladeXML *xml;
 
   gboolean save_as_portable;
index 455ac2b755b7d412d89de82cfd6d1d775f7896d1..878d7fa0632d72987ff45f6b1ae6f39e631443aa 100644 (file)
@@ -171,7 +171,7 @@ psppire_case_file_delete_cases (PsppireCaseFile *cf, casenumber n_cases, casenum
 
   datasheet_delete_rows (cf->datasheet, first, n_cases);
 
-  g_signal_emit (cf, signals [CASES_DELETED], 0, n_cases, first);
+  g_signal_emit (cf, signals [CASES_DELETED], 0, first, n_cases);
 
   return TRUE;
 }