Fixed procedure execution in GUI.
[pspp-builds.git] / src / ui / gui / psppire-data-store.c
index 9e973ce349b21d3db4e514ed7a4c7ec3d576cd08..c7d94cee81dc66270f74ea61176da0b7f96cdb3e 100644 (file)
@@ -25,8 +25,8 @@
 #define _(msgid) gettext (msgid)
 #define N_(msgid) msgid
 
-#include <data/casefile.h>
-#include <data/case.h>
+#include <data/casewriter.h>
+#include <data/datasheet.h>
 #include <data/data-out.h>
 #include <data/variable.h>
 
@@ -77,7 +77,7 @@ static GObjectClass *parent_class = NULL;
 enum  {FONT_CHANGED,
        n_SIGNALS};
 
-static guint signal[n_SIGNALS];
+static guint signal[n_SIGNALS];
 
 
 inline GType
@@ -152,9 +152,9 @@ psppire_data_store_class_init (PsppireDataStoreClass *class)
 
   object_class->finalize = psppire_data_store_finalize;
 
-  signal[FONT_CHANGED] =
+  signal[FONT_CHANGED] =
     g_signal_new ("font_changed",
-                 G_TYPE_FROM_CLASS(class),
+                 G_TYPE_FROM_CLASS (class),
                  G_SIGNAL_RUN_FIRST,
                  0,
                  NULL, NULL,
@@ -168,7 +168,7 @@ psppire_data_store_class_init (PsppireDataStoreClass *class)
 static gint
 psppire_data_store_get_var_count (const GSheetModel *model)
 {
-  const PsppireDataStore *store = PSPPIRE_DATA_STORE(model);
+  const PsppireDataStore *store = PSPPIRE_DATA_STORE (model);
 
   return psppire_dict_get_var_cnt (store->dict);
 }
@@ -176,7 +176,7 @@ psppire_data_store_get_var_count (const GSheetModel *model)
 static gint
 psppire_data_store_get_case_count (const GSheetModel *model)
 {
-  const PsppireDataStore *store = PSPPIRE_DATA_STORE(model);
+  const PsppireDataStore *store = PSPPIRE_DATA_STORE (model);
 
   return psppire_case_file_get_case_count (store->case_file);
 }
@@ -194,7 +194,7 @@ const PangoFontDescription *
 psppire_data_store_get_font_desc (const GSheetModel *model,
                              gint row, gint column)
 {
-  PsppireDataStore *store = PSPPIRE_DATA_STORE(model);
+  PsppireDataStore *store = PSPPIRE_DATA_STORE (model);
 
   return store->font_desc;
 }
@@ -231,11 +231,11 @@ delete_cases_callback (GtkWidget *w, gint first, gint n_cases, gpointer data)
 
   g_return_if_fail (data);
 
-  store  = PSPPIRE_DATA_STORE(data);
+  store  = PSPPIRE_DATA_STORE (data);
 
   g_assert (first >= 0);
 
-  g_sheet_model_rows_deleted (G_SHEET_MODEL(store), first, n_cases);
+  g_sheet_model_rows_deleted (G_SHEET_MODEL (store), first, n_cases);
 }
 
 
@@ -246,14 +246,14 @@ insert_case_callback (GtkWidget *w, gint casenum, gpointer data)
 
   g_return_if_fail (data);
 
-  store  = PSPPIRE_DATA_STORE(data);
+  store  = PSPPIRE_DATA_STORE (data);
 
-  g_sheet_model_range_changed (G_SHEET_MODEL(store),
+  g_sheet_model_range_changed (G_SHEET_MODEL (store),
                               casenum, -1,
                               psppire_case_file_get_case_count (store->case_file),
                               -1);
 
-  g_sheet_model_rows_inserted (G_SHEET_MODEL(store), casenum, 1);
+  g_sheet_model_rows_inserted (G_SHEET_MODEL (store), casenum, 1);
 }
 
 
@@ -263,9 +263,9 @@ changed_case_callback (GtkWidget *w, gint casenum, gpointer data)
   PsppireDataStore *store  ;
   g_return_if_fail (data);
 
-  store  = PSPPIRE_DATA_STORE(data);
+  store  = PSPPIRE_DATA_STORE (data);
 
-  g_sheet_model_range_changed (G_SHEET_MODEL(store),
+  g_sheet_model_range_changed (G_SHEET_MODEL (store),
                                 casenum, -1,
                                 casenum, -1);
 }
@@ -278,14 +278,33 @@ delete_variables_callback (GObject *obj, gint var_num, gint n_vars, gpointer dat
 
   g_return_if_fail (data);
 
-  store  = PSPPIRE_DATA_STORE(data);
+  store  = PSPPIRE_DATA_STORE (data);
 
-  g_sheet_model_columns_deleted (G_SHEET_MODEL(store), var_num, n_vars);
+  g_sheet_model_columns_deleted (G_SHEET_MODEL (store), var_num, n_vars);
 
-  g_sheet_column_columns_changed (G_SHEET_COLUMN(store),
+  g_sheet_column_columns_changed (G_SHEET_COLUMN (store),
                                   var_num, -1);
 }
 
+
+static void
+variable_changed_callback (GObject *obj, gint var_num, gpointer data)
+{
+  PsppireDataStore *store;
+
+  g_return_if_fail (data);
+
+  store  = PSPPIRE_DATA_STORE (data);
+
+  g_sheet_column_columns_changed (G_SHEET_COLUMN (store),
+                                 var_num, 1);
+
+
+  g_sheet_model_range_changed (G_SHEET_MODEL (store),
+                              -1, var_num,
+                              -1, var_num);
+}
+
 static void
 insert_variable_callback (GObject *obj, gint var_num, gpointer data)
 {
@@ -294,12 +313,14 @@ insert_variable_callback (GObject *obj, gint var_num, gpointer data)
 
   g_return_if_fail (data);
 
-  store  = PSPPIRE_DATA_STORE(data);
+  store  = PSPPIRE_DATA_STORE (data);
 
   if ( var_num > 0 )
     {
-      struct variable *variable;
-      variable = psppire_dict_get_variable (store->dict, var_num);
+      struct variable *variable =
+       psppire_dict_get_variable (store->dict, var_num);
+
+      g_assert (variable != NULL);
 
       posn = var_get_case_index (variable);
     }
@@ -310,10 +331,10 @@ insert_variable_callback (GObject *obj, gint var_num, gpointer data)
 
   psppire_case_file_insert_values (store->case_file, 1, posn);
 
-  g_sheet_column_columns_changed (G_SHEET_COLUMN(store),
+  g_sheet_column_columns_changed (G_SHEET_COLUMN (store),
                                  var_num, 1);
 
-  g_sheet_model_columns_inserted (G_SHEET_MODEL(store), var_num, 1);
+  g_sheet_model_columns_inserted (G_SHEET_MODEL (store), var_num, 1);
 }
 
 
@@ -325,7 +346,7 @@ dict_size_change_callback (GObject *obj,
 
   g_return_if_fail (data);
 
-  store  = PSPPIRE_DATA_STORE(data);
+  store  = PSPPIRE_DATA_STORE (data);
 
   psppire_case_file_insert_values (store->case_file, adjustment, posn);
 }
@@ -348,64 +369,71 @@ psppire_data_store_new (PsppireDict *dict)
 
   psppire_data_store_set_dictionary (retval, dict);
 
-
   return retval;
 }
 
 
-
-/**
- * psppire_data_store_replace_set_dictionary:
- * @data_store: The variable store
- * @dict: The dictionary to set
- *
- * If a dictionary is already associated with the data-store, then it will be
- * destroyed.
- **/
 void
-psppire_data_store_set_dictionary (PsppireDataStore *data_store, PsppireDict *dict)
+psppire_data_store_set_case_file (PsppireDataStore *data_store,
+                                 PsppireCaseFile *cf)
 {
-  gint var_cnt = psppire_dict_get_next_value_idx (dict);
-
-  data_store->dict = dict;
-
   if ( data_store->case_file)
     {
       g_object_unref (data_store->case_file);
-      data_store->case_file = 0;
     }
 
-  data_store->case_file = psppire_case_file_new (var_cnt);
+  data_store->case_file = cf;
 
   g_signal_connect (data_store->case_file, "cases-deleted",
-                  G_CALLBACK(delete_cases_callback),
+                  G_CALLBACK (delete_cases_callback),
                   data_store);
 
   g_signal_connect (data_store->case_file, "case-inserted",
-                  G_CALLBACK(insert_case_callback),
+                  G_CALLBACK (insert_case_callback),
                   data_store);
 
 
   g_signal_connect (data_store->case_file, "case-changed",
-                  G_CALLBACK(changed_case_callback),
+                  G_CALLBACK (changed_case_callback),
                   data_store);
+}
+
+
+
+/**
+ * psppire_data_store_replace_set_dictionary:
+ * @data_store: The variable store
+ * @dict: The dictionary to set
+ *
+ * If a dictionary is already associated with the data-store, then it will be
+ * destroyed.
+ **/
+void
+psppire_data_store_set_dictionary (PsppireDataStore *data_store, PsppireDict *dict)
+{
+  data_store->dict = dict;
 
   g_signal_connect (dict, "variable-inserted",
-                  G_CALLBACK(insert_variable_callback),
+                  G_CALLBACK (insert_variable_callback),
                   data_store);
 
   g_signal_connect (dict, "variables-deleted",
-                  G_CALLBACK(delete_variables_callback),
+                  G_CALLBACK (delete_variables_callback),
+                  data_store);
+
+  g_signal_connect (dict, "variable-changed",
+                  G_CALLBACK (variable_changed_callback),
                   data_store);
 
+
   g_signal_connect (dict, "dict-size-changed",
-                   G_CALLBACK(dict_size_change_callback),
+                   G_CALLBACK (dict_size_change_callback),
                    data_store);
 
   /* The entire model has changed */
-  g_sheet_model_range_changed (G_SHEET_MODEL(data_store), -1, -1, -1, -1);
+  g_sheet_model_range_changed (G_SHEET_MODEL (data_store), -1, -1, -1, -1);
 
-  g_sheet_column_columns_changed (G_SHEET_COLUMN(data_store), 0, -1);
+  g_sheet_column_columns_changed (G_SHEET_COLUMN (data_store), 0, -1);
 }
 
 static void
@@ -429,7 +457,7 @@ psppire_data_store_insert_new_case (PsppireDataStore *ds, gint posn)
 
 
   /* Opportunity for optimisation exists here when creating a blank case */
-  val_cnt = casefile_get_value_cnt (ds->case_file->flexifile) ;
+  val_cnt = datasheet_get_column_cnt (ds->case_file->datasheet) ;
 
   case_create (&cc, val_cnt);
 
@@ -459,9 +487,9 @@ psppire_data_store_get_string (const GSheetModel *model, gint row, gint column)
   char *text;
   const struct fmt_spec *fp ;
   const struct variable *pv ;
-  const union value *v ;
+  union value *v ;
   GString *s;
-  PsppireDataStore *store = PSPPIRE_DATA_STORE(model);
+  PsppireDataStore *store = PSPPIRE_DATA_STORE (model);
 
   g_return_val_if_fail (store->dict, NULL);
   g_return_val_if_fail (store->case_file, NULL);
@@ -474,21 +502,25 @@ psppire_data_store_get_string (const GSheetModel *model, gint row, gint column)
 
   pv = psppire_dict_get_variable (store->dict, column);
 
+  g_assert (pv);
+
   idx = var_get_case_index (pv);
 
-  v = psppire_case_file_get_value (store->case_file, row, idx);
+  g_assert (idx >= 0);
+
+  v = psppire_case_file_get_value (store->case_file, row, idx, NULL,
+                                   var_get_width (pv));
 
   g_return_val_if_fail (v, NULL);
 
   if ( store->show_labels)
     {
-      const struct val_labs * vl = var_get_value_labels (pv);
-
-      const gchar *label;
-      if ( (label = val_labs_find (vl, *v)) )
-       {
+      const gchar *label = var_lookup_value_label (pv, v);
+      if (label)
+        {
+          free (v);
          return pspp_locale_to_utf8 (label, -1, 0);
-       }
+        }
     }
 
   fp = var_get_write_format (pv);
@@ -510,6 +542,7 @@ psppire_data_store_get_string (const GSheetModel *model, gint row, gint column)
 
   g_strchomp (text);
 
+  free (v);
   return text;
 }
 
@@ -519,7 +552,7 @@ psppire_data_store_clear_datum (GSheetModel *model,
                                          gint row, gint col)
 
 {
-  PsppireDataStore *store = PSPPIRE_DATA_STORE(model);
+  PsppireDataStore *store = PSPPIRE_DATA_STORE (model);
 
   union value v;
   const struct variable *pv = psppire_dict_get_variable (store->dict, col);
@@ -546,7 +579,7 @@ static gboolean
 psppire_data_store_set_string (GSheetModel *model,
                          const gchar *text, gint row, gint col)
 {
-  PsppireDataStore *store = PSPPIRE_DATA_STORE(model);
+  PsppireDataStore *store = PSPPIRE_DATA_STORE (model);
 
   const struct variable *pv = psppire_dict_get_variable (store->dict, col);
   g_return_val_if_fail (pv, FALSE);
@@ -585,10 +618,10 @@ psppire_data_store_set_font (PsppireDataStore *store,
 #if 0
   store->width_of_m = calc_m_width (fd);
 #endif
-  g_signal_emit (store, signal[FONT_CHANGED], 0);
+  g_signal_emit (store, signal[FONT_CHANGED], 0);
 
 
-  g_sheet_model_range_changed (G_SHEET_MODEL(store),
+  g_sheet_model_range_changed (G_SHEET_MODEL (store),
                                 -1, -1, -1, -1);
 }
 
@@ -601,7 +634,7 @@ psppire_data_store_show_labels (PsppireDataStore *store, gboolean show_labels)
 
   store->show_labels = show_labels;
 
-  g_sheet_model_range_changed (G_SHEET_MODEL(store),
+  g_sheet_model_range_changed (G_SHEET_MODEL (store),
                                 -1, -1, -1, -1);
 }
 
@@ -620,7 +653,7 @@ psppire_data_store_create_system_file (PsppireDataStore *store,
     3 /* version */
   };
 
-  struct sfm_writer *writer ;
+  struct casewriter *writer;
 
   g_assert (handle);
 
@@ -630,20 +663,15 @@ psppire_data_store_create_system_file (PsppireDataStore *store,
     return;
 
 
-  var_cnt = psppire_data_store_get_var_count (G_SHEET_MODEL(store));
+  var_cnt = psppire_data_store_get_var_count (G_SHEET_MODEL (store));
 
   for (i = 0 ; i < psppire_case_file_get_case_count (store->case_file); ++i )
     {
       struct ccase c;
-
-      case_create (&c, var_cnt);
       psppire_case_file_get_case (store->case_file, i, &c);
-      sfm_write_case (writer, &c);
-
-      case_destroy (&c);
+      casewriter_write (writer, &c);
     }
-
-  sfm_close_writer (writer);
+  casewriter_destroy (writer);
 }
 
 
@@ -658,15 +686,27 @@ psppire_data_store_clear (PsppireDataStore *data_store)
 
 
 
+/* Return a casereader made from this datastore */
+struct casereader *
+psppire_data_store_get_reader (PsppireDataStore *ds)
+{
+  struct casereader *reader ;
+
+  reader = psppire_case_file_make_reader (ds->case_file);
+
+  return reader;
+}
+
+
 
 /* Column related funcs */
 
 static gint
 geometry_get_column_count (const GSheetColumn *geom)
 {
-  PsppireDataStore *ds = PSPPIRE_DATA_STORE(geom);
+  PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
 
-  return MAX(MIN_COLUMNS, psppire_dict_get_var_cnt (ds->dict));
+  return MAX (MIN_COLUMNS, psppire_dict_get_var_cnt (ds->dict));
 }
 
 
@@ -675,7 +715,7 @@ static gint
 geometry_get_width (const GSheetColumn *geom, gint unit)
 {
   const struct variable *pv ;
-  PsppireDataStore *ds = PSPPIRE_DATA_STORE(geom);
+  PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
 
   if ( unit >= psppire_dict_get_var_cnt (ds->dict) )
     return ds->width_of_m * 8 ;
@@ -691,7 +731,7 @@ geometry_get_width (const GSheetColumn *geom, gint unit)
 static void
 geometry_set_width (GSheetColumn *geom, gint unit, gint width)
 {
-  PsppireDataStore *ds = PSPPIRE_DATA_STORE(geom);
+  PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
 
   struct variable *pv = psppire_dict_get_variable (ds->dict, unit);
 
@@ -703,7 +743,7 @@ geometry_set_width (GSheetColumn *geom, gint unit, gint width)
 static GtkJustification
 geometry_get_justification (const GSheetColumn *geom, gint unit)
 {
-  PsppireDataStore *ds = PSPPIRE_DATA_STORE(geom);
+  PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
   const struct variable *pv ;
 
 
@@ -725,7 +765,7 @@ geometry_get_column_button_label (const GSheetColumn *geom, gint unit)
 {
   gchar *text;
   struct variable *pv ;
-  PsppireDataStore *ds = PSPPIRE_DATA_STORE(geom);
+  PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
 
   if ( unit >= psppire_dict_get_var_cnt (ds->dict) )
     return g_locale_to_utf8 (null_var_name, -1, 0, 0, 0);
@@ -741,7 +781,7 @@ geometry_get_column_button_label (const GSheetColumn *geom, gint unit)
 static gboolean
 geometry_get_sensitivity (const GSheetColumn *geom, gint unit)
 {
-  PsppireDataStore *ds = PSPPIRE_DATA_STORE(geom);
+  PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
 
   return (unit < psppire_dict_get_var_cnt (ds->dict));
 }
@@ -765,7 +805,7 @@ psppire_data_store_sheet_column_init (GSheetColumnIface *iface)
 static gint
 geometry_get_row_count (const GSheetRow *geom, gpointer data)
 {
-  PsppireDataStore *ds = PSPPIRE_DATA_STORE(geom);
+  PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
 
   return TRAILING_ROWS + psppire_case_file_get_case_count (ds->case_file);
 }
@@ -781,7 +821,7 @@ geometry_get_height (const GSheetRow *geom, gint unit, gpointer data)
 static gboolean
 geometry_get_row_sensitivity (const GSheetRow *geom, gint unit, gpointer data)
 {
-  PsppireDataStore *ds = PSPPIRE_DATA_STORE(geom);
+  PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
 
 
   return (unit < psppire_case_file_get_case_count (ds->case_file));
@@ -793,7 +833,7 @@ geometry_get_row_button_label (const GSheetRow *geom, gint unit, gpointer data)
 {
   gchar *text;
   gchar *s;
-  PsppireDataStore *ds = PSPPIRE_DATA_STORE(geom);
+  PsppireDataStore *ds = PSPPIRE_DATA_STORE (geom);
 
   if ( unit >
        TRAILING_ROWS + psppire_case_file_get_case_count (ds->case_file))
@@ -821,3 +861,6 @@ psppire_data_store_sheet_row_init (GSheetRowIface *iface)
 
   iface->get_button_label = geometry_get_row_button_label;
 }
+
+
+