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.
This commit is contained in:
Milan Crha
2013-11-28 20:32:37 +01:00
parent c8322a6c39
commit c12a958aba

View File

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