diff options
author | JP Rosevear <jpr@novell.com> | 2004-10-14 02:37:28 +0800 |
---|---|---|
committer | JP Rosevear <jpr@src.gnome.org> | 2004-10-14 02:37:28 +0800 |
commit | 597b1d90fb83ce367f260f8c4553f76348d8d976 (patch) | |
tree | 5b9c92b037cfe87a7af0525adf3a1215e6c28dcd /widgets/misc | |
parent | 6637268444f29f397df8f90086696500febfa17f (diff) | |
download | gsoc2013-evolution-597b1d90fb83ce367f260f8c4553f76348d8d976.tar.gz gsoc2013-evolution-597b1d90fb83ce367f260f8c4553f76348d8d976.tar.zst gsoc2013-evolution-597b1d90fb83ce367f260f8c4553f76348d8d976.zip |
don't build source selector or source option menu or test programs any
2004-10-13 JP Rosevear <jpr@novell.com>
* Makefile.am: don't build source selector or source option menu
or test programs any more
svn path=/trunk/; revision=27570
Diffstat (limited to 'widgets/misc')
-rw-r--r-- | widgets/misc/.cvsignore | 2 | ||||
-rw-r--r-- | widgets/misc/ChangeLog | 5 | ||||
-rw-r--r-- | widgets/misc/Makefile.am | 31 | ||||
-rw-r--r-- | widgets/misc/e-source-option-menu.c | 307 | ||||
-rw-r--r-- | widgets/misc/e-source-option-menu.h | 64 | ||||
-rw-r--r-- | widgets/misc/e-source-selector.c | 1122 | ||||
-rw-r--r-- | widgets/misc/e-source-selector.h | 82 | ||||
-rw-r--r-- | widgets/misc/test-source-option-menu.c | 88 | ||||
-rw-r--r-- | widgets/misc/test-source-selector.c | 131 |
9 files changed, 7 insertions, 1825 deletions
diff --git a/widgets/misc/.cvsignore b/widgets/misc/.cvsignore index 4bc7214f51..8f7925a69c 100644 --- a/widgets/misc/.cvsignore +++ b/widgets/misc/.cvsignore @@ -12,6 +12,4 @@ test-dateedit test-dropdown-button test-error test-multi-config-dialog -test-source-option-menu -test-source-selector test-title-bar diff --git a/widgets/misc/ChangeLog b/widgets/misc/ChangeLog index ac6b0f6165..d996335373 100644 --- a/widgets/misc/ChangeLog +++ b/widgets/misc/ChangeLog @@ -1,3 +1,8 @@ +2004-10-13 JP Rosevear <jpr@novell.com> + + * Makefile.am: don't build source selector or source option menu + or test programs any more + 2004-10-08 Harry Lu <harry.lu@sun.com> * e-source-selector.c: (e_source_selector_popup_menu), diff --git a/widgets/misc/Makefile.am b/widgets/misc/Makefile.am index 6e1814b88d..fa4c167963 100644 --- a/widgets/misc/Makefile.am +++ b/widgets/misc/Makefile.am @@ -4,7 +4,7 @@ INCLUDES = \ -DMAP_DIR=\""$(imagesdir)"\" \ -DEVOLUTION_PRIVDATADIR=\""$(privdatadir)"\" \ -DG_LOG_DOMAIN=__FILE__ \ - $(SOURCE_SEL_CFLAGS) + $(GNOME_FULL_CFLAGS) privlib_LTLIBRARIES = \ libemiscwidgets.la @@ -41,8 +41,6 @@ widgetsinclude_HEADERS = \ e-map.h \ e-multi-config-dialog.h \ e-search-bar.h \ - e-source-option-menu.h \ - e-source-selector.h \ e-task-bar.h \ e-task-widget.h \ e-title-bar.h \ @@ -72,8 +70,6 @@ libemiscwidgets_la_SOURCES = \ e-map.c \ e-multi-config-dialog.c \ e-search-bar.c \ - e-source-option-menu.c \ - e-source-selector.c \ e-task-bar.c \ e-task-widget.c \ e-title-bar.c \ @@ -90,7 +86,7 @@ errordir = $(privdatadir)/errors libemiscwidgets_la_LIBADD = $(top_builddir)/e-util/libeutil.la \ $(top_builddir)/a11y/widgets/libevolution-widgets-a11y.la \ - $(SOURCE_SEL_LIBS) + $(GNOME_FULL_LIBS) noinst_LTLIBRARIES = libefilterbar.la @@ -104,8 +100,6 @@ noinst_PROGRAMS = \ test-dropdown-button \ test-error \ test-multi-config-dialog \ - test-source-option-menu \ - test-source-selector \ test-title-bar # test-calendar @@ -158,27 +152,6 @@ test_title_bar_LDADD = \ $(top_builddir)/e-util/libeutil.la \ $(GNOME_FULL_LIBS) -# test-source-selector - -test_source_selector_SOURCES = \ - test-source-selector.c - -test_source_selector_LDADD = \ - $(top_builddir)/e-util/libeutil.la \ - ./libemiscwidgets.la \ - $(SOURCE_SEL_LIBS) - - -# test-source-option-menu - -test_source_option_menu_SOURCES = \ - test-source-option-menu.c - -test_source_option_menu_LDADD = \ - $(top_builddir)/e-util/libeutil.la \ - ./libemiscwidgets.la \ - $(SOURCE_SEL_LIBS) - test_error_SOURCES = \ test-error.c diff --git a/widgets/misc/e-source-option-menu.c b/widgets/misc/e-source-option-menu.c deleted file mode 100644 index fd1fd3de1f..0000000000 --- a/widgets/misc/e-source-option-menu.c +++ /dev/null @@ -1,307 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-source-option-menu.c - * - * Copyright (C) 2003 Novell, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 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., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli <ettore@ximian.com> - */ - -#include <config.h> - -#include "e-source-option-menu.h" - -#include "e-util-marshal.h" - -#include <gal/util/e-util.h> - -#include <gtk/gtkmenu.h> -#include <gtk/gtkmenuitem.h> - - -#define PARENT_TYPE gtk_option_menu_get_type () -static GtkOptionMenuClass *parent_class = NULL; - - -/* We set data on each menu item specifying the corresponding ESource using this key. */ -#define MENU_ITEM_SOURCE_DATA_ID "ESourceOptionMenu:Source" - - -struct _ESourceOptionMenuPrivate { - ESourceList *source_list; - - ESource *selected_source; -}; - - -enum { - SOURCE_SELECTED, - NUM_SIGNALS -}; - -static uint signals[NUM_SIGNALS] = { 0 }; - - -/* Selecting a source. */ - -typedef struct { - ESourceOptionMenu *option_menu; - ESource *source; - ESource *found_source; - int i; -} ForeachMenuItemData; - -static void -select_source_foreach_menu_item (GtkWidget *menu_item, - ForeachMenuItemData *data) -{ - ESource *source = gtk_object_get_data (GTK_OBJECT (menu_item), MENU_ITEM_SOURCE_DATA_ID); - - if (data->found_source) - return; - - if (source && e_source_equal (source, data->source)) { - data->found_source = source; - gtk_option_menu_set_history (GTK_OPTION_MENU (data->option_menu), data->i); - } - - data->i ++; -} - -static void -select_source (ESourceOptionMenu *menu, - ESource *source) -{ - ForeachMenuItemData *foreach_data; - - foreach_data = g_new0 (ForeachMenuItemData, 1); - foreach_data->option_menu = menu; - foreach_data->source = source; - - gtk_container_foreach (GTK_CONTAINER (GTK_OPTION_MENU (menu)->menu), - (GtkCallback) select_source_foreach_menu_item, foreach_data); - - if (foreach_data->found_source) { - menu->priv->selected_source = foreach_data->found_source; - g_signal_emit (menu, signals[SOURCE_SELECTED], 0, foreach_data->found_source); - } - - g_free (foreach_data); -} - - -/* Menu callback. */ - -static void -menu_item_activate_callback (GtkMenuItem *menu_item, - ESourceOptionMenu *option_menu) -{ - ESource *source = gtk_object_get_data (GTK_OBJECT (menu_item), MENU_ITEM_SOURCE_DATA_ID); - - if (source != NULL) - select_source (option_menu, source); -} - - -/* Functions to keep the menu in sync with the ESourceList. */ - -static void -populate (ESourceOptionMenu *option_menu) -{ - GtkWidget *menu = gtk_menu_new (); - GSList *groups = e_source_list_peek_groups (option_menu->priv->source_list); - GSList *p; - ESource *first_source = NULL; - int first_source_item = -1; - int selected_item = -1; - int i; - - i = 0; - for (p = groups; p != NULL; p = p->next) { - ESourceGroup *group = E_SOURCE_GROUP (p->data); - GtkWidget *item = gtk_menu_item_new_with_label (e_source_group_peek_name (group)); - GSList *q; - - gtk_widget_set_sensitive (item, FALSE); - gtk_widget_show (item); - gtk_menu_append (GTK_MENU (menu), item); - - i ++; - - for (q = e_source_group_peek_sources (group); q != NULL; q = q->next) { - ESource *source = E_SOURCE (q->data); - char *label = g_strconcat (" ", e_source_peek_name (source), NULL); - GtkWidget *item = gtk_menu_item_new_with_label (label); - - gtk_object_set_data_full (GTK_OBJECT (item), MENU_ITEM_SOURCE_DATA_ID, source, - (GtkDestroyNotify) g_object_unref); - g_object_ref (source); - - g_signal_connect (item, "activate", G_CALLBACK (menu_item_activate_callback), option_menu); - - gtk_widget_show (item); - gtk_menu_append (GTK_MENU (menu), item); - - if (first_source_item == -1) { - first_source_item = i; - first_source = source; - } - - if (source == option_menu->priv->selected_source) - selected_item = i; - - i ++; - } - } - - gtk_option_menu_set_menu (GTK_OPTION_MENU (option_menu), menu); - - if (selected_item != -1) { - gtk_option_menu_set_history (GTK_OPTION_MENU (option_menu), selected_item); - } else { - if (option_menu->priv->selected_source != NULL) - g_object_unref (option_menu->priv->selected_source); - option_menu->priv->selected_source = first_source; - if (option_menu->priv->selected_source != NULL) - g_object_ref (option_menu->priv->selected_source); - - gtk_option_menu_set_history (GTK_OPTION_MENU (option_menu), first_source_item); - } -} - - -static void -source_list_changed_callback (ESourceList *list, - ESourceOptionMenu *menu) -{ - populate (menu); -} - -static void -connect_signals (ESourceOptionMenu *menu) -{ - g_signal_connect_object (menu->priv->source_list, "changed", - G_CALLBACK (source_list_changed_callback), G_OBJECT (menu), 0); -} - - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - ESourceOptionMenuPrivate *priv = E_SOURCE_OPTION_MENU (object)->priv; - - if (priv->source_list != NULL) { - g_object_unref (priv->source_list); - priv->source_list = NULL; - } - - if (priv->selected_source != NULL) { - g_object_unref (priv->selected_source); - priv->selected_source = NULL; - } - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - ESourceOptionMenuPrivate *priv = E_SOURCE_OPTION_MENU (object)->priv; - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -/* Initialization. */ - -static void -class_init (ESourceOptionMenuClass *class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (class); - - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - parent_class = g_type_class_peek_parent (class); - - signals[SOURCE_SELECTED] = - g_signal_new ("source_selected", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ESourceOptionMenuClass, source_selected), - NULL, NULL, - e_util_marshal_VOID__POINTER, - G_TYPE_NONE, 1, - G_TYPE_POINTER); -} - -static void -init (ESourceOptionMenu *source_option_menu) -{ - ESourceOptionMenuPrivate *priv; - - priv = g_new0 (ESourceOptionMenuPrivate, 1); - - source_option_menu->priv = priv; -} - - -/* Public methods. */ - -GtkWidget * -e_source_option_menu_new (ESourceList *source_list) -{ - ESourceOptionMenu *menu; - - g_return_val_if_fail (E_IS_SOURCE_LIST (source_list), NULL); - - menu = g_object_new (e_source_option_menu_get_type (), NULL); - - menu->priv->source_list = source_list; - g_object_ref (source_list); - - connect_signals (menu); - populate (menu); - - return GTK_WIDGET (menu); -} - - -ESource * -e_source_option_menu_peek_selected (ESourceOptionMenu *menu) -{ - g_return_val_if_fail (E_IS_SOURCE_OPTION_MENU (menu), NULL); - - return menu->priv->selected_source; -} - - -void -e_source_option_menu_select (ESourceOptionMenu *menu, - ESource *source) -{ - g_return_if_fail (E_IS_SOURCE_OPTION_MENU (menu)); - g_return_if_fail (E_IS_SOURCE (source)); - - select_source (menu, source); -} - - -E_MAKE_TYPE (e_source_option_menu, "ESourceOptionMenu", ESourceOptionMenu, class_init, init, PARENT_TYPE) diff --git a/widgets/misc/e-source-option-menu.h b/widgets/misc/e-source-option-menu.h deleted file mode 100644 index 74a85d629e..0000000000 --- a/widgets/misc/e-source-option-menu.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-source-option-menu.h - * - * Copyright (C) 2003 Novell, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 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., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli <ettore@ximian.com> - */ - -#ifndef _E_SOURCE_OPTION_MENU_H_ -#define _E_SOURCE_OPTION_MENU_H_ - -#include <libedataserver/e-source-list.h> - -#include <gtk/gtkoptionmenu.h> - -#define E_TYPE_SOURCE_OPTION_MENU (e_source_option_menu_get_type ()) -#define E_SOURCE_OPTION_MENU(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_SOURCE_OPTION_MENU, ESourceOptionMenu)) -#define E_SOURCE_OPTION_MENU_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_SOURCE_OPTION_MENU, ESourceOptionMenuClass)) -#define E_IS_SOURCE_OPTION_MENU(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_SOURCE_OPTION_MENU)) -#define E_IS_SOURCE_OPTION_MENU_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_SOURCE_OPTION_MENU)) - - -typedef struct _ESourceOptionMenu ESourceOptionMenu; -typedef struct _ESourceOptionMenuPrivate ESourceOptionMenuPrivate; -typedef struct _ESourceOptionMenuClass ESourceOptionMenuClass; - -struct _ESourceOptionMenu { - GtkOptionMenu parent; - - ESourceOptionMenuPrivate *priv; -}; - -struct _ESourceOptionMenuClass { - GtkOptionMenuClass parent_class; - - void (* source_selected) (ESourceOptionMenu *menu, - ESource *selected_source); -}; - - -GType e_source_option_menu_get_type (void); - -GtkWidget *e_source_option_menu_new (ESourceList *list); - -ESource *e_source_option_menu_peek_selected (ESourceOptionMenu *menu); -void e_source_option_menu_select (ESourceOptionMenu *menu, - ESource *source); - - -#endif /* _E_SOURCE_OPTION_MENU_H_ */ diff --git a/widgets/misc/e-source-selector.c b/widgets/misc/e-source-selector.c deleted file mode 100644 index 60d4fc9a0f..0000000000 --- a/widgets/misc/e-source-selector.c +++ /dev/null @@ -1,1122 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-source-selector.c - * - * Copyright (C) 2003 Ximian, Inc. - * - * 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 (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 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., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli <ettore@ximian.com> - */ - -#include <config.h> - -#include "e-source-selector.h" - -#include "e-util-marshal.h" - -#include <gal/util/e-util.h> - -#include <gtk/gtkmenu.h> -#include <gtk/gtktreeselection.h> -#include <gtk/gtktreestore.h> -#include <gtk/gtkcellrenderertoggle.h> -#include <gtk/gtkcellrenderertext.h> -#include <gtk/gtkcellrendererpixbuf.h> - -#define PARENT_TYPE gtk_tree_view_get_type () -static GtkTreeViewClass *parent_class = NULL; - - -struct _ESourceSelectorPrivate { - ESourceList *list; - - GtkTreeStore *tree_store; - - GHashTable *selected_sources; - GtkTreeRowReference *saved_primary_selection; - - int rebuild_model_idle_id; - - gboolean toggled_last; - gboolean checkboxes_shown; - gboolean select_new; -}; - -typedef struct { - ESourceSelector *selector; - - GHashTable *remaining_uids; - GSList *deleted_uids; - - gboolean selection_changed; -} ESourceSelectorRebuildData; - -enum { - SELECTION_CHANGED, - PRIMARY_SELECTION_CHANGED, - POPUP_EVENT, - NUM_SIGNALS -}; -static unsigned int signals[NUM_SIGNALS] = { 0 }; - - -/* Selection management. */ - -static GHashTable * -create_selected_sources_hash (void) -{ - return g_hash_table_new_full (g_direct_hash, g_direct_equal, - (GDestroyNotify) g_object_unref, NULL); -} - -static ESourceSelectorRebuildData * -create_rebuild_data (ESourceSelector *selector) -{ - ESourceSelectorRebuildData *rebuild_data; - - rebuild_data = g_new0 (ESourceSelectorRebuildData, 1); - - rebuild_data->selector = selector; - rebuild_data->remaining_uids = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, - (GDestroyNotify) gtk_tree_row_reference_free); - rebuild_data->deleted_uids = NULL; - - return rebuild_data; -} - - -static void -free_rebuild_data (ESourceSelectorRebuildData *rebuild_data) -{ - GSList *p; - - g_hash_table_destroy (rebuild_data->remaining_uids); - for (p = rebuild_data->deleted_uids; p; p = p->next) - gtk_tree_row_reference_free (p->data); - g_slist_free (rebuild_data->deleted_uids); - - g_free (rebuild_data); -} - -static void -clear_saved_primary_selection (ESourceSelector *selector) -{ - if (selector->priv->saved_primary_selection != NULL) { - gtk_tree_row_reference_free (selector->priv->saved_primary_selection); - selector->priv->saved_primary_selection = NULL; - } -} - -static gboolean -source_is_selected (ESourceSelector *selector, - ESource *source) -{ - if (g_hash_table_lookup (selector->priv->selected_sources, source) == NULL) - return FALSE; - else - return TRUE; -} - -static void -select_source (ESourceSelector *selector, - ESource *source) -{ - if (g_hash_table_lookup (selector->priv->selected_sources, source) != NULL) - return; - - g_hash_table_insert (selector->priv->selected_sources, source, source); - g_object_ref (source); -} - -static void -unselect_source (ESourceSelector *selector, - ESource *source) -{ - if (g_hash_table_lookup (selector->priv->selected_sources, source) == NULL) - return; - - /* (This will unref the source.) */ - g_hash_table_remove (selector->priv->selected_sources, source); -} - -static gboolean -find_source_iter (ESourceSelector *selector, ESource *source, GtkTreeIter *parent_iter, GtkTreeIter *source_iter) -{ - GtkTreeModel *model = GTK_TREE_MODEL (selector->priv->tree_store); - - if (gtk_tree_model_get_iter_first (model, parent_iter)) { - do { - if (gtk_tree_model_iter_children (model, source_iter, parent_iter)) { - do { - void *data; - - gtk_tree_model_get (model, source_iter, 0, &data, -1); - g_assert (E_IS_SOURCE (data)); - - if (E_SOURCE (data) == source) { - g_object_unref (data); - - return TRUE; - } - - g_object_unref (data); - } while (gtk_tree_model_iter_next (model, source_iter)); - } - } while (gtk_tree_model_iter_next (model, parent_iter)); - } - - return FALSE; -} - -/* Setting up the model. */ -static gboolean -rebuild_existing_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) -{ - ESourceSelectorRebuildData *rebuild_data = data; - void *node; - const char *uid; - - gtk_tree_model_get (model, iter, 0, &node, -1); - - if (E_IS_SOURCE_GROUP (node)) { - uid = e_source_group_peek_uid (E_SOURCE_GROUP (node)); - - if (e_source_list_peek_group_by_uid (rebuild_data->selector->priv->list, uid)) { - g_hash_table_insert (rebuild_data->remaining_uids, g_strdup (uid), - gtk_tree_row_reference_new (model, path)); - } else { - rebuild_data->deleted_uids = g_slist_prepend (rebuild_data->deleted_uids, - gtk_tree_row_reference_new (model, path)); - } - } else { - uid = e_source_peek_uid (E_SOURCE (node)); - if (e_source_list_peek_source_by_uid (rebuild_data->selector->priv->list, uid)) { - g_hash_table_insert (rebuild_data->remaining_uids, g_strdup (uid), - gtk_tree_row_reference_new (model, path)); - } else { - rebuild_data->deleted_uids = g_slist_prepend (rebuild_data->deleted_uids, - gtk_tree_row_reference_new (model, path)); - - if (g_hash_table_remove (rebuild_data->selector->priv->selected_sources, node)) - rebuild_data->selection_changed = TRUE; - } - } - - g_object_unref (node); - - return FALSE; -} - -static void -rebuild_model (ESourceSelector *selector) -{ - ESourceSelectorRebuildData *rebuild_data; - GtkTreeStore *tree_store; - GtkTreeIter iter; - GSList *groups, *p; - gboolean set_primary; - - tree_store = selector->priv->tree_store; - - rebuild_data = create_rebuild_data (selector); - set_primary = e_source_selector_peek_primary_selection (selector) != NULL; - - /* Remove any delete sources or groups */ - gtk_tree_model_foreach (GTK_TREE_MODEL (tree_store), rebuild_existing_cb, rebuild_data); - for (p = rebuild_data->deleted_uids; p; p = p->next) { - GtkTreeRowReference *row_ref = p->data; - GtkTreePath *path; - - path = gtk_tree_row_reference_get_path (row_ref); - gtk_tree_model_get_iter (GTK_TREE_MODEL (tree_store), &iter, path); - gtk_tree_store_remove (tree_store, &iter); - - gtk_tree_path_free (path); - } - - /* Add new sources/groups or call row_changed in case they were renamed */ - groups = e_source_list_peek_groups (selector->priv->list); - for (p = groups; p != NULL; p = p->next) { - ESourceGroup *group = E_SOURCE_GROUP (p->data); - GSList *sources, *q; - GtkTreeRowReference *row_ref; - - row_ref = g_hash_table_lookup (rebuild_data->remaining_uids, e_source_group_peek_uid (group)); - if (!row_ref) { - gtk_tree_store_append (GTK_TREE_STORE (tree_store), &iter, NULL); - gtk_tree_store_set (GTK_TREE_STORE (tree_store), &iter, 0, group, -1); - } else { - GtkTreePath *path; - - path = gtk_tree_row_reference_get_path (row_ref); - gtk_tree_model_get_iter (GTK_TREE_MODEL (tree_store), &iter, path); - - gtk_tree_model_row_changed (GTK_TREE_MODEL (tree_store), path, &iter); - - gtk_tree_path_free (path); - } - - sources = e_source_group_peek_sources (group); - for (q = sources; q != NULL; q = q->next) { - ESource *source = E_SOURCE (q->data); - GtkTreeIter child_iter; - - row_ref = g_hash_table_lookup (rebuild_data->remaining_uids, e_source_peek_uid (source)); - if (!row_ref) { - if (selector->priv->select_new) { - select_source (selector, source); - rebuild_data->selection_changed = TRUE; - } - gtk_tree_store_append (GTK_TREE_STORE (tree_store), &child_iter, &iter); - gtk_tree_store_set (GTK_TREE_STORE (tree_store), &child_iter, 0, source, -1); - - } else { - GtkTreePath *path; - - path = gtk_tree_row_reference_get_path (row_ref); - gtk_tree_model_get_iter (GTK_TREE_MODEL (tree_store), &child_iter, path); - - gtk_tree_model_row_changed (GTK_TREE_MODEL (tree_store), path, &child_iter); - - gtk_tree_path_free (path); - } - } - } - - if (rebuild_data->selection_changed) - g_signal_emit (selector, signals[SELECTION_CHANGED], 0); - - if (set_primary && !e_source_selector_peek_primary_selection (selector)) - e_source_selector_set_primary_selection (selector, e_source_list_peek_source_any (selector->priv->list)); - - free_rebuild_data (rebuild_data); -} - -static int -on_idle_rebuild_model_callback (ESourceSelector *selector) -{ - rebuild_model (selector); - selector->priv->rebuild_model_idle_id = 0; - - return FALSE; -} - -static void -list_changed_callback (ESourceList *list, - ESourceSelector *selector) -{ - ESourceSelectorPrivate *priv = selector->priv; - - if (priv->rebuild_model_idle_id == 0) - priv->rebuild_model_idle_id = g_idle_add ((GSourceFunc) on_idle_rebuild_model_callback, - selector); -} - -static void -setup_model (ESourceSelector *selector) -{ - rebuild_model (selector); - - g_signal_connect_object (selector->priv->list, "changed", G_CALLBACK (list_changed_callback), G_OBJECT (selector), 0); -} - - -/* Data functions for rendering the model. */ - -static void -toggle_cell_data_func (GtkTreeViewColumn *column, - GtkCellRenderer *renderer, - GtkTreeModel *model, - GtkTreeIter *iter, - ESourceSelector *selector) -{ - void *data; - - gtk_tree_model_get (model, iter, 0, &data, -1); - - if (E_IS_SOURCE_GROUP (data)) { - g_object_set (renderer, "visible", FALSE, NULL); - } else { - g_assert (E_IS_SOURCE (data)); - - g_object_set (renderer, "visible", selector->priv->checkboxes_shown, NULL); - if (source_is_selected (selector, E_SOURCE (data))) - g_object_set (renderer, "active", TRUE, NULL); - else - g_object_set (renderer, "active", FALSE, NULL); - } - - g_object_unref (data); -} - -static void -text_cell_data_func (GtkTreeViewColumn *column, - GtkCellRenderer *renderer, - GtkTreeModel *model, - GtkTreeIter *iter, - ESourceSelector *selector) -{ - void *data; - - gtk_tree_model_get (model, iter, 0, &data, -1); - - if (E_IS_SOURCE_GROUP (data)) { - g_object_set (renderer, - "text", e_source_group_peek_name (E_SOURCE_GROUP (data)), - "weight", PANGO_WEIGHT_BOLD, - "foreground_set", FALSE, - NULL); - } else { - ESource *source; - - g_assert (E_IS_SOURCE (data)); - source = E_SOURCE (data); - - g_object_set (renderer, - "text", e_source_peek_name (source), - "weight", PANGO_WEIGHT_NORMAL, - "foreground_set", FALSE, - NULL); - } - - g_object_unref (data); -} - -static void -pixbuf_cell_data_func (GtkTreeViewColumn *column, - GtkCellRenderer *renderer, - GtkTreeModel *model, - GtkTreeIter *iter, - ESourceSelector *selector) -{ - void *data; - - gtk_tree_model_get (model, iter, 0, &data, -1); - - if (E_IS_SOURCE_GROUP (data)) { - g_object_set (renderer, - "visible", FALSE, - NULL); - } else { - ESource *source; - guint32 color; - GdkPixbuf *pixbuf = NULL; - - g_assert (E_IS_SOURCE (data)); - source = E_SOURCE (data); - - if (e_source_get_color (source, &color)) { - pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, 16, 16); - gdk_pixbuf_fill (pixbuf, color << 8); - } - - g_object_set (renderer, - "visible", pixbuf != NULL, - "pixbuf", pixbuf, - NULL); - - if (pixbuf) - g_object_unref (pixbuf); - } - - g_object_unref (data); -} - -/* Custom selection function to make groups non selectable. */ -static gboolean -selection_func (GtkTreeSelection *selection, - GtkTreeModel *model, - GtkTreePath *path, - gboolean path_currently_selected, - ESourceSelector *selector) -{ - GtkTreeIter iter; - void *data; - - if (selector->priv->toggled_last) { - selector->priv->toggled_last = FALSE; - - return FALSE; - } - - if (path_currently_selected) - return TRUE; - - if (! gtk_tree_model_get_iter (model, &iter, path)) - return FALSE; - - - gtk_tree_model_get (model, &iter, 0, &data, -1); - if (E_IS_SOURCE_GROUP (data)) { - g_object_unref (data); - - return FALSE; - } - - clear_saved_primary_selection (selector); - g_object_unref (data); - - return TRUE; -} - - -/* Callbacks. */ - -static void -cell_toggled_callback (GtkCellRendererToggle *renderer, - const char *path_string, - ESourceSelector *selector) -{ - GtkTreeModel *model = GTK_TREE_MODEL (selector->priv->tree_store); - GtkTreePath *path = gtk_tree_path_new_from_string (path_string); - GtkTreeIter iter; - ESource *source; - void *data; - - if (! gtk_tree_model_get_iter (model, &iter, path)) { - gtk_tree_path_free (path); - return; - } - - gtk_tree_model_get (model, &iter, 0, &data, -1); - if (!E_IS_SOURCE_GROUP (data)) { - source = E_SOURCE (data); - - if (source_is_selected (selector, source)) - unselect_source (selector, source); - else - select_source (selector, source); - - selector->priv->toggled_last = TRUE; - - gtk_tree_model_row_changed (model, path, &iter); - g_signal_emit (selector, signals[SELECTION_CHANGED], 0); - } - - gtk_tree_path_free (path); - - g_object_unref (data); -} - -static void -selection_changed_callback (GtkTreeSelection *selection, - ESourceSelector *selector) -{ - g_signal_emit (selector, signals[PRIMARY_SELECTION_CHANGED], 0); -} - -static gboolean -test_collapse_row_callback (GtkTreeView *treeview, GtkTreeIter *iter, GtkTreePath *path, gpointer data) -{ - ESourceSelector *selector = data; - ESourceSelectorPrivate *priv; - GtkTreeIter child_iter; - - priv = selector->priv; - - /* Clear this because something else has been clicked on now */ - priv->toggled_last = FALSE; - - if (priv->saved_primary_selection) - return FALSE; - - if (!gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (selector)), NULL, &child_iter)) - return FALSE; - - if (gtk_tree_store_is_ancestor (priv->tree_store, iter, &child_iter)) { - GtkTreePath *child_path; - - child_path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->tree_store), &child_iter); - priv->saved_primary_selection = gtk_tree_row_reference_new (GTK_TREE_MODEL (priv->tree_store), child_path); - gtk_tree_path_free (child_path); - } - - return FALSE; -} - -static gboolean -row_expanded_callback (GtkTreeView *treeview, GtkTreeIter *iter, GtkTreePath *path, gpointer data) -{ - ESourceSelector *selector = data; - ESourceSelectorPrivate *priv; - GtkTreePath *child_path; - GtkTreeIter child_iter; - - priv = selector->priv; - - if (!priv->saved_primary_selection) - return FALSE; - - child_path = gtk_tree_row_reference_get_path (priv->saved_primary_selection); - gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->tree_store), &child_iter, child_path); - - if (gtk_tree_store_is_ancestor (priv->tree_store, iter, &child_iter)) { - GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (selector)); - - gtk_tree_selection_select_iter (selection, &child_iter); - clear_saved_primary_selection (selector); - } - - gtk_tree_path_free (child_path); - - return FALSE; -} - -static gboolean -selector_button_press_event (GtkWidget *widget, GdkEventButton *event, ESourceSelector *selector) -{ - ESourceSelectorPrivate *priv = selector->priv; - GtkTreePath *path; - ESource *source = NULL; - gboolean res = FALSE; - - priv->toggled_last = FALSE; - - /* only process right-clicks */ - if (event->button != 3 || event->type != GDK_BUTTON_PRESS) - return FALSE; - - /* Get the source/group */ - if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget), event->x, event->y, &path, NULL, NULL, NULL)) { - GtkTreeIter iter; - gpointer data; - - if (gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->tree_store), &iter, path)) { - gtk_tree_model_get (GTK_TREE_MODEL (priv->tree_store), &iter, 0, &data, -1); - - /* TODO: we could still emit a popup event for this and let the callee decide? */ - if (E_IS_SOURCE_GROUP (data)) { - g_object_unref (data); - - return FALSE; - } - - source = E_SOURCE (data); - } - } - - if (source) - e_source_selector_set_primary_selection (selector, source); - - g_signal_emit(selector, signals[POPUP_EVENT], 0, source, event, &res); - - if (source) - g_object_unref (source); - - return res; -} - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - ESourceSelectorPrivate *priv = E_SOURCE_SELECTOR (object)->priv; - - if (priv->selected_sources != NULL) { - g_hash_table_destroy (priv->selected_sources); - priv->selected_sources = NULL; - } - - if (priv->rebuild_model_idle_id != 0) { - g_source_remove (priv->rebuild_model_idle_id); - priv->rebuild_model_idle_id = 0; - } - - if (priv->list != NULL) { - g_object_unref (priv->list); - priv->list = NULL; - } - - if (priv->tree_store != NULL) { - g_object_unref (priv->tree_store); - priv->tree_store = NULL; - } - - clear_saved_primary_selection (E_SOURCE_SELECTOR (object)); - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - ESourceSelectorPrivate *priv = E_SOURCE_SELECTOR (object)->priv; - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - -static gboolean -e_source_selector_popup_menu (GtkWidget *widget) -{ - ESourceSelector *selector = E_SOURCE_SELECTOR (widget); - ESource *source = e_source_selector_peek_primary_selection (selector); - gboolean res = FALSE; - - if (source) { - g_object_ref (source); - g_signal_emit (selector, signals[POPUP_EVENT], 0, source, NULL, &res); - g_object_unref (source); - } - - return res; -} - -/* Initialization. */ -static gboolean -ess_bool_accumulator(GSignalInvocationHint *ihint, GValue *out, const GValue *in, void *data) -{ - gboolean val = g_value_get_boolean(in); - - g_value_set_boolean(out, val); - - return !val; -} - -static void -class_init (ESourceSelectorClass *class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (class); - GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); - - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - widget_class->popup_menu = e_source_selector_popup_menu; - - parent_class = g_type_class_peek_parent (class); - - signals[SELECTION_CHANGED] = - g_signal_new ("selection_changed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ESourceSelectorClass, selection_changed), - NULL, NULL, - e_util_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - signals[PRIMARY_SELECTION_CHANGED] = - g_signal_new ("primary_selection_changed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ESourceSelectorClass, primary_selection_changed), - NULL, NULL, - e_util_marshal_VOID__VOID, - G_TYPE_NONE, 0); - signals[POPUP_EVENT] = - g_signal_new ("popup_event", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ESourceSelectorClass, popup_event), - ess_bool_accumulator, NULL, - e_util_marshal_BOOLEAN__OBJECT_BOXED, - G_TYPE_BOOLEAN, 2, G_TYPE_OBJECT, - GDK_TYPE_EVENT|G_SIGNAL_TYPE_STATIC_SCOPE); -} - -static void -init (ESourceSelector *selector) -{ - ESourceSelectorPrivate *priv; - GtkTreeViewColumn *column; - GtkCellRenderer *cell_renderer; - GtkTreeSelection *selection; - - priv = g_new0 (ESourceSelectorPrivate, 1); - selector->priv = priv; - - g_signal_connect (G_OBJECT (selector), "button_press_event", - G_CALLBACK (selector_button_press_event), selector); - - priv->toggled_last = FALSE; - priv->checkboxes_shown = TRUE; - priv->select_new = FALSE; - - priv->selected_sources = create_selected_sources_hash (); - - priv->tree_store = gtk_tree_store_new (1, G_TYPE_OBJECT); - gtk_tree_view_set_model (GTK_TREE_VIEW (selector), GTK_TREE_MODEL (priv->tree_store)); - - column = gtk_tree_view_column_new (); - gtk_tree_view_append_column (GTK_TREE_VIEW (selector), column); - - cell_renderer = gtk_cell_renderer_pixbuf_new (); - g_object_set (G_OBJECT (cell_renderer), "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, NULL); - gtk_tree_view_column_pack_start (column, cell_renderer, FALSE); - gtk_tree_view_column_set_cell_data_func (column, cell_renderer, (GtkTreeCellDataFunc) pixbuf_cell_data_func, selector, NULL); - cell_renderer = gtk_cell_renderer_toggle_new (); - gtk_tree_view_column_pack_start (column, cell_renderer, FALSE); - gtk_tree_view_column_set_cell_data_func (column, cell_renderer, (GtkTreeCellDataFunc) toggle_cell_data_func, selector, NULL); - g_signal_connect (cell_renderer, "toggled", G_CALLBACK (cell_toggled_callback), selector); - - cell_renderer = gtk_cell_renderer_text_new (); - g_object_set (G_OBJECT (cell_renderer), "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, NULL); - gtk_tree_view_column_pack_start (column, cell_renderer, TRUE); - gtk_tree_view_column_set_cell_data_func (column, cell_renderer, (GtkTreeCellDataFunc) text_cell_data_func, selector, NULL); - - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (selector)); - gtk_tree_selection_set_select_function (selection, (GtkTreeSelectionFunc) selection_func, selector, NULL); - g_signal_connect_object (selection, "changed", G_CALLBACK (selection_changed_callback), G_OBJECT (selector), 0); - - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (selector), FALSE); - - g_signal_connect (G_OBJECT (selector), "test-collapse-row", G_CALLBACK (test_collapse_row_callback), selector); - g_signal_connect (G_OBJECT (selector), "row-expanded", G_CALLBACK (row_expanded_callback), selector); -} - - -/* Public API. */ - -/** - * e_source_selector_new: - * @list: A source list. - * - * Create a new view for @list. The view will update automatically when @list - * changes. - * - * Return value: The newly created widget. - **/ -GtkWidget * -e_source_selector_new (ESourceList *list) -{ - ESourceSelector *selector; - - g_return_val_if_fail (E_IS_SOURCE_LIST (list), NULL); - - selector = g_object_new (e_source_selector_get_type (), NULL); - - selector->priv->list = list; - g_object_ref (list); - - setup_model (selector); - - gtk_tree_view_expand_all (GTK_TREE_VIEW (selector)); - - return GTK_WIDGET (selector); -} - - -/** - * e_source_selector_get_selection: - * @selector: - * - * Get the list of selected sources, i.e. those that were enabled through the - * corresponding checkboxes in the tree. - * - * Return value: A list of the ESources currently selected. The sources will - * be in the same order as they appear on the screen, and the list should be - * freed using e_source_selector_free_selection(). - **/ -GSList * -e_source_selector_get_selection (ESourceSelector *selector) -{ - GSList *selection_list; - GSList *groups; - GSList *p; - - g_return_val_if_fail (E_IS_SOURCE_SELECTOR (selector), NULL); - - selection_list = NULL; - - groups = e_source_list_peek_groups (selector->priv->list); - for (p = groups; p != NULL; p = p->next) { - ESourceGroup *group = E_SOURCE_GROUP (p->data); - GSList *sources; - GSList *q; - - sources = e_source_group_peek_sources (group); - for (q = sources; q != NULL; q = q->next) { - ESource *source = E_SOURCE (q->data); - - if (source_is_selected (selector, source)) { - selection_list = g_slist_prepend (selection_list, source); - g_object_ref (source); - } - } - } - - return g_slist_reverse (selection_list); -} - -/** - * e_source_list_free_selection: - * @list: A selection list returned by e_source_selector_get_selection(). - * - * Free the selection list. - **/ -void -e_source_selector_free_selection (GSList *list) -{ - g_slist_foreach (list, (GFunc) g_object_unref, NULL); - g_slist_free (list); -} - - -/** - * e_source_selector_show_selection: - * @selector: An ESourceSelector widget - * - * Specify whether the checkboxes in the ESourceSelector should be shown or - * not. - **/ -void -e_source_selector_show_selection (ESourceSelector *selector, - gboolean show) -{ - g_return_if_fail (E_IS_SOURCE_SELECTOR (selector)); - - show = !! show; - if (show == selector->priv->checkboxes_shown) - return; - - selector->priv->checkboxes_shown = show; - - gtk_tree_model_foreach (GTK_TREE_MODEL (selector->priv->tree_store), - (GtkTreeModelForeachFunc) gtk_tree_model_row_changed, - NULL); -} - -/** - * e_source_selector_selection_shown: - * @selector: - * - * Check whether the checkboxes in the ESourceSelector are being shown or not. - * - * Return value: %TRUE if the checkboxes are shown, %FALSE otherwise. - **/ -gboolean -e_source_selector_selection_shown (ESourceSelector *selector) -{ - g_return_val_if_fail (E_IS_SOURCE_SELECTOR (selector), FALSE); - - return selector->priv->checkboxes_shown; -} - -/** - * e_source_selector_set_select_new: - * @selector: An ESourceSelector widget - * @state: A gboolean - * - * Set whether or not to select new sources added to @selector. - **/ -void -e_source_selector_set_select_new (ESourceSelector *selector, gboolean state) -{ - g_return_if_fail (E_IS_SOURCE_SELECTOR (selector)); - - selector->priv->select_new = state; -} - -/** - * e_source_selector_select_source: - * @selector: An ESourceSelector widget - * @source: An ESource. - * - * Select @source in @selector. - **/ -void -e_source_selector_select_source (ESourceSelector *selector, - ESource *source) -{ - GtkTreeIter parent_iter, source_iter; - - g_return_if_fail (E_IS_SOURCE_SELECTOR (selector)); - g_return_if_fail (E_IS_SOURCE (source)); - - if (source_is_selected (selector, source)) - return; - - select_source (selector, source); - - if (find_source_iter (selector, source, &parent_iter, &source_iter)) { - GtkTreeModel *model = GTK_TREE_MODEL (selector->priv->tree_store); - GtkTreePath *path; - - path = gtk_tree_model_get_path (model, &source_iter); - gtk_tree_model_row_changed (model, path, &source_iter); - gtk_tree_path_free (path); - - g_signal_emit (selector, signals[SELECTION_CHANGED], 0); - } -} - -/** - * e_source_selector_unselect_source: - * @selector: An ESourceSelector widget - * @source: An ESource. - * - * Unselect @source in @selector. - **/ -void -e_source_selector_unselect_source (ESourceSelector *selector, - ESource *source) -{ - GtkTreeIter parent_iter, source_iter; - - g_return_if_fail (E_IS_SOURCE_SELECTOR (selector)); - g_return_if_fail (E_IS_SOURCE (source)); - - if (! source_is_selected (selector, source)) - return; - - unselect_source (selector, source); - - if (find_source_iter (selector, source, &parent_iter, &source_iter)) { - GtkTreeModel *model = GTK_TREE_MODEL (selector->priv->tree_store); - GtkTreePath *path; - - path = gtk_tree_model_get_path (model, &source_iter); - gtk_tree_model_row_changed (model, path, &source_iter); - gtk_tree_path_free (path); - - g_signal_emit (selector, signals[SELECTION_CHANGED], 0); - } -} - -/** - * e_source_selector_source_is_selected: - * @selector: An ESourceSelector widget - * @source: An ESource. - * - * Check whether @source is selected in @selector. - * - * Return value: %TRUE if @source is currently selected, %FALSE otherwise. - **/ -gboolean -e_source_selector_source_is_selected (ESourceSelector *selector, - ESource *source) -{ - g_return_val_if_fail (E_IS_SOURCE_SELECTOR (selector), FALSE); - g_return_val_if_fail (E_IS_SOURCE (source), FALSE); - - return source_is_selected (selector, source); -} - -/** - * e_source_selector_peek_primary_selection: - * @selector: An ESourceSelector widget - * - * Get the primary selected source. The primary selection is the one that is - * highlighted through the normal GtkTreeView selection mechanism (as opposed - * to the "normal" selection, which is the set of source whose checkboxes are - * checked). - * - * Return value: The selected source. - **/ -ESource * -e_source_selector_peek_primary_selection (ESourceSelector *selector) -{ - GtkTreeModel *model; - GtkTreeIter iter; - gboolean have_iter = FALSE; - void *data = NULL; - - g_return_val_if_fail (E_IS_SOURCE_SELECTOR (selector), NULL); - - model = GTK_TREE_MODEL (selector->priv->tree_store); - - if (selector->priv->saved_primary_selection) { - GtkTreePath *child_path; - - child_path = gtk_tree_row_reference_get_path (selector->priv->saved_primary_selection); - if (child_path) { - if (gtk_tree_model_get_iter (GTK_TREE_MODEL (selector->priv->tree_store), &iter, child_path)) - have_iter = TRUE; - gtk_tree_path_free (child_path); - } - } - - if (!have_iter && ! gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (selector)), NULL, &iter)) - return NULL; - - gtk_tree_model_get (model, &iter, 0, &data, -1); - if (!data) - return NULL; - - if (! E_IS_SOURCE (data)) { - g_object_unref (data); - - return NULL; - } - - g_object_unref (data); - - return E_SOURCE (data); -} - -/** - * e_source_selector_set_primary_selection: - * @selector: An ESourceSelector widget - * @source: Source to select - * - * Set the primary selected source. - **/ -void -e_source_selector_set_primary_selection (ESourceSelector *selector, ESource *source) -{ - ESourceSelectorPrivate *priv; - GtkTreeIter parent_iter, source_iter; - - g_return_if_fail (selector != NULL); - g_return_if_fail (E_IS_SOURCE_SELECTOR (selector)); - g_return_if_fail (source != NULL); - g_return_if_fail (E_IS_SOURCE (source)); - - priv = selector->priv; - - if (find_source_iter (selector, source, &parent_iter, &source_iter)) { - GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (selector)); - GtkTreePath *path; - - /* We block the signal because this all needs to be atomic */ - g_signal_handlers_block_matched (selection, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, selection_changed_callback, NULL); - gtk_tree_selection_unselect_all (selection); - g_signal_handlers_unblock_matched (selection, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, selection_changed_callback, NULL); - - clear_saved_primary_selection (selector); - - path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->tree_store), &parent_iter); - - if (gtk_tree_view_row_expanded (GTK_TREE_VIEW (selector), path)) { - gtk_tree_selection_select_iter (selection, &source_iter); - } else { - GtkTreePath *child_path; - - child_path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->tree_store), &source_iter); - priv->saved_primary_selection = gtk_tree_row_reference_new (GTK_TREE_MODEL (priv->tree_store), child_path); - gtk_tree_path_free (child_path); - - /* We do this by hand because we aren't changing the tree selection */ - if (!source_is_selected (selector, source)) { - select_source (selector, source); - gtk_tree_model_row_changed (GTK_TREE_MODEL (priv->tree_store), path, &source_iter); - g_signal_emit (selector, signals[SELECTION_CHANGED], 0); - } - - g_signal_emit (selector, signals[PRIMARY_SELECTION_CHANGED], 0); - } - - gtk_tree_path_free (path); - } else { - g_warning (G_STRLOC ": Cannot find source %p (%s) in selector %p", - source, e_source_peek_name (source), selector); - } -} - - -E_MAKE_TYPE (e_source_selector, "ESourceSelector", ESourceSelector, class_init, init, PARENT_TYPE) diff --git a/widgets/misc/e-source-selector.h b/widgets/misc/e-source-selector.h deleted file mode 100644 index 1c24261a18..0000000000 --- a/widgets/misc/e-source-selector.h +++ /dev/null @@ -1,82 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-source-selector.h - * - * Copyright (C) 2003 Ximian, Inc. - * - * 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 (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 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., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli <ettore@ximian.com> - */ - -#ifndef _E_SOURCE_SELECTOR_H_ -#define _E_SOURCE_SELECTOR_H_ - -#include <gtk/gtkmenu.h> -#include <gtk/gtktreeview.h> -#include <libedataserver/e-source-list.h> - -#define E_TYPE_SOURCE_SELECTOR (e_source_selector_get_type ()) -#define E_SOURCE_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_SOURCE_SELECTOR, ESourceSelector)) -#define E_SOURCE_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_SOURCE_SELECTOR, ESourceSelectorClass)) -#define E_IS_SOURCE_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_SOURCE_SELECTOR)) -#define E_IS_SOURCE_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_SOURCE_SELECTOR)) - - -typedef struct _ESourceSelector ESourceSelector; -typedef struct _ESourceSelectorPrivate ESourceSelectorPrivate; -typedef struct _ESourceSelectorClass ESourceSelectorClass; - -struct _ESourceSelector { - GtkTreeView parent; - - ESourceSelectorPrivate *priv; -}; - -struct _ESourceSelectorClass { - GtkTreeViewClass parent_class; - - void (* selection_changed) (ESourceSelector *selector); - void (* primary_selection_changed) (ESourceSelector *selector); - gboolean (*popup_event)(ESourceSelector *selector, ESource *primary, GdkEventButton *event); -}; - - -GType e_source_selector_get_type (void); - -GtkWidget *e_source_selector_new (ESourceList *list); - -void e_source_selector_select_source (ESourceSelector *selector, - ESource *source); -void e_source_selector_unselect_source (ESourceSelector *selector, - ESource *source); -gboolean e_source_selector_source_is_selected (ESourceSelector *selector, - ESource *source); - -GSList *e_source_selector_get_selection (ESourceSelector *selector); -void e_source_selector_free_selection (GSList *list); - -void e_source_selector_show_selection (ESourceSelector *selector, - gboolean show); -gboolean e_source_selector_selection_shown (ESourceSelector *selector); - -void e_source_selector_set_select_new (ESourceSelector *selector, gboolean state); - -ESource *e_source_selector_peek_primary_selection (ESourceSelector *selector); -void e_source_selector_set_primary_selection (ESourceSelector *selector, - ESource *source); - - -#endif /* _E_SOURCE_SELECTOR_H_ */ diff --git a/widgets/misc/test-source-option-menu.c b/widgets/misc/test-source-option-menu.c deleted file mode 100644 index a473c0f972..0000000000 --- a/widgets/misc/test-source-option-menu.c +++ /dev/null @@ -1,88 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* test-source-option-menu.c - Test for ESourceOptionMenu. - * - * Copyright (C) 2003 Novell, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 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., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli <ettore@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - - -#include "e-source-option-menu.h" - -#include <gtk/gtkwindow.h> -#include <gtk/gtkmain.h> - -#include <libgnomeui/gnome-ui-init.h> - - -static void -source_selected_callback (ESourceOptionMenu *menu, - ESource *source, - void *unused_data) -{ - g_print ("source selected: \"%s\"\n", e_source_peek_name (source)); -} - - -static int -on_idle_create_widget (const char *gconf_path) -{ - GtkWidget *window; - GtkWidget *option_menu; - ESourceList *source_list; - GConfClient *gconf_client; - - gconf_client = gconf_client_get_default (); - source_list = e_source_list_new_for_gconf (gconf_client, gconf_path); - - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - option_menu = e_source_option_menu_new (source_list); - g_signal_connect (option_menu, "source_selected", G_CALLBACK (source_selected_callback), NULL); - - gtk_container_add (GTK_CONTAINER (window), option_menu); - gtk_widget_show_all (window); - - g_object_unref (gconf_client); - g_object_unref (source_list); - - return FALSE; -} - - -int -main (int argc, char **argv) -{ - GnomeProgram *program; - const char *gconf_path; - - program = gnome_program_init ("test-source-list", "0.0", LIBGNOMEUI_MODULE, argc, argv, NULL); - - if (argc < 2) - gconf_path = "/apps/evolution/calendar/sources"; - else - gconf_path = argv [1]; - - g_idle_add ((GSourceFunc) on_idle_create_widget, (void *) gconf_path); - - gtk_main (); - - return 0; -} diff --git a/widgets/misc/test-source-selector.c b/widgets/misc/test-source-selector.c deleted file mode 100644 index 3120f0c948..0000000000 --- a/widgets/misc/test-source-selector.c +++ /dev/null @@ -1,131 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* test-source-list-selector.c - Test program for the ESourceListSelector - * widget. - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 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., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli <ettore@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-source-selector.h" - -#include <gtk/gtkmain.h> -#include <gtk/gtkcheckbutton.h> -#include <gtk/gtkvbox.h> -#include <gtk/gtkscrolledwindow.h> -#include <gtk/gtkwindow.h> - -#include <libgnomeui/gnome-ui-init.h> - - -static void -dump_selection (ESourceSelector *selector) -{ - GSList *selection = e_source_selector_get_selection (selector); - - g_print ("Current selection:\n"); - if (selection == NULL) { - g_print ("\t(None)\n"); - } else { - GSList *p; - - for (p = selection; p != NULL; p = p->next) { - ESource *source = E_SOURCE (p->data); - - g_print ("\tSource %s (group %s)\n", - e_source_peek_name (source), - e_source_group_peek_name (e_source_peek_group (source))); - } - } - - e_source_selector_free_selection (selection); -} - -static void -selection_changed_callback (ESourceSelector *selector, - void *unused_data) -{ - g_print ("Selection changed!\n"); - dump_selection (selector); -} - -static void -check_toggled_callback (GtkToggleButton *button, - ESourceSelector *selector) -{ - e_source_selector_show_selection (selector, gtk_toggle_button_get_active (button)); -} - -static int -on_idle_create_widget (void *unused_data) -{ - GtkWidget *window; - GtkWidget *vbox; - GtkWidget *selector; - GtkWidget *scrolled_window; - GtkWidget *check; - ESourceList *list; - GConfClient *gconf_client; - - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_default_size (GTK_WINDOW (window), 200, 300); - - vbox = gtk_vbox_new (FALSE, 3); - gtk_container_add (GTK_CONTAINER (window), vbox); - - gconf_client = gconf_client_get_default (); - list = e_source_list_new_for_gconf (gconf_client, "/apps/evolution/test/source_list"); - selector = e_source_selector_new (list); - g_signal_connect (selector, "selection_changed", G_CALLBACK (selection_changed_callback), NULL); - - scrolled_window = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN); - gtk_container_add (GTK_CONTAINER (scrolled_window), selector); - gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 3); - - check = gtk_check_button_new_with_label ("Show checkboxes"); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), - e_source_selector_selection_shown (E_SOURCE_SELECTOR (selector))); - g_signal_connect (check, "toggled", G_CALLBACK (check_toggled_callback), selector); - gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, TRUE, 3); - - gtk_widget_show_all (window); - - g_object_unref (gconf_client); - return FALSE; -} - - -int -main (int argc, char **argv) -{ - GnomeProgram *program; - - program = gnome_program_init ("test-source-list", "0.0", - LIBGNOMEUI_MODULE, argc, argv, - NULL); - - g_idle_add (on_idle_create_widget, NULL); - gtk_main (); - - return 0; -} |