Prevent traversing to cells for which there is no variable
[pspp-builds.git] / src / ui / gui / psppire-dict.c
index 31761136f8654601906ccd050aec107e8f59280f..e6f1373a54d969ed76de022e0135924ace674c8c 100644 (file)
@@ -22,7 +22,6 @@
 #include <gtksheet/gtkextra-marshal.h>
 
 #include "psppire-dict.h"
-#include <data/format.h>
 #include <data/dictionary.h>
 #include <data/missing-values.h>
 #include <data/value-labels.h>
@@ -42,14 +41,19 @@ static void dictionary_tree_model_init (GtkTreeModelIface *iface);
 /* --- variables --- */
 static GObjectClass     *parent_class = NULL;
 
-enum  {VARIABLE_CHANGED,
-       VARIABLE_RESIZED,
-       VARIABLE_INSERTED,
-       VARIABLE_DELETED,
-       WEIGHT_CHANGED,
-       FILTER_CHANGED,
-       SPLIT_CHANGED,
-       n_SIGNALS};
+enum  {
+  BACKEND_CHANGED,
+
+  VARIABLE_CHANGED,
+  VARIABLE_RESIZED,
+  VARIABLE_INSERTED,
+  VARIABLE_DELETED,
+
+  WEIGHT_CHANGED,
+  FILTER_CHANGED,
+  SPLIT_CHANGED,
+  n_SIGNALS
+};
 
 static guint signals [n_SIGNALS];
 
@@ -106,6 +110,17 @@ psppire_dict_class_init (PsppireDictClass *class)
 
   object_class->finalize = psppire_dict_finalize;
 
+  signals [BACKEND_CHANGED] =
+    g_signal_new ("backend-changed",
+                 G_TYPE_FROM_CLASS (class),
+                 G_SIGNAL_RUN_FIRST,
+                 0,
+                 NULL, NULL,
+                 g_cclosure_marshal_VOID__VOID,
+                 G_TYPE_NONE,
+                 0);
+
+
   signals [VARIABLE_CHANGED] =
     g_signal_new ("variable_changed",
                  G_TYPE_FROM_CLASS (class),
@@ -289,6 +304,7 @@ void
 psppire_dict_replace_dictionary (PsppireDict *dict, struct dictionary *d)
 {
   struct variable *var =  dict_get_weight (d);
+
   dict->dict = d;
 
   weight_changed_callback (d, var ? var_get_dict_index (var) : -1, dict);
@@ -299,6 +315,8 @@ psppire_dict_replace_dictionary (PsppireDict *dict, struct dictionary *d)
   split_changed_callback (d, dict);
 
   dict_set_callbacks (dict->dict, &gui_callbacks, dict);
+
+  g_signal_emit (dict, signals [BACKEND_CHANGED], 0);
 }
 
 
@@ -411,6 +429,17 @@ psppire_dict_get_var_cnt (const PsppireDict *d)
 }
 
 
+/* Return the number of `union value's in the dictionary */
+size_t
+psppire_dict_get_value_cnt (const PsppireDict *d)
+{
+  g_return_val_if_fail (d, -1);
+  g_return_val_if_fail (d->dict, -1);
+
+  return dict_get_next_value_idx (d->dict);
+}
+
+
 /* Return a variable by name.
    Return NULL if it doesn't exist
 */
@@ -458,7 +487,7 @@ psppire_dict_check_name (const PsppireDict *dict,
 }
 
 
-inline gint
+gint
 psppire_dict_get_next_value_idx (const PsppireDict *dict)
 {
   return dict_get_next_value_idx (dict->dict);
@@ -760,6 +789,10 @@ psppire_dict_rename_var (PsppireDict *dict, struct variable *v,
   if ( ! var_is_valid_name (name, false))
     return FALSE;
 
+  /* Make sure no other variable has this name */
+  if ( NULL != psppire_dict_lookup_var (dict, name))
+    return FALSE;
+
   dict_rename_var (dict->dict, v, name);
 
   return TRUE;
@@ -781,17 +814,14 @@ psppire_dict_dump (const PsppireDict *dict)
   gint i;
   const struct dictionary *d = dict->dict;
 
-  int *map = dict_get_compacted_dict_index_to_case_index (d);
-
   for (i = 0; i < dict_get_var_cnt (d); ++i)
     {
       const struct variable *v = psppire_dict_get_variable (dict, i);
       int di = var_get_dict_index (v);
-      g_print ("\"%s\" idx=%d, fv=%d(%d), size=%d\n",
+      g_print ("\"%s\" idx=%d, fv=%d, size=%d\n",
               var_get_name(v),
               di,
               var_get_case_index(v),
-              map[di],
               value_cnt_from_width(var_get_width(v)));
 
     }