evolution r35748 - in branches/kill-bonobo: . shell widgets/misc



Author: mbarnes
Date: Wed Jul 16 19:37:02 2008
New Revision: 35748
URL: http://svn.gnome.org/viewvc/evolution?rev=35748&view=rev

Log:
Disable all components and plugins.  Begin rewriting the shell.


Added:
   branches/kill-bonobo/shell/e-shell-common.h
   branches/kill-bonobo/shell/e-shell-module.c
   branches/kill-bonobo/shell/e-shell-module.h
   branches/kill-bonobo/shell/e-shell-registry.c
   branches/kill-bonobo/shell/e-shell-registry.h
   branches/kill-bonobo/shell/e-shell-window-actions.c
   branches/kill-bonobo/shell/e-shell-window-actions.h
   branches/kill-bonobo/shell/e-shell-window-private.c
   branches/kill-bonobo/shell/e-shell-window-private.h
   branches/kill-bonobo/widgets/misc/e-online-button.c
   branches/kill-bonobo/widgets/misc/e-online-button.h
Removed:
   branches/kill-bonobo/shell/e-component-view.c
   branches/kill-bonobo/shell/e-component-view.h
   branches/kill-bonobo/shell/e-shell-window-commands.c
   branches/kill-bonobo/shell/e-shell-window-commands.h
   branches/kill-bonobo/shell/evolution-component.c
   branches/kill-bonobo/shell/evolution-component.h
Modified:
   branches/kill-bonobo/Makefile.am
   branches/kill-bonobo/shell/Makefile.am
   branches/kill-bonobo/shell/apps_evolution_shell.schemas.in
   branches/kill-bonobo/shell/e-shell-view.c
   branches/kill-bonobo/shell/e-shell-view.h
   branches/kill-bonobo/shell/e-shell-window.c
   branches/kill-bonobo/shell/e-shell-window.h
   branches/kill-bonobo/shell/e-shell.c
   branches/kill-bonobo/shell/e-shell.h
   branches/kill-bonobo/shell/e-sidebar.c
   branches/kill-bonobo/shell/e-sidebar.h
   branches/kill-bonobo/shell/main.c
   branches/kill-bonobo/widgets/misc/Makefile.am

Modified: branches/kill-bonobo/Makefile.am
==============================================================================
--- branches/kill-bonobo/Makefile.am	(original)
+++ branches/kill-bonobo/Makefile.am	Wed Jul 16 19:37:02 2008
@@ -31,6 +31,29 @@
 SMIME_DIR=smime
 endif
 
+# Disabled component and plugin directories during shell rewrite.
+
+#SUBDIRS = 			\
+#	win32			\
+#	data                    \
+#	e-util                  \
+#	a11y			\
+#	widgets                 \
+#	shell                   \
+#	filter			\
+#	$(SMIME_DIR)		\
+#	addressbook		\
+#	calendar		\
+#	art                     \
+#	composer		\
+#	mail			\
+#	plugins			\
+#	ui			\
+#	views			\
+#	tools			\
+#	po			\
+#	sounds
+
 SUBDIRS = 			\
 	win32			\
         data                    \
@@ -38,14 +61,7 @@
 	a11y			\
         widgets                 \
         shell                   \
-	filter			\
-	$(SMIME_DIR)		\
-	addressbook		\
-	calendar		\
         art                     \
-	composer		\
-	mail			\
-	plugins			\
 	ui			\
 	views			\
 	tools			\

Modified: branches/kill-bonobo/shell/Makefile.am
==============================================================================
--- branches/kill-bonobo/shell/Makefile.am	(original)
+++ branches/kill-bonobo/shell/Makefile.am	Wed Jul 16 19:37:02 2008
@@ -13,6 +13,7 @@
 	-DEVOLUTION_DATADIR=\""$(datadir)"\"			\
 	-DEVOLUTION_GLADEDIR=\""$(gladedir)"\"			\
 	-DEVOLUTION_HELPDIR=\""$(evolutionhelpdir)"\"		\
+	-DEVOLUTION_MODULEDIR=\""$(evolutionmoduledir)"\"	\
 	-DEVOLUTION_UIDIR=\""$(evolutionuidir)"\"		\
 	-DEVOLUTION_TOOLSDIR=\""$(privlibexecdir)"\"		\
 	-DPREFIX=\""$(prefix)"\"				\
@@ -89,10 +90,13 @@
 
 eshellinclude_HEADERS = 			\
 	Evolution.h				\
-	e-component-view.h			\
+	e-shell-common.h			\
+	e-shell-module.h			\
+	e-shell-view.h				\
+	e-shell-window.h			\
+	e-shell-window-actions.h		\
 	e-user-creatable-items-handler.h	\
 	evolution-config-control.h		\
-	evolution-component.h			\
 	evolution-listener.h			\
 	evolution-shell-component-utils.h	\
 	es-event.h				\
@@ -101,8 +105,10 @@
 libeshell_la_SOURCES =				\
 	$(IDL_GENERATED)			\
 	$(MARSHAL_GENERATED)			\
-	e-component-view.c			\
-	evolution-component.c			\
+	e-shell-module.c			\
+	e-shell-view.c				\
+	e-shell-window.c			\
+	e-shell-window-actions.c		\
 	evolution-listener.c			\
 	e-user-creatable-items-handler.c	\
 	evolution-config-control.c		\
@@ -132,14 +138,12 @@
 	e-shell-constants.h			\
 	e-shell-importer.c			\
 	e-shell-importer.h			\
+	e-shell-registry.c			\
+	e-shell-registry.h			\
 	e-shell-settings-dialog.c		\
 	e-shell-settings-dialog.h		\
-	e-shell-window-commands.c		\
-	e-shell-window-commands.h		\
-	e-shell-window.c			\
-	e-shell-window.h			\
-	e-shell-view.c				\
-	e-shell-view.h				\
+	e-shell-window-private.c		\
+	e-shell-window-private.h		\
 	e-sidebar.c				\
 	e-sidebar.h				\
 	es-event.c				\

Modified: branches/kill-bonobo/shell/apps_evolution_shell.schemas.in
==============================================================================
--- branches/kill-bonobo/shell/apps_evolution_shell.schemas.in	(original)
+++ branches/kill-bonobo/shell/apps_evolution_shell.schemas.in	Wed Jul 16 19:37:02 2008
@@ -96,8 +96,8 @@
     <!-- View defaults -->
 
     <schema>
-      <key>/schemas/apps/evolution/shell/view_defaults/width</key>
-      <applyto>/apps/evolution/shell/view_defaults/width</applyto>
+      <key>/schemas/apps/evolution/shell/view_defaults/window_width</key>
+      <applyto>/apps/evolution/shell/view_defaults/window_width</applyto>
       <owner>evolution</owner>
       <type>int</type>
       <default>640</default>
@@ -108,8 +108,8 @@
     </schema>
 
     <schema>
-      <key>/schemas/apps/evolution/shell/view_defaults/height</key>
-      <applyto>/apps/evolution/shell/view_defaults/height</applyto>
+      <key>/schemas/apps/evolution/shell/view_defaults/window_height</key>
+      <applyto>/apps/evolution/shell/view_defaults/window_height</applyto>
       <owner>evolution</owner>
       <type>int</type>
       <default>480</default>
@@ -120,20 +120,8 @@
     </schema>
 
     <schema>
-      <key>/schemas/apps/evolution/shell/view_defaults/maximized</key>
-      <applyto>/apps/evolution/shell/view_defaults/maximized</applyto>
-      <owner>evolution</owner>
-      <type>bool</type>
-      <default>TRUE</default>
-      <locale name="C">
-        <short>Default window state</short>
-        <long>Whether or not the window should be maximized.</long>
-      </locale>
-    </schema>
-
-    <schema>
-      <key>/schemas/apps/evolution/shell/view_defaults/maximized</key>
-      <applyto>/apps/evolution/shell/view_defaults/maximized</applyto>
+      <key>/schemas/apps/evolution/shell/view_defaults/window_maximized</key>
+      <applyto>/apps/evolution/shell/view_defaults/window_maximized</applyto>
       <owner>evolution</owner>
       <type>bool</type>
       <default>TRUE</default>

Added: branches/kill-bonobo/shell/e-shell-common.h
==============================================================================
--- (empty file)
+++ branches/kill-bonobo/shell/e-shell-common.h	Wed Jul 16 19:37:02 2008
@@ -0,0 +1,30 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/* e-shell-common.h
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef E_SHELL_COMMON_H
+#define E_SHELL_COMMON_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+
+#endif /* E_SHELL_COMMON_H */

Added: branches/kill-bonobo/shell/e-shell-module.c
==============================================================================
--- (empty file)
+++ branches/kill-bonobo/shell/e-shell-module.c	Wed Jul 16 19:37:02 2008
@@ -0,0 +1,270 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/* e-shell-module.c
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "e-shell-module.h"
+
+#include <gmodule.h>
+#include <glib/gi18n.h>
+
+/* This is the symbol we look for when loading a module. */
+#define INIT_SYMBOL	"e_shell_module_init"
+
+#define E_SHELL_MODULE_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), E_TYPE_SHELL_MODULE, EShellModulePrivate))
+
+struct _EShellModulePrivate {
+
+	/* Set during module initialization.  This must come
+	 * first in the struct so the registry can read it. */
+	EShellModuleInfo info;
+
+	GModule *module;
+	gchar *filename;
+
+	/* Initializes the loaded module. */
+	void (*init) (GTypeModule *module);
+};
+
+enum {
+	PROP_0,
+	PROP_FILENAME
+};
+
+static gpointer parent_class;
+
+static void
+shell_module_set_filename (EShellModule *shell_module,
+                           const gchar *filename)
+{
+	g_free (shell_module->priv->filename);
+	shell_module->priv->filename = g_strdup (filename);
+}
+
+static void
+shell_module_set_property (GObject *object,
+                           guint property_id,
+                           const GValue *value,
+                           GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_FILENAME:
+			shell_module_set_filename (
+				E_SHELL_MODULE (object),
+				g_value_get_string (value));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+shell_module_get_property (GObject *object,
+                           guint property_id,
+                           GValue *value,
+                           GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_FILENAME:
+			g_value_set_string (
+				value, e_shell_module_get_filename (
+				E_SHELL_MODULE (object)));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+shell_module_finalize (GObject *object)
+{
+	EShellModulePrivate *priv;
+
+	priv = E_SHELL_MODULE_GET_PRIVATE (object);
+
+	g_free (priv->filename);
+
+	/* Chain up to parent's finalize() method. */
+	G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static gboolean
+shell_module_load (GTypeModule *type_module)
+{
+	EShellModulePrivate *priv;
+	gpointer symbol;
+
+	priv = E_SHELL_MODULE_GET_PRIVATE (type_module);
+
+	g_return_val_if_fail (priv->filename != NULL, FALSE);
+	priv->module = g_module_open (priv->filename, 0);
+
+	if (priv->module == NULL)
+		goto fail;
+
+	if (!g_module_symbol (priv->module, INIT_SYMBOL, &symbol))
+		goto fail;
+
+	priv->init = symbol;
+	priv->init (type_module);
+
+	return TRUE;
+
+fail:
+	g_warning ("%s", g_module_error ());
+
+	if (priv->module != NULL)
+		g_module_close (priv->module);
+
+	return FALSE;
+}
+
+static void
+shell_module_unload (GTypeModule *type_module)
+{
+	EShellModulePrivate *priv;
+
+	priv = E_SHELL_MODULE_GET_PRIVATE (type_module);
+
+	g_module_close (priv->module);
+	priv->module = NULL;
+
+	priv->init = NULL;
+}
+
+static void
+shell_module_class_init (EShellModuleClass *class)
+{
+	GObjectClass *object_class;
+	GTypeModuleClass *type_module_class;
+
+	parent_class = g_type_class_peek_parent (class);
+	g_type_class_add_private (class, sizeof (EShellModulePrivate));
+
+	object_class = G_OBJECT_CLASS (class);
+	object_class->set_property = shell_module_set_property;
+	object_class->get_property = shell_module_get_property;
+	object_class->finalize = shell_module_finalize;
+
+	type_module_class = G_TYPE_MODULE_CLASS (class);
+	type_module_class->load = shell_module_load;
+	type_module_class->unload = shell_module_unload;
+
+	g_object_class_install_property (
+		object_class,
+		PROP_FILENAME,
+		g_param_spec_string (
+			"filename",
+			_("Filename"),
+			_("The filename of the module"),
+			NULL,
+			G_PARAM_READWRITE |
+			G_PARAM_CONSTRUCT_ONLY));
+}
+
+static void
+shell_module_init (EShellModule *shell_module)
+{
+	shell_module->priv = E_SHELL_MODULE_GET_PRIVATE (shell_module);
+}
+
+GType
+e_shell_module_get_type (void)
+{
+	static GType type = 0;
+
+	if (G_UNLIKELY (type == 0)) {
+		const GTypeInfo type_info = {
+			sizeof (EShellModuleClass),
+			(GBaseInitFunc) NULL,
+			(GBaseFinalizeFunc) NULL,
+			(GClassInitFunc) shell_module_class_init,
+			(GClassFinalizeFunc) NULL,
+			NULL,  /* class_data */
+			sizeof (EShellModule),
+			0,     /* n_preallocs */
+			(GInstanceInitFunc) shell_module_init,
+			NULL   /* value_table */
+		};
+
+		type = g_type_register_static (
+			G_TYPE_TYPE_MODULE, "EShellModule", &type_info, 0);
+	}
+
+	return type;
+}
+
+EShellModule *
+e_shell_module_new (const gchar *filename)
+{
+	g_return_val_if_fail (filename != NULL, NULL);
+
+	return g_object_new (E_TYPE_SHELL_MODULE, "filename", filename, NULL);
+}
+
+gint
+e_shell_module_compare (EShellModule *shell_module_a,
+                        EShellModule *shell_module_b)
+{
+	gint a = shell_module_a->priv->info.sort_order;
+	gint b = shell_module_b->priv->info.sort_order;
+
+	return (a < b) ? -1 : (a > b);
+}
+
+const gchar *
+e_shell_module_get_filename (EShellModule *shell_module)
+{
+	g_return_val_if_fail (E_IS_SHELL_MODULE (shell_module), NULL);
+
+	return shell_module->priv->filename;
+}
+
+GType
+e_shell_module_get_view_type (EShellModule *shell_module)
+{
+	g_return_val_if_fail (E_IS_SHELL_MODULE (shell_module), 0);
+
+	return shell_module->priv->info.shell_view_type;
+}
+
+void
+e_shell_module_window_created (EShellModule *shell_module,
+                               EShellWindow *shell_window)
+{
+	g_return_if_fail (E_IS_SHELL_MODULE (shell_module));
+	g_return_if_fail (E_IS_SHELL_WINDOW (shell_window));
+
+	if (shell_module->priv->info.window_created != NULL)
+		shell_module->priv->info.window_created (shell_window);
+}
+
+void
+e_shell_module_set_info (EShellModule *shell_module,
+                         const EShellModuleInfo *info)
+{
+	g_return_if_fail (E_IS_SHELL_MODULE (shell_module));
+	g_return_if_fail (info != NULL);
+
+	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.shell_view_type = info->shell_view_type;
+}

Added: branches/kill-bonobo/shell/e-shell-module.h
==============================================================================
--- (empty file)
+++ branches/kill-bonobo/shell/e-shell-module.h	Wed Jul 16 19:37:02 2008
@@ -0,0 +1,84 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/* e-shell-module.h
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef E_SHELL_MODULE_H
+#define E_SHELL_MODULE_H
+
+#include "e-shell-common.h"
+#include "e-shell-window.h"
+
+/* Standard GObject macros */
+#define E_TYPE_SHELL_MODULE \
+	(e_shell_module_get_type ())
+#define E_SHELL_MODULE(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), E_TYPE_SHELL_MODULE, EShellModule))
+#define E_SHELL_MODULE_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), E_TYPE_SHELL_MODULE, EShellModuleClass))
+#define E_IS_SHELL_MODULE(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), E_TYPE_SHELL_MODULE))
+#define E_IS_SHELL_MODULE_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((cls), E_TYPE_SHELL_MODULE))
+#define E_SHELL_MODULE_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), E_TYPE_SHELL_MODULE, EShellModuleClass))
+
+G_BEGIN_DECLS
+
+typedef struct _EShellModule EShellModule;
+typedef struct _EShellModuleInfo EShellModuleInfo;
+typedef struct _EShellModuleClass EShellModuleClass;
+typedef struct _EShellModulePrivate EShellModulePrivate;
+
+struct _EShellModuleInfo {
+	gint sort_order;
+	const gchar *aliases;   /* colon-separated list */
+	const gchar *schemas;   /* colon-separated list */
+	GType shell_view_type;  /* EShellView subclass  */
+
+	void (*window_created) (EShellWindow *window);
+};
+
+struct _EShellModule {
+	GTypeModule parent;
+	EShellModulePrivate *priv;
+};
+
+struct _EShellModuleClass {
+	GTypeModuleClass parent_class;
+};
+
+GType		e_shell_module_get_type		(void);
+EShellModule *	e_shell_module_new		(const gchar *filename);
+gint		e_shell_module_compare		(EShellModule *shell_module_a,
+						 EShellModule *shell_module_b);
+const gchar *	e_shell_module_get_filename	(EShellModule *shell_module);
+GType		e_shell_module_get_view_type	(EShellModule *shell_module);
+void		e_shell_module_window_created	(EShellModule *shell_module,
+						 EShellWindow *shell_window);
+void		e_shell_module_set_info		(EShellModule *shell_module,
+						 const EShellModuleInfo *info);
+
+G_END_DECLS
+
+#endif /* E_SHELL_MODULE_H */

Added: branches/kill-bonobo/shell/e-shell-registry.c
==============================================================================
--- (empty file)
+++ branches/kill-bonobo/shell/e-shell-registry.c	Wed Jul 16 19:37:02 2008
@@ -0,0 +1,170 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/* e-shell-registry.c
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "e-shell-registry.h"
+
+static GList *loaded_modules;
+static GHashTable *modules_by_name;
+static GHashTable *modules_by_schema;
+
+static void
+shell_registry_insert_items (GHashTable *hash_table,
+                             const gchar *items,
+                             EShellModule *shell_module)
+{
+	gpointer key;
+	gchar **strv;
+	gint ii;
+
+	strv = g_strsplit_set (items, ":", -1);
+
+	for (ii = 0; strv[ii] != NULL; ii++) {
+		key = (gpointer) g_intern_string (strv[ii]);
+		g_hash_table_insert (hash_table, key, shell_module);
+	}
+
+	g_strfreev (strv);
+}
+
+static void
+shell_registry_query_module (const gchar *filename)
+{
+	EShellModule *shell_module;
+	EShellModuleInfo *info;
+	const gchar *string;
+
+	shell_module = e_shell_module_new (filename);
+
+	if (!g_type_module_use (G_TYPE_MODULE (shell_module))) {
+		g_critical ("Failed to load module: %s", filename);
+		g_object_unref (shell_module);
+		return;
+	}
+
+	g_type_module_unuse (G_TYPE_MODULE (shell_module));
+
+	loaded_modules = g_list_insert_sorted (
+		loaded_modules, shell_module,
+		(GCompareFunc) e_shell_module_compare);
+
+	/* Bookkeeping */
+
+	info = (EShellModuleInfo *) shell_module->priv;
+
+	if ((string = G_TYPE_MODULE (shell_module)->name) != NULL)
+		g_hash_table_insert (
+			modules_by_name, (gpointer)
+			g_intern_string (string), shell_module);
+
+	if ((string = info->aliases) != NULL)
+		shell_registry_insert_items (
+			modules_by_name, string, shell_module);
+
+	if ((string = info->schemas) != NULL)
+		shell_registry_insert_items (
+			modules_by_schema, string, shell_module);
+}
+
+void
+e_shell_registry_init (void)
+{
+	GDir *dir;
+	const gchar *dirname;
+	const gchar *basename;
+	GError *error = NULL;
+
+	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);
+
+	dirname = EVOLUTION_MODULEDIR;
+
+	dir = g_dir_open (dirname, 0, &error);
+	if (dir == NULL) {
+		g_critical ("%s", error->message);
+		g_error_free (error);
+		return;
+	}
+
+	while ((basename = g_dir_read_name (dir)) != NULL) {
+		gchar *filename;
+
+		if (!g_str_has_suffix (basename, "." G_MODULE_SUFFIX))
+			continue;
+
+		filename = g_build_filename (dirname, basename, NULL);
+		shell_registry_query_module (filename);
+		g_free (filename);
+	}
+
+	g_dir_close (dir);
+}
+
+GType *
+e_shell_registry_get_view_types (guint *n_types)
+{
+	GType *types;
+	GList *iter;
+	guint ii = 0;
+
+	types = g_new0 (GType, g_list_length (loaded_modules) + 1);
+
+	for (iter = loaded_modules; iter != NULL; iter = iter->next) {
+		EShellModule *shell_module = iter->data;
+		EShellModuleInfo *info;
+
+		info = (EShellModuleInfo *) shell_module->priv;
+
+		/* Allow for modules with no corresponding view type. */
+		if (!g_type_is_a (info->shell_view_type, E_TYPE_SHELL_VIEW))
+			continue;
+
+		types[ii++] = info->shell_view_type;
+	}
+
+	if (n_types != NULL)
+		*n_types = ii;
+
+	return types;
+}
+
+void
+e_shell_registry_foreach_module (GFunc func,
+                                 gpointer user_data)
+{
+	g_list_foreach (loaded_modules, func, user_data);
+}
+
+EShellModule *
+e_shell_registry_get_module_by_name (const gchar *name)
+{
+	g_return_val_if_fail (name != NULL, NULL);
+
+	return g_hash_table_lookup (modules_by_name, name);
+}
+
+EShellModule *
+e_shell_registry_get_module_by_schema (const gchar *schema)
+{
+	g_return_val_if_fail (schema != NULL, NULL);
+
+	return g_hash_table_lookup (modules_by_schema, schema);
+}

Added: branches/kill-bonobo/shell/e-shell-registry.h
==============================================================================
--- (empty file)
+++ branches/kill-bonobo/shell/e-shell-registry.h	Wed Jul 16 19:37:02 2008
@@ -0,0 +1,38 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/* e-shell-registry.h
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef E_SHELL_REGISTRY
+#define E_SHELL_REGISTRY
+
+#include "e-shell-common.h"
+#include "e-shell-module.h"
+
+G_BEGIN_DECLS
+
+void		e_shell_registry_init			(void);
+GType *		e_shell_registry_get_view_types		(guint *n_types);
+void		e_shell_registry_foreach_module		(GFunc func,
+							 gpointer user_data);
+EShellModule *	e_shell_registry_get_module_by_name	(const gchar *name);
+EShellModule *	e_shell_registry_get_module_by_schema	(const gchar *schema);
+
+G_END_DECLS
+
+#endif /* E_SHELL_REGISTRY */

Modified: branches/kill-bonobo/shell/e-shell-view.c
==============================================================================
--- branches/kill-bonobo/shell/e-shell-view.c	(original)
+++ branches/kill-bonobo/shell/e-shell-view.c	Wed Jul 16 19:37:02 2008
@@ -3,8 +3,6 @@
  *
  * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
  *
- * Author(s): Michael Zucchi <notzed ximian com>
- *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of version 2 of the GNU General Public
  * License as published by the Free Software Foundation.
@@ -18,130 +16,252 @@
  * License along with this program; if not, write to the
  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
  * Boston, MA 02110-1301, USA.
- *
- * Helper class for evolution shells to setup a view
  */
 
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
+#include "e-shell-view.h"
 
-#include <gtk/gtk.h>
 #include <glib/gi18n.h>
 
-#include "e-shell-view.h"
 #include "e-shell-window.h"
-#include "e-util/e-icon-factory.h"
 
-static BonoboObjectClass *parent_class = NULL;
+#define E_SHELL_VIEW_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), E_TYPE_SHELL_VIEW, EShellViewPrivate))
 
 struct _EShellViewPrivate {
-	int dummy;
+	gchar *title;
+	gpointer window;  /* weak pointer */
+};
+
+enum {
+	PROP_0,
+	PROP_TITLE,
+	PROP_WINDOW
 };
 
+static gpointer parent_class;
+
 static void
-impl_ShellView_setTitle(PortableServer_Servant _servant, const CORBA_char *id, const CORBA_char * title, CORBA_Environment * ev)
+shell_view_set_window (EShellView *shell_view,
+                       GtkWindow *window)
 {
-	EShellView *esw = (EShellView *)bonobo_object_from_servant(_servant);
-	/* To translators: This is the window title and %s is the
-	component name. Most translators will want to keep it as is. */
-	char *tmp = g_strdup_printf(_("%s - Evolution"), title);
+	g_return_if_fail (GTK_IS_WINDOW (window));
+
+	shell_view->priv->window = window;
 
-	e_shell_window_set_title(esw->window, id, tmp);
-	g_free(tmp);
+	g_object_add_weak_pointer (
+		G_OBJECT (window), &shell_view->priv->window);
 }
 
 static void
-impl_ShellView_setComponent(PortableServer_Servant _servant, const CORBA_char *id, CORBA_Environment * ev)
+shell_view_set_property (GObject *object,
+                         guint property_id,
+                         const GValue *value,
+                         GParamSpec *pspec)
 {
-	EShellView *esw = (EShellView *)bonobo_object_from_servant(_servant);
+	switch (property_id) {
+		case PROP_TITLE:
+			e_shell_view_set_title (
+				E_SHELL_VIEW (object),
+				g_value_get_string (value));
+			return;
+
+		case PROP_WINDOW:
+			shell_view_set_window (
+				E_SHELL_VIEW (object),
+				g_value_get_object (value));
+			return;
+	}
 
-	e_shell_window_switch_to_component(esw->window, id);
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 }
 
-struct change_icon_struct {
-	const char *component_name;
-	GdkPixbuf *icon;
-};
+static void
+shell_view_get_property (GObject *object,
+                         guint property_id,
+                         GValue *value,
+                         GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_TITLE:
+			g_value_set_string (
+				value, e_shell_view_get_title (
+				E_SHELL_VIEW (object)));
+			return;
+
+		case PROP_WINDOW:
+			g_value_set_object (
+				value, e_shell_view_get_window (
+				E_SHELL_VIEW (object)));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
 
-static gboolean
-change_button_icon_func (EShell *shell, EShellWindow *window, gpointer user_data)
+static void
+shell_view_dispose (GObject *object)
 {
-	struct change_icon_struct *cis = (struct change_icon_struct*)user_data;
+	EShellViewPrivate *priv;
 
-	g_return_val_if_fail (window != NULL, FALSE);
-	g_return_val_if_fail (cis != NULL, FALSE);
+	priv = E_SHELL_VIEW_GET_PRIVATE (object);
 
-	e_shell_window_change_component_button_icon (window, cis->component_name, cis->icon);
+	if (priv->window != NULL) {
+		g_object_remove_weak_pointer (
+			G_OBJECT (priv->window), &priv->window);
+		priv->window = NULL;
+	}
 
-	return TRUE;
+	/* Chain up to parent's dispose() method. */
+	G_OBJECT_CLASS (parent_class)->dispose (object);
 }
 
 static void
-impl_ShellView_setButtonIcon (PortableServer_Servant _servant, const CORBA_char *id, const CORBA_char * iconName, CORBA_Environment * ev)
+shell_view_finalize (GObject *object)
 {
-	EShellView *esw = (EShellView *)bonobo_object_from_servant(_servant);
-	EShell *shell = e_shell_window_peek_shell (esw->window);
-
-	struct change_icon_struct cis;
-	cis.component_name = id;
-	cis.icon = NULL;
+	EShellViewPrivate *priv;
 
-	if (iconName)
-		cis.icon = e_icon_factory_get_icon (iconName, E_ICON_SIZE_BUTTON);
+	priv = E_SHELL_VIEW_GET_PRIVATE (object);
 
-	e_shell_foreach_shell_window (shell, change_button_icon_func, &cis);
+	g_free (priv->title);
 
-	if (cis.icon)
-		g_object_unref (cis.icon);
+	/* Chain up to parent's finalize() method. */
+	G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
 static void
-impl_dispose (GObject *object)
+shell_view_class_init (EShellViewClass *class)
 {
-	/*EShellView *esv = (EShellView *)object;*/
+	GObjectClass *object_class;
+
+	parent_class = g_type_class_peek_parent (class);
+	g_type_class_add_private (class, sizeof (EShellViewPrivate));
 
-	((GObjectClass *)parent_class)->dispose(object);
+	object_class = G_OBJECT_CLASS (class);
+	object_class->set_property = shell_view_set_property;
+	object_class->get_property = shell_view_get_property;
+	object_class->dispose = shell_view_dispose;
+	object_class->finalize = shell_view_finalize;
+
+	g_object_class_install_property (
+		object_class,
+		PROP_TITLE,
+		g_param_spec_string (
+			"title",
+			_("Title"),
+			_("The title of the shell view"),
+			NULL,
+			G_PARAM_READWRITE |
+			G_PARAM_CONSTRUCT));
+
+	g_object_class_install_property (
+		object_class,
+		PROP_WINDOW,
+		g_param_spec_object (
+			"window",
+			_("Window"),
+			_("The window to which the shell view belongs"),
+			GTK_TYPE_WINDOW,
+			G_PARAM_READWRITE |
+			G_PARAM_CONSTRUCT_ONLY));
 }
 
 static void
-impl_finalise (GObject *object)
+shell_view_init (EShellView *shell_view)
 {
-	((GObjectClass *)parent_class)->finalize(object);
+	shell_view->priv = E_SHELL_VIEW_GET_PRIVATE (shell_view);
 }
 
-static void
-e_shell_view_class_init (EShellViewClass *klass)
+GType
+e_shell_view_get_type (void)
 {
-	GObjectClass *object_class;
-	POA_GNOME_Evolution_ShellView__epv *epv;
+	static GType type = 0;
+
+	if (G_UNLIKELY (type == 0)) {
+		const GTypeInfo type_info = {
+			sizeof (EShellViewClass),
+			(GBaseInitFunc) NULL,
+			(GBaseFinalizeFunc) NULL,
+			(GClassInitFunc) shell_view_class_init,
+			(GClassFinalizeFunc) NULL,
+			NULL,  /* class_data */
+			sizeof (EShellView),
+			0,     /* n_preallocs */
+			(GInstanceInitFunc) shell_view_init,
+			NULL   /* value_table */
+		};
+
+		type = g_type_register_static (
+			G_TYPE_OBJECT, "EShellView",
+			&type_info, G_TYPE_FLAG_ABSTRACT);
+	}
 
-	parent_class = g_type_class_ref(bonobo_object_get_type());
+	return type;
+}
 
-	object_class = G_OBJECT_CLASS (klass);
-	object_class->dispose  = impl_dispose;
-	object_class->finalize = impl_finalise;
+const gchar *
+e_shell_view_get_title (EShellView *shell_view)
+{
+	g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
 
-	epv = & klass->epv;
-	epv->setTitle = impl_ShellView_setTitle;
-	epv->setComponent = impl_ShellView_setComponent;
-	epv->setButtonIcon = impl_ShellView_setButtonIcon;
+	return shell_view->priv->title;
 }
 
-static void
-e_shell_view_init (EShellView *shell)
+void
+e_shell_view_set_title (EShellView *shell_view,
+                        const gchar *title)
+{
+	g_return_if_fail (E_IS_SHELL_VIEW (shell_view));
+
+	g_free (shell_view->priv->title);
+	shell_view->priv->title = g_strdup (title);
+
+	g_object_notify (G_OBJECT (shell_view), "title");
+}
+
+GtkWindow *
+e_shell_view_get_window (EShellView *shell_view)
+{
+	g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
+
+	return shell_view->priv->window;
+}
+
+GtkWidget *
+e_shell_view_get_content_widget (EShellView *shell_view)
 {
+	EShellViewClass *class;
+
+	g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
+
+	class = E_SHELL_VIEW_CLASS (shell_view);
+	g_return_val_if_fail (class->get_content_widget != NULL, NULL);
+
+	return class->get_content_widget (shell_view);
 }
 
-EShellView *e_shell_view_new(struct _EShellWindow *window)
+GtkWidget *
+e_shell_view_get_sidebar_widget (EShellView *shell_view)
 {
-	EShellView *new = g_object_new (e_shell_view_get_type (), NULL);
+	EShellViewClass *class;
 
-	/* TODO: listen to destroy? */
-	new->window = window;
+	g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
 
-	return new;
+	class = E_SHELL_VIEW_CLASS (shell_view);
+	g_return_val_if_fail (class->get_sidebar_widget != NULL, NULL);
+
+	return class->get_sidebar_widget (shell_view);
 }
 
-BONOBO_TYPE_FUNC_FULL (EShellView, GNOME_Evolution_ShellView, bonobo_object_get_type(), e_shell_view)
+GtkWidget *
+e_shell_view_get_status_widget (EShellView *shell_view)
+{
+	EShellViewClass *class;
+
+	g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
 
+	class = E_SHELL_VIEW_CLASS (shell_view);
+	g_return_val_if_fail (class->get_status_widget != NULL, NULL);
+
+	return class->get_status_widget (shell_view);
+}

Modified: branches/kill-bonobo/shell/e-shell-view.h
==============================================================================
--- branches/kill-bonobo/shell/e-shell-view.h	(original)
+++ branches/kill-bonobo/shell/e-shell-view.h	Wed Jul 16 19:37:02 2008
@@ -16,55 +16,64 @@
  * License along with this program; if not, write to the
  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
  * Boston, MA 02110-1301, USA.
- *
- * This is only a CORBA wrapper around e_shell_window.
  */
 
-#ifndef _E_SHELL_VIEW_H_
-#define _E_SHELL_VIEW_H_
+#ifndef E_SHELL_VIEW_H
+#define E_SHELL_VIEW_H
 
-#include <bonobo-activation/bonobo-activation.h>
-#include <bonobo/bonobo-object.h>
+#include "e-shell-common.h"
 
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
+/* Standard GObject macros */
+#define E_TYPE_SHELL_VIEW \
+	(e_shell_view_get_type ())
+#define E_SHELL_VIEW(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), E_TYPE_SHELL_VIEW, EShellView))
+#define E_SHELL_VIEW_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), E_TYPE_SHELL_VIEW, EShellViewClass))
+#define E_IS_SHELL_VIEW(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), E_TYPE_SHELL_VIEW))
+#define E_IS_SHELL_VIEW_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((obj), E_TYPE_SHELL_VIEW))
+#define E_SHELL_VIEW_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), E_TYPE_SHELL_VIEW, EShellViewClass))
 
-struct _EShell;
+G_BEGIN_DECLS
 
-typedef struct _EShellView        EShellView;
+typedef struct _EShellView EShellView;
+typedef struct _EShellViewClass EShellViewClass;
 typedef struct _EShellViewPrivate EShellViewPrivate;
-typedef struct _EShellViewClass   EShellViewClass;
-
-#include "Evolution.h"
-
-#define E_TYPE_SHELL_VIEW			(e_shell_view_get_type ())
-#define E_SHELL_VIEW(obj)			(G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_SHELL_VIEW, EShellView))
-#define E_SHELL_VIEW_CLASS(klass)		(G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_SHELL_VIEW, EShellViewClass))
-#define E_IS_SHELL_VIEW(obj)			(G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_SHELL_VIEW))
-#define E_IS_SHELL_VIEW_CLASS(klass)		(G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_SHELL_VIEW))
 
 struct _EShellView {
-	BonoboObject parent;
-
-	struct _EShellWindow *window;
-
+	GObject parent;
 	EShellViewPrivate *priv;
 };
 
 struct _EShellViewClass {
-	BonoboObjectClass parent_class;
+	GObjectClass parent_class;
 
-	POA_GNOME_Evolution_ShellView__epv epv;
+	/* Initial GtkRadioAction values */
+	const gchar *label;
+	const gchar *icon_name;
+
+	GtkWidget *	(*get_content_widget)	(EShellView *shell_view);
+	GtkWidget *	(*get_sidebar_widget)	(EShellView *shell_view);
+	GtkWidget *	(*get_status_widget)	(EShellView *shell_view);
 };
 
-GType                e_shell_view_get_type   (void);
-EShellView *e_shell_view_new(struct _EShellWindow *window);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
+GType		e_shell_view_get_type		(void);
+const gchar *	e_shell_view_get_title		(EShellView *shell_view);
+void		e_shell_view_set_title		(EShellView *shell_view,
+						 const gchar *title);
+GtkWindow *	e_shell_view_get_window		(EShellView *shell_view);
+GtkWidget *	e_shell_view_get_content_widget (EShellView *shell_view);
+GtkWidget *	e_shell_view_get_sidebar_widget (EShellView *shell_view);
+GtkWidget *	e_shell_view_get_status_widget	(EShellView *shell_view);
 
-#endif /* _E_SHELL_VIEW_H_ */
+G_END_DECLS
 
+#endif /* E_SHELL_VIEW_H */

Added: branches/kill-bonobo/shell/e-shell-window-actions.c
==============================================================================
--- (empty file)
+++ branches/kill-bonobo/shell/e-shell-window-actions.c	Wed Jul 16 19:37:02 2008
@@ -0,0 +1,1205 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*-
+ * e-shell-window-actions.c
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "e-shell-window-private.h"
+
+#include "e-shell.h"
+#include "e-shell-importer.h"
+
+#include "e-util/e-dialog-utils.h"
+#include "e-util/e-error.h"
+#include "e-util/e-print.h"
+
+#include <string.h>
+#include <libedataserverui/e-passwords.h>
+
+#define EVOLUTION_COPYRIGHT \
+	"Copyright \xC2\xA9 1999 - 2008 Novell, Inc. and Others"
+
+#define EVOLUTION_FAQ \
+	"http://www.go-evolution.org/FAQ";
+
+#define EVOLUTION_WEBSITE \
+	"http://www.gnome.org/projects/evolution/";
+
+/* Authors and Documenters
+ *
+ * The names below must be in UTF8.  The breaking of escaped strings
+ * is so the hexadecimal sequences don't swallow too many characters.
+ *
+ * SO THAT MEANS, FOR 8-BIT CHARACTERS USE \xXX HEX ENCODING ONLY!
+ *
+ * Not all environments are UTF8 and not all editors can handle it.
+ */
+static const gchar *authors[] = {
+	"Aaron Weber",
+	"Abel Cheung",
+	"Abhishek Parwal",
+	"Adam Weinberger",
+	"Adi Attar",
+	"Ahmad Riza H Nst",
+	"Aidan Delaney",
+	"Aishwarya K",
+	"Akagic Amila",
+	"Akhil Laddha",
+	"Akira Tagoh",
+	"Alastair McKinstry",
+	"Alastair Tse",
+	"Alejandro Andres",
+	"Alessandro Decina",
+	"Alex Graveley",
+	"Alex Jiang",
+	"Alex Jones",
+	"Alex Kloss",
+	"Alexander Shopov",
+	"Alfred Peng",
+	"Ali Abdin",
+	"Ali Akcaagac",
+	"Almer S. Tigelaar",
+	"Amish",
+	"Anand V M",
+	"Anders Carlsson",
+	"Andre Klapper",
+	"Andrea Campi",
+	"Andreas Henriksson",
+	"Andreas Hyden",
+	"Andreas J. Guelzow",
+	"Andreas K\xC3\xB6hler",
+	"Andreas KÃhler",
+	"Andrew Ruthven",
+	"Andrew T. Veliath",
+	"Andrew Wu",
+	"Ankit Patel",
+	"Anna Marie Dirks",
+	"Antonio Xu",
+	"Arafat Medini",
+	"Arangel Angov",
+	"Archit Baweja",
+	"Ariel Rios",
+	"Arik Devens",
+	"Armin Bauer",
+	"Arturo Espinosa Aldama",
+	"Arulanandan P",
+	"Arun Prakash",
+	"Arvind Sundararajan",
+	"Arvind",
+	"Ashish",
+	"B S Srinidhi",
+	"Bastien Nocera",
+	"Behnam Esfahbod",
+	"Ben Gamari",
+	"Benjamin Berg",
+	"Benjamin Kahn",
+	"BenoÃt Dejean",
+	"Bernard Leach",
+	"Bertrand Guiheneuf",
+	"Bharath Acharya",
+	"Bill Zhu",
+	"Bj\xC3\xB6rn Torkelsson",
+	"BjÃÂrn Lindqvist",
+	"Bob Doan",
+	"Bob Mauchin",
+	"Boby Wang",
+	"Bolian Yin",
+	"Brian Mury",
+	"Brian Pepple",
+	"Bruce Tao",
+	"Calvin Liu",
+	"Cantona Su",
+	"Carl Sun",
+	"Carlos Garcia Campos",
+	"Carlos Garnacho Parro",
+	"Carlos Perell\xC3\xB3" " Mar\xC3\xAD" "n",
+	"Carsten Guenther",
+	"Carsten Schaar",
+	"Changwoo Ryu",
+	"Chao-Hsiung Liao",
+	"Charles Zhang",
+	"Chema Celorio",
+	"Chenthill Palanisamy",
+	"Chpe",
+	"Chris Halls",
+	"Chris Heath",
+	"Chris Phelps",
+	"Chris Toshok",
+	"Christian Hammond",
+	"Christian Kellner",
+	"Christian Kirbach",
+	"Christian Krause",
+	"Christian Kreibich",
+	"Christian Neumair",
+	"Christophe Fergeau",
+	"Christophe Merlet",
+	"Christopher Blizzard",
+	"Christopher J. Lahey",
+	"Christopher R. Gabriel",
+	"Claude Paroz",
+	"Claudio Saavedra",
+	"Clifford R. Conover",
+	"Cody Russell",
+	"Colin Leroy",
+	"Craig Small",
+	"Dafydd Harries",
+	"Damian Ivereigh",
+	"Damien Carbery",
+	"Damon Chaplin",
+	"Dan Berger",
+	"Dan Damian",
+	"Dan Nguyen",
+	"Dan Winship",
+	"Daniel Gryniewicz",
+	"Daniel Nylander",
+	"Daniel van Eeden",
+	"Daniel Veillard",
+	"Daniel Yacob",
+	"Danilo \xC5\xA0" "egan",
+	"Danilo Segan",
+	"Darin Adler",
+	"Dave Benson",
+	"Dave Camp",
+	"Dave Fallon",
+	"Dave Malcolm",
+	"Dave West",
+	"David Farning",
+	"David Kaelbling",
+	"David Malcolm",
+	"David Moore",
+	"David Mosberger",
+	"David Richards",
+	"David Trowbridge",
+	"David Turner",
+	"David Woodhouse",
+	"Denis Washington",
+	"Devashish Sharma",
+	"Diego Escalante Urrelo",
+	"Diego Gonzalez",
+	"Diego Sevilla Ruiz",
+	"Dietmar Maurer",
+	"Dinesh Layek",
+	"Djihed Afifi",
+	"Dmitry Mastrukov",
+	"Dodji Seketeli",
+	"Duarte Loreto",
+	"Dulmandakh Sukhbaatar",
+	"Duncan Mak",
+	"Ebby Wiselyn",
+	"Ed Catmur",
+	"Edd Dumbill",
+	"Edgar Luna DÃaz",
+	"Edward Rudd",
+	"Elijah Newren",
+	"Elizabeth Greene",
+	"Elliot Lee",
+	"Elliot Turner",
+	"Eneko Lacunza",
+	"Enver Altin",
+	"Erdal Ronahi",
+	"Eric Busboom",
+	"Eric Zhao",
+	"Eskil Heyn Olsen",
+	"Ettore Perazzoli",
+	"Evan Yan",
+	"Fatih Demir",
+	"Fazlu & Hannah",
+	"Federico Mena Quintero",
+	"Fernando Herrera",
+	"Francisco Javier F. Serrador",
+	"Frank Arnold",
+	"Frank Belew",
+	"Frederic Crozat",
+	"Frederic Peters",
+	"Funda Wang",
+	"Gabor Kelemen",
+	"Ganesh",
+	"Gareth Owen",
+	"Gary Coady",
+	"Gary Ekker",
+	"Gavin Scott",
+	"Gediminas Paulauskas",
+	"Gerg\xC5\x91 \xC3\x89rdi",
+	"George Lebl",
+	"Gerardo Marin",
+	"Gert Kulyk",
+	"Giancarlo Capella",
+	"Gil Osher",
+	"Gilbert Fang",
+	"Gilles Dartiguelongue",
+	"Grahame Bowland",
+	"Greg Hudson",
+	"Gregory Leblanc",
+	"Gregory McLean",
+	"Grzegorz Goawski",
+	"Gustavo Gir\xC3\x8E" "ldez",
+	"Gustavo Maciel Dias Vieira",
+	"H P Nadig",
+	"H\xC3\xA9" "ctor Garc\xC3\xAD" "a \xC3\x81" "lvarez",
+	"Hans Petter Jansson",
+	"Hao Sheng",
+	"Hari Prasad Nadig",
+	"Harish K",
+	"Harish Krishnaswamy",
+	"Harry Lu",
+	"Hasbullah Bin Pit",
+	"Havoc Pennington",
+	"Heath Harrelson",
+	"Hein-Pieter van Braam",
+	"Herbert V. Riedel",
+	"Hiroyuki Ikezoe",
+	"Iain Buchanan",
+	"Iain Holmes",
+	"Ian Campbell",
+	"Ilkka Tuohela",
+	"Irene Huang",
+	"Ismael Olea",
+	"Israel Escalante",
+	"Iv\xC3\xA1" "n Frade",
+	"IvÃÂn Frade",
+	"J.H.M. Dassen (Ray)",
+	"JP Rosevear",
+	"J\xC3\xBC" "rg Billeter",
+	"JÃÃÂrg Billeter",
+	"Jack Jia",
+	"Jacob Ulysses Berkman",
+	"Jacob Berkman",
+	"Jaka Mocnik",
+	"Jakub Steiner",
+	"James Doc Livingston",
+	"James Bowes",
+	"James Henstridge",
+	"James Willcox",
+	"Jan Arne Petersen",
+	"Jan Tichavsky",
+	"Jan Van Buggenhout",
+	"Jared Moore",
+	"Jarkko Ranta",
+	"Jason Leach",
+	"Jason Tackaberry",
+	"Jayaradha",
+	"Jean-Noel Guiheneuf",
+	"Jedy Wang",
+	"Jeff Bailey",
+	"Jeff Cai",
+	"Jeff Garzik",
+	"Jeffrey Stedfast",
+	"Jens Granseuer",
+	"Jens Seidel",
+	"Jeremy Katz",
+	"Jeremy Wise",
+	"Jerome Lacoste",
+	"Jerry Yu",
+	"Jes\xC3\xBA" "s Bravo \xC3\x81" "lvarez",
+	"Jesse Pavel",
+	"Ji Lee",
+	"Joan Sanfeliu",
+	"Jody Goldberg",
+	"Joe Marcus Clarke",
+	"Joe Shaw",
+	"John Gotts",
+	"Johnny Jacob",
+	"Johnny",
+	"Jon Ander Hernandez",
+	"Jon K Hellan",
+	"Jon Oberheide",
+	"Jon Trowbridge",
+	"Jonas Borgstr",
+	"Jonathan Blandford",
+	"Jonathan Dieter",
+	"Jos Dehaes",
+	"Josselin Mouette",
+	"JP Rosvear",
+	"Jukka Zitting",
+	"Jules Colding",
+	"Julian Missig",
+	"Julio M. Merino Vidal",
+	"JÃrg Billeter",
+	"Karl Eichwalder",
+	"Karl Relton",
+	"Karsten Br\xC3\xA4" "ckelmann",
+	"Kaushal Kumar",
+	"Kenneth Christiansen",
+	"Kenny Graunke",
+	"Keshav Upadhyaya",
+	"Kevin Breit",
+	"Kevin Piche",
+	"Kevin Vandersloot",
+	"Khasim Shaheed",
+	"Kidd Wang",
+	"Kjartan Maraas",
+	"Krishnan R",
+	"Krisztian Pifko",
+	"Kyle Ambroff",
+	"Larry Ewing",
+	"Laszlo (Laca) Peter",
+	"Laurent Dhima",
+	"Lauris Kaplinski",
+	"Leon Zhang",
+	"Li Yuan",
+	"LoÃÂc Minier",
+	"LoÃc Minier",
+	"Lorenzo Gil Sanchez",
+	"Luca Ferretti",
+	"Lucky Wankhede",
+	"Luis Villa",
+	"Lutz M",
+	"M Victor Aloysius J",
+	"Maciej Stachowiak",
+	"Makuchaku",
+	"Malcolm Tredinnick",
+	"Marco Pesenti Gritti",
+	"Marius Andreiana",
+	"Marius Vollmer",
+	"Mark Crichton",
+	"Mark G. Adams",
+	"Mark Gordon",
+	"Mark McLoughlin",
+	"Mark Moulder",
+	"Mark Tearle",
+	"Martha Burke",
+	"Martin Baulig",
+	"Martin Hicks",
+	"Martin Meyer",
+	"Martin Norb\xC3\xA4" "ck",
+	"Martyn Russell",
+	"Masahiro Sakai",
+	"Mathieu Lacage",
+	"Matias Mutchinick",
+	"Matt Bissiri",
+	"Matt Brown",
+	"Matt Loper",
+	"Matt Martin",
+	"Matt Wilson",
+	"Matthew Barnes",
+	"Matthew Daniel",
+	"Matthew Hall",
+	"Matthew Loper",
+	"Matthew Wilson",
+	"Matthias Clasen",
+	"Max Horn",
+	"Maxx Cao",
+	"Mayank Jain",
+	"Meilof Veeningen",
+	"Mengjie Yu",
+	"Michael Granger",
+	"Michael M. Morrison",
+	"Michael MacDonald",
+	"Michael Meeks",
+	"Michael Monreal",
+	"Michael Terry",
+	"Michael Zucchi",
+	"Michel Daenzer",
+	"Miguel Angel Lopez Hernandez",
+	"Miguel de Icaza",
+	"Mikael Hallendal",
+	"Mikael Nilsson",
+	"Mike Castle",
+	"Mike Kestner",
+	"Mike McEwan",
+	"Mikhail Zabaluev",
+	"Milan Crha",
+	"Miles Lane",
+	"Mohammad Damt",
+	"Morten Welinder",
+	"Mubeen Jukaku",
+	"Murray Cumming",
+	"Naba Kumar",
+	"Nagappan Alagappan",
+	"Nancy Cai",
+	"Nat Friedman",
+	"Nathan Owens",
+	"Nicel KM",
+	"Nicholas J Kreucher",
+	"Nicholas Miell",
+	"Nick Sukharev",
+	"Nickolay V. Shmyrev",
+	"Nike Gerdts",
+	"Noel",
+	"Nuno Ferreira",
+	"Nyall Dawson",
+	"Ondrej Jirman",
+	"Oswald Rodrigues",
+	"Owen Taylor",
+	"Oystein Gisnas",
+	"P Chenthill",
+	"P S Chakravarthi",
+	"Pablo Gonzalo del Campo",
+	"Pablo Saratxaga",
+	"Pamplona Hackers",
+	"Paolo Molaro",
+	"Parag Goel",
+	"Parthasarathi Susarla",
+	"Pascal Terjan",
+	"Patrick Ohly",
+	"Paul Bolle",
+	"Paul Lindner",
+	"Pavel Cisler",
+	"Pavel Roskin",
+	"Pavithran",
+	"Pawan Chitrakar",
+	"Pedro Villavicencio",
+	"Peter Pouliot",
+	"Peter Teichman",
+	"Peter Williams",
+	"Peteris Krisjanis",
+	"Petta Pietikainen",
+	"Phil Goembel",
+	"Philip Van Hoof",
+	"Philip Zhao",
+	"Poornima Nayak",
+	"Pratik V. Parikh",
+	"Praveen Kumar",
+	"Priit Laes",
+	"Priyanshu Raj",
+	"Radek Doul\xC3\xADk",
+	"Raghavendran R",
+	"Raja R Harinath",
+	"Rajeev Ramanathan",
+	"Rajesh Ranjan",
+	"Rakesh k.g",
+	"Ramiro Estrugo",
+	"Ranjan Somani",
+	"Ray Strode",
+	"Rhys Jones",
+	"Ricardo Markiewicz",
+	"Richard Boulton",
+	"Richard Hult",
+	"Richard Li",
+	"Rob Bradford",
+	"Robert Brady",
+	"Robert Sedak",
+	"Robin Slomkowski",
+	"Rodney Dawes",
+	"Rodrigo Moya",
+	"Rohini S",
+	"Rohini",
+	"Roland Illig",
+	"Ronald Kuetemeier",
+	"Roozbeh Pournader",
+	"Ross Burton",
+	"Rouslan Solomakhin",
+	"Runa Bhattacharjee",
+	"Russell Steinthal",
+	"Rusty Conover",
+	"Ryan P. Skadberg",
+	"S Antony Vincent Pandian",
+	"S N Tejasvi",
+	"S. \xC3\x87" "a\xC4\x9F" "lar Onur",
+	"S.Antony Vincent Pandian",
+	"S. Caglar Onur",
+	"Sam Creasey",
+	"Sam Yang",
+	"Sam\xC3\xBA" "el J\xC3\xB3" "n Gunnarsson",
+	"Sankar P",
+	"Sanlig Badral",
+	"Sanshao Jiang",
+	"Sarfraaz Ahmed",
+	"Sayamindu Dasgupta",
+	"Sean Atkinson",
+	"Sean Gao",
+	"Sebastian Rittau",
+	"Sebastian Wilhelmi",
+	"Sebastien Bacher",
+	"Sergey Panov",
+	"Seth Alves",
+	"Seth Nickell",
+	"Shakti Sen",
+	"Shi Pu",
+	"Shilpa C",
+	"Shree Krishnan",
+	"Shreyas Srinivasan",
+	"Simon Zheng",
+	"Simos Xenitellis",
+	"Sivaiah Nallagatla",
+	"Srinivasa Ragavan",
+	"Stanislav Brabec",
+	"Stanislav Visnovsky",
+	"StÃphane Raimbault",
+	"Stephen Cook",
+	"Steve Murphy",
+	"Steven Zhang",
+	"Stuart Parmenter",
+	"Subodh Soni",
+	"Suman Manjunath",
+	"Sunil Mohan Adapa",
+	"Suresh Chandrasekharan",
+	"Sushma Rai",
+	"Sven Herzberg",
+	"Szabolcs Ban",
+	"T\xC3\xB5" "ivo Leedj\xC3\xA4" "rv",
+	"Takao Fujiwara",
+	"Takayuki Kusano",
+	"Takeshi Aihana",
+	"Tambet Ingo",
+	"Taylor Hayward",
+	"Ted Percival",
+	"Theppitak Karoonboonyanan",
+	"Thomas Cataldo",
+	"Thomas Klausner",
+	"Thomas Mirlacher",
+	"Thouis R. Jones",
+	"Tim Wo",
+	"Tim Yamin",
+	"Timo Hoenig",
+	"Timo Sirainen",
+	"Timothy Lee",
+	"Timur Bakeyev",
+	"Tino Meinen",
+	"Tobias Mueller",
+	"TÃivo LeedjÃrv",
+	"Tom Tromey",
+	"Tomas Ogren",
+	"Tomasz K\xC5\x82" "oczko",
+	"Tomislav Vujec",
+	"Tommi Komulainen",
+	"Tommi Vainikainen",
+	"Tony Tsui",
+	"Tor Lillqvist",
+	"Trent Lloyd",
+	"Tuomas J. Lukka",
+	"Tuomas Kuosmanen",
+	"Ulrich Neumann",
+	"Umesh Tiwari",
+	"Umeshtej",
+	"Ushveen Kaur",
+	"V Ravi Kumar Raju",
+	"Vadim Strizhevsky",
+	"Valek Filippov",
+	"Vandana Shenoy .B",
+	"Vardhman Jain",
+	"Veerapuram Varadhan",
+	"Vincent Noel",
+	"Vincent van Adrighem",
+	"Viren",
+	"Vivek Jain",
+	"Vladimer Sichinava",
+	"Vladimir Vukicevic",
+	"Wadim Dziedzic",
+	"Wang Jian",
+	"Wang Xin",
+	"Wayne Davis",
+	"William Jon McCann",
+	"Wouter Bolsterlee",
+	"Xan Lopez",
+	"Xiurong Simon Zheng",
+	"Yanko Kaneti",
+	"Yi Jin",
+	"Yong Sun",
+	"Yu Mengjie",
+	"Yuedong Du",
+	"Yukihiro Nakai",
+	"Yuri Pankov",
+	"Yuri Syrota",
+	"Zach Frey",
+	"Zan Lynx",
+	"Zbigniew Chyla",
+	"\xC3\x98ystein Gisn\xC3\xA5s",
+	"\xC5\xBDygimantas Beru\xC4\x8Dka",
+	NULL
+};
+
+static const gchar *documenters[] = {
+	"Aaron Weber",
+	"Binika Preet",
+	"Dan Winship",
+	"David Trowbridge",
+	"Jessica Prabhakar",
+	"JP Rosevear",
+	"Radhika Nair",
+	NULL
+};
+
+static void
+action_about_cb (GtkAction *action,
+                 EShellWindow *window)
+{
+	gchar *translator_credits;
+
+	/* The translator-credits string is for translators to list
+	 * per-language credits for translation, displayed in the
+	 * about dialog. */
+	translator_credits = _("translator-credits");
+	if (strcmp (translator_credits, "translator-credits") == 0)
+		translator_credits = NULL;
+
+	gtk_show_about_dialog (
+		GTK_WINDOW (window),
+		"program-name", "Evolution",
+		"version", VERSION,
+		"copyright", EVOLUTION_COPYRIGHT,
+		"comments", _("Groupware Suite"),
+		"website", EVOLUTION_WEBSITE,
+		"website-label", _("Evolution Website"),
+		"authors", authors,
+		"documenters", documenters,
+		"translator-credits", translator_credits,
+		"logo-icon-name", "evolution",
+		NULL);
+}
+
+static void
+action_close_cb (GtkAction *action,
+                 EShellWindow *window)
+{
+	if (e_shell_request_close_window (window))
+		gtk_widget_destroy (GTK_WIDGET (window));
+}
+
+static void
+action_faq_cb (GtkAction *action,
+               EShellWindow *window)
+{
+	GError *error = NULL;
+
+	gtk_show_uri (NULL, EVOLUTION_FAQ, GDK_CURRENT_TIME, &error);
+
+	if (error != NULL) {
+		/* FIXME Show an error dialog. */
+		g_warning ("%s", error->message);
+		g_error_free (error);
+	}
+}
+
+static void
+action_forget_passwords_cb (GtkAction *action,
+                            EShellWindow *window)
+{
+	gint response;
+
+	response = e_error_run (
+		GTK_WINDOW (window), "shell:forget-passwords", NULL);
+
+	if (response == GTK_RESPONSE_OK)
+		e_passwords_forget_passwords ();
+}
+
+static void
+action_import_cb (GtkAction *action,
+                  EShellWindow *window)
+{
+	e_shell_importer_start_import (window);
+}
+
+static void
+action_new_window_cb (GtkAction *action,
+                      EShellWindow *window)
+{
+	e_shell_create_window ();
+}
+
+static void
+action_page_setup_cb (GtkAction *action,
+                      EShellWindow *window)
+{
+	e_print_run_page_setup_dialog (GTK_WINDOW (window));
+}
+
+static void
+action_preferences_cb (GtkAction *action,
+                       EShellWindow *window)
+{
+	e_shell_show_preferences (GTK_WINDOW (window));
+}
+
+static void
+action_quick_reference_cb (GtkAction *action,
+                           EShellWindow *window)
+{
+	const gchar * const *language_names;
+
+	language_names = g_get_language_names ();
+	while (*language_names != NULL) {
+		const gchar *language = *language_names++;
+		gchar *filename;
+
+		/* This must be a valid language AND a language with
+		 * no encoding suffix.  The next language should have
+		 * no encoding suffix. */
+		if (language == NULL || strchr (language, '.') != NULL)
+			continue;
+
+		filename = g_build_filename (
+			EVOLUTION_HELPDIR, "quickref",
+			language, "quickref.pdf", NULL);
+
+		if (g_file_test (filename, G_FILE_TEST_EXISTS)) {
+			GFile *file;
+			gchar *uri;
+			GError *error = NULL;
+
+			file = g_file_new_for_path (filename);
+			uri = g_file_get_uri (file);
+
+			g_app_info_launch_default_for_uri (uri, NULL, &error);
+
+			if (error != NULL) {
+				/* FIXME Show an error dialog. */
+				g_warning ("%s", error->message);
+				g_error_free (error);
+			}
+
+			g_object_unref (file);
+			g_free (uri);
+		}
+
+		g_free (filename);
+	}
+}
+
+static void
+action_quit_cb (GtkAction *action,
+                EShellWindow *window)
+{
+	e_shell_quit ();
+}
+
+static void
+action_send_receive_cb (GtkAction *action,
+                        EShellWindow *window)
+{
+	e_shell_send_receive (GTK_WINDOW (window));
+}
+
+static void
+action_shell_view_cb (GtkRadioAction *action,
+                      GtkRadioAction *current,
+                      EShellWindow *window)
+{
+	gint value;
+
+	if (action != current)
+		return;
+
+	value = gtk_radio_action_get_current_value (action);
+}
+
+static void
+action_show_buttons_cb (GtkToggleAction *action,
+                        EShellWindow *window)
+{
+	ESidebar *sidebar;
+	gboolean active;
+
+	sidebar = E_SIDEBAR (window->priv->sidebar);
+	active = gtk_toggle_action_get_active (action);
+	e_sidebar_set_actions_visible (sidebar, active);
+}
+
+static void
+action_show_sidebar_cb (GtkToggleAction *action,
+                        EShellWindow *window)
+{
+	GtkWidget *widget;
+	gboolean active;
+
+	widget = window->priv->sidebar_notebook;
+	active = gtk_toggle_action_get_active (action);
+	g_object_set (widget, "visible", active, NULL);
+}
+
+static void
+action_show_statusbar_cb (GtkToggleAction *action,
+                          EShellWindow *window)
+{
+	GtkWidget *widget;
+	gboolean active;
+
+	widget = window->priv->status_area;
+	active = gtk_toggle_action_get_active (action);
+	g_object_set (widget, "visible", active, NULL);
+}
+
+static void
+action_show_toolbar_cb (GtkToggleAction *action,
+                        EShellWindow *window)
+{
+	GtkWidget *widget;
+	gboolean active;
+
+	widget = window->priv->main_toolbar;
+	active = gtk_toggle_action_get_active (action);
+	g_object_set (widget, "visible", active, NULL);
+}
+
+static void
+action_submit_bug_cb (GtkAction *action,
+                      EShellWindow *window)
+{
+	const gchar *command_line;
+	GError *error = NULL;
+
+	command_line = "bug-buddy --sm-disable --package=Evolution";
+
+	g_debug ("Spawning: %s", command_line);
+	g_spawn_command_line_async (command_line, &error);
+
+	if (error != NULL) {
+		const gchar *message;
+
+		if (error->code == G_SPAWN_ERROR_NOENT)
+			message = _("Bug Buddy is not installed.");
+		else
+			message = _("Bug Buddy could not be run.");
+		e_notice (window, GTK_MESSAGE_ERROR, message);
+		g_error_free (error);
+	}
+}
+
+static void
+action_sync_options_cb (GtkAction *action,
+                        EShellWindow *window)
+{
+	const gchar *command_line;
+	GError *error = NULL;
+
+	command_line = "gpilotd-control-applet";
+
+	g_debug ("Spawning: %s", command_line);
+	g_spawn_command_line_async (command_line, &error);
+
+	if (error != NULL) {
+		const gchar *message;
+
+		if (error->code == G_SPAWN_ERROR_NOENT)
+			message = _("GNOME Pilot is not installed.");
+		else
+			message = _("GNOME Pilot could not be run.");
+		e_notice (window, GTK_MESSAGE_ERROR, message);
+		g_error_free (error);
+	}
+}
+
+static void
+action_work_offline_cb (GtkAction *action,
+                        EShellWindow *window)
+{
+	e_shell_go_offline ();
+}
+
+static void
+action_work_online_cb (GtkAction *action,
+                       EShellWindow *window)
+{
+	e_shell_go_online ();
+}
+
+static GtkActionEntry shell_entries[] = {
+
+	{ "about",
+	  GTK_STOCK_ABOUT,
+	  N_("_About"),
+	  NULL,
+	  N_("Show information about Evolution"),
+	  G_CALLBACK (action_about_cb) },
+
+	{ "close",
+	  GTK_STOCK_CLOSE,
+	  N_("_Close Window"),
+	  "<Control>w",
+	  N_("Close this window"),
+	  G_CALLBACK (action_close_cb) },
+
+	{ "faq",
+	  GTK_STOCK_DIALOG_INFO,
+	  N_("Evolution _FAQ"),
+	  NULL,
+	  N_("Open the Frequently Asked Questions webpage"),
+	  G_CALLBACK (action_faq_cb) },
+
+	{ "forget-passwords",
+	  NULL,
+	  N_("_Forget Passwords"),
+	  NULL,
+	  N_("Forget all remembered passwords"),
+	  G_CALLBACK (action_forget_passwords_cb) },
+
+	{ "import",
+	  "stock_mail-import",
+	  N_("I_mport..."),
+	  NULL,
+	  N_("Import data from other programs"),
+	  G_CALLBACK (action_import_cb) },
+
+	{ "new-window",
+	  "window-new",
+	  N_("New _Window"),
+	  "<Control><Shift>w",
+	  N_("Create a new window displaying this view"),
+	  G_CALLBACK (action_new_window_cb) },
+
+	{ "page-setup",
+	  GTK_STOCK_PAGE_SETUP,
+	  N_("Page Set_up..."),
+	  NULL,
+	  N_("Change the page settings for your current printer"),
+	  G_CALLBACK (action_page_setup_cb) },
+
+	{ "preferences",
+	  GTK_STOCK_PREFERENCES,
+	  N_("Prefere_nces"),
+	  "<Control><Shift>s",
+	  N_("Configure Evolution"),
+	  G_CALLBACK (action_preferences_cb) },
+
+	{ "quick-reference",
+	  NULL,
+	  N_("_Quick Reference"),
+	  NULL,
+	  N_("Show Evolution's shortcut keys"),
+	  G_CALLBACK (action_quick_reference_cb) },
+
+	{ "quit",
+	  GTK_STOCK_QUIT,
+	  N_("_Quit"),
+	  "<Control>q",
+	  N_("Exit the program"),
+	  G_CALLBACK (action_quit_cb) },
+
+	{ "send-receive",
+	  "mail-send-receive",
+	  N_("Send / _Receive"),
+	  "F9",
+	  N_("Send queued items and retrieve new items"),
+	  G_CALLBACK (action_send_receive_cb) },
+
+	{ "submit-bug",
+	  NULL,
+	  N_("Submit _Bug Report"),
+	  NULL,
+	  N_("Submit a bug report using Bug Buddy"),
+	  G_CALLBACK (action_submit_bug_cb) },
+
+	{ "sync-options",
+	  NULL,
+	  N_("_Synchronization Options..."),
+	  NULL,
+	  N_("Set up Pilot configuration"),
+	  G_CALLBACK (action_sync_options_cb) },
+
+	{ "work-offline",
+	  "stock_disconnect",
+	  N_("_Work Offline"),
+	  NULL,
+	  N_("Put Evolution into offline mode"),
+	  G_CALLBACK (action_work_offline_cb) },
+
+	{ "work-online",
+	  "stock_connect",
+	  N_("_Work Online"),
+	  NULL,
+	  N_("Put Evolution into online mode"),
+	  G_CALLBACK (action_work_online_cb) },
+
+	/*** Menus ***/
+
+	{ "edit-menu",
+	  NULL,
+	  N_("_Edit"),
+	  NULL,
+	  NULL,
+	  NULL },
+
+	{ "file-menu",
+	  NULL,
+	  N_("_File"),
+	  NULL,
+	  NULL,
+	  NULL },
+
+	{ "help-menu",
+	  NULL,
+	  N_("_Help"),
+	  NULL,
+	  NULL,
+	  NULL },
+
+	{ "new-menu",
+	  GTK_STOCK_NEW,
+	  N_("_New"),
+	  NULL,
+	  NULL,
+	  NULL },
+
+	{ "search-menu",
+	  NULL,
+	  N_("_Search"),
+	  NULL,
+	  NULL,
+	  NULL },
+
+	{ "view-menu",
+	  NULL,
+	  N_("_View"),
+	  NULL,
+	  NULL,
+	  NULL },
+
+	{ "window-menu",
+	  NULL,
+	  N_("_Window"),
+	  NULL,
+	  NULL,
+	  NULL }
+};
+
+static GtkToggleActionEntry shell_toggle_entries[] = {
+
+	{ "show-buttons",
+	  NULL,
+	  N_("Show _Buttons"),
+	  NULL,
+	  N_("Show the switcher buttons"),
+	  G_CALLBACK (action_show_buttons_cb),
+	  TRUE },
+
+	{ "show-sidebar",
+	  NULL,
+	  N_("Show Side _Bar"),
+	  NULL,
+	  N_("Show the side bar"),
+	  G_CALLBACK (action_show_sidebar_cb),
+	  TRUE },
+
+	{ "show-statusbar",
+	  NULL,
+	  N_("Show _Status Bar"),
+	  NULL,
+	  N_("Show the status bar"),
+	  G_CALLBACK (action_show_statusbar_cb),
+	  TRUE },
+
+	{ "show-toolbar",
+	  NULL,
+	  N_("Show _Toolbar"),
+	  NULL,
+	  N_("Show the toolbar"),
+	  G_CALLBACK (action_show_toolbar_cb),
+	  TRUE }
+};
+
+void
+e_shell_window_actions_init (EShellWindow *window)
+{
+	GtkActionGroup *action_group;
+	GtkUIManager *manager;
+	const gchar *domain;
+
+	g_return_if_fail (E_IS_SHELL_WINDOW (window));
+
+	manager = e_shell_window_get_ui_manager (window);
+	domain = GETTEXT_PACKAGE;
+
+	/* Shell Actions */
+	action_group = ACTION_GROUP (SHELL);
+	gtk_action_group_set_translation_domain (action_group, domain);
+	gtk_action_group_add_actions (
+		action_group, shell_entries,
+		G_N_ELEMENTS (shell_entries), window);
+	gtk_action_group_add_toggle_actions (
+		action_group, shell_toggle_entries,
+		G_N_ELEMENTS (shell_toggle_entries), window);
+	gtk_ui_manager_insert_action_group (manager, action_group, 0);
+
+	/* New Item Actions (empty) */
+	action_group = ACTION_GROUP (NEW_ITEM);
+	gtk_action_group_set_translation_domain (action_group, domain);
+	gtk_ui_manager_insert_action_group (manager, action_group, 0);
+
+	/* New Group Actions (empty) */
+	action_group = ACTION_GROUP (NEW_GROUP);
+	gtk_action_group_set_translation_domain (action_group, domain);
+	gtk_ui_manager_insert_action_group (manager, action_group, 0);
+
+	/* New Source Actions (empty) */
+	action_group = ACTION_GROUP (NEW_SOURCE);
+	gtk_action_group_set_translation_domain (action_group, domain);
+	gtk_ui_manager_insert_action_group (manager, action_group, 0);
+
+	/* Shell View Actions (empty) */
+	action_group = ACTION_GROUP (SHELL_VIEW);
+	gtk_action_group_set_translation_domain (action_group, domain);
+	gtk_ui_manager_insert_action_group (manager, action_group, 0);
+}
+
+void
+e_shell_window_create_shell_view_actions (EShellWindow *window)
+{
+	GType *types;
+	GSList *group = NULL;
+	GtkActionGroup *action_group;
+	GtkUIManager *manager;
+	guint n_types, ii;
+	guint merge_id;
+
+	g_return_if_fail (E_IS_SHELL_WINDOW (window));
+
+	action_group = ACTION_GROUP (SHELL_VIEW);
+	types = e_shell_registry_get_view_types (&n_types);
+	manager = e_shell_window_get_ui_manager (window);
+	merge_id = gtk_ui_manager_new_merge_id (manager);
+
+	for (ii = 0; ii < n_types; ii++) {
+		EShellViewClass *class;
+		GtkRadioAction *action;
+		const gchar *type_name;
+		gchar *action_name;
+		gchar *tooltip;
+
+		class = g_type_class_ref (types[ii]);
+		type_name = g_type_name (types[ii]);
+
+		if (class->label != NULL) {
+			g_critical ("Label member not set on %s", type_name);
+			continue;
+		}
+
+		action_name = g_strdup_printf ("shell-view-%s", type_name);
+		tooltip = g_strdup_printf (_("Switch to %s"), class->label);
+
+		action = gtk_radio_action_new (
+			action_name, class->label,
+			tooltip, class->icon_name, ii);
+
+		g_signal_connect (
+			action, "changed",
+			G_CALLBACK (action_shell_view_cb), window);
+
+		gtk_radio_action_set_group (action, group);
+		group = gtk_radio_action_get_group (action);
+
+		gtk_action_group_add_action (
+			action_group, GTK_ACTION (action));
+
+		e_sidebar_add_action (
+			E_SIDEBAR (window->priv->sidebar),
+			GTK_ACTION (action));
+
+		gtk_ui_manager_add_ui (
+			manager, merge_id,
+			"/main-menu/view-menu/window-menu",
+			action_name, action_name,
+			GTK_UI_MANAGER_AUTO, FALSE);
+
+		g_free (action_name);
+		g_free (tooltip);
+
+		g_type_class_unref (class);
+	}
+
+	g_free (types);
+}

Added: branches/kill-bonobo/shell/e-shell-window-actions.h
==============================================================================
--- (empty file)
+++ branches/kill-bonobo/shell/e-shell-window-actions.h	Wed Jul 16 19:37:02 2008
@@ -0,0 +1,82 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*-
+ * e-shell-window-actions.h
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef E_SHELL_WINDOW_ACTIONS_H
+#define E_SHELL_WINDOW_ACTIONS_H
+
+#define E_SHELL_WINDOW_ACTION(window, name) \
+	(e_shell_window_get_action (E_SHELL_WINDOW (window), (name)))
+
+#define E_SHELL_WINDOW_ACTION_GROUP(window, name) \
+	(e_shell_window_get_action_group (E_SHELL_WINDOW (window), (name)))
+
+/* Actions */
+#define E_SHELL_WINDOW_ACTION_ABOUT(window) \
+	E_SHELL_WINDOW_ACTION ((window), "about")
+#define E_SHELL_WINDOW_ACTION_CLOSE(window) \
+	E_SHELL_WINDOW_ACTION ((window), "close")
+#define E_SHELL_WINDOW_ACTION_FAQ(window) \
+	E_SHELL_WINDOW_ACTION ((window), "faq")
+#define E_SHELL_WINDOW_ACTION_FORGET_PASSWORDS(window) \
+	E_SHELL_WINDOW_ACTION ((window), "forget-passwords")
+#define E_SHELL_WINDOW_ACTION_IMPORT(window) \
+	E_SHELL_WINDOW_ACTION ((window), "import")
+#define E_SHELL_WINDOW_ACTION_NEW_WINDOW(window) \
+	E_SHELL_WINDOW_ACTION ((window), "new-window")
+#define E_SHELL_WINDOW_ACTION_PAGE_SETUP(window) \
+	E_SHELL_WINDOW_ACTION ((window), "page-setup")
+#define E_SHELL_WINDOW_ACTION_PREFERENCES(window) \
+	E_SHELL_WINDOW_ACTION ((window), "preferences")
+#define E_SHELL_WINDOW_ACTION_QUICK_REFERENCE(window) \
+	E_SHELL_WINDOW_ACTION ((window), "quick-reference")
+#define E_SHELL_WINDOW_ACTION_QUIT(window) \
+	E_SHELL_WINDOW_ACTION ((window), "quit")
+#define E_SHELL_WINDOW_ACTION_SEND_RECEIVE(window) \
+	E_SHELL_WINDOW_ACTION ((window), "send-receive")
+#define E_SHELL_WINDOW_ACTION_SHOW_BUTTONS(window) \
+	E_SHELL_WINDOW_ACTION ((window), "show-buttons")
+#define E_SHELL_WINDOW_ACTION_SHOW_SIDEBAR(window) \
+	E_SHELL_WINDOW_ACTION ((window), "show-sidebar")
+#define E_SHELL_WINDOW_ACTION_SHOW_STATUSBAR(window) \
+	E_SHELL_WINDOW_ACTION ((window), "show-statusbar")
+#define E_SHELL_WINDOW_ACTION_SHOW_TOOLBAR(window) \
+	E_SHELL_WINDOW_ACTION ((window), "show-toolbar")
+#define E_SHELL_WINDOW_ACTION_SUBMIT_BUG(window) \
+	E_SHELL_WINDOW_ACTION ((window), "submit-bug")
+#define E_SHELL_WINDOW_ACTION_SYNC_OPTIONS(window) \
+	E_SHELL_WINDOW_ACTION ((window), "sync-options")
+#define E_SHELL_WINDOW_ACTION_WORK_OFFLINE(window) \
+	E_SHELL_WINDOW_ACTION ((window), "work-offline")
+#define E_SHELL_WINDOW_ACTION_WORK_ONLINE(window) \
+	E_SHELL_WINDOW_ACTION ((window), "work-online")
+
+/* Action Groups */
+#define E_SHELL_WINDOW_ACTION_GROUP_NEW_GROUP(window) \
+	E_SHELL_WINDOW_ACTION_GROUP ((window), "new-group")
+#define E_SHELL_WINDOW_ACTION_GROUP_NEW_ITEM(window) \
+	E_SHELL_WINDOW_ACTION_GROUP ((window), "new-item")
+#define E_SHELL_WINDOW_ACTION_GROUP_NEW_SOURCE(window) \
+	E_SHELL_WINDOW_ACTION_GROUP ((window), "new-source")
+#define E_SHELL_WINDOW_ACTION_GROUP_SHELL(window) \
+	E_SHELL_WINDOW_ACTION_GROUP ((window), "shell")
+#define E_SHELL_WINDOW_ACTION_GROUP_SHELL_VIEW(window) \
+	E_SHELL_WINDOW_ACTION_GROUP ((window), "shell-view")
+
+#endif /* E_SHELL_WINDOW_ACTIONS_H */

Added: branches/kill-bonobo/shell/e-shell-window-private.c
==============================================================================
--- (empty file)
+++ branches/kill-bonobo/shell/e-shell-window-private.c	Wed Jul 16 19:37:02 2008
@@ -0,0 +1,282 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*-
+ * e-shell-window-private.c
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "e-shell-window-private.h"
+
+#include "e-util/gconf-bridge.h"
+
+#ifdef NM_SUPPORT_GLIB
+void e_shell_nm_glib_initialise (EShellWindow *window);
+void e_shell_nm_glib_dispose (EShellWindow *window);
+#elif NM_SUPPORT
+void e_shell_dbus_initialise (EShellWindow *window);
+void e_shell_dbus_dispose (EShellWindow *window);
+#endif
+
+static void
+shell_window_menu_item_select_cb (EShellWindow *window,
+                                  GtkWidget *menu_item)
+{
+	GtkAction *action;
+	GtkLabel *label;
+	gchar *tooltip;
+
+	action = g_object_get_data (G_OBJECT (menu_item), "action");
+	g_return_if_fail (GTK_IS_ACTION (action));
+
+	g_object_get (action, "tooltip", &tooltip, NULL);
+
+	if (tooltip == NULL)
+		return;
+
+	label = GTK_LABEL (window->priv->tooltip_label);
+	gtk_label_set_text (label, tooltip);
+	g_free (tooltip);
+
+	gtk_widget_show (window->priv->tooltip_label);
+	gtk_widget_hide (window->priv->status_notebook);
+}
+
+static void
+shell_window_menu_item_deselect_cb (EShellWindow *window)
+{
+	gtk_widget_hide (window->priv->tooltip_label);
+	gtk_widget_show (window->priv->status_notebook);
+}
+
+static void
+shell_window_connect_proxy_cb (EShellWindow *window,
+                               GtkAction *action,
+                               GtkWidget *proxy)
+{
+	if (!GTK_IS_MENU_ITEM (proxy))
+		return;
+
+	g_object_set_data_full (
+		G_OBJECT (proxy), "action", action,
+		(GDestroyNotify) g_object_unref);
+
+	g_signal_connect_swapped (
+		proxy, "select",
+		G_CALLBACK (shell_window_menu_item_select_cb), window);
+
+	g_signal_connect_swapped (
+		proxy, "deselect",
+		G_CALLBACK (shell_window_menu_item_deselect_cb), window);
+}
+
+static void
+shell_window_online_button_clicked_cb (EOnlineButton *button,
+                                       EShellWindow *window)
+{
+	if (e_online_button_get_online (button))
+		gtk_action_activate (ACTION (WORK_OFFLINE));
+	else
+		gtk_action_activate (ACTION (WORK_ONLINE));
+}
+
+void
+e_shell_window_private_init (EShellWindow *window)
+{
+	EShellWindowPrivate *priv = window->priv;
+	GConfBridge *bridge;
+	GtkWidget *container;
+	GtkWidget *widget;
+	GObject *object;
+	const gchar *key;
+	gint height;
+
+	priv->manager = gtk_ui_manager_new ();
+	priv->shell_actions = gtk_action_group_new ("shell");
+	priv->new_item_actions = gtk_action_group_new ("new-item");
+	priv->new_group_actions = gtk_action_group_new ("new-group");
+	priv->new_source_actions = gtk_action_group_new ("new-source");
+	priv->shell_view_actions = gtk_action_group_new ("shell-view");
+
+	priv->shell_views = g_ptr_array_new ();
+
+	/* XXX Load UI file. */
+
+	e_shell_window_actions_init (window);
+
+	gtk_window_add_accel_group (
+		GTK_WINDOW (window),
+		gtk_ui_manager_get_accel_group (priv->manager));
+
+	g_signal_connect_swapped (
+		priv->manager, "connect-proxy",
+		G_CALLBACK (shell_window_connect_proxy_cb), window);
+
+	/* Construct window widgets. */
+
+	widget = gtk_vbox_new (FALSE, 0);
+	gtk_container_add (GTK_CONTAINER (window), widget);
+
+	container = widget;
+
+	widget = e_shell_window_get_managed_widget (window, "/main-menu");
+	gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0);
+	priv->main_menu = g_object_ref (widget);
+	gtk_widget_show (widget);
+
+	widget = e_shell_window_get_managed_widget (window, "/main-toolbar");
+	gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0);
+	priv->main_toolbar = g_object_ref (widget);
+	gtk_widget_show (widget);
+
+	widget = gtk_hpaned_new ();
+	gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0);
+	priv->content_pane = g_object_ref (widget);
+	gtk_widget_show (widget);
+
+	widget = gtk_hbox_new (FALSE, 2);
+	gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0);
+	priv->status_area = g_object_ref (widget);
+	gtk_widget_show (widget);
+
+	/* Make the status area as large as the task bar. */
+	gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, NULL, &height);
+	gtk_widget_set_size_request (widget, -1, height * 2);
+
+	container = priv->content_pane;
+
+	widget = e_sidebar_new ();
+	gtk_paned_pack1 (GTK_PANED (container), widget, TRUE, FALSE);
+	priv->sidebar = g_object_ref (widget);
+	gtk_widget_show (widget);
+
+	widget = gtk_notebook_new ();
+	gtk_notebook_set_show_tabs (GTK_NOTEBOOK (widget), FALSE);
+	gtk_notebook_set_show_border (GTK_NOTEBOOK (widget), FALSE);
+	gtk_paned_pack2 (GTK_PANED (container), widget, TRUE, FALSE);
+	priv->content_notebook = g_object_ref (widget);
+	gtk_widget_show (widget);
+
+	container = priv->sidebar;
+
+	widget = gtk_notebook_new ();
+	gtk_notebook_set_show_tabs (GTK_NOTEBOOK (widget), FALSE);
+	gtk_notebook_set_show_border (GTK_NOTEBOOK (widget), FALSE);
+	gtk_container_add (GTK_CONTAINER (container), widget);
+	priv->sidebar_notebook = g_object_ref (widget);
+	gtk_widget_show (widget);
+
+	container = priv->status_area;
+
+	widget = e_online_button_new ();
+	g_signal_connect (
+		widget, "clicked",
+		G_CALLBACK (shell_window_online_button_clicked_cb), window);
+	gtk_box_pack_start (GTK_BOX (container), widget, FALSE, TRUE, 0);
+	priv->online_button = g_object_ref (widget);
+	gtk_widget_show (widget);
+
+	widget = gtk_label_new ("");
+	gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
+	gtk_box_pack_start (GTK_BOX (container), widget, TRUE, TRUE, 0);
+	priv->tooltip_label = g_object_ref (widget);
+	gtk_widget_hide (widget);
+
+	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 (container), widget, TRUE, TRUE, 0);
+	priv->status_notebook = g_object_ref (widget);
+	gtk_widget_show (widget);
+
+	/* Bind GObject properties to GConf keys. */
+
+	bridge = gconf_bridge_get ();
+
+	key = "/apps/evolution/shell/view_defaults/window";
+	gconf_bridge_bind_window (
+		bridge, key, GTK_WINDOW (window), TRUE, FALSE);
+
+	object = G_OBJECT (priv->content_pane);
+	key = "/apps/evolution/shell/view_defaults/folder_bar/width";
+	gconf_bridge_bind_property_delayed (bridge, key, object, "position");
+
+	object = G_OBJECT (ACTION (SHOW_BUTTONS));
+	key = "/apps/evolution/shell/view-defaults/buttons_visible";
+	gconf_bridge_bind_property (bridge, key, object, "active");
+
+	object = G_OBJECT (ACTION (SHOW_SIDEBAR));
+	key = "/apps/evolution/shell/view-defaults/sidebar_visible";
+	gconf_bridge_bind_property (bridge, key, object, "active");
+
+	object = G_OBJECT (ACTION (SHOW_STATUSBAR));
+	key = "/apps/evolution/shell/view_defaults/statusbar_visible";
+	gconf_bridge_bind_property (bridge, key, object, "active");
+
+	object = G_OBJECT (ACTION (SHOW_TOOLBAR));
+	key = "/apps/evolution/shell/view_defaults/toolbar_visible";
+	gconf_bridge_bind_property (bridge, key, object, "active");
+
+	/* NetworkManager integration. */
+
+#ifdef NM_SUPPORT_GLIB
+	e_shell_nm_glib_initialise (window);
+#elif NM_SUPPORT
+	e_shell_dbus_initialise (window);
+#endif
+
+	/* Initialize shell views */
+
+	e_shell_window_create_shell_view_actions (window);
+}
+
+void
+e_shell_window_private_dispose (EShellWindow *window)
+{
+	EShellWindowPrivate *priv = window->priv;
+
+	DISPOSE (priv->manager);
+	DISPOSE (priv->shell_actions);
+	DISPOSE (priv->new_item_actions);
+	DISPOSE (priv->new_group_actions);
+	DISPOSE (priv->new_source_actions);
+	DISPOSE (priv->shell_view_actions);
+
+	DISPOSE (priv->main_menu);
+	DISPOSE (priv->main_toolbar);
+	DISPOSE (priv->content_pane);
+	DISPOSE (priv->content_notebook);
+	DISPOSE (priv->sidebar);
+	DISPOSE (priv->sidebar_notebook);
+	DISPOSE (priv->status_area);
+	DISPOSE (priv->online_button);
+	DISPOSE (priv->tooltip_label);
+	DISPOSE (priv->status_notebook);
+
+#ifdef NM_SUPPORT_GLIB
+	e_shell_nm_glib_dispose (E_SHELL_WINDOW (object));
+#elif NM_SUPPORT
+	e_shell_dbus_dispose (E_SHELL_WINDOW (object));
+#endif
+}
+
+void
+e_shell_window_private_finalize (EShellWindow *window)
+{
+	EShellWindowPrivate *priv = window->priv;
+
+	g_ptr_array_foreach (priv->shell_views, (GFunc) g_object_unref, NULL);
+	g_ptr_array_free (priv->shell_views, TRUE);
+}

Added: branches/kill-bonobo/shell/e-shell-window-private.h
==============================================================================
--- (empty file)
+++ branches/kill-bonobo/shell/e-shell-window-private.h	Wed Jul 16 19:37:02 2008
@@ -0,0 +1,93 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*-
+ * e-shell-window-private.h
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef E_SHELL_WINDOW_PRIVATE_H
+#define E_SHELL_WINDOW_PRIVATE_H
+
+#include "e-shell-window.h"
+
+#include <glib/gi18n.h>
+
+#include "e-shell.h"
+#include "e-shell-view.h"
+#include "e-shell-registry.h"
+#include "e-shell-window-actions.h"
+
+#include "e-online-button.h"
+#include "e-sidebar.h"
+
+/* Shorthand, requires a variable named "window". */
+#define ACTION(name)		(E_SHELL_WINDOW_ACTION_##name (window))
+#define ACTION_GROUP(name)	(E_SHELL_WINDOW_ACTION_GROUP_##name (window))
+
+/* For use in dispose() methods. */
+#define DISPOSE(obj) \
+	G_STMT_START { \
+	if ((obj) != NULL) { g_object_unref (obj); (obj) = NULL; } \
+	} G_STMT_END
+
+G_BEGIN_DECLS
+
+struct _EShellWindowPrivate {
+
+	/*** UI Management ***/
+
+	GtkUIManager *manager;
+	GtkActionGroup *shell_actions;
+	GtkActionGroup *new_item_actions;
+	GtkActionGroup *new_group_actions;
+	GtkActionGroup *new_source_actions;
+	GtkActionGroup *shell_view_actions;
+
+	/*** Shell Views ***/
+
+	GPtrArray *shell_views;
+
+	/*** Widgetry ***/
+
+	GtkWidget *main_menu;
+	GtkWidget *main_toolbar;
+	GtkWidget *content_pane;
+	GtkWidget *content_notebook;
+	GtkWidget *sidebar;
+	GtkWidget *sidebar_notebook;
+	GtkWidget *status_area;
+	GtkWidget *online_button;
+	GtkWidget *tooltip_label;
+	GtkWidget *status_notebook;
+
+	/* Miscellaneous */
+
+	gboolean destroyed;  /* XXX Do we still need this? */
+};
+
+void		e_shell_window_private_init	(EShellWindow *window);
+void		e_shell_window_private_dispose	(EShellWindow *window);
+void		e_shell_window_private_finalize	(EShellWindow *window);
+
+/* Private Utilities */
+
+void		e_shell_window_actions_init	(EShellWindow *window);
+void		e_shell_window_create_shell_view_actions
+						(EShellWindow *window);
+
+G_END_DECLS
+
+#endif /* E_SHELL_WINDOW_PRIVATE_H */

Modified: branches/kill-bonobo/shell/e-shell-window.c
==============================================================================
--- branches/kill-bonobo/shell/e-shell-window.c	(original)
+++ branches/kill-bonobo/shell/e-shell-window.c	Wed Jul 16 19:37:02 2008
@@ -16,8 +16,6 @@
  * 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
@@ -27,179 +25,241 @@
 #include "e-shell-window.h"
 #include "e-shell-view.h"
 
-#include "Evolution.h"
-
+#include "e-util/e-plugin-ui.h"
 #include "e-util/e-util-private.h"
+#include "e-util/gconf-bridge.h"
+#include "widgets/misc/e-online-button.h"
 
 #include "e-component-registry.h"
-#include "e-shell-window-commands.h"
 #include "e-shell-marshal.h"
 #include "e-sidebar.h"
 #include "es-menu.h"
 #include "es-event.h"
 
-#include <gtk/gtk.h>
-
-#include <bonobo/bonobo-exception.h>
-#include <bonobo/bonobo-object.h>
-#include <bonobo/bonobo-ui-util.h>
-#include <bonobo/bonobo-widget.h>
-
 #include <glib/gi18n.h>
-#include <libgnome/gnome-gconf.h>
 
 #include <gconf/gconf-client.h>
 
 #include <string.h>
 
-#ifdef NM_SUPPORT_GLIB
-void e_shell_nm_glib_initialise (EShellWindow *window);
-void e_shell_nm_glib_dispose (EShellWindow *window);
-#elif NM_SUPPORT
-void e_shell_dbus_initialise (EShellWindow *window);
-void e_shell_dbus_dispose (EShellWindow *window);
-#endif
+static gpointer parent_class;
 
-/* A view for each component.  These are all created when EShellWindow is
-   instantiated, but with the widget pointers to NULL and the page number set
-   to -1.  When the views are created the first time, the widget pointers as
-   well as the notebook page value get set.  */
-struct _ComponentView {
-	int button_id;
-	char *component_id;
-	char *component_alias;
+static void
+shell_window_update_title (EShellWindow *window)
+{
+	EShellView *shell_view;
+	const gchar *title = _("Evolution");
+	gchar *buffer = NULL;
 
-	GNOME_Evolution_ComponentView component_view;
-	char *title;
+	shell_view = window->priv->current_view;
+	if (shell_view != NULL)
+		title = e_shell_view_get_title (shell_view);
 
-	GtkWidget *sidebar_widget;
-	GtkWidget *view_widget;
-	GtkWidget *statusbar_widget;
+	if (shell_view != NULL && title == NULL) {
+		const gchar *id;
 
-	int notebook_page_num;
-};
-typedef struct _ComponentView ComponentView;
+		id = e_shell_view_get_id (shell_view);
 
+		/* Translators: This is the window title and %s is the
+		 * view name.  Most translators will want to keep it as is. */
+		buffer = g_strdup_printf (_("%s - Evolution"), id);
 
-struct _EShellWindowPrivate {
-	union {
-		EShell *eshell;
-		gpointer pointer;
-	} shell;
+		title = buffer;
+	}
 
-	EShellView *shell_view;	/* CORBA wrapper for this, just a placeholder */
+	gtk_window_set_title (GTK_WINDOW (window), title);
 
-	/* plugin menu manager */
-	ESMenu *menu;
+	g_free (buffer);
+}
 
-	/* All the ComponentViews.  */
-	GSList *component_views;
+static void
+shell_window_dispose (GObject *object)
+{
+	EShellWindowPrivate *priv;
 
-	/* The paned widget for the sidebar and component views */
-	GtkWidget *paned;
+	priv = E_SHELL_WINDOW_GET_PRIVATE (object);
 
-	/* The sidebar.  */
-	GtkWidget *sidebar;
+	priv->destroyed = TRUE;
 
-	/* Notebooks used to switch between components.  */
-	GtkWidget *sidebar_notebook;
-	GtkWidget *view_notebook;
-	GtkWidget *statusbar_notebook;
+	e_shell_window_private_dispose (E_SHELL_WINDOW (object));
 
-	/* Bonobo foo.  */
-	BonoboUIComponent *ui_component;
+	if (priv->shell != NULL) {
+		g_object_remove_weak_pointer (
+			G_OBJECT (priv->shell), &priv->shell);
+		priv->shell = NULL;
+	}
 
-	/* The current view (can be NULL initially).  */
-	ComponentView *current_view;
+	if (priv->current_view != NULL) {
+		g_object_unref (priv->current_view);
+		priv->current_view = NULL;
+	}
 
-	/* The status bar widgetry.  */
-	GtkWidget *status_bar;
-	GtkWidget *offline_toggle;
-	GtkWidget *offline_toggle_image;
-	GtkWidget *menu_hint_label;
+	/* Chain up to parent's dispose() method. */
+	G_OBJECT_CLASS (parent_class)->dispose (object);
+}
 
-	/* The timeout for saving the window size */
-	guint      store_window_size_timer;
-	gboolean destroyed;
-};
+static void
+shell_window_finalize (GObject *object)
+{
+	EShellWindowPrivate *priv;
 
+	priv = E_SHELL_WINDOW_GET_PRIVATE (object);
 
-enum {
-	COMPONENT_CHANGED,
-	LAST_SIGNAL
-};
+	e_shell_window_private_finalize (E_SHELL_WINDOW (object));
 
-static guint signals[LAST_SIGNAL] = { 0 };
+	g_slist_foreach (priv->component_views, (GFunc) component_view_free, NULL);
+	g_slist_free (priv->component_views);
 
-G_DEFINE_TYPE (EShellWindow, e_shell_window, BONOBO_TYPE_WINDOW)
+	/* Chain up to parent's finalize() method. */
+	G_OBJECT_CLASS (parent_class)->finalize (object);
+}
 
-/* The icons for the offline/online status.  */
-#define OFFLINE_ICON "offline.png"
-#define ONLINE_ICON  "online.png"
+static void
+shell_window_class_init (EShellWindowClass *class)
+{
+	GObjectClass *object_class;
 
-static gboolean store_window_size (GtkWidget* widget);
+	parent_class = g_type_class_peek_parent (class);
+	g_type_class_add_private (class, sizeof (EShellWindowPrivate));
 
-/* ComponentView handling.  */
+	object_class = G_OBJECT_CLASS (class);
+	object_class->dispose = shell_window_dispose;
+	object_class->finalize = shell_window_finalize;
+}
 
-static ComponentView *
-component_view_new (const char *id, const char *alias, int button_id)
+static void
+shell_window_init (EShellWindow *window)
 {
-	ComponentView *view = g_new0 (ComponentView, 1);
+	GtkUIManager *manager;
+
+	window->priv = E_SHELL_WINDOW_GET_PRIVATE (window);
 
-	view->component_id = g_strdup (id);
-	view->component_alias = g_strdup (alias);
-	view->button_id = button_id;
-	view->notebook_page_num = -1;
+	e_shell_window_private_init (window);
 
-	return view;
+	manager = e_shell_window_get_ui_manager (window);
+
+	window->priv->shell_view = e_shell_view_new (window);
+	window->priv->destroyed = FALSE;
+
+	e_plugin_ui_register_manager (
+		"org.gnome.evolution.shell", manager, window);
 }
 
-static void
-component_view_free (ComponentView *view)
+GType
+e_shell_window_get_type (void)
 {
-	if (view->component_view) {
-		CORBA_Environment ev = { NULL };
+	static GType type = 0;
 
-		CORBA_Object_release(view->component_view, &ev);
-		CORBA_exception_free(&ev);
+	if (G_UNLIKELY (type == 0)) {
+		const GTypeInfo type_info = {
+			sizeof (EShellWindowClass),
+			(GBaseInitFunc) NULL,
+			(GBaseFinalizeFunc) NULL,
+			(GClassInitFunc) shell_window_class_init,
+			(GClassFinalizeFunc) NULL,
+			NULL,  /* class_data */
+			sizeof (EShellWindow),
+			0,     /* n_preallocs */
+			(GInstanceInitFunc) shell_window_init,
+			NULL   /* value_table */
+		};
+
+		type = g_type_register_static (
+			GTK_TYPE_WINDOW, "EShellWindow", &type_info, 0);
 	}
 
-	g_free (view->component_id);
-	g_free (view->component_alias);
-	g_free (view->title);
-	g_free (view);
+	return type;
 }
 
-static void
-component_view_deactivate (ComponentView *view)
+const gchar *
+e_shell_window_get_current_view (EShellWindow *window)
 {
-	BonoboControlFrame *view_control_frame;
-	BonoboControlFrame *sidebar_control_frame;
+}
 
-	g_return_if_fail (view->sidebar_widget != NULL);
-	g_return_if_fail (view->view_widget != NULL);
+void
+e_shell_window_set_current_view (EShellWindow *window,
+                                 const gchar *shell_view_id)
+{
+}
 
-	view_control_frame = bonobo_widget_get_control_frame (BONOBO_WIDGET (view->view_widget));
-	bonobo_control_frame_control_deactivate (view_control_frame);
+GtkUIManager *
+e_shell_window_get_ui_manager (EShellWindow *window)
+{
+	g_return_val_if_fail (E_IS_SHELL_WINDOW (window), NULL);
 
-	sidebar_control_frame = bonobo_widget_get_control_frame (BONOBO_WIDGET (view->sidebar_widget));
-	bonobo_control_frame_control_deactivate (sidebar_control_frame);
+	return window->priv->manager;
 }
 
-static void
-component_view_activate (ComponentView *view)
+GtkAction *
+e_shell_window_get_action (EShellWindow *window,
+                           const gchar *action_name)
+{
+	GtkUIManager *manager;
+	GtkAction *action = NULL;
+	GList *iter;
+
+	g_return_val_if_fail (E_IS_SHELL_WINDOW (window), NULL);
+	g_return_val_if_fail (action_name != NULL, NULL);
+
+	manager = e_shell_window_get_ui_manager (window);
+	iter = gtk_ui_manager_get_action_groups (manager);
+
+	while (iter != NULL && action == NULL) {
+		GtkActionGroup *action_group = iter->data;
+
+		action = gtk_action_group_get_action (
+			action_group, action_name);
+		iter = g_list_next (iter);
+	}
+
+	g_return_val_if_fail (action != NULL, NULL);
+
+	return action;
+}
+
+GtkActionGroup *
+e_shell_window_get_action_group (EShellWindow *window,
+                                 const gchar *group_name)
 {
-	BonoboControlFrame *view_control_frame;
-	BonoboControlFrame *sidebar_control_frame;
+	GtkUIManager *manager;
+	GList *iter;
+
+	g_return_val_if_fail (E_IS_SHELL_WINDOW (window), NULL);
+	g_return_val_if_fail (group_name != NULL, NULL);
 
-	g_return_if_fail (view->sidebar_widget != NULL);
-	g_return_if_fail (view->view_widget != NULL);
+	manager = e_shell_window_get_ui_manager (window);
+	iter = gtk_ui_manager_get_action_groups (manager);
 
-	view_control_frame = bonobo_widget_get_control_frame (BONOBO_WIDGET (view->view_widget));
-	bonobo_control_frame_control_activate (view_control_frame);
+	while (iter != NULL) {
+		GtkActionGroup *action_group = iter->data;
+		const gchar *name;
+
+		name = gtk_action_group_get_name (action_group);
+		if (strcmp (name, group_name) == 0)
+			return action_group;
+
+		iter = g_list_next (iter);
+	}
 
-	sidebar_control_frame = bonobo_widget_get_control_frame (BONOBO_WIDGET (view->sidebar_widget));
-	bonobo_control_frame_control_activate (sidebar_control_frame);
+	g_return_val_if_reached (NULL);
+}
+
+GtkWidget *
+e_shell_window_get_managed_widget (EShellWindow *window,
+                                   const gchar *widget_path)
+{
+	GtkUIManager *manager;
+	GtkWidget *widget;
+
+	g_return_val_if_fail (E_IS_SHELL_WINDOW (window), NULL);
+	g_return_val_if_fail (widget_path != NULL, NULL);
+
+	manager = e_shell_window_get_ui_manager (window);
+	widget = gtk_ui_manager_get_widget (manager, widget_path);
+
+	g_return_val_if_fail (widget != NULL, NULL);
+
+	return widget;
 }
 
 static void
@@ -207,7 +267,7 @@
 	   ComponentView *view)
 {
 	EShellWindowPrivate *priv = window->priv;
-	EComponentRegistry *registry = e_shell_peek_component_registry (window->priv->shell.eshell);
+	EComponentRegistry *registry = e_shell_peek_component_registry (window->priv->shell);
 	GNOME_Evolution_Component component_iface;
 	GNOME_Evolution_ComponentView component_view;
 	Bonobo_UIContainer container;
@@ -216,7 +276,7 @@
 	Bonobo_Control statusbar_control;
 	CORBA_Environment ev;
 	int sidebar_notebook_page_num;
-	int view_notebook_page_num;
+	int content_notebook_page_num;
 
 	g_return_if_fail (view->view_widget == NULL);
 	g_return_if_fail (view->sidebar_widget == NULL);
@@ -277,27 +337,24 @@
 	bonobo_object_release_unref (statusbar_control, NULL);
 
 	gtk_notebook_append_page (GTK_NOTEBOOK (priv->sidebar_notebook), view->sidebar_widget, NULL);
-	gtk_notebook_append_page (GTK_NOTEBOOK (priv->view_notebook), view->view_widget, NULL);
+	gtk_notebook_append_page (GTK_NOTEBOOK (priv->content_notebook), view->view_widget, NULL);
 	gtk_notebook_append_page (GTK_NOTEBOOK (priv->statusbar_notebook), view->statusbar_widget, NULL);
 
 	sidebar_notebook_page_num = gtk_notebook_page_num (GTK_NOTEBOOK (priv->sidebar_notebook), view->sidebar_widget);
-	view_notebook_page_num = gtk_notebook_page_num (GTK_NOTEBOOK (priv->view_notebook), view->view_widget);
+	content_notebook_page_num = gtk_notebook_page_num (GTK_NOTEBOOK (priv->content_notebook), view->view_widget);
 
 	/* Since we always add a view page and a sidebar page at the same time...  */
-	g_return_if_fail (sidebar_notebook_page_num == view_notebook_page_num);
+	g_return_if_fail (sidebar_notebook_page_num == content_notebook_page_num);
 
-	view->notebook_page_num = view_notebook_page_num;
+	view->notebook_page_num = content_notebook_page_num;
 
 	/* 3. Switch to the new page.  */
 
-	gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->view_notebook), view_notebook_page_num);
-	gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->sidebar_notebook), view_notebook_page_num);
-	gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->statusbar_notebook), view_notebook_page_num);
+	gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->content_notebook), content_notebook_page_num);
+	gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->sidebar_notebook), content_notebook_page_num);
+	gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->statusbar_notebook), content_notebook_page_num);
 
-	if (priv->current_view != NULL)
-		component_view_deactivate (priv->current_view);
 	priv->current_view = view;
-	component_view_activate (view);
 
 	bonobo_object_release_unref (component_iface, NULL);
 }
@@ -307,7 +364,7 @@
 {
 	EShellWindowPrivate *priv = window->priv;
 	GConfClient *gconf_client = gconf_client_get_default ();
-	EComponentRegistry *registry = e_shell_peek_component_registry (window->priv->shell.eshell);
+	EComponentRegistry *registry = e_shell_peek_component_registry (window->priv->shell);
 	EComponentInfo *info = e_component_registry_peek_info (registry,
 							       ECR_FIELD_ID,
 							       component_view->component_id);
@@ -316,12 +373,9 @@
 	if (component_view->sidebar_widget == NULL) {
 		init_view (window, component_view);
 	} else {
-		if (priv->current_view != NULL)
-			component_view_deactivate (priv->current_view);
 		priv->current_view = component_view;
-		component_view_activate (component_view);
 
-		gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->view_notebook), component_view->notebook_page_num);
+		gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->content_notebook), component_view->notebook_page_num);
 		gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->sidebar_notebook), component_view->notebook_page_num);
 		gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->statusbar_notebook), component_view->notebook_page_num);
 	}
@@ -355,7 +409,7 @@
 	 */
 	e_event_emit ((EEvent *) es_event_peek (), "component.activated", (EEventTarget *) es_event_target_new_component (es_event_peek (), component_view->component_id));
 
-	g_signal_emit (window, signals[COMPONENT_CHANGED], 0);
+	g_object_notify (G_OBJECT (window), "current-view");
 }
 
 
@@ -365,34 +419,34 @@
 update_offline_toggle_status (EShellWindow *window)
 {
 	EShellWindowPrivate *priv;
-	const char *icon;
-	char *icon_file;
-	const char *tooltip;
+	GtkWidget *widget;
+	const gchar *tooltip;
+	gboolean online;
 	gboolean sensitive;
 	guint32 flags = 0;
 	ESMenuTargetShell *t;
 
 	priv = window->priv;
 
-	switch (e_shell_get_line_status (priv->shell.eshell)) {
+	switch (e_shell_get_line_status (priv->shell)) {
 	case E_SHELL_LINE_STATUS_ONLINE:
-		icon        = ONLINE_ICON;
+		online      = TRUE;
 		sensitive   = TRUE;
-		tooltip     = _("Evolution is currently online. "
+		tooltip     = _("Evolution is currently online.\n"
 				"Click on this button to work offline.");
 		flags = ES_MENU_SHELL_ONLINE;
 		break;
 	case E_SHELL_LINE_STATUS_GOING_OFFLINE:
-		icon        = ONLINE_ICON;
+		online      = TRUE;
 		sensitive   = FALSE;
 		tooltip     = _("Evolution is in the process of going offline.");
 		flags = ES_MENU_SHELL_OFFLINE;
 		break;
 	case E_SHELL_LINE_STATUS_OFFLINE:
 	case E_SHELL_LINE_STATUS_FORCED_OFFLINE:
-		icon        = OFFLINE_ICON;
+		online      = FALSE;
 		sensitive   = TRUE;
-		tooltip     = _("Evolution is currently offline. "
+		tooltip     = _("Evolution is currently offline.\n"
 				"Click on this button to work online.");
 		flags = ES_MENU_SHELL_OFFLINE;
 		break;
@@ -400,11 +454,10 @@
 		g_return_if_reached ();
 	}
 
-	icon_file = g_build_filename (EVOLUTION_IMAGESDIR, icon, NULL);
-	gtk_image_set_from_file (GTK_IMAGE (priv->offline_toggle_image), icon_file);
-	g_free (icon_file);
-	gtk_widget_set_sensitive (priv->offline_toggle, sensitive);
-	gtk_widget_set_tooltip_text (priv->offline_toggle, tooltip);
+	widget = window->priv->offline_toggle;
+	gtk_widget_set_sensitive (widget, sensitive);
+	gtk_widget_set_tooltip_text (widget, tooltip);
+	e_online_button_set_online (E_ONLINE_BUTTON (widget), online);
 
 	/* TODO: If we get more shell flags, this should be centralised */
 	t = es_menu_target_new_shell(priv->menu, flags);
@@ -415,8 +468,8 @@
 static void
 update_send_receive_sensitivity (EShellWindow *window)
 {
-	if (e_shell_get_line_status (window->priv->shell.eshell) == E_SHELL_LINE_STATUS_OFFLINE || 
-		e_shell_get_line_status (window->priv->shell.eshell) == E_SHELL_LINE_STATUS_FORCED_OFFLINE)
+	if (e_shell_get_line_status (window->priv->shell) == E_SHELL_LINE_STATUS_OFFLINE || 
+		e_shell_get_line_status (window->priv->shell) == E_SHELL_LINE_STATUS_FORCED_OFFLINE)
 		bonobo_ui_component_set_prop (window->priv->ui_component,
 					      "/commands/SendReceive",
 					      "sensitive", "0", NULL);
@@ -466,9 +519,8 @@
 		ComponentView *component_view;
 
 		if ((component_view = get_component_view (window, button_id))) {
-			e_shell_create_window (window->priv->shell.eshell,
-					       component_view->component_id,
-					       window);
+			e_shell_create_window (window->priv->shell,
+					       component_view->component_id);
 		}
 		return TRUE;
 	}
@@ -476,25 +528,6 @@
 }
 
 static void
-offline_toggle_clicked_callback (GtkButton *button,
-				 EShellWindow *window)
-{
-	EShellWindowPrivate *priv = window->priv;
-
-	switch (e_shell_get_line_status (priv->shell.eshell)) {
-	case E_SHELL_LINE_STATUS_ONLINE:
-		e_shell_go_offline (priv->shell.eshell, window, GNOME_Evolution_USER_OFFLINE);
-		break;
-	case E_SHELL_LINE_STATUS_OFFLINE:
-	case E_SHELL_LINE_STATUS_FORCED_OFFLINE:
-		e_shell_go_online (priv->shell.eshell, window, GNOME_Evolution_USER_ONLINE);
-		break;
-	default:
-		g_return_if_reached();
-	}
-}
-
-static void
 shell_line_status_changed_callback (EShell *shell,
 				    EShellLineStatus new_status,
 				    EShellWindow *window)
@@ -502,795 +535,3 @@
 	update_offline_toggle_status (window);
 	update_send_receive_sensitivity (window);
 }
-
-static void
-ui_engine_add_hint_callback (BonoboUIEngine *engine,
-			     const char *hint,
-			     EShellWindow *window)
-{
-	gtk_label_set_text (GTK_LABEL (window->priv->menu_hint_label), hint);
-	gtk_widget_show (window->priv->menu_hint_label);
-	gtk_widget_hide (window->priv->statusbar_notebook);
-}
-
-static void
-ui_engine_remove_hint_callback (BonoboUIEngine *engine,
-				EShellWindow *window)
-{
-	gtk_widget_hide (window->priv->menu_hint_label);
-	gtk_widget_show (window->priv->statusbar_notebook);
-}
-
-
-/* Widgetry.  */
-
-static void
-setup_offline_toggle (EShellWindow *window)
-{
-	EShellWindowPrivate *priv;
-	GtkWidget *toggle;
-	GtkWidget *image;
-	GtkWidget *label;
-	GtkWidget *hbox;
-
-	priv = window->priv;
-
-	toggle = gtk_button_new ();
-	GTK_WIDGET_UNSET_FLAGS (toggle, GTK_CAN_FOCUS);
-	gtk_button_set_relief (GTK_BUTTON (toggle), GTK_RELIEF_NONE);
-
-	g_signal_connect (toggle, "clicked",
-			  G_CALLBACK (offline_toggle_clicked_callback), window);
-	hbox = gtk_hbox_new (FALSE, 0);
-	gtk_container_add (GTK_CONTAINER (toggle), hbox);
-
-	image = gtk_image_new ();
-	gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
-
-	label = gtk_label_new ("");
-	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
-
-	gtk_widget_show_all (toggle);
-
-	priv->offline_toggle       = toggle;
-	priv->offline_toggle_image = image;
-
-	update_offline_toggle_status (window);
-
-	g_return_if_fail (priv->status_bar != NULL);
-
-	gtk_box_pack_start (GTK_BOX (priv->status_bar), priv->offline_toggle, FALSE, TRUE, 0);
-}
-
-static void
-setup_menu_hint_label (EShellWindow *window)
-{
-	EShellWindowPrivate *priv;
-
-	priv = window->priv;
-
-	priv->menu_hint_label = gtk_label_new ("");
-	gtk_misc_set_alignment (GTK_MISC (priv->menu_hint_label), 0.0, 0.5);
-
-	gtk_box_pack_start (GTK_BOX (priv->status_bar), priv->menu_hint_label, TRUE, TRUE, 0);
-}
-
-static void
-setup_statusbar_notebook (EShellWindow *window)
-{
-	EShellWindowPrivate *priv;
-
-	priv = window->priv;
-
-	priv->statusbar_notebook = gtk_notebook_new ();
-	gtk_notebook_set_show_tabs (GTK_NOTEBOOK (priv->statusbar_notebook), FALSE);
-	gtk_notebook_set_show_border (GTK_NOTEBOOK (priv->statusbar_notebook), FALSE);
-
-	gtk_box_pack_start (GTK_BOX (priv->status_bar), priv->statusbar_notebook, TRUE, TRUE, 0);
-	gtk_widget_show (priv->statusbar_notebook);
-}
-
-static void
-setup_nm_support (EShellWindow *window)
-{
-	#ifdef NM_SUPPORT_GLIB
-	       e_shell_nm_glib_initialise (window);
-	#elif NM_SUPPORT
-	       e_shell_dbus_initialise (window);
-	#endif
-}
-
-static void
-setup_status_bar (EShellWindow *window)
-{
-	EShellWindowPrivate *priv;
-	BonoboUIEngine *ui_engine;
-	GConfClient *gconf_client;
-	gint height;
-
-	priv = window->priv;
-
-	priv->status_bar = gtk_hbox_new (FALSE, 2);
-
-	/* Make the status bar as large as the task bar. */
-	gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, NULL, &height);
-	gtk_widget_set_size_request (GTK_WIDGET (priv->status_bar), -1, height * 2);
-
-	gconf_client = gconf_client_get_default ();
-	if(gconf_client_get_bool (gconf_client,"/apps/evolution/shell/view_defaults/statusbar_visible",NULL))
-		gtk_widget_show (priv->status_bar);
-	g_object_unref (gconf_client);
-
-	/* setup dbus interface here*/
-	setup_nm_support (window);
-
-	setup_offline_toggle (window);
-	setup_menu_hint_label (window);
-	setup_statusbar_notebook (window);
-
-	ui_engine = bonobo_window_get_ui_engine (BONOBO_WINDOW (window));
-
-	g_signal_connect (ui_engine, "add_hint", G_CALLBACK (ui_engine_add_hint_callback), window);
-	g_signal_connect (ui_engine, "remove_hint", G_CALLBACK (ui_engine_remove_hint_callback), window);
-}
-
-static void
-menu_component_selected (BonoboUIComponent *uic,
-			 EShellWindow *window,
-			 const char *path)
-{
-	char *component_id;
-
-	component_id = strchr(path, '-');
-	if (component_id)
-		e_shell_window_switch_to_component (window, component_id+1);
-}
-
-static GConfEnumStringPair button_styles[] = {
-         { E_SIDEBAR_MODE_TEXT, "text" },
-         { E_SIDEBAR_MODE_ICON, "icons" },
-         { E_SIDEBAR_MODE_BOTH, "both" },
-         { E_SIDEBAR_MODE_TOOLBAR, "toolbar" },
- 	{ -1, NULL }
-};
-
-static void
-setup_widgets (EShellWindow *window)
-{
-	EShellWindowPrivate *priv = window->priv;
-	EComponentRegistry *registry = e_shell_peek_component_registry (priv->shell.eshell);
-	GConfClient *gconf_client = gconf_client_get_default ();
-	GtkWidget *contents_vbox;
-	GSList *p;
-	GString *xml;
-	int button_id;
-	gboolean visible;
-	char *style;
-	int mode;
-
-	priv->paned = gtk_hpaned_new ();
-	gtk_widget_show (priv->paned);
-
-	priv->sidebar = e_sidebar_new ();
-	g_signal_connect (priv->sidebar, "button_selected",
-			  G_CALLBACK (sidebar_button_selected_callback), window);
-	g_signal_connect (priv->sidebar, "button_pressed",
-			  G_CALLBACK (sidebar_button_pressed_callback), window);
-	gtk_paned_pack1 (GTK_PANED (priv->paned), priv->sidebar, FALSE, FALSE);
-	gtk_widget_show (priv->sidebar);
-
-	priv->sidebar_notebook = gtk_notebook_new ();
-	gtk_notebook_set_show_tabs (GTK_NOTEBOOK (priv->sidebar_notebook), FALSE);
-	gtk_notebook_set_show_border (GTK_NOTEBOOK (priv->sidebar_notebook), FALSE);
-	e_sidebar_set_selection_widget (E_SIDEBAR (priv->sidebar), priv->sidebar_notebook);
-	gtk_widget_show (priv->sidebar_notebook);
-
-	priv->view_notebook = gtk_notebook_new ();
-	gtk_notebook_set_show_tabs (GTK_NOTEBOOK (priv->view_notebook), FALSE);
-	gtk_notebook_set_show_border (GTK_NOTEBOOK (priv->view_notebook), FALSE);
-	gtk_paned_pack2 (GTK_PANED (priv->paned), priv->view_notebook, TRUE, FALSE);
-	gtk_widget_show (priv->view_notebook);
-
-	gtk_paned_set_position (GTK_PANED (priv->paned),
-				gconf_client_get_int (gconf_client, "/apps/evolution/shell/view_defaults/folder_bar/width", NULL));
-
-	/* The buttons */
-	visible = gconf_client_get_bool (gconf_client,
-						 "/apps/evolution/shell/view_defaults/buttons_visible",
-						 NULL);
-	bonobo_ui_component_set_prop (e_shell_window_peek_bonobo_ui_component (window),
-				      "/commands/ViewButtonsHide",
-				      "state",
-				      visible ? "0" : "1",
-				      NULL);
-
-	e_sidebar_set_show_buttons (E_SIDEBAR (priv->sidebar), visible);
-
-	style = gconf_client_get_string (gconf_client,
-					 "/apps/evolution/shell/view_defaults/buttons_style",
-					 NULL);
-
- 	if (gconf_string_to_enum (button_styles, style, &mode)) {
-		switch (mode) {
-		case E_SIDEBAR_MODE_TEXT:
-			bonobo_ui_component_set_prop (e_shell_window_peek_bonobo_ui_component (window),
-						      "/commands/ViewButtonsText",
-						      "state", "1", NULL);
-			break;
-		case E_SIDEBAR_MODE_ICON:
-			bonobo_ui_component_set_prop (e_shell_window_peek_bonobo_ui_component (window),
-						      "/commands/ViewButtonsIcon",
-						      "state", "1", NULL);
-			break;
-		case E_SIDEBAR_MODE_BOTH:
-			bonobo_ui_component_set_prop (e_shell_window_peek_bonobo_ui_component (window),
-						      "/commands/ViewButtonsIconText",
-						      "state", "1", NULL);
-			break;
-
-		case E_SIDEBAR_MODE_TOOLBAR:
-			bonobo_ui_component_set_prop (e_shell_window_peek_bonobo_ui_component (window),
-						      "/commands/ViewButtonsToolbar",
-						      "state", "1", NULL);
-			break;
-		}
-
-		e_sidebar_set_mode (E_SIDEBAR (priv->sidebar), mode);
-	}
-	g_free (style);
-
-	/* Status Bar*/
-	visible = gconf_client_get_bool (gconf_client,
-				         "/apps/evolution/shell/view_defaults/statusbar_visible",
-					 NULL);
-	bonobo_ui_component_set_prop (e_shell_window_peek_bonobo_ui_component (window),
-				      "/commands/ViewStatusBar",
-				      "state",
-				      visible ? "1" : "0",
-				      NULL);
-
-	/* Side Bar*/
-	visible = gconf_client_get_bool (gconf_client,
-				         "/apps/evolution/shell/view_defaults/sidebar_visible",
-					 NULL);
-	bonobo_ui_component_set_prop (e_shell_window_peek_bonobo_ui_component (window),
-				      "/commands/ViewSideBar",
-				      "state",
-				      visible ? "1" : "0",
-				      NULL);
-
-	/* The tool bar */
-	visible = gconf_client_get_bool (gconf_client,
-					 "/apps/evolution/shell/view_defaults/toolbar_visible",
-					 NULL);
-	bonobo_ui_component_set_prop (e_shell_window_peek_bonobo_ui_component (window),
-				      "/commands/ViewToolbar",
-				      "state",
-				      visible ? "1" : "0",
-				      NULL);
-	bonobo_ui_component_set_prop (e_shell_window_peek_bonobo_ui_component (window),
-				      "/Toolbar",
-				      "hidden",
-				      visible ? "0" : "1",
-				      NULL);
-
-	button_id = 0;
-	xml = g_string_new("");
-	for (p = e_component_registry_peek_list (registry); p != NULL; p = p->next) {
-		char *tmp, *tmp2;
-		EComponentInfo *info = p->data;
-		ComponentView *view = component_view_new (info->id, info->alias, button_id);
-
-		window->priv->component_views = g_slist_prepend (window->priv->component_views, view);
-
-		if (!info->button_label || !info->menu_label)
-			continue;
-		e_sidebar_add_button (E_SIDEBAR (priv->sidebar), info->button_label, info->button_tooltips, info->button_icon, button_id);
-
-		g_string_printf(xml, "SwitchComponent-%s", info->alias);
-		bonobo_ui_component_add_verb (e_shell_window_peek_bonobo_ui_component (window),
-					      xml->str,
-					      (BonoboUIVerbFn)menu_component_selected,
-					      window);
-
-		g_string_printf(xml, "<submenu name=\"View\">"
-				"<submenu name=\"Window\">"
-				"<placeholder name=\"WindowComponent\">"
-				"<menuitem name=\"SwitchComponent-%s\" "
-				"verb=\"\" label=\"%s\" accel=\"%s\" tip=\"",
-				info->alias,
-				info->menu_label,
-				info->menu_accelerator);
-		tmp = g_strdup_printf (_("Switch to %s"), info->button_label);
-		tmp2 = g_markup_escape_text (tmp, -1);
-		g_string_append (xml, tmp2);
-		g_free (tmp2);
-		g_free (tmp);
-
-		tmp = bonobo_ui_util_pixbuf_to_xml (info->menu_icon),
-		g_string_append_printf(xml, "\" pixtype=\"pixbuf\" pixname=\"%s\"/>"
-				       "</placeholder></submenu></submenu>\n",
-				       tmp);
-		g_free(tmp);
-		bonobo_ui_component_set_translate (e_shell_window_peek_bonobo_ui_component (window),
-						   "/menu",
-						   xml->str,
-						   NULL);
-		g_string_printf(xml, "<cmd name=\"SwitchComponent-%s\"/>\n", info->alias);
-		bonobo_ui_component_set_translate (e_shell_window_peek_bonobo_ui_component (window),
-						   "/commands",
-						   xml->str,
-						   NULL);
-		button_id ++;
-	}
-	g_string_free(xml, TRUE);
-
-	setup_status_bar (window);
-
-	contents_vbox = gtk_vbox_new (FALSE, 0);
-	gtk_box_pack_start (GTK_BOX (contents_vbox), priv->paned, TRUE, TRUE, 0);
-	gtk_box_pack_start (GTK_BOX (contents_vbox), priv->status_bar, FALSE, TRUE, 0);
-	gtk_widget_show (contents_vbox);
-
-	/* We only display this when a menu item is actually selected.  */
-	gtk_widget_hide (priv->menu_hint_label);
-
-	bonobo_window_set_contents (BONOBO_WINDOW (window), contents_vbox);
-	g_object_unref (gconf_client);
-}
-
-
-/* GObject methods.  */
-
-static void
-impl_dispose (GObject *object)
-{
-	EShellWindow *self = E_SHELL_WINDOW (object);
-	EShellWindowPrivate *priv = self->priv;
-
-	priv->destroyed = TRUE;
-
-	if (priv->shell.eshell != NULL) {
-		g_object_remove_weak_pointer (G_OBJECT (priv->shell.eshell), &priv->shell.pointer);
-		priv->shell.eshell = NULL;
-	}
-
-	if (priv->ui_component != NULL) {
-		bonobo_object_unref (BONOBO_OBJECT (priv->ui_component));
-		priv->ui_component = NULL;
-	}
-
-	if (priv->store_window_size_timer) {
-		g_source_remove (priv->store_window_size_timer);
-		self->priv->store_window_size_timer = 0;
-
-		/* There was a timer. Let us store the settings.*/
-		store_window_size (GTK_WIDGET (self));
-	}
-
-	#ifdef NM_SUPPORT_GLIB
-		e_shell_nm_glib_dispose (E_SHELL_WINDOW (object));
-	#elif NM_SUPPORT
-		e_shell_dbus_dispose (E_SHELL_WINDOW (object));
-	#endif
-
-	(* G_OBJECT_CLASS (e_shell_window_parent_class)->dispose) (object);
-}
-
-static void
-impl_finalize (GObject *object)
-{
-	EShellWindowPrivate *priv = E_SHELL_WINDOW (object)->priv;
-
-	g_slist_foreach (priv->component_views, (GFunc) component_view_free, NULL);
-	g_slist_free (priv->component_views);
-
-	g_object_unref(priv->menu);
-
-	g_free (priv);
-
-	(* G_OBJECT_CLASS (e_shell_window_parent_class)->finalize) (object);
-}
-
-/* GtkWidget methods */
-static void
-e_shell_window_remove_resize_timer (EShellWindow* self)
-{
-	if (self->priv->store_window_size_timer) {
-		g_source_remove (self->priv->store_window_size_timer);
-		self->priv->store_window_size_timer = 0;
-	}
-}
-
-static gboolean
-impl_window_state (GtkWidget *widget, GdkEventWindowState* ev)
-{
-	gboolean retval = FALSE;
-
-	/* store only if the window state really changed */
-	if ((ev->changed_mask & GDK_WINDOW_STATE_MAXIMIZED) != 0) {
-		GConfClient* client = gconf_client_get_default ();
-		gconf_client_set_bool (client, "/apps/evolution/shell/view_defaults/maximized",
-				       (ev->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) != 0, NULL);
-		g_object_unref(client);
-	}
-
-	if ((ev->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) != 0) {
-		e_shell_window_remove_resize_timer (E_SHELL_WINDOW (widget));
-	}
-
-	if (GTK_WIDGET_CLASS (e_shell_window_parent_class)->window_state_event) {
-		retval |= GTK_WIDGET_CLASS (e_shell_window_parent_class)->window_state_event (widget, ev);
-	}
-
-	return retval;
-}
-
-static gboolean
-store_window_size (GtkWidget* widget)
-{
-	GConfClient* client = gconf_client_get_default ();
-	gconf_client_set_int (client, "/apps/evolution/shell/view_defaults/width",
-			      widget->allocation.width, NULL);
-	gconf_client_set_int (client, "/apps/evolution/shell/view_defaults/height",
-			      widget->allocation.height, NULL);
-	g_object_unref(client);
-
-	E_SHELL_WINDOW (widget)->priv->store_window_size_timer = 0;
-	return FALSE; // remove this timeout
-}
-
-static void
-impl_size_alloc (GtkWidget* widget, GtkAllocation* alloc)
-{
-	EShellWindow* self = E_SHELL_WINDOW (widget);
-	e_shell_window_remove_resize_timer(self);
-
-	if (GTK_WIDGET_REALIZED(widget) && !(gdk_window_get_state(widget->window) & GDK_WINDOW_STATE_MAXIMIZED)) {
-		/* update the size storage timer */
-		self->priv->store_window_size_timer = g_timeout_add (1000, (GSourceFunc)store_window_size, self);
-	}
-
-	if (GTK_WIDGET_CLASS (e_shell_window_parent_class)->size_allocate) {
-		GTK_WIDGET_CLASS (e_shell_window_parent_class)->size_allocate (widget, alloc);
-	}
-}
-
-/* Initialization.  */
-
-static void
-e_shell_window_class_init (EShellWindowClass *klass)
-{
-	GObjectClass *object_class = G_OBJECT_CLASS (klass);
-	GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
-
-	object_class->dispose  = impl_dispose;
-	object_class->finalize = impl_finalize;
-
-	widget_class->window_state_event = impl_window_state;
-	widget_class->size_allocate      = impl_size_alloc;
-
-	signals[COMPONENT_CHANGED] = g_signal_new ("component_changed",
-						   G_OBJECT_CLASS_TYPE (object_class),
-						   G_SIGNAL_RUN_FIRST,
-						   G_STRUCT_OFFSET (EShellWindowClass, component_changed),
-						   NULL, NULL,
-						   g_cclosure_marshal_VOID__VOID,
-						   G_TYPE_NONE, 0);
-}
-
-static void
-e_shell_window_init (EShellWindow *shell_window)
-{
-	EShellWindowPrivate *priv = g_new0 (EShellWindowPrivate, 1);
-
-	priv->shell_view = e_shell_view_new(shell_window);
-	priv->destroyed = FALSE;
-
-	shell_window->priv = priv;
-
-	/** @HookPoint: Shell Main Menu
-	 * @Id: org.gnome.evolution.shell
-	 * @Type: ESMenu
-	 * @Target: ESMenuTargetShell
-	 *
-	 * This hook point is used to add bonobo menu's to the main
-	 * evolution shell window, used for global commands not
-	 * requiring a specific component.
-	 */
-	priv->menu = es_menu_new("org.gnome.evolution.shell");
-
-}
-
-
-/* Instantiation.  */
-
-GtkWidget *
-e_shell_window_new (EShell *shell,
-		    const char *component_id)
-{
-	EShellWindow *window = g_object_new (e_shell_window_get_type (), NULL);
-	EShellWindowPrivate *priv = window->priv;
-	GConfClient *gconf_client = gconf_client_get_default ();
-	BonoboUIContainer *ui_container;
-	char *default_component_id = NULL;
-	char *xmlfile;
-	gint width, height;
-
-	if (bonobo_window_construct (BONOBO_WINDOW (window),
-				     bonobo_ui_container_new (),
-				     "evolution", "Evolution") == NULL) {
-		g_object_unref (window);
-		g_object_unref (gconf_client);
-		return NULL;
-	}
-
-	window->priv->shell.eshell = shell;
-	g_object_add_weak_pointer (G_OBJECT (shell), &window->priv->shell.pointer);
-
-	/* FIXME TODO: Add system_exception signal handling and all the other
-	   stuff from e_shell_view_construct().  */
-
-	ui_container = bonobo_window_get_ui_container (BONOBO_WINDOW (window));
-
-	priv->ui_component = bonobo_ui_component_new ("evolution");
-	bonobo_ui_component_set_container (priv->ui_component,
-					   bonobo_object_corba_objref (BONOBO_OBJECT (ui_container)),
-					   NULL);
-
-	xmlfile = g_build_filename (EVOLUTION_UIDIR, "evolution.xml", NULL);
-	bonobo_ui_util_set_ui (priv->ui_component,
-			       PREFIX,
-			       xmlfile,
-			       "evolution", NULL);
-	g_free (xmlfile);
-
-	e_shell_window_commands_setup (window);
-	e_menu_activate((EMenu *)priv->menu, priv->ui_component, TRUE);
-
-	setup_widgets (window);
-
-	if(gconf_client_get_bool (gconf_client,"/apps/evolution/shell/view_defaults/sidebar_visible",NULL))
-		gtk_widget_show (priv->sidebar);
-	else
-		gtk_widget_hide (priv->sidebar);
-
-	update_send_receive_sensitivity (window);
-	g_signal_connect_object (shell, "line_status_changed", G_CALLBACK (shell_line_status_changed_callback), window, 0);
-
-	gtk_window_set_default_size (GTK_WINDOW (window), 640, 480);
-
-	if (component_id == NULL) {
-		component_id = default_component_id =
-			gconf_client_get_string (gconf_client,
-						 "/apps/evolution/shell/view_defaults/component_id",
-						 NULL);
-		if (component_id == NULL)
-			component_id = "mail";
-	}
-
-	e_shell_window_switch_to_component (window, component_id);
-	g_free(default_component_id);
-	g_object_unref (gconf_client);
-
-	width = gconf_client_get_int (gconf_client, "/apps/evolution/shell/view_defaults/width", NULL);
-	height = gconf_client_get_int (gconf_client, "/apps/evolution/shell/view_defaults/height", NULL);
-	gtk_window_set_default_size (GTK_WINDOW (window), (width >= 0) ? width : 0,
-			(height >= 0) ? height : 0);
-	if (gconf_client_get_bool (gconf_client, "/apps/evolution/shell/view_defaults/maximized", NULL)) {
-		gtk_window_maximize (GTK_WINDOW (window));
-	}
-
-	g_object_unref (gconf_client);
-	return GTK_WIDGET (window);
-}
-
-
-void
-e_shell_window_switch_to_component (EShellWindow *window, const char *component_id)
-{
-	EShellWindowPrivate *priv = window->priv;
-	ComponentView *view = NULL;
-	GSList *p;
-
-	g_return_if_fail (E_IS_SHELL_WINDOW (window));
-	g_return_if_fail (component_id != NULL);
-
-	for (p = priv->component_views; p != NULL; p = p->next) {
-		ComponentView *this_view = p->data;
-
-		if (strcmp (this_view->component_id, component_id) == 0
-		    || (this_view->component_alias != NULL
-			&& strcmp (this_view->component_alias, component_id) == 0))
-		{
-			view = p->data;
-			break;
-		}
-	}
-
-	if (view == NULL) {
-		g_warning ("Unknown component %s", component_id);
-		return;
-	}
-
-	e_sidebar_select_button (E_SIDEBAR (priv->sidebar), view->button_id);
-}
-
-
-const char *
-e_shell_window_peek_current_component_id (EShellWindow *window)
-{
-	g_return_val_if_fail (E_IS_SHELL_WINDOW (window), NULL);
-
-	if (window->priv->current_view == NULL)
-		return NULL;
-
-	return window->priv->current_view->component_id;
-}
-
-
-EShell *
-e_shell_window_peek_shell (EShellWindow *window)
-{
-	g_return_val_if_fail (E_IS_SHELL_WINDOW (window), NULL);
-
-	return window->priv->shell.eshell;
-}
-
-
-BonoboUIComponent *
-e_shell_window_peek_bonobo_ui_component (EShellWindow *window)
-{
-	g_return_val_if_fail (E_IS_SHELL_WINDOW (window), NULL);
-
-	return window->priv->ui_component;
-}
-
-ESidebar *
-e_shell_window_peek_sidebar (EShellWindow *window)
-{
-	g_return_val_if_fail (E_IS_SHELL_WINDOW (window), NULL);
-
-	return E_SIDEBAR (window->priv->sidebar);
-}
-
-GtkWidget *
-e_shell_window_peek_statusbar (EShellWindow *window)
-{
-	return window->priv->status_bar;
-}
-
-void
-e_shell_window_save_defaults (EShellWindow *window)
-{
-	GConfClient *client = gconf_client_get_default ();
-	char *prop;
-	const char *style;
-	gboolean visible;
-
-	gconf_client_set_int (client, "/apps/evolution/shell/view_defaults/folder_bar/width",
-			      gtk_paned_get_position (GTK_PANED (window->priv->paned)), NULL);
-
-	/* The button styles */
-	if ((style = gconf_enum_to_string (button_styles, e_sidebar_get_mode (E_SIDEBAR (window->priv->sidebar))))) {
-		gconf_client_set_string (client,
-				       "/apps/evolution/shell/view_defaults/buttons_style",
-				       style, NULL);
-	}
-
-	/* Button hiding setting */
-	prop = bonobo_ui_component_get_prop (e_shell_window_peek_bonobo_ui_component (window),
-					     "/commands/ViewButtonsHide",
-					     "state",
-					     NULL);
-	if (prop) {
-		visible = prop[0] == '0';
-		gconf_client_set_bool (client,
-				       "/apps/evolution/shell/view_defaults/buttons_visible",
-				       visible,
-				       NULL);
-		g_free (prop);
-	}
-
-	/* Toolbar visibility setting */
-	prop = bonobo_ui_component_get_prop (e_shell_window_peek_bonobo_ui_component (window),
-					     "/commands/ViewToolbar",
-					     "state",
-					     NULL);
-	if (prop) {
-		visible = prop[0] == '1';
-		gconf_client_set_bool (client,
-				       "/apps/evolution/shell/view_defaults/toolbar_visible",
-				       visible,
-				       NULL);
-		g_free (prop);
-	}
-
-	/* SideBar visibility setting */
-	prop = bonobo_ui_component_get_prop (e_shell_window_peek_bonobo_ui_component (window),
-					     "/commands/ViewSideBar",
-					     "state",
-					     NULL);
-	if (prop) {
-		visible = prop[0] == '1';
-		gconf_client_set_bool (client,
-				       "/apps/evolution/shell/view_defaults/sidebar_visible",
-				       visible,
-				       NULL);
-		g_free (prop);
-	}
-
-
-	g_object_unref (client);
-}
-
-void
-e_shell_window_show_settings (EShellWindow *window)
-{
-	g_return_if_fail (E_IS_SHELL_WINDOW (window));
-
-	e_shell_show_settings (window->priv->shell.eshell, window->priv->current_view ? window->priv->current_view->component_alias : NULL, window);
-}
-
-void
-e_shell_window_set_title(EShellWindow *window, const char *component_id, const char *title)
-{
-	EShellWindowPrivate *priv = window->priv;
-	ComponentView *view = NULL;
-	GSList *p;
-
-	if (priv->destroyed)
-		return;
-
-	for (p = priv->component_views; p != NULL; p = p->next) {
-		ComponentView *this_view = p->data;
-
-		if (strcmp (this_view->component_id, component_id) == 0
-		    || (this_view->component_alias != NULL
-			&& strcmp (this_view->component_alias, component_id) == 0)) {
-			view = p->data;
-			break;
-		}
-	}
-
-	if (view) {
-		g_free(view->title);
-		view->title = g_strdup(title);
-		if (view->title && view == priv->current_view)
-			gtk_window_set_title((GtkWindow *)window, title);
-	}
-}
-
-/**
- * e_shell_window_change_component_button_icon
- * Changes icon of components button at sidebar. For more info how this behaves see
- * info at @ref e_sidebar_change_button_icon.
- * @param window EShellWindow instance.
- * @param component_id ID of the component.
- * @param icon Icon buffer.
- **/
-void
-e_shell_window_change_component_button_icon (EShellWindow *window, const char *component_id, GdkPixbuf *icon)
-{
-	EShellWindowPrivate *priv;
-	GSList *p;
-
-	g_return_if_fail (window != NULL);
-	g_return_if_fail (component_id != NULL);
-
-	priv = window->priv;
-
-	if (priv->destroyed)
-		return;
-
-	for (p = priv->component_views; p != NULL; p = p->next) {
-		ComponentView *this_view = p->data;
-
-		if (strcmp (this_view->component_id, component_id) == 0
-		    || (this_view->component_alias != NULL
-			&& strcmp (this_view->component_alias, component_id) == 0)) {
-			e_sidebar_change_button_icon (E_SIDEBAR (priv->sidebar), icon, this_view->button_id);
-			break;
-		}
-	}
-}

Modified: branches/kill-bonobo/shell/e-shell-window.h
==============================================================================
--- branches/kill-bonobo/shell/e-shell-window.h	(original)
+++ branches/kill-bonobo/shell/e-shell-window.h	Wed Jul 16 19:37:02 2008
@@ -16,63 +16,61 @@
  * 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_WINDOW_H_
-#define _E_SHELL_WINDOW_H_
+#ifndef E_SHELL_WINDOW_H
+#define E_SHELL_WINDOW_H
 
-#include <bonobo/bonobo-window.h>
-#include <bonobo/bonobo-ui-component.h>
-#include "e-sidebar.h"
+#include "e-shell-common.h"
+#include "e-shell-view.h"
 
-#define E_TYPE_SHELL_WINDOW			(e_shell_window_get_type ())
-#define E_SHELL_WINDOW(obj)			(G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_SHELL_WINDOW, EShellWindow))
-#define E_SHELL_WINDOW_CLASS(klass)		(G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_SHELL_WINDOW, EShellWindowClass))
-#define E_IS_SHELL_WINDOW(obj)			(G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_SHELL_WINDOW))
-#define E_IS_SHELL_WINDOW_CLASS(klass)		(G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_SHELL_WINDOW))
+/* Standard GObject macros */
+#define E_TYPE_SHELL_WINDOW \
+	(e_shell_window_get_type ())
+#define E_SHELL_WINDOW(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), E_TYPE_SHELL_WINDOW, EShellWindow))
+#define E_SHELL_WINDOW_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), E_TYPE_SHELL_WINDOW, EShellWindowClass))
+#define E_IS_SHELL_WINDOW(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), E_TYPE_SHELL_WINDOW))
+#define E_IS_SHELL_WINDOW_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((obj), E_TYPE_SHELL_WINDOW))
+#define E_SHELL_WINDOW_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), E_TYPE_SHELL_WINDOW, EShellWindowClass))
 
+G_BEGIN_DECLS
 
-typedef struct _EShellWindow        EShellWindow;
+typedef struct _EShellWindow EShellWindow;
+typedef struct _EShellWindowClass EShellWindowClass;
 typedef struct _EShellWindowPrivate EShellWindowPrivate;
-typedef struct _EShellWindowClass   EShellWindowClass;
 
 struct _EShellWindow {
-	BonoboWindow parent;
-
+	GtkWindow parent;
 	EShellWindowPrivate *priv;
 };
 
 struct _EShellWindowClass {
-	BonoboWindowClass parent_class;
-
-	void (* component_changed) (EShellWindow *window);
+	GtkWindowClass parent_class;
 };
 
+GType		e_shell_window_get_type		(void);
+gint		e_shell_window_get_current_view	(EShellWindow *window);
+void		e_shell_window_set_current_view	(EShellWindow *window,
+						 gint current_view);
+GtkUIManager *	e_shell_window_get_ui_manager	(EShellWindow *window);
+GtkAction *	e_shell_window_get_action	(EShellWindow *window,
+						 const gchar *action_name);
+GtkActionGroup *e_shell_window_get_action_group	(EShellWindow *window,
+						 const gchar *group_name);
+GtkWidget *	e_shell_window_get_managed_widget
+						(EShellWindow *window,
+						 const gchar *widget_path);
 
-#include "e-shell.h"
-
-
-GType  e_shell_window_get_type  (void);
-
-GtkWidget *e_shell_window_new  (EShell     *shell,
-				const char *component_id);
-
-void        e_shell_window_switch_to_component        (EShellWindow *shell,
-						       const char   *component_id);
-const char *e_shell_window_peek_current_component_id  (EShellWindow *shell);
-
-EShell            *e_shell_window_peek_shell                (EShellWindow *window);
-BonoboUIComponent *e_shell_window_peek_bonobo_ui_component  (EShellWindow *window);
-ESidebar          *e_shell_window_peek_sidebar              (EShellWindow *window);
-GtkWidget         *e_shell_window_peek_statusbar            (EShellWindow *window);
-
-void e_shell_window_set_title(EShellWindow *window, const char *component_id, const char *title);
-
-void  e_shell_window_save_defaults  (EShellWindow *window);
-void  e_shell_window_show_settings  (EShellWindow *window);
-
-void e_shell_window_change_component_button_icon (EShellWindow *window, const char *component_id, GdkPixbuf *icon);
+G_END_DECLS
 
-#endif /* _E_SHELL_WINDOW_H_ */
+#endif /* E_SHELL_WINDOW_H */

Modified: branches/kill-bonobo/shell/e-shell.c
==============================================================================
--- branches/kill-bonobo/shell/e-shell.c	(original)
+++ branches/kill-bonobo/shell/e-shell.c	Wed Jul 16 19:37:02 2008
@@ -16,8 +16,6 @@
  * 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 <config.h>
@@ -82,13 +80,8 @@
 
 	GList *windows;
 
-	/* EUriSchemaRegistry *uri_schema_registry; FIXME */
 	EComponentRegistry *component_registry;
 
-	/* Names for the types of the folders that have maybe crashed.  */
-	/* FIXME TODO */
-	GList *crash_type_names; /* char * */
-
 	/* Line status and controllers  */
 	EShellLineStatus line_status;
 	int line_status_pending;
@@ -125,7 +118,6 @@
 enum {
 	NO_WINDOWS_LEFT,
 	LINE_STATUS_CHANGED,
-	NEW_WINDOW_CREATED,
 	LAST_SIGNAL
 };
 
@@ -238,7 +230,7 @@
 	if (component_id[0] == '\0')
 		component_id = NULL;
 
-	shell_window = e_shell_create_window (shell, component_id, NULL);
+	shell_window = e_shell_create_window (shell, component_id);
 	if (shell_window == NULL) {
 		CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
 				     ex_GNOME_Evolution_Shell_ComponentNotFound, NULL);
@@ -282,7 +274,7 @@
 	if (show) {
 		GtkWidget *shell_window;
 
-		shell_window = (GtkWidget *)e_shell_create_window (shell, component_info->id, NULL);
+		shell_window = (GtkWidget *)e_shell_create_window (shell, component_info->id);
 		if (shell_window == NULL) {
 			CORBA_exception_set (ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Shell_ComponentNotFound, NULL);
 			return;
@@ -317,31 +309,6 @@
 	else
 		e_shell_go_offline (shell, NULL, GNOME_Evolution_USER_OFFLINE);
 }
-/*
-static GNOME_Evolution_Component
-impl_Shell_findComponent(PortableServer_Servant servant,
-			 const CORBA_char *id,
-			 CORBA_Environment *ev)
-{
-	EShell *shell;
-	EComponentInfo *ci;
-
-	if (raise_exception_if_not_ready (servant, ev))
-		return CORBA_OBJECT_NIL;
-
-	shell = (EShell *)bonobo_object_from_servant (servant);
-	ci = e_component_registry_peek_info(shell->priv->component_registry, ECR_FIELD_ALIAS, id);
-	if (ci == NULL) {
-		CORBA_exception_set (ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Shell_ComponentNotFound, NULL);
-		return CORBA_OBJECT_NIL;
-	} else if (ci->iface == NULL) {
-		CORBA_exception_set (ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Shell_NotReady, NULL);
-		return CORBA_OBJECT_NIL;
-	} else {
-		return ci->iface;
-	}
-}
-*/
 
 /* EShellWindow handling and bookkeeping.  */
 
@@ -418,13 +385,6 @@
 
 	priv->is_initialized = FALSE;
 
-#if 0				/* FIXME */
-	if (priv->uri_schema_registry != NULL) {
-		g_object_unref (priv->uri_schema_registry);
-		priv->uri_schema_registry = NULL;
-	}
-#endif
-
 	if (priv->component_registry != NULL) {
 		g_object_unref (priv->component_registry);
 		priv->component_registry = NULL;
@@ -467,24 +427,6 @@
 	(* G_OBJECT_CLASS (parent_class)->dispose) (object);
 }
 
-static void
-impl_finalize (GObject *object)
-{
-	EShell *shell;
-	EShellPrivate *priv;
-
-	shell = E_SHELL (object);
-	priv = shell->priv;
-
-	g_list_foreach (priv->crash_type_names, (GFunc) g_free, NULL);
-	g_list_free (priv->crash_type_names);
-
-	g_free (priv);
-
-	(* G_OBJECT_CLASS (parent_class)->finalize) (object);
-}
-
-
 /* Initialization.  */
 
 static void
@@ -497,7 +439,6 @@
 
 	object_class = G_OBJECT_CLASS (klass);
 	object_class->dispose  = impl_dispose;
-	object_class->finalize = impl_finalize;
 
 	signals[NO_WINDOWS_LEFT] =
 		g_signal_new ("no_windows_left",
@@ -518,16 +459,6 @@
 			      G_TYPE_NONE, 1,
 			      G_TYPE_INT);
 
-	signals[NEW_WINDOW_CREATED] =
-		g_signal_new ("new_window_created",
-			      G_OBJECT_CLASS_TYPE (object_class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (EShellClass, new_window_created),
-			      NULL, NULL,
-			      g_cclosure_marshal_VOID__POINTER,
-			      G_TYPE_NONE, 1,
-			      G_TYPE_POINTER);
-
 	epv = & klass->epv;
 	epv->createNewWindow = impl_Shell_createNewWindow;
 	epv->handleURI       = impl_Shell_handleURI;
@@ -918,7 +849,6 @@
  * e_shell_create_window:
  * @shell: The shell for which to create a new window.
  * @component_id: Id or alias of the component to display in the new window.
- * @template_window: Window from which to copy the window settings (can be %NULL).
  *
  * Create a new window for @uri.
  *
@@ -926,13 +856,10 @@
  **/
 EShellWindow *
 e_shell_create_window (EShell *shell,
-		       const char *component_id,
-		       EShellWindow *template_window)
+		       const char *component_id)
 {
 	EShellWindow *window;
 
-	/* FIXME need to actually copy settings from template_window.  */
-
 	g_return_val_if_fail (shell != NULL, NULL);
 	g_return_val_if_fail (E_IS_SHELL (shell), NULL);
 
@@ -942,8 +869,6 @@
 	g_object_weak_ref (G_OBJECT (window), window_weak_notify, shell);
 	shell->priv->windows = g_list_prepend (shell->priv->windows, window);
 
-	g_signal_emit (shell, signals[NEW_WINDOW_CREATED], 0, window);
-
 	gtk_widget_show (GTK_WIDGET (window));
 
 	e_error_default_parent((GtkWindow *)window);
@@ -977,25 +902,6 @@
 	return e_shell_quit(shell);
 }
 
-#if 0				/* FIXME */
-/**
- * e_shell_peek_uri_schema_registry:
- * @shell: An EShell object.
- *
- * Get the schema registry associated to @shell.
- *
- * Return value: A pointer to the EUriSchemaRegistry associated to @shell.
- **/
-EUriSchemaRegistry  *
-e_shell_peek_uri_schema_registry (EShell *shell)
-{
-	g_return_val_if_fail (E_IS_SHELL (shell), NULL);
-
-	return shell->priv->uri_schema_registry;
-}
-#endif
-
-
 /**
  * e_shell_peek_component_registry:
  * @shell:

Modified: branches/kill-bonobo/shell/e-shell.h
==============================================================================
--- branches/kill-bonobo/shell/e-shell.h	(original)
+++ branches/kill-bonobo/shell/e-shell.h	Wed Jul 16 19:37:02 2008
@@ -16,37 +16,18 @@
  * 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
  */
 
-#ifndef _E_SHELL_H_
-#define _E_SHELL_H_
+#ifndef E_SHELL_H
+#define E_SHELL_H
 
-#include <bonobo-activation/bonobo-activation.h>
-#include <bonobo/bonobo-object.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-typedef struct _EShell        EShell;
-typedef struct _EShellPrivate EShellPrivate;
-typedef struct _EShellClass   EShellClass;
-
-#include "Evolution.h"
-
-#include "e-component-registry.h"
+#include "e-shell-common.h"
 #include "e-shell-window.h"
 
+G_BEGIN_DECLS
 
-#define E_TYPE_SHELL			(e_shell_get_type ())
-#define E_SHELL(obj)			(G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_SHELL, EShell))
-#define E_SHELL_CLASS(klass)		(G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_SHELL, EShellClass))
-#define E_IS_SHELL(obj)			(G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_SHELL))
-#define E_IS_SHELL_CLASS(klass)		(G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_SHELL))
-
+typedef enum _EShellLineStatus EShellLineStatus;
+typedef enum _EShellStartupLineMode EShellStartupLineMode;
 
 enum _EShellLineStatus {
 	E_SHELL_LINE_STATUS_ONLINE,
@@ -54,93 +35,21 @@
 	E_SHELL_LINE_STATUS_OFFLINE,
 	E_SHELL_LINE_STATUS_FORCED_OFFLINE
 };
-typedef enum _EShellLineStatus EShellLineStatus;
 
 enum _EShellStartupLineMode {
 	E_SHELL_STARTUP_LINE_MODE_CONFIG,
 	E_SHELL_STARTUP_LINE_MODE_ONLINE,
 	E_SHELL_STARTUP_LINE_MODE_OFFLINE
 };
-typedef enum _EShellStartupLineMode EShellStartupLineMode;
-
-struct _EShell {
-	BonoboObject parent;
-
-	EShellPrivate *priv;
-};
-
-struct _EShellClass {
-	BonoboObjectClass parent_class;
-
-	POA_GNOME_Evolution_Shell__epv epv;
-
-	void (* no_windows_left) (EShell *shell);
-	void (* line_status_changed) (EShell *shell, EShellLineStatus status);
-	void (* new_window_created) (EShell *shell, EShellWindow *window);
-};
-
-
-/* ID for registering the shell in the OAF name service.  */
-#define E_SHELL_OAFIID  "OAFIID:GNOME_Evolution_Shell:" BASE_VERSION
-
-enum _EShellConstructResult {
-	E_SHELL_CONSTRUCT_RESULT_OK,
-	E_SHELL_CONSTRUCT_RESULT_INVALIDARG,
-	E_SHELL_CONSTRUCT_RESULT_CANNOTREGISTER,
-	E_SHELL_CONSTRUCT_RESULT_NOCONFIGDB,
-	E_SHELL_CONSTRUCT_RESULT_GENERICERROR
-};
-typedef enum _EShellConstructResult EShellConstructResult;
-
-
-GType                  e_shell_get_type   (void);
-EShellConstructResult  e_shell_construct  (EShell                *shell,
-					   const char            *iid,
-					   EShellStartupLineMode  startup_line_mode);
-EShell                *e_shell_new        (EShellStartupLineMode  startup_line_mode,
-					   EShellConstructResult *construct_result_return);
-
-gboolean  e_shell_attempt_upgrade  (EShell     *shell);
-
-EShellWindow *e_shell_create_window         (EShell       *shell,
-					     const char   *component_id,
-					     EShellWindow *template_window);
-gboolean      e_shell_request_close_window  (EShell       *shell,
-					     EShellWindow *window);
-
-
-#if 0
-EUriSchemaRegistry *e_shell_peek_uri_schema_registry  (EShell *shell);
-#endif
-
-EComponentRegistry *e_shell_peek_component_registry   (EShell *shell);
-
-gboolean            e_shell_save_settings            (EShell *shell);
-void                e_shell_close_all_windows        (EShell *shell);
-
-EShellLineStatus  e_shell_get_line_status  (EShell       *shell);
-void              e_shell_go_offline       (EShell       *shell,
-					    EShellWindow *action_window, GNOME_Evolution_ShellState shell_state);
-void              e_shell_go_online        (EShell       *shell,
-					    EShellWindow *action_window, GNOME_Evolution_ShellState shell_state);
-
-void  e_shell_send_receive  (EShell *shell);
-
-void  e_shell_show_settings  (EShell       *shell,
-			      const char   *type,
-			      EShellWindow *shell_window);
-
-gboolean e_shell_can_quit (EShell *shell);
-gboolean e_shell_do_quit  (EShell *shell);
-gboolean e_shell_quit     (EShell *shell);
-
-const char *e_shell_construct_result_to_string (EShellConstructResult result);
 
-typedef gboolean (*EMainShellFunc) (EShell *shell, EShellWindow *window, gpointer user_data);
-void e_shell_foreach_shell_window (EShell *shell, EMainShellFunc func, gpointer user_data);
+EShellWindow *	e_shell_create_window		(void);
+gboolean	e_shell_request_close_window	(EShellWindow *shell_window);
+void		e_shell_send_receive		(GtkWindow *parent);
+void		e_shell_show_preferences	(GtkWindow *parent);
+void		e_shell_go_offline		(void);
+void		e_shell_go_online		(void);
+void		e_shell_quit			(void);
 
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
+G_END_DECLS
 
-#endif /* _E_SHELL_H_ */
+#endif /* E_SHELL_H */

Modified: branches/kill-bonobo/shell/e-sidebar.c
==============================================================================
--- branches/kill-bonobo/shell/e-sidebar.c	(original)
+++ branches/kill-bonobo/shell/e-sidebar.c	Wed Jul 16 19:37:02 2008
@@ -16,234 +16,66 @@
  * 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-sidebar.h"
 
-#include "e-shell-marshal.h"
+#define E_SIDEBAR_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), E_TYPE_SIDEBAR, ESidebarPrivate))
 
-#include <gconf/gconf-client.h>
-#include <libgnome/gnome-gconf.h>
+#define H_PADDING 6
+#define V_PADDING 6
 
-typedef struct {
-	GtkWidget *button_widget;
-	GtkWidget *label;
-	GtkWidget *icon;
-	GtkWidget *hbox;
-	GdkPixbuf *default_icon;
-	int id;
-} Button;
+#define DEFAULT_TOOLBAR_STYLE	GTK_TOOLBAR_BOTH_HORIZ
 
 struct _ESidebarPrivate {
-	ESidebarMode mode;
-	ESidebarMode toolbar_mode;
-
-	gboolean show;
-
-	GtkWidget *selection_widget;
-	GSList *buttons;
-
-	guint style_changed_id;
-
-	gboolean in_toggle;
+	GList *proxies;
+	gboolean actions_visible;
+	GtkToolbarStyle toolbar_style;
 };
 
-
 enum {
-	BUTTON_SELECTED,
-	BUTTON_PRESSED,
-	NUM_SIGNALS
+	PROP_0,
+	PROP_ACTIONS_VISIBLE,
+	PROP_TOOLBAR_STYLE
 };
 
-static unsigned int signals[NUM_SIGNALS] = { 0 };
-
-G_DEFINE_TYPE (ESidebar, e_sidebar, GTK_TYPE_CONTAINER)
-
-#define INTERNAL_MODE(sidebar)  (sidebar->priv->mode == E_SIDEBAR_MODE_TOOLBAR ? sidebar->priv->toolbar_mode : sidebar->priv->mode)
-#define H_PADDING 6
-#define V_PADDING 6
-
-/* Utility functions.  */
-
-static Button *
-button_new (GtkWidget *button_widget,
-	    GtkWidget *label,
-	    GtkWidget *icon,
-	    GtkWidget *hbox,
-	    int        id)
-{
-	Button *button = g_new (Button, 1);
-
-	button->button_widget = button_widget;
-	button->label = label;
-	button->icon = icon;
-	button->hbox = hbox;
-	button->id = id;
-	button->default_icon = NULL;
-
-	g_object_ref (button_widget);
-	g_object_ref (label);
-	g_object_ref (icon);
-	g_object_ref (hbox);
-
-	return button;
-}
-
-static void
-button_free (Button *button)
-{
-	g_object_unref (button->button_widget);
-	g_object_unref (button->label);
-	g_object_unref (button->icon);
-	g_object_unref (button->hbox);
-	if (button->default_icon)
-		g_object_unref (button->default_icon);
-	g_free (button);
-}
-
-static void
-update_buttons (ESidebar *sidebar, int new_selected_id)
-{
-	GSList *p;
-
-	sidebar->priv->in_toggle = TRUE;
-
-	for (p = sidebar->priv->buttons; p != NULL; p = p->next) {
-		Button *button = p->data;
-
-		if (button->id == new_selected_id)
-			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button->button_widget), TRUE);
-		else
-			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button->button_widget), FALSE);
-	}
-
-	sidebar->priv->in_toggle = FALSE;
-}
-
-
-/* Callbacks.  */
-
-static void
-button_toggled_callback (GtkToggleButton *toggle_button,
-			 ESidebar *sidebar)
-{
-	int id = 0;
-	gboolean is_active = FALSE;
-	GSList *p;
-
-	if (sidebar->priv->in_toggle)
-		return;
-
-	sidebar->priv->in_toggle = TRUE;
-
-	if (gtk_toggle_button_get_active (toggle_button))
-		is_active = TRUE;
-
-	for (p = sidebar->priv->buttons; p != NULL; p = p->next) {
-		Button *button = p->data;
-
-		if (button->button_widget != GTK_WIDGET (toggle_button)) {
-			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button->button_widget), FALSE);
-		} else {
-			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button->button_widget), TRUE);
-			id = button->id;
-		}
-	}
-
-	sidebar->priv->in_toggle = FALSE;
-
-	if (is_active)
-		g_signal_emit (sidebar, signals[BUTTON_SELECTED], 0, id);
-}
-
-static gboolean
-button_pressed_callback (GtkToggleButton *toggle_button,
-			 GdkEventButton  *event,
-			 ESidebar        *sidebar)
-{
-	gboolean return_val = FALSE;
-	GSList *p;
-
-	for (p = sidebar->priv->buttons; p != NULL; p = p->next) {
-		Button *button = p->data;
-
-		if (button->button_widget == GTK_WIDGET (toggle_button))
-			g_signal_emit (sidebar, signals [BUTTON_PRESSED],
-				       0, event, button->id, &return_val);
-	}
-
-	return return_val;
-}
-
-static gboolean
-button_query_tooltip (GtkWidget  *widget,
-		      gint        x,
-		      gint        y,
-		      gboolean    keyboard_mode,
-		      GtkTooltip *tooltip,
-		      ESidebar   *sidebar)
-{
-	/* Show the tooltip only if the label is hidden */
-	if (INTERNAL_MODE (sidebar) == E_SIDEBAR_MODE_ICON) {
-		char *tip;
-
-		tip = g_object_get_data (G_OBJECT (widget),
-					 "ESidebar:button-tooltip");
-		if (tip) {
-			gtk_tooltip_set_text (tooltip, tip);
-
-			return TRUE;
-		}
-	}
-
-	return FALSE;
-}
-
-
-/* Layout. */
+static gpointer parent_class;
 
 static int
-layout_buttons (ESidebar *sidebar)
+sidebar_layout_actions (ESidebar *sidebar)
 {
 	GtkAllocation *allocation = & GTK_WIDGET (sidebar)->allocation;
-	ESidebarMode mode;
 	gboolean icons_only;
-	int num_btns = g_slist_length (sidebar->priv->buttons), btns_per_row;
-	GSList **rows, *p;
-	Button *button;
+	int num_btns = g_list_length (sidebar->priv->proxies), btns_per_row;
+	GList **rows, *p;
 	int row_number;
-	int max_btn_width = 0, max_btn_height = 0;
+	int max_width = 0, max_height = 0;
 	int row_last;
 	int x, y;
 	int i;
 
-	y = allocation->y + allocation->height - V_PADDING - 1;
+	/*y = allocation->y + allocation->height - V_PADDING - 1;*/
+	y = allocation->y + allocation->height - 1;
 
 	if (num_btns == 0)
 		return y;
 
-	mode = INTERNAL_MODE (sidebar);
-	icons_only = (mode == E_SIDEBAR_MODE_ICON);
+	icons_only = (sidebar->priv->toolbar_style == GTK_TOOLBAR_ICONS);
 
 	/* Figure out the max width and height */
-	for (p = sidebar->priv->buttons; p != NULL; p = p->next) {
+	for (p = sidebar->priv->proxies; p != NULL; p = p->next) {
+		GtkWidget *widget = p->data;
 		GtkRequisition requisition;
 
-		button = p->data;
-		gtk_widget_size_request (GTK_WIDGET (button->button_widget), &requisition);
-
-		max_btn_height = MAX (max_btn_height, requisition.height);
-		max_btn_width = MAX (max_btn_width, requisition.width);
+		gtk_widget_size_request (widget, &requisition);
+		max_height = MAX (max_height, requisition.height);
+		max_width = MAX (max_width, requisition.width);
 	}
 
 	/* Figure out how many rows and columns we'll use. */
-	btns_per_row = allocation->width / (max_btn_width + H_PADDING);
+	btns_per_row = MAX (1, allocation->width / (max_width + H_PADDING));
 	if (!icons_only) {
 		/* If using text buttons, we want to try to have a
 		 * completely filled-in grid, but if we can't, we want
@@ -254,26 +86,25 @@
 	}
 
 	/* Assign buttons to rows */
-	rows = g_new0 (GSList *, num_btns / btns_per_row + 1);
+	rows = g_new0 (GList *, num_btns / btns_per_row + 1);
 
 	if (!icons_only && num_btns % btns_per_row != 0) {
-		button = sidebar->priv->buttons->data;
-		rows [0] = g_slist_append (rows [0], button->button_widget);
+		rows [0] = g_list_append (rows [0], sidebar->priv->proxies->data);
 
-		p = sidebar->priv->buttons->next;
+		p = sidebar->priv->proxies->next;
 		row_number = p ? 1 : 0;
 	} else {
-		p = sidebar->priv->buttons;
+		p = sidebar->priv->proxies;
 		row_number = 0;
 	}
 
 	for (; p != NULL; p = p->next) {
-		button = p->data;
+		GtkWidget *widget = p->data;
 
-		if (g_slist_length (rows [row_number]) == btns_per_row)
+		if (g_list_length (rows [row_number]) == btns_per_row)
 			row_number ++;
 
-		rows [row_number] = g_slist_append (rows [row_number], button->button_widget);
+		rows [row_number] = g_list_append (rows [row_number], widget);
 	}
 
 	row_last = row_number;
@@ -282,11 +113,11 @@
 	for (i = row_last; i >= 0; i --) {
 		int len, extra_width;
 
-		y -= max_btn_height;
+		y -= max_height;
 		x = H_PADDING + allocation->x;
-		len = g_slist_length (rows[i]);
-		if (mode == E_SIDEBAR_MODE_TEXT || mode == E_SIDEBAR_MODE_BOTH)
-			extra_width = (allocation->width - (len * max_btn_width ) - (len * H_PADDING)) / len;
+		len = g_list_length (rows[i]);
+		if (!icons_only)
+			extra_width = (allocation->width - (len * max_width ) - (len * H_PADDING)) / len;
 		else
 			extra_width = 0;
 		for (p = rows [i]; p != NULL; p = p->next) {
@@ -294,8 +125,8 @@
 
 			child_allocation.x = x;
 			child_allocation.y = y;
-			child_allocation.width = max_btn_width + extra_width;
-			child_allocation.height = max_btn_height;
+			child_allocation.width = max_width + extra_width;
+			child_allocation.height = max_height;
 
 			gtk_widget_size_allocate (GTK_WIDGET (p->data), &child_allocation);
 
@@ -306,493 +137,385 @@
 	}
 
 	for (i = 0; i <= row_last; i ++)
-		g_slist_free (rows [i]);
+		g_list_free (rows [i]);
 	g_free (rows);
 
 	return y;
 }
 
+/* GtkWidget methods.  */
+
 static void
-do_layout (ESidebar *sidebar)
+sidebar_set_property (GObject *object,
+                      guint property_id,
+                      const GValue *value,
+                      GParamSpec *pspec)
 {
-	GtkAllocation *allocation = & GTK_WIDGET (sidebar)->allocation;
-	GtkAllocation child_allocation;
-	int y;
-
-	if (sidebar->priv->show)
-		y = layout_buttons (sidebar);
-	else
-		y = allocation->y + allocation->height;
+	switch (property_id) {
+		case PROP_ACTIONS_VISIBLE:
+			e_sidebar_set_actions_visible (
+				E_SIDEBAR (object),
+				g_value_get_boolean (value));
+			return;
 
-	/* Place the selection widget.  */
-	child_allocation.x = allocation->x;
-	child_allocation.y = allocation->y;
-	child_allocation.width = allocation->width;
-	child_allocation.height = y - allocation->y;
+		case PROP_TOOLBAR_STYLE:
+			e_sidebar_set_toolbar_style (
+				E_SIDEBAR (object),
+				g_value_get_enum (value));
+			return;
+	}
 
-	gtk_widget_size_allocate (sidebar->priv->selection_widget, & child_allocation);
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 }
 
-
-/* GtkContainer methods.  */
-
 static void
-impl_forall (GtkContainer *container,
-	     gboolean include_internals,
-	     GtkCallback callback,
-	     void *callback_data)
-{
-	ESidebar *sidebar = E_SIDEBAR (container);
-	GSList *p;
-
-	if (sidebar->priv->selection_widget != NULL)
-		(* callback) (sidebar->priv->selection_widget, callback_data);
-
-	for (p = sidebar->priv->buttons; p != NULL; p = p->next) {
-		GtkWidget *widget = ((Button *) p->data)->button_widget;
-		(* callback) (widget, callback_data);
+sidebar_get_property (GObject *object,
+                      guint property_id,
+                      GValue *value,
+                      GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_ACTIONS_VISIBLE:
+			g_value_set_boolean (
+				value, e_sidebar_get_actions_visible (
+				E_SIDEBAR (object)));
+			return;
+
+		case PROP_TOOLBAR_STYLE:
+			g_value_set_enum (
+				value, e_sidebar_get_toolbar_style (
+				E_SIDEBAR (object)));
+			return;
 	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 }
 
 static void
-impl_remove (GtkContainer *container,
-	     GtkWidget *widget)
+sidebar_dispose (GObject *object)
 {
-	ESidebar *sidebar = E_SIDEBAR (container);
-	GSList *p;
+	ESidebarPrivate *priv = E_SIDEBAR (object)->priv;
 
-	if (widget == sidebar->priv->selection_widget) {
-		e_sidebar_set_selection_widget (sidebar, NULL);
-		return;
+	while (priv->proxies != NULL) {
+		GtkWidget *widget = priv->proxies->data;
+		gtk_container_remove (GTK_CONTAINER (object), widget);
 	}
 
-	for (p = sidebar->priv->buttons; p != NULL; p = p->next) {
-		GtkWidget *button_widget = ((Button *) p->data)->button_widget;
-
-		if (button_widget == widget) {
-			gtk_widget_unparent (button_widget);
-			sidebar->priv->buttons = g_slist_remove_link (sidebar->priv->buttons, p);
-			gtk_widget_queue_resize (GTK_WIDGET (sidebar));
-			break;
-		}
-	}
+	/* Chain up to parent's dispose() method. */
+	G_OBJECT_CLASS (parent_class)->dispose (object);
 }
 
-
-/* GtkWidget methods.  */
-
 static void
-impl_size_request (GtkWidget *widget,
-		   GtkRequisition *requisition)
+sidebar_size_request (GtkWidget *widget,
+                      GtkRequisition *requisition)
 {
-	ESidebar *sidebar = E_SIDEBAR (widget);
-	GSList *p;
+	ESidebarPrivate *priv;
+	GtkWidget *child;
+	GList *iter;
+
+	priv = E_SIDEBAR_GET_PRIVATE (widget);
+	child = gtk_bin_get_child (GTK_BIN (widget));
 
-	if (sidebar->priv->selection_widget == NULL) {
+	if (child == NULL) {
 		requisition->width = 2 * H_PADDING;
-		requisition->height = 2 * V_PADDING;
+		requisition->height = V_PADDING;
 	} else {
-		gtk_widget_size_request (sidebar->priv->selection_widget, requisition);
+		gtk_widget_size_request (child, requisition);
 	}
 
-	if (!sidebar->priv->show)
+	if (!priv->actions_visible)
 		return;
 
-	for (p = sidebar->priv->buttons; p != NULL; p = p->next) {
-		Button *button = p->data;
-		GtkRequisition button_requisition;
+	for (iter = priv->proxies; iter != NULL; iter = iter->next) {
+		GtkWidget *widget = iter->data;
+		GtkRequisition child_requisition;
 
-		gtk_widget_size_request (button->button_widget, &button_requisition);
+		gtk_widget_size_request (widget, &child_requisition);
 
-		requisition->width = MAX (requisition->width, button_requisition.width + 2 * H_PADDING);
-		requisition->height += button_requisition.height + V_PADDING;
-	}
-}
+		child_requisition.width += H_PADDING;
+		child_requisition.height += V_PADDING;
 
-static void
-impl_size_allocate (GtkWidget *widget,
-		    GtkAllocation *allocation)
-{
-	widget->allocation = *allocation;
-
-	do_layout (E_SIDEBAR (widget));
+		requisition->width = MAX (
+			requisition->width, child_requisition.width);
+		requisition->height += child_requisition.height;
+	}
 }
 
-
-/* GObject methods.  */
-
 static void
-impl_dispose (GObject *object)
+sidebar_size_allocate (GtkWidget *widget,
+                       GtkAllocation *allocation)
 {
-	ESidebarPrivate *priv = E_SIDEBAR (object)->priv;
-	GConfClient *gconf_client = gconf_client_get_default ();
+	ESidebarPrivate *priv;
+	GtkWidget *child;
+	gint y;
 
-	g_slist_foreach (priv->buttons, (GFunc) button_free, NULL);
-	g_slist_free (priv->buttons);
-	priv->buttons = NULL;
+	priv = E_SIDEBAR_GET_PRIVATE (widget);
 
-	if (priv->style_changed_id) {
-		gconf_client_notify_remove (gconf_client, priv->style_changed_id);
-		priv->style_changed_id = 0;
-	}
+	widget->allocation = *allocation;
 
- 	g_object_unref (gconf_client);
+	if (priv->actions_visible)
+		y = sidebar_layout_actions (E_SIDEBAR (widget));
+	else
+		y = allocation->y + allocation->height;
 
-	(* G_OBJECT_CLASS (e_sidebar_parent_class)->dispose) (object);
-}
+	child = gtk_bin_get_child (GTK_BIN (widget));
 
-static gboolean
-boolean_handled_accumulator (GSignalInvocationHint *ihint,
-			     GValue                *return_accu,
-			     const GValue          *handler_return,
-			     gpointer               dummy)
-{
-	gboolean handled;
+	if (child != NULL) {
+		GtkAllocation child_allocation;
 
-	handled = g_value_get_boolean (handler_return);
-	g_value_set_boolean (return_accu, handled);
+		child_allocation.x = allocation->x;
+		child_allocation.y = allocation->y;
+		child_allocation.width = allocation->width;
+		child_allocation.height = y - allocation->y;
 
-	return !handled;
+		gtk_widget_size_allocate (child, &child_allocation);
+	}
 }
 
 static void
-impl_finalize (GObject *object)
+sidebar_remove (GtkContainer *container,
+                GtkWidget *widget)
 {
-	ESidebarPrivate *priv = E_SIDEBAR (object)->priv;
-
-	g_free (priv);
-
-	(* G_OBJECT_CLASS (e_sidebar_parent_class)->finalize) (object);
-}
+	ESidebarPrivate *priv;
+	GList *link;
 
+	priv = E_SIDEBAR_GET_PRIVATE (container);
 
-/* Initialization.  */
+	/* Look in the internal widgets first. */
+	link = g_list_find (priv->proxies, widget);
+	if (link != NULL) {
+		GtkWidget *widget = link->data;
+
+		gtk_widget_unparent (widget);
+		priv->proxies = g_list_delete_link (priv->proxies, link);
+		gtk_widget_queue_resize (GTK_WIDGET (container));
+		return;
+	}
 
-static void
-e_sidebar_class_init (ESidebarClass *klass)
-{
-	GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
-	GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
-	GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
-	container_class->forall = impl_forall;
-	container_class->remove = impl_remove;
-
-	widget_class->size_request = impl_size_request;
-	widget_class->size_allocate = impl_size_allocate;
-
-	object_class->dispose  = impl_dispose;
-	object_class->finalize = impl_finalize;
-
-	signals[BUTTON_SELECTED]
-		= g_signal_new ("button_selected",
-				G_OBJECT_CLASS_TYPE (object_class),
-				G_SIGNAL_RUN_FIRST,
-				G_STRUCT_OFFSET (ESidebarClass, button_selected),
-				NULL, NULL,
-				g_cclosure_marshal_VOID__INT,
-				G_TYPE_NONE, 1,
-				G_TYPE_INT);
-	signals[BUTTON_PRESSED]
-		= g_signal_new ("button_pressed",
-				G_OBJECT_CLASS_TYPE (object_class),
-				G_SIGNAL_RUN_LAST,
-				G_STRUCT_OFFSET (ESidebarClass, button_pressed),
-				boolean_handled_accumulator, NULL,
-				e_shell_marshal_NONE__POINTER_INT,
-				G_TYPE_BOOLEAN, 2,
-				G_TYPE_POINTER, G_TYPE_INT);
+	/* Chain up to parent's remove() method. */
+	GTK_CONTAINER_CLASS (parent_class)->remove (container, widget);
 }
 
 static void
-e_sidebar_init (ESidebar *sidebar)
+sidebar_forall (GtkContainer *container,
+                gboolean include_internals,
+                GtkCallback callback,
+                gpointer callback_data)
 {
 	ESidebarPrivate *priv;
 
-	GTK_WIDGET_SET_FLAGS (sidebar, GTK_NO_WINDOW);
+	priv = E_SIDEBAR_GET_PRIVATE (container);
 
-	priv = g_new0 (ESidebarPrivate, 1);
-	sidebar->priv = priv;
+	if (include_internals)
+		g_list_foreach (
+			priv->proxies, (GFunc) callback, callback_data);
 
-	priv->mode = E_SIDEBAR_MODE_TEXT;
+	/* Chain up to parent's forall() method. */
+	GTK_CONTAINER_CLASS (parent_class)->forall (
+		container, include_internals, callback, callback_data);
 }
 
-GtkWidget *
-e_sidebar_new (void)
+static GtkIconSize
+sidebar_get_icon_size (GtkToolShell *shell)
 {
-	ESidebar *sidebar = g_object_new (e_sidebar_get_type (), NULL);
-
-	return GTK_WIDGET (sidebar);
+	return GTK_ICON_SIZE_LARGE_TOOLBAR;
 }
 
+static GtkOrientation
+sidebar_get_orientation (GtkToolShell *shell)
+{
+	return GTK_ORIENTATION_HORIZONTAL;
+}
 
-void
-e_sidebar_set_selection_widget (ESidebar *sidebar, GtkWidget *widget)
+static GtkToolbarStyle
+sidebar_get_style (GtkToolShell *shell)
 {
-	if (sidebar->priv->selection_widget != NULL)
-		gtk_widget_unparent (sidebar->priv->selection_widget);
+	return e_sidebar_get_toolbar_style (E_SIDEBAR (shell));
+}
 
-	sidebar->priv->selection_widget = widget;
+static GtkReliefStyle
+sidebar_get_relief_style (GtkToolShell *shell)
+{
+	g_debug ("%s", G_STRFUNC);
+	return GTK_RELIEF_NORMAL;
+}
 
-	if (widget != NULL)
-		gtk_widget_set_parent (widget, GTK_WIDGET (sidebar));
+static void
+sidebar_class_init (ESidebarClass *class)
+{
+	GObjectClass *object_class;
+	GtkWidgetClass *widget_class;
+	GtkContainerClass *container_class;
 
-	gtk_widget_queue_resize (GTK_WIDGET (sidebar));
-}
+	parent_class = g_type_class_peek_parent (class);
+	g_type_class_add_private (class, sizeof (ESidebarPrivate));
 
+	object_class = G_OBJECT_CLASS (class);
+	object_class->set_property = sidebar_set_property;
+	object_class->get_property = sidebar_get_property;
+	object_class->dispose = sidebar_dispose;
 
-void
-e_sidebar_add_button (ESidebar *sidebar,
-		      const char *label,
-		      const char *tooltips,
-		      GdkPixbuf *icon,
-		      int id)
-{
-	GtkWidget *button_widget;
-	GtkWidget *hbox;
-	GtkWidget *icon_widget;
-	GtkWidget *label_widget;
-
-	button_widget = gtk_toggle_button_new ();
-	if (sidebar->priv->show)
-		gtk_widget_show (button_widget);
-	g_signal_connect (button_widget, "toggled", G_CALLBACK (button_toggled_callback), sidebar);
- 	g_signal_connect (button_widget, "button_press_event",
- 			  G_CALLBACK (button_pressed_callback), sidebar);
-
-	hbox = gtk_hbox_new (FALSE, 3);
-	gtk_container_set_border_width (GTK_CONTAINER (hbox), 2);
-	gtk_widget_show (hbox);
-
-	icon_widget = gtk_image_new_from_pixbuf (icon);
-	gtk_widget_show (icon_widget);
-
-	label_widget = gtk_label_new (label);
-	gtk_misc_set_alignment (GTK_MISC (label_widget), 0.0, 0.5);
-	gtk_widget_show (label_widget);
-
-	g_object_set_data_full (G_OBJECT (button_widget),
-				"ESidebar:button-tooltip",
-				g_strdup (tooltips),
-				g_free);
-	gtk_widget_set_has_tooltip (button_widget, TRUE);
-	g_signal_connect (button_widget, "query-tooltip",
-			  G_CALLBACK (button_query_tooltip), sidebar);
-
-	switch (INTERNAL_MODE (sidebar)) {
-	case E_SIDEBAR_MODE_TEXT:
-		gtk_box_pack_start (GTK_BOX (hbox), label_widget, TRUE, TRUE, 0);
-		break;
-	case E_SIDEBAR_MODE_ICON:
-		gtk_box_pack_start (GTK_BOX (hbox), icon_widget, TRUE, TRUE, 0);
-		break;
-	case E_SIDEBAR_MODE_BOTH:
-	default:
-		gtk_box_pack_start (GTK_BOX (hbox), icon_widget, FALSE, TRUE, 0);
-		gtk_box_pack_start (GTK_BOX (hbox), label_widget, TRUE, TRUE, 0);
-		break;
-	}
+	widget_class = GTK_WIDGET_CLASS (class);
+	widget_class->size_request = sidebar_size_request;
+	widget_class->size_allocate = sidebar_size_allocate;
 
-	gtk_container_add (GTK_CONTAINER (button_widget), hbox);
+	container_class = GTK_CONTAINER_CLASS (class);
+	container_class->remove = sidebar_remove;
+	container_class->forall = sidebar_forall;
 
-	sidebar->priv->buttons = g_slist_append (sidebar->priv->buttons, button_new (button_widget, label_widget, icon_widget, hbox, id));
-	gtk_widget_set_parent (button_widget, GTK_WIDGET (sidebar));
+	g_object_class_install_property (
+		object_class,
+		PROP_ACTIONS_VISIBLE,
+		g_param_spec_boolean (
+			"actions-visible",
+			NULL,
+			NULL,
+			TRUE,
+			G_PARAM_CONSTRUCT |
+			G_PARAM_READWRITE));
 
-	gtk_widget_queue_resize (GTK_WIDGET (sidebar));
+	g_object_class_install_property (
+		object_class,
+		PROP_TOOLBAR_STYLE,
+		g_param_spec_enum (
+			"toolbar-style",
+			NULL,
+			NULL,
+			GTK_TYPE_TOOLBAR_STYLE,
+			DEFAULT_TOOLBAR_STYLE,
+			G_PARAM_CONSTRUCT |
+			G_PARAM_READWRITE));
 }
 
-/**
- * e_sidebar_change_button_icon
- * This will change icon in icon_widget of the button of known component.
- * You cannot change icon as in a stack, only one default icon will be stored.
- * @param sidebar ESidebar instance.
- * @param icon Pointer to buffer with icon. Can by NULL, in this case the icon will be
- *             put back to default one for the component.
- * @param button_id Component's button ID, for which change the icon.
- **/
-
-void
-e_sidebar_change_button_icon (ESidebar *sidebar, GdkPixbuf  *icon, int button_id)
+static void
+sidebar_init (ESidebar *sidebar)
 {
-	GSList *p;
-
-	g_return_if_fail (sidebar != NULL);
-
-	for (p = sidebar->priv->buttons; p != NULL; p = p->next) {
-		Button *button = p->data;
+	sidebar->priv = E_SIDEBAR_GET_PRIVATE (sidebar);
 
-		if (button->id == button_id) {
-			if (!button->icon)
-				break;
+	GTK_WIDGET_SET_FLAGS (sidebar, GTK_NO_WINDOW);
+}
 
-			if (icon) {
-				if (!button->default_icon)
-					button->default_icon = gdk_pixbuf_copy (gtk_image_get_pixbuf (GTK_IMAGE (button->icon)));
+static void
+sidebar_tool_shell_iface_init (GtkToolShellIface *iface)
+{
+	iface->get_icon_size = sidebar_get_icon_size;
+	iface->get_orientation = sidebar_get_orientation;
+	iface->get_style = sidebar_get_style;
+	iface->get_relief_style = sidebar_get_relief_style;
+}
+
+GType
+e_sidebar_get_type (void)
+{
+	static GType type = 0;
+
+	if (G_UNLIKELY (type == 0)) {
+		static const GTypeInfo type_info = {
+			sizeof (ESidebarClass),
+			(GBaseInitFunc) NULL,
+			(GBaseFinalizeFunc) NULL,
+			(GClassInitFunc) sidebar_class_init,
+			(GClassFinalizeFunc) NULL,
+			NULL,  /* class_data */
+			sizeof (ESidebar),
+			0,     /* n_preallocs */
+			(GInstanceInitFunc) sidebar_init,
+			NULL   /* value_table */
+		};
+
+		static const GInterfaceInfo tool_shell_info = {
+			(GInterfaceInitFunc) sidebar_tool_shell_iface_init,
+			(GInterfaceFinalizeFunc) NULL,
+			NULL   /* interface_data */
+		};
 
-				gtk_image_set_from_pixbuf (GTK_IMAGE (button->icon), icon);
-			} else if (button->default_icon) {
-				gtk_image_set_from_pixbuf (GTK_IMAGE (button->icon), button->default_icon);
-				g_object_unref (button->default_icon);
-				button->default_icon = NULL;
-			}
+		type = g_type_register_static (
+			GTK_TYPE_BIN, "ESidebar", &type_info, 0);
 
-			break;
-		}
+		g_type_add_interface_static (
+			type, GTK_TYPE_TOOL_SHELL, &tool_shell_info);
 	}
-}
-
-void
-e_sidebar_select_button (ESidebar *sidebar, int id)
-{
-	update_buttons (sidebar, id);
 
-	g_signal_emit (sidebar, signals[BUTTON_SELECTED], 0, id);
+	return type;
 }
 
-ESidebarMode
-e_sidebar_get_mode (ESidebar *sidebar)
+GtkWidget *
+e_sidebar_new (void)
 {
-	return sidebar->priv->mode;
+	return g_object_new (E_TYPE_SIDEBAR, NULL);
 }
 
+void
+e_sidebar_add_action (ESidebar *sidebar,
+                      GtkAction *action)
+{
+	GtkWidget *widget;
 
-static GConfEnumStringPair toolbar_styles[] = {
-         { E_SIDEBAR_MODE_TEXT, "text" },
-         { E_SIDEBAR_MODE_ICON, "icons" },
-         { E_SIDEBAR_MODE_BOTH, "both" },
-         { E_SIDEBAR_MODE_BOTH, "both-horiz" },
-         { E_SIDEBAR_MODE_BOTH, "both_horiz" },
- 	{ -1, NULL }
-};
+	g_return_if_fail (E_IS_SIDEBAR (sidebar));
+	g_return_if_fail (GTK_IS_ACTION (action));
 
-static void
-set_mode_internal (ESidebar *sidebar, ESidebarMode mode )
-{
-	GSList *p;
+	g_object_ref (action);
+	widget = gtk_action_create_tool_item (action);
+	gtk_tool_item_set_is_important (GTK_TOOL_ITEM (widget), TRUE);
+	gtk_widget_show (widget);
 
-	if (mode == INTERNAL_MODE (sidebar))
-		return;
+	sidebar->priv->proxies = g_list_append (sidebar->priv->proxies, widget);
 
-	for (p = sidebar->priv->buttons; p != NULL; p = p->next) {
-		Button *button = p->data;
+	gtk_widget_set_parent (widget, GTK_WIDGET (sidebar));
+	gtk_widget_queue_resize (GTK_WIDGET (sidebar));
 
-		switch (mode) {
-		case E_SIDEBAR_MODE_TEXT:
-			gtk_container_remove (GTK_CONTAINER (button->hbox), button->icon);
-			if (INTERNAL_MODE (sidebar) == E_SIDEBAR_MODE_ICON) {
-				gtk_box_pack_start (GTK_BOX (button->hbox), button->label, TRUE, TRUE, 0);
-				gtk_widget_show (button->label);
-			}
-			break;
-		case E_SIDEBAR_MODE_ICON:
-			gtk_container_remove(GTK_CONTAINER (button->hbox), button->label);
-			if (INTERNAL_MODE (sidebar) == E_SIDEBAR_MODE_TEXT) {
-				gtk_box_pack_start (GTK_BOX (button->hbox), button->icon, TRUE, TRUE, 0);
-				gtk_widget_show (button->icon);
-			} else
-				gtk_container_child_set (GTK_CONTAINER (button->hbox), button->icon,
-							 "expand", TRUE,
-							 NULL);
-			break;
-		case E_SIDEBAR_MODE_BOTH:
-			if (INTERNAL_MODE (sidebar) == E_SIDEBAR_MODE_TEXT) {
-				gtk_container_remove (GTK_CONTAINER (button->hbox), button->label);
-				gtk_box_pack_start (GTK_BOX (button->hbox), button->icon, FALSE, TRUE, 0);
-				gtk_widget_show (button->icon);
-			} else {
-				gtk_container_child_set (GTK_CONTAINER (button->hbox), button->icon,
-							 "expand", FALSE,
-							 NULL);
-			}
-
-			gtk_box_pack_start (GTK_BOX (button->hbox), button->label, TRUE, TRUE, 0);
-			gtk_widget_show (button->label);
-			break;
-		default:
-			break;
-		}
-	}
+	g_debug ("Relief Style: %d", gtk_tool_item_get_relief_style (GTK_TOOL_ITEM (widget)));
 }
 
-static void
-style_changed_notify (GConfClient *gconf, guint id, GConfEntry *entry, void *data)
+gboolean
+e_sidebar_get_actions_visible (ESidebar *sidebar)
 {
-	ESidebar *sidebar = data;
- 	char *val;
- 	int mode;
-
-	val = gconf_client_get_string (gconf, "/desktop/gnome/interface/toolbar_style", NULL);
-	if (val == NULL || !gconf_string_to_enum (toolbar_styles, val, &mode))
-		mode = E_SIDEBAR_MODE_BOTH;
-	g_free(val);
+	g_return_val_if_fail (E_IS_SIDEBAR (sidebar), FALSE);
 
- 	set_mode_internal (E_SIDEBAR (sidebar), mode);
-	sidebar->priv->toolbar_mode = mode;
-
-	gtk_widget_queue_resize (GTK_WIDGET (sidebar));
+	return sidebar->priv->actions_visible;
 }
 
 void
-e_sidebar_set_mode (ESidebar *sidebar, ESidebarMode mode)
+e_sidebar_set_actions_visible (ESidebar *sidebar,
+                               gboolean visible)
 {
-	GConfClient *gconf_client = gconf_client_get_default ();
+	GList *iter;
 
-	if (sidebar->priv->mode == mode)
+	if (sidebar->priv->actions_visible == visible)
 		return;
 
-	if (sidebar->priv->mode == E_SIDEBAR_MODE_TOOLBAR) {
-		if (sidebar->priv->style_changed_id) {
-			gconf_client_notify_remove (gconf_client, sidebar->priv->style_changed_id);
-			sidebar->priv->style_changed_id = 0;
-		}
-	}
+	sidebar->priv->actions_visible = visible;
 
-	if (mode != E_SIDEBAR_MODE_TOOLBAR) {
-		set_mode_internal (sidebar, mode);
+	for (iter = sidebar->priv->proxies; iter != NULL; iter = iter->next)
+		g_object_set (iter->data, "visible", visible, NULL);
 
-		gtk_widget_queue_resize (GTK_WIDGET (sidebar));
-	} else {
-		/* This is a little bit tricky, toolbar mode is more
-		 * of a meta-mode where the actual mode is dictated by
-		 * the gnome toolbar setting, so that is why we have
-		 * the is_toolbar_mode bool - it tracks the toolbar
-		 * mode while the mode member is the actual look and
-		 * feel */
-		sidebar->priv->style_changed_id = gconf_client_notify_add (gconf_client,
-									   "/desktop/gnome/interface/toolbar_style",
-									   style_changed_notify, sidebar, NULL, NULL);
-		style_changed_notify (gconf_client, 0, NULL, sidebar);
-	}
+	gtk_widget_queue_resize (GTK_WIDGET (sidebar));
 
-	g_object_unref (gconf_client);
+	g_object_notify (G_OBJECT (sidebar), "actions-visible");
+}
 
-	sidebar->priv->mode = mode;
+GtkToolbarStyle
+e_sidebar_get_toolbar_style (ESidebar *sidebar)
+{
+	g_return_val_if_fail (E_IS_SIDEBAR (sidebar), DEFAULT_TOOLBAR_STYLE);
+
+	return sidebar->priv->toolbar_style;
 }
 
 void
-e_sidebar_set_show_buttons  (ESidebar *sidebar, gboolean show)
+e_sidebar_set_toolbar_style (ESidebar *sidebar,
+                             GtkToolbarStyle style)
 {
-	GSList *p;
+	g_return_if_fail (E_IS_SIDEBAR (sidebar));
 
-	if (sidebar->priv->show == show)
+	if (sidebar->priv->toolbar_style == style)
 		return;
 
-	for (p = sidebar->priv->buttons; p != NULL; p = p->next) {
-		Button *button = p->data;
-
-		if (show)
-			gtk_widget_show (button->button_widget);
-		else
-			gtk_widget_hide (button->button_widget);
-	}
-
-	sidebar->priv->show = show;
+	sidebar->priv->toolbar_style = style;
 
-	gtk_widget_queue_resize (GTK_WIDGET (sidebar));
-}
+	g_list_foreach (
+		sidebar->priv->proxies,
+		(GFunc) gtk_tool_item_toolbar_reconfigured, NULL);
 
-gboolean
-e_sidebar_get_show_buttons  (ESidebar *sidebar)
-{
-	return sidebar->priv->show;
+	g_object_notify (G_OBJECT (sidebar), "toolbar-style");
 }

Modified: branches/kill-bonobo/shell/e-sidebar.h
==============================================================================
--- branches/kill-bonobo/shell/e-sidebar.h	(original)
+++ branches/kill-bonobo/shell/e-sidebar.h	Wed Jul 16 19:37:02 2008
@@ -16,72 +16,58 @@
  * 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_SIDEBAR_H_
-#define _E_SIDEBAR_H_
+#ifndef E_SIDEBAR_H
+#define E_SIDEBAR_H
 
 #include <gtk/gtk.h>
 
-#define E_TYPE_SIDEBAR			(e_sidebar_get_type ())
-#define E_SIDEBAR(obj)			(G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_SIDEBAR, ESidebar))
-#define E_SIDEBAR_CLASS(klass)		(G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_SIDEBAR, ESidebarClass))
-#define E_IS_SIDEBAR(obj)			(G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_SIDEBAR))
-#define E_IS_SIDEBAR_CLASS(klass)		(G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_SIDEBAR))
+/* Standard GObject macros */
+#define E_TYPE_SIDEBAR \
+	(e_sidebar_get_type ())
+#define E_SIDEBAR(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), E_TYPE_SIDEBAR, ESidebar))
+#define E_SIDEBAR_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), E_TYPE_SIDEBAR, ESidebarClass))
+#define E_IS_SIDEBAR(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), E_TYPE_SIDEBAR))
+#define E_IS_SIDEBAR_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((obj), E_TYPE_SIDEBAR))
+#define E_SIDEBAR_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), E_TYPE_SIDEBAR, ESidebarClass))
 
+G_BEGIN_DECLS
 
-typedef struct _ESidebar        ESidebar;
+typedef struct _ESidebar ESidebar;
+typedef struct _ESidebarClass ESidebarClass;
 typedef struct _ESidebarPrivate ESidebarPrivate;
-typedef struct _ESidebarClass   ESidebarClass;
-
-typedef enum {
-	E_SIDEBAR_MODE_TEXT,
-	E_SIDEBAR_MODE_ICON,
-	E_SIDEBAR_MODE_BOTH,
-	E_SIDEBAR_MODE_TOOLBAR
-} ESidebarMode;
 
 struct _ESidebar {
-	GtkContainer parent;
-
+	GtkBin parent;
 	ESidebarPrivate *priv;
 };
 
 struct _ESidebarClass {
-	GtkContainerClass parent_class;
-
-	/* signals */
-	void (* button_selected) (ESidebar *sidebar, int id);
-	void (* button_pressed)  (ESidebar *sidebar, GdkEventButton *event, int id);
+	GtkBinClass parent_class;
 };
 
+GType		e_sidebar_get_type		(void);
+GtkWidget *	e_sidebar_new			(void);
+void		e_sidebar_add_action		(ESidebar *sidebar,
+						 GtkAction *action);
+gboolean	e_sidebar_get_actions_visible	(ESidebar *sidebar);
+void		e_sidebar_set_actions_visible	(ESidebar *sidebar,
+						 gboolean visible);
+GtkToolbarStyle	e_sidebar_get_toolbar_style	(ESidebar *sidebar);
+void		e_sidebar_set_toolbar_style	(ESidebar *sidebar,
+						 GtkToolbarStyle style);
 
-GType      e_sidebar_get_type  (void);
-GtkWidget *e_sidebar_new       (void);
-
-void  e_sidebar_set_selection_widget  (ESidebar   *sidebar,
-				       GtkWidget  *widget);
-
-void  e_sidebar_add_button  (ESidebar   *sidebar,
-			     const char *label,
-			     const char *tooltips,
-			     GdkPixbuf  *icon,
-			     int         id);
-
-void  e_sidebar_select_button  (ESidebar *sidebar,
-				int       id);
-
-void e_sidebar_change_button_icon (ESidebar *sidebar,
-				   GdkPixbuf  *icon,
-				   int button_id);
-
-ESidebarMode e_sidebar_get_mode (ESidebar *sidebar);
-void e_sidebar_set_mode (ESidebar *sidebar, ESidebarMode mode);
-
-void  e_sidebar_set_show_buttons  (ESidebar *sidebar, gboolean show);
-gboolean  e_sidebar_get_show_buttons  (ESidebar *sidebar);
-
+G_END_DECLS
 
-#endif /* _E_SIDEBAR_H_ */
+#endif /* E_SIDEBAR_H */

Modified: branches/kill-bonobo/shell/main.c
==============================================================================
--- branches/kill-bonobo/shell/main.c	(original)
+++ branches/kill-bonobo/shell/main.c	Wed Jul 16 19:37:02 2008
@@ -458,7 +458,7 @@
 			}
 			g_object_unref (client);
 
-			e_shell_create_window (shell, default_component_id, NULL);
+			e_shell_create_window (shell, default_component_id);
 		}
 	} else {
 		CORBA_Environment ev;

Modified: branches/kill-bonobo/widgets/misc/Makefile.am
==============================================================================
--- branches/kill-bonobo/widgets/misc/Makefile.am	(original)
+++ branches/kill-bonobo/widgets/misc/Makefile.am	Wed Jul 16 19:37:02 2008
@@ -57,6 +57,7 @@
 	e-info-label.h				\
 	e-map.h					\
 	e-multi-config-dialog.h			\
+	e-online-button.h			\
 	e-search-bar.h				\
 	e-task-bar.h				\
 	e-task-widget.h				\
@@ -104,6 +105,7 @@
 	e-info-label.c				\
 	e-map.c					\
 	e-multi-config-dialog.c			\
+	e-online-button.c			\
 	e-search-bar.c				\
 	e-task-bar.c				\
 	e-task-widget.c				\

Added: branches/kill-bonobo/widgets/misc/e-online-button.c
==============================================================================
--- (empty file)
+++ branches/kill-bonobo/widgets/misc/e-online-button.c	Wed Jul 16 19:37:02 2008
@@ -0,0 +1,194 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/* e-offline-button.c
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "e-online-button.h"
+
+#include <glib/gi18n.h>
+
+#define ONLINE_IMAGE	"online.png"
+#define OFFLINE_IMAGE	"offline.png"
+
+#define E_ONLINE_BUTTON_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), E_TYPE_ONLINE_BUTTON, EOnlineButtonPrivate))
+
+struct _EOnlineButtonPrivate {
+	GtkWidget *image;
+	gboolean online;
+};
+
+enum {
+	PROP_0,
+	PROP_ONLINE
+};
+
+static gpointer parent_class;
+
+static void
+online_button_set_property (GObject *object,
+                             guint property_id,
+                             const GValue *value,
+                             GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_ONLINE:
+			e_online_button_set_online (
+				E_ONLINE_BUTTON (object),
+				g_value_get_boolean (value));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+online_button_get_property (GObject *object,
+                             guint property_id,
+                             GValue *value,
+                             GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_ONLINE:
+			g_value_set_boolean (
+				value, e_online_button_get_online (
+				E_ONLINE_BUTTON (object)));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+online_button_dispose (GObject *object)
+{
+	EOnlineButtonPrivate *priv;
+
+	priv = E_ONLINE_BUTTON_GET_PRIVATE (object);
+
+	if (priv->image != NULL) {
+		g_object_unref (priv->image);
+		priv->image = NULL;
+	}
+
+	/* Chain up to parent's dispose() method. */
+	G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+online_button_class_init (EOnlineButtonClass *class)
+{
+	GObjectClass *object_class;
+
+	parent_class = g_type_class_peek_parent (class);
+	g_type_class_add_private (class, sizeof (EOnlineButtonPrivate));
+
+	object_class = G_OBJECT_CLASS (class);
+	object_class->set_property = online_button_set_property;
+	object_class->get_property = online_button_get_property;
+	object_class->dispose = online_button_dispose;
+
+	g_object_class_install_property (
+		object_class,
+		PROP_ONLINE,
+		g_param_spec_boolean (
+			"online",
+			_("Online"),
+			_("The button state is online"),
+			TRUE,
+			G_PARAM_READWRITE |
+			G_PARAM_CONSTRUCT));
+}
+
+static void
+online_button_init (EOnlineButton *button)
+{
+	GtkWidget *widget;
+
+	button->priv = E_ONLINE_BUTTON_GET_PRIVATE (button);
+
+	GTK_WIDGET_UNSET_FLAGS (button, GTK_CAN_FOCUS);
+	gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
+
+	widget = gtk_image_new ();
+	gtk_container_add (GTK_CONTAINER (button), widget);
+	button->priv->image = g_object_ref (widget);
+	gtk_widget_show (widget);
+}
+
+GType
+e_online_button_get_type (void)
+{
+	static GType type = 0;
+
+	if (G_UNLIKELY (type == 0)) {
+		const GTypeInfo type_info = {
+			sizeof (EOnlineButtonClass),
+			(GBaseInitFunc) NULL,
+			(GBaseFinalizeFunc) NULL,
+			(GClassInitFunc) online_button_class_init,
+			(GClassFinalizeFunc) NULL,
+			NULL,  /* class_data */
+			sizeof (EOnlineButton),
+			0,     /* n_preallocs */
+			(GInstanceInitFunc) online_button_init,
+			NULL   /* value_table */
+		};
+
+		type = g_type_register_static (
+			GTK_TYPE_BUTTON, "EOnlineButton", &type_info, 0);
+	}
+
+	return type;
+}
+
+GtkWidget *
+e_online_button_new (void)
+{
+	return g_object_new (E_TYPE_ONLINE_BUTTON, NULL);
+}
+
+gboolean
+e_online_button_get_online (EOnlineButton *button)
+{
+	g_return_val_if_fail (E_IS_ONLINE_BUTTON (button), FALSE);
+
+	return button->priv->online;
+}
+
+void
+e_online_button_set_online (EOnlineButton *button,
+                            gboolean online)
+{
+	GtkImage *image;
+	gchar *filename;
+	const gchar *image_name;
+
+	g_return_if_fail (E_IS_ONLINE_BUTTON (button));
+
+	button->priv->online = online;
+	image_name = online ? ONLINE_IMAGE : OFFLINE_IMAGE;
+
+	image = GTK_IMAGE (button->priv->image);
+	filename = g_build_filename (EVOLUTION_IMAGES, image_name, NULL);
+	gtk_image_set_from_file (image, filename);
+	g_free (filename);
+
+	g_object_notify (G_OBJECT (button), "online");
+}

Added: branches/kill-bonobo/widgets/misc/e-online-button.h
==============================================================================
--- (empty file)
+++ branches/kill-bonobo/widgets/misc/e-online-button.h	Wed Jul 16 19:37:02 2008
@@ -0,0 +1,68 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/* e-online-button.h
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef E_ONLINE_BUTTON_H
+#define E_ONLINE_BUTTON_H
+
+#include <gtk/gtk.h>
+
+/* Standard GObject macros */
+#define E_TYPE_ONLINE_BUTTON \
+	(e_online_button_get_type ())
+#define E_ONLINE_BUTTON(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), E_TYPE_ONLINE_BUTTON, EOnlineButton))
+#define E_ONLINE_BUTTON_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), E_TYPE_ONLINE_BUTTON, EOnlineButtonClass))
+#define E_IS_ONLINE_BUTTON(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), E_TYPE_ONLINE_BUTTON))
+#define E_IS_ONLINE_BUTTON_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((cls), E_TYPE_ONLINE_BUTTON))
+#define E_ONLINE_BUTTON_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), E_TYPE_ONLINE_BUTTON, EOnlineButtonClass))
+
+G_BEGIN_DECLS
+
+typedef struct _EOnlineButton EOnlineButton;
+typedef struct _EOnlineButtonClass EOnlineButtonClass;
+typedef struct _EOnlineButtonPrivate EOnlineButtonPrivate;
+
+struct _EOnlineButton {
+	GtkButton parent;
+	EOnlineButtonPrivate *priv;
+};
+
+struct _EOnlineButtonClass {
+	GtkButtonClass parent_class;
+};
+
+GType		e_online_button_get_type	(void);
+GtkWidget *	e_online_button_new		(void);
+gboolean	e_online_button_get_online	(EOnlineButton *button);
+void		e_online_button_set_online	(EOnlineButton *button,
+						 gboolean online);
+
+G_END_DECLS
+
+#endif /* E_ONLINE_BUTTON_H */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]