Add "dictionary" property to PsppireVarStore and use it.
authorJohn Darrington <john@darrington.wattle.id.au>
Sat, 25 Jul 2009 08:53:05 +0000 (10:53 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Sat, 25 Jul 2009 08:53:05 +0000 (10:53 +0200)
Instead of abusing the encapsulation of PsppireVarStore,
by accessing the internal dictionary member directly, add
a "dictionary" property.   This should also take care of the
reference counting of the dict, which wasn't working properly.

26 files changed:
src/ui/gui/comments-dialog.c
src/ui/gui/compute-dialog.c
src/ui/gui/crosstabs-dialog.c
src/ui/gui/descriptives-dialog.c
src/ui/gui/examine-dialog.c
src/ui/gui/find-dialog.c
src/ui/gui/frequencies-dialog.c
src/ui/gui/oneway-anova-dialog.c
src/ui/gui/psppire-data-editor.c
src/ui/gui/psppire-data-window.c
src/ui/gui/psppire-var-sheet.c
src/ui/gui/psppire-var-store.c
src/ui/gui/psppire-var-store.h
src/ui/gui/rank-dialog.c
src/ui/gui/recode-dialog.c
src/ui/gui/regression-dialog.c
src/ui/gui/reliability-dialog.c
src/ui/gui/sort-cases-dialog.c
src/ui/gui/split-file-dialog.c
src/ui/gui/t-test-independent-samples-dialog.c
src/ui/gui/t-test-one-sample.c
src/ui/gui/t-test-paired-samples.c
src/ui/gui/transpose-dialog.c
src/ui/gui/val-labs-dialog.c
src/ui/gui/variable-info-dialog.c
src/ui/gui/weight-cases-dialog.c

index 923953a1514bd34e0d223144ed4d4aaec27107ed..02d6d96c763d3064840fe72ebcd6d590aaa4acf7 100644 (file)
@@ -145,7 +145,7 @@ comments_dialog (GObject *o, gpointer data)
   }
 
   cd.xml = xml;
-  cd.dict = vs->dict;
+  g_object_get (vs, "dictionary", &cd.dict, NULL);
 
   g_signal_connect (buffer, "mark-set",
                    G_CALLBACK (set_column_number), label);
index e779fba6d7f7c847144d1d6254ad57354bb705e2..c09c7571936fa4e4ca493bd0647b2586629caa6d 100644 (file)
@@ -389,7 +389,7 @@ compute_dialog (GObject *o, gpointer data)
 
 
   g_object_get (de->data_editor, "var-store", &vs, NULL);
-  scd.dict = vs->dict;
+  g_object_get (vs, "dictionary", &scd.dict, NULL);
   scd.use_type = FALSE;
 
   g_signal_connect (expression, "toggled",
@@ -397,8 +397,8 @@ compute_dialog (GObject *o, gpointer data)
 
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
 
-  g_object_set (dict_view,
-               "dictionary", vs->dict,
+  
+  g_object_set (dict_view, "dictionary", scd.dict,
                "selection-mode", GTK_SELECTION_SINGLE,
                NULL);
 
index f5593586778cd3b3bf17bcdb6376564f44d08085..019d8c361dffe49c35b58b2f2799f701abd392b8 100644 (file)
@@ -389,6 +389,7 @@ crosstabs_dialog (GObject *o, gpointer data)
 
   GtkBuilder *xml = builder_new ("crosstabs.ui");
   PsppireVarStore *vs = NULL;
+  PsppireDict *dict = NULL;
 
   PsppireDataWindow *de = PSPPIRE_DATA_WINDOW (data);
 
@@ -422,10 +423,11 @@ crosstabs_dialog (GObject *o, gpointer data)
 
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
 
-  g_object_set (source, "dictionary", vs->dict, NULL);
+  g_object_get (vs, "dictionary", &dict, NULL);
+  g_object_set (source, "dictionary", dict, NULL);
 
-  set_dest_model (GTK_TREE_VIEW (dest_rows), vs->dict);
-  set_dest_model (GTK_TREE_VIEW (dest_cols), vs->dict);
+  set_dest_model (GTK_TREE_VIEW (dest_rows), dict);
+  set_dest_model (GTK_TREE_VIEW (dest_cols), dict);
 
   psppire_selector_set_subjects (PSPPIRE_SELECTOR (row_selector),
                                 source,
@@ -443,7 +445,7 @@ crosstabs_dialog (GObject *o, gpointer data)
 
   cd.row_vars = GTK_TREE_VIEW (dest_rows);
   cd.col_vars = GTK_TREE_VIEW (dest_cols);
-  cd.dict = vs->dict;
+  g_object_get (vs, "dictionary", &cd.dict, NULL);
   cd.format_dialog = get_widget_assert (xml, "format-dialog");
   cd.table_button = GTK_TOGGLE_BUTTON (get_widget_assert (xml, "print-tables"));
   cd.pivot_button = GTK_TOGGLE_BUTTON (get_widget_assert (xml, "pivot"));
index a867fe016d05131f0ff759e3536118c5ae60c855..a1e65ea7d7971a9fbb4643dac59ccfabad308628 100644 (file)
@@ -218,16 +218,18 @@ descriptives_dialog (GObject *o, gpointer data)
   GtkWidget *stats_treeview = get_widget_assert    (xml, "statistics");
 
   PsppireVarStore *vs = NULL;
+  PsppireDict *dict;
 
   g_object_get (de->data_editor, "var-store", &vs, NULL);
+  g_object_get (vs, "dictionary", &dict, NULL);
 
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
 
-  g_object_set (source, "dictionary", vs->dict,
-       "predicate", var_is_numeric, NULL);
 
-  set_dest_model (GTK_TREE_VIEW (dest), vs->dict);
+  g_object_set (source, "dictionary", dict,
+       "predicate", var_is_numeric, NULL);
 
+  set_dest_model (GTK_TREE_VIEW (dest), dict);
 
   psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector),
                                 source,
@@ -242,7 +244,9 @@ descriptives_dialog (GObject *o, gpointer data)
 
   scd.stat_vars = GTK_TREE_VIEW (dest);
   scd.stats = gtk_tree_view_get_model (GTK_TREE_VIEW (stats_treeview));
-  scd.dict = vs->dict;
+  
+  g_object_get (vs, "dictionary", &scd.dict, NULL);
+  
   scd.include_user_missing =
     GTK_TOGGLE_BUTTON (get_widget_assert (xml, "include_user_missing"));
   scd.exclude_missing_listwise =
index 13ef847a36f436b49c8cd062eda617d7f0563624..470c4dbbe37797ac23e23d3430741c56da0aa94b 100644 (file)
@@ -279,10 +279,10 @@ examine_dialog (GObject *o, gpointer data)
   gtk_window_set_transient_for (GTK_WINDOW (ex_d.stats_dialog), GTK_WINDOW (de));
   gtk_window_set_transient_for (GTK_WINDOW (ex_d.opts_dialog), GTK_WINDOW (de));
 
-  g_object_set (source, "dictionary", vs->dict, NULL);
+  g_object_get (vs, "dictionary", &ex_d.dict, NULL);
+  g_object_set (source, "dictionary", ex_d.dict, NULL);
 
-  set_dest_model (GTK_TREE_VIEW (ex_d.dep_list), vs->dict);
-  ex_d.dict = vs->dict;
+  set_dest_model (GTK_TREE_VIEW (ex_d.dep_list), ex_d.dict);
 
 
   psppire_selector_set_subjects (PSPPIRE_SELECTOR (dep_selector),
@@ -294,7 +294,7 @@ examine_dialog (GObject *o, gpointer data)
   psppire_selector_set_allow (PSPPIRE_SELECTOR (dep_selector),
                              numeric_only);
 
-  set_dest_model (GTK_TREE_VIEW (ex_d.fct_list), vs->dict);
+  set_dest_model (GTK_TREE_VIEW (ex_d.fct_list), ex_d.dict);
 
 
   psppire_selector_set_subjects (PSPPIRE_SELECTOR (fct_selector),
index 37d8ebade9b459026b53363ec346fc3644047872..11ec0603d4dfd98ee65954b1fed34af49feb4bc2 100644 (file)
@@ -219,7 +219,8 @@ find_dialog (GObject *o, gpointer data)
                "data-store", &ds,
                NULL);
 
-  fd.dict = vs->dict;
+  g_object_get (vs, "dictionary", &fd.dict, NULL);
+
   fd.data = ds->datasheet;
 
   fd.variable_entry        = get_widget_assert (fd.xml, "find-variable-entry");
index 9d9814f1a64045ba96fe967c85588e796869d803..8706f3a4e63ac105e0caee6a46e597cee048fc40 100644 (file)
@@ -333,9 +333,11 @@ frequencies_dialog (GObject *o, gpointer data)
 
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
 
-  g_object_set (source, "dictionary", vs->dict, NULL);
+  g_object_get (vs, "dictionary", &fd.dict, NULL);
+  g_object_set (source, "dictionary", fd.dict, NULL);
 
-  set_dest_model (GTK_TREE_VIEW (dest), vs->dict);
+
+  set_dest_model (GTK_TREE_VIEW (dest), fd.dict);
 
 
   psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector),
@@ -347,7 +349,6 @@ frequencies_dialog (GObject *o, gpointer data)
 
 
   fd.stat_vars = GTK_TREE_VIEW (dest);
-  fd.dict = vs->dict;
   fd.table_button = get_widget_assert (xml, "checkbutton1");
   fd.format_dialog = get_widget_assert (xml, "format-dialog");
   fd.maximum_cats = get_widget_assert (xml, "hbox5");
index a17a93977e612db7fa99b9eb58226fd9b91f72c8..1814dd6737562a1d922722141d9e6c6f3c2b0a63 100644 (file)
@@ -164,16 +164,16 @@ oneway_anova_dialog (GObject *o, gpointer data)
 
   g_object_get (de->data_editor, "var-store", &vs, NULL);
 
-  ow.dict = vs->dict;
+  g_object_get (vs, "dictionary", &ow.dict, NULL);
 
   ow.dialog =
     GTK_WINDOW (get_widget_assert (builder, "oneway-anova-dialog"));
 
   gtk_window_set_transient_for (ow.dialog, GTK_WINDOW (de));
 
-  g_object_set (dict_view, "dictionary", vs->dict, NULL);
+  g_object_set (dict_view, "dictionary", ow.dict, NULL);
 
-  set_dest_model (GTK_TREE_VIEW (ow.vars_treeview), vs->dict);
+  set_dest_model (GTK_TREE_VIEW (ow.vars_treeview), ow.dict);
 
 
   psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector1),
index 38250f7ea6959a76ab18e6f1db1458ffb8ed2e0f..aa511e937b69de617bcb4151a827dc971a53ce1e 100644 (file)
@@ -1203,9 +1203,13 @@ popup_variable_row_menu (PsppireSheet *sheet, gint row,
 
   PsppireVarStore *var_store =
     PSPPIRE_VAR_STORE (psppire_sheet_get_model (sheet));
+  
+  PsppireDict *dict;
+  const struct variable *v ;
 
-  const struct variable *v =
-    psppire_dict_get_variable (var_store->dict, row);
+  g_object_get (var_store, "dictionary", &dict, NULL);
+
+  v = psppire_dict_get_variable (dict, row);
 
   if ( v && event->button == 3)
     {
@@ -1357,6 +1361,7 @@ psppire_data_editor_delete_cases    (PsppireDataEditor *de)
 void
 psppire_data_editor_delete_variables (PsppireDataEditor *de)
 {
+  PsppireDict *dict = NULL;
   gint first, n;
 
   switch (gtk_notebook_get_current_page (GTK_NOTEBOOK (de)))
@@ -1374,7 +1379,9 @@ psppire_data_editor_delete_variables (PsppireDataEditor *de)
       break;
     }
 
-  psppire_dict_delete_variables (de->var_store->dict, first, n);
+  g_object_get (de->var_store, "dictionary", &dict, NULL);
+
+  psppire_dict_delete_variables (dict, first, n);
 
   psppire_sheet_unselect_range (PSPPIRE_SHEET (de->data_sheet[0]));
   psppire_sheet_unselect_range (PSPPIRE_SHEET (de->var_sheet));
index 185648bc0e9dd02c9905a8adf754090079dab2cf..ffa9482eb0f4b766c391e32ac7c3ecac9dca3087 100644 (file)
@@ -231,12 +231,14 @@ on_filter_change (GObject *o, gint filter_index, gpointer data)
   else
     {
       PsppireVarStore *vs = NULL;
+      PsppireDict *dict = NULL;
       struct variable *var ;
       gchar *text ;
 
       g_object_get (de->data_editor, "var-store", &vs, NULL);
+      g_object_get (vs, "dictionary", &dict, NULL);
 
-      var = psppire_dict_get_variable (vs->dict, filter_index);
+      var = psppire_dict_get_variable (dict, filter_index);
 
       text = g_strdup_printf (_("Filter by %s"), var_get_name (var));
 
@@ -302,11 +304,13 @@ on_weight_change (GObject *o, gint weight_index, gpointer data)
     {
       struct variable *var ;
       PsppireVarStore *vs = NULL;
+      PsppireDict *dict = NULL;
       gchar *text;
 
       g_object_get (de->data_editor, "var-store", &vs, NULL);
-
-      var = psppire_dict_get_variable (vs->dict, weight_index);
+      g_object_get (vs, "dictionary", &dict, NULL);
+      
+      var = psppire_dict_get_variable (dict, weight_index);
 
       text = g_strdup_printf (_("Weight by %s"), var_get_name (var));
 
@@ -1090,6 +1094,7 @@ static void
 psppire_data_window_init (PsppireDataWindow *de)
 {
   PsppireVarStore *vs;
+  PsppireDict *dict = NULL;
 
   GtkWidget *menubar;
   GtkWidget *hb ;
@@ -1145,15 +1150,17 @@ psppire_data_window_init (PsppireDataWindow *de)
 
   g_assert(vs); /* Traps a possible bug in w32 build */
 
-  g_signal_connect (vs->dict, "weight-changed",
+  g_object_get (vs, "dictionary", &dict, NULL);
+
+  g_signal_connect (dict, "weight-changed",
                    G_CALLBACK (on_weight_change),
                    de);
 
-  g_signal_connect (vs->dict, "filter-changed",
+  g_signal_connect (dict, "filter-changed",
                    G_CALLBACK (on_filter_change),
                    de);
 
-  g_signal_connect (vs->dict, "split-changed",
+  g_signal_connect (dict, "split-changed",
                    G_CALLBACK (on_split_change),
                    de);
 
index dfd62bb6737f1dbc78a605a6aaf62e2e7189a757..a4f082cca50bddb354b2559ce725896ba9c8c4fe 100644 (file)
@@ -260,10 +260,10 @@ traverse_cell_callback (PsppireSheet *sheet,
 
       const gchar *name = gtk_entry_get_text (entry);
 
-      if (! psppire_dict_check_name (var_store->dict, name, TRUE))
+      if (! psppire_dict_check_name (var_store->dictionary, name, TRUE))
        return TRUE;
 
-      psppire_dict_insert_variable (var_store->dict, existing_cell->row, name);
+      psppire_dict_insert_variable (var_store->dictionary, existing_cell->row, name);
 
       return FALSE;
     }
@@ -278,7 +278,7 @@ traverse_cell_callback (PsppireSheet *sheet,
     {
       gint i;
       for ( i = n_vars ; i <= new_cell->row; ++i )
-       psppire_dict_insert_variable (var_store->dict, i, NULL);
+       psppire_dict_insert_variable (var_store->dictionary, i, NULL);
     }
 
   return FALSE;
@@ -384,7 +384,7 @@ var_sheet_change_active_cell (PsppireVarSheet *vs,
        vs->missing_val_dialog->pv =
          psppire_var_store_get_var (var_store, row);
 
-       vs->missing_val_dialog->dict = var_store->dict;
+       vs->missing_val_dialog->dict = var_store->dictionary;
 
        g_signal_connect_swapped (customEntry,
                                  "clicked",
index 26c1ee4d34e6cd0d5b13b4f2f89c78e1d5b865c8..ece728127c142733b6986844146d22e06129b9fb 100644 (file)
 
 #include "var-display.h"
 
+static void
+var_change_callback (GtkWidget *w, gint n, gpointer data)
+{
+  PsppireSheetModel *model = PSPPIRE_SHEET_MODEL (data);
+
+  psppire_sheet_model_range_changed (model,
+                                n, 0, n, PSPPIRE_VAR_STORE_n_COLS);
+}
+
+
+static void
+var_delete_callback (GtkWidget *w, gint dict_idx, gint case_idx, gint val_cnt, gpointer data)
+{
+  PsppireSheetModel *model = PSPPIRE_SHEET_MODEL (data);
+
+  psppire_sheet_model_rows_deleted (model, dict_idx, 1);
+}
+
+
+
+static void
+var_insert_callback (GtkWidget *w, glong row, gpointer data)
+{
+  PsppireSheetModel *model = PSPPIRE_SHEET_MODEL (data);
+
+  psppire_sheet_model_rows_inserted (model, row, 1);
+}
+
+static void
+refresh (PsppireDict  *d, gpointer data)
+{
+  PsppireVarStore *vs = data;
+
+  psppire_sheet_model_range_changed (PSPPIRE_SHEET_MODEL (vs), -1, -1, -1, -1);
+}
+
 enum
   {
     PROP_0,
-    PSPPIRE_VAR_STORE_FORMAT_TYPE
+    PSPPIRE_VAR_STORE_FORMAT_TYPE,
+    PSPPIRE_VAR_STORE_DICT
   };
 
 static void         psppire_var_store_init            (PsppireVarStore      *var_store);
 static void         psppire_var_store_class_init      (PsppireVarStoreClass *class);
 static void         psppire_var_store_sheet_model_init (PsppireSheetModelIface *iface);
 static void         psppire_var_store_finalize        (GObject           *object);
+static void         psppire_var_store_dispose        (GObject           *object);
 
 
 static gchar *psppire_var_store_get_string (const PsppireSheetModel *sheet_model, glong row, glong column);
@@ -145,6 +183,27 @@ psppire_var_store_set_property (GObject      *object,
       self->format_type = g_value_get_enum (value);
       break;
 
+    case PSPPIRE_VAR_STORE_DICT:
+      if ( self->dictionary)
+       g_object_unref (self->dictionary);
+      self->dictionary = g_value_dup_object (value);
+      g_signal_connect (self->dictionary, "variable-changed", G_CALLBACK (var_change_callback),
+                       self);
+
+      g_signal_connect (self->dictionary, "variable-deleted", G_CALLBACK (var_delete_callback),
+                       self);
+
+      g_signal_connect (self->dictionary, "variable-inserted",
+                       G_CALLBACK (var_insert_callback), self);
+
+      g_signal_connect (self->dictionary, "backend-changed", G_CALLBACK (refresh),
+                       self);
+
+      /* The entire model has changed */
+      psppire_sheet_model_range_changed (PSPPIRE_SHEET_MODEL (self), -1, -1, -1, -1);
+
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
       break;
@@ -165,8 +224,12 @@ psppire_var_store_get_property (GObject      *object,
       g_value_set_enum (value, self->format_type);
       break;
 
+    case PSPPIRE_VAR_STORE_DICT:
+      g_value_take_object (value, self->dictionary);
+      break;
+
     default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
       break;
     }
 }
@@ -176,16 +239,18 @@ static void
 psppire_var_store_class_init (PsppireVarStoreClass *class)
 {
   GObjectClass *object_class;
-  GParamSpec *pspec;
+  GParamSpec *format_pspec;
+  GParamSpec *dict_pspec;
 
   parent_class = g_type_class_peek_parent (class);
   object_class = (GObjectClass*) class;
 
   object_class->finalize = psppire_var_store_finalize;
+  object_class->dispose = psppire_var_store_dispose;
   object_class->set_property = psppire_var_store_set_property;
   object_class->get_property = psppire_var_store_get_property;
 
-  pspec = g_param_spec_enum ("format-type",
+  format_pspec = g_param_spec_enum ("format-type",
                              "Variable format type",
                              ("Whether variables have input or output "
                               "formats"),
@@ -195,7 +260,17 @@ psppire_var_store_class_init (PsppireVarStoreClass *class)
 
   g_object_class_install_property (object_class,
                                    PSPPIRE_VAR_STORE_FORMAT_TYPE,
-                                   pspec);
+                                   format_pspec);
+
+  dict_pspec = g_param_spec_object ("dictionary",
+                                   "Dictionary",
+                                   "The PsppireDict represented by this var store",
+                                   PSPPIRE_TYPE_DICT,
+                                   G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
+                                   
+  g_object_class_install_property (object_class,
+                                   PSPPIRE_VAR_STORE_DICT,
+                                   dict_pspec);
 }
 
 #define DISABLED_COLOR "gray"
@@ -206,7 +281,7 @@ psppire_var_store_init (PsppireVarStore *var_store)
   if ( ! gdk_color_parse (DISABLED_COLOR, &var_store->disabled))
        g_critical ("Could not parse color \"%s\"", DISABLED_COLOR);
 
-  var_store->dict = 0;
+  var_store->dictionary = NULL;
   var_store->format_type = PSPPIRE_VAR_STORE_OUTPUT_FORMATS;
 }
 
@@ -254,7 +329,7 @@ psppire_var_store_item_editable (PsppireVarStore *var_store, glong row, glong co
 struct variable *
 psppire_var_store_get_var (PsppireVarStore *store, glong row)
 {
-  return psppire_dict_get_variable (store->dict, row);
+  return psppire_dict_get_variable (store->dictionary, row);
 }
 
 static gboolean
@@ -315,49 +390,14 @@ psppire_var_store_new (PsppireDict *dict)
 {
   PsppireVarStore *retval;
 
-  retval = g_object_new (GTK_TYPE_VAR_STORE, NULL);
+  retval = g_object_new (GTK_TYPE_VAR_STORE, "dictionary", dict, NULL);
 
-  psppire_var_store_set_dictionary (retval, dict);
+  //  psppire_var_store_set_dictionary (retval, dict);
 
   return retval;
 }
 
-static void
-var_change_callback (GtkWidget *w, gint n, gpointer data)
-{
-  PsppireSheetModel *model = PSPPIRE_SHEET_MODEL (data);
-
-  psppire_sheet_model_range_changed (model,
-                                n, 0, n, PSPPIRE_VAR_STORE_n_COLS);
-}
-
-
-static void
-var_delete_callback (GtkWidget *w, gint dict_idx, gint case_idx, gint val_cnt, gpointer data)
-{
-  PsppireSheetModel *model = PSPPIRE_SHEET_MODEL (data);
-
-  psppire_sheet_model_rows_deleted (model, dict_idx, 1);
-}
-
-
-
-static void
-var_insert_callback (GtkWidget *w, glong row, gpointer data)
-{
-  PsppireSheetModel *model = PSPPIRE_SHEET_MODEL (data);
-
-  psppire_sheet_model_rows_inserted (model, row, 1);
-}
-
-static void
-refresh (PsppireDict  *d, gpointer data)
-{
-  PsppireVarStore *vs = data;
-
-  psppire_sheet_model_range_changed (PSPPIRE_SHEET_MODEL (vs), -1, -1, -1, -1);
-}
-
+#if 0
 /**
  * psppire_var_store_replace_set_dictionary:
  * @var_store: The variable store
@@ -388,6 +428,7 @@ psppire_var_store_set_dictionary (PsppireVarStore *var_store, PsppireDict *dict)
   /* The entire model has changed */
   psppire_sheet_model_range_changed (PSPPIRE_SHEET_MODEL (var_store), -1, -1, -1, -1);
 }
+#endif
 
 static void
 psppire_var_store_finalize (GObject *object)
@@ -396,6 +437,19 @@ psppire_var_store_finalize (GObject *object)
   (* parent_class->finalize) (object);
 }
 
+static void
+psppire_var_store_dispose (GObject *object)
+{
+  PsppireVarStore *self = PSPPIRE_VAR_STORE (object);
+
+  if (self->dictionary)
+    g_object_unref (self->dictionary);
+
+  /* must chain up */
+  (* parent_class->finalize) (object);
+}
+
+
 static gchar *
 psppire_var_store_get_string (const PsppireSheetModel *model,
                              glong row, glong column)
@@ -404,10 +458,10 @@ psppire_var_store_get_string (const PsppireSheetModel *model,
 
   struct variable *pv;
 
-  if ( row >= psppire_dict_get_var_cnt (store->dict))
+  if ( row >= psppire_dict_get_var_cnt (store->dictionary))
     return 0;
 
-  pv = psppire_dict_get_variable (store->dict, row);
+  pv = psppire_dict_get_variable (store->dictionary, row);
 
   return text_for_column (store, pv, column, 0);
 }
@@ -424,7 +478,7 @@ psppire_var_store_clear (PsppireSheetModel *model,  glong row, glong col)
 
   PsppireVarStore *var_store = PSPPIRE_VAR_STORE (model);
 
-  if ( row >= psppire_dict_get_var_cnt (var_store->dict))
+  if ( row >= psppire_dict_get_var_cnt (var_store->dictionary))
       return FALSE;
 
   pv = psppire_var_store_get_var (var_store, row);
@@ -455,7 +509,7 @@ psppire_var_store_set_string (PsppireSheetModel *model,
 
   PsppireVarStore *var_store = PSPPIRE_VAR_STORE (model);
 
-  if ( row >= psppire_dict_get_var_cnt (var_store->dict))
+  if ( row >= psppire_dict_get_var_cnt (var_store->dictionary))
       return FALSE;
 
   pv = psppire_var_store_get_var (var_store, row);
@@ -468,7 +522,7 @@ psppire_var_store_set_string (PsppireSheetModel *model,
     case PSPPIRE_VAR_STORE_COL_NAME:
       {
        gboolean ok;
-       ok =  psppire_dict_rename_var (var_store->dict, pv, text);
+       ok =  psppire_dict_rename_var (var_store->dictionary, pv, text);
        return ok;
       }
     case PSPPIRE_VAR_STORE_COL_COLUMNS:
@@ -561,7 +615,7 @@ static  gchar *
 text_for_column (PsppireVarStore *vs,
                 const struct variable *pv, gint c, GError **err)
 {
-  PsppireDict *dict = vs->dict;
+  PsppireDict *dict = vs->dictionary;
   static const gchar *const type_label[] =
     {
       N_("Numeric"),
@@ -726,7 +780,7 @@ text_for_column (PsppireVarStore *vs,
 gint
 psppire_var_store_get_var_cnt (PsppireVarStore  *store)
 {
-  return psppire_dict_get_var_cnt (store->dict);
+  return psppire_dict_get_var_cnt (store->dictionary);
 }
 
 
@@ -736,8 +790,8 @@ psppire_var_store_get_row_count (const PsppireSheetModel * model)
   gint rows = 0;
   PsppireVarStore *vs = PSPPIRE_VAR_STORE (model);
 
-  if (vs->dict)
-    rows =  psppire_dict_get_var_cnt (vs->dict);
+  if (vs->dictionary)
+    rows =  psppire_dict_get_var_cnt (vs->dictionary);
 
   return rows ;
 }
@@ -758,10 +812,10 @@ get_row_sensitivity (const PsppireSheetModel *model, gint row)
 {
   PsppireVarStore *vs = PSPPIRE_VAR_STORE (model);
 
-  if ( ! vs->dict)
+  if ( ! vs->dictionary)
     return FALSE;
 
-  return  row < psppire_dict_get_var_cnt (vs->dict);
+  return  row < psppire_dict_get_var_cnt (vs->dictionary);
 }
 
 
index 4cda0159bf0e776f4601f1e1b126b3ed211d11f2..e4c2ecd827c47fd9bc6747fddcb1d710357e157b 100644 (file)
@@ -63,7 +63,7 @@ struct _PsppireVarStore
   GObject parent;
 
   /*< private >*/
-  PsppireDict *dict;
+  PsppireDict *dictionary;
   GdkColor disabled;
   PsppireVarStoreFormatType format_type;
 };
@@ -84,9 +84,6 @@ GType         psppire_var_store_get_type         (void) G_GNUC_CONST;
 PsppireVarStore *psppire_var_store_new              (PsppireDict *dict);
 struct variable * psppire_var_store_get_var (PsppireVarStore *store, glong row);
 
-void psppire_var_store_set_dictionary (PsppireVarStore *var_store, PsppireDict *dict);
-
-
 /* Return the number of variables */
 gint psppire_var_store_get_var_cnt (PsppireVarStore      *var_store);
 
index db5cd4fbb4bf1972065e0230e9ad34cc919a43ef..b2894095b76c69335e6b3f73d3276305967b5787 100644 (file)
@@ -238,7 +238,7 @@ rank_dialog (GObject *o, gpointer data)
 
   g_object_get (de->data_editor, "var-store", &vs, NULL);
 
-  rd.dict = vs->dict;
+  g_object_get (vs, "dictionary", &rd.dict, NULL);
   rd.rank_vars =   get_widget_assert (builder, "variables-treeview");
   rd.group_vars =  get_widget_assert (builder, "group-vars-treeview");
   rd.dialog = get_widget_assert   (builder, "rank-dialog");
@@ -306,9 +306,9 @@ rank_dialog (GObject *o, gpointer data)
 
   gtk_window_set_transient_for (GTK_WINDOW (rd.dialog), GTK_WINDOW (de));
 
-  g_object_set (vars, "dictionary", vs->dict, NULL);
+  g_object_set (vars, "dictionary", rd.dict, NULL);
 
-  set_dest_model (GTK_TREE_VIEW (rd.rank_vars), vs->dict);
+  set_dest_model (GTK_TREE_VIEW (rd.rank_vars), rd.dict);
 
   psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector1),
                                 vars,
@@ -317,7 +317,7 @@ rank_dialog (GObject *o, gpointer data)
                                 NULL,
                                 NULL);
 
-  set_dest_model (GTK_TREE_VIEW (rd.group_vars), vs->dict);
+  set_dest_model (GTK_TREE_VIEW (rd.group_vars), rd.dict);
 
   psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector2),
                                 vars,
index 495aefb82914b8026f7f507e75aa72b13759a019..0bb82eb335a9a6d3c75a13f6c1cf34e47863c8a3 100644 (file)
@@ -867,7 +867,7 @@ recode_dialog (PsppireDataWindow *de, gboolean diff)
   rd.new_name_entry = get_widget_assert (builder, "dest-name-entry");
   rd.new_label_entry = get_widget_assert (builder, "dest-label-entry");
 
-  rd.dict = vs->dict;
+  g_object_get (vs, "dictionary", &rd.dict, NULL);
 
   rd.value_map = gtk_list_store_new (2,
                                     old_value_get_type (),
@@ -888,11 +888,11 @@ recode_dialog (PsppireDataWindow *de, gboolean diff)
   gtk_window_set_transient_for (GTK_WINDOW (rd.dialog), GTK_WINDOW (de));
 
 
-  g_object_set (rd.dict_treeview, "dictionary", vs->dict, NULL);
+  g_object_set (rd.dict_treeview, "dictionary", rd.dict, NULL);
 
   if ( ! rd.different )
     {
-      set_dest_model (GTK_TREE_VIEW (rd.variable_treeview), vs->dict);
+      set_dest_model (GTK_TREE_VIEW (rd.variable_treeview), rd.dict);
     }
   else
     {
@@ -916,7 +916,7 @@ recode_dialog (PsppireDataWindow *de, gboolean diff)
 
       gtk_tree_view_column_set_cell_data_func (col, renderer,
                                               cell_var_name,
-                                              vs->dict, 0);
+                                              rd.dict, 0);
 
 
       gtk_tree_view_append_column (GTK_TREE_VIEW (rd.variable_treeview), col);
index a702ffb78df0c8d7681c2ec52ce8b6612efc65f8..eaca17e074e49aef32c5cbbb7447ef3c012b94b8 100644 (file)
@@ -253,10 +253,11 @@ regression_dialog (GObject *o, gpointer data)
 
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
 
-  g_object_set (source, "dictionary", vs->dict, NULL);
+  g_object_get (vs, "dictionary", &rd.dict, NULL);
+  g_object_set (source, "dictionary", rd.dict, NULL);
 
-  set_dest_model (GTK_TREE_VIEW (dest_dep), vs->dict);
-  set_dest_model (GTK_TREE_VIEW (dest_indep), vs->dict);
+  set_dest_model (GTK_TREE_VIEW (dest_dep), rd.dict);
+  set_dest_model (GTK_TREE_VIEW (dest_indep), rd.dict);
 
   psppire_selector_set_subjects (PSPPIRE_SELECTOR (dep_selector),
                                 source,
@@ -274,7 +275,8 @@ regression_dialog (GObject *o, gpointer data)
 
   rd.dep_vars = GTK_TREE_VIEW (dest_dep);
   rd.indep_vars = GTK_TREE_VIEW (dest_indep);
-  rd.dict = vs->dict;
+
+
   rd.save_dialog = get_widget_assert (xml, "save-dialog");
   rd.pred_button = GTK_TOGGLE_BUTTON (get_widget_assert (xml, "pred-button"));
   rd.resid_button = GTK_TOGGLE_BUTTON (get_widget_assert (xml, "resid-button"));
index 4db99d978e34d8bffc9a5b7c808eeea4b94d2174..66c8bf5ce4b3eed41425643db8bd3eb5ec043790 100644 (file)
@@ -137,11 +137,10 @@ reliability_dialog (GObject *o, gpointer data)
 
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
 
-  g_object_set (source, "dictionary", vs->dict, NULL);
+  g_object_get (vs, "dictionary", &rd.dict, NULL);
+  g_object_set (source, "dictionary", rd.dict, NULL);
 
-  rd.dict = vs->dict;
-
-  set_dest_model (GTK_TREE_VIEW (rd.variables), vs->dict);
+  set_dest_model (GTK_TREE_VIEW (rd.variables), rd.dict);
 
   psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector),
                                 source,
index a11356109daad8f9c4ac3a202dd382bd9a3305af..4e7ac61f5ca94ddd2670ccd8baadfeb65c0529e7 100644 (file)
@@ -111,9 +111,10 @@ sort_cases_dialog (GObject *o, gpointer data)
 
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
 
-  g_object_set (source, "dictionary", vs->dict, NULL);
+  g_object_get (vs, "dictionary", &scd.dict, NULL);
+  g_object_set (source, "dictionary", scd.dict, NULL);
 
-  set_dest_model (GTK_TREE_VIEW (dest), vs->dict);
+  set_dest_model (GTK_TREE_VIEW (dest), scd.dict);
 
   psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector),
                                 source,
@@ -125,7 +126,6 @@ sort_cases_dialog (GObject *o, gpointer data)
   g_signal_connect (dialog, "refresh", G_CALLBACK (refresh),  dest);
 
   scd.tv = GTK_TREE_VIEW (dest);
-  scd.dict = vs->dict;
   scd.ascending =
     GTK_TOGGLE_BUTTON (get_widget_assert (xml, "sort-cases-radiobutton0"));
 
index 458a3c53532a1eafdddbd9552f14cc4b11286ffc..613f8e91fe601cf544f32bb62933c00211c3869a 100644 (file)
@@ -186,19 +186,16 @@ split_file_dialog (GObject *o, gpointer data)
 
   g_object_get (de->data_editor, "var-store", &vs, NULL);
 
-  sfd.dict = vs->dict;
+  g_object_get (vs, "dictionary", &sfd.dict, NULL);
   sfd.tv = GTK_TREE_VIEW (dest);
   sfd.selector  = PSPPIRE_SELECTOR (
                                    get_widget_assert   (sfd.xml, "split-file-selector"));
 
-  g_object_set (source, "dictionary",
-                                vs->dict, NULL);
-
+  g_object_set (source, "dictionary", sfd.dict, NULL);
 
   g_signal_connect (on_off, "toggled", G_CALLBACK(on_off_toggled),  sfd.xml);
 
-
-  set_dest_model (GTK_TREE_VIEW (dest), vs->dict);
+  set_dest_model (GTK_TREE_VIEW (dest), sfd.dict);
 
   psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector),
                                 source,
index f5df9f36e3004533789b74a78ae16670f57baab5..5d77ce43031ea7e46b37c3f0de57e9f9a22e67eb 100644 (file)
@@ -416,7 +416,7 @@ t_test_independent_samples_dialog (GObject *o, gpointer data)
 
   tt_d.dialog = get_widget_assert (xml, "t-test-independent-samples-dialog");
   tt_d.xml = xml;
-  tt_d.dict = vs->dict;
+  g_object_get (vs, "dictionary", &tt_d.dict, NULL);
 
   tt_d.define_groups_button = get_widget_assert (xml, "define-groups-button");
   tt_d.groups_entry = get_widget_assert (xml, "indep-samples-t-test-entry");
@@ -426,11 +426,9 @@ t_test_independent_samples_dialog (GObject *o, gpointer data)
 
   gtk_window_set_transient_for (GTK_WINDOW (tt_d.dialog), GTK_WINDOW (de));
 
-  g_object_set (dict_view, "dictionary", 
-                                vs->dict,
-                                NULL);
+  g_object_set (dict_view, "dictionary", tt_d.dict, NULL);
 
-  set_dest_model (GTK_TREE_VIEW (test_variables_treeview), vs->dict);
+  set_dest_model (GTK_TREE_VIEW (test_variables_treeview), tt_d.dict);
 
 
   psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector1),
index 18bdbb5dd3003f506a73a3b265a449a679541d77..8b2d8af795e055552e3cec44981e1e6b5f2ed4f9 100644 (file)
@@ -141,7 +141,7 @@ t_test_one_sample_dialog (GObject *o, gpointer data)
 
   g_object_get (de->data_editor, "var-store", &vs, NULL);
 
-  tt_d.dict = vs->dict;
+  g_object_get (vs, "dictionary", &tt_d.dict, NULL);
   tt_d.vars_treeview = get_widget_assert (xml, "one-sample-t-test-treeview1");
   tt_d.test_value_entry = get_widget_assert (xml, "test-value-entry");
   tt_d.opt = tt_options_dialog_create (xml, GTK_WINDOW (de));
@@ -149,11 +149,11 @@ t_test_one_sample_dialog (GObject *o, gpointer data)
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
 
   g_object_set (dict_view, "dictionary",
-                                vs->dict,
-       "predicate",
-                                var_is_numeric, NULL);
+               tt_d.dict,
+               "predicate",
+               var_is_numeric, NULL);
 
-  set_dest_model (GTK_TREE_VIEW (tt_d.vars_treeview), vs->dict);
+  set_dest_model (GTK_TREE_VIEW (tt_d.vars_treeview), tt_d.dict);
 
 
   psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector),
index dcc24fadd85c8ddc75354efdf94100190dd17c28..15b99ad21914c6e3b119b5ab810dc54e6941dc48 100644 (file)
@@ -199,7 +199,7 @@ t_test_paired_samples_dialog (GObject *o, gpointer data)
 
   g_object_get (de->data_editor, "var-store", &vs, NULL);
 
-  tt_d.dict = vs->dict;
+  g_object_get (vs, "dictionary", &tt_d.dict, NULL);
   tt_d.pairs_treeview =
    get_widget_assert (xml, "paired-samples-t-test-treeview2");
   tt_d.opt = tt_options_dialog_create (xml, GTK_WINDOW (de));
@@ -207,10 +207,9 @@ t_test_paired_samples_dialog (GObject *o, gpointer data)
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
 
 
-  g_object_set (dict_view, "dictionary",
-                                vs->dict,
-                                "predicate",
-                                var_is_numeric, NULL);
+  g_object_set (dict_view, "dictionary", tt_d.dict,
+               "predicate",
+               var_is_numeric, NULL);
 
   {
     tt_d.list_store =
index beed72d731590eb4089d442a41e684545e2be6da..36640f6f752a71829b391c1310a243d97de8eb17 100644 (file)
@@ -80,6 +80,7 @@ transpose_dialog (GObject *o, gpointer data)
 {
   gint response ;
   PsppireDataWindow *de = PSPPIRE_DATA_WINDOW (data);
+  PsppireDict *dict = NULL;
 
   GtkBuilder *xml = builder_new ("psppire.ui");
 
@@ -94,9 +95,10 @@ transpose_dialog (GObject *o, gpointer data)
 
   g_object_get (de->data_editor, "var-store", &vs, NULL);
 
-  g_object_set (source, "dictionary", vs->dict, NULL);
+  g_object_get (vs, "dictionary", &dict, NULL);
+  g_object_set (source, "dictionary", dict, NULL);
 
-  set_dest_model (GTK_TREE_VIEW (dest), vs->dict);
+  set_dest_model (GTK_TREE_VIEW (dest), dict);
 
   psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector1),
                                 source, dest,
@@ -125,7 +127,7 @@ transpose_dialog (GObject *o, gpointer data)
     {
     case GTK_RESPONSE_OK:
       {
-       gchar *syntax = generate_syntax (vs->dict, xml);
+       gchar *syntax = generate_syntax (dict, xml);
 
        struct getl_interface *sss = create_syntax_string_source (syntax);
        execute_syntax (sss);
@@ -135,7 +137,7 @@ transpose_dialog (GObject *o, gpointer data)
       break;
     case PSPPIRE_RESPONSE_PASTE:
       {
-       gchar *syntax = generate_syntax (vs->dict, xml);
+       gchar *syntax = generate_syntax (dict, xml);
         paste_syntax_in_new_window (syntax);
 
        g_free (syntax);
index 5b226eb6b807b191362659eec72422caad7c8e1c..14eacabfadddb5842e81f444855233b0e903ec03 100644 (file)
@@ -35,6 +35,7 @@ struct val_labs_dialog
   GtkWidget *window;
 
   PsppireVarStore *var_store;
+  PsppireDict *dict;
 
   /* The variable to be updated */
   struct variable *pv;
@@ -72,7 +73,7 @@ on_label_entry_change (GtkEntry *entry, gpointer data)
   text = gtk_entry_get_text (GTK_ENTRY (dialog->value_entry));
 
   text_to_value (text,
-                dialog->var_store->dict,
+                dialog->dict,
                 dialog->pv,
                 &v);
 
@@ -145,7 +146,7 @@ on_value_entry_change (GtkEntry *entry, gpointer data)
 
   union value v;
   text_to_value (text,
-                dialog->var_store->dict,
+                dialog->dict,
                 dialog->pv,
                 &v);
 
@@ -273,7 +274,7 @@ on_change (GtkWidget *w, gpointer data)
   union value v;
 
   text_to_value (val_text,
-                dialog->var_store->dict,
+                dialog->dict,
                 dialog->pv,
                 &v);
 
@@ -299,7 +300,7 @@ on_add (GtkWidget *w, gpointer data)
   const gchar *text = gtk_entry_get_text (GTK_ENTRY (dialog->value_entry));
 
   text_to_value (text,
-                dialog->var_store->dict,
+                dialog->dict,
                 dialog->pv,
                 &v);
 
@@ -351,7 +352,7 @@ on_select_row (GtkTreeView *treeview, gpointer data)
   gchar *text;
 
   get_selected_tuple (dialog, &value, &label);
-  text = value_to_text (value, dialog->var_store->dict, *var_get_write_format (dialog->pv));
+  text = value_to_text (value, dialog->dict, *var_get_write_format (dialog->pv));
 
   g_signal_handler_block (GTK_ENTRY (dialog->value_entry),
                         dialog->value_handler_id);
@@ -391,6 +392,7 @@ val_labs_dialog_create (GtkWindow *toplevel, PsppireVarStore *var_store)
   struct val_labs_dialog *dialog = g_malloc (sizeof (*dialog));
 
   dialog->var_store = var_store;
+  g_object_get (var_store, "dictionary", &dialog->dict, NULL);
   dialog->window = get_widget_assert (xml,"val_labs_dialog");
   dialog->value_entry = get_widget_assert (xml,"value_entry");
   dialog->label_entry = get_widget_assert (xml,"label_entry");
@@ -503,7 +505,7 @@ repopulate_dialog (struct val_labs_dialog *dialog)
       const struct val_lab *vl = labels[i];
 
       gchar *const vstr  =
-       value_to_text (vl->value, dialog->var_store->dict,
+       value_to_text (vl->value, dialog->dict,
                      *var_get_write_format (dialog->pv));
 
       gchar *const text = g_strdup_printf ("%s = \"%s\"",
index 178a834c7a0d8357c642997c649f81f9612488b6..2fdf2df87440ce8beec883aa65aab02dce988123 100644 (file)
@@ -65,8 +65,7 @@ populate_text (PsppireDictView *treeview, gpointer data)
   if ( var == NULL)
     return;
 
-  g_object_get (treeview,
-               "dictionary", &dict,
+  g_object_get (treeview, "dictionary", &dict,
                NULL);
 
   gstring = g_string_sized_new (200);
@@ -159,13 +158,14 @@ variable_info_dialog (GObject *o, gpointer data)
   GtkWidget *textview = get_widget_assert (xml, "textview1");
 
   PsppireVarStore *vs = NULL;
+  PsppireDict *dict = NULL;
 
   g_object_get (de->data_editor, "var-store", &vs, NULL);
 
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
 
-  g_object_set (treeview,
-               "dictionary", vs->dict,
+  g_object_get (vs, "dictionary", &dict, NULL);
+  g_object_set (treeview, "dictionary", dict,
                "selection-mode", GTK_SELECTION_SINGLE,
                NULL);
 
index 11b528ba76d1ebf2f3f06cea96cabad8d8eac7f9..b3087159f941adf7d16b7d2dc1d66f7165ee38d5 100644 (file)
@@ -120,6 +120,7 @@ weight_cases_dialog (GObject *o, gpointer data)
   PsppireVarStore *vs = NULL;
 
   g_object_get (de->data_editor, "var-store", &vs,  NULL);
+  g_object_get (vs, "dictionary", &wcd.dict, NULL);
 
   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
 
@@ -130,7 +131,8 @@ weight_cases_dialog (GObject *o, gpointer data)
   g_signal_connect (selector, "de-selected", G_CALLBACK (on_deselect),
                    radiobutton1);
 
-  g_object_set (source, "dictionary", vs->dict,
+  
+  g_object_set (source, "dictionary", wcd.dict,
                                 "selection-mode", GTK_SELECTION_SINGLE,
                                 "predicate", var_is_numeric,
                                 NULL);
@@ -144,7 +146,7 @@ weight_cases_dialog (GObject *o, gpointer data)
                                 );
 
 
-  wcd.dict = vs->dict;
+
   wcd.entry = GTK_ENTRY (entry);
   wcd.status = GTK_LABEL (status);
   wcd.off = GTK_TOGGLE_BUTTON (radiobutton1);