From c12a958aba0bac2b665cc8a5a3cae2f10d16dd71 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Thu, 28 Nov 2013 20:32:37 +0100 Subject: [PATCH] Extend test-source-selector test program Added features: - show all four selectors (for Calendars/Memos/Tasks/Books) - be able to open/close selected source Especially the later can be used for testing the factories easily, without running evolution or other client. There can be added more actions on an opened EClient descendant in the future, if it'll be found useful. --- e-util/test-source-selector.c | 305 ++++++++++++++++++++++++++-------- 1 file changed, 236 insertions(+), 69 deletions(-) diff --git a/e-util/test-source-selector.c b/e-util/test-source-selector.c index f89c480520..f8f7031d02 100644 --- a/e-util/test-source-selector.c +++ b/e-util/test-source-selector.c @@ -1,6 +1,5 @@ /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* test-source-list-selector.c - Test program for the ESourceListSelector - * widget. +/* test-source-selector.c - Test program for the ESourceSelector widget. * * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) * @@ -17,22 +16,23 @@ * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. - * - * Author: Ettore Perazzoli */ #include -static const gchar *extension_name; +#define OPENED_KEY "sources-opened-key" +#define SOURCE_TYPE_KEY "sources-source-type-key" +#define EXTENSION_NAME_KEY "sources-extension-name-key" static void -dump_selection (ESourceSelector *selector) +dump_selection (ESourceSelector *selector, + const gchar *extension_name) { GList *list, *link; list = e_source_selector_get_selection (selector); - g_print ("Current selection:\n"); + g_print ("Current selection at %s:\n", extension_name); if (list == NULL) g_print ("\t(None)\n"); @@ -56,17 +56,220 @@ static void selection_changed_callback (ESourceSelector *selector) { g_print ("Selection changed!\n"); - dump_selection (selector); + dump_selection (selector, g_object_get_data (G_OBJECT (selector), EXTENSION_NAME_KEY)); +} + +static void +enable_widget_if_opened_cb (ESourceSelector *selector, + GtkWidget *widget) +{ + GHashTable *opened_sources; + ESource *source; + + opened_sources = g_object_get_data (G_OBJECT (selector), OPENED_KEY); + g_return_if_fail (opened_sources != NULL); + + source = e_source_selector_ref_primary_selection (selector); + gtk_widget_set_sensitive (widget, source && g_hash_table_lookup (opened_sources, source) != NULL); + if (source) + g_object_unref (source); +} + +static void +disable_widget_if_opened_cb (ESourceSelector *selector, + GtkWidget *widget) +{ + GHashTable *opened_sources; + ESource *source; + + opened_sources = g_object_get_data (G_OBJECT (selector), OPENED_KEY); + g_return_if_fail (opened_sources != NULL); + + source = e_source_selector_ref_primary_selection (selector); + gtk_widget_set_sensitive (widget, source && g_hash_table_lookup (opened_sources, source) == NULL); + if (source) + g_object_unref (source); +} + +static void +open_selected_clicked_cb (GtkWidget *button, + ESourceSelector *selector) +{ + GHashTable *opened_sources; + ESource *source; + + opened_sources = g_object_get_data (G_OBJECT (selector), OPENED_KEY); + g_return_if_fail (opened_sources != NULL); + + source = e_source_selector_ref_primary_selection (selector); + if (!source) + return; + + if (!g_hash_table_lookup (opened_sources, source)) { + EClient *client; + GError *error = NULL; + ECalClientSourceType source_type; + + source_type = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (selector), SOURCE_TYPE_KEY)); + if (source_type == E_CAL_CLIENT_SOURCE_TYPE_LAST) + client = e_book_client_connect_sync (source, NULL, &error); + else + client = e_cal_client_connect_sync (source, source_type, NULL, &error); + if (error) { + g_warning ("Failed to open '%s': %s", e_source_get_display_name (source), error->message); + } else { + g_hash_table_insert (opened_sources, g_object_ref (source), client); + g_signal_emit_by_name (selector, "primary-selection-changed", 0); + } + } + + g_object_unref (source); +} + +static void +close_selected_clicked_cb (GtkWidget *button, + ESourceSelector *selector) +{ + GHashTable *opened_sources; + ESource *source; + + opened_sources = g_object_get_data (G_OBJECT (selector), OPENED_KEY); + g_return_if_fail (opened_sources != NULL); + + source = e_source_selector_ref_primary_selection (selector); + if (!source) + return; + + if (g_hash_table_remove (opened_sources, source)) + g_signal_emit_by_name (selector, "primary-selection-changed", 0); + + g_object_unref (source); +} + +static GtkWidget * +create_page (ESourceRegistry *registry, + const gchar *extension_name, + ECalClientSourceType source_type) +{ + GtkWidget *widget, *subwindow, *selector, *button_box; + GtkGrid *grid; + GHashTable *opened_sources; + + grid = GTK_GRID (gtk_grid_new ()); + + subwindow = gtk_scrolled_window_new (NULL, NULL); + g_object_set (G_OBJECT (subwindow), + "halign", GTK_ALIGN_FILL, + "hexpand", TRUE, + "valign", GTK_ALIGN_FILL, + "vexpand", TRUE, + NULL); + + selector = e_source_selector_new (registry, extension_name); + g_object_set (G_OBJECT (selector), + "halign", GTK_ALIGN_FILL, + "hexpand", TRUE, + "valign", GTK_ALIGN_FILL, + "vexpand", TRUE, + "show-toggles", FALSE, + "show-colors", source_type != E_CAL_CLIENT_SOURCE_TYPE_LAST, + NULL); + gtk_container_add (GTK_CONTAINER (subwindow), selector); + + gtk_grid_attach (grid, subwindow, 0, 0, 1, 5); + + button_box = gtk_button_box_new (GTK_ORIENTATION_VERTICAL); + g_object_set (G_OBJECT (button_box), + "halign", GTK_ALIGN_START, + "hexpand", FALSE, + "valign", GTK_ALIGN_START, + "vexpand", FALSE, + NULL); + gtk_grid_attach (grid, button_box, 1, 0, 1, 1); + + widget = gtk_button_new_with_label ("Open selected"); + gtk_container_add (GTK_CONTAINER (button_box), widget); + g_signal_connect (widget, "clicked", G_CALLBACK (open_selected_clicked_cb), selector); + g_signal_connect (selector, "primary-selection-changed", G_CALLBACK (disable_widget_if_opened_cb), widget); + + widget = gtk_button_new_with_label ("Close selected"); + gtk_container_add (GTK_CONTAINER (button_box), widget); + g_signal_connect (widget, "clicked", G_CALLBACK (close_selected_clicked_cb), selector); + g_signal_connect (selector, "primary-selection-changed", G_CALLBACK (enable_widget_if_opened_cb), widget); + + widget = gtk_label_new (""); + g_object_set (G_OBJECT (widget), + "halign", GTK_ALIGN_FILL, + "hexpand", FALSE, + "valign", GTK_ALIGN_FILL, + "vexpand", TRUE, + NULL); + gtk_grid_attach (grid, widget, 1, 1, 1, 1); + + widget = gtk_check_button_new_with_label ("Show colors"); + g_object_set (G_OBJECT (widget), + "halign", GTK_ALIGN_START, + "hexpand", FALSE, + "valign", GTK_ALIGN_END, + "vexpand", FALSE, + NULL); + gtk_grid_attach (grid, widget, 1, 2, 1, 1); + + g_object_bind_property ( + selector, "show-colors", + widget, "active", + G_BINDING_BIDIRECTIONAL | + G_BINDING_SYNC_CREATE); + + widget = gtk_check_button_new_with_label ("Show icons"); + g_object_set (G_OBJECT (widget), + "halign", GTK_ALIGN_START, + "hexpand", FALSE, + "valign", GTK_ALIGN_END, + "vexpand", FALSE, + NULL); + gtk_grid_attach (grid, widget, 1, 3, 1, 1); + + g_object_bind_property ( + selector, "show-icons", + widget, "active", + G_BINDING_BIDIRECTIONAL | + G_BINDING_SYNC_CREATE); + + widget = gtk_check_button_new_with_label ("Show toggles"); + g_object_set (G_OBJECT (widget), + "halign", GTK_ALIGN_START, + "hexpand", FALSE, + "valign", GTK_ALIGN_END, + "vexpand", FALSE, + NULL); + gtk_grid_attach (grid, widget, 1, 4, 1, 1); + + g_object_bind_property ( + selector, "show-toggles", + widget, "active", + G_BINDING_BIDIRECTIONAL | + G_BINDING_SYNC_CREATE); + + opened_sources = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, g_object_unref); + g_object_set_data_full (G_OBJECT (selector), OPENED_KEY, opened_sources, (GDestroyNotify) g_hash_table_unref); + g_object_set_data (G_OBJECT (selector), SOURCE_TYPE_KEY, GUINT_TO_POINTER (source_type)); + g_object_set_data_full (G_OBJECT (selector), EXTENSION_NAME_KEY, g_strdup (extension_name), g_free); + + /* update buttons */ + g_signal_emit_by_name (selector, "primary-selection-changed", 0); + + g_signal_connect ( + selector, "selection-changed", + G_CALLBACK (selection_changed_callback), NULL); + + return GTK_WIDGET (grid); } static gint on_idle_create_widget (ESourceRegistry *registry) { - GtkWidget *window; - GtkWidget *vgrid; - GtkWidget *selector; - GtkWidget *scrolled_window; - GtkWidget *check; + GtkWidget *window, *notebook; window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size (GTK_WINDOW (window), 300, 400); @@ -75,61 +278,28 @@ on_idle_create_widget (ESourceRegistry *registry) window, "delete-event", G_CALLBACK (gtk_main_quit), NULL); - vgrid = g_object_new ( - GTK_TYPE_GRID, - "orientation", GTK_ORIENTATION_VERTICAL, - "column-homogeneous", FALSE, - "row-spacing", 6, - NULL); - gtk_container_add (GTK_CONTAINER (window), vgrid); + notebook = gtk_notebook_new (); + gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (notebook)); - selector = e_source_selector_new (registry, extension_name); - g_signal_connect ( - selector, "selection_changed", - G_CALLBACK (selection_changed_callback), NULL); + gtk_notebook_append_page ( + GTK_NOTEBOOK (notebook), + create_page (registry, E_SOURCE_EXTENSION_CALENDAR, E_CAL_CLIENT_SOURCE_TYPE_EVENTS), + gtk_label_new ("Calendars")); - 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_widget_set_hexpand (scrolled_window, TRUE); - gtk_widget_set_halign (scrolled_window, GTK_ALIGN_FILL); - gtk_widget_set_vexpand (scrolled_window, TRUE); - gtk_widget_set_valign (scrolled_window, GTK_ALIGN_FILL); - gtk_container_add (GTK_CONTAINER (vgrid), scrolled_window); + gtk_notebook_append_page ( + GTK_NOTEBOOK (notebook), + create_page (registry, E_SOURCE_EXTENSION_MEMO_LIST, E_CAL_CLIENT_SOURCE_TYPE_MEMOS), + gtk_label_new ("Memos")); - check = gtk_check_button_new_with_label ("Show colors"); - gtk_widget_set_halign (check, GTK_ALIGN_FILL); - gtk_container_add (GTK_CONTAINER (vgrid), check); + gtk_notebook_append_page ( + GTK_NOTEBOOK (notebook), + create_page (registry, E_SOURCE_EXTENSION_TASK_LIST, E_CAL_CLIENT_SOURCE_TYPE_TASKS), + gtk_label_new ("Tasks")); - g_object_bind_property ( - selector, "show-colors", - check, "active", - G_BINDING_BIDIRECTIONAL | - G_BINDING_SYNC_CREATE); - - check = gtk_check_button_new_with_label ("Show icons"); - gtk_widget_set_halign (check, GTK_ALIGN_FILL); - gtk_container_add (GTK_CONTAINER (vgrid), check); - - g_object_bind_property ( - selector, "show-icons", - check, "active", - G_BINDING_BIDIRECTIONAL | - G_BINDING_SYNC_CREATE); - - check = gtk_check_button_new_with_label ("Show toggles"); - gtk_widget_set_halign (check, GTK_ALIGN_FILL); - gtk_container_add (GTK_CONTAINER (vgrid), check); - - g_object_bind_property ( - selector, "show-toggles", - check, "active", - G_BINDING_BIDIRECTIONAL | - G_BINDING_SYNC_CREATE); + gtk_notebook_append_page ( + GTK_NOTEBOOK (notebook), + create_page (registry, E_SOURCE_EXTENSION_ADDRESS_BOOK, E_CAL_CLIENT_SOURCE_TYPE_LAST), + gtk_label_new ("Books")); gtk_widget_show_all (window); @@ -145,11 +315,6 @@ main (gint argc, gtk_init (&argc, &argv); - if (argc < 2) - extension_name = E_SOURCE_EXTENSION_ADDRESS_BOOK; - else - extension_name = argv[1]; - registry = e_source_registry_new_sync (NULL, &error); if (error != NULL) { @@ -163,5 +328,7 @@ main (gint argc, gtk_main (); + g_object_unref (registry); + return 0; }