-/*
- PSPPIRE --- A Graphical User Interface for PSPP
+/* PSPPIRE - a graphical user interface for PSPP.
Copyright (C) 2007 Free Software Foundation
- This program is free software; you can redistribute it and/or modify
+ 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
+ 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,
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. */
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
/*
This module provides a widget, PsppireSelector derived from
#include <gtk/gtktreeview.h>
#include <gtk/gtktreeselection.h>
+#include <gtk/gtktextview.h>
#include <gtk/gtkwidget.h>
static void psppire_selector_base_finalize (PsppireSelectorClass *, gpointer);
gtk_widget_show (selector->arrow);
- /* FIXME: This shouldn't be necessary, but Glade interfaces seem to
- need it. */
- gtk_widget_show (GTK_WIDGET (selector));
+ selector->selecting = FALSE;
}
static void
de_select_selection (PsppireSelector *selector)
{
+ selector->selecting = TRUE;
+
if ( GTK_IS_TREE_VIEW (selector->dest ) )
de_select_selection_tree_view (selector);
else
g_assert_not_reached ();
+ selector->selecting = FALSE;
+
gtk_tree_model_filter_refilter (selector->filtered_source);
g_signal_emit (selector, signals [DE_SELECTED], 0);
g_return_if_fail (selector->select_items);
+ selector->selecting = TRUE;
for (item = g_list_first (selected_rows);
item != NULL;
gtk_tree_model_filter_refilter (selector->filtered_source);
g_signal_emit (selector, signals [SELECTED], 0);
+
+ selector->selecting = FALSE;
}
-/* Callback fro then the source treeview is activated (double clicked) */
+/* Callback for when the source treeview is activated (double clicked) */
static void
on_row_activate (GtkTreeView *tree_view,
GtkTreePath *path,
{
PsppireSelector *selector = list->data;
- if ( selector->filter (childmodel, iter, selector))
- return FALSE;
+ if ( selector->filter && selector->filter (childmodel, iter, selector))
+ return FALSE;
list = list->next;
}
}
+/*
+ Callback for when the destination treeview's data changes
+ */
+static void
+on_dest_data_change (GtkTreeModel *tree_model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ gpointer user_data)
+{
+ PsppireSelector *selector = user_data;
+
+ if ( selector->selecting) return;
+
+ gtk_tree_model_filter_refilter (selector->filtered_source);
+}
+
+
+static void
+on_dest_data_delete (GtkTreeModel *tree_model,
+ GtkTreePath *path,
+ gpointer user_data)
+{
+ PsppireSelector *selector = user_data;
+
+ if ( selector->selecting ) return;
+
+ gtk_tree_model_filter_refilter (selector->filtered_source);
+}
+
+
+
+
/* Set the destination widget to DEST */
static void
set_tree_view_dest (PsppireSelector *selector,
GtkTreeView *dest)
{
GtkTreeSelection* selection = gtk_tree_view_get_selection (dest);
+ GtkTreeModel *model = gtk_tree_view_get_model (dest);
gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
g_signal_connect (selection, "changed", G_CALLBACK (on_dest_treeview_select),
selector);
+
+ g_signal_connect (model, "row-changed", G_CALLBACK (on_dest_data_change),
+ selector);
+
+ g_signal_connect (model, "row-deleted", G_CALLBACK (on_dest_data_delete),
+ selector);
+
}
/* Callback for when the DEST GtkEntry is activated (Enter is pressed) */
SelectItemsFunc *select_func,
FilterItemsFunc *filter_func )
{
+ g_assert(selector);
+
selector->filter = filter_func ;
selector->source = source;
else if ( GTK_IS_ENTRY (dest))
set_entry_dest (selector, GTK_ENTRY (dest));
+ else if (GTK_IS_TEXT_VIEW (dest))
+ {
+ /* Nothing to be done */
+ }
+
else
g_error ("Unsupported destination widget: %s", G_OBJECT_TYPE_NAME (dest));