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; }