Ensure that only one set of callbacks exist.
[pspp-builds.git] / src / ui / gui / psppire-selector.c
index 8e0be3a3590b37015877e4b7ebb452c006f6e900..d871d5d1511a69c894525be369e933ca85d6a2b6 100644 (file)
@@ -303,6 +303,11 @@ psppire_selector_base_finalize(PsppireSelectorClass *class,
 static void
 psppire_selector_init (PsppireSelector *selector)
 {
+  selector->select_user_data = NULL;
+  selector->select_items = NULL;
+  selector->allow_selection = NULL;
+  selector->filter = NULL;
+
   selector->arrow = gtk_arrow_new (GTK_ARROW_LEFT, GTK_SHADOW_NONE);
   selector->filtered_source = NULL;
 
@@ -321,6 +326,10 @@ psppire_selector_init (PsppireSelector *selector)
   selector->source = NULL;
   selector->dest = NULL;
   selector->dispose_has_run = FALSE;
+
+
+  selector->row_activate_id = 0;
+  selector->source_select_id  = 0;
 }
 
 
@@ -680,14 +689,13 @@ set_tree_view_source (PsppireSelector *selector,
   GList *list = NULL;
 
   PsppireSelectorClass *class = g_type_class_peek (PSPPIRE_SELECTOR_TYPE);
+  
+  GtkTreeModel *model = gtk_tree_view_get_model (source);
 
   if ( ! (list = g_hash_table_lookup (class->source_hash, source)))
     {
       selector->filtered_source =
-       GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new
-                              (gtk_tree_view_get_model (source),  NULL));
-
-      gtk_tree_view_set_model (source, NULL);
+       GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (model, NULL));
 
       gtk_tree_view_set_model (source,
                               GTK_TREE_MODEL (selector->filtered_source));
@@ -705,8 +713,7 @@ set_tree_view_source (PsppireSelector *selector,
     {  /* Append this selector to the list and push the <source,list>
          pair onto the hash table */
 
-      selector->filtered_source = GTK_TREE_MODEL_FILTER (
-       gtk_tree_view_get_model (source));
+      selector->filtered_source = GTK_TREE_MODEL_FILTER (model);
 
       list = g_list_append (list, selector);
       g_hash_table_replace (class->source_hash, source, list);
@@ -714,11 +721,17 @@ set_tree_view_source (PsppireSelector *selector,
 
   selection = gtk_tree_view_get_selection (source);
 
-  g_signal_connect (source, "row-activated", G_CALLBACK (on_row_activate),
-                   selector);
+  if ( selector->row_activate_id )
+    g_signal_handler_disconnect (source, selector->row_activate_id);
 
-  g_signal_connect (selection, "changed", G_CALLBACK (on_source_select),
-                   selector);
+  selector->row_activate_id =  
+    g_signal_connect (source, "row-activated", G_CALLBACK (on_row_activate), selector);
+
+  if ( selector->source_select_id )
+    g_signal_handler_disconnect (selection, selector->source_select_id);
+
+  selector->source_select_id = 
+    g_signal_connect (selection, "changed", G_CALLBACK (on_source_select), selector);
 }
 
 
@@ -863,12 +876,15 @@ update_subjects (PsppireSelector *selector)
   if ( NULL == selector->dest )
     return;
 
+  if ( selector->filter == NULL)
+    {
+      if  (GTK_IS_TREE_VIEW (selector->dest))
+       selector->filter = is_item_in_dest;
+    }
+
   if ( NULL == selector->source )
     return;
 
-  g_signal_connect_swapped (selector->source, "notify::dictionary",
-                           G_CALLBACK (update_subjects), selector);
-
   g_signal_connect_swapped (selector->source, "notify::model",
                            G_CALLBACK (update_subjects), selector);
 
@@ -903,22 +919,28 @@ update_subjects (PsppireSelector *selector)
 }
 
 
-/* Set SELECT_FUNC and FILTER_FUNC for this selector */
+/* Set FILTER_FUNC for this selector */
 void
-psppire_selector_set_subjects (PsppireSelector *selector,
-                              SelectItemsFunc *select_func,
-                              FilterItemsFunc *filter_func,
-                              gpointer user_data)
+psppire_selector_set_filter_func (PsppireSelector *selector,
+                                 FilterItemsFunc *filter_func)
 {
   selector->filter = filter_func ;
-  selector->select_user_data = user_data;
 
-  if ( filter_func == NULL)
+  if ( selector->filter == NULL)
     {
       if  (GTK_IS_TREE_VIEW (selector->dest))
        selector->filter = is_item_in_dest;
     }
+}
 
+
+/* Set SELECT_FUNC for this selector */
+void
+psppire_selector_set_select_func (PsppireSelector *selector,
+                              SelectItemsFunc *select_func,
+                              gpointer user_data)
+{
+  selector->select_user_data = user_data;
   selector->select_items = select_func;
 }