Enabled deletion of cases from the datasheet.
authorJohn Darrington <john@darrington.wattle.id.au>
Tue, 10 Jul 2007 07:40:02 +0000 (07:40 +0000)
committerJohn Darrington <john@darrington.wattle.id.au>
Tue, 10 Jul 2007 07:40:02 +0000 (07:40 +0000)
lib/gtksheet/gtksheet.c
lib/gtksheet/gtksheet.h
src/ui/gui/data-editor.c
src/ui/gui/psppire-data-store.c
src/ui/gui/psppire-data-store.h

index 73c245c3be87a829082188ee514fa8ed752900e1..082188bcf8aaee954811f425801a745803d96da7 100644 (file)
@@ -2215,6 +2215,8 @@ gtk_sheet_select_column (GtkSheet * sheet, gint column)
   gtk_sheet_real_select_range (sheet, NULL);
 }
 
+
+
 void
 gtk_sheet_clip_range (GtkSheet *sheet, const GtkSheetRange *range)
 {
@@ -4707,6 +4709,16 @@ gtk_sheet_real_select_range (GtkSheet * sheet,
   gtk_signal_emit (GTK_OBJECT (sheet), sheet_signals[SELECT_RANGE], &sheet->range);
 }
 
+
+void
+gtk_sheet_get_selected_range           (GtkSheet *sheet,
+                                        GtkSheetRange *range)
+{
+  g_return_if_fail (sheet != NULL);
+  *range = sheet->range;
+}
+
+
 void
 gtk_sheet_select_range (GtkSheet * sheet, const GtkSheetRange *range)
 {
index 9b8525309255c16dd7a134e88bd3d0593b30ccdd..86c6c2df8db2b6e52e819a4e78a60a3deee2e79e 100644 (file)
@@ -353,6 +353,11 @@ gtk_sheet_get_rows_count           (GtkSheet *sheet);
 void
 gtk_sheet_get_visible_range            (GtkSheet *sheet,
                                         GtkSheetRange *range);
+
+void
+gtk_sheet_get_selected_range           (GtkSheet *sheet,
+                                        GtkSheetRange *range);
+
 void
 gtk_sheet_set_selection_mode           (GtkSheet *sheet, gint mode);
 
index d75ea5c9145d603cb46cec6baf9beb62fa1afe44..d6cf50b395bf2e6d8737f3df71de31b0a2cc8bda 100644 (file)
@@ -494,17 +494,27 @@ new_data_editor (void)
                    G_CALLBACK (reference_manual),
                    e->window);
 
-  g_signal_connect (get_widget_assert (de->xml,"data_sheet"),
+  g_signal_connect (data_sheet,
                    "double-click-column",
                    G_CALLBACK (click2column),
                    de);
 
-  g_signal_connect (get_widget_assert (de->xml, "variable_sheet"),
+  g_signal_connect (data_sheet,
+                   "select-row",
+                   GTK_SIGNAL_FUNC (enable_edit_clear),
+                   de);
+
+  g_signal_connect (data_sheet,
+                   "activate",
+                   GTK_SIGNAL_FUNC (disable_edit_clear),
+                   de);
+
+  g_signal_connect (var_sheet,
                    "double-click-row",
                    GTK_SIGNAL_FUNC (click2row),
                    de);
 
-  g_signal_connect (get_widget_assert (de->xml, "variable_sheet"),
+  g_signal_connect (var_sheet,
                    "select-row",
                    GTK_SIGNAL_FUNC (enable_edit_clear),
                    de);
@@ -844,42 +854,67 @@ file_quit (GtkCheckMenuItem *menuitem, gpointer data)
 }
 
 
-
 /* Callback for when the Clear item in the edit menu is activated */
 static void
 on_clear_activate (GtkMenuItem *menuitem, gpointer data)
 {
   struct data_editor *de = data;
 
+  GtkSheet *sheet  = NULL;
+  GtkSheetRange range ;
+
   GtkNotebook *notebook = GTK_NOTEBOOK (get_widget_assert (de->xml,
                                                           "notebook"));
 
-  switch ( gtk_notebook_get_current_page (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 );
+
+
+  gtk_sheet_get_selected_range (sheet, &range);
+
+  switch ( page )
     {
     case PAGE_VAR_SHEET:
       {
-       GtkSheet *var_sheet =
-         GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
-
        PsppireVarStore *vs = PSPPIRE_VAR_STORE
-         (gtk_sheet_get_model (var_sheet) );
+         (gtk_sheet_get_model (sheet) );
 
-       /* This shouldn't be able to happen, because the menuitem
-          should be disabled */
-       g_return_if_fail (var_sheet->state  ==  GTK_SHEET_ROW_SELECTED );
 
        psppire_dict_delete_variables (vs->dict,
-                                      var_sheet->range.row0,
+                                      range.row0,
                                       1 +
-                                      var_sheet->range.rowi -
-                                      var_sheet->range.row0 );
+                                      range.rowi -
+                                      range.row0 );
+      }
+      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 );
+
+
+       psppire_data_store_delete_cases (data_store, range.row0,
+                                        1 + range.rowi - range.row0);
       }
       break;
-      case PAGE_DATA_SHEET:
-       break;
-      default:
-       g_assert_not_reached ();
+    default:
+      g_assert_not_reached ();
     }
+
+  gtk_sheet_unselect_range (sheet);
 }
 
 static void
index c223ccf2a469684854cc87d87594110acd5fc6eb..40c3843fab3d429fffd3f8c43b27855015180a04 100644 (file)
@@ -455,6 +455,15 @@ psppire_data_store_finalize (GObject *object)
   (* parent_class->finalize) (object);
 }
 
+gboolean
+psppire_data_store_delete_cases (PsppireDataStore *ds,
+                                casenumber first, casenumber count)
+{
+  g_return_val_if_fail (ds, FALSE);
+
+  return psppire_case_file_delete_cases (ds->case_file, count, first);
+}
+
 
 
 /* Insert a blank case before POSN */
index d305ad844516bec91e711bc470344766045fc6cf..88ae85bec959910b5abf039cb9d62d468ad59cab 100644 (file)
@@ -99,6 +99,10 @@ void psppire_data_store_clear (PsppireDataStore *data_store);
 
 gboolean psppire_data_store_insert_new_case (PsppireDataStore *ds, casenumber posn);
 
+
+gboolean psppire_data_store_delete_cases (PsppireDataStore *ds, casenumber first, casenumber count);
+
+
 struct casereader * psppire_data_store_get_reader (PsppireDataStore *ds);
 
 gchar * psppire_data_store_get_string (PsppireDataStore *ds,