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"
-"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"
@@ -4218,11 +4218,11 @@ msgstr "Tragbardatein (*.por)"
 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"
 
-#: src/ui/gui/menu-actions.c:568
+#: src/ui/gui/menu-actions.c:582
 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!"
 
-#: src/ui/gui/psppire-data-store.c:699
+#: src/ui/gui/psppire-data-store.c:731
 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
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"
-"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"
@@ -4217,11 +4217,11 @@ msgstr ""
 msgid "All Files"
 msgstr ""
 
-#: src/ui/gui/menu-actions.c:272
+#: src/ui/gui/menu-actions.c:273
 msgid "Save Data As"
 msgstr ""
 
-#: src/ui/gui/menu-actions.c:568
+#: src/ui/gui/menu-actions.c:582
 msgid "Font Selection"
 msgstr ""
 
@@ -4249,11 +4249,11 @@ 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 ""
 
-#: 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
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.
 
@@ -8,11 +8,11 @@
 
 * Goto Variable.
 
-* Widen columns in var sheet as necessary to accomodate non-english translations.
-
 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 
index 29e0309c9ea4eacff07a1dd43ae7b92f2a0fb84a..de4a357bf3d5c60991df18e2a29a91eebbda5f4c 100644 (file)
 
 extern GladeXML *xml;
 
-
 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));
-
   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;
 }
 
index b027b5a6aee9f234e4d0552355eaf989024c02b0..fb62f8a52cf81774c699a2dfba96e0235144a615 100644 (file)
@@ -364,6 +364,8 @@ on_clear_activate                    (GtkMenuItem     *menuitem,
 
   switch (page) 
     {
+    case PAGE_VAR_SHEET:
+           break;
     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)
@@ -769,7 +690,7 @@ insert_case(void)
 
   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
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);
 
-  cf->flexifile = flexifile_create(val_cnt);
+  cf->flexifile = flexifile_create (val_cnt);
 
   return cf;
 }
@@ -177,23 +177,19 @@ psppire_case_file_delete_cases(PsppireCaseFile *cf, gint n_cases, gint first)
   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, 
-                              gint posn)
+                             struct ccase *cc,
+                             gint posn)
 {
   bool result ;
-  struct ccase cc;
 
   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
@@ -202,6 +198,7 @@ psppire_case_file_insert_case(PsppireCaseFile *cf,
   return result;
 }
 
+
 /* 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 
-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);
 
@@ -365,21 +362,18 @@ psppire_case_file_insert_values(PsppireCaseFile *cf,
       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
-psppire_case_file_get_case(const PsppireCaseFile *cf, gint casenum, 
+psppire_case_file_get_case (const PsppireCaseFile *cf, gint casenum, 
                           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_insert_case(PsppireCaseFile *cf, struct ccase *c, gint row);
+
 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_insert_case(PsppireCaseFile *cf, gint row);
-
-
 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);
 
-  /* 
-  if ( adjustment > 0 )
-  */
   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 *
-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;
@@ -434,26 +466,26 @@ psppire_data_store_get_string(const GSheetModel *model, gint row, gint column)
   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;
 
-  if ( row >= psppire_case_file_get_case_count(store->case_file))
+  if ( row >= psppire_case_file_get_case_count (store->case_file))
     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) 
     {
-      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)) )
@@ -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);
-  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);
 
-  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 
-psppire_data_store_clear_datum(GSheetModel *model, 
+psppire_data_store_clear_datum (GSheetModel *model, 
                                          gint row, gint col)
 
 {
index c16d158e23803e3b5ed21ca7b57ab9b4b17b31b0..0787f116c4511beac19b6cb28898c72a6fc64b05 100644 (file)
@@ -98,8 +98,11 @@ void psppire_data_store_clear(PsppireDataStore *data_store);
 
 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