aboutsummaryrefslogtreecommitdiffstats
path: root/mail/mail-config-druid.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/mail-config-druid.c')
-rw-r--r--mail/mail-config-druid.c767
1 files changed, 767 insertions, 0 deletions
diff --git a/mail/mail-config-druid.c b/mail/mail-config-druid.c
new file mode 100644
index 0000000000..9cc3283042
--- /dev/null
+++ b/mail/mail-config-druid.c
@@ -0,0 +1,767 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Authors:
+ * Jeffrey Stedfast <fejj@ximian.com>
+ * Dan Winship <danw@ximian.com>
+ * Iain Holmes <iain@ximian.com>
+ *
+ * Copyright 2001 Ximian, Inc. (www.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., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/utsname.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <gal/util/e-util.h>
+#include <glade/glade.h>
+#include <gtkhtml/gtkhtml.h>
+#include <libgnomeui/gnome-dialog.h>
+#include <libgnomeui/gnome-dialog-util.h>
+#include <libgnomeui/gnome-druid.h>
+#include <libgnomeui/gnome-druid-page-standard.h>
+#include <bonobo/bonobo-exception.h>
+
+#include "mail-config-druid.h"
+#include "mail-config.h"
+#include "mail-ops.h"
+#include "mail-session.h"
+#include "mail-account-gui.h"
+
+#include <evolution-wizard.h>
+#include <e-util/e-account.h>
+#include <e-util/e-icon-factory.h>
+
+typedef enum {
+ MAIL_CONFIG_WIZARD_PAGE_NONE = -1,
+ MAIL_CONFIG_WIZARD_PAGE_IDENTITY,
+ MAIL_CONFIG_WIZARD_PAGE_SOURCE,
+ MAIL_CONFIG_WIZARD_PAGE_EXTRA,
+ MAIL_CONFIG_WIZARD_PAGE_TRANSPORT,
+ MAIL_CONFIG_WIZARD_PAGE_MANAGEMENT,
+
+ MAIL_CONFIG_WIZARD_NUM_PAGES
+} MailConfigWizardPage;
+
+typedef struct {
+ /* Only one of these will be set */
+ GnomeDruid *druid;
+ EvolutionWizard *corba_wizard;
+
+ MailAccountGui *gui;
+
+ GPtrArray *interior_pages;
+ GnomeDruidPage *last_page;
+
+ gboolean identity_copied;
+ CamelProvider *last_source;
+ MailConfigWizardPage page;
+} MailConfigWizard;
+
+static void
+config_wizard_set_buttons_sensitive (MailConfigWizard *mcw,
+ gboolean prev_sensitive,
+ gboolean next_sensitive)
+{
+ if (mcw->corba_wizard) {
+ evolution_wizard_set_buttons_sensitive (mcw->corba_wizard,
+ prev_sensitive,
+ next_sensitive,
+ TRUE, NULL);
+ } else {
+ gnome_druid_set_buttons_sensitive (mcw->druid,
+ prev_sensitive,
+ next_sensitive,
+ TRUE, FALSE);
+ }
+}
+
+static void
+config_wizard_set_page (MailConfigWizard *mcw, MailConfigWizardPage page)
+{
+ if (mcw->corba_wizard)
+ evolution_wizard_set_page (mcw->corba_wizard, page, NULL);
+ else {
+ if (page < mcw->interior_pages->len)
+ gnome_druid_set_page (mcw->druid, mcw->interior_pages->pdata[page]);
+ else
+ gnome_druid_set_page (mcw->druid, mcw->last_page);
+ }
+}
+
+/* Identity Page */
+static void
+identity_changed (GtkWidget *widget, gpointer data)
+{
+ MailConfigWizard *mcw = data;
+ GtkWidget *incomplete;
+ gboolean next_sensitive;
+
+ if (mcw->page != MAIL_CONFIG_WIZARD_PAGE_IDENTITY)
+ return;
+
+ next_sensitive = mail_account_gui_identity_complete (mcw->gui, &incomplete);
+
+ config_wizard_set_buttons_sensitive (mcw, TRUE, next_sensitive);
+}
+
+static void
+identity_prepare (MailConfigWizard *mcw)
+{
+ mcw->page = MAIL_CONFIG_WIZARD_PAGE_IDENTITY;
+
+ if (!gtk_entry_get_text (mcw->gui->full_name)) {
+ char *uname;
+
+ uname = g_locale_to_utf8 (g_get_real_name (), -1, NULL, NULL, NULL);
+ gtk_entry_set_text (mcw->gui->full_name, uname ? uname : "");
+ g_free (uname);
+ }
+ identity_changed (NULL, mcw);
+}
+
+static gboolean
+identity_next (MailConfigWizard *mcw)
+{
+ if (!mcw->identity_copied) {
+ char *username;
+ const char *user;
+
+ /* Copy the username part of the email address into
+ * the Username field of the source and transport pages.
+ */
+ user = gtk_entry_get_text (mcw->gui->email_address);
+ username = g_strndup (user, strcspn (user, "@"));
+ gtk_entry_set_text (mcw->gui->source.username, username);
+ gtk_entry_set_text (mcw->gui->transport.username, username);
+ g_free (username);
+
+ mcw->identity_copied = TRUE;
+ }
+
+ return FALSE;
+}
+
+static void
+identity_activate_cb (GtkEntry *ent, gpointer user_data)
+{
+ MailConfigWizard *mcw = user_data;
+
+ if (mail_account_gui_identity_complete (mcw->gui, NULL) &&
+ !identity_next (mcw))
+ config_wizard_set_page (mcw, MAIL_CONFIG_WIZARD_PAGE_SOURCE);
+}
+
+/* Incoming mail Page */
+static void
+source_changed (GtkWidget *widget, gpointer data)
+{
+ MailConfigWizard *mcw = data;
+ GtkWidget *incomplete;
+ gboolean next_sensitive;
+
+ if (mcw->page != MAIL_CONFIG_WIZARD_PAGE_SOURCE)
+ return;
+
+ next_sensitive = mail_account_gui_source_complete (mcw->gui, &incomplete);
+
+ config_wizard_set_buttons_sensitive (mcw, TRUE, next_sensitive);
+}
+
+static void
+source_prepare (MailConfigWizard *mcw)
+{
+ mcw->page = MAIL_CONFIG_WIZARD_PAGE_SOURCE;
+ source_changed (NULL, mcw);
+}
+
+static gboolean
+source_next (MailConfigWizard *mcw)
+{
+ /* FIXME: if online, check that the data is good. */
+
+ if (mcw->gui->source.provider && mcw->gui->source.provider->extra_conf)
+ return FALSE;
+
+ /* Otherwise, skip to transport page. */
+ config_wizard_set_page (mcw, MAIL_CONFIG_WIZARD_PAGE_TRANSPORT);
+ return TRUE;
+}
+
+static void
+source_activate_cb (GtkEntry *ent, gpointer user_data)
+{
+ MailConfigWizard *mcw = user_data;
+
+ if (mail_account_gui_source_complete (mcw->gui, NULL) &&
+ !source_next (mcw))
+ config_wizard_set_page (mcw, MAIL_CONFIG_WIZARD_PAGE_EXTRA);
+}
+
+/* Extra Config Page */
+static void
+extra_prepare (MailConfigWizard *mcw)
+{
+ mcw->page = MAIL_CONFIG_WIZARD_PAGE_EXTRA;
+ if (mcw->gui->source.provider != mcw->last_source) {
+ mcw->last_source = mcw->gui->source.provider;
+ mail_account_gui_auto_detect_extra_conf (mcw->gui);
+ }
+}
+
+/* Transport Page */
+static gboolean
+transport_next (MailConfigWizard *mcw)
+{
+ /* FIXME: if online, check that the data is good. */
+ return FALSE;
+}
+
+static gboolean
+transport_back (MailConfigWizard *mcw)
+{
+ if (mcw->gui->source.provider && mcw->gui->source.provider->extra_conf)
+ return FALSE;
+ else {
+ config_wizard_set_page (mcw, MAIL_CONFIG_WIZARD_PAGE_SOURCE);
+ return TRUE;
+ }
+}
+
+static void
+transport_changed (GtkWidget *widget, gpointer data)
+{
+ MailConfigWizard *mcw = data;
+ GtkWidget *incomplete;
+ gboolean next_sensitive;
+
+ if (mcw->page != MAIL_CONFIG_WIZARD_PAGE_TRANSPORT)
+ return;
+
+ next_sensitive = mail_account_gui_transport_complete (mcw->gui, &incomplete);
+
+ config_wizard_set_buttons_sensitive (mcw, TRUE, next_sensitive);
+}
+
+static void
+transport_prepare (MailConfigWizard *mcw)
+{
+ mcw->page = MAIL_CONFIG_WIZARD_PAGE_TRANSPORT;
+ transport_changed (NULL, mcw);
+}
+
+static void
+transport_activate_cb (GtkEntry *ent, gpointer user_data)
+{
+ MailConfigWizard *mcw = user_data;
+
+ if (mail_account_gui_transport_complete (mcw->gui, NULL) &&
+ !transport_next (mcw))
+ config_wizard_set_page (mcw, MAIL_CONFIG_WIZARD_PAGE_MANAGEMENT);
+}
+
+/* Management page */
+static gboolean
+management_check (MailConfigWizard *mcw)
+{
+ gboolean next_sensitive;
+ const char *text;
+
+ text = gtk_entry_get_text (mcw->gui->account_name);
+ next_sensitive = text && *text;
+
+ /* no accounts with the same name */
+ if (next_sensitive && mail_config_get_account_by_name (text))
+ next_sensitive = FALSE;
+
+ config_wizard_set_buttons_sensitive (mcw, TRUE, next_sensitive);
+ return next_sensitive;
+}
+
+static void
+management_prepare (MailConfigWizard *mcw)
+{
+ const char *name, *text;
+
+ mcw->page = MAIL_CONFIG_WIZARD_PAGE_MANAGEMENT;
+
+ text = gtk_entry_get_text (mcw->gui->account_name);
+ if (!text || *text == '\0') {
+ name = gtk_entry_get_text(mcw->gui->email_address);
+ if (name && *name) {
+ if (mail_config_get_account_by_name (name)) {
+ char *template;
+ unsigned int i = 1, len;
+
+ /* length of name + 1 char for ' ' + 1 char
+ for '(' + 10 chars for %d + 1 char for ')'
+ + 1 char for nul */
+ len = strlen (name);
+ template = alloca (len + 14);
+ strcpy (template, name);
+ name = template;
+ do {
+ sprintf (template + len, " (%d)", i++);
+ } while (mail_config_get_account_by_name (name) && i != 0);
+ }
+
+ gtk_entry_set_text(mcw->gui->account_name, name);
+ }
+ }
+
+ management_check (mcw);
+}
+
+static void
+management_changed (GtkWidget *widget, gpointer data)
+{
+ MailConfigWizard *mcw = data;
+
+ if (mcw->page != MAIL_CONFIG_WIZARD_PAGE_MANAGEMENT)
+ return;
+
+ management_check (mcw);
+}
+
+static void
+management_activate_cb (GtkEntry *ent, gpointer user_data)
+{
+ MailConfigWizard *mcw = user_data;
+
+ if (management_check (mcw))
+ config_wizard_set_page (mcw, mcw->page + 1);
+}
+
+static struct {
+ const char *page_name, *title, *icon_name;
+ void (*prepare_func) (MailConfigWizard *mcw);
+ gboolean (*back_func) (MailConfigWizard *mcw);
+ gboolean (*next_func) (MailConfigWizard *mcw);
+ const char *help_text;
+} wizard_pages[] = {
+ { "identity_page", N_("Identity"), "stock_contact",
+ identity_prepare, NULL, identity_next,
+ N_("Please enter your name and email address below. "
+ "The \"optional\" fields below do not need to be "
+ "filled in, unless you wish to include this "
+ "information in email you send.")
+ },
+
+ { "source_page", N_("Receiving Mail"), "stock_mail-receive",
+ source_prepare, NULL, source_next,
+ N_("Please enter information about your incoming "
+ "mail server below. If you are not sure, ask your "
+ "system administrator or Internet Service Provider.")
+ },
+
+ { "extra_page", N_("Receiving Mail"), "stock_mail-receive",
+ extra_prepare, NULL, NULL,
+ N_("Please select among the following options")
+ },
+
+ { "transport_page", N_("Sending Mail"), "stock_mail-send",
+ transport_prepare, transport_back, transport_next,
+ N_("Please enter information about the way you will "
+ "send mail. If you are not sure, ask your system "
+ "administrator or Internet Service Provider.")
+ },
+
+ { "management_page", N_("Account Management"), "stock_person",
+ management_prepare, NULL, NULL,
+ N_("You are almost done with the mail configuration "
+ "process. The identity, incoming mail server and "
+ "outgoing mail transport method which you provided "
+ "will be grouped together to make an Evolution mail "
+ "account. Please enter a name for this account in "
+ "the space below. This name will be used for display "
+ "purposes only.")
+ }
+};
+static const int num_wizard_pages = sizeof (wizard_pages) / sizeof (wizard_pages[0]);
+
+static GtkWidget *
+get_page (GladeXML *xml, int page_num)
+{
+ GtkWidget *vbox, *widget;
+
+ vbox = gtk_vbox_new (FALSE, 4);
+
+ widget = gtk_label_new (_(wizard_pages[page_num].help_text));
+ gtk_label_set_line_wrap (GTK_LABEL (widget), TRUE);
+ gtk_label_set_justify (GTK_LABEL (widget), GTK_JUSTIFY_FILL);
+ gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
+ gtk_widget_show_all (vbox);
+
+ switch (page_num) {
+ case MAIL_CONFIG_WIZARD_PAGE_IDENTITY:
+ widget = glade_xml_get_widget (xml, "identity_required_frame");
+ gtk_container_set_border_width (GTK_CONTAINER (widget), 0);
+ gtk_widget_reparent (widget, vbox);
+ gtk_box_set_child_packing (GTK_BOX (vbox), widget, FALSE, FALSE, 0, GTK_PACK_START);
+ widget = glade_xml_get_widget (xml, "identity_optional_frame");
+ gtk_container_set_border_width (GTK_CONTAINER (widget), 0);
+ gtk_widget_reparent (widget, vbox);
+ gtk_box_set_child_packing (GTK_BOX (vbox), widget, FALSE, FALSE, 0, GTK_PACK_START);
+ break;
+
+ case MAIL_CONFIG_WIZARD_PAGE_SOURCE:
+ widget = glade_xml_get_widget (xml, "source_vbox");
+ gtk_container_set_border_width (GTK_CONTAINER (widget), 0);
+ gtk_widget_reparent (widget, vbox);
+ break;
+
+ case MAIL_CONFIG_WIZARD_PAGE_EXTRA:
+ widget = glade_xml_get_widget (xml, "extra_table");
+ gtk_container_set_border_width (GTK_CONTAINER (widget), 0);
+ gtk_widget_reparent (widget, vbox);
+ break;
+
+ case MAIL_CONFIG_WIZARD_PAGE_TRANSPORT:
+ widget = glade_xml_get_widget (xml, "transport_vbox");
+ gtk_container_set_border_width (GTK_CONTAINER (widget), 0);
+ gtk_widget_reparent (widget, vbox);
+ break;
+
+ case MAIL_CONFIG_WIZARD_PAGE_MANAGEMENT:
+ widget = glade_xml_get_widget (xml, "management_frame");
+ gtk_container_set_border_width (GTK_CONTAINER (widget), 0);
+ gtk_widget_reparent (widget, vbox);
+ break;
+
+ default:
+ g_return_val_if_reached (NULL);
+ }
+
+ return vbox;
+}
+
+
+static MailConfigWizard *
+config_wizard_new (void)
+{
+ MailConfigWizard *mcw;
+ const char *user;
+ EAccountService *xport;
+ struct utsname uts;
+ EAccount *account;
+
+ /* Create a new account object with some defaults */
+ account = e_account_new ();
+ account->enabled = TRUE;
+
+ account->id->name = g_locale_to_utf8 (g_get_real_name (), -1, NULL, NULL, NULL);
+ user = g_get_user_name ();
+ if (user && !uname (&uts) && strchr (uts.nodename, '.'))
+ account->id->address = g_strdup_printf ("%s@%s", user, uts.nodename);
+
+ if ((xport = mail_config_get_default_transport ())) {
+ account->transport->url = g_strdup (xport->url);
+ account->transport->save_passwd = xport->save_passwd;
+ }
+
+ /* Create the config wizard object */
+ mcw = g_new0 (MailConfigWizard, 1);
+ mcw->gui = mail_account_gui_new (account, NULL);
+ g_object_unref (account);
+
+ /* Set up gui */
+ g_signal_connect (mcw->gui->account_name, "changed",
+ G_CALLBACK (management_changed), mcw);
+ g_signal_connect (mcw->gui->full_name, "changed",
+ G_CALLBACK (identity_changed), mcw);
+ g_signal_connect (mcw->gui->email_address, "changed",
+ G_CALLBACK (identity_changed), mcw);
+ g_signal_connect (mcw->gui->reply_to,"changed",
+ G_CALLBACK (identity_changed), mcw);
+ g_signal_connect (mcw->gui->source.hostname, "changed",
+ G_CALLBACK (source_changed), mcw);
+ g_signal_connect (mcw->gui->source.username, "changed",
+ G_CALLBACK (source_changed), mcw);
+ g_signal_connect (mcw->gui->source.path, "changed",
+ G_CALLBACK (source_changed), mcw);
+ g_signal_connect (mcw->gui->transport.hostname, "changed",
+ G_CALLBACK (transport_changed), mcw);
+ g_signal_connect (mcw->gui->transport.username, "changed",
+ G_CALLBACK (transport_changed), mcw);
+ g_signal_connect (mcw->gui->transport.needs_auth, "toggled",
+ G_CALLBACK (transport_changed), mcw);
+
+ g_signal_connect (mcw->gui->account_name, "activate",
+ G_CALLBACK (management_activate_cb), mcw);
+
+ g_signal_connect (mcw->gui->full_name, "activate",
+ G_CALLBACK (identity_activate_cb), mcw);
+ g_signal_connect (mcw->gui->email_address, "activate",
+ G_CALLBACK (identity_activate_cb), mcw);
+ g_signal_connect (mcw->gui->reply_to,"activate",
+ G_CALLBACK (identity_activate_cb), mcw);
+ g_signal_connect (mcw->gui->organization, "activate",
+ G_CALLBACK (identity_activate_cb), mcw);
+
+ g_signal_connect (mcw->gui->source.hostname, "activate",
+ G_CALLBACK (source_activate_cb), mcw);
+ g_signal_connect (mcw->gui->source.username, "activate",
+ G_CALLBACK (source_activate_cb), mcw);
+ g_signal_connect (mcw->gui->source.path, "activate",
+ G_CALLBACK (source_activate_cb), mcw);
+
+ g_signal_connect (mcw->gui->transport.hostname, "activate",
+ G_CALLBACK (transport_activate_cb), mcw);
+ g_signal_connect (mcw->gui->transport.username, "activate",
+ G_CALLBACK (transport_activate_cb), mcw);
+
+ return mcw;
+}
+
+static void
+free_config_wizard (MailConfigWizard *mcw)
+{
+ mail_account_gui_destroy (mcw->gui);
+
+ if (mcw->interior_pages)
+ g_ptr_array_free (mcw->interior_pages, TRUE);
+
+ g_free (mcw);
+}
+
+/* In-proc config druid */
+
+static void
+druid_cancel (GnomeDruid *druid, gpointer user_data)
+{
+ MailConfigWizard *mcw = user_data;
+ GtkWidget *window;
+
+ window = glade_xml_get_widget (mcw->gui->xml, "account_druid");
+ gtk_widget_destroy (window);
+
+ free_config_wizard (mcw);
+}
+
+static void
+druid_finish (GnomeDruidPage *page, GnomeDruid *druid, gpointer user_data)
+{
+ MailConfigWizard *mcw = user_data;
+
+ mail_account_gui_save (mcw->gui);
+ druid_cancel (druid, user_data);
+}
+
+static void
+druid_prepare (GnomeDruidPage *page, GnomeDruid *druid, gpointer data)
+{
+ MailConfigWizard *mcw = g_object_get_data (G_OBJECT (druid), "MailConfigWizard");
+ int page_num = GPOINTER_TO_INT (data);
+
+ if (wizard_pages[page_num].prepare_func)
+ wizard_pages[page_num].prepare_func (mcw);
+}
+
+static gboolean
+druid_back (GnomeDruidPage *page, GnomeDruid *druid, gpointer data)
+{
+ MailConfigWizard *mcw = g_object_get_data (G_OBJECT (druid), "MailConfigWizard");
+ int page_num = GPOINTER_TO_INT (data);
+
+ if (wizard_pages[page_num].back_func)
+ return wizard_pages[page_num].back_func (mcw);
+ else
+ return FALSE;
+}
+
+static gboolean
+druid_next (GnomeDruidPage *page, GnomeDruid *druid, gpointer data)
+{
+ MailConfigWizard *mcw = g_object_get_data (G_OBJECT (druid), "MailConfigWizard");
+ int page_num = GPOINTER_TO_INT (data);
+
+ if (wizard_pages[page_num].next_func)
+ return wizard_pages[page_num].next_func (mcw);
+ else
+ return FALSE;
+}
+
+
+MailConfigDruid *
+mail_config_druid_new (void)
+{
+ MailConfigWizard *mcw;
+ GtkWidget *new, *page;
+ GdkPixbuf *icon;
+ int i;
+
+ mcw = config_wizard_new ();
+ mcw->druid = (GnomeDruid *)glade_xml_get_widget (mcw->gui->xml, "druid");
+ g_object_set_data (G_OBJECT (mcw->druid), "MailConfigWizard", mcw);
+ gtk_widget_show_all (GTK_WIDGET (mcw->druid));
+
+ mcw->interior_pages = g_ptr_array_new ();
+ for (i = 0; i < num_wizard_pages; i++) {
+ page = glade_xml_get_widget (mcw->gui->xml,
+ wizard_pages[i].page_name);
+ icon = e_icon_factory_get_icon (wizard_pages[i].icon_name, E_ICON_SIZE_DIALOG);
+ gnome_druid_page_standard_set_logo (GNOME_DRUID_PAGE_STANDARD (page), icon);
+ g_object_unref (icon);
+ g_ptr_array_add (mcw->interior_pages, page);
+ gtk_box_pack_start (GTK_BOX (GNOME_DRUID_PAGE_STANDARD (page)->vbox),
+ get_page (mcw->gui->xml, i),
+ FALSE, FALSE, 0);
+ g_signal_connect (page, "back", G_CALLBACK (druid_back),
+ GINT_TO_POINTER (i));
+ g_signal_connect (page, "next", G_CALLBACK (druid_next),
+ GINT_TO_POINTER (i));
+
+ /* At least in 2.0 (and probably 2.2 too),
+ * GnomeDruidPageStandard is broken and you need to
+ * connect_after to "prepare" or else its default
+ * method will run after your signal handler and
+ * undo its button sensitivity changes.
+ */
+ g_signal_connect_after (page, "prepare",
+ G_CALLBACK (druid_prepare),
+ GINT_TO_POINTER (i));
+ }
+ g_signal_connect (mcw->druid, "cancel", G_CALLBACK (druid_cancel), mcw);
+
+ mcw->last_page = (GnomeDruidPage *)glade_xml_get_widget (mcw->gui->xml, "finish_page");
+ g_signal_connect (mcw->last_page, "finish", G_CALLBACK (druid_finish), mcw);
+
+ gnome_druid_set_buttons_sensitive (mcw->druid, FALSE, TRUE, TRUE, FALSE);
+ /*gtk_widget_show_all (GTK_WIDGET (mcw->druid));*/
+ mail_account_gui_setup (mcw->gui, NULL);
+
+ new = glade_xml_get_widget (mcw->gui->xml, "account_druid");
+ gtk_window_set_type_hint ((GtkWindow *) new, GDK_WINDOW_TYPE_HINT_DIALOG);
+
+ return (MailConfigDruid *) new;
+}
+
+
+/* CORBA wizard */
+
+static void
+wizard_next_cb (EvolutionWizard *wizard,
+ int page_num,
+ MailConfigWizard *mcw)
+{
+ if (page_num >= MAIL_CONFIG_WIZARD_PAGE_MANAGEMENT)
+ return;
+
+ if (wizard_pages[page_num].next_func &&
+ wizard_pages[page_num].next_func (mcw))
+ return;
+
+ evolution_wizard_set_page (wizard, page_num + 1, NULL);
+}
+
+static void
+wizard_prepare_cb (EvolutionWizard *wizard,
+ int page_num,
+ MailConfigWizard *mcw)
+{
+ if (wizard_pages[page_num].prepare_func)
+ wizard_pages[page_num].prepare_func (mcw);
+}
+
+static void
+wizard_back_cb (EvolutionWizard *wizard,
+ int page_num,
+ MailConfigWizard *mcw)
+{
+ if (page_num >= MAIL_CONFIG_WIZARD_NUM_PAGES) {
+ evolution_wizard_set_page (wizard, MAIL_CONFIG_WIZARD_PAGE_MANAGEMENT, NULL);
+ return;
+ }
+
+ if (wizard_pages[page_num].back_func &&
+ wizard_pages[page_num].back_func (mcw))
+ return;
+
+ if (page_num > 0)
+ evolution_wizard_set_page (wizard, page_num - 1, NULL);
+}
+
+static void
+wizard_finish_cb (EvolutionWizard *wizard,
+ MailConfigWizard *w)
+{
+ MailAccountGui *gui = w->gui;
+
+ /* Save the settings for that account */
+ if (mail_account_gui_save (gui) == FALSE)
+ /* problem. Um, how to keep the druid alive? */
+ return;
+
+ /* Write out the config info */
+ mail_config_write ();
+ mail_account_gui_destroy (gui);
+ w->gui = NULL;
+}
+
+static void
+wizard_cancel_cb (EvolutionWizard *wizard,
+ MailConfigWizard *mcw)
+{
+ mail_account_gui_destroy (mcw->gui);
+ mcw->gui = NULL;
+}
+
+static void
+wizard_help_cb (EvolutionWizard *wizard,
+ int page_num,
+ MailConfigWizard *mcw)
+{
+}
+
+BonoboObject *
+evolution_mail_config_wizard_new (void)
+{
+ EvolutionWizard *wizard;
+ MailConfigWizard *mcw;
+ GdkPixbuf *icon;
+ int i;
+
+ mcw = config_wizard_new ();
+ mail_account_gui_setup (mcw->gui, NULL);
+
+ wizard = evolution_wizard_new ();
+ for (i = 0; i < MAIL_CONFIG_WIZARD_NUM_PAGES; i++) {
+ icon = e_icon_factory_get_icon (wizard_pages[i].icon_name, E_ICON_SIZE_DIALOG);
+ evolution_wizard_add_page (wizard, _(wizard_pages[i].title),
+ icon, get_page (mcw->gui->xml, i));
+ g_object_unref (icon);
+ }
+
+ g_object_set_data_full (G_OBJECT (wizard), "MailConfigWizard",
+ mcw, (GDestroyNotify)free_config_wizard);
+ mcw->corba_wizard = wizard;
+
+ g_signal_connect (wizard, "next", G_CALLBACK (wizard_next_cb), mcw);
+ g_signal_connect (wizard, "prepare", G_CALLBACK (wizard_prepare_cb), mcw);
+ g_signal_connect (wizard, "back", G_CALLBACK (wizard_back_cb), mcw);
+ g_signal_connect (wizard, "finish", G_CALLBACK (wizard_finish_cb), mcw);
+ g_signal_connect (wizard, "cancel", G_CALLBACK (wizard_cancel_cb), mcw);
+ g_signal_connect (wizard, "help", G_CALLBACK (wizard_help_cb), mcw);
+
+ return BONOBO_OBJECT (wizard);
+}