Removed the "feature" where rows are automatically appended
[pspp-builds.git] / src / ui / gui / psppire-data-store.c
index 1e6568b78afa6bfe6247142da7d0a3f7ac649b00..0b762fd396c00a116bc85c7361bea50a446bdbb2 100644 (file)
@@ -48,6 +48,7 @@ static void psppire_data_store_sheet_column_init (GSheetColumnIface *iface);
 static void psppire_data_store_sheet_row_init (GSheetRowIface *iface);
 
 static void psppire_data_store_finalize        (GObject           *object);
+static void psppire_data_store_dispose        (GObject           *object);
 
 static gboolean psppire_data_store_clear_datum (GSheetModel *model,
                                          glong row, glong column);
@@ -137,6 +138,7 @@ psppire_data_store_class_init (PsppireDataStoreClass *class)
   object_class = (GObjectClass*) class;
 
   object_class->finalize = psppire_data_store_finalize;
+  object_class->dispose = psppire_data_store_dispose;
 
   signals [FONT_CHANGED] =
     g_signal_new ("font_changed",
@@ -165,6 +167,12 @@ psppire_data_store_get_case_count (const PsppireDataStore *store)
   return psppire_case_file_get_case_count (store->case_file);
 }
 
+size_t
+psppire_data_store_get_value_count (const PsppireDataStore *store)
+{
+  return psppire_dict_get_value_cnt (store->dict);
+}
+
 inline casenumber
 psppire_data_store_get_case_count_wrapper (const GSheetModel *model)
 {
@@ -176,10 +184,9 @@ static void
 psppire_data_store_init (PsppireDataStore *data_store)
 {
   data_store->dict = 0;
-  data_store->case_file = 0;
+  data_store->case_file = NULL;
   data_store->width_of_m = 10;
-
-
+  data_store->dispose_has_run = FALSE;
 }
 
 const PangoFontDescription *
@@ -390,10 +397,8 @@ psppire_data_store_set_case_file (PsppireDataStore *ds,
                                  PsppireCaseFile *cf)
 {
   gint i;
-  if ( ds->case_file)
-    {
-      g_object_unref (ds->case_file);
-    }
+  if ( ds->case_file)  g_object_unref (ds->case_file);
+
 
   ds->case_file = cf;
 
@@ -509,6 +514,24 @@ psppire_data_store_finalize (GObject *object)
   (* parent_class->finalize) (object);
 }
 
+
+static void
+psppire_data_store_dispose (GObject *object)
+{
+  PsppireDataStore *ds = PSPPIRE_DATA_STORE (object);
+
+  if (ds->dispose_has_run)
+    return;
+
+  if (ds->case_file) g_object_unref (ds->case_file);
+
+  /* must chain up */
+  (* parent_class->dispose) (object);
+
+  ds->dispose_has_run = TRUE;
+}
+
+
 gboolean
 psppire_data_store_delete_cases (PsppireDataStore *ds,
                                 casenumber first, casenumber count)
@@ -653,23 +676,17 @@ gboolean
 psppire_data_store_set_string (PsppireDataStore *store,
                               const gchar *text, glong row, glong col)
 {
+  glong n_cases;
   const struct variable *pv = psppire_dict_get_variable (store->dict, col);
   g_return_val_if_fail (pv, FALSE);
 
-#if 0
-  /* Allow the user to insert a lot of blank cases, simply by skipping rows */
-  for (r = psppire_case_file_get_case_count (store->case_file); r <= row ; ++r)
-    {
-
-      gint c;
+  n_cases = psppire_data_store_get_case_count (store);
 
-      psppire_case_array_insert_case (store->cases, r, 0, 0);
+  if ( row > n_cases)
+    return FALSE;
 
-
-      for (c = 0 ; c < psppire_dict_get_var_cnt (store->dict); ++c )
-       psppire_data_store_clear_datum (model, r, c);
-    }
-#endif
+  if (row == n_cases)
+    psppire_data_store_insert_new_case (store, row);
 
   psppire_case_file_data_in (store->case_file, row,
                              var_get_case_index (pv), ss_cstr (text),