Re-enabled automatic insertion of cases in data sheet.
authorJohn Darrington <john@darrington.wattle.id.au>
Sun, 30 Jul 2006 12:27:59 +0000 (12:27 +0000)
committerJohn Darrington <john@darrington.wattle.id.au>
Sun, 30 Jul 2006 12:27:59 +0000 (12:27 +0000)
po/de.po
po/pspp.pot
src/ui/gui/TODO
src/ui/gui/data-sheet.c
src/ui/gui/menu-actions.c
src/ui/gui/psppire-case-file.c
src/ui/gui/psppire-case-file.h
src/ui/gui/psppire-data-store.c
src/ui/gui/psppire-data-store.h

index dabaa739ce5e4da224715267c30e15d5990fbd6c..145f70c62767d5f5c8fa7b2a43d98c7b7561ea53 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PSPP 0.4.2\n"
 "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
 msgstr ""
 "Project-Id-Version: PSPP 0.4.2\n"
 "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
-"POT-Creation-Date: 2006-07-29 13:49+0800\n"
+"POT-Creation-Date: 2006-07-30 14:13+0800\n"
 "PO-Revision-Date: 2006-05-26 17:49+0800\n"
 "Last-Translator: John Darrington <john@darrington.wattle.id.au>\n"
 "Language-Team: German <pspp-dev@gnu.org>\n"
 "PO-Revision-Date: 2006-05-26 17:49+0800\n"
 "Last-Translator: John Darrington <john@darrington.wattle.id.au>\n"
 "Language-Team: German <pspp-dev@gnu.org>\n"
@@ -4218,11 +4218,11 @@ msgstr "Tragbardatein (*.por)"
 msgid "All Files"
 msgstr "Alle Datei"
 
 msgid "All Files"
 msgstr "Alle Datei"
 
-#: src/ui/gui/menu-actions.c:272
+#: src/ui/gui/menu-actions.c:273
 msgid "Save Data As"
 msgstr "Speichern unter"
 
 msgid "Save Data As"
 msgstr "Speichern unter"
 
-#: src/ui/gui/menu-actions.c:568
+#: src/ui/gui/menu-actions.c:582
 msgid "Font Selection"
 msgstr "Schriftwahlung"
 
 msgid "Font Selection"
 msgstr "Schriftwahlung"
 
@@ -4250,11 +4250,11 @@ msgstr "Falshe Spannweitebeschreibung"
 msgid "Sorry. The help system hasn't yet been implemented."
 msgstr "Es gibt noch nicht kein Helpsysteme. Schade!"
 
 msgid "Sorry. The help system hasn't yet been implemented."
 msgstr "Es gibt noch nicht kein Helpsysteme. Schade!"
 
-#: src/ui/gui/psppire-data-store.c:699
+#: src/ui/gui/psppire-data-store.c:731
 msgid "var"
 msgstr ""
 
 msgid "var"
 msgstr ""
 
-#: src/ui/gui/psppire-data-store.c:780 src/ui/gui/psppire-var-store.c:518
+#: src/ui/gui/psppire-data-store.c:812 src/ui/gui/psppire-var-store.c:518
 #: src/ui/gui/psppire-var-store.c:528 src/ui/gui/psppire-var-store.c:538
 #: src/ui/gui/psppire-var-store.c:735
 #, c-format
 #: src/ui/gui/psppire-var-store.c:528 src/ui/gui/psppire-var-store.c:538
 #: src/ui/gui/psppire-var-store.c:735
 #, c-format
index 18743805d207ce376a33f5e333cf192be6feeebd..34ae5e4078ec78079cbbab1c4681d4f92aa04703 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
-"POT-Creation-Date: 2006-07-29 13:49+0800\n"
+"POT-Creation-Date: 2006-07-30 14:13+0800\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -4217,11 +4217,11 @@ msgstr ""
 msgid "All Files"
 msgstr ""
 
 msgid "All Files"
 msgstr ""
 
-#: src/ui/gui/menu-actions.c:272
+#: src/ui/gui/menu-actions.c:273
 msgid "Save Data As"
 msgstr ""
 
 msgid "Save Data As"
 msgstr ""
 
-#: src/ui/gui/menu-actions.c:568
+#: src/ui/gui/menu-actions.c:582
 msgid "Font Selection"
 msgstr ""
 
 msgid "Font Selection"
 msgstr ""
 
@@ -4249,11 +4249,11 @@ msgstr ""
 msgid "Sorry. The help system hasn't yet been implemented."
 msgstr ""
 
 msgid "Sorry. The help system hasn't yet been implemented."
 msgstr ""
 
-#: src/ui/gui/psppire-data-store.c:699
+#: src/ui/gui/psppire-data-store.c:731
 msgid "var"
 msgstr ""
 
 msgid "var"
 msgstr ""
 
-#: src/ui/gui/psppire-data-store.c:780 src/ui/gui/psppire-var-store.c:518
+#: src/ui/gui/psppire-data-store.c:812 src/ui/gui/psppire-var-store.c:518
 #: src/ui/gui/psppire-var-store.c:528 src/ui/gui/psppire-var-store.c:538
 #: src/ui/gui/psppire-var-store.c:735
 #, c-format
 #: src/ui/gui/psppire-var-store.c:528 src/ui/gui/psppire-var-store.c:538
 #: src/ui/gui/psppire-var-store.c:735
 #, c-format
index 6256855b4816ff9540dbe944b0f087cb36fa7988..37edbb975d21db066149ef486234f0ff3750f47e 100644 (file)
@@ -1,6 +1,6 @@
-* Blank cell reference when deselecting cells. (Eg New command).
+* Crashes when reducing the size of string variables.
 
 
-* Strip leading/trailing whitespace on data in cells.
+* Blank cell reference when deselecting cells. (Eg New command).
 
 * Cell Ref Entry populate/depopulate.
 
 
 * Cell Ref Entry populate/depopulate.
 
@@ -8,11 +8,11 @@
 
 * Goto Variable.
 
 
 * Goto Variable.
 
-* Widen columns in var sheet as necessary to accomodate non-english translations.
-
 Wishlist
 ========
 
 Wishlist
 ========
 
+* Widen columns in var sheet as necessary to accomodate non-english translations.
+
 * Cut/Paste Buffer.  Cut and paste: a) Between psppire instances. b) From other applications.
 
 * In datasheet, add tooltips to column buttons, so that hovering over a column button displays 
 * Cut/Paste Buffer.  Cut and paste: a) Between psppire instances. b) From other applications.
 
 * In datasheet, add tooltips to column buttons, so that hovering over a column button displays 
index 29e0309c9ea4eacff07a1dd43ae7b92f2a0fb84a..de4a357bf3d5c60991df18e2a29a91eebbda5f4c 100644 (file)
 
 extern GladeXML *xml;
 
 
 extern GladeXML *xml;
 
-
 static gboolean 
 traverse_callback (GtkSheet * sheet, 
 static gboolean 
 traverse_callback (GtkSheet * sheet, 
-                       gint row, gint col, 
-                       gint *new_row, gint *new_column
-                       )
+                  gint row, gint col, 
+                  gint *new_row, gint *new_column
+                  )
 {
 {
+  gint case_count;
   PsppireDataStore *data_store = PSPPIRE_DATA_STORE(gtk_sheet_get_model(sheet));
   PsppireDataStore *data_store = PSPPIRE_DATA_STORE(gtk_sheet_get_model(sheet));
-
   const gint n_vars = psppire_dict_get_var_cnt(data_store->dict);
 
   if ( *new_column >= n_vars ) 
     return FALSE;
 
   const gint n_vars = psppire_dict_get_var_cnt(data_store->dict);
 
   if ( *new_column >= n_vars ) 
     return FALSE;
 
+  case_count = psppire_case_file_get_case_count(data_store->case_file);
+
+  if ( *new_row >= case_count )
+    {
+      gint i;
+
+      for ( i = case_count ; i <= *new_row; ++i ) 
+       psppire_data_store_insert_new_case (data_store, i);
+
+      return TRUE;
+    }
+
   return TRUE;
 }
 
   return TRUE;
 }
 
index b027b5a6aee9f234e4d0552355eaf989024c02b0..fb62f8a52cf81774c699a2dfba96e0235144a615 100644 (file)
@@ -364,6 +364,8 @@ on_clear_activate                    (GtkMenuItem     *menuitem,
 
   switch (page) 
     {
 
   switch (page) 
     {
+    case PAGE_VAR_SHEET:
+           break;
     case PAGE_DATA_SHEET:
       {
        GtkSheet *data_sheet = GTK_SHEET(get_widget_assert(xml, "data_sheet"));
     case PAGE_DATA_SHEET:
       {
        GtkSheet *data_sheet = GTK_SHEET(get_widget_assert(xml, "data_sheet"));
@@ -409,87 +411,6 @@ on_clear_activate                    (GtkMenuItem     *menuitem,
 
 }
 
 
 }
 
-void
-on_insert1_activate                    (GtkMenuItem     *menuitem,
-                                        gpointer         user_data)
-{
-  GtkNotebook *notebook = GTK_NOTEBOOK(get_widget_assert(xml, "notebook1"));
-  gint page = -1;
-
-  page = gtk_notebook_get_current_page(notebook);
-
-  switch (page) 
-    {
-    case PAGE_DATA_SHEET:
-#if 0
-      {
-       GtkSheet *data_sheet = GTK_SHEET(get_widget_assert(xml, "data_sheet"));
-       PsppireDataStore *data_store = 
-         PSPPIRE_DATA_STORE(gtk_sheet_get_model(data_sheet));
-
-       psppire_case_array_insert_case(data_store->cases, 
-                                      data_sheet->range.row0, 
-                                      blank_case, the_dictionary);
-      }
-      break;
-#endif
-    case PAGE_VAR_SHEET:
-      {
-       GtkSheet *var_sheet = 
-         GTK_SHEET(get_widget_assert(xml, "variable_sheet"));
-
-       PsppireVarStore *var_store = 
-         PSPPIRE_VAR_STORE(gtk_sheet_get_model(var_sheet));
-
-       psppire_dict_insert_variable(var_store->dict, var_sheet->range.row0, 0);
-      }
-      break;
-    }
-}
-
-#if 0
-void
-on_delete1_activate                    (GtkMenuItem     *menuitem,
-                                        gpointer         user_data)
-{
-  gint page = -1;
-  GtkWidget *notebook = get_widget_assert(xml, "notebook1");
-
-  page = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook));
-  switch ( page) 
-    {
-#if 0
-    case PAGE_DATA_SHEET:
-      {
-       GtkSheet *data_sheet = GTK_SHEET(get_widget_assert(xml, "data_sheet"));
-       PsppireDataStore *data_store = 
-         PSPPIRE_DATA_STORE(gtk_sheet_get_model(data_sheet));
-
-       psppire_case_array_delete_cases(data_store->cases, 
-                                   data_sheet->range.row0, 
-                                   1 + data_sheet->range.rowi 
-                                   - data_sheet->range.row0  );
-      }
-      break;
-#endif
-    case PAGE_VAR_SHEET:
-      {
-       GtkSheet *var_sheet = 
-         GTK_SHEET(get_widget_assert(xml, "variable_sheet"));
-
-       PsppireVarStore *var_store = 
-         PSPPIRE_VAR_STORE(gtk_sheet_get_model(var_sheet));
-
-       psppire_dict_delete_variables(var_store->dict, 
-                                  var_sheet->range.row0,
-                                  1 + var_sheet->range.rowi 
-                                  - var_sheet->range.row0  );
-      }
-      break;
-    }
-}
-#endif
-
 void
 on_about1_activate(GtkMenuItem     *menuitem,
                   gpointer         user_data)
 void
 on_about1_activate(GtkMenuItem     *menuitem,
                   gpointer         user_data)
@@ -769,7 +690,7 @@ insert_case(void)
 
   gtk_sheet_get_active_cell(data_sheet, &row, &col);
 
 
   gtk_sheet_get_active_cell(data_sheet, &row, &col);
 
-  psppire_case_file_insert_case(data_store->case_file, row);
+  psppire_data_store_insert_new_case(data_store, row);
 }
 
 void
 }
 
 void
index 5ad96ad94b8e85dc9adf86f2827cd0cf8ee7c6dc..b16fd7cababb20f388c0bb73c0ccc1b8402183df 100644 (file)
@@ -156,7 +156,7 @@ psppire_case_file_new (gint val_cnt)
 {
   PsppireCaseFile *cf = g_object_new (G_TYPE_PSPPIRE_CASE_FILE, NULL);
 
 {
   PsppireCaseFile *cf = g_object_new (G_TYPE_PSPPIRE_CASE_FILE, NULL);
 
-  cf->flexifile = flexifile_create(val_cnt);
+  cf->flexifile = flexifile_create (val_cnt);
 
   return cf;
 }
 
   return cf;
 }
@@ -177,23 +177,19 @@ psppire_case_file_delete_cases(PsppireCaseFile *cf, gint n_cases, gint first)
   return result;
 }
 
   return result;
 }
 
-/* Insert a blank case to the case file */
+/* Insert case CC into the case file before POSN */
 gboolean
 psppire_case_file_insert_case(PsppireCaseFile *cf, 
 gboolean
 psppire_case_file_insert_case(PsppireCaseFile *cf, 
-                              gint posn)
+                             struct ccase *cc,
+                             gint posn)
 {
   bool result ;
 {
   bool result ;
-  struct ccase cc;
 
   g_return_val_if_fail(cf, FALSE);
   g_return_val_if_fail(cf->flexifile, FALSE);
 
 
   g_return_val_if_fail(cf, FALSE);
   g_return_val_if_fail(cf->flexifile, FALSE);
 
-  case_create (&cc, casefile_get_value_cnt(cf->flexifile));
-
-  result = flexifile_insert_case(FLEXIFILE(cf->flexifile), &cc, posn);
+  result = flexifile_insert_case(FLEXIFILE(cf->flexifile), cc, posn);
   
   
-  case_destroy (&cc);
-
   if ( result ) 
     g_signal_emit(cf, signal[CASE_INSERTED], 0, posn);
   else
   if ( result ) 
     g_signal_emit(cf, signal[CASE_INSERTED], 0, posn);
   else
@@ -202,6 +198,7 @@ psppire_case_file_insert_case(PsppireCaseFile *cf,
   return result;
 }
 
   return result;
 }
 
+
 /* Append a case to the case file */
 gboolean
 psppire_case_file_append_case(PsppireCaseFile *cf, 
 /* Append a case to the case file */
 gboolean
 psppire_case_file_append_case(PsppireCaseFile *cf, 
@@ -354,8 +351,8 @@ psppire_case_file_sort(PsppireCaseFile *cf, const struct sort_criteria *sc)
 /* Resize the cases in the casefile, by inserting N_VALUES into every 
    one of them. */
 gboolean 
 /* Resize the cases in the casefile, by inserting N_VALUES into every 
    one of them. */
 gboolean 
-psppire_case_file_insert_values(PsppireCaseFile *cf, 
-                               gint n_values, gint before)
+psppire_case_file_insert_values (PsppireCaseFile *cf, 
+                                gint n_values, gint before)
 {
   g_return_val_if_fail(cf, FALSE);
 
 {
   g_return_val_if_fail(cf, FALSE);
 
@@ -365,21 +362,18 @@ psppire_case_file_insert_values(PsppireCaseFile *cf,
       return TRUE;
     }
 
       return TRUE;
     }
 
-  return flexifile_resize(FLEXIFILE(cf->flexifile), n_values, before);
+  return flexifile_resize (FLEXIFILE(cf->flexifile), n_values, before);
 }
 
 }
 
-
-
-
 /* Fills C with the CASENUMth case.
    Returns true on success, false otherwise.
  */
 gboolean
 /* Fills C with the CASENUMth case.
    Returns true on success, false otherwise.
  */
 gboolean
-psppire_case_file_get_case(const PsppireCaseFile *cf, gint casenum, 
+psppire_case_file_get_case (const PsppireCaseFile *cf, gint casenum, 
                           struct ccase *c)
 {
                           struct ccase *c)
 {
-  g_return_val_if_fail(cf, FALSE);
-  g_return_val_if_fail(cf->flexifile, FALSE);
+  g_return_val_if_fail (cf, FALSE);
+  g_return_val_if_fail (cf->flexifile, FALSE);
 
 
-  return flexifile_get_case(FLEXIFILE(cf->flexifile), casenum, c);
+  return flexifile_get_case (FLEXIFILE(cf->flexifile), casenum, c);
 }
 }
index fbfa7d750154ab50717261f9f2655ccfdb973525..7961b3cb47ad22285efdeafba69529816f370de2 100644 (file)
@@ -71,6 +71,8 @@ PsppireCaseFile *psppire_case_file_new (gint var_cnt);
 gboolean psppire_case_file_append_case(PsppireCaseFile *cf, 
                                             struct ccase *c);
 
 gboolean psppire_case_file_append_case(PsppireCaseFile *cf, 
                                             struct ccase *c);
 
+gboolean psppire_case_file_insert_case(PsppireCaseFile *cf, struct ccase *c, gint row);
+
 gint psppire_case_file_get_case_count(const PsppireCaseFile *cf);
 
 
 gint psppire_case_file_get_case_count(const PsppireCaseFile *cf);
 
 
@@ -91,9 +93,6 @@ void psppire_case_file_clear(PsppireCaseFile *cf);
 gboolean psppire_case_file_delete_cases(PsppireCaseFile *cf, gint n_rows, 
                                        gint first);
 
 gboolean psppire_case_file_delete_cases(PsppireCaseFile *cf, gint n_rows, 
                                        gint first);
 
-gboolean psppire_case_file_insert_case(PsppireCaseFile *cf, gint row);
-
-
 gboolean psppire_case_file_insert_values(PsppireCaseFile *cf, gint n_values, gint before);
 
 struct sort_criteria;
 gboolean psppire_case_file_insert_values(PsppireCaseFile *cf, gint n_values, gint before);
 
 struct sort_criteria;
index 5fbfcb48c4c142df2fdb1b2dd1c96e9680c708f7..eeaf31d660548dd7922295a2dae1f25615babfb9 100644 (file)
@@ -327,9 +327,6 @@ dict_size_change_callback(GObject *obj,
 
   store  = PSPPIRE_DATA_STORE(data);
 
 
   store  = PSPPIRE_DATA_STORE(data);
 
-  /* 
-  if ( adjustment > 0 )
-  */
   psppire_case_file_insert_values (store->case_file, adjustment, posn);
 }
 
   psppire_case_file_insert_values (store->case_file, adjustment, posn);
 }
 
@@ -423,8 +420,43 @@ psppire_data_store_finalize (GObject *object)
 }
 
 
 }
 
 
+
+/* Insert a blank case before POSN */
+gboolean
+psppire_data_store_insert_new_case(PsppireDataStore *ds, gint posn)
+{
+  gboolean result;
+  gint val_cnt, v; 
+  struct ccase cc;
+  g_return_val_if_fail (ds, FALSE);
+
+
+  /* Opportunity for optimisation exists here when creating a blank case */
+  val_cnt = casefile_get_value_cnt(ds->case_file->flexifile) ;
+  
+  case_create (&cc, val_cnt);
+
+  memset ( case_data_rw (&cc, 0), 0, val_cnt * MAX_SHORT_STRING);
+
+  for (v = 0 ; v < psppire_dict_get_var_cnt (ds->dict) ; ++v) 
+    {
+      const struct PsppireVariable *pv = psppire_dict_get_variable(ds->dict, v);
+      if (ALPHA ==  psppire_variable_get_type(pv) ) 
+       continue;
+
+      case_data_rw (&cc, psppire_variable_get_fv (pv))->f = SYSMIS;
+    }
+
+  result = psppire_case_file_insert_case (ds->case_file, &cc, posn);
+
+  case_destroy (&cc);
+
+  return result;
+}
+
+
 static gchar *
 static gchar *
-psppire_data_store_get_string(const GSheetModel *model, gint row, gint column)
+psppire_data_store_get_string (const GSheetModel *model, gint row, gint column)
 {
   gint idx;
   char *text;
 {
   gint idx;
   char *text;
@@ -434,26 +466,26 @@ psppire_data_store_get_string(const GSheetModel *model, gint row, gint column)
   GString *s;
   PsppireDataStore *store = PSPPIRE_DATA_STORE(model);
 
   GString *s;
   PsppireDataStore *store = PSPPIRE_DATA_STORE(model);
 
-  g_return_val_if_fail(store->dict, NULL);
-  g_return_val_if_fail(store->case_file, NULL);
+  g_return_val_if_fail (store->dict, NULL);
+  g_return_val_if_fail (store->case_file, NULL);
 
 
-  if (column >= psppire_dict_get_var_cnt(store->dict))
+  if (column >= psppire_dict_get_var_cnt (store->dict))
     return NULL;
 
     return NULL;
 
-  if ( row >= psppire_case_file_get_case_count(store->case_file))
+  if ( row >= psppire_case_file_get_case_count (store->case_file))
     return NULL;
 
     return NULL;
 
-  pv = psppire_dict_get_variable(store->dict, column);
+  pv = psppire_dict_get_variable (store->dict, column);
 
 
-  idx = psppire_variable_get_fv(pv);
+  idx = psppire_variable_get_fv (pv);
 
 
-  v = psppire_case_file_get_value(store->case_file, row, idx);
+  v = psppire_case_file_get_value (store->case_file, row, idx);
 
   g_return_val_if_fail(v, NULL);
 
   if ( store->show_labels) 
     {
 
   g_return_val_if_fail(v, NULL);
 
   if ( store->show_labels) 
     {
-      const struct val_labs * vl = psppire_variable_get_value_labels(pv);
+      const struct val_labs * vl = psppire_variable_get_value_labels (pv);
 
       const gchar *label;
       if ( (label = val_labs_find(vl, *v)) )
 
       const gchar *label;
       if ( (label = val_labs_find(vl, *v)) )
@@ -462,29 +494,31 @@ psppire_data_store_get_string(const GSheetModel *model, gint row, gint column)
        }
     }
 
        }
     }
 
-  fp = psppire_variable_get_write_spec(pv);
+  fp = psppire_variable_get_write_spec (pv);
 
   s = g_string_sized_new (fp->w + 1);
 
   s = g_string_sized_new (fp->w + 1);
-  g_string_set_size(s, fp->w);
+  g_string_set_size (s, fp->w);
   
   
-  memset(s->str, 0, fp->w);
+  memset (s->str, 0, fp->w);
 
 
-  g_assert(fp->w == s->len);
+  g_assert (fp->w == s->len);
     
   /* Converts binary value V into printable form in the exactly
      FP->W character in buffer S according to format specification
      FP.  No null terminator is appended to the buffer.  */
   data_out (s->str, fp, v);
 
     
   /* Converts binary value V into printable form in the exactly
      FP->W character in buffer S according to format specification
      FP.  No null terminator is appended to the buffer.  */
   data_out (s->str, fp, v);
 
-  text = pspp_locale_to_utf8(s->str, fp->w, 0);
-  g_string_free(s, TRUE);
+  text = pspp_locale_to_utf8 (s->str, fp->w, 0);
+  g_string_free (s, TRUE);
+
+  g_strchomp (text);
 
   return text;
 }
 
 
 static gboolean 
 
   return text;
 }
 
 
 static gboolean 
-psppire_data_store_clear_datum(GSheetModel *model, 
+psppire_data_store_clear_datum (GSheetModel *model, 
                                          gint row, gint col)
 
 {
                                          gint row, gint col)
 
 {
index c16d158e23803e3b5ed21ca7b57ab9b4b17b31b0..0787f116c4511beac19b6cb28898c72a6fc64b05 100644 (file)
@@ -98,8 +98,11 @@ void psppire_data_store_clear(PsppireDataStore *data_store);
 
 struct file_handle;
 
 
 struct file_handle;
 
-void psppire_data_store_create_system_file(PsppireDataStore *store,
-                                  struct file_handle *handle);
+void psppire_data_store_create_system_file (PsppireDataStore *store,
+                                           struct file_handle *handle);
+
+gboolean psppire_data_store_insert_new_case (PsppireDataStore *ds, gint posn);
+
 
 
 #ifdef __cplusplus
 
 
 #ifdef __cplusplus