#include "psppire-dictview.h"
#include "psppire-var-view.h"
-
-
+#include "psppire-dict.h"
+#include "psppire-select-dest.h"
#include <gtk/gtksignal.h>
#include <gtk/gtkbutton.h>
};
}
-
-
static void
psppire_selector_class_init (PsppireSelectorClass *class)
{
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE,
0);
+
+ class->default_selection_funcs = g_hash_table_new (g_direct_hash, g_direct_equal);
}
gpointer class_data)
{
g_hash_table_destroy (class->source_hash);
+ g_hash_table_destroy (class->default_selection_funcs);
}
/* Callback for when the source treeview is activated (double clicked) */
GList *list = g_hash_table_lookup (class->source_hash, selector->source);
+ if ( NULL == list)
+ return;
+
if ( g_list_first (list)->data == selector)
{
if ( selector->row_activate_id )
}
static gboolean
-permissive_filter (GtkTreeModel *model, GtkTreeIter *iter,
- PsppireSelector *selector)
-{
- return FALSE;
-}
-
-/* Default visibility filter for GtkTreeView DEST widget */
-static gboolean
-is_item_in_dest (GtkTreeModel *model, GtkTreeIter *iter,
- PsppireSelector *selector)
+is_item_in_dest (GtkTreeModel *model, GtkTreeIter *iter, PsppireSelector *selector)
{
- GtkTreeModel *dest_model;
- GtkTreeIter dest_iter;
+ gboolean result = FALSE;
GtkTreeIter source_iter;
- gint index;
- GtkTreePath *path ;
GtkTreeModel *source_model;
+ GValue value = {0};
- if ( GTK_IS_TREE_MODEL_FILTER (model) )
+ if (GTK_IS_TREE_MODEL_FILTER (model))
{
source_model = gtk_tree_model_filter_get_model
(GTK_TREE_MODEL_FILTER (model));
gtk_tree_model_filter_convert_iter_to_child_iter
- ( GTK_TREE_MODEL_FILTER (model), &source_iter, iter );
+ (GTK_TREE_MODEL_FILTER (model), &source_iter, iter);
}
else
{
source_iter = *iter;
}
- dest_model = gtk_tree_view_get_model (GTK_TREE_VIEW (selector->dest));
-
- path = gtk_tree_model_get_path (source_model, &source_iter);
-
- index = *gtk_tree_path_get_indices (path);
+ gtk_tree_model_get_value (source_model, &source_iter, DICT_TVM_COL_VAR, &value);
- gtk_tree_path_free (path);
-
- if ( ! gtk_tree_model_get_iter_first (dest_model, &dest_iter) )
- return FALSE;
-
- do
- {
- int x;
- GValue value = {0};
- GValue int_value = {0};
- gtk_tree_model_get_value (dest_model, &dest_iter, 0, &value);
+ result = psppire_select_dest_widget_contains_var (PSPPIRE_SELECT_DEST_WIDGET (selector->dest),
+ &value);
- g_value_init (&int_value, G_TYPE_INT);
+ g_value_unset (&value);
- g_value_transform (&value, &int_value);
-
- x = g_value_get_int (&int_value);
+ return result;
+}
- g_value_unset (&int_value);
- g_value_unset (&value);
- if ( x == index )
- return TRUE;
- }
- while (gtk_tree_model_iter_next (dest_model, &dest_iter));
-
- return FALSE;
-}
/* Visibility function for items in the SOURCE widget.
Returns TRUE iff *all* the selectors for which SOURCE is associated
set_tree_view_source (PsppireSelector *selector,
GtkTreeView *source)
{
-
GList *list = NULL;
PsppireSelectorClass *class = g_type_class_peek (PSPPIRE_SELECTOR_TYPE);
g_hash_table_replace (class->source_hash, source, list);
}
}
-
-
}
static void
-xxx (PsppireSelector *selector)
+on_dest_model_changed (PsppireSelector *selector)
{
GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (selector->dest));
g_signal_connect (selection, "changed", G_CALLBACK (on_dest_treeview_select),
selector);
-
+ on_dest_model_changed (selector);
g_signal_connect_swapped (dest, "notify::model",
- G_CALLBACK (xxx), selector);
-
+ G_CALLBACK (on_dest_model_changed), selector);
}
+
/* Callback which causes the filter to be refiltered.
Called when the DEST GtkEntry is activated (Enter is pressed), or when it
looses focus.
return FALSE;
}
+
/* Callback for when the DEST GtkEntry is selected (clicked) */
static gboolean
on_entry_dest_select (GtkWidget *widget, GdkEventFocus *event, gpointer data)
}
-
/* Callback for when an item disappears from the source list.
By implication, this means that the item has been inserted into the
destination.
if ( selector->filter == NULL)
{
if (GTK_IS_TREE_VIEW (selector->dest))
- selector->filter = permissive_filter;
+ selector->filter = is_item_in_dest;
}
}
else
g_error ("Unsupported destination widget: %s", G_OBJECT_TYPE_NAME (selector->dest));
+
/* FIXME: Remove this dependency */
if ( PSPPIRE_IS_DICT_VIEW (selector->source) )
{
- if ( PSPPIRE_IS_VAR_VIEW (selector->dest))
- psppire_selector_set_select_func (PSPPIRE_SELECTOR (selector),
- insert_source_row_into_tree_view,
- NULL);
- else if (GTK_IS_ENTRY (selector->dest))
+ GObjectClass *class = G_OBJECT_GET_CLASS (selector);
+ GType type = G_OBJECT_TYPE (selector->dest);
+
+ SelectItemsFunc *func =
+ g_hash_table_lookup (PSPPIRE_SELECTOR_CLASS (class)->default_selection_funcs, (gpointer) type);
+
+ if ( func )
psppire_selector_set_select_func (PSPPIRE_SELECTOR (selector),
- insert_source_row_into_entry,
- NULL);
+ func, NULL);
}
+}
+
+void
+psppire_selector_set_default_selection_func (GType type, SelectItemsFunc *func)
+{
+ GObjectClass *class = g_type_class_ref (PSPPIRE_SELECTOR_TYPE);
+
+ g_hash_table_insert (PSPPIRE_SELECTOR_CLASS (class)->default_selection_funcs, (gpointer) type, func);
+
+ g_type_class_unref (class);
}
+
+
+
/* Set FILTER_FUNC for this selector */
void
psppire_selector_set_filter_func (PsppireSelector *selector,