X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-selector.c;h=dcaac0ce031f9dcb0dd9b2a73584da2d4e506b33;hb=b5a51d1c0bc3eda065002dd505cade85f4d75514;hp=f3f684a16fc1e1e004835926c77ce45c5403e780;hpb=1d5a97ba2afec23855a8294ff2814ab052f6777a;p=pspp-builds.git diff --git a/src/ui/gui/psppire-selector.c b/src/ui/gui/psppire-selector.c index f3f684a1..dcaac0ce 100644 --- a/src/ui/gui/psppire-selector.c +++ b/src/ui/gui/psppire-selector.c @@ -1,10 +1,9 @@ -/* - 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, @@ -13,9 +12,7 @@ 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 . */ /* This module provides a widget, PsppireSelector derived from @@ -68,6 +65,7 @@ #include #include +#include #include static void psppire_selector_base_finalize (PsppireSelectorClass *, gpointer); @@ -561,8 +559,8 @@ is_source_item_visible (GtkTreeModel *childmodel, { 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; } @@ -675,13 +673,15 @@ set_tree_view_dest (PsppireSelector *selector, } -/* Callback for when the DEST GtkEntry is activated (Enter is pressed) */ -static void -on_entry_activate (GtkEntry *w, gpointer data) +/* Callback which causes the filter to be refiltered. + Called when the DEST GtkEntry is activated (Enter is pressed), or when it + looses focus. +*/ +static gboolean +refilter (PsppireSelector *selector) { - PsppireSelector * selector = data; - gtk_tree_model_filter_refilter (selector->filtered_source); + return FALSE; } /* Callback for when the DEST GtkEntry is selected (clicked) */ @@ -695,16 +695,50 @@ on_entry_dest_select (GtkWidget *widget, GdkEventFocus *event, gpointer data) return FALSE; } + + +/* Callback for when an item disappears from the source list. + By implication, this means that the item has been inserted into the + destination. + */ +static void +on_row_deleted (PsppireSelector *selector) +{ + g_signal_emit (selector, signals [SELECTED], 0); +} + +/* Callback for when a new item appears in the source list. + By implication, this means that an item has been deleted from the + destination. + */ +static void +on_row_inserted (PsppireSelector *selector) +{ + g_signal_emit (selector, signals [DE_SELECTED], 0); +} + + + /* Set DEST to be the destination GtkEntry widget */ static void set_entry_dest (PsppireSelector *selector, GtkEntry *dest) { - g_signal_connect (dest, "activate", G_CALLBACK (on_entry_activate), + g_signal_connect_swapped (dest, "activate", G_CALLBACK (refilter), selector); g_signal_connect (dest, "focus-in-event", G_CALLBACK (on_entry_dest_select), selector); + + g_signal_connect_swapped (dest, "focus-out-event", G_CALLBACK (refilter), + selector); + + + g_signal_connect_swapped (selector->filtered_source, "row-deleted", + G_CALLBACK (on_row_deleted), selector); + + g_signal_connect_swapped (selector->filtered_source, "row-inserted", + G_CALLBACK (on_row_inserted), selector); } @@ -717,6 +751,8 @@ psppire_selector_set_subjects (PsppireSelector *selector, SelectItemsFunc *select_func, FilterItemsFunc *filter_func ) { + g_assert(selector); + selector->filter = filter_func ; selector->source = source; @@ -743,6 +779,11 @@ psppire_selector_set_subjects (PsppireSelector *selector, 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));