diff options
-rw-r--r-- | shell/e-shell-importer.c | 25 | ||||
-rw-r--r-- | shell/e-shell-importer.h | 15 | ||||
-rw-r--r-- | shell/e-shell-module.c | 15 | ||||
-rw-r--r-- | shell/e-shell-module.h | 5 | ||||
-rw-r--r-- | shell/e-shell-registry.c | 14 | ||||
-rw-r--r-- | shell/e-shell-registry.h | 2 | ||||
-rw-r--r-- | shell/e-shell-settings-dialog.c | 190 | ||||
-rw-r--r-- | shell/e-shell-settings-dialog.h | 56 | ||||
-rw-r--r-- | shell/e-shell.c | 54 | ||||
-rw-r--r-- | shell/e-shell.h | 1 | ||||
-rw-r--r-- | shell/es-event.c | 18 | ||||
-rw-r--r-- | shell/es-event.h | 15 | ||||
-rw-r--r-- | shell/main.c | 171 | ||||
-rw-r--r-- | shell/shell.error.xml | 22 | ||||
-rw-r--r-- | widgets/misc/e-multi-config-dialog.c | 486 | ||||
-rw-r--r-- | widgets/misc/e-multi-config-dialog.h | 64 | ||||
-rw-r--r-- | widgets/misc/test-multi-config-dialog.c | 8 |
17 files changed, 529 insertions, 632 deletions
diff --git a/shell/e-shell-importer.c b/shell/e-shell-importer.c index bf2a67f9b0..adf662aacf 100644 --- a/shell/e-shell-importer.c +++ b/shell/e-shell-importer.c @@ -85,7 +85,6 @@ typedef struct _ImportDialogImporterPage { } ImportDialogImporterPage; typedef struct _ImportData { - EShell *shell; EShellWindow *window; GladeXML *wizard; @@ -242,29 +241,6 @@ item_selected (GtkWidget *item, filename_changed(data->filepage->filename, data); } -#if 0 -static int -compare_info_name (const void *data1, const void *data2) -{ - const Bonobo_ServerInfo *info1 = (Bonobo_ServerInfo *)data1; - const Bonobo_ServerInfo *info2 = (Bonobo_ServerInfo *)data2; - const char *name1 = get_name_from_component_info (info1); - const char *name2 = get_name_from_component_info (info2); - - /* If we can't find a name for a plug-in, its iid will be used - * for display. Put such plug-ins at the end of the list since - * their displayed name won't be really user-friendly - */ - if (name1 == NULL) { - return -1; - } - if (name2 == NULL) { - return 1; - } - return g_utf8_collate (name1, name2); -} -#endif - static ImportDialogFilePage * importer_file_page_new (ImportData *data) { @@ -678,7 +654,6 @@ e_shell_importer_start_import (EShellWindow *shell_window) dialog_open = TRUE; data->window = shell_window; - data->shell = e_shell_window_peek_shell (data->window); gladefile = g_build_filename (EVOLUTION_GLADEDIR, "import.glade", NULL); data->wizard = glade_xml_new (gladefile, NULL, NULL); diff --git a/shell/e-shell-importer.h b/shell/e-shell-importer.h index 72fdd11ffc..88cfaef2f8 100644 --- a/shell/e-shell-importer.h +++ b/shell/e-shell-importer.h @@ -20,9 +20,16 @@ * Author: Iain Holmes <iain@ximian.com> */ -#ifndef _E_SHELL_IMPORTER_H_ -#define _E_SHELL_IMPORTER_H_ +#ifndef E_SHELL_IMPORTER_H +#define E_SHELL_IMPORTER_H -void e_shell_importer_start_import (EShellWindow *shell_window); +#include "e-shell-common.h" +#include "e-shell-window.h" -#endif +G_BEGIN_DECLS + +void e_shell_importer_start_import (EShellWindow *shell_window); + +G_END_DECLS + +#endif /* E_SHELL_IMPORTER_H */ diff --git a/shell/e-shell-module.c b/shell/e-shell-module.c index 7a006fe9d4..e969bbe382 100644 --- a/shell/e-shell-module.c +++ b/shell/e-shell-module.c @@ -267,6 +267,19 @@ e_shell_module_shutdown (EShellModule *shell_module) return TRUE; } +gboolean +e_shell_module_handle_uri (EShellModule *shell_module, + const gchar *uri) +{ + g_return_val_if_fail (E_IS_SHELL_MODULE (shell_module), FALSE); + g_return_val_if_fail (uri != NULL, FALSE); + + if (shell_module->priv->info.handle_uri != NULL) + return shell_module->priv->info.handle_uri (uri); + + return FALSE; +} + void e_shell_module_send_and_receive (EShellModule *shell_module) { @@ -296,7 +309,7 @@ e_shell_module_set_info (EShellModule *shell_module, shell_module->priv->info.sort_order = info->sort_order; shell_module->priv->info.aliases = g_intern_string (info->aliases); - shell_module->priv->info.schemas = g_intern_string (info->schemas); + shell_module->priv->info.schemes = g_intern_string (info->schemes); shell_module->priv->info.shell_view_type = info->shell_view_type; shell_module->priv->info.is_busy = info->is_busy; diff --git a/shell/e-shell-module.h b/shell/e-shell-module.h index b93a77a89d..7ea9dee4ef 100644 --- a/shell/e-shell-module.h +++ b/shell/e-shell-module.h @@ -53,11 +53,12 @@ typedef struct _EShellModulePrivate EShellModulePrivate; struct _EShellModuleInfo { gint sort_order; const gchar *aliases; /* colon-separated list */ - const gchar *schemas; /* colon-separated list */ + const gchar *schemes; /* colon-separated list */ GType shell_view_type; /* EShellView subclass */ gboolean (*is_busy) (void); gboolean (*shutdown) (void); + gboolean (*handle_uri) (const gchar *uri); void (*send_and_receive) (void); void (*window_created) (EShellWindow *window); }; @@ -79,6 +80,8 @@ const gchar * e_shell_module_get_filename (EShellModule *shell_module); GType e_shell_module_get_view_type (EShellModule *shell_module); gboolean e_shell_module_is_busy (EShellModule *shell_module); gboolean e_shell_module_shutdown (EShellModule *shell_module); +gboolean e_shell_module_handle_uri (EShellModule *shell_module, + const gchar *uri); void e_shell_module_send_and_receive (EShellModule *shell_module); void e_shell_module_window_created (EShellModule *shell_module, EShellWindow *shell_window); diff --git a/shell/e-shell-registry.c b/shell/e-shell-registry.c index 8329b59444..5c841398c3 100644 --- a/shell/e-shell-registry.c +++ b/shell/e-shell-registry.c @@ -22,7 +22,7 @@ static GList *loaded_modules; static GHashTable *modules_by_name; -static GHashTable *modules_by_schema; +static GHashTable *modules_by_scheme; static void shell_registry_insert_items (GHashTable *hash_table, @@ -77,9 +77,9 @@ shell_registry_query_module (const gchar *filename) shell_registry_insert_items ( modules_by_name, string, shell_module); - if ((string = info->schemas) != NULL) + if ((string = info->schemes) != NULL) shell_registry_insert_items ( - modules_by_schema, string, shell_module); + modules_by_scheme, string, shell_module); } void @@ -93,7 +93,7 @@ e_shell_registry_init (void) g_return_if_fail (loaded_modules == NULL); modules_by_name = g_hash_table_new (g_str_hash, g_str_equal); - modules_by_schema = g_hash_table_new (g_str_hash, g_str_equal); + modules_by_scheme = g_hash_table_new (g_str_hash, g_str_equal); dirname = EVOLUTION_MODULEDIR; @@ -161,9 +161,9 @@ e_shell_registry_get_module_by_name (const gchar *name) } EShellModule * -e_shell_registry_get_module_by_schema (const gchar *schema) +e_shell_registry_get_module_by_scheme (const gchar *scheme) { - g_return_val_if_fail (schema != NULL, NULL); + g_return_val_if_fail (scheme != NULL, NULL); - return g_hash_table_lookup (modules_by_schema, schema); + return g_hash_table_lookup (modules_by_scheme, scheme); } diff --git a/shell/e-shell-registry.h b/shell/e-shell-registry.h index 07e1acaf4b..ad86a94797 100644 --- a/shell/e-shell-registry.h +++ b/shell/e-shell-registry.h @@ -30,7 +30,7 @@ void e_shell_registry_init (void); GList * e_shell_registry_list_modules (void); GType * e_shell_registry_get_view_types (guint *n_types); EShellModule * e_shell_registry_get_module_by_name (const gchar *name); -EShellModule * e_shell_registry_get_module_by_schema (const gchar *schema); +EShellModule * e_shell_registry_get_module_by_scheme (const gchar *scheme); G_END_DECLS diff --git a/shell/e-shell-settings-dialog.c b/shell/e-shell-settings-dialog.c index 27c4fde6df..a2e470c909 100644 --- a/shell/e-shell-settings-dialog.c +++ b/shell/e-shell-settings-dialog.c @@ -30,7 +30,6 @@ #include "e-shell-settings-dialog.h" #include "e-corba-config-page.h" -#include <e-util/e-icon-factory.h> #include <bonobo/bonobo-widget.h> #include <bonobo/bonobo-exception.h> @@ -40,48 +39,21 @@ #include <stdlib.h> #include <string.h> +#define E_SHELL_SETTINGS_DIALOG_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE \ + ((obj), E_TYPE_SHELL_SETTINGS_DIALOG, EShellSettingsDialogPrivate)) + struct _EShellSettingsDialogPrivate { GHashTable *types; }; -G_DEFINE_TYPE (EShellSettingsDialog, e_shell_settings_dialog, E_TYPE_MULTI_CONFIG_DIALOG) - - -/* FIXME ugly hack to work around that sizing of invisible widgets is broken - with Bonobo. */ +static gpointer parent_class; -static void -set_dialog_size (EShellSettingsDialog *dialog) -{ - PangoLayout *layout; - PangoContext *context; - PangoFontMetrics *metrics; - int width, height; - - layout = gtk_widget_create_pango_layout (GTK_WIDGET (dialog), "M"); - context = pango_layout_get_context (layout); - metrics = pango_context_get_metrics (context, - gtk_widget_get_style (GTK_WIDGET (dialog))->font_desc, - pango_context_get_language (context)); - - pango_layout_get_pixel_size (layout, &width, NULL); - - width *= 60; - height = PANGO_PIXELS (pango_font_metrics_get_ascent (metrics) - + pango_font_metrics_get_descent (metrics)) * 30; - - gtk_window_set_default_size((GtkWindow *)dialog, width, height); - g_object_unref (layout); - pango_font_metrics_unref (metrics); -} - - /* Page handling. */ struct _Page { - char *title; - char *description; - GdkPixbuf *icon; + char *caption; + char *icon_name; Bonobo_ActivationProperty *type; int priority; EConfigPage *page_widget; @@ -89,22 +61,17 @@ struct _Page { typedef struct _Page Page; static Page * -page_new (const char *title, - const char *description, - GdkPixbuf *icon, +page_new (const char *caption, + const char *icon_name, Bonobo_ActivationProperty *type, int priority, EConfigPage *page_widget) { Page *page; - if (icon != NULL) - g_object_ref (icon); - page = g_new (Page, 1); - page->title = g_strdup (title); - page->description = g_strdup (description); - page->icon = icon; + page->caption = g_strdup (caption); + page->icon_name = g_strdup (icon_name);; page->type = type; page->priority = priority; page->page_widget = page_widget; @@ -115,35 +82,25 @@ page_new (const char *title, static void page_free (Page *page) { - g_free (page->title); - g_free (page->description); - - if (page->icon != NULL) - g_object_unref (page->icon); - + g_free (page->caption); + g_free (page->icon_name); g_free (page); } -static int -compare_page_func (const void *a, - const void *b) +static gint +compare_page_func (const Page *a, + const Page *b) { - const Page *page_a; - const Page *page_b; + if (a->priority == b->priority) + return strcmp (a->caption, b->caption); - page_a = (const Page *) a; - page_b = (const Page *) b; - - if (page_a->priority == page_b->priority) - return strcmp (page_a->title, page_b->title); - - return page_a->priority - page_b->priority; + return a->priority - b->priority; } static GList * sort_page_list (GList *list) { - return g_list_sort (list, compare_page_func); + return g_list_sort (list, (GCompareFunc) compare_page_func); } static void @@ -179,34 +136,21 @@ load_pages (EShellSettingsDialog *dialog) for (i = 0; i < control_list->_length; i ++) { CORBA_Object corba_object; Bonobo_ServerInfo *info; - const char *title; - const char *description; - const char *icon_path; + const char *caption; + const char *icon_name; const char *priority_string; Bonobo_ActivationProperty *type; int priority; - GdkPixbuf *icon; CORBA_exception_init (&ev); info = & control_list->_buffer[i]; - title = bonobo_server_info_prop_lookup (info, "evolution2:config_item:title", languages); - description = bonobo_server_info_prop_lookup (info, "evolution2:config_item:description", languages); - icon_path = bonobo_server_info_prop_lookup (info, "evolution2:config_item:icon_name", NULL); + caption = bonobo_server_info_prop_lookup (info, "evolution2:config_item:title", languages); + icon_name = bonobo_server_info_prop_lookup (info, "evolution2:config_item:icon_name", NULL); type = bonobo_server_info_prop_find (info, "evolution2:config_item:type"); priority_string = bonobo_server_info_prop_lookup (info, "evolution2:config_item:priority", NULL); - if (icon_path == NULL) { - icon = NULL; - } else { - if (g_path_is_absolute (icon_path)) { - icon = gdk_pixbuf_new_from_file (icon_path, NULL); - } else { - icon = e_icon_factory_get_icon (icon_path, E_ICON_SIZE_DIALOG); - } - } - if (type != NULL && type->v._d != Bonobo_ACTIVATION_P_STRINGV) type = NULL; if (priority_string == NULL) @@ -219,7 +163,7 @@ load_pages (EShellSettingsDialog *dialog) if (! BONOBO_EX (&ev)) { Page *page; - page = page_new (title, description, icon, type, priority, + page = page_new (caption, icon_name, type, priority, E_CONFIG_PAGE (e_corba_config_page_new_from_objref (corba_object))); page_list = g_list_prepend (page_list, page); @@ -229,9 +173,6 @@ load_pages (EShellSettingsDialog *dialog) g_free (bonobo_ex_text); } - if (icon != NULL) - g_object_unref (icon); - CORBA_exception_free (&ev); } g_slist_free(languages); @@ -243,9 +184,8 @@ load_pages (EShellSettingsDialog *dialog) page = (Page *) p->data; e_multi_config_dialog_add_page (E_MULTI_CONFIG_DIALOG (dialog), - page->title, - page->description, - page->icon, + page->caption, + page->icon_name, page->page_widget); if (page->type != NULL) { @@ -266,74 +206,88 @@ load_pages (EShellSettingsDialog *dialog) CORBA_free (control_list); } - -/* GtkObject methods. */ - static void -impl_finalize (GObject *object) +shell_settings_dialog_finalize (GObject *object) { - EShellSettingsDialog *dialog; EShellSettingsDialogPrivate *priv; - dialog = E_SHELL_SETTINGS_DIALOG (object); - priv = dialog->priv; + priv = E_SHELL_SETTINGS_DIALOG_GET_PRIVATE (object); g_hash_table_destroy (priv->types); - g_free (priv); - - (* G_OBJECT_CLASS (e_shell_settings_dialog_parent_class)->finalize) (object); + /* Chain up to parent's finalize() method. */ + G_OBJECT_CLASS (parent_class)->finalize (object); } - static void -e_shell_settings_dialog_class_init (EShellSettingsDialogClass *klass) +shell_settings_dialog_class_init (EShellSettingsDialogClass *class) { GObjectClass *object_class; - object_class = G_OBJECT_CLASS (klass); - object_class->finalize = impl_finalize; + parent_class = g_type_class_peek_parent (class); + g_type_class_add_private (class, sizeof (EShellSettingsDialogPrivate)); + + object_class = G_OBJECT_CLASS (class); + object_class->finalize = shell_settings_dialog_finalize; } static void -e_shell_settings_dialog_init (EShellSettingsDialog *dialog) +shell_settings_dialog_init (EShellSettingsDialog *dialog) { - EShellSettingsDialogPrivate *priv; + dialog->priv = E_SHELL_SETTINGS_DIALOG_GET_PRIVATE (dialog); - priv = g_new (EShellSettingsDialogPrivate, 1); - priv->types = g_hash_table_new_full ( + dialog->priv->types = g_hash_table_new_full ( g_str_hash, g_str_equal, (GDestroyNotify) g_free, (GDestroyNotify) NULL); - dialog->priv = priv; - load_pages (dialog); - set_dialog_size (dialog); gtk_window_set_title (GTK_WINDOW (dialog), _("Evolution Preferences")); gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE); } - -GtkWidget * -e_shell_settings_dialog_new (void) +GType +e_shell_settings_dialog_get_type (void) { - EShellSettingsDialog *new; + static GType type = 0; + + if (G_UNLIKELY (type == 0)) { + const GTypeInfo type_info = { + sizeof (EShellSettingsDialogClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) shell_settings_dialog_class_init, + (GClassFinalizeFunc) NULL, + NULL, /* class_data */ + sizeof (EShellSettingsDialog), + 0, /* n_preallocs */ + (GInstanceInitFunc) shell_settings_dialog_init, + NULL /* value_table */ + }; + + type = g_type_register_static ( + E_TYPE_MULTI_CONFIG_DIALOG, "EShellSettingsDialog", + &type_info, 0); + } - new = g_object_new (e_shell_settings_dialog_get_type (), NULL); + return type; +} - return GTK_WIDGET (new); +GtkWidget * +e_shell_settings_dialog_new (void) +{ + return g_object_new (E_TYPE_SHELL_SETTINGS_DIALOG, NULL); } void -e_shell_settings_dialog_show_type (EShellSettingsDialog *dialog, const char *type) +e_shell_settings_dialog_show_type (EShellSettingsDialog *dialog, + const gchar *type) { EShellSettingsDialogPrivate *priv; gpointer key, value; int page; - g_return_if_fail (dialog != NULL); g_return_if_fail (E_IS_SHELL_SETTINGS_DIALOG (dialog)); g_return_if_fail (type != NULL); @@ -350,9 +304,7 @@ e_shell_settings_dialog_show_type (EShellSettingsDialog *dialog, const char *typ } else value = NULL; } - page = GPOINTER_TO_INT (value); + page = GPOINTER_TO_INT (value); e_multi_config_dialog_show_page (E_MULTI_CONFIG_DIALOG (dialog), page); } - - diff --git a/shell/e-shell-settings-dialog.h b/shell/e-shell-settings-dialog.h index aeab973959..bf81a61682 100644 --- a/shell/e-shell-settings-dialog.h +++ b/shell/e-shell-settings-dialog.h @@ -17,34 +17,40 @@ * 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> */ -#ifndef _E_SHELL_SETTINGS_DIALOG_H_ -#define _E_SHELL_SETTINGS_DIALOG_H_ +#ifndef E_SHELL_SETTINGS_DIALOG_H +#define E_SHELL_SETTINGS_DIALOG_H #include "e-multi-config-dialog.h" -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ +G_BEGIN_DECLS -#define E_TYPE_SHELL_SETTINGS_DIALOG (e_shell_settings_dialog_get_type ()) -#define E_SHELL_SETTINGS_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_SHELL_SETTINGS_DIALOG, EShellSettingsDialog)) -#define E_SHELL_SETTINGS_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_SHELL_SETTINGS_DIALOG, EShellSettingsDialogClass)) -#define E_IS_SHELL_SETTINGS_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_SHELL_SETTINGS_DIALOG)) -#define E_IS_SHELL_SETTINGS_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_SHELL_SETTINGS_DIALOG)) +/* Standard GObject macros */ +#define E_TYPE_SHELL_SETTINGS_DIALOG \ + (e_shell_settings_dialog_get_type ()) +#define E_SHELL_SETTINGS_DIALOG(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST \ + ((obj), E_TYPE_SHELL_SETTINGS_DIALOG, EShellSettingsDialog)) +#define E_SHELL_SETTINGS_DIALOG_CLASS(cls) \ + (G_TYPE_CHECK_CLASS_CAST \ + ((cls), E_TYPE_SHELL_SETTINGS_DIALOG, EShellSettingsDialogClass)) +#define E_IS_SHELL_SETTINGS_DIALOG(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE \ + ((obj), E_TYPE_SHELL_SETTINGS_DIALOG)) +#define E_IS_SHELL_SETTINGS_DIALOG_CLASS(cls) \ + (G_TYPE_CHECK_CLASS_TYPE \ + ((cls), E_TYPE_SHELL_SETTINGS_DIALOG)) +#define E_SHELL_SETTINGS_DIALOG_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS \ + ((obj), E_TYPE_SHELL_SETTINGS_DIALOG, EShellSettingsDialogClass)) - -typedef struct _EShellSettingsDialog EShellSettingsDialog; +typedef struct _EShellSettingsDialog EShellSettingsDialog; +typedef struct _EShellSettingsDialogClass EShellSettingsDialogClass; typedef struct _EShellSettingsDialogPrivate EShellSettingsDialogPrivate; -typedef struct _EShellSettingsDialogClass EShellSettingsDialogClass; struct _EShellSettingsDialog { EMultiConfigDialog parent; - EShellSettingsDialogPrivate *priv; }; @@ -52,14 +58,12 @@ struct _EShellSettingsDialogClass { EMultiConfigDialogClass parent_class; }; - -GType e_shell_settings_dialog_get_type (void); -GtkWidget *e_shell_settings_dialog_new (void); -void e_shell_settings_dialog_show_type (EShellSettingsDialog *dialog, - const char *type); +GType e_shell_settings_dialog_get_type(void); +GtkWidget * e_shell_settings_dialog_new (void); +void e_shell_settings_dialog_show_type + (EShellSettingsDialog *dialog, + const gchar *type); -#ifdef __cplusplus -} -#endif /* __cplusplus */ +G_END_DECLS -#endif /* _E_SHELL_SETTINGS_DIALOG_H_ */ +#endif /* E_SHELL_SETTINGS_DIALOG_H */ diff --git a/shell/e-shell.c b/shell/e-shell.c index 43c30363f7..2fe703f077 100644 --- a/shell/e-shell.c +++ b/shell/e-shell.c @@ -24,10 +24,12 @@ #include "e-shell-module.h" #include "e-shell-registry.h" +#include "e-shell-settings-dialog.h" #define SHUTDOWN_TIMEOUT 500 /* milliseconds */ static GList *active_windows; +static GtkWidget *preferences; static gboolean shell_window_delete_event_cb (EShellWindow *shell_window) @@ -121,3 +123,55 @@ e_shell_create_window (void) return E_SHELL_WINDOW (shell_window); } + +gboolean +e_shell_handle_uri (const gchar *uri) +{ + EShellModule *shell_module; + GFile *file; + gchar *scheme; + + g_return_val_if_fail (uri != NULL, FALSE); + + file = g_file_new_for_uri (uri); + scheme = g_file_get_uri_scheme (file); + g_object_unref (file); + + if (scheme == NULL) + return FALSE; + + shell_module = e_shell_registry_get_module_by_scheme (scheme); + + /* Scheme lookup failed so try looking up the shell module by + * name. Note, we only open a shell window if the URI refers + * to a shell module by name, not by scheme. */ + if (shell_module == NULL) { + EShellWindow *shell_window; + + shell_module = e_shell_registry_get_module_by_name (scheme); + + if (shell_module == NULL) + return FALSE; + + shell_window = e_shell_create_window (); + /* FIXME Set window to appropriate view. */ + } + + return e_shell_module_handle_uri (shell_module, uri); +} + +void +e_shell_show_preferences (GtkWindow *parent) +{ + if (preferences != NULL) { + gtk_window_present (GTK_WINDOW (preferences)); + return; + } + + preferences = e_shell_settings_dialog_new (); + /* FIXME e_shell_settings_dialog_show_type (...); */ + + gtk_window_set_transient_for (GTK_WINDOW (preferences), parent); + gtk_window_set_destroy_with_parent (GTK_WINDOW (preferences), TRUE); + gtk_widget_show (preferences); +} diff --git a/shell/e-shell.h b/shell/e-shell.h index a2582190b9..dcc6a99a3a 100644 --- a/shell/e-shell.h +++ b/shell/e-shell.h @@ -43,6 +43,7 @@ enum _EShellStartupLineMode { }; EShellWindow * e_shell_create_window (void); +gboolean e_shell_handle_uri (const gchar *uri); void e_shell_send_receive (GtkWindow *parent); void e_shell_show_preferences (GtkWindow *parent); void e_shell_go_offline (void); diff --git a/shell/es-event.c b/shell/es-event.c index 4146cbccae..ee1cdb400a 100644 --- a/shell/es-event.c +++ b/shell/es-event.c @@ -112,6 +112,14 @@ ESEvent *es_event_peek(void) return es_event; } +ESEventTargetShell * +es_event_target_new (ESEvent *eme) +{ + return e_event_target_new ( + &eme->event, ES_EVENT_TARGET_SHELL, + sizeof (ESEventTargetShell)); +} + ESEventTargetState * es_event_target_new_state(ESEvent *eme, int state) { @@ -130,16 +138,6 @@ es_event_target_new_state(ESEvent *eme, int state) return t; } -ESEventTargetShell * -es_event_target_new_shell(ESEvent *eme, EShell *shell) -{ - ESEventTargetShell *t = e_event_target_new(&eme->event, ES_EVENT_TARGET_SHELL, sizeof(*t)); - - t->shell = shell; - - return t; -} - ESEventTargetUpgrade * es_event_target_new_upgrade(ESEvent *eme, int major, int minor, int revision) { diff --git a/shell/es-event.h b/shell/es-event.h index bb707050a7..8b8d356e2f 100644 --- a/shell/es-event.h +++ b/shell/es-event.h @@ -27,12 +27,7 @@ #include "e-util/e-event.h" -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -struct _EShell; /* Avoid including "e-shell.h" */ +G_BEGIN_DECLS typedef struct _ESEvent ESEvent; typedef struct _ESEventClass ESEventClass; @@ -58,8 +53,6 @@ typedef struct _ESEventTargetComponent ESEventTargetComponent; struct _ESEventTargetShell { EEventTarget target; - - struct _EShell *shell; }; struct _ESEventTargetState { @@ -99,8 +92,8 @@ GType es_event_get_type(void); ESEvent *es_event_peek(void); +ESEventTargetShell *es_event_target_new(ESEvent *eme); ESEventTargetState *es_event_target_new_state(ESEvent *emp, int state); -ESEventTargetShell *es_event_target_new_shell(ESEvent *eme, struct _EShell *shell); ESEventTargetUpgrade *es_event_target_new_upgrade(ESEvent *emp, int major, int minor, int revision); ESEventTargetComponent *es_event_target_new_component(ESEvent *eme, const char *id); @@ -119,8 +112,6 @@ struct _ESEventHookClass { GType es_event_hook_get_type(void); -#ifdef __cplusplus -} -#endif /* __cplusplus */ +G_END_DECLS #endif /* __ES_EVENT_H__ */ diff --git a/shell/main.c b/shell/main.c index f363d3bdd9..533c678236 100644 --- a/shell/main.c +++ b/shell/main.c @@ -56,8 +56,6 @@ #include <libgnomeui/gnome-ui-init.h> #include <libgnomeui/gnome-client.h> -#include <bonobo/bonobo-main.h> -#include <bonobo/bonobo-moniker-util.h> #include <bonobo/bonobo-exception.h> #include <bonobo-activation/bonobo-activation.h> @@ -92,9 +90,6 @@ #define RECOVERY_KEY \ "/apps/evolution/shell/recovery" - -static EShell *shell = NULL; - /* Command-line options. */ static gboolean start_online = FALSE; static gboolean start_offline = FALSE; @@ -111,21 +106,6 @@ static char *default_component_id = NULL; static char *evolution_debug_log = NULL; static gchar **remaining_args; -static void -no_windows_left_cb (EShell *shell, gpointer data) -{ - bonobo_object_unref (BONOBO_OBJECT (shell)); - bonobo_main_quit (); -} - -static void -shell_weak_notify (void *data, - GObject *where_the_object_was) -{ - bonobo_main_quit (); -} - - #ifdef KILL_PROCESS_CMD static void @@ -352,25 +332,15 @@ show_recovery_warning(void) } static void -open_uris (GNOME_Evolution_Shell corba_shell, gchar **uris) +open_uris (gchar **uris) { - CORBA_Environment ev; - guint n_uris, ii; + guint ii; g_return_if_fail (uris != NULL); - n_uris = g_strv_length (uris); - - CORBA_exception_init (&ev); - for (ii = 0; ii < n_uris; ii++) { - GNOME_Evolution_Shell_handleURI (corba_shell, uris[ii], &ev); - if (ev._major != CORBA_NO_EXCEPTION) { + for (ii = 0; uris[ii] != NULL; ii++) + if (!e_shell_handle_uri (uris[ii])) g_warning ("Invalid URI: %s", uris[ii]); - CORBA_exception_free (&ev); - } - } - - CORBA_exception_free (&ev); } /* This is for doing stuff that requires the GTK+ loop to be running already. */ @@ -378,9 +348,6 @@ open_uris (GNOME_Evolution_Shell corba_shell, gchar **uris) static gboolean idle_cb (gchar **uris) { - GNOME_Evolution_Shell corba_shell; - CORBA_Environment ev; - EShellConstructResult result; EShellStartupLineMode startup_line_mode; g_return_val_if_fail (uris == NULL || g_strv_length (uris) > 0, FALSE); @@ -389,8 +356,6 @@ idle_cb (gchar **uris) kill_old_dataserver (); #endif - CORBA_exception_init (&ev); - if (! start_online && ! start_offline) startup_line_mode = E_SHELL_STARTUP_LINE_MODE_CONFIG; else if (start_online) @@ -398,93 +363,51 @@ idle_cb (gchar **uris) else startup_line_mode = E_SHELL_STARTUP_LINE_MODE_OFFLINE; - shell = e_shell_new (startup_line_mode, &result); - - switch (result) { - case E_SHELL_CONSTRUCT_RESULT_OK: - g_signal_connect (shell, "no_windows_left", G_CALLBACK (no_windows_left_cb), NULL); - g_object_weak_ref (G_OBJECT (shell), shell_weak_notify, NULL); - corba_shell = bonobo_object_corba_objref (BONOBO_OBJECT (shell)); - corba_shell = CORBA_Object_duplicate (corba_shell, &ev); - break; - - case E_SHELL_CONSTRUCT_RESULT_CANNOTREGISTER: - corba_shell = bonobo_activation_activate_from_id (E_SHELL_OAFIID, 0, NULL, &ev); - if (ev._major != CORBA_NO_EXCEPTION || corba_shell == CORBA_OBJECT_NIL) { - e_error_run(NULL, "shell:noshell", NULL); - CORBA_exception_free (&ev); - bonobo_main_quit (); - return FALSE; - } - break; - - default: - e_error_run(NULL, "shell:noshell-reason", - e_shell_construct_result_to_string(result), NULL); - CORBA_exception_free (&ev); - bonobo_main_quit (); - return FALSE; - - } + /* FIXME Do something with startup_line_mode. */ - if (shell != NULL) { - if (uris != NULL) - open_uris (corba_shell, uris); - else { - GConfClient *client = gconf_client_get_default (); - - if (gconf_client_get_bool (client, RECOVERY_KEY, NULL) && e_file_lock_exists ()) { - /* It should have crashed last time or a force-shutdown */ - gboolean skip = gconf_client_get_bool (client, SKIP_RECOVERY_DIALOG_KEY, NULL); - gboolean recover = TRUE; - if (!skip){ - int flags = show_recovery_warning (); - - gconf_client_set_bool (client, SKIP_RECOVERY_DIALOG_KEY, (flags & (1<<2)) ? TRUE : FALSE, NULL); - recover = (flags & (1<<1)) ? TRUE: FALSE; - } - - if (recover) { - /* Disable the previews */ - gconf_client_set_bool (client, "/apps/evolution/mail/display/show_preview", FALSE, NULL); - gconf_client_set_bool (client, "/apps/evolution/mail/display/safe_list", TRUE, NULL); - gconf_client_set_bool (client, "/apps/evolution/addressbook/display/show_preview", FALSE, NULL); - gconf_client_set_bool (client, "/apps/evolution/calendar/display/show_task_preview", FALSE, NULL); - } - /* Let us not delete and recreate a lock, instead reuse it. We don't use timestamps anyways */ - } else { - /* What great can we do, if lock creation fails ?*/ - e_file_lock_create (); + if (uris != NULL) + open_uris (uris); + else { + EShellWindow *shell_window; + GConfClient *client = gconf_client_get_default (); + + if (gconf_client_get_bool (client, RECOVERY_KEY, NULL) && e_file_lock_exists ()) { + /* It should have crashed last time or a force-shutdown */ + gboolean skip = gconf_client_get_bool (client, SKIP_RECOVERY_DIALOG_KEY, NULL); + gboolean recover = TRUE; + if (!skip){ + int flags = show_recovery_warning (); + + gconf_client_set_bool (client, SKIP_RECOVERY_DIALOG_KEY, (flags & (1<<2)) ? TRUE : FALSE, NULL); + recover = (flags & (1<<1)) ? TRUE: FALSE; } - g_object_unref (client); - e_shell_create_window (shell, default_component_id); + if (recover) { + /* Disable the previews */ + gconf_client_set_bool (client, "/apps/evolution/mail/display/show_preview", FALSE, NULL); + gconf_client_set_bool (client, "/apps/evolution/mail/display/safe_list", TRUE, NULL); + gconf_client_set_bool (client, "/apps/evolution/addressbook/display/show_preview", FALSE, NULL); + gconf_client_set_bool (client, "/apps/evolution/calendar/display/show_task_preview", FALSE, NULL); + } + /* Let us not delete and recreate a lock, instead reuse it. We don't use timestamps anyways */ + } else { + /* What great can we do, if lock creation fails ?*/ + e_file_lock_create (); } - } else { - CORBA_Environment ev; - - CORBA_exception_init (&ev); - if (uris != NULL) - open_uris (corba_shell, uris); - else - if (default_component_id == NULL) - GNOME_Evolution_Shell_createNewWindow (corba_shell, "", &ev); - else - GNOME_Evolution_Shell_createNewWindow (corba_shell, default_component_id, &ev); + g_object_unref (client); - CORBA_exception_free (&ev); + shell_window = e_shell_create_window (); + /* XXX Switch to default_component_id. */ } - CORBA_Object_release (corba_shell, &ev); - - CORBA_exception_free (&ev); - +#if 0 /* MBARNES */ if (shell == NULL) { /*there is another instance but because we don't open any windows we must notify the startup was complete manually*/ gdk_notify_startup_complete (); bonobo_main_quit (); } +#endif return FALSE; } @@ -547,15 +470,20 @@ setup_segv_redirect (void) #endif static gint -gnome_master_client_save_yourself_cb (GnomeClient *client, GnomeSaveStyle save_style, gint shutdown, GnomeInteractStyle interact_style, gint fast, gpointer user_data) +gnome_master_client_save_yourself_cb (GnomeClient *client, + GnomeSaveStyle save_style, + gint shutdown, + GnomeInteractStyle interact_style, + gint fast, + gpointer user_data) { - return !shell || e_shell_can_quit (shell); + return !e_shell_is_busy (); } static void gnome_master_client_die_cb (GnomeClient *client) { - e_shell_do_quit (shell); + e_shell_do_quit (); } static const GOptionEntry options[] = { @@ -627,15 +555,6 @@ set_paths (void) g_free (path); - /* Set BONOBO_ACTIVATION_PATH */ - if (g_getenv ("BONOBO_ACTIVATION_PATH" ) == NULL) { - path = g_build_filename (top_folder_utf8, - "lib/bonobo/servers", - NULL); - if (!g_setenv ("BONOBO_ACTIVATION_PATH", path, TRUE)) - g_warning ("Could not set BONOBO_ACTIVATION_PATH"); - g_free (path); - } g_free (top_folder_utf8); } #endif @@ -780,7 +699,7 @@ main (int argc, char **argv) #endif g_object_unref (client); - bonobo_main (); + gtk_main (); e_icon_factory_shutdown (); g_object_unref (program); diff --git a/shell/shell.error.xml b/shell/shell.error.xml index 6f5364e026..75a6247eb6 100644 --- a/shell/shell.error.xml +++ b/shell/shell.error.xml @@ -51,28 +51,6 @@ Once deleted, you cannot downgrade to the previous version of Evolution without <button stock="gtk-delete" response="GTK_RESPONSE_OK"/> </error> - <error id="noshell" type="error"> - <title>Cannot start Evolution</title> - <_primary>Evolution can not start.</_primary> - <_secondary xml:space="preserve">Your system configuration does not match your Evolution configuration. - -Click help for details</_secondary> - <help uri="http://go-evolution.org/FAQ#What_does_.22Your_system_configuration_does_not_match_your_Evolution_configuration.22_mean.3F"/> - <button stock="gtk-quit" response="GTK_RESPONSE_CANCEL"/> - </error> - - <error id="noshell-reason" type="error"> - <title>Cannot start Evolution</title> - <_primary>Evolution can not start.</_primary> - <_secondary xml:space="preserve">Your system configuration does not match your Evolution configuration: - -{0} - -Click help for details.</_secondary> - <help uri="http://go-evolution.org/FAQ#What_does_.22Your_system_configuration_does_not_match_your_Evolution_configuration.22_mean.3F"/> - <button stock="gtk-quit" response="GTK_RESPONSE_CANCEL"/> - </error> - <error id="forget-passwords" type="question" default="GTK_RESPONSE_CANCEL"> <_primary>Are you sure you want to forget all remembered passwords?</_primary> <_secondary xml:space="preserve">Forgetting your passwords will clear all remembered passwords. You will be reprompted next time they are needed.</_secondary> diff --git a/widgets/misc/e-multi-config-dialog.c b/widgets/misc/e-multi-config-dialog.c index 159b14561c..bb9c0e6f79 100644 --- a/widgets/misc/e-multi-config-dialog.c +++ b/widgets/misc/e-multi-config-dialog.c @@ -16,69 +16,33 @@ * 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> */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #include "e-multi-config-dialog.h" -#include <table/e-table-scrolled.h> -#include <table/e-table-memory-store.h> -#include <table/e-cell-pixbuf.h> -#include <table/e-cell-vbox.h> -#include <table/e-cell-text.h> - #include <libgnome/gnome-help.h> #define SWITCH_PAGE_INTERVAL 250 -struct _EMultiConfigDialogPrivate { - GSList *pages; - - GtkWidget *list_e_table; - ETableModel *list_e_table_model; +#define E_MULTI_CONFIG_DIALOG_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE \ + ((obj), E_TYPE_MULTI_CONFIG_DIALOG, EMultiConfigDialogPrivate)) +struct _EMultiConfigDialogPrivate { + GtkWidget *icon_view; GtkWidget *notebook; + guint timeout_id; +}; - int set_page_timeout_id; - int set_page_timeout_page; +enum { + COLUMN_TEXT, /* G_TYPE_STRING */ + COLUMN_PIXBUF /* GDK_TYPE_PIXBUF */ }; -G_DEFINE_TYPE (EMultiConfigDialog, e_multi_config_dialog, GTK_TYPE_DIALOG) - - -/* ETable stuff. */ - -static char *list_e_table_spec = - "<ETableSpecification cursor-mode=\"line\"" - " selection-mode=\"browse\"" - " no-headers=\"true\"" - " alternating-row-colors=\"false\"" - " horizontal-resize=\"true\"" - ">" - " <ETableColumn model_col=\"0\"" - " expansion=\"1.0\"" - " cell=\"vbox\"" - " minimum_width=\"32\"" - " resizable=\"true\"" - " _title=\"Category\"" - " compare=\"string\"/>" - " <ETableState>" - " <column source=\"0\"/>" - " <grouping>" - " </grouping>" - " </ETableState>" - "</ETableSpecification>"; - -/* Page handling. */ +static gpointer parent_class; static GtkWidget * -create_page_container (const char *description, - GtkWidget *widget) +create_page_container (GtkWidget *widget) { GtkWidget *vbox; @@ -92,290 +56,328 @@ create_page_container (const char *description, return vbox; } -/* Timeout for switching pages (so it's more comfortable navigating with the - keyboard). */ - -static int -set_page_timeout_callback (void *data) +static GdkPixbuf * +multi_config_dialog_load_pixbuf (const gchar *icon_name) { - EMultiConfigDialog *multi_config_dialog; - EMultiConfigDialogPrivate *priv; + GtkIconTheme *icon_theme; + GtkIconInfo *icon_info; + GdkPixbuf *pixbuf; + const gchar *filename; + gint size; + GError *error = NULL; - multi_config_dialog = E_MULTI_CONFIG_DIALOG (data); - priv = multi_config_dialog->priv; + icon_theme = gtk_icon_theme_get_default (); - gtk_notebook_set_current_page ( - GTK_NOTEBOOK (priv->notebook), priv->set_page_timeout_page); + if (!gtk_icon_size_lookup (GTK_ICON_SIZE_DIALOG, &size, 0)) + return NULL; - priv->set_page_timeout_id = 0; - gtk_widget_grab_focus(priv->list_e_table); - return FALSE; + icon_info = gtk_icon_theme_lookup_icon ( + icon_theme, icon_name, size, 0); + + if (icon_info == NULL) + return NULL; + + filename = gtk_icon_info_get_filename (icon_info); + + pixbuf = gdk_pixbuf_new_from_file (filename, &error); + + gtk_icon_info_free (icon_info); + + if (error != NULL) { + g_warning ("%s", error->message); + g_error_free (error); + } + + return pixbuf; } +static gboolean +multi_config_dialog_timeout_cb (EMultiConfigDialog *dialog) +{ + GtkIconView *icon_view; + GtkNotebook *notebook; + GList *list; -/* Button handling. */ + icon_view = GTK_ICON_VIEW (dialog->priv->icon_view); + notebook = GTK_NOTEBOOK (dialog->priv->notebook); + + list = gtk_icon_view_get_selected_items (icon_view); + + if (list != NULL) { + GtkTreePath *path = list->data; + gint page; + + page = gtk_tree_path_get_indices (path)[0]; + gtk_notebook_set_current_page (notebook, page); + } + + g_list_foreach (list, (GFunc) gtk_tree_path_free, NULL); + g_list_free (list); + + dialog->priv->timeout_id = 0; + gtk_widget_grab_focus (GTK_WIDGET (icon_view)); + + return FALSE; +} static void -do_close (EMultiConfigDialog *dialog) +multi_config_dialog_selection_changed_cb (EMultiConfigDialog *dialog) { - gtk_widget_destroy (GTK_WIDGET (dialog)); + if (dialog->priv->timeout_id == 0) + dialog->priv->timeout_id = g_timeout_add ( + SWITCH_PAGE_INTERVAL, (GSourceFunc) + multi_config_dialog_timeout_cb, dialog); } - -/* ETable signals. */ - static void -table_cursor_change_callback (ETable *etable, - int row, - void *data) +multi_config_dialog_dispose (GObject *object) { - EMultiConfigDialog *dialog; EMultiConfigDialogPrivate *priv; - dialog = E_MULTI_CONFIG_DIALOG (data); - priv = dialog->priv; - - if (priv->set_page_timeout_id == 0) - priv->set_page_timeout_id = g_timeout_add (SWITCH_PAGE_INTERVAL, - set_page_timeout_callback, - dialog); + priv = E_MULTI_CONFIG_DIALOG_GET_PRIVATE (object); - priv->set_page_timeout_page = row; -} + if (priv->icon_view != NULL) { + g_object_unref (priv->icon_view); + priv->icon_view = NULL; + } + if (priv->notebook != NULL) { + g_object_unref (priv->notebook); + priv->notebook = NULL; + } -/* GObject methods. */ + /* Chain up to parent's dispose() method. */ + G_OBJECT_CLASS (parent_class)->dispose (object); +} static void -impl_finalize (GObject *object) +multi_config_dialog_finalize (GObject *object) { - EMultiConfigDialog *dialog; EMultiConfigDialogPrivate *priv; - dialog = E_MULTI_CONFIG_DIALOG (object); - priv = dialog->priv; - - if (priv->set_page_timeout_id != 0) - g_source_remove (priv->set_page_timeout_id); - - g_slist_free (priv->pages); + priv = E_MULTI_CONFIG_DIALOG_GET_PRIVATE (object); - g_free (priv); + if (priv->timeout_id != 0) + g_source_remove (priv->timeout_id); - (* G_OBJECT_CLASS (e_multi_config_dialog_parent_class)->finalize) (object); + /* Chain up to parent's finalize() method. */ + G_OBJECT_CLASS (parent_class)->finalize (object); } +static void +multi_config_dialog_map (GtkWidget *widget) +{ + GtkDialog *dialog; -/* GtkDialog methods. */ + /* Chain up to parent's map() method. */ + GTK_WIDGET_CLASS (parent_class)->map (widget); + + /* Override those stubborn style properties. */ + dialog = GTK_DIALOG (widget); + gtk_box_set_spacing (GTK_BOX (dialog->vbox), 12); + gtk_container_set_border_width (GTK_CONTAINER (widget), 12); + gtk_container_set_border_width (GTK_CONTAINER (dialog->vbox), 0); + gtk_container_set_border_width (GTK_CONTAINER (dialog->action_area), 0); +} static void -impl_response (GtkDialog *dialog, int response_id) +multi_config_dialog_response (GtkDialog *dialog, + gint response_id) { - EMultiConfigDialog *multi_config_dialog; GError *error = NULL; - multi_config_dialog = E_MULTI_CONFIG_DIALOG (dialog); - switch (response_id) { - case GTK_RESPONSE_HELP: - gnome_help_display ( - "evolution.xml", "config-prefs", &error); - if (error != NULL) { - g_warning ("%s", error->message); - g_error_free (error); - } - break; - case GTK_RESPONSE_CLOSE: - default: - do_close (multi_config_dialog); - break; + case GTK_RESPONSE_HELP: + gnome_help_display ( + "evolution.xml", "config-prefs", &error); + if (error != NULL) { + g_warning ("%s", error->message); + g_error_free (error); + } + break; + + case GTK_RESPONSE_CLOSE: + default: + gtk_widget_destroy (GTK_WIDGET (dialog)); + break; } } - -/* GObject ctors. */ - static void -e_multi_config_dialog_class_init (EMultiConfigDialogClass *class) +multi_config_dialog_class_init (EMultiConfigDialogClass *class) { GObjectClass *object_class; + GtkWidgetClass *widget_class; GtkDialogClass *dialog_class; - object_class = G_OBJECT_CLASS (class); - object_class->finalize = impl_finalize; + parent_class = g_type_class_peek_parent (class); + g_type_class_add_private (class, sizeof (EMultiConfigDialogPrivate)); - dialog_class = GTK_DIALOG_CLASS (class); - dialog_class->response = impl_response; -} + object_class = G_OBJECT_CLASS (class); + object_class->dispose = multi_config_dialog_dispose; + object_class->finalize = multi_config_dialog_finalize; -#define RGB_COLOR(color) (((color).red & 0xff00) << 8 | \ - ((color).green & 0xff00) | \ - ((color).blue & 0xff00) >> 8) + widget_class = GTK_WIDGET_CLASS (class); + widget_class->map = multi_config_dialog_map; -static void -canvas_realize (GtkWidget *widget, EMultiConfigDialog *dialog) -{ + dialog_class = GTK_DIALOG_CLASS (class); + dialog_class->response = multi_config_dialog_response; } - -static ETableMemoryStoreColumnInfo columns[] = { - E_TABLE_MEMORY_STORE_STRING, - E_TABLE_MEMORY_STORE_PIXBUF, - E_TABLE_MEMORY_STORE_PIXBUF, - E_TABLE_MEMORY_STORE_PIXBUF, - E_TABLE_MEMORY_STORE_PIXBUF, - E_TABLE_MEMORY_STORE_TERMINATOR -}; - static void -e_multi_config_dialog_init (EMultiConfigDialog *multi_config_dialog) +multi_config_dialog_init (EMultiConfigDialog *dialog) { - EMultiConfigDialogPrivate *priv; - ETableModel *list_e_table_model; - GtkWidget *dialog_vbox; + GtkListStore *store; + GtkWidget *container; GtkWidget *hbox; - GtkWidget *notebook; - GtkWidget *list_e_table; - ETableExtras *extras; - ECell *pixbuf; - ECell *text; - ECell *vbox; + GtkWidget *widget; - gtk_dialog_set_has_separator (GTK_DIALOG (multi_config_dialog), FALSE); - gtk_widget_realize (GTK_WIDGET (multi_config_dialog)); - gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (multi_config_dialog)->vbox), 0); - gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (multi_config_dialog)->action_area), 12); + dialog->priv = E_MULTI_CONFIG_DIALOG_GET_PRIVATE (dialog); - hbox = gtk_hbox_new (FALSE, 6); - gtk_container_set_border_width (GTK_CONTAINER (hbox), 12); - dialog_vbox = GTK_DIALOG (multi_config_dialog)->vbox; + gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE); + gtk_window_set_resizable (GTK_WINDOW (dialog), TRUE); - gtk_container_add (GTK_CONTAINER (dialog_vbox), hbox); + /* XXX Remove this once we kill Bonobo. */ + gtk_widget_realize (GTK_WIDGET (dialog)); - list_e_table_model = e_table_memory_store_new (columns); + container = GTK_DIALOG (dialog)->vbox; - vbox = e_cell_vbox_new (); - - pixbuf = e_cell_pixbuf_new(); - g_object_set (G_OBJECT (pixbuf), - "focused_column", 2, - "selected_column", 3, - "unselected_column", 4, - NULL); - e_cell_vbox_append (E_CELL_VBOX (vbox), pixbuf, 1); - g_object_unref (pixbuf); - - text = e_cell_text_new (NULL, GTK_JUSTIFY_CENTER); - e_cell_vbox_append (E_CELL_VBOX (vbox), text, 0); - g_object_unref (text); + hbox = gtk_hbox_new (FALSE, 12); + gtk_container_add (GTK_CONTAINER (container), hbox); + gtk_widget_show (hbox); - extras = e_table_extras_new (); - e_table_extras_add_cell (extras, "vbox", vbox); + widget = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy ( + GTK_SCROLLED_WINDOW (widget), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type ( + GTK_SCROLLED_WINDOW (widget), GTK_SHADOW_IN); + gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, TRUE, 0); + gtk_widget_show (widget); - list_e_table = e_table_scrolled_new (list_e_table_model, extras, list_e_table_spec, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (list_e_table), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - g_signal_connect (e_table_scrolled_get_table (E_TABLE_SCROLLED (list_e_table)), - "cursor_change", G_CALLBACK (table_cursor_change_callback), multi_config_dialog); + container = widget; + + store = gtk_list_store_new (2, G_TYPE_STRING, GDK_TYPE_PIXBUF); + widget = gtk_icon_view_new_with_model (GTK_TREE_MODEL (store)); + gtk_icon_view_set_columns (GTK_ICON_VIEW (widget), 1); + gtk_icon_view_set_text_column (GTK_ICON_VIEW (widget), COLUMN_TEXT); + gtk_icon_view_set_pixbuf_column (GTK_ICON_VIEW (widget), COLUMN_PIXBUF); + g_signal_connect_swapped ( + widget, "selection-changed", + G_CALLBACK (multi_config_dialog_selection_changed_cb), dialog); + gtk_container_add (GTK_CONTAINER (container), widget); + dialog->priv->icon_view = g_object_ref (widget); + gtk_widget_show (widget); + g_object_unref (store); - g_signal_connect (e_table_scrolled_get_table (E_TABLE_SCROLLED (list_e_table))->table_canvas, - "realize", G_CALLBACK (canvas_realize), multi_config_dialog); + widget = gtk_notebook_new (); + gtk_notebook_set_show_tabs (GTK_NOTEBOOK (widget), FALSE); + gtk_notebook_set_show_border (GTK_NOTEBOOK (widget), FALSE); + gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0); + dialog->priv->notebook = g_object_ref (widget); + gtk_widget_show (widget); - g_object_unref (extras); + gtk_dialog_add_buttons ( + GTK_DIALOG (dialog), + GTK_STOCK_HELP, GTK_RESPONSE_HELP, + GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, + NULL); - gtk_box_pack_start (GTK_BOX (hbox), list_e_table, FALSE, TRUE, 0); + gtk_dialog_set_default_response ( + GTK_DIALOG (dialog), GTK_RESPONSE_CLOSE); +} - notebook = gtk_notebook_new (); - gtk_notebook_set_show_tabs (GTK_NOTEBOOK (notebook), FALSE); - gtk_notebook_set_show_border (GTK_NOTEBOOK (notebook), FALSE); - gtk_box_pack_start (GTK_BOX (hbox), notebook, TRUE, TRUE, 0); +GType +e_multi_config_dialog_get_type (void) +{ + static GType type = 0; + + if (G_UNLIKELY (type == 0)) { + const GTypeInfo type_info = { + sizeof (EMultiConfigDialogClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) multi_config_dialog_class_init, + (GClassFinalizeFunc) NULL, + NULL, /* class_data */ + sizeof (EMultiConfigDialog), + 0, /* n_preallocs */ + (GInstanceInitFunc) multi_config_dialog_init, + NULL /* value_table */ + }; + + type = g_type_register_static ( + GTK_TYPE_DIALOG, "EMultiConfigDialog", &type_info, 0); + } - gtk_widget_show (hbox); - gtk_widget_show (notebook); - gtk_widget_show (list_e_table); - - gtk_dialog_add_buttons (GTK_DIALOG (multi_config_dialog), - GTK_STOCK_HELP, GTK_RESPONSE_HELP, - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, - NULL); - gtk_dialog_set_default_response (GTK_DIALOG (multi_config_dialog), GTK_RESPONSE_OK); - - gtk_window_set_resizable (GTK_WINDOW (multi_config_dialog), TRUE); - - priv = g_new (EMultiConfigDialogPrivate, 1); - priv->pages = NULL; - priv->list_e_table = list_e_table; - priv->list_e_table_model = list_e_table_model; - priv->notebook = notebook; - priv->set_page_timeout_id = 0; - priv->set_page_timeout_page = 0; - - multi_config_dialog->priv = priv; + return type; } - GtkWidget * e_multi_config_dialog_new (void) { return g_object_new (e_multi_config_dialog_get_type (), NULL); } - void e_multi_config_dialog_add_page (EMultiConfigDialog *dialog, - const char *title, - const char *description, - GdkPixbuf *icon, + const gchar *caption, + const gchar *icon_name, EConfigPage *page_widget) { - EMultiConfigDialogPrivate *priv; - AtkObject *a11y; - AtkObject *a11yPage; - gint page_no; + GtkIconView *icon_view; + GtkNotebook *notebook; + GtkTreeModel *model; + GdkPixbuf *pixbuf; + GtkTreeIter iter; g_return_if_fail (E_IS_MULTI_CONFIG_DIALOG (dialog)); - g_return_if_fail (title != NULL); - g_return_if_fail (description != NULL); + g_return_if_fail (caption != NULL); + g_return_if_fail (icon_name != NULL); g_return_if_fail (E_IS_CONFIG_PAGE (page_widget)); - priv = dialog->priv; + icon_view = GTK_ICON_VIEW (dialog->priv->icon_view); + notebook = GTK_NOTEBOOK (dialog->priv->notebook); - priv->pages = g_slist_append (priv->pages, page_widget); + model = gtk_icon_view_get_model (icon_view); + pixbuf = multi_config_dialog_load_pixbuf (icon_name); - e_table_memory_store_insert (E_TABLE_MEMORY_STORE (priv->list_e_table_model), -1, NULL, title, icon, NULL, NULL, NULL); + gtk_list_store_append (GTK_LIST_STORE (model), &iter); - page_no = gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook), - create_page_container (description, GTK_WIDGET (page_widget)), - NULL); + gtk_list_store_set ( + GTK_LIST_STORE (model), &iter, + COLUMN_TEXT, caption, COLUMN_PIXBUF, pixbuf, -1); - a11y = gtk_widget_get_accessible (GTK_WIDGET(priv->notebook)); - a11yPage = atk_object_ref_accessible_child (a11y, page_no); - if (a11yPage != NULL) { - if (atk_object_get_role (a11yPage) == ATK_ROLE_PAGE_TAB) - atk_object_set_name (a11yPage, title); - g_object_unref (a11yPage); - } - if (priv->pages->next == NULL) { - ETable *table; - - /* FIXME: This is supposed to select the first entry by default - but it doesn't seem to work at all. */ - table = e_table_scrolled_get_table (E_TABLE_SCROLLED (priv->list_e_table)); - e_table_set_cursor_row (table, 0); - e_selection_model_select_all (e_table_get_selection_model (table)); + if (gtk_tree_model_iter_n_children (model, NULL) == 1) { + GtkTreePath *path; + + path = gtk_tree_path_new_first (); + gtk_icon_view_select_path (icon_view, path); + gtk_tree_path_free (path); } + + gtk_notebook_append_page ( + notebook, create_page_container ( + GTK_WIDGET (page_widget)), NULL); } void -e_multi_config_dialog_show_page (EMultiConfigDialog *dialog, int page) +e_multi_config_dialog_show_page (EMultiConfigDialog *dialog, + gint page) { - EMultiConfigDialogPrivate *priv; + GtkIconView *icon_view; + GtkNotebook *notebook; + GtkTreePath *path; - g_return_if_fail (dialog != NULL); g_return_if_fail (E_IS_MULTI_CONFIG_DIALOG (dialog)); - priv = dialog->priv; + icon_view = GTK_ICON_VIEW (dialog->priv->icon_view); + notebook = GTK_NOTEBOOK (dialog->priv->notebook); - e_table_set_cursor_row (e_table_scrolled_get_table (E_TABLE_SCROLLED (priv->list_e_table)), page); - gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), page); -} + path = gtk_tree_path_new_from_indices (page, -1); + gtk_icon_view_select_path (icon_view, path); + gtk_icon_view_scroll_to_path (icon_view, path, FALSE, 0.0, 0.0); + gtk_tree_path_free (path); + gtk_notebook_set_current_page (notebook, page); +} diff --git a/widgets/misc/e-multi-config-dialog.h b/widgets/misc/e-multi-config-dialog.h index f39c900573..f636f0d37d 100644 --- a/widgets/misc/e-multi-config-dialog.h +++ b/widgets/misc/e-multi-config-dialog.h @@ -16,12 +16,10 @@ * 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> */ -#ifndef _E_MULTI_CONFIG_DIALOG_H_ -#define _E_MULTI_CONFIG_DIALOG_H_ +#ifndef E_MULTI_CONFIG_DIALOG_H +#define E_MULTI_CONFIG_DIALOG_H #ifdef HAVE_CONFIG_H #include <config.h> @@ -31,25 +29,33 @@ #include <gtk/gtk.h> -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ +G_BEGIN_DECLS -#define E_TYPE_MULTI_CONFIG_DIALOG (e_multi_config_dialog_get_type ()) -#define E_MULTI_CONFIG_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_MULTI_CONFIG_DIALOG, EMultiConfigDialog)) -#define E_MULTI_CONFIG_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_MULTI_CONFIG_DIALOG, EMultiConfigDialogClass)) -#define E_IS_MULTI_CONFIG_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_MULTI_CONFIG_DIALOG)) -#define E_IS_MULTI_CONFIG_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_MULTI_CONFIG_DIALOG)) +/* Standard GObject macros */ +#define E_TYPE_MULTI_CONFIG_DIALOG \ + (e_multi_config_dialog_get_type ()) +#define E_MULTI_CONFIG_DIALOG(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST \ + ((obj), E_TYPE_MULTI_CONFIG_DIALOG, EMultiConfigDialog)) +#define E_MULTI_CONFIG_DIALOG_CLASS(cls) \ + (G_TYPE_CHECK_CLASS_CAST \ + ((cls), E_TYPE_MULTI_CONFIG_DIALOG, EMultiConfigDialogClass)) +#define E_IS_MULTI_CONFIG_DIALOG(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE \ + ((obj), E_TYPE_MULTI_CONFIG_DIALOG)) +#define E_IS_MULTI_CONFIG_DIALOG_CLASS(cls) \ + (G_TYPE_CHECK_CLASS_TYPE \ + ((obj), E_TYPE_MULTI_CONFIG_DIALOG)) +#define E_MULTI_CONFIG_DIALOG_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_TYPE \ + ((obj), E_TYPE_MULTI_CONFIG_DIALOG, EMultiConfigDialogClass)) - -typedef struct _EMultiConfigDialog EMultiConfigDialog; +typedef struct _EMultiConfigDialog EMultiConfigDialog; +typedef struct _EMultiConfigDialogClass EMultiConfigDialogClass; typedef struct _EMultiConfigDialogPrivate EMultiConfigDialogPrivate; -typedef struct _EMultiConfigDialogClass EMultiConfigDialogClass; struct _EMultiConfigDialog { GtkDialog parent; - EMultiConfigDialogPrivate *priv; }; @@ -57,20 +63,16 @@ struct _EMultiConfigDialogClass { GtkDialogClass parent_class; }; - -GType e_multi_config_dialog_get_type (void); -GtkWidget *e_multi_config_dialog_new (void); +GType e_multi_config_dialog_get_type (void); +GtkWidget * e_multi_config_dialog_new (void); -void e_multi_config_dialog_add_page (EMultiConfigDialog *dialog, - const char *title, - const char *description, - GdkPixbuf *icon, - EConfigPage *page); -void e_multi_config_dialog_show_page (EMultiConfigDialog *dialog, - int page); +void e_multi_config_dialog_add_page (EMultiConfigDialog *dialog, + const gchar *caption, + const gchar *icon_name, + EConfigPage *page); +void e_multi_config_dialog_show_page (EMultiConfigDialog *dialog, + gint page); -#ifdef __cplusplus -} -#endif /* __cplusplus */ +G_END_DECLS -#endif /* _E_MULTI_CONFIG_DIALOG_H_ */ +#endif /* E_MULTI_CONFIG_DIALOG_H */ diff --git a/widgets/misc/test-multi-config-dialog.c b/widgets/misc/test-multi-config-dialog.c index 187f1d4ab3..b9439722e9 100644 --- a/widgets/misc/test-multi-config-dialog.c +++ b/widgets/misc/test-multi-config-dialog.c @@ -41,10 +41,8 @@ add_pages (EMultiConfigDialog *multi_config_dialog) GtkWidget *page; char *string; char *title; - char *description; string = g_strdup_printf ("This is page %d", i); - description = g_strdup_printf ("Description of page %d", i); title = g_strdup_printf ("Title of page %d", i); widget = gtk_label_new (string); @@ -53,12 +51,12 @@ add_pages (EMultiConfigDialog *multi_config_dialog) page = e_config_page_new (); gtk_container_add (GTK_CONTAINER (page), widget); - e_multi_config_dialog_add_page (multi_config_dialog, title, description, NULL, - E_CONFIG_PAGE (page)); + e_multi_config_dialog_add_page ( + multi_config_dialog, title, "gtk-properties", + E_CONFIG_PAGE (page)); g_free (string); g_free (title); - g_free (description); } } |