/* PSPPIRE - a graphical user interface for PSPP.
- Copyright (C) 2007, 2009 Free Software Foundation
+ Copyright (C) 2007, 2009, 2010 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
#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>
-#include <gtk/gtkentry.h>
+#include <gtk/gtk.h>
#include "psppire-selector.h"
-#include <gtk/gtktreeview.h>
-#include <gtk/gtktreeselection.h>
-#include <gtk/gtktextview.h>
-#include <gtk/gtkwidget.h>
-
static void psppire_selector_base_finalize (PsppireSelectorClass *, gpointer);
static void psppire_selector_base_init (PsppireSelectorClass *class);
static void psppire_selector_class_init (PsppireSelectorClass *class);
};
-static void on_activate (PsppireSelector *selector, gpointer data);
+static void on_click (GtkButton *b);
static void update_subjects (PsppireSelector *selector);
psppire_selector_class_init (PsppireSelectorClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
+ GtkButtonClass *button_class = GTK_BUTTON_CLASS (class);
GParamSpec *orientation_spec =
g_param_spec_enum ("orientation",
"Orientation",
G_PARAM_READWRITE);
+ button_class->clicked = on_click;
+
object_class->set_property = psppire_selector_set_property;
object_class->get_property = psppire_selector_get_property;
GtkTreeViewColumn *column,
gpointer data)
{
- PsppireSelector *selector = data;
-
- gtk_action_activate (selector->action);
+ on_click (GTK_BUTTON (data));
}
/* Callback for when the source selection changes */
if ( selector->allow_selection )
{
- gtk_action_set_sensitive (selector->action,
+ gtk_widget_set_sensitive (GTK_WIDGET (selector),
selector->allow_selection (selector->source, selector->dest));
}
else if ( GTK_IS_ENTRY (selector->dest) )
{
- gtk_action_set_sensitive (selector->action,
+ gtk_widget_set_sensitive (GTK_WIDGET (selector),
gtk_tree_selection_count_selected_rows
(treeselection) <= 1 );
}
selector->arrow = gtk_arrow_new (GTK_ARROW_LEFT, GTK_SHADOW_NONE);
selector->filtered_source = NULL;
- selector->action = gtk_action_new ("select", NULL, NULL, "pspp-stock-select");
-
- gtk_action_connect_proxy (selector->action, GTK_WIDGET (selector));
gtk_container_add (GTK_CONTAINER (selector), selector->arrow);
gtk_widget_show (selector->arrow);
- g_signal_connect_swapped (selector->action, "activate", G_CALLBACK (on_activate), selector);
-
selector->selecting = FALSE;
selector->source = NULL;
or other event which causes the selector's action to occur.
*/
static void
-on_activate (PsppireSelector *selector, gpointer data)
+on_click (GtkButton *b)
{
+ PsppireSelector *selector = PSPPIRE_SELECTOR (b);
+
switch (selector->direction)
{
case PSPPIRE_SELECTOR_SOURCE_TO_DEST:
g_assert_not_reached ();
break;
}
-}
-static gboolean
-permissive_filter (GtkTreeModel *model, GtkTreeIter *iter,
- PsppireSelector *selector)
-{
- return FALSE;
+ if (GTK_BUTTON_CLASS (parent_class)->clicked)
+ GTK_BUTTON_CLASS (parent_class)->clicked (b);
+
}
-/* 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_path_free (path);
-
- if ( ! gtk_tree_model_get_iter_first (dest_model, &dest_iter) )
- return FALSE;
+ gtk_tree_model_get_value (source_model, &source_iter, DICT_TVM_COL_VAR, &value);
- 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);
+ return result;
+}
- x = g_value_get_int (&int_value);
- 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;
}
}
FilterItemsFunc *filter_func)
{
selector->filter = filter_func ;
-
- set_default_filter (selector);
}