Fix bug #20910.
[pspp-builds.git] / src / ui / gui / psppire-dict.c
index b32d0677ba9b04ab22663c312c73f3ec7e4b6017..8560c223f1236b0b7de9d4904b55c4e1b0358b3e 100644 (file)
@@ -1,21 +1,18 @@
-/*
-  PSPPIRE --- A Graphical User Interface for PSPP
-  Copyright (C) 2004, 2006, 2007  Free Software Foundation
+/* PSPPIRE - a graphical user interface for PSPP.
+   Copyright (C) 2004, 2006, 2007  Free Software Foundation
 
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2 of the License, or
-  (at your option) any later version.
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
 
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-  02110-1301, USA. */
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>. */
 
 #include <config.h>
 #include <string.h>
@@ -48,7 +45,7 @@ static GObjectClass     *parent_class = NULL;
 enum  {VARIABLE_CHANGED,
        VARIABLE_RESIZED,
        VARIABLE_INSERTED,
-       VARIABLES_DELETED,
+       VARIABLE_DELETED,
        WEIGHT_CHANGED,
        FILTER_CHANGED,
        SPLIT_CHANGED,
@@ -134,15 +131,16 @@ psppire_dict_class_init (PsppireDictClass *class)
                  G_TYPE_INT);
 
 
-  signals [VARIABLES_DELETED] =
-    g_signal_new ("variables_deleted",
+  signals [VARIABLE_DELETED] =
+    g_signal_new ("variable-deleted",
                  G_TYPE_FROM_CLASS (class),
                  G_SIGNAL_RUN_FIRST,
                  0,
                  NULL, NULL,
-                 gtkextra_VOID__INT_INT,
+                 marshaller_VOID__INT_INT_INT,
                  G_TYPE_NONE,
-                 2,
+                 3,
+                 G_TYPE_INT,
                  G_TYPE_INT,
                  G_TYPE_INT);
 
@@ -214,9 +212,11 @@ addcb (struct dictionary *d, int idx, void *pd)
 }
 
 static void
-delcb (struct dictionary *d, int idx, void *pd)
+delcb (struct dictionary *d, int dict_idx, int case_idx, int value_cnt,
+       void *pd)
 {
-  g_signal_emit (pd, signals [VARIABLES_DELETED], 0, idx, 1);
+  g_signal_emit (pd, signals [VARIABLE_DELETED], 0,
+                dict_idx, case_idx, value_cnt );
 }
 
 static void
@@ -225,6 +225,12 @@ mutcb (struct dictionary *d, int idx, void *pd)
   g_signal_emit (pd, signals [VARIABLE_CHANGED], 0, idx);
 }
 
+static void
+resize_cb (struct dictionary *d, int idx, int delta, void *pd)
+{
+  g_signal_emit (pd, signals [VARIABLE_RESIZED], 0, idx, delta);
+}
+
 static void
 weight_changed_callback (struct dictionary *d, int idx, void *pd)
 {
@@ -249,6 +255,7 @@ static const struct dict_callbacks gui_callbacks =
     addcb,
     delcb,
     mutcb,
+    resize_cb,
     weight_changed_callback,
     filter_changed_callback,
     split_changed_callback
@@ -281,7 +288,17 @@ psppire_dict_new_from_dict (struct dictionary *d)
 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);
+
+  var = dict_get_filter (d);
+  filter_changed_callback (d, var ? var_get_dict_index (var) : -1, dict);
+
+  split_changed_callback (d, dict);
+
+  dict_set_callbacks (dict->dict, &gui_callbacks, dict);
 }
 
 
@@ -339,7 +356,6 @@ psppire_dict_delete_variables (PsppireDict *d, gint first, gint n)
       var = dict_get_var (d->dict, first);
       dict_delete_var (d->dict, var);
     }
-  dict_compact_values (d->dict);
 }
 
 
@@ -395,6 +411,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
 */
@@ -460,8 +487,6 @@ psppire_dict_resize_variable (PsppireDict *d, const struct variable *pv,
   if ( old_size == new_size )
     return ;
 
-  dict_compact_values (d->dict);
-
   fv = var_get_case_index (pv);
 
   g_signal_emit (d, signals [VARIABLE_RESIZED], 0,
@@ -745,7 +770,7 @@ psppire_dict_rename_var (PsppireDict *dict, struct variable *v,
 {
   if ( ! var_is_valid_name (name, false))
     return FALSE;
-  
+
   dict_rename_var (dict->dict, v, name);
 
   return TRUE;
@@ -757,3 +782,26 @@ psppire_dict_get_weight_variable (const PsppireDict *dict)
 {
   return dict_get_weight (dict->dict);
 }
+
+
+
+#if DEBUGGING
+void
+psppire_dict_dump (const PsppireDict *dict)
+{
+  gint i;
+  const struct dictionary *d = dict->dict;
+
+  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, size=%d\n",
+              var_get_name(v),
+              di,
+              var_get_case_index(v),
+              value_cnt_from_width(var_get_width(v)));
+
+    }
+}
+#endif