[evolution] Extend test-source-selector test program
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution] Extend test-source-selector test program
- Date: Thu, 28 Nov 2013 19:38:32 +0000 (UTC)
commit c12a958aba0bac2b665cc8a5a3cae2f10d16dd71
Author: Milan Crha <mcrha redhat com>
Date: Thu Nov 28 20:32:37 2013 +0100
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 | 285 ++++++++++++++++++++++++++++++++---------
1 files changed, 226 insertions(+), 59 deletions(-)
---
diff --git a/e-util/test-source-selector.c b/e-util/test-source-selector.c
index f89c480..f8f7031 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 <ettore ximian com>
*/
#include <e-util/e-util.h>
-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,81 +56,251 @@ 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 gint
-on_idle_create_widget (ESourceRegistry *registry)
+static void
+enable_widget_if_opened_cb (ESourceSelector *selector,
+ GtkWidget *widget)
{
- GtkWidget *window;
- GtkWidget *vgrid;
- GtkWidget *selector;
- GtkWidget *scrolled_window;
- GtkWidget *check;
+ GHashTable *opened_sources;
+ ESource *source;
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_default_size (GTK_WINDOW (window), 300, 400);
+ opened_sources = g_object_get_data (G_OBJECT (selector), OPENED_KEY);
+ g_return_if_fail (opened_sources != NULL);
- g_signal_connect (
- window, "delete-event",
- G_CALLBACK (gtk_main_quit), 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;
- vgrid = g_object_new (
- GTK_TYPE_GRID,
- "orientation", GTK_ORIENTATION_VERTICAL,
- "column-homogeneous", FALSE,
- "row-spacing", 6,
+ 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);
- gtk_container_add (GTK_CONTAINER (window), vgrid);
selector = e_source_selector_new (registry, extension_name);
- g_signal_connect (
- selector, "selection_changed",
- G_CALLBACK (selection_changed_callback), NULL);
+ 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);
- 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);
-
- check = gtk_check_button_new_with_label ("Show colors");
- gtk_widget_set_halign (check, GTK_ALIGN_FILL);
- gtk_container_add (GTK_CONTAINER (vgrid), check);
+ 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",
- check, "active",
+ widget, "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);
+ 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",
- check, "active",
+ widget, "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);
+ 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",
- check, "active",
+ 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, *notebook;
+
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_default_size (GTK_WINDOW (window), 300, 400);
+
+ g_signal_connect (
+ window, "delete-event",
+ G_CALLBACK (gtk_main_quit), NULL);
+
+ notebook = gtk_notebook_new ();
+ gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (notebook));
+
+ gtk_notebook_append_page (
+ GTK_NOTEBOOK (notebook),
+ create_page (registry, E_SOURCE_EXTENSION_CALENDAR, E_CAL_CLIENT_SOURCE_TYPE_EVENTS),
+ gtk_label_new ("Calendars"));
+
+ 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"));
+
+ 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"));
+
+ 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);
return FALSE;
@@ -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;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]