aboutsummaryrefslogtreecommitdiffstats
path: root/shell
diff options
context:
space:
mode:
Diffstat (limited to 'shell')
-rw-r--r--shell/ChangeLog13
-rw-r--r--shell/Evolution-Wizard.idl37
-rw-r--r--shell/Evolution.idl1
-rw-r--r--shell/Makefile.am7
-rw-r--r--shell/e-setup.c3
-rw-r--r--shell/e-shell-startup-wizard.c845
-rw-r--r--shell/e-shell.c21
-rw-r--r--shell/evolution-wizard.c394
-rw-r--r--shell/evolution-wizard.h86
-rw-r--r--shell/glade/Makefile.am3
-rw-r--r--shell/glade/evolution-startup-wizard.glade252
11 files changed, 1656 insertions, 6 deletions
diff --git a/shell/ChangeLog b/shell/ChangeLog
index b99c1b262d..9afd5b1eb1 100644
--- a/shell/ChangeLog
+++ b/shell/ChangeLog
@@ -1,3 +1,16 @@
+3001-08-17 Iain Holmes <iain@ximian.com>
+
+ * Evolution.idl: Add Evolution-Wizard.idl
+
+ * Evolution-Wizard.idl: New file implementing a wizard interface.
+
+ * Makefile.am: Add the wizard stuff and the startup dialog stuff
+
+ * e-shell.c (e_shell_construct): Hide the splash screen and try to start
+ the startup assistant.
+
+ * glade/Makefile.am: Add the evolution-startup-wizard.glade
+
2001-08-16 Jason Leach <jleach@ximian.com>
* e-shell-view-menu.c (authors): Add myself.
diff --git a/shell/Evolution-Wizard.idl b/shell/Evolution-Wizard.idl
new file mode 100644
index 0000000000..222830d737
--- /dev/null
+++ b/shell/Evolution-Wizard.idl
@@ -0,0 +1,37 @@
+/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Interface for a wizard done through Bonobo.
+ *
+ * Authors:
+ * Iain Holmes <iain@ximian.com>
+ *
+ * Copyright (C) 2000, 2001 Ximian, Inc.
+ */
+
+#include <Bonobo.idl>
+
+module GNOME {
+module Evolution {
+
+ interface Wizard : Bonobo::Unknown {
+
+ readonly attribute long pageCount;
+ enum Action {
+ NEXT,
+ PREPARE,
+ BACK,
+ FINISH,
+ CANCEL,
+ HELP
+ };
+
+ exception NoPage {};
+
+ Bonobo::Control getControl (in long pagenumber)
+ raises (NoPage);
+
+ void notifyAction (in long pagenumber, in Action action)
+ raises (NoPage);
+ };
+};
+};
diff --git a/shell/Evolution.idl b/shell/Evolution.idl
index 229b56abaf..ff267c60ea 100644
--- a/shell/Evolution.idl
+++ b/shell/Evolution.idl
@@ -22,3 +22,4 @@
#include <Evolution-Storage.idl>
#include <Evolution-StorageSetView.idl>
#include <Evolution-Shell.idl>
+#include <Evolution-Wizard.idl>
diff --git a/shell/Makefile.am b/shell/Makefile.am
index 719d9fdd4d..b1d943f33d 100644
--- a/shell/Makefile.am
+++ b/shell/Makefile.am
@@ -69,7 +69,8 @@ eshellinclude_HEADERS = \
evolution-shell-view.h \
evolution-storage-listener.h \
evolution-storage-set-view-listener.h \
- evolution-storage.h
+ evolution-storage.h \
+ evolution-wizard.h
libeshell_la_SOURCES = \
$(IDL_GENERATED) \
@@ -85,6 +86,7 @@ libeshell_la_SOURCES = \
evolution-storage-listener.c \
evolution-storage-set-view-listener.c \
evolution-storage.c \
+ evolution-wizard.c \
$(eshellinclude_HEADERS)
# Evolution executable
@@ -127,6 +129,7 @@ evolution_SOURCES = \
e-shell-importer.h \
e-shell-offline-handler.c \
e-shell-offline-handler.h \
+ e-shell-startup-wizard.c \
e-shell-user-creatable-items-handler.c \
e-shell-user-creatable-items-handler.h \
e-shell-utils.c \
@@ -168,8 +171,10 @@ evolution_SOURCES = \
evolution_LDADD = \
libeshell.la \
importer/libevolution-importer.la \
+ $(top_builddir)/widgets/e-timezone-dialog/libetimezonedialog.a \
$(top_builddir)/widgets/misc/libemiscwidgets.a \
$(top_builddir)/e-util/libeutil.la \
+ $(top_builddir)/libical/src/libical/libical.la \
$(EXTRA_GNOME_LIBS) \
$(GNOME_PRINT_LIBS) \
$(GTKHTML_LIBS) \
diff --git a/shell/e-setup.c b/shell/e-setup.c
index a25f7d5187..4c31b6b1cb 100644
--- a/shell/e-setup.c
+++ b/shell/e-setup.c
@@ -300,8 +300,9 @@ e_setup (const char *evolution_directory)
struct stat statinfo;
char *file;
- if (stat (evolution_directory, &statinfo) != 0)
+ if (stat (evolution_directory, &statinfo) != 0) {
return copy_default_stuff (evolution_directory);
+ }
if (! S_ISDIR (statinfo.st_mode)) {
e_notice (NULL, GNOME_MESSAGE_BOX_ERROR,
diff --git a/shell/e-shell-startup-wizard.c b/shell/e-shell-startup-wizard.c
new file mode 100644
index 0000000000..72a10c7c19
--- /dev/null
+++ b/shell/e-shell-startup-wizard.c
@@ -0,0 +1,845 @@
+/*
+ * e-shell-startup-wizard.c
+ *
+ * Copyright (C) 2001 Ximian, Inc.
+ *
+ * Authors: Iain Holmes <iain@ximian.com>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <errno.h>
+
+#include <glib.h>
+#include <gtk/gtk.h>
+#include <gnome.h>
+#include <glade/glade.h>
+#include <liboaf/liboaf.h>
+
+#include <bonobo/bonobo-object.h>
+#include <bonobo/bonobo-widget.h>
+#include <bonobo/bonobo-exception.h>
+#include <bonobo/bonobo-moniker-util.h>
+#include <bonobo-conf/bonobo-config-database.h>
+
+#include <widgets/e-timezone-dialog/e-timezone-dialog.h>
+#include "importer/GNOME_Evolution_Importer.h"
+
+#include <evolution-wizard.h>
+#include "Evolution.h"
+
+typedef struct _TimezoneDialogPage {
+ GtkWidget *page;
+ GtkWidget *vbox;
+ GtkObject *etd;
+} TimezoneDialogPage;
+
+typedef struct _ImportDialogPage {
+ GtkWidget *page;
+ GtkWidget *vbox;
+ GtkWidget *placeholder, *clist;
+
+ GList *importers;
+ int running;
+} ImportDialogPage;
+
+typedef struct _MailDialogPage {
+ GtkWidget *page;
+ GtkWidget *vbox;
+ GtkWidget *widget;
+
+ Bonobo_Control control;
+} MailDialogPage;
+
+typedef struct _SWData {
+ GladeXML *wizard;
+ GtkWidget *dialog;
+ GtkWidget *druid;
+
+ GnomeDruidPage *start, *finish;
+
+ MailDialogPage *id_page;
+ MailDialogPage *source_page;
+ MailDialogPage *extra_page;
+ MailDialogPage *transport_page;
+ MailDialogPage *management_page;
+
+ TimezoneDialogPage *timezone_page;
+ ImportDialogPage *import_page;
+
+ gboolean cancel;
+ CORBA_Object mailer;
+ Bonobo_EventSource event_source;
+ BonoboListener *listener;
+ int id;
+
+ Bonobo_ConfigDatabase db;
+} SWData;
+
+typedef struct _IntelligentImporterData {
+ CORBA_Object object;
+ Bonobo_Control control;
+ GtkWidget *widget;
+
+ char *name;
+ char *blurb;
+ char *iid;
+} IntelligentImporterData;
+
+typedef struct _SelectedImporterData{
+ CORBA_Object importer;
+ char *iid;
+} SelectedImporterData;
+
+static GHashTable *page_hash;
+
+static void
+druid_event_notify_cb (BonoboListener *listener,
+ const char *name,
+ BonoboArg *arg,
+ CORBA_Environment *ev,
+ SWData *data)
+{
+ int buttons;
+
+ if (strcmp (name, EVOLUTION_WIZARD_SET_BUTTONS_SENSITIVE) == 0) {
+ buttons = (int) *((CORBA_short *)arg->_value);
+ gnome_druid_set_buttons_sensitive (GNOME_DRUID (data->druid),
+ (buttons & 4) >> 2,
+ (buttons & 2) >> 1,
+ (buttons & 1));
+ } else {
+ g_print ("event_name: %s\n", name);
+ }
+}
+
+static void
+make_mail_dialog_pages (SWData *data)
+{
+ CORBA_Environment ev;
+ CORBA_Object object;
+
+ CORBA_exception_init (&ev);
+ data->mailer = oaf_activate_from_id ("OAFIID:GNOME_Evolution_Mail_Wizard", 0, NULL, &ev);
+ if (BONOBO_EX (&ev)) {
+ g_warning ("Could not start mailer (%s)", CORBA_exception_id (&ev));
+ CORBA_exception_free (&ev);
+ return;
+ }
+
+ CORBA_exception_free (&ev);
+ if (data->mailer == CORBA_OBJECT_NIL) {
+ g_warning ("Could not activate mailer.");
+ return;
+ }
+
+ CORBA_exception_init (&ev);
+ data->event_source = Bonobo_Unknown_queryInterface (data->mailer, "IDL:Bonobo/EventSource:1.0", &ev);
+ CORBA_exception_free (&ev);
+ data->listener = bonobo_listener_new (NULL, NULL);
+ gtk_signal_connect (GTK_OBJECT (data->listener), "event-notify",
+ GTK_SIGNAL_FUNC (druid_event_notify_cb), data);
+ object = bonobo_object_corba_objref (BONOBO_OBJECT (data->listener));
+ CORBA_exception_init (&ev);
+ data->id = Bonobo_EventSource_addListener (data->event_source, object, &ev);
+ CORBA_exception_free (&ev);
+}
+
+static int
+page_to_num (GnomeDruidPage *page)
+{
+ return GPOINTER_TO_INT (g_hash_table_lookup (page_hash, page));
+}
+
+static gboolean
+next_func (GnomeDruidPage *page,
+ GnomeDruid *druid,
+ SWData *data)
+{
+ CORBA_Environment ev;
+ int pagenum;
+
+ CORBA_exception_init (&ev);
+ pagenum = page_to_num (page);
+ GNOME_Evolution_Wizard_notifyAction (data->mailer, pagenum, GNOME_Evolution_Wizard_NEXT, &ev);
+ CORBA_exception_free (&ev);
+ return FALSE;
+}
+
+static gboolean
+prepare_func (GnomeDruidPage *page,
+ GnomeDruid *druid,
+ SWData *data)
+{
+ CORBA_Environment ev;
+ int pagenum;
+
+ CORBA_exception_init (&ev);
+ pagenum = page_to_num (page);
+ GNOME_Evolution_Wizard_notifyAction (data->mailer, pagenum, GNOME_Evolution_Wizard_PREPARE, &ev);
+ CORBA_exception_free (&ev);
+ return FALSE;
+}
+
+static gboolean
+back_func (GnomeDruidPage *page,
+ GnomeDruid *druid,
+ SWData *data)
+{
+ CORBA_Environment ev;
+ int pagenum;
+
+ CORBA_exception_init (&ev);
+ pagenum = page_to_num (page);
+ GNOME_Evolution_Wizard_notifyAction (data->mailer, pagenum, GNOME_Evolution_Wizard_BACK, &ev);
+ CORBA_exception_free (&ev);
+ return FALSE;
+}
+
+static void
+free_importers (SWData *data)
+{
+ GList *l;
+
+ for (l = data->import_page->importers; l; l = l->next) {
+ IntelligentImporterData *iid;
+
+ iid = l->data;
+ if (iid->object != CORBA_OBJECT_NIL) {
+ bonobo_object_release_unref (iid->object, NULL);
+ }
+ }
+
+ g_list_free (data->import_page->importers);
+}
+
+static void
+start_importers (GList *p)
+{
+ CORBA_Environment ev;
+
+ for (; p; p = p->next) {
+ SelectedImporterData *sid = p->data;
+
+ CORBA_exception_init (&ev);
+ GNOME_Evolution_IntelligentImporter_importData (sid->importer, &ev);
+ if (BONOBO_EX (&ev)) {
+ g_warning ("Error importing %s\n%s", sid->iid,
+ CORBA_exception_id (&ev));
+ }
+ CORBA_exception_free (&ev);
+ }
+}
+
+static void
+do_import (SWData *data)
+{
+ CORBA_Environment ev;
+ GList *l, *selected = NULL;
+
+ for (l = GTK_CLIST (data->import_page->clist)->selection; l; l = l->next) {
+ IntelligentImporterData *importer_data;
+ SelectedImporterData *sid;
+ char *iid;
+
+ importer_data = g_list_nth_data (data->import_page->importers, GPOINTER_TO_INT (l->data));
+ iid = g_strdup (importer_data->iid);
+
+ sid = g_new (SelectedImporterData, 1);
+ sid->iid = iid;
+
+ CORBA_exception_init (&ev);
+ sid->importer = bonobo_object_dup_ref (importer_data->object, &ev);
+ if (BONOBO_EX (&ev)) {
+ g_warning ("Error duplication %s\n(%s)", iid,
+ CORBA_exception_id (&ev));
+ g_free (iid);
+ CORBA_exception_free (&ev);
+ g_free (sid);
+ continue;
+ }
+ CORBA_exception_free (&ev);
+
+ selected = g_list_prepend (selected, sid);
+ }
+
+ free_importers (data);
+
+ if (selected != NULL) {
+ start_importers (selected);
+
+ for (l = selected; l; l = l->next) {
+ SelectedImporterData *sid = l->data;
+
+ CORBA_exception_init (&ev);
+ bonobo_object_release_unref (sid->importer, &ev);
+ CORBA_exception_free (&ev);
+
+ g_free (sid->iid);
+ g_free (sid);
+ }
+ g_list_free (selected);
+ }
+}
+
+static gboolean
+finish_func (GnomeDruidPage *page,
+ GnomeDruid *druid,
+ SWData *data)
+{
+ CORBA_Environment ev;
+ char *displayname, *tz;
+
+ /* Notify mailer */
+ CORBA_exception_init (&ev);
+ GNOME_Evolution_Wizard_notifyAction (data->mailer, 0, GNOME_Evolution_Wizard_FINISH, &ev);
+ CORBA_exception_free (&ev);
+
+ /* Set Timezone */
+ CORBA_exception_init (&ev);
+
+ e_timezone_dialog_get_timezone (E_TIMEZONE_DIALOG (data->timezone_page->etd), &displayname);
+ if (displayname == NULL) {
+ tz = g_strdup ("");
+ } else {
+ tz = g_strdup (displayname);
+ g_free (displayname);
+ }
+
+ bonobo_config_set_string (data->db, "/Calendar/Display/Timezone", tz, &ev);
+ g_free (tz);
+ CORBA_exception_free (&ev);
+
+ do_import (data);
+
+ /* Free data */
+ data->cancel = FALSE;
+ gtk_widget_destroy (data->dialog);
+ gtk_main_quit ();
+}
+
+static void
+connect_page (GtkWidget *page,
+ SWData *data)
+{
+ gtk_signal_connect (GTK_OBJECT (page), "next",
+ GTK_SIGNAL_FUNC (next_func), data);
+ gtk_signal_connect (GTK_OBJECT (page), "prepare",
+ GTK_SIGNAL_FUNC (prepare_func), data);
+ gtk_signal_connect (GTK_OBJECT (page), "back",
+ GTK_SIGNAL_FUNC (back_func), data);
+ gtk_signal_connect (GTK_OBJECT (page), "finish",
+ GTK_SIGNAL_FUNC (finish_func), data);
+}
+
+static MailDialogPage *
+make_identity_page (SWData *data)
+{
+ MailDialogPage *page;
+ CORBA_Environment ev;
+
+ g_return_val_if_fail (data != NULL, NULL);
+
+ page = g_new0 (MailDialogPage, 1);
+ page->page = glade_xml_get_widget (data->wizard, "identity-page");
+ g_return_val_if_fail (page->page != NULL, NULL);
+
+ connect_page (page->page, data);
+ g_hash_table_insert (page_hash, page->page, GINT_TO_POINTER (0));
+ page->vbox = GNOME_DRUID_PAGE_STANDARD (page->page)->vbox;
+
+ CORBA_exception_init (&ev);
+ page->control = GNOME_Evolution_Wizard_getControl (data->mailer, 0, &ev);
+ CORBA_exception_free (&ev);
+
+ page->widget = bonobo_widget_new_control_from_objref (page->control, CORBA_OBJECT_NIL);
+ gtk_box_pack_start (GTK_BOX (page->vbox), page->widget, TRUE, TRUE, 0);
+ gtk_widget_show_all (page->widget);
+
+ return page;
+}
+
+static MailDialogPage *
+make_receive_page (SWData *data)
+{
+ MailDialogPage *page;
+ CORBA_Environment ev;
+
+ g_return_val_if_fail (data != NULL, NULL);
+
+ page = g_new0 (MailDialogPage, 1);
+ page->page = glade_xml_get_widget (data->wizard, "receive-page");
+ g_return_val_if_fail (page->page != NULL, NULL);
+
+ connect_page (page->page, data);
+ g_hash_table_insert (page_hash, page->page, GINT_TO_POINTER (1));
+ page->vbox = GNOME_DRUID_PAGE_STANDARD (page->page)->vbox;
+
+ CORBA_exception_init (&ev);
+ page->control = GNOME_Evolution_Wizard_getControl (data->mailer, 1, &ev);
+ CORBA_exception_free (&ev);
+
+ page->widget = bonobo_widget_new_control_from_objref (page->control, CORBA_OBJECT_NIL);
+ gtk_box_pack_start (GTK_BOX (page->vbox), page->widget, TRUE, TRUE, 0);
+ gtk_widget_show_all (page->widget);
+
+ return page;
+}
+
+static MailDialogPage *
+make_extra_page (SWData *data)
+{
+ MailDialogPage *page;
+ CORBA_Environment ev;
+
+ g_return_val_if_fail (data != NULL, NULL);
+
+ page = g_new0 (MailDialogPage, 1);
+ page->page = glade_xml_get_widget (data->wizard, "extra-page");
+ g_return_val_if_fail (page->page != NULL, NULL);
+
+ connect_page (page->page, data);
+ g_hash_table_insert (page_hash, page->page, GINT_TO_POINTER (2));
+ page->vbox = GNOME_DRUID_PAGE_STANDARD (page->page)->vbox;
+
+ CORBA_exception_init (&ev);
+ page->control = GNOME_Evolution_Wizard_getControl (data->mailer, 2, &ev);
+ CORBA_exception_free (&ev);
+
+ page->widget = bonobo_widget_new_control_from_objref (page->control, CORBA_OBJECT_NIL);
+ gtk_box_pack_start (GTK_BOX (page->vbox), page->widget, TRUE, TRUE, 0);
+ gtk_widget_show_all (page->widget);
+
+ return page;
+}
+
+static MailDialogPage *
+make_transport_page (SWData *data)
+{
+ MailDialogPage *page;
+ CORBA_Environment ev;
+
+ g_return_val_if_fail (data != NULL, NULL);
+
+ page = g_new0 (MailDialogPage, 1);
+ page->page = glade_xml_get_widget (data->wizard, "send-page");
+ g_return_val_if_fail (page->page != NULL, NULL);
+
+ connect_page (page->page, data);
+ g_hash_table_insert (page_hash, page->page, GINT_TO_POINTER (3));
+ page->vbox = GNOME_DRUID_PAGE_STANDARD (page->page)->vbox;
+
+ CORBA_exception_init (&ev);
+ page->control = GNOME_Evolution_Wizard_getControl (data->mailer, 3, &ev);
+ CORBA_exception_free (&ev);
+
+ page->widget = bonobo_widget_new_control_from_objref (page->control, CORBA_OBJECT_NIL);
+ gtk_box_pack_start (GTK_BOX (page->vbox), page->widget, TRUE, TRUE, 0);
+ gtk_widget_show_all (page->widget);
+
+ return page;
+}
+
+static MailDialogPage *
+make_management_page (SWData *data)
+{
+ MailDialogPage *page;
+ CORBA_Environment ev;
+
+ g_return_val_if_fail (data != NULL, NULL);
+
+ page = g_new0 (MailDialogPage, 1);
+ page->page = glade_xml_get_widget (data->wizard, "management-page");
+ g_return_val_if_fail (page->page != NULL, NULL);
+
+ connect_page (page->page, data);
+ g_hash_table_insert (page_hash, page->page, GINT_TO_POINTER (4));
+ page->vbox = GNOME_DRUID_PAGE_STANDARD (page->page)->vbox;
+
+ CORBA_exception_init (&ev);
+ page->control = GNOME_Evolution_Wizard_getControl (data->mailer, 4, &ev);
+ CORBA_exception_free (&ev);
+
+ page->widget = bonobo_widget_new_control_from_objref (page->control, CORBA_OBJECT_NIL);
+ gtk_box_pack_start (GTK_BOX (page->vbox), page->widget, TRUE, TRUE, 0);
+ gtk_widget_show_all (page->widget);
+
+ return page;
+}
+
+static TimezoneDialogPage *
+make_timezone_page (SWData *data)
+{
+ TimezoneDialogPage *page;
+
+ g_return_val_if_fail (data != NULL, NULL);
+
+ page = g_new0 (TimezoneDialogPage, 1);
+ page->page = glade_xml_get_widget (data->wizard, "timezone-page");
+ g_return_val_if_fail (page->page != NULL, NULL);
+
+ page->vbox = GNOME_DRUID_PAGE_STANDARD (page->page)->vbox;
+
+ page->etd = e_timezone_dialog_new ();
+ e_timezone_dialog_reparent (page->etd, page->vbox);
+
+ return page;
+}
+
+static GList *
+get_intelligent_importers (void)
+{
+ OAF_ServerInfoList *info_list;
+ GList *iids_ret = NULL;
+ CORBA_Environment ev;
+ int i;
+
+ CORBA_exception_init (&ev);
+ info_list = oaf_query ("repo_ids.has ('IDL:GNOME/Evolution/IntelligentImporter:1.0')", NULL, &ev);
+ CORBA_exception_free (&ev);
+
+ for (i = 0; i < info_list->_length; i++) {
+ const OAF_ServerInfo *info;
+
+ info = info_list->_buffer + i;
+ iids_ret = g_list_prepend (iids_ret, g_strdup (info->iid));
+ }
+
+ return iids_ret;
+}
+
+static void
+dialog_mapped (GtkWidget *w,
+ gpointer data)
+{
+ while (gtk_events_pending ()) {
+ gtk_main_iteration ();
+ }
+}
+
+static gboolean
+prepare_importer_page (GnomeDruidPage *page,
+
+ GnomeDruid *druid,
+ SWData *data)
+{
+ GtkWidget *dialog;
+ ImportDialogPage *import;
+ GList *l, *importers;
+ GtkWidget *dummy;
+ int running = 0;
+
+ dialog = gnome_message_box_new (_("Please wait...\nScanning for existing setups"), GNOME_MESSAGE_BOX_INFO, NULL);
+ gtk_signal_connect (GTK_OBJECT (dialog), "map",
+ GTK_SIGNAL_FUNC (dialog_mapped), NULL);
+ gtk_window_set_title (GTK_WINDOW (dialog), _("Starting Intelligent Importers"));
+ gtk_widget_show_all (dialog);
+ while (gtk_events_pending ()) {
+ gtk_main_iteration ();
+ }
+
+ import = data->import_page;
+ importers = get_intelligent_importers ();
+ if (importers == NULL) {
+ /* No importers, go directly to finish, do not pass go
+ Do not collect $200 */
+ gnome_druid_set_page (druid, GNOME_DRUID_PAGE (data->finish))
+;
+ gtk_widget_destroy (dialog);
+ return TRUE;
+ }
+
+ for (l = importers; l; l = l->next) {
+ IntelligentImporterData *id;
+ CORBA_Environment ev;
+ gboolean can_run;
+ char *text[1];
+
+ id = g_new0 (IntelligentImporterData, 1);
+ id->iid = g_strdup (l->data);
+
+ CORBA_exception_init (&ev);
+ id->object = oaf_activate_from_id ((char *) id->iid, 0, NULL, &ev);
+ if (BONOBO_EX (&ev)) {
+ g_warning ("Could not start %s:%s", id->iid,
+ CORBA_exception_id (&ev));
+
+ CORBA_exception_free (&ev);
+ /* Clean up the IID */
+ g_free (id->iid);
+ g_free (id);
+ continue;
+ }
+
+ if (id->object == CORBA_OBJECT_NIL) {
+ g_warning ("Could not activate component %s", id->iid);
+ CORBA_exception_free (&ev);
+
+ g_free (id->iid);
+ g_free (id);
+ continue;
+ }
+
+ can_run = GNOME_Evolution_IntelligentImporter_canImport (id->object, &ev);
+ if (BONOBO_EX (&ev)) {
+ g_warning ("Could not call canImport(%s): %s", id->iid,
+ CORBA_exception_id (&ev));
+ bonobo_object_release_unref (id->object, &ev);
+ CORBA_exception_free (&ev);
+
+ g_free (id->iid);
+ g_free (id);
+ continue;
+ }
+
+ if (can_run == FALSE) {
+ bonobo_object_release_unref (id->object, &ev);
+ CORBA_exception_free (&ev);
+ g_free (id->iid);
+ g_free (id);
+ continue;
+ }
+
+ running++;
+ id->name = GNOME_Evolution_IntelligentImporter__get_importername (id->object, &ev);
+ if (BONOBO_EX (&ev)) {
+ g_warning ("Could not get name(%s): %s", id->iid,
+ CORBA_exception_id (&ev));
+ bonobo_object_release_unref (id->object, &ev);
+ CORBA_exception_free (&ev);
+ g_free (id->iid);
+ g_free (id);
+ continue;
+ }
+
+ id->blurb = GNOME_Evolution_IntelligentImporter__get_message (id->object, &ev);
+ if (BONOBO_EX (&ev)) {
+ g_warning ("Could not get message(%s): %s",
+ id->iid, CORBA_exception_id (&ev));
+ bonobo_object_release_unref (id->object, &ev);
+ CORBA_exception_free (&ev);
+ g_free (id->iid);
+ CORBA_free (id->name);
+ g_free (id);
+ continue;
+ }
+
+ id->control = Bonobo_Unknown_queryInterface (id->object,
+ "IDL:Bonobo/Control:1.0", &ev);
+ if (BONOBO_EX (&ev)) {
+ g_warning ("Could not QI for Bonobo/Control:1.0 %s:%s",
+ id->iid, CORBA_exception_id (&ev));
+ bonobo_object_release_unref (id->object, &ev);
+ CORBA_exception_free (&ev);
+ g_free (id->iid);
+ CORBA_free (id->name);
+ CORBA_free (id->blurb);
+ continue;
+ }
+
+ if (id->control != CORBA_OBJECT_NIL) {
+ id->widget = bonobo_widget_new_control_from_objref (id->control, CORBA_OBJECT_NIL);
+ gtk_widget_show (id->widget);
+ } else {
+ id->widget = gtk_label_new ("");
+ gtk_widget_show (id->widget);
+ }
+
+ CORBA_exception_free (&ev);
+
+ import->importers = g_list_prepend (import->importers, id);
+ gtk_notebook_prepend_page (GTK_NOTEBOOK (import->placeholder),
+ id->widget, NULL);
+ text[0] = id->name;
+ gtk_clist_prepend (GTK_CLIST (import->clist), text);
+ }
+
+ if (running == 0) {
+ gnome_druid_set_page (druid, GNOME_DRUID_PAGE (data->finish));
+ gtk_widget_destroy (dialog);
+ return TRUE;
+ }
+
+ import->running = running;
+ dummy = gtk_drawing_area_new ();
+ gtk_widget_show (dummy);
+ gtk_notebook_append_page (GTK_NOTEBOOK (import->placeholder), dummy, NULL);
+ /* Set the start to the blank page */
+ gtk_notebook_set_page (GTK_NOTEBOOK (import->placeholder), running);
+
+ gtk_widget_destroy (dialog);
+ return FALSE;
+}
+
+static void
+select_row_cb (GtkCList *clist,
+ int row,
+ int column,
+ GdkEvent *ev,
+ SWData *data)
+{
+ ImportDialogPage *page;
+
+ page = data->import_page;
+ gtk_notebook_set_page (GTK_NOTEBOOK (page->placeholder), row);
+}
+
+static void
+unselect_row_cb (GtkCList *clist,
+ int row,
+ int column,
+ GdkEvent *ev,
+ SWData *data)
+{
+ ImportDialogPage *page;
+
+ page = data->import_page;
+ if (clist->selection == NULL) {
+ gtk_notebook_set_page (GTK_NOTEBOOK (page->placeholder), page->running);
+ } else {
+ gtk_notebook_set_page (GTK_NOTEBOOK (page->placeholder),
+ GPOINTER_TO_INT (clist->selection->data));
+ }
+}
+
+static ImportDialogPage *
+make_importer_page (SWData *data)
+{
+ ImportDialogPage *page;
+ char *titles[1];
+ GtkWidget *hbox, *sw;
+
+ g_return_val_if_fail (data != NULL, NULL);
+
+ page = g_new0 (ImportDialogPage, 1);
+ page->page = glade_xml_get_widget (data->wizard, "import-page");
+ g_return_val_if_fail (page->page != NULL, NULL);
+
+ gtk_signal_connect (GTK_OBJECT (page->page), "prepare",
+ GTK_SIGNAL_FUNC (prepare_importer_page), data);
+ page->vbox = GNOME_DRUID_PAGE_STANDARD (page->page)->vbox;
+
+ titles[0] = ".";
+ page->clist = gtk_clist_new_with_titles (1, titles);
+ gtk_clist_column_titles_hide (GTK_CLIST (page->clist));
+ gtk_clist_set_selection_mode (GTK_CLIST (page->clist), GTK_SELECTION_MULTIPLE);
+ gtk_signal_connect (GTK_OBJECT (page->clist), "select-row",
+ GTK_SIGNAL_FUNC (select_row_cb), data);
+ gtk_signal_connect (GTK_OBJECT (page->clist), "unselect-row",
+ GTK_SIGNAL_FUNC (unselect_row_cb), data);
+
+ hbox = gtk_hbox_new (FALSE, 2);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 2);
+ gtk_box_pack_start (GTK_BOX (page->vbox), hbox, TRUE, TRUE, 0);
+
+ sw = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
+ GTK_POLICY_AUTOMATIC,
+ GTK_POLICY_AUTOMATIC);
+ gtk_widget_set_usize (sw, 300, 150);
+ gtk_container_add (GTK_CONTAINER (sw), page->clist);
+ gtk_box_pack_start (GTK_BOX (hbox), sw, FALSE, FALSE, 0);
+
+ page->placeholder = gtk_notebook_new ();
+ gtk_notebook_set_show_tabs (GTK_NOTEBOOK (page->placeholder), FALSE);
+ gtk_box_pack_start (GTK_BOX (hbox), page->placeholder, TRUE, TRUE, 0);
+
+ return page;
+}
+
+static void
+startup_wizard_cancel (GnomeDruid *druid,
+ SWData *data)
+{
+ /* Free data */
+ data->cancel = TRUE;
+ gtk_widget_destroy (data->dialog);
+ gtk_main_quit ();
+}
+
+gboolean
+e_shell_startup_wizard_create (void)
+{
+ SWData *data;
+ CORBA_Environment ev;
+ gboolean runbefore;
+
+ data = g_new0 (SWData, 1);
+
+ CORBA_exception_init (&ev);
+ data->db = bonobo_get_object ("wombat:", "Bonobo/ConfigDatabase", &ev);
+ if (BONOBO_EX (&ev) || data->db == CORBA_OBJECT_NIL) {
+ g_warning ("Error starting wombat: (%s)", CORBA_exception_id (&ev));
+ CORBA_exception_free (&ev);
+ g_free (data);
+
+ return FALSE;
+ }
+
+ runbefore = bonobo_config_get_boolean (data->db, "/Shell/RunBefore", &ev);
+ CORBA_exception_free (&ev);
+
+ if (runbefore == TRUE) {
+ g_print ("Already run\n");
+ bonobo_object_release_unref (data->db, NULL);
+ g_free (data);
+
+ return TRUE;
+ }
+
+ data->wizard = glade_xml_new (EVOLUTION_GLADEDIR "/evolution-startup-wizard.glade", NULL);
+ g_return_val_if_fail (data->wizard != NULL, FALSE);
+ data->dialog = glade_xml_get_widget (data->wizard, "startup-wizard");
+ g_return_val_if_fail (data->dialog != NULL, FALSE);
+ gtk_window_set_wmclass (GTK_WINDOW (data->dialog), "startup-wizard",
+ "Evolution:shell");
+
+ page_hash = g_hash_table_new (NULL, NULL);
+ data->druid = glade_xml_get_widget (data->wizard, "startup-druid");
+ g_return_val_if_fail (data->druid != NULL, FALSE);
+ gnome_druid_set_buttons_sensitive (GNOME_DRUID (data->druid),
+ FALSE, TRUE, FALSE);
+
+ gtk_signal_connect (GTK_OBJECT (data->druid), "cancel",
+ GTK_SIGNAL_FUNC (startup_wizard_cancel), data);
+
+ data->start = glade_xml_get_widget (data->wizard, "start-page");
+ data->finish = glade_xml_get_widget (data->wizard, "done-page");
+ g_return_val_if_fail (data->start != NULL, FALSE);
+ g_return_val_if_fail (data->finish != NULL, FALSE);
+ gtk_signal_connect (GTK_OBJECT (data->finish), "finish",
+ GTK_SIGNAL_FUNC (finish_func), data);
+
+ make_mail_dialog_pages (data);
+ data->id_page = make_identity_page (data);
+ data->source_page = make_receive_page (data);
+ data->extra_page = make_extra_page (data);
+ data->transport_page = make_transport_page (data);
+ data->management_page = make_management_page (data);
+
+ data->timezone_page = make_timezone_page (data);
+ data->import_page = make_importer_page (data);
+
+ g_return_val_if_fail (data->id_page != NULL, FALSE);
+ g_return_val_if_fail (data->source_page != NULL, FALSE);
+ g_return_val_if_fail (data->extra_page != NULL, FALSE);
+ g_return_val_if_fail (data->transport_page != NULL, FALSE);
+ g_return_val_if_fail (data->management_page != NULL, FALSE);
+ g_return_val_if_fail (data->timezone_page != NULL, FALSE);
+ g_return_val_if_fail (data->import_page != NULL, FALSE);
+
+ gnome_druid_set_buttons_sensitive (data->druid, FALSE, TRUE, TRUE);
+ gtk_widget_show_all (data->dialog);
+
+ gtk_main ();
+
+ /* Sync database */
+ bonobo_config_set_boolean (data->db, "/Shell/RunBefore", TRUE, &ev);
+ Bonobo_ConfigDatabase_sync (data->db, &ev);
+ bonobo_object_release_unref (data->db, NULL);
+ CORBA_exception_free (&ev);
+
+ return !data->cancel;
+}
diff --git a/shell/e-shell.c b/shell/e-shell.c
index 08a9ee4607..ea6e25bcd4 100644
--- a/shell/e-shell.c
+++ b/shell/e-shell.c
@@ -961,9 +961,24 @@ e_shell_construct (EShell *shell,
can tell the components we are here. */
set_owner_on_components (shell);
- /* Run the intelligent importers to find see if any data needs
- importing. */
- intelligent_importer_init ();
+ if (show_splash) {
+ gtk_widget_destroy (splash);
+ }
+
+ if (e_shell_startup_wizard_create () == FALSE) {
+ /* FIXME: Need to kill all components somehow */
+ exit (0);
+ }
+ shortcut_path = g_concat_dir_and_file (local_directory, "shortcuts.xml");
+ priv->shortcuts = e_shortcuts_new (priv->storage_set,
+ priv->folder_type_registry,
+ shortcut_path);
+ g_assert (priv->shortcuts != NULL);
+
+ if (e_shortcuts_get_num_groups (priv->shortcuts) == 0)
+ e_shortcuts_add_default_group (priv->shortcuts);
+
+ g_free (shortcut_path);
if (show_splash)
gtk_widget_destroy (splash);
diff --git a/shell/evolution-wizard.c b/shell/evolution-wizard.c
new file mode 100644
index 0000000000..0d21cd9eed
--- /dev/null
+++ b/shell/evolution-wizard.c
@@ -0,0 +1,394 @@
+/*
+ * evolution-wizard.c
+ *
+ * Copyright (C) 2001 Ximian, Inc.
+ *
+ * Authors: Iain Holmes <iain@ximian.com>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <gtk/gtksignal.h>
+#include <gtk/gtkmarshal.h>
+#include <gtk/gtktypeutils.h>
+#include <bonobo/bonobo-exception.h>
+#include <bonobo/bonobo-main.h>
+#include <bonobo/bonobo-event-source.h>
+
+#include "evolution-wizard.h"
+#include "Evolution.h"
+
+struct _EvolutionWizardPrivate {
+ EvolutionWizardGetControlFn get_fn;
+ BonoboEventSource *event_source;
+
+ void *closure;
+ int page_count;
+};
+
+enum {
+ NEXT,
+ PREPARE,
+ BACK,
+ FINISH,
+ CANCEL,
+ HELP,
+ LAST_SIGNAL
+};
+
+#define PARENT_TYPE BONOBO_X_OBJECT_TYPE
+
+static GtkObjectClass *parent_class;
+static guint32 signals[LAST_SIGNAL] = { 0 };
+
+static CORBA_long
+impl_GNOME_Evolution_Wizard__get_pageCount (PortableServer_Servant servant,
+ CORBA_Environment *ev)
+{
+ BonoboObject *bonobo_object;
+ EvolutionWizard *wizard;
+ EvolutionWizardPrivate *priv;
+
+ bonobo_object = bonobo_object_from_servant (servant);
+ wizard = EVOLUTION_WIZARD (bonobo_object);
+ priv = wizard->priv;
+
+ return priv->page_count;
+}
+
+static Bonobo_Control
+impl_GNOME_Evolution_Wizard_getControl (PortableServer_Servant servant,
+ CORBA_long pagenumber,
+ CORBA_Environment *ev)
+{
+ BonoboObject *bonobo_object;
+ EvolutionWizard *wizard;
+ EvolutionWizardPrivate *priv;
+ BonoboControl *control;
+
+ bonobo_object = bonobo_object_from_servant (servant);
+ wizard = EVOLUTION_WIZARD (bonobo_object);
+ priv = wizard->priv;
+
+ if (pagenumber < 0 || pagenumber >= priv->page_count) {
+ CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
+ ex_GNOME_Evolution_Wizard_NoPage, NULL);
+ return CORBA_OBJECT_NIL;
+ }
+
+ control = priv->get_fn (wizard, pagenumber, priv->closure);
+ if (control == NULL)
+ return CORBA_OBJECT_NIL;
+
+ return (Bonobo_Control) CORBA_Object_duplicate (BONOBO_OBJREF (control), ev);
+}
+
+static void
+impl_GNOME_Evolution_Wizard_notifyAction (PortableServer_Servant servant,
+ CORBA_long pagenumber,
+ GNOME_Evolution_Wizard_Action action,
+ CORBA_Environment *ev)
+{
+ BonoboObject *bonobo_object;
+ EvolutionWizard *wizard;
+ EvolutionWizardPrivate *priv;
+
+ bonobo_object = bonobo_object_from_servant (servant);
+ wizard = EVOLUTION_WIZARD (bonobo_object);
+ priv = wizard->priv;
+
+ if (pagenumber < 0 || pagenumber >= priv->page_count) {
+ CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
+ ex_GNOME_Evolution_Wizard_NoPage, NULL);
+ return;
+ }
+
+ g_print ("Emit something\n");
+ switch (action) {
+ case GNOME_Evolution_Wizard_NEXT:
+ gtk_signal_emit (GTK_OBJECT (bonobo_object), signals[NEXT],
+ pagenumber);
+ break;
+
+ case GNOME_Evolution_Wizard_PREPARE:
+ gtk_signal_emit (GTK_OBJECT (bonobo_object), signals[PREPARE],
+ pagenumber);
+ break;
+
+ case GNOME_Evolution_Wizard_BACK:
+ gtk_signal_emit (GTK_OBJECT (bonobo_object), signals[BACK],
+ pagenumber);
+ break;
+
+ case GNOME_Evolution_Wizard_FINISH:
+ g_print ("Emit finish\n");
+ gtk_signal_emit (GTK_OBJECT (bonobo_object), signals[FINISH],
+ pagenumber);
+ break;
+
+ case GNOME_Evolution_Wizard_CANCEL:
+ gtk_signal_emit (GTK_OBJECT (bonobo_object), signals[CANCEL],
+ pagenumber);
+ break;
+
+ case GNOME_Evolution_Wizard_HELP:
+ gtk_signal_emit (GTK_OBJECT (bonobo_object), signals[HELP],
+ pagenumber);
+ break;
+
+ default:
+ break;
+ }
+}
+
+
+static void
+evolution_wizard_destroy (GtkObject *object)
+{
+ EvolutionWizard *wizard;
+
+ wizard = EVOLUTION_WIZARD (object);
+ if (wizard->priv == NULL) {
+ return;
+ }
+
+ g_free (wizard->priv);
+ wizard->priv = NULL;
+
+ parent_class->destroy (object);
+}
+
+static void
+evolution_wizard_class_init (EvolutionWizardClass *klass)
+{
+ GtkObjectClass *object_class;
+ POA_GNOME_Evolution_Wizard__epv *epv = &klass->epv;
+
+ object_class = GTK_OBJECT_CLASS (klass);
+ object_class->destroy = evolution_wizard_destroy;
+
+ signals[NEXT] = gtk_signal_new ("next", GTK_RUN_FIRST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (EvolutionWizardClass, next),
+ gtk_marshal_NONE__INT, GTK_TYPE_NONE,
+ 1, GTK_TYPE_INT);
+ signals[PREPARE] = gtk_signal_new ("prepare", GTK_RUN_FIRST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (EvolutionWizardClass, prepare),
+ gtk_marshal_NONE__INT, GTK_TYPE_NONE,
+ 1, GTK_TYPE_INT);
+ signals[BACK] = gtk_signal_new ("back", GTK_RUN_FIRST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (EvolutionWizardClass, back),
+ gtk_marshal_NONE__INT, GTK_TYPE_NONE,
+ 1, GTK_TYPE_INT);
+ signals[FINISH] = gtk_signal_new ("finish", GTK_RUN_FIRST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (EvolutionWizardClass, finish),
+ gtk_marshal_NONE__INT, GTK_TYPE_NONE,
+ 1, GTK_TYPE_INT);
+ signals[CANCEL] = gtk_signal_new ("cancel", GTK_RUN_FIRST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (EvolutionWizardClass, cancel),
+ gtk_marshal_NONE__INT, GTK_TYPE_NONE,
+ 1, GTK_TYPE_INT);
+ signals[HELP] = gtk_signal_new ("help", GTK_RUN_FIRST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (EvolutionWizardClass, help),
+ gtk_marshal_NONE__INT, GTK_TYPE_NONE,
+ 1, GTK_TYPE_INT);
+
+ gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
+
+ parent_class = gtk_type_class (PARENT_TYPE);
+
+ epv->_get_pageCount = impl_GNOME_Evolution_Wizard__get_pageCount;
+ epv->getControl = impl_GNOME_Evolution_Wizard_getControl;
+ epv->notifyAction = impl_GNOME_Evolution_Wizard_notifyAction;
+}
+
+static void
+evolution_wizard_init (EvolutionWizard *wizard)
+{
+ wizard->priv = g_new0 (EvolutionWizardPrivate, 1);
+}
+
+BONOBO_X_TYPE_FUNC_FULL (EvolutionWizard, GNOME_Evolution_Wizard,
+ PARENT_TYPE, evolution_wizard);
+
+EvolutionWizard *
+evolution_wizard_construct (EvolutionWizard *wizard,
+ BonoboEventSource *event_source,
+ EvolutionWizardGetControlFn get_fn,
+ int num_pages,
+ void *closure)
+{
+ EvolutionWizardPrivate *priv;
+
+ g_return_val_if_fail (BONOBO_IS_EVENT_SOURCE (event_source), NULL);
+ g_return_val_if_fail (IS_EVOLUTION_WIZARD (wizard), NULL);
+
+ priv = wizard->priv;
+ priv->get_fn = get_fn;
+ priv->page_count = num_pages;
+ priv->closure = closure;
+
+ priv->event_source = event_source;
+ bonobo_object_add_interface (BONOBO_OBJECT (wizard),
+ BONOBO_OBJECT (event_source));
+
+ return wizard;
+}
+
+EvolutionWizard *
+evolution_wizard_new_full (EvolutionWizardGetControlFn get_fn,
+ int num_pages,
+ BonoboEventSource *event_source,
+ void *closure)
+{
+ EvolutionWizard *wizard;
+
+ g_return_val_if_fail (num_pages > 0, NULL);
+ g_return_val_if_fail (BONOBO_IS_EVENT_SOURCE (event_source), NULL);
+
+ wizard = gtk_type_new (evolution_wizard_get_type ());
+
+ return evolution_wizard_construct (wizard, event_source, get_fn, num_pages, closure);
+}
+
+EvolutionWizard *
+evolution_wizard_new (EvolutionWizardGetControlFn get_fn,
+ int num_pages,
+ void *closure)
+{
+ BonoboEventSource *event_source;
+
+ g_return_val_if_fail (num_pages > 0, NULL);
+
+ event_source = bonobo_event_source_new ();
+
+ return evolution_wizard_new_full (get_fn, num_pages, event_source, closure);
+}
+
+void
+evolution_wizard_set_buttons_sensitive (EvolutionWizard *wizard,
+ gboolean back_sensitive,
+ gboolean next_sensitive,
+ gboolean cancel_sensitive,
+ CORBA_Environment *opt_ev)
+{
+ EvolutionWizardPrivate *priv;
+ CORBA_Environment ev;
+ CORBA_any any;
+ CORBA_short s;
+
+ g_return_if_fail (IS_EVOLUTION_WIZARD (wizard));
+
+ priv = wizard->priv;
+
+ if (opt_ev == NULL) {
+ CORBA_exception_init (&ev);
+ } else {
+ ev = *opt_ev;
+ }
+
+ s = back_sensitive << 2 | next_sensitive << 1 | cancel_sensitive;
+ any._type = (CORBA_TypeCode) TC_short;
+ any._value = &s;
+
+ bonobo_event_source_notify_listeners (priv->event_source,
+ EVOLUTION_WIZARD_SET_BUTTONS_SENSITIVE,
+ &any, &ev);
+ if (opt_ev == NULL && BONOBO_EX (&ev)) {
+ g_warning ("ERROR(%s): %s", __FUNCTION__, CORBA_exception_id (&ev));
+ }
+
+ if (opt_ev == NULL) {
+ CORBA_exception_free (&ev);
+ }
+}
+
+void
+evolution_wizard_set_show_finish (EvolutionWizard *wizard,
+ gboolean show_finish,
+ CORBA_Environment *opt_ev)
+{
+ EvolutionWizardPrivate *priv;
+ CORBA_Environment ev;
+ CORBA_any any;
+ CORBA_boolean b;
+
+ g_return_if_fail (IS_EVOLUTION_WIZARD (wizard));
+
+ priv = wizard->priv;
+ if (opt_ev == NULL) {
+ CORBA_exception_init (&ev);
+ } else {
+ ev = *opt_ev;
+ }
+
+ b = show_finish;
+ any._type = (CORBA_TypeCode) TC_boolean;
+ any._value = &b;
+
+ bonobo_event_source_notify_listeners (priv->event_source,
+ EVOLUTION_WIZARD_SET_SHOW_FINISH,
+ &any, &ev);
+ if (opt_ev == NULL && BONOBO_EX (&ev)) {
+ g_warning ("ERROR(%s): %s", __FUNCTION__, CORBA_exception_id (&ev));
+ }
+
+ if (opt_ev == NULL) {
+ CORBA_exception_free (&ev);
+ }
+}
+
+void
+evolution_wizard_set_page (EvolutionWizard *wizard,
+ int page_number,
+ CORBA_Environment *opt_ev)
+{
+ EvolutionWizardPrivate *priv;
+ CORBA_Environment ev;
+ CORBA_any any;
+ CORBA_short s;
+
+ g_return_if_fail (IS_EVOLUTION_WIZARD (wizard));
+
+ priv = wizard->priv;
+
+ g_return_if_fail (page_number >= 0 && page_number < priv->page_count);
+
+ if (opt_ev == NULL) {
+ CORBA_exception_init (&ev);
+ } else {
+ ev = *opt_ev;
+ }
+
+ s = page_number;
+ any._type = (CORBA_TypeCode) TC_short;
+ any._value = &s;
+
+ bonobo_event_source_notify_listeners (priv->event_source,
+ EVOLUTION_WIZARD_SET_PAGE,
+ &any, &ev);
+
+ if (opt_ev == NULL && BONOBO_EX (&ev)) {
+ g_warning ("ERROR(%s): %s", __FUNCTION__, CORBA_exception_id (&ev));
+ }
+
+ if (opt_ev == NULL) {
+ CORBA_exception_free (&ev);
+ }
+}
+
+BonoboEventSource *
+evolution_wizard_get_event_source (EvolutionWizard *wizard)
+{
+ g_return_val_if_fail (IS_EVOLUTION_WIZARD (wizard), NULL);
+
+ return wizard->priv->event_source;
+}
diff --git a/shell/evolution-wizard.h b/shell/evolution-wizard.h
new file mode 100644
index 0000000000..617d7bb3a5
--- /dev/null
+++ b/shell/evolution-wizard.h
@@ -0,0 +1,86 @@
+/*
+ * evolution-wizard.h
+ *
+ * Copyright (C) 2001 Ximian, Inc.
+ *
+ * Authors: Iain Holmes <iain@ximian.com>
+ */
+
+#ifndef __EVOLUTION_WIZARD_H__
+#define __EVOLUTION_WIZARD_H__
+
+#include <bonobo/bonobo-control.h>
+#include <bonobo/bonobo-event-source.h>
+
+#include <Evolution.h>
+
+BEGIN_GNOME_DECLS
+
+typedef struct _EvolutionWizard EvolutionWizard;
+typedef struct _EvolutionWizardPrivate EvolutionWizardPrivate;
+
+#define EVOLUTION_WIZARD_SET_PAGE "GNOME::Evolution::Wizard_setPage"
+#define EVOLUTION_WIZARD_SET_SHOW_FINISH "GNOME::Evolution::Wizard_setShowFinish"
+#define EVOLUTION_WIZARD_SET_BUTTONS_SENSITIVE "GNOME::Evolution::Wizard_setButtonsSensitive"
+
+#define EVOLUTION_WIZARD_TYPE (evolution_wizard_get_type ())
+#define EVOLUTION_WIZARD(o) (GTK_CHECK_CAST ((o), EVOLUTION_WIZARD_TYPE, EvolutionWizard))
+#define EVOLUTION_WIZARD_CLASS(k) (GTK_CHECK_CLASS_CAST((k), EVOLUTION_WIZARD_TYPE, EvolutionWizardClass))
+#define IS_EVOLUTION_WIZARD(o) (GTK_CHECK_TYPE ((o), EVOLUTION_WIZARD_TYPE))
+#define IS_EVOLUTION_WIZARD_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), EVOLUTION_WIZARD_TYPE))
+
+typedef BonoboControl *(* EvolutionWizardGetControlFn) (EvolutionWizard *wizard,
+ int page_number,
+ void *closure);
+
+struct _EvolutionWizard {
+ BonoboXObject object;
+
+ EvolutionWizardPrivate *priv;
+};
+
+typedef struct {
+ BonoboXObjectClass parent_class;
+
+ POA_GNOME_Evolution_Wizard__epv epv;
+
+ void (* next) (EvolutionWizard *wizard, int page_number);
+ void (* prepare) (EvolutionWizard *wizard, int page_number);
+ void (* back) (EvolutionWizard *wizard, int page_number);
+ void (* finish) (EvolutionWizard *wizard, int page_number);
+ void (* cancel) (EvolutionWizard *wizard, int page_number);
+ void (* help) (EvolutionWizard *wizard, int page_number);
+} EvolutionWizardClass;
+
+GtkType evolution_wizard_get_type (void);
+
+EvolutionWizard *evolution_wizard_construct (EvolutionWizard *wizard,
+ BonoboEventSource *event_source,
+ EvolutionWizardGetControlFn get_fn,
+ int num_pages,
+ void *closure);
+EvolutionWizard *evolution_wizard_new_full (EvolutionWizardGetControlFn get_fn,
+ int num_pages,
+ BonoboEventSource *event_source,
+ void *closure);
+EvolutionWizard *evolution_wizard_new (EvolutionWizardGetControlFn get_fn,
+ int num_pages,
+ void *closure);
+
+void evolution_wizard_set_buttons_sensitive (EvolutionWizard *wizard,
+ gboolean back_sensitive,
+ gboolean next_sensitive,
+ gboolean cancel_sensitive,
+ CORBA_Environment *opt_ev);
+void evolution_wizard_set_show_finish (EvolutionWizard *wizard,
+ gboolean show_finish,
+ CORBA_Environment *opt_ev);
+void evolution_wizard_set_page (EvolutionWizard *wizard,
+ int page_number,
+ CORBA_Environment *opt_ev);
+
+BonoboEventSource * evolution_wizard_get_event_source (EvolutionWizard *wizard);
+
+END_GNOME_DECLS
+
+#endif /* __EVOLUTION_WIZARD_H__ */
diff --git a/shell/glade/Makefile.am b/shell/glade/Makefile.am
index 9a29a07b2c..4ef31d8057 100644
--- a/shell/glade/Makefile.am
+++ b/shell/glade/Makefile.am
@@ -2,6 +2,7 @@ gladedir = $(datadir)/evolution/glade
glade_DATA = \
e-active-connection-dialog.glade \
- e-shell-folder-creation-dialog.glade
+ e-shell-folder-creation-dialog.glade \
+ evolution-startup-wizard.glade
EXTRA_DIST = $(glade_DATA)
diff --git a/shell/glade/evolution-startup-wizard.glade b/shell/glade/evolution-startup-wizard.glade
new file mode 100644
index 0000000000..092382a1a2
--- /dev/null
+++ b/shell/glade/evolution-startup-wizard.glade
@@ -0,0 +1,252 @@
+<?xml version="1.0"?>
+<GTK-Interface>
+
+<project>
+ <name>Evolution-startup-wizard</name>
+ <program_name>evolution-startup-wizard</program_name>
+ <directory></directory>
+ <source_directory>src</source_directory>
+ <pixmaps_directory>pixmaps</pixmaps_directory>
+ <language>C</language>
+ <gnome_support>True</gnome_support>
+ <gettext_support>True</gettext_support>
+</project>
+
+<widget>
+ <class>GtkWindow</class>
+ <name>startup-wizard</name>
+ <width>687</width>
+ <height>0</height>
+ <visible>False</visible>
+ <title>window1</title>
+ <type>GTK_WINDOW_TOPLEVEL</type>
+ <position>GTK_WIN_POS_NONE</position>
+ <modal>False</modal>
+ <allow_shrink>False</allow_shrink>
+ <allow_grow>True</allow_grow>
+ <auto_shrink>False</auto_shrink>
+
+ <widget>
+ <class>GnomeDruid</class>
+ <name>startup-druid</name>
+
+ <widget>
+ <class>GnomeDruidPageStart</class>
+ <name>start-page</name>
+ <title>First Time Startup Configuration</title>
+ <text>Welcome to the Evolution first time configuration assistant.
+
+This will help you:
+ - configure your email settings
+ - set your timezone.
+ - import your old email and contacts
+
+What you will need:
+ - email server information (ask your email administrator for help)
+
+First a directory will be created in your home directory for Evolution to
+store it's configuration settings.</text>
+ <title_color>255,255,255</title_color>
+ <text_color>0,0,0</text_color>
+ <background_color>0,0,1</background_color>
+ <logo_background_color>255,255,255</logo_background_color>
+ <textbox_color>255,255,255</textbox_color>
+ </widget>
+
+ <widget>
+ <class>GnomeDruidPageStandard</class>
+ <name>identity-page</name>
+ <title>Identity</title>
+ <title_color>255,255,255</title_color>
+ <background_color>0,0,1</background_color>
+ <logo_background_color>255,255,255</logo_background_color>
+
+ <widget>
+ <class>GtkVBox</class>
+ <child_name>GnomeDruidPageStandard:vbox</child_name>
+ <name>druid-vbox2</name>
+ <homogeneous>False</homogeneous>
+ <spacing>0</spacing>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+
+ <widget>
+ <class>Placeholder</class>
+ </widget>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GnomeDruidPageStandard</class>
+ <name>receive-page</name>
+ <title>Receiving Email</title>
+ <title_color>255,255,255</title_color>
+ <background_color>0,0,1</background_color>
+ <logo_background_color>255,255,255</logo_background_color>
+
+ <widget>
+ <class>GtkVBox</class>
+ <child_name>GnomeDruidPageStandard:vbox</child_name>
+ <name>druid-vbox3</name>
+ <homogeneous>False</homogeneous>
+ <spacing>0</spacing>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+
+ <widget>
+ <class>Placeholder</class>
+ </widget>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GnomeDruidPageStandard</class>
+ <name>extra-page</name>
+ <title>Receiving Email</title>
+ <title_color>255,255,255</title_color>
+ <background_color>0,0,1</background_color>
+ <logo_background_color>255,255,255</logo_background_color>
+
+ <widget>
+ <class>GtkVBox</class>
+ <child_name>GnomeDruidPageStandard:vbox</child_name>
+ <name>druid-vbox8</name>
+ <homogeneous>False</homogeneous>
+ <spacing>0</spacing>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+
+ <widget>
+ <class>Placeholder</class>
+ </widget>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GnomeDruidPageStandard</class>
+ <name>send-page</name>
+ <title>Sending Email</title>
+ <title_color>255,255,255</title_color>
+ <background_color>0,0,1</background_color>
+ <logo_background_color>255,255,255</logo_background_color>
+
+ <widget>
+ <class>GtkVBox</class>
+ <child_name>GnomeDruidPageStandard:vbox</child_name>
+ <name>druid-vbox5</name>
+ <homogeneous>False</homogeneous>
+ <spacing>0</spacing>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+
+ <widget>
+ <class>Placeholder</class>
+ </widget>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GnomeDruidPageStandard</class>
+ <name>management-page</name>
+ <title>Account Management</title>
+ <title_color>255,255,255</title_color>
+ <background_color>0,0,1</background_color>
+ <logo_background_color>255,255,255</logo_background_color>
+
+ <widget>
+ <class>GtkVBox</class>
+ <child_name>GnomeDruidPageStandard:vbox</child_name>
+ <name>druid-vbox9</name>
+ <homogeneous>False</homogeneous>
+ <spacing>0</spacing>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+
+ <widget>
+ <class>Placeholder</class>
+ </widget>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GnomeDruidPageStandard</class>
+ <name>timezone-page</name>
+ <title>Timezone </title>
+ <title_color>255,255,255</title_color>
+ <background_color>0,0,1</background_color>
+ <logo_background_color>255,255,255</logo_background_color>
+
+ <widget>
+ <class>GtkVBox</class>
+ <child_name>GnomeDruidPageStandard:vbox</child_name>
+ <name>druid-vbox6</name>
+ <homogeneous>False</homogeneous>
+ <spacing>0</spacing>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+
+ <widget>
+ <class>Placeholder</class>
+ </widget>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GnomeDruidPageStandard</class>
+ <name>import-page</name>
+ <title>Importing Data</title>
+ <title_color>255,255,255</title_color>
+ <background_color>0,0,1</background_color>
+ <logo_background_color>255,255,255</logo_background_color>
+
+ <widget>
+ <class>GtkVBox</class>
+ <child_name>GnomeDruidPageStandard:vbox</child_name>
+ <name>druid-vbox7</name>
+ <homogeneous>False</homogeneous>
+ <spacing>0</spacing>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+
+ <widget>
+ <class>Placeholder</class>
+ </widget>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GnomeDruidPageFinish</class>
+ <name>done-page</name>
+ <title>Done</title>
+ <text>Your configuration is complete.</text>
+ <background_color>0,0,1</background_color>
+ <logo_background_color>255,255,255</logo_background_color>
+ <textbox_color>255,255,255</textbox_color>
+ <text_color>0,0,0</text_color>
+ <title_color>255,255,255</title_color>
+ </widget>
+ </widget>
+</widget>
+
+</GTK-Interface>