aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile.am30
-rw-r--r--shell/Makefile.am24
-rw-r--r--shell/apps_evolution_shell.schemas.in24
-rw-r--r--shell/e-component-view.c151
-rw-r--r--shell/e-component-view.h79
-rw-r--r--shell/e-shell-common.h (renamed from shell/e-shell-window-commands.h)16
-rw-r--r--shell/e-shell-module.c270
-rw-r--r--shell/e-shell-module.h84
-rw-r--r--shell/e-shell-registry.c170
-rw-r--r--shell/e-shell-registry.h (renamed from shell/evolution-component.c)39
-rw-r--r--shell/e-shell-view.c262
-rw-r--r--shell/e-shell-view.h85
-rw-r--r--shell/e-shell-window-actions.c1205
-rw-r--r--shell/e-shell-window-actions.h82
-rw-r--r--shell/e-shell-window-commands.c1193
-rw-r--r--shell/e-shell-window-private.c282
-rw-r--r--shell/e-shell-window-private.h93
-rw-r--r--shell/e-shell-window.c1169
-rw-r--r--shell/e-shell-window.h96
-rw-r--r--shell/e-shell.c100
-rw-r--r--shell/e-shell.h121
-rw-r--r--shell/e-sidebar.c887
-rw-r--r--shell/e-sidebar.h92
-rw-r--r--shell/evolution-component.h45
-rw-r--r--shell/main.c2
-rw-r--r--widgets/misc/Makefile.am2
-rw-r--r--widgets/misc/e-online-button.c194
-rw-r--r--widgets/misc/e-online-button.h68
28 files changed, 3369 insertions, 3496 deletions
diff --git a/Makefile.am b/Makefile.am
index f9d40c9539..65b219f6f7 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -31,6 +31,29 @@ if ENABLE_SMIME
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 @@ SUBDIRS = \
a11y \
widgets \
shell \
- filter \
- $(SMIME_DIR) \
- addressbook \
- calendar \
art \
- composer \
- mail \
- plugins \
ui \
views \
tools \
diff --git a/shell/Makefile.am b/shell/Makefile.am
index 9654dbf814..18f092ac7d 100644
--- a/shell/Makefile.am
+++ b/shell/Makefile.am
@@ -13,6 +13,7 @@ INCLUDES = \
-DEVOLUTION_DATADIR=\""$(datadir)"\" \
-DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
-DEVOLUTION_HELPDIR=\""$(evolutionhelpdir)"\" \
+ -DEVOLUTION_MODULEDIR=\""$(evolutionmoduledir)"\" \
-DEVOLUTION_UIDIR=\""$(evolutionuidir)"\" \
-DEVOLUTION_TOOLSDIR=\""$(privlibexecdir)"\" \
-DPREFIX=\""$(prefix)"\" \
@@ -89,10 +90,13 @@ eshellincludedir = $(privincludedir)/shell
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 @@ eshellinclude_HEADERS = \
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 @@ evolution_SOURCES = \
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 \
diff --git a/shell/apps_evolution_shell.schemas.in b/shell/apps_evolution_shell.schemas.in
index 1ff66d7a64..8587ecc220 100644
--- a/shell/apps_evolution_shell.schemas.in
+++ b/shell/apps_evolution_shell.schemas.in
@@ -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>
diff --git a/shell/e-component-view.c b/shell/e-component-view.c
deleted file mode 100644
index 0aeb6d2189..0000000000
--- a/shell/e-component-view.c
+++ /dev/null
@@ -1,151 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*-
- * e-component-view.c
- *
- * 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.
- *
- * 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.
- *
- * Helper class for evolution components to setup a view
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <glib.h>
-
-#include "e-component-view.h"
-
-#include "bonobo/bonobo-control.h"
-
-static BonoboObjectClass *parent_class = NULL;
-
-static void
-impl_ComponentView_getControls(PortableServer_Servant servant,
- Bonobo_Control *side_control,
- Bonobo_Control *view_control,
- Bonobo_Control *statusbar_control,
- CORBA_Environment *ev)
-{
- EComponentView *ecv = (EComponentView *)bonobo_object_from_servant(servant);
-
- *side_control = CORBA_Object_duplicate (BONOBO_OBJREF (ecv->side_control), ev);
- *view_control = CORBA_Object_duplicate (BONOBO_OBJREF (ecv->view_control), ev);
- *statusbar_control = CORBA_Object_duplicate (BONOBO_OBJREF (ecv->statusbar_control), ev);
-}
-
-/* GObject methods. */
-
-static void
-impl_dispose (GObject *object)
-{
- EComponentView *ecv = (EComponentView *)object;
-
- ecv->side_control = NULL;
- ecv->view_control = NULL;
- ecv->statusbar_control = NULL;
-
- ((GObjectClass *)parent_class)->dispose(object);
-}
-
-static void
-impl_finalise (GObject *object)
-{
- EComponentView *ecv = (EComponentView *)object;
-
- g_free(ecv->id);
-
- ((GObjectClass *)parent_class)->finalize(object);
-}
-
-static void
-e_component_view_class_init (EComponentViewClass *klass)
-{
- GObjectClass *object_class;
- POA_GNOME_Evolution_ComponentView__epv *epv;
-
- parent_class = g_type_class_ref(bonobo_object_get_type());
-
- object_class = G_OBJECT_CLASS (klass);
- object_class->dispose = impl_dispose;
- object_class->finalize = impl_finalise;
-
- epv = & klass->epv;
- epv->getControls = impl_ComponentView_getControls;
-}
-
-static void
-e_component_view_init (EComponentView *shell)
-{
-}
-
-EComponentView *e_component_view_new(GNOME_Evolution_ShellView parent, const char *id, struct _GtkWidget *side, struct _GtkWidget *view, struct _GtkWidget *statusbar)
-{
- EComponentView *new = g_object_new (e_component_view_get_type (), NULL);
- CORBA_Environment ev = { NULL };
-
- new->id = g_strdup(id);
- new->shell_view = CORBA_Object_duplicate(parent, &ev);
- CORBA_exception_free(&ev);
-
- /* FIXME: hook onto destroys */
- new->side_control = bonobo_control_new(side);
- new->view_control = bonobo_control_new(view);
- new->statusbar_control = bonobo_control_new(statusbar);
-
- return new;
-}
-
-EComponentView *e_component_view_new_controls(GNOME_Evolution_ShellView parent, const char *id, BonoboControl *side, BonoboControl *view, BonoboControl *statusbar)
-{
- EComponentView *new = g_object_new (e_component_view_get_type (), NULL);
- CORBA_Environment ev = { NULL };
-
- new->id = g_strdup(id);
- new->shell_view = CORBA_Object_duplicate(parent, &ev);
- CORBA_exception_free(&ev);
-
- /* FIXME: hook onto destroys */
- new->side_control = side;
- new->view_control = view;
- new->statusbar_control = statusbar;
-
- return new;
-}
-
-void
-e_component_view_set_title(EComponentView *ecv, const char *title)
-{
- CORBA_Environment ev = { NULL };
-
- /* save roundtrips, check title is the same */
- GNOME_Evolution_ShellView_setTitle(ecv->shell_view, ecv->id, title, &ev);
- CORBA_exception_free(&ev);
-}
-
-void
-e_component_view_set_button_icon (EComponentView *ecv, const char *iconName)
-{
- CORBA_Environment ev = { NULL };
-
- /* save roundtrips, check title is the same */
- GNOME_Evolution_ShellView_setButtonIcon(ecv->shell_view, ecv->id, iconName, &ev);
- CORBA_exception_free(&ev);
-}
-
-BONOBO_TYPE_FUNC_FULL (EComponentView, GNOME_Evolution_ComponentView, bonobo_object_get_type(), e_component_view)
-
diff --git a/shell/e-component-view.h b/shell/e-component-view.h
deleted file mode 100644
index d932292ac2..0000000000
--- a/shell/e-component-view.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*-
- * e-component-view.h
- *
- * 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.
- *
- * 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_COMPONENT_VIEW_H_
-#define _E_COMPONENT_VIEW_H_
-
-#include <bonobo/bonobo-object.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-struct _GtkWidget;
-
-typedef struct _EComponentView EComponentView;
-typedef struct _EComponentViewPrivate EComponentViewPrivate;
-typedef struct _EComponentViewClass EComponentViewClass;
-
-#include "Evolution.h"
-
-#define E_TYPE_COMPONENT_VIEW (e_component_view_get_type ())
-#define E_COMPONENT_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_COMPONENT_VIEW, EComponentView))
-#define E_COMPONENT_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_COMPONENT_VIEW, EComponentViewClass))
-#define E_IS_COMPONENT_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_COMPONENT_VIEW))
-#define E_IS_COMPONENT_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_COMPONENT_VIEW))
-
-struct _EComponentView {
- BonoboObject parent;
-
- EComponentViewPrivate *priv;
-
- char *id;
- GNOME_Evolution_ShellView shell_view;
-
- struct _BonoboControl *side_control;
- struct _BonoboControl *view_control;
- struct _BonoboControl *statusbar_control;
-};
-
-struct _EComponentViewClass {
- BonoboObjectClass parent_class;
-
- POA_GNOME_Evolution_ComponentView__epv epv;
-};
-
-GType e_component_view_get_type(void);
-EComponentView *e_component_view_new(GNOME_Evolution_ShellView shell_view, const char *id, struct _GtkWidget *side, struct _GtkWidget *view, struct _GtkWidget *status);
-EComponentView *e_component_view_new_controls(GNOME_Evolution_ShellView parent, const char *id, struct _BonoboControl *side, struct _BonoboControl *view, struct _BonoboControl *statusbar);
-
-void e_component_view_set_title(EComponentView *ecv, const char *title);
-void e_component_view_set_button_icon (EComponentView *ecv, const char *iconName);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _E_COMPONENT_VIEW_H_ */
-
diff --git a/shell/e-shell-window-commands.h b/shell/e-shell-common.h
index d71352af47..7859a6cf70 100644
--- a/shell/e-shell-window-commands.h
+++ b/shell/e-shell-common.h
@@ -1,5 +1,5 @@
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-shell-window-commands.h
+/* e-shell-common.h
*
* Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
*
@@ -16,15 +16,15 @@
* 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_COMMANDS_H_
-#define _E_SHELL_WINDOW_COMMANDS_H_
+#ifndef E_SHELL_COMMON_H
+#define E_SHELL_COMMON_H
-#include "e-shell-window.h"
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
-void e_shell_window_commands_setup (EShellWindow *window);
+#include <gtk/gtk.h>
-#endif /* _E_SHELL_WINDOW_COMMANDS_H_ */
+#endif /* E_SHELL_COMMON_H */
diff --git a/shell/e-shell-module.c b/shell/e-shell-module.c
new file mode 100644
index 0000000000..984de1bdfb
--- /dev/null
+++ b/shell/e-shell-module.c
@@ -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;
+}
diff --git a/shell/e-shell-module.h b/shell/e-shell-module.h
new file mode 100644
index 0000000000..175b6dacde
--- /dev/null
+++ b/shell/e-shell-module.h
@@ -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 */
diff --git a/shell/e-shell-registry.c b/shell/e-shell-registry.c
new file mode 100644
index 0000000000..9c988aa43e
--- /dev/null
+++ b/shell/e-shell-registry.c
@@ -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);
+}
diff --git a/shell/evolution-component.c b/shell/e-shell-registry.h
index 4477d176d6..a1ad6449f9 100644
--- a/shell/evolution-component.c
+++ b/shell/e-shell-registry.h
@@ -1,8 +1,7 @@
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/*
- * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+/* e-shell-registry.h
*
- * Authors: Michael Zucchi <notzed@novell.com>
+ * 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
@@ -19,29 +18,21 @@
* Boston, MA 02110-1301, USA.
*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "evolution-component.h"
-
-#define PARENT_TYPE bonobo_object_get_type ()
-
-static BonoboObjectClass *parent_class = NULL;
+#ifndef E_SHELL_REGISTRY
+#define E_SHELL_REGISTRY
-/* Evolution.Component */
+#include "e-shell-common.h"
+#include "e-shell-module.h"
-/* Initialization */
+G_BEGIN_DECLS
-static void
-evolution_component_class_init (EvolutionComponentClass *klass)
-{
- parent_class = g_type_class_peek_parent (klass);
-}
+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);
-static void
-evolution_component_init(EvolutionComponent *emf, EvolutionComponentClass *klass)
-{
-}
+G_END_DECLS
-BONOBO_TYPE_FUNC_FULL (EvolutionComponent, GNOME_Evolution_Component, PARENT_TYPE, evolution_component)
+#endif /* E_SHELL_REGISTRY */
diff --git a/shell/e-shell-view.c b/shell/e-shell-view.c
index ebcc9c03fe..ef921a2ebf 100644
--- a/shell/e-shell-view.c
+++ b/shell/e-shell-view.c
@@ -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);
-
- e_shell_window_switch_to_component(esw->window, id);
+ 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;
+ }
+
+ 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;
- ((GObjectClass *)parent_class)->dispose(object);
+ parent_class = g_type_class_peek_parent (class);
+ g_type_class_add_private (class, sizeof (EShellViewPrivate));
+
+ 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);
+ }
+
+ return type;
+}
- parent_class = g_type_class_ref(bonobo_object_get_type());
+const gchar *
+e_shell_view_get_title (EShellView *shell_view)
+{
+ g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
+
+ return shell_view->priv->title;
+}
+
+void
+e_shell_view_set_title (EShellView *shell_view,
+ const gchar *title)
+{
+ g_return_if_fail (E_IS_SHELL_VIEW (shell_view));
- object_class = G_OBJECT_CLASS (klass);
- object_class->dispose = impl_dispose;
- object_class->finalize = impl_finalise;
+ g_free (shell_view->priv->title);
+ shell_view->priv->title = g_strdup (title);
- epv = & klass->epv;
- epv->setTitle = impl_ShellView_setTitle;
- epv->setComponent = impl_ShellView_setComponent;
- epv->setButtonIcon = impl_ShellView_setButtonIcon;
+ g_object_notify (G_OBJECT (shell_view), "title");
}
-static void
-e_shell_view_init (EShellView *shell)
+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;
+
+ g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
- /* TODO: listen to destroy? */
- new->window = window;
+ class = E_SHELL_VIEW_CLASS (shell_view);
+ g_return_val_if_fail (class->get_sidebar_widget != NULL, NULL);
- return new;
+ 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);
+}
diff --git a/shell/e-shell-view.h b/shell/e-shell-view.h
index 598dcf5f69..01c3e1da75 100644
--- a/shell/e-shell-view.h
+++ b/shell/e-shell-view.h
@@ -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_
-
-#include <bonobo-activation/bonobo-activation.h>
-#include <bonobo/bonobo-object.h>
-
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
-
-struct _EShell;
-
-typedef struct _EShellView EShellView;
+#ifndef E_SHELL_VIEW_H
+#define E_SHELL_VIEW_H
+
+#include "e-shell-common.h"
+
+/* 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))
+
+G_BEGIN_DECLS
+
+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;
-GType e_shell_view_get_type (void);
-EShellView *e_shell_view_new(struct _EShellWindow *window);
+ GtkWidget * (*get_content_widget) (EShellView *shell_view);
+ GtkWidget * (*get_sidebar_widget) (EShellView *shell_view);
+ GtkWidget * (*get_status_widget) (EShellView *shell_view);
+};
-#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 */
diff --git a/shell/e-shell-window-actions.c b/shell/e-shell-window-actions.c
new file mode 100644
index 0000000000..580f147920
--- /dev/null
+++ b/shell/e-shell-window-actions.c
@@ -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);
+}
diff --git a/shell/e-shell-window-actions.h b/shell/e-shell-window-actions.h
new file mode 100644
index 0000000000..a36d91ebb6
--- /dev/null
+++ b/shell/e-shell-window-actions.h
@@ -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 */
diff --git a/shell/e-shell-window-commands.c b/shell/e-shell-window-commands.c
deleted file mode 100644
index a780a1e4f9..0000000000
--- a/shell/e-shell-window-commands.c
+++ /dev/null
@@ -1,1193 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* e-shell-window-commands.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.
- *
- * Author: Ettore Perazzoli <ettore@ximian.com>
- */
-
-#include <config.h>
-
-#include <string.h>
-
-#include <gtk/gtk.h>
-#include <glib/gprintf.h>
-
-#include <libgnome/gnome-exec.h>
-#include <glib/gi18n.h>
-#include <libgnome/gnome-url.h>
-
-#include <gio/gio.h>
-
-#include <bonobo/bonobo-ui-component.h>
-
-#include <libedataserverui/e-passwords.h>
-
-#include <gconf/gconf-client.h>
-
-#include "e-util/e-icon-factory.h"
-#include "e-util/e-dialog-utils.h"
-#include "e-util/e-error.h"
-#include "e-util/e-print.h"
-#include "e-util/e-util-private.h"
-
-#include "e-shell-window-commands.h"
-#include "e-shell-window.h"
-#include "evolution-shell-component-utils.h"
-
-#include "e-shell-importer.h"
-
-#define EVOLUTION_COPYRIGHT \
- "Copyright \xC2\xA9 1999 - 2008 Novell, Inc. and Others"
-
-#define EVOLUTION_WEBSITE \
- "http://www.gnome.org/projects/evolution/"
-
-/* Utility functions. */
-
-static void
-launch_pilot_settings (const char *extra_arg)
-{
- char *args[] = {
- "gpilotd-control-applet",
- (char *) extra_arg,
- NULL
- };
- int pid;
-
- args[0] = g_find_program_in_path ("gpilotd-control-applet");
- if (!args[0]) {
- e_notice (NULL, GTK_MESSAGE_ERROR,
- _("The GNOME Pilot tools do not appear to be installed on this system."));
- return;
- }
-
- pid = gnome_execute_async (NULL, extra_arg ? 2 : 1, args);
- g_free (args[0]);
-
- if (pid == -1)
- e_notice (NULL, GTK_MESSAGE_ERROR, _("Error executing %s."), args[0]);
-}
-
-
-/* Command callbacks. */
-
-static void
-command_import (BonoboUIComponent *uih,
- EShellWindow *window,
- const char *path)
-{
- e_shell_importer_start_import (window);
-}
-
-static void
-command_page_setup (BonoboUIComponent *uih,
- EShellWindow *window,
- const char *path)
-{
- e_print_run_page_setup_dialog (GTK_WINDOW (window));
-}
-
-static void
-command_close (BonoboUIComponent *uih,
- EShellWindow *window,
- const char *path)
-{
- if (e_shell_request_close_window (e_shell_window_peek_shell (window), window))
- gtk_widget_destroy (GTK_WIDGET (window));
-}
-
-static void
-command_quit (BonoboUIComponent *uih,
- EShellWindow *window,
- const char *path)
-{
- EShell *shell = e_shell_window_peek_shell (window);
-
- e_shell_quit(shell);
-}
-
-static void
-command_submit_bug (BonoboUIComponent *uih,
- EShellWindow *window,
- const char *path)
-{
- gchar *command_line;
- GError *error = NULL;
-
- command_line = "bug-buddy --sm-disable --package=Evolution";
-
- g_debug ("Spawning: %s", command_line);
-
- if (!g_spawn_command_line_async (command_line, &error)) {
- if (error->code == G_SPAWN_ERROR_NOENT)
- e_notice (NULL, GTK_MESSAGE_ERROR,
- _("Bug buddy is not installed."));
- else
- e_notice (NULL, GTK_MESSAGE_ERROR,
- _("Bug buddy could not be run."));
- g_error_free (error);
- }
-}
-
-/* must be in utf8, the weird breaking of escaped strings
- is so the hex escape strings dont swallow too many chars
-
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- So that means, 8 bit characters, use \xXX hex encoding ONLY
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
- No all environments are utf8 and not all editors can handle it.
-*/
-static const char *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 char *documentors[] = {
- "Aaron Weber",
- "Binika Preet",
- "Dan Winship",
- "David Trowbridge",
- "Jessica Prabhakar",
- "JP Rosevear",
- "Radhika Nair",
- NULL
-};
-
-static void
-command_about (BonoboUIComponent *uih,
- EShellWindow *window,
- const char *path)
-{
- 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", documentors,
- "translator-credits", translator_credits,
- "logo-icon-name", "evolution",
- NULL);
-}
-
-static void
-command_open_faq (BonoboUIComponent *uih,
- EShellWindow *window,
- const char *path)
-{
- GError *error = NULL;
-
- gnome_url_show ("http://www.go-evolution.org/FAQ", &error);
- if (error != NULL) {
- e_notice (NULL, GTK_MESSAGE_ERROR,
- _("Error opening the FAQ webpage."));
- g_error_free (error);
- }
- }
-
-static void
-command_quick_reference (BonoboUIComponent *uih,
- EShellWindow *window,
- const char *path)
-{
- char *quickref;
- const gchar * const *language_names;
-
- language_names = g_get_language_names ();
- while (*language_names != NULL) {
- const gchar *lang = *language_names++;
-
- /* This has to be a valid language AND a language with
- * no encoding postfix. The language will come up without
- * encoding next */
- if (lang == NULL || strchr (lang, '.') != NULL)
- continue;
-
- quickref = g_build_filename (EVOLUTION_HELPDIR, "quickref", lang, "quickref.pdf", NULL);
- if (g_file_test (quickref, G_FILE_TEST_EXISTS)) {
- GFile *file = g_file_new_for_path (quickref);
-
- if (file) {
- GError *error = NULL;
- char *uri = g_file_get_uri (file);
-
- g_app_info_launch_default_for_uri (uri, NULL, &error);
-
- if (error) {
- g_warning ("%s", error->message);
- g_error_free (error);
- }
-
- g_object_unref (file);
- g_free (uri);
- }
-
- g_free (quickref);
- return;
- }
-
- g_free (quickref);
- }
-}
-
-
-static void
-command_work_offline (BonoboUIComponent *uih,
- EShellWindow *window,
- const char *path)
-{
- e_shell_go_offline (e_shell_window_peek_shell (window), window, GNOME_Evolution_USER_OFFLINE);
-}
-
-static void
-command_work_online (BonoboUIComponent *uih,
- EShellWindow *window,
- const char *path)
-{
- e_shell_go_online (e_shell_window_peek_shell (window), window, GNOME_Evolution_USER_ONLINE);
-}
-
-static void
-command_open_new_window (BonoboUIComponent *uih,
- EShellWindow *window,
- const char *path)
-{
- e_shell_create_window (e_shell_window_peek_shell (window),
- e_shell_window_peek_current_component_id (window),
- window);
-}
-
-
-/* Actions menu. */
-
-static void
-command_send_receive (BonoboUIComponent *uih,
- EShellWindow *window,
- const char *path)
-{
- e_shell_send_receive (e_shell_window_peek_shell (window));
-}
-
-static void
-command_forget_passwords (BonoboUIComponent *ui_component,
- void *data,
- const char *path)
-{
- if (e_error_run (NULL, "shell:forget-passwords", NULL) == GTK_RESPONSE_OK)
- e_passwords_forget_passwords();
-}
-
-/* Tools menu. */
-
-static void
-command_settings (BonoboUIComponent *uih,
- EShellWindow *window,
- const char *path)
-{
- e_shell_window_show_settings (window);
-}
-
-static void
-command_pilot_settings (BonoboUIComponent *uih,
- EShellWindow *window,
- const char *path)
-{
- launch_pilot_settings (NULL);
-}
-
-
-static BonoboUIVerb file_verbs [] = {
- BONOBO_UI_VERB ("FileImporter", (BonoboUIVerbFn) command_import),
- BONOBO_UI_VERB ("FilePageSetup", (BonoboUIVerbFn) command_page_setup),
- BONOBO_UI_VERB ("FileClose", (BonoboUIVerbFn) command_close),
- BONOBO_UI_VERB ("FileExit", (BonoboUIVerbFn) command_quit),
-
- BONOBO_UI_VERB ("WorkOffline", (BonoboUIVerbFn) command_work_offline),
- BONOBO_UI_VERB ("WorkOnline", (BonoboUIVerbFn) command_work_online),
-
- BONOBO_UI_VERB_END
-};
-
-static BonoboUIVerb new_verbs [] = {
- BONOBO_UI_VERB ("OpenNewWindow", (BonoboUIVerbFn) command_open_new_window),
-
- BONOBO_UI_VERB_END
-};
-
-static BonoboUIVerb actions_verbs[] = {
- BONOBO_UI_VERB ("SendReceive", (BonoboUIVerbFn) command_send_receive),
- BONOBO_UI_VERB ("ForgetPasswords", command_forget_passwords),
-
- BONOBO_UI_VERB_END
-};
-
-static BonoboUIVerb tools_verbs[] = {
- BONOBO_UI_VERB ("Settings", (BonoboUIVerbFn) command_settings),
- BONOBO_UI_VERB ("PilotSettings", (BonoboUIVerbFn) command_pilot_settings),
-
- BONOBO_UI_VERB_END
-};
-
-static BonoboUIVerb help_verbs [] = {
- BONOBO_UI_VERB ("QuickReference", (BonoboUIVerbFn) command_quick_reference),
- BONOBO_UI_VERB ("HelpOpenFAQ", (BonoboUIVerbFn) command_open_faq),
- BONOBO_UI_VERB ("HelpSubmitBug", (BonoboUIVerbFn) command_submit_bug),
- BONOBO_UI_VERB ("HelpAbout", (BonoboUIVerbFn) command_about),
-
- BONOBO_UI_VERB_END
-};
-
-static EPixmap pixmaps [] = {
- E_PIXMAP ("/Toolbar/SendReceive", "mail-send-receive", E_ICON_SIZE_LARGE_TOOLBAR),
- E_PIXMAP ("/menu/File/OpenNewWindow", "window-new", E_ICON_SIZE_MENU),
- E_PIXMAP ("/menu/File/SendReceive", "mail-send-receive", E_ICON_SIZE_MENU),
- E_PIXMAP ("/menu/File/FileImporter", "stock_mail-import", E_ICON_SIZE_MENU),
- E_PIXMAP ("/menu/File/Print/FilePageSetup", "stock_print-setup", E_ICON_SIZE_MENU),
- E_PIXMAP ("/menu/File/ToggleOffline", "stock_disconnect", E_ICON_SIZE_MENU),
- E_PIXMAP ("/menu/File/FileClose", "window-close", E_ICON_SIZE_MENU),
- E_PIXMAP ("/menu/File/FileExit", "application-exit", E_ICON_SIZE_MENU),
- E_PIXMAP ("/menu/Edit/Settings", "preferences-desktop", E_ICON_SIZE_MENU),
-
- E_PIXMAP_END
-};
-
-static EPixmap offline_pixmaps [] = {
- E_PIXMAP ("/menu/File/ToggleOffline", "stock_disconnect", E_ICON_SIZE_MENU),
- E_PIXMAP_END
-};
-
-static EPixmap online_pixmaps [] = {
- E_PIXMAP ("/menu/File/ToggleOffline", "stock_connect", E_ICON_SIZE_MENU),
- E_PIXMAP_END
-};
-
-
-/* The Work Online / Work Offline menu item. */
-
-static void
-update_offline_menu_item (EShellWindow *shell_window,
- EShellLineStatus line_status)
-{
- BonoboUIComponent *ui_component;
-
- ui_component = e_shell_window_peek_bonobo_ui_component (shell_window);
-
- switch (line_status) {
- case E_SHELL_LINE_STATUS_OFFLINE:
- case E_SHELL_LINE_STATUS_FORCED_OFFLINE:
- bonobo_ui_component_set_prop (ui_component,
- "/menu/File/ToggleOffline",
- "label", _("_Work Online"), NULL);
- bonobo_ui_component_set_prop (ui_component,
- "/menu/File/ToggleOffline",
- "verb", "WorkOnline", NULL);
- bonobo_ui_component_set_prop (ui_component,
- "/commands/ToggleOffline",
- "sensitive", "1", NULL);
- e_pixmaps_update (ui_component, online_pixmaps);
- break;
-
- case E_SHELL_LINE_STATUS_ONLINE:
- bonobo_ui_component_set_prop (ui_component,
- "/menu/File/ToggleOffline",
- "label", _("_Work Offline"), NULL);
- bonobo_ui_component_set_prop (ui_component,
- "/menu/File/ToggleOffline",
- "verb", "WorkOffline", NULL);
- bonobo_ui_component_set_prop (ui_component,
- "/commands/ToggleOffline",
- "sensitive", "1", NULL);
- e_pixmaps_update (ui_component, offline_pixmaps);
- break;
-
- case E_SHELL_LINE_STATUS_GOING_OFFLINE:
- bonobo_ui_component_set_prop (ui_component,
- "/menu/File/ToggleOffline",
- "label", _("Work Offline"), NULL);
- bonobo_ui_component_set_prop (ui_component,
- "/menu/File/ToggleOffline",
- "verb", "WorkOffline", NULL);
- bonobo_ui_component_set_prop (ui_component,
- "/commands/ToggleOffline",
- "sensitive", "0", NULL);
- e_pixmaps_update (ui_component, offline_pixmaps);
- break;
-
- default:
- g_return_if_reached();
- }
-}
-
-static void
-shell_line_status_changed_cb (EShell *shell,
- EShellLineStatus new_status,
- EShellWindow *shell_window)
-{
- update_offline_menu_item (shell_window, new_status);
-}
-
-static void
-view_buttons_icontext_item_toggled_handler (BonoboUIComponent *ui_component,
- const char *path,
- Bonobo_UIComponent_EventType type,
- const char *state,
- EShellWindow *shell_window)
-{
- ESidebar *sidebar;
-
- sidebar = e_shell_window_peek_sidebar (shell_window);
- e_sidebar_set_mode (sidebar, E_SIDEBAR_MODE_BOTH);
-}
-
-static void
-view_buttons_icon_item_toggled_handler (BonoboUIComponent *ui_component,
- const char *path,
- Bonobo_UIComponent_EventType type,
- const char *state,
- EShellWindow *shell_window)
-{
- ESidebar *sidebar;
-
- sidebar = e_shell_window_peek_sidebar (shell_window);
- e_sidebar_set_mode (sidebar, E_SIDEBAR_MODE_ICON);
-}
-
-static void
-view_buttons_text_item_toggled_handler (BonoboUIComponent *ui_component,
- const char *path,
- Bonobo_UIComponent_EventType type,
- const char *state,
- EShellWindow *shell_window)
-{
- ESidebar *sidebar;
-
- sidebar = e_shell_window_peek_sidebar (shell_window);
- e_sidebar_set_mode (sidebar, E_SIDEBAR_MODE_TEXT);
-}
-
-static void
-view_buttons_toolbar_item_toggled_handler (BonoboUIComponent *ui_component,
- const char *path,
- Bonobo_UIComponent_EventType type,
- const char *state,
- EShellWindow *shell_window)
-{
- ESidebar *sidebar;
-
- sidebar = e_shell_window_peek_sidebar (shell_window);
- e_sidebar_set_mode (sidebar, E_SIDEBAR_MODE_TOOLBAR);
-}
-
-static void
-view_buttons_hide_item_toggled_handler (BonoboUIComponent *ui_component,
- const char *path,
- Bonobo_UIComponent_EventType type,
- const char *state,
- EShellWindow *shell_window)
-{
- ESidebar *sidebar;
- gboolean is_visible;
-
- sidebar = e_shell_window_peek_sidebar (shell_window);
-
- is_visible = state[0] == '0';
-
- e_sidebar_set_show_buttons (sidebar, is_visible);
-}
-
-static void
-view_toolbar_item_toggled_handler (BonoboUIComponent *ui_component,
- const char *path,
- Bonobo_UIComponent_EventType type,
- const char *state,
- EShellWindow *shell_window)
-{
- gboolean is_visible;
-
- is_visible = state[0] == '1';
-
- bonobo_ui_component_set_prop (ui_component, "/Toolbar",
- "hidden", is_visible ? "0" : "1", NULL);
-}
-
-static void
-view_statusbar_item_toggled_handler (BonoboUIComponent *ui_component,
- const char *path,
- Bonobo_UIComponent_EventType type,
- const char *state,
- EShellWindow *shell_window)
-{
- GtkWidget *status_bar = e_shell_window_peek_statusbar (shell_window);
- gboolean is_visible;
- GConfClient *gconf_client;
-
- is_visible = state[0] == '1';
- if(is_visible)
- gtk_widget_show (status_bar);
- else
- gtk_widget_hide (status_bar);
- gconf_client = gconf_client_get_default ();
- gconf_client_set_bool (gconf_client,"/apps/evolution/shell/view_defaults/statusbar_visible", is_visible, NULL);
- g_object_unref (gconf_client);
-}
-
-static void
-view_sidebar_item_toggled_handler (BonoboUIComponent *ui_component,
- const char *path,
- Bonobo_UIComponent_EventType type,
- const char *state,
- EShellWindow *shell_window)
-{
- GtkWidget *side_bar = GTK_WIDGET(e_shell_window_peek_sidebar (shell_window));
- gboolean is_visible;
- GConfClient *gconf_client;
-
- is_visible = state[0] == '1';
- if(is_visible)
- gtk_widget_show (side_bar);
- else
- gtk_widget_hide (side_bar);
- gconf_client = gconf_client_get_default ();
- gconf_client_set_bool (gconf_client_get_default (),"/apps/evolution/shell/view_defaults/sidebar_visible", is_visible, NULL);
- g_object_unref (gconf_client);
-}
-
-/* Public API. */
-
-void
-e_shell_window_commands_setup (EShellWindow *shell_window)
-{
- BonoboUIComponent *uic;
- EShell *shell;
-
- g_return_if_fail (shell_window != NULL);
- g_return_if_fail (E_IS_SHELL_WINDOW (shell_window));
-
- uic = e_shell_window_peek_bonobo_ui_component (shell_window);
- shell = e_shell_window_peek_shell (shell_window);
-
- bonobo_ui_component_add_verb_list_with_data (uic, file_verbs, shell_window);
- bonobo_ui_component_add_verb_list_with_data (uic, new_verbs, shell_window);
- bonobo_ui_component_add_verb_list_with_data (uic, actions_verbs, shell_window);
- bonobo_ui_component_add_verb_list_with_data (uic, tools_verbs, shell_window);
- bonobo_ui_component_add_verb_list_with_data (uic, help_verbs, shell_window);
- bonobo_ui_component_add_listener (uic, "ViewButtonsIconText",
- (BonoboUIListenerFn)view_buttons_icontext_item_toggled_handler,
- (gpointer)shell_window);
- bonobo_ui_component_add_listener (uic, "ViewButtonsIcon",
- (BonoboUIListenerFn)view_buttons_icon_item_toggled_handler,
- (gpointer)shell_window);
- bonobo_ui_component_add_listener (uic, "ViewButtonsText",
- (BonoboUIListenerFn)view_buttons_text_item_toggled_handler,
- (gpointer)shell_window);
- bonobo_ui_component_add_listener (uic, "ViewButtonsToolbar",
- (BonoboUIListenerFn)view_buttons_toolbar_item_toggled_handler,
- (gpointer)shell_window);
- bonobo_ui_component_add_listener (uic, "ViewButtonsHide",
- (BonoboUIListenerFn)view_buttons_hide_item_toggled_handler,
- (gpointer)shell_window);
- bonobo_ui_component_add_listener (uic, "ViewToolbar",
- (BonoboUIListenerFn)view_toolbar_item_toggled_handler,
- (gpointer)shell_window);
- bonobo_ui_component_add_listener (uic, "ViewStatusBar",
- (BonoboUIListenerFn)view_statusbar_item_toggled_handler,
- (gpointer)shell_window);
- bonobo_ui_component_add_listener (uic, "ViewSideBar",
- (BonoboUIListenerFn)view_sidebar_item_toggled_handler,
- (gpointer)shell_window);
-
- e_pixmaps_update (uic, pixmaps);
-
- /* Set up the work online / work offline menu item. */
- g_signal_connect_object (shell, "line_status_changed",
- G_CALLBACK (shell_line_status_changed_cb), shell_window, 0);
- update_offline_menu_item (shell_window, e_shell_get_line_status (shell));
-}
diff --git a/shell/e-shell-window-private.c b/shell/e-shell-window-private.c
new file mode 100644
index 0000000000..bdf0dc3484
--- /dev/null
+++ b/shell/e-shell-window-private.c
@@ -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);
+}
diff --git a/shell/e-shell-window-private.h b/shell/e-shell-window-private.h
new file mode 100644
index 0000000000..deb27e85f5
--- /dev/null
+++ b/shell/e-shell-window-private.h
@@ -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 */
diff --git a/shell/e-shell-window.c b/shell/e-shell-window.c
index 7d772fd2af..97eed86690 100644
--- a/shell/e-shell-window.c
+++ b/shell/e-shell-window.c
@@ -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;
- view->component_id = g_strdup (id);
- view->component_alias = g_strdup (alias);
- view->button_id = button_id;
- view->notebook_page_num = -1;
+ window->priv = E_SHELL_WINDOW_GET_PRIVATE (window);
- return view;
+ e_shell_window_private_init (window);
+
+ 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;
+
+ 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 */
+ };
- CORBA_Object_release(view->component_view, &ev);
- CORBA_exception_free(&ev);
+ 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)
{
- BonoboControlFrame *view_control_frame;
- BonoboControlFrame *sidebar_control_frame;
+ GtkUIManager *manager;
+ GtkAction *action = NULL;
+ GList *iter;
- g_return_if_fail (view->sidebar_widget != NULL);
- g_return_if_fail (view->view_widget != NULL);
+ g_return_val_if_fail (E_IS_SHELL_WINDOW (window), NULL);
+ g_return_val_if_fail (action_name != NULL, NULL);
- view_control_frame = bonobo_widget_get_control_frame (BONOBO_WIDGET (view->view_widget));
- bonobo_control_frame_control_activate (view_control_frame);
+ manager = e_shell_window_get_ui_manager (window);
+ iter = gtk_ui_manager_get_action_groups (manager);
- sidebar_control_frame = bonobo_widget_get_control_frame (BONOBO_WIDGET (view->sidebar_widget));
- bonobo_control_frame_control_activate (sidebar_control_frame);
+ 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)
+{
+ GtkUIManager *manager;
+ GList *iter;
+
+ g_return_val_if_fail (E_IS_SHELL_WINDOW (window), NULL);
+ g_return_val_if_fail (group_name != NULL, NULL);
+
+ manager = e_shell_window_get_ui_manager (window);
+ iter = gtk_ui_manager_get_action_groups (manager);
+
+ 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);
+ }
+
+ 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 @@ init_view (EShellWindow *window,
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 @@ init_view (EShellWindow *window,
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 @@ init_view (EShellWindow *window,
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 @@ switch_view (EShellWindow *window, ComponentView *component_view)
{
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 @@ switch_view (EShellWindow *window, ComponentView *component_view)
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 @@ switch_view (EShellWindow *window, ComponentView *component_view)
*/
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 @@ static void
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 @@ update_offline_toggle_status (EShellWindow *window)
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 @@ update_offline_toggle_status (EShellWindow *window)
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 @@ sidebar_button_pressed_callback (ESidebar *sidebar,
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 @@ sidebar_button_pressed_callback (ESidebar *sidebar,
}
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 @@ shell_line_status_changed_callback (EShell *shell,
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;
- }
- }
-}
diff --git a/shell/e-shell-window.h b/shell/e-shell-window.h
index 07b8586e2e..f883a195a6 100644
--- a/shell/e-shell-window.h
+++ b/shell/e-shell-window.h
@@ -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_
-
-#include <bonobo/bonobo-window.h>
-#include <bonobo/bonobo-ui-component.h>
-#include "e-sidebar.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))
-
-
-typedef struct _EShellWindow EShellWindow;
+#ifndef E_SHELL_WINDOW_H
+#define E_SHELL_WINDOW_H
+
+#include "e-shell-common.h"
+#include "e-shell-view.h"
+
+/* 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 _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;
};
-
-#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);
-
-#endif /* _E_SHELL_WINDOW_H_ */
+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);
+
+G_END_DECLS
+
+#endif /* E_SHELL_WINDOW_H */
diff --git a/shell/e-shell.c b/shell/e-shell.c
index 6173f47498..ce8d0a2d23 100644
--- a/shell/e-shell.c
+++ b/shell/e-shell.c
@@ -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 @@ struct _EShellPrivate {
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 @@ struct _EShellPrivate {
enum {
NO_WINDOWS_LEFT,
LINE_STATUS_CHANGED,
- NEW_WINDOW_CREATED,
LAST_SIGNAL
};
@@ -238,7 +230,7 @@ impl_Shell_createNewWindow (PortableServer_Servant servant,
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 @@ impl_Shell_handleURI (PortableServer_Servant servant,
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 @@ impl_Shell_setLineStatus (PortableServer_Servant servant,
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 @@ impl_dispose (GObject *object)
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 @@ impl_dispose (GObject *object)
(* 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 @@ e_shell_class_init (EShellClass *klass)
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 @@ e_shell_class_init (EShellClass *klass)
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 @@ check_old:
* 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 @@ check_old:
**/
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 @@ e_shell_create_window (EShell *shell,
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 @@ e_shell_request_close_window (EShell *shell,
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:
diff --git a/shell/e-shell.h b/shell/e-shell.h
index b06e480c69..88fbf26fae 100644
--- a/shell/e-shell.h
+++ b/shell/e-shell.h
@@ -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_
-
-#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"
+#ifndef E_SHELL_H
+#define E_SHELL_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 @@ enum _EShellLineStatus {
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 */
diff --git a/shell/e-sidebar.c b/shell/e-sidebar.c
index d3404b5813..aa63f00ed4 100644
--- a/shell/e-sidebar.c
+++ b/shell/e-sidebar.c
@@ -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 @@ layout_buttons (ESidebar *sidebar)
}
/* 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 @@ layout_buttons (ESidebar *sidebar)
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 @@ layout_buttons (ESidebar *sidebar)
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 @@ layout_buttons (ESidebar *sidebar)
}
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;
-
- /* 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;
+ switch (property_id) {
+ case PROP_ACTIONS_VISIBLE:
+ e_sidebar_set_actions_visible (
+ E_SIDEBAR (object),
+ g_value_get_boolean (value));
+ return;
+
+ 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)
+sidebar_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
{
- 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);
+ 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;
- if (sidebar->priv->selection_widget == NULL) {
+ priv = E_SIDEBAR_GET_PRIVATE (widget);
+ child = gtk_bin_get_child (GTK_BIN (widget));
+
+ 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 (widget, &child_requisition);
- gtk_widget_size_request (button->button_widget, &button_requisition);
+ child_requisition.width += H_PADDING;
+ child_requisition.height += V_PADDING;
- requisition->width = MAX (requisition->width, button_requisition.width + 2 * H_PADDING);
- requisition->height += button_requisition.height + V_PADDING;
+ requisition->width = MAX (
+ requisition->width, child_requisition.width);
+ requisition->height += child_requisition.height;
}
}
static void
-impl_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation)
+sidebar_size_allocate (GtkWidget *widget,
+ GtkAllocation *allocation)
{
+ ESidebarPrivate *priv;
+ GtkWidget *child;
+ gint y;
+
+ priv = E_SIDEBAR_GET_PRIVATE (widget);
+
widget->allocation = *allocation;
- do_layout (E_SIDEBAR (widget));
-}
+ if (priv->actions_visible)
+ y = sidebar_layout_actions (E_SIDEBAR (widget));
+ else
+ y = allocation->y + allocation->height;
+ child = gtk_bin_get_child (GTK_BIN (widget));
-/* GObject methods. */
+ if (child != NULL) {
+ GtkAllocation child_allocation;
+
+ child_allocation.x = allocation->x;
+ child_allocation.y = allocation->y;
+ child_allocation.width = allocation->width;
+ child_allocation.height = y - allocation->y;
+
+ gtk_widget_size_allocate (child, &child_allocation);
+ }
+}
static void
-impl_dispose (GObject *object)
+sidebar_remove (GtkContainer *container,
+ GtkWidget *widget)
{
- ESidebarPrivate *priv = E_SIDEBAR (object)->priv;
- GConfClient *gconf_client = gconf_client_get_default ();
+ ESidebarPrivate *priv;
+ GList *link;
- g_slist_foreach (priv->buttons, (GFunc) button_free, NULL);
- g_slist_free (priv->buttons);
- priv->buttons = NULL;
+ priv = E_SIDEBAR_GET_PRIVATE (container);
- if (priv->style_changed_id) {
- gconf_client_notify_remove (gconf_client, priv->style_changed_id);
- priv->style_changed_id = 0;
- }
+ /* Look in the internal widgets first. */
+ link = g_list_find (priv->proxies, widget);
+ if (link != NULL) {
+ GtkWidget *widget = link->data;
- g_object_unref (gconf_client);
+ gtk_widget_unparent (widget);
+ priv->proxies = g_list_delete_link (priv->proxies, link);
+ gtk_widget_queue_resize (GTK_WIDGET (container));
+ return;
+ }
- (* G_OBJECT_CLASS (e_sidebar_parent_class)->dispose) (object);
+ /* Chain up to parent's remove() method. */
+ GTK_CONTAINER_CLASS (parent_class)->remove (container, widget);
}
-static gboolean
-boolean_handled_accumulator (GSignalInvocationHint *ihint,
- GValue *return_accu,
- const GValue *handler_return,
- gpointer dummy)
+static void
+sidebar_forall (GtkContainer *container,
+ gboolean include_internals,
+ GtkCallback callback,
+ gpointer callback_data)
{
- gboolean handled;
+ ESidebarPrivate *priv;
+
+ priv = E_SIDEBAR_GET_PRIVATE (container);
- handled = g_value_get_boolean (handler_return);
- g_value_set_boolean (return_accu, handled);
+ if (include_internals)
+ g_list_foreach (
+ priv->proxies, (GFunc) callback, callback_data);
- return !handled;
+ /* Chain up to parent's forall() method. */
+ GTK_CONTAINER_CLASS (parent_class)->forall (
+ container, include_internals, callback, callback_data);
}
-static void
-impl_finalize (GObject *object)
+static GtkIconSize
+sidebar_get_icon_size (GtkToolShell *shell)
{
- ESidebarPrivate *priv = E_SIDEBAR (object)->priv;
-
- g_free (priv);
+ return GTK_ICON_SIZE_LARGE_TOOLBAR;
+}
- (* G_OBJECT_CLASS (e_sidebar_parent_class)->finalize) (object);
+static GtkOrientation
+sidebar_get_orientation (GtkToolShell *shell)
+{
+ return GTK_ORIENTATION_HORIZONTAL;
}
+static GtkToolbarStyle
+sidebar_get_style (GtkToolShell *shell)
+{
+ return e_sidebar_get_toolbar_style (E_SIDEBAR (shell));
+}
-/* Initialization. */
+static GtkReliefStyle
+sidebar_get_relief_style (GtkToolShell *shell)
+{
+ g_debug ("%s", G_STRFUNC);
+ return GTK_RELIEF_NORMAL;
+}
static void
-e_sidebar_class_init (ESidebarClass *klass)
+sidebar_class_init (ESidebarClass *class)
{
- 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);
+ GObjectClass *object_class;
+ GtkWidgetClass *widget_class;
+ GtkContainerClass *container_class;
+
+ 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;
+
+ widget_class = GTK_WIDGET_CLASS (class);
+ widget_class->size_request = sidebar_size_request;
+ widget_class->size_allocate = sidebar_size_allocate;
+
+ container_class = GTK_CONTAINER_CLASS (class);
+ container_class->remove = sidebar_remove;
+ container_class->forall = sidebar_forall;
+
+ 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));
+
+ 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));
}
static void
-e_sidebar_init (ESidebar *sidebar)
+sidebar_init (ESidebar *sidebar)
{
- ESidebarPrivate *priv;
+ sidebar->priv = E_SIDEBAR_GET_PRIVATE (sidebar);
GTK_WIDGET_SET_FLAGS (sidebar, GTK_NO_WINDOW);
-
- priv = g_new0 (ESidebarPrivate, 1);
- sidebar->priv = priv;
-
- priv->mode = E_SIDEBAR_MODE_TEXT;
}
-GtkWidget *
-e_sidebar_new (void)
+static void
+sidebar_tool_shell_iface_init (GtkToolShellIface *iface)
{
- ESidebar *sidebar = g_object_new (e_sidebar_get_type (), NULL);
-
- return GTK_WIDGET (sidebar);
+ 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;
}
-
-void
-e_sidebar_set_selection_widget (ESidebar *sidebar, GtkWidget *widget)
+GType
+e_sidebar_get_type (void)
{
- if (sidebar->priv->selection_widget != NULL)
- gtk_widget_unparent (sidebar->priv->selection_widget);
-
- sidebar->priv->selection_widget = widget;
-
- if (widget != NULL)
- gtk_widget_set_parent (widget, GTK_WIDGET (sidebar));
+ 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 */
+ };
+
+ type = g_type_register_static (
+ GTK_TYPE_BIN, "ESidebar", &type_info, 0);
+
+ g_type_add_interface_static (
+ type, GTK_TYPE_TOOL_SHELL, &tool_shell_info);
+ }
- gtk_widget_queue_resize (GTK_WIDGET (sidebar));
+ return type;
}
-
-void
-e_sidebar_add_button (ESidebar *sidebar,
- const char *label,
- const char *tooltips,
- GdkPixbuf *icon,
- int id)
+GtkWidget *
+e_sidebar_new (void)
{
- 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;
- }
-
- gtk_container_add (GTK_CONTAINER (button_widget), hbox);
-
- 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));
-
- gtk_widget_queue_resize (GTK_WIDGET (sidebar));
+ return g_object_new (E_TYPE_SIDEBAR, NULL);
}
-/**
- * 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)
+e_sidebar_add_action (ESidebar *sidebar,
+ GtkAction *action)
{
- GSList *p;
-
- g_return_if_fail (sidebar != NULL);
+ GtkWidget *widget;
- for (p = sidebar->priv->buttons; p != NULL; p = p->next) {
- Button *button = p->data;
+ g_return_if_fail (E_IS_SIDEBAR (sidebar));
+ g_return_if_fail (GTK_IS_ACTION (action));
- if (button->id == button_id) {
- if (!button->icon)
- break;
+ 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 (icon) {
- if (!button->default_icon)
- button->default_icon = gdk_pixbuf_copy (gtk_image_get_pixbuf (GTK_IMAGE (button->icon)));
+ sidebar->priv->proxies = g_list_append (sidebar->priv->proxies, widget);
- 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;
- }
+ gtk_widget_set_parent (widget, GTK_WIDGET (sidebar));
+ gtk_widget_queue_resize (GTK_WIDGET (sidebar));
- break;
- }
- }
+ g_debug ("Relief Style: %d", gtk_tool_item_get_relief_style (GTK_TOOL_ITEM (widget)));
}
-void
-e_sidebar_select_button (ESidebar *sidebar, int id)
+gboolean
+e_sidebar_get_actions_visible (ESidebar *sidebar)
{
- update_buttons (sidebar, id);
+ g_return_val_if_fail (E_IS_SIDEBAR (sidebar), FALSE);
- g_signal_emit (sidebar, signals[BUTTON_SELECTED], 0, id);
+ return sidebar->priv->actions_visible;
}
-ESidebarMode
-e_sidebar_get_mode (ESidebar *sidebar)
-{
- return sidebar->priv->mode;
-}
-
-
-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 }
-};
-
-static void
-set_mode_internal (ESidebar *sidebar, ESidebarMode mode )
+void
+e_sidebar_set_actions_visible (ESidebar *sidebar,
+ gboolean visible)
{
- GSList *p;
+ GList *iter;
- if (mode == INTERNAL_MODE (sidebar))
+ if (sidebar->priv->actions_visible == visible)
return;
- for (p = sidebar->priv->buttons; p != NULL; p = p->next) {
- Button *button = p->data;
-
- 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;
- }
- }
-}
+ sidebar->priv->actions_visible = visible;
-static void
-style_changed_notify (GConfClient *gconf, guint id, GConfEntry *entry, void *data)
-{
- 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);
-
- set_mode_internal (E_SIDEBAR (sidebar), mode);
- sidebar->priv->toolbar_mode = 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));
+
+ g_object_notify (G_OBJECT (sidebar), "actions-visible");
}
-void
-e_sidebar_set_mode (ESidebar *sidebar, ESidebarMode mode)
+GtkToolbarStyle
+e_sidebar_get_toolbar_style (ESidebar *sidebar)
{
- GConfClient *gconf_client = gconf_client_get_default ();
-
- if (sidebar->priv->mode == mode)
- 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;
- }
- }
-
- if (mode != E_SIDEBAR_MODE_TOOLBAR) {
- set_mode_internal (sidebar, mode);
-
- 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);
- }
-
- g_object_unref (gconf_client);
+ g_return_val_if_fail (E_IS_SIDEBAR (sidebar), DEFAULT_TOOLBAR_STYLE);
- sidebar->priv->mode = mode;
+ 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->toolbar_style = style;
- sidebar->priv->show = show;
+ g_list_foreach (
+ sidebar->priv->proxies,
+ (GFunc) gtk_tool_item_toolbar_reconfigured, NULL);
- gtk_widget_queue_resize (GTK_WIDGET (sidebar));
-}
-
-gboolean
-e_sidebar_get_show_buttons (ESidebar *sidebar)
-{
- return sidebar->priv->show;
+ g_object_notify (G_OBJECT (sidebar), "toolbar-style");
}
diff --git a/shell/e-sidebar.h b/shell/e-sidebar.h
index 319f7e8f04..e5f195cbf7 100644
--- a/shell/e-sidebar.h
+++ b/shell/e-sidebar.h
@@ -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))
-
-
-typedef struct _ESidebar ESidebar;
+/* 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 _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 */
diff --git a/shell/evolution-component.h b/shell/evolution-component.h
deleted file mode 100644
index 00d232774c..0000000000
--- a/shell/evolution-component.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/*
- * 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.
- *
- * Author: Michael Zucchi <notzed@novell.com>
- *
- * Abstract class wrapper for EvolutionComponent
- */
-
-#ifndef _EVOLUTION_COMPONENT_H_
-#define _EVOLUTION_COMPONENT_H_
-
-#include <bonobo/bonobo-object.h>
-#include "shell/Evolution.h"
-
-typedef struct _EvolutionComponent EvolutionComponent;
-typedef struct _EvolutionComponentClass EvolutionComponentClass;
-
-struct _EvolutionComponent {
- BonoboObject parent;
-};
-
-struct _EvolutionComponentClass {
- BonoboObjectClass parent_class;
-
- POA_GNOME_Evolution_Component__epv epv;
-};
-
-GType evolution_component_get_type(void);
-
-#endif /* _EVOLUTION_COMPONENT_H_ */
diff --git a/shell/main.c b/shell/main.c
index 7b566a99dc..4cc2962494 100644
--- a/shell/main.c
+++ b/shell/main.c
@@ -458,7 +458,7 @@ idle_cb (gchar **uris)
}
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;
diff --git a/widgets/misc/Makefile.am b/widgets/misc/Makefile.am
index bb3d131ffb..95acd8b929 100644
--- a/widgets/misc/Makefile.am
+++ b/widgets/misc/Makefile.am
@@ -57,6 +57,7 @@ widgetsinclude_HEADERS = \
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 @@ libemiscwidgets_la_SOURCES = \
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 \
diff --git a/widgets/misc/e-online-button.c b/widgets/misc/e-online-button.c
new file mode 100644
index 0000000000..7391384950
--- /dev/null
+++ b/widgets/misc/e-online-button.c
@@ -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");
+}
diff --git a/widgets/misc/e-online-button.h b/widgets/misc/e-online-button.h
new file mode 100644
index 0000000000..b9b03e1ffc
--- /dev/null
+++ b/widgets/misc/e-online-button.h
@@ -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 */