1 /* Copyright (c) 2006, Nokia Corporation
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * * Neither the name of the Nokia Corporation nor the names of its
14 * contributors may be used to endorse or promote products derived from
15 * this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
18 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 #include "modest-account-assistant.h"
33 /* 'private'/'protected' functions */
34 static void modest_account_assistant_class_init (ModestAccountAssistantClass *klass);
35 static void modest_account_assistant_init (ModestAccountAssistant *obj);
36 static void modest_account_assistant_finalize (GObject *obj);
45 typedef struct _ModestAccountAssistantPrivate ModestAccountAssistantPrivate;
46 struct _ModestAccountAssistantPrivate {
47 ModestWidgetFactory *factory;
53 GtkWidget *servertype_s;
54 GtkWidget *servername_s;
55 GtkWidget *username_s;
56 GtkWidget *server_type_s;
59 GtkWidget *servertype_r;
60 GtkWidget *servername_r;
61 GtkWidget *username_r;
62 GtkWidget *server_type_r;
64 GtkWidget *remember_pwd;
65 GtkWidget *maildir_chooser;
66 GtkWidget *mbox_chooser;
68 GtkWidget *maildir_config;
69 GtkWidget *mbox_config;
70 GtkWidget *imap_pop_config;
71 GtkWidget *smtp_config;
73 GtkWidget *receiving_subwidget;
74 GtkWidget *sending_subwidget;
75 GtkWidget *receiving_child;
76 GtkWidget *sending_child;
79 #define MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
80 MODEST_TYPE_ACCOUNT_ASSISTANT, \
81 ModestAccountAssistantPrivate))
83 static GtkAssistantClass *parent_class = NULL;
85 /* uncomment the following if you have defined any signals */
86 /* static guint signals[LAST_SIGNAL] = {0}; */
89 modest_account_assistant_get_type (void)
91 static GType my_type = 0;
93 static const GTypeInfo my_info = {
94 sizeof(ModestAccountAssistantClass),
96 NULL, /* base finalize */
97 (GClassInitFunc) modest_account_assistant_class_init,
98 NULL, /* class finalize */
99 NULL, /* class data */
100 sizeof(ModestAccountAssistant),
102 (GInstanceInitFunc) modest_account_assistant_init,
104 my_type = g_type_register_static (GTK_TYPE_ASSISTANT,
105 "ModestAccountAssistant",
112 modest_account_assistant_class_init (ModestAccountAssistantClass *klass)
114 GObjectClass *gobject_class;
115 gobject_class = (GObjectClass*) klass;
117 parent_class = g_type_class_peek_parent (klass);
118 gobject_class->finalize = modest_account_assistant_finalize;
120 g_type_class_add_private (gobject_class, sizeof(ModestAccountAssistantPrivate));
122 /* signal definitions go here, e.g.: */
123 /* signals[MY_SIGNAL_1] = */
124 /* g_signal_new ("my_signal_1",....); */
125 /* signals[MY_SIGNAL_2] = */
126 /* g_signal_new ("my_signal_2",....); */
133 add_intro_page (ModestAccountAssistant *assistant)
138 page = gtk_vbox_new (FALSE, 6);
140 label = gtk_label_new (
141 _("Welcome to the account assistant\n\n"
142 "It will help to set up a new e-mail account\n"));
143 gtk_box_pack_start (GTK_BOX(page), label, FALSE, FALSE, 6);
144 gtk_widget_show_all (page);
146 gtk_assistant_append_page (GTK_ASSISTANT(assistant), page);
148 gtk_assistant_set_page_title (GTK_ASSISTANT(assistant), page,
149 _("Modest Account Assistant"));
150 gtk_assistant_set_page_type (GTK_ASSISTANT(assistant), page,
151 GTK_ASSISTANT_PAGE_INTRO);
152 gtk_assistant_set_page_complete (GTK_ASSISTANT(assistant),
158 set_current_page_complete (ModestAccountAssistant *self, gboolean complete)
163 pageno = gtk_assistant_get_current_page (GTK_ASSISTANT(self));
164 page = gtk_assistant_get_nth_page (GTK_ASSISTANT(self), pageno);
166 gtk_assistant_set_page_complete (GTK_ASSISTANT(self), page, complete);
171 identity_page_update_completeness (GtkEditable *editable,
172 ModestAccountAssistant *self)
174 ModestAccountAssistantPrivate *priv;
177 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
179 txt = gtk_entry_get_text (GTK_ENTRY(priv->fullname));
180 if (!txt || strlen(txt) == 0) {
181 set_current_page_complete (self, FALSE);
185 /* FIXME: regexp check for email address */
186 txt = gtk_entry_get_text (GTK_ENTRY(priv->email));
187 if (!txt || strlen(txt) == 0) {
188 set_current_page_complete (self, FALSE);
191 set_current_page_complete (self, TRUE);
196 add_identity_page (ModestAccountAssistant *self)
202 ModestAccountAssistantPrivate *priv;
204 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
206 priv->fullname = gtk_entry_new_with_max_length (40);
207 priv->email = gtk_entry_new_with_max_length (40);
209 page = gtk_vbox_new (FALSE, 6);
211 label = gtk_label_new (
212 _("Please enter your name and your e-mail address below.\n\n"));
213 gtk_box_pack_start (GTK_BOX(page), label, FALSE, FALSE, 6);
215 table = gtk_table_new (2,2, FALSE);
216 gtk_table_attach_defaults (GTK_TABLE(table),gtk_label_new (_("Full name")),
218 gtk_table_attach_defaults (GTK_TABLE(table),gtk_label_new (_("E-mail address")),
220 gtk_table_attach_defaults (GTK_TABLE(table),priv->fullname,
222 gtk_table_attach_defaults (GTK_TABLE(table),priv->email,
225 g_signal_connect (G_OBJECT(priv->fullname), "changed",
226 G_CALLBACK(identity_page_update_completeness),
228 g_signal_connect (G_OBJECT(priv->email), "changed",
229 G_CALLBACK(identity_page_update_completeness),
232 gtk_box_pack_start (GTK_BOX(page), table, FALSE, FALSE, 6);
233 gtk_widget_show_all (page);
235 gtk_assistant_append_page (GTK_ASSISTANT(self), page);
237 gtk_assistant_set_page_title (GTK_ASSISTANT(self), page,
239 gtk_assistant_set_page_type (GTK_ASSISTANT(self), page,
240 GTK_ASSISTANT_PAGE_INTRO);
241 gtk_assistant_set_page_complete (GTK_ASSISTANT(self),
248 maildir_configuration (ModestAccountAssistant *self)
250 ModestAccountAssistantPrivate *priv;
251 GtkWidget *label, *box, *hbox;
253 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
254 box = gtk_vbox_new (FALSE, 6);
256 label = gtk_label_new (NULL);
257 gtk_label_set_markup (GTK_LABEL(label),
258 _("<b>Maildir configuration</b>"));
259 gtk_box_pack_start (GTK_BOX(box), label, FALSE, FALSE, 6);
260 label = gtk_label_new (NULL);
261 gtk_label_set_markup (GTK_LABEL(label),
262 _("Please select the path to your Maildir below"));
263 gtk_box_pack_start (GTK_BOX(box), label, FALSE, FALSE, 6);
265 label = gtk_label_new (_("Path:"));
267 priv->maildir_chooser =
268 gtk_file_chooser_button_new (_("(none)"),
269 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
271 hbox = gtk_hbox_new (FALSE, 6);
272 gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 6);
273 gtk_box_pack_start (GTK_BOX(hbox), priv->maildir_chooser, FALSE, FALSE, 6);
275 gtk_box_pack_start (GTK_BOX(box), hbox, FALSE, FALSE, 6);
282 mbox_configuration (ModestAccountAssistant *self)
284 ModestAccountAssistantPrivate *priv;
285 GtkWidget *label, *box, *hbox;
287 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
288 box = gtk_vbox_new (FALSE, 6);
290 label = gtk_label_new (NULL);
291 gtk_label_set_markup (GTK_LABEL(label),
292 _("<b>Mbox configuration</b>"));
293 gtk_box_pack_start (GTK_BOX(box), label, FALSE, FALSE, 6);
294 label = gtk_label_new (NULL);
295 gtk_label_set_markup (GTK_LABEL(label),
296 _("Please select your mbox file below"));
297 gtk_box_pack_start (GTK_BOX(box), label, FALSE, FALSE, 6);
299 label = gtk_label_new (_("mbox:"));
302 gtk_file_chooser_button_new (_("(none)"),
303 GTK_FILE_CHOOSER_ACTION_OPEN);
304 hbox = gtk_hbox_new (FALSE, 6);
305 gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 6);
306 gtk_box_pack_start (GTK_BOX(hbox), priv->mbox_chooser, FALSE, FALSE, 6);
308 gtk_box_pack_start (GTK_BOX(box), hbox, FALSE, FALSE, 6);
315 imap_pop_configuration (ModestAccountAssistant *self)
317 ModestAccountAssistantPrivate *priv;
318 GtkWidget *label, *box, *hbox;
320 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
321 box = gtk_vbox_new (FALSE, 6);
323 label = gtk_label_new (NULL);
324 gtk_label_set_markup (GTK_LABEL(label),_("<b>Server configuration</b>"));
325 gtk_box_pack_start (GTK_BOX(box), label, FALSE, FALSE, 6);
327 hbox = gtk_hbox_new (FALSE, 6);
328 label = gtk_label_new (_("Username:"));
329 if (!priv->username_r)
330 priv->username_r = gtk_entry_new_with_max_length (40);
331 gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
332 gtk_box_pack_start (GTK_BOX(hbox), priv->username_r,FALSE, FALSE, 6);
333 gtk_box_pack_start (GTK_BOX(box), hbox, FALSE, FALSE, 0);
335 hbox = gtk_hbox_new (FALSE, 6);
336 label = gtk_label_new (_("Server:"));
337 if (!priv->servername_r)
338 priv->servername_r = gtk_entry_new_with_max_length (40);
339 gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
340 gtk_box_pack_start (GTK_BOX(hbox), priv->servername_r,FALSE, FALSE, 6);
341 gtk_box_pack_start (GTK_BOX(box), hbox, FALSE, FALSE, 0);
343 label = gtk_label_new(NULL);
344 gtk_label_set_markup (GTK_LABEL(label),_("<b>Security</b>"));
345 gtk_box_pack_start (GTK_BOX(box), label, FALSE, FALSE, 0);
347 hbox = gtk_hbox_new (FALSE, 6);
348 label = gtk_label_new(NULL);
349 gtk_label_set_text (GTK_LABEL(label),_("Connection type:"));
350 gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
351 gtk_box_pack_start (GTK_BOX(hbox), modest_widget_factory_get_combo_box
352 (priv->factory, MODEST_COMBO_BOX_TYPE_SECURITY_PROTOS),
354 gtk_box_pack_start (GTK_BOX(box), hbox, FALSE, FALSE, 0);
356 hbox = gtk_hbox_new (FALSE, 6);
357 label = gtk_label_new(NULL);
359 gtk_label_set_text (GTK_LABEL(label),_("Authentication:"));
360 gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 6);
361 gtk_box_pack_start (GTK_BOX(hbox), modest_widget_factory_get_combo_box
362 (priv->factory, MODEST_COMBO_BOX_TYPE_AUTH_PROTOS),
366 gtk_check_button_new_with_label (_("Remember password"));
367 gtk_box_pack_start (GTK_BOX(hbox),priv->remember_pwd,
371 gtk_box_pack_start (GTK_BOX(box), hbox, FALSE, FALSE, 0);
379 on_receiving_combo_box_changed (GtkComboBox *combo, ModestAccountAssistant *self)
381 ModestAccountAssistantPrivate *priv;
384 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
385 chosen = gtk_combo_box_get_active_text (GTK_COMBO_BOX(combo));
387 if (priv->receiving_child)
388 gtk_container_remove (GTK_CONTAINER(priv->receiving_subwidget),
389 priv->receiving_child);
391 if (strcmp (chosen, MODEST_PROTO_POP) == 0 ||
392 strcmp (chosen, MODEST_PROTO_IMAP) == 0) {
393 if (!priv->imap_pop_config)
394 priv->imap_pop_config = imap_pop_configuration (self);
395 g_object_ref (G_OBJECT(priv->imap_pop_config));
396 priv->receiving_child = priv->imap_pop_config;
398 } else if (strcmp (chosen, MODEST_PROTO_MAILDIR) == 0) {
400 if (!priv->maildir_config)
401 priv->maildir_config = maildir_configuration (self);
402 g_object_ref (G_OBJECT(priv->maildir_config));
403 priv->receiving_child = priv->maildir_config;
405 } else if (strcmp (chosen, MODEST_PROTO_MBOX) == 0) {
406 if (!priv->mbox_config)
407 priv->mbox_config = mbox_configuration (self);
408 g_object_ref (G_OBJECT(priv->mbox_config));
409 priv->receiving_child = priv->mbox_config;
411 priv->receiving_child = gtk_label_new (NULL);
414 gtk_container_add (GTK_CONTAINER(priv->receiving_subwidget),
415 priv->receiving_child);
417 gtk_widget_show_all (priv->receiving_subwidget);
422 add_receiving_page (ModestAccountAssistant *self)
424 GtkWidget *page, *box, *combo;
426 ModestAccountAssistantPrivate *priv;
428 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
429 page = gtk_vbox_new (FALSE, 6);
431 gtk_box_pack_start (GTK_BOX(page),
433 _("Please select among the following options")),
435 box = gtk_hbox_new (FALSE, 6);
436 gtk_box_pack_start (GTK_BOX(box),
437 gtk_label_new(_("Server type")),
440 combo = modest_widget_factory_get_combo_box (priv->factory,
441 MODEST_COMBO_BOX_TYPE_STORE_PROTOS);
442 g_signal_connect (G_OBJECT(combo), "changed",
443 G_CALLBACK(on_receiving_combo_box_changed), self);
445 gtk_box_pack_start (GTK_BOX(box), combo, FALSE,FALSE,6);
446 gtk_box_pack_start (GTK_BOX(page), box, FALSE,FALSE, 6);
448 gtk_box_pack_start (GTK_BOX(page), gtk_hseparator_new(), FALSE, FALSE, 0);
450 priv->receiving_subwidget = gtk_hbox_new (FALSE, 0);
451 gtk_box_pack_start (GTK_BOX(page), priv->receiving_subwidget,
454 gtk_assistant_append_page (GTK_ASSISTANT(self), page);
456 gtk_assistant_set_page_title (GTK_ASSISTANT(self), page,
457 _("Receiving mail"));
458 gtk_assistant_set_page_type (GTK_ASSISTANT(self), page,
459 GTK_ASSISTANT_PAGE_INTRO);
461 gtk_assistant_set_page_complete (GTK_ASSISTANT(self),
463 gtk_widget_show_all (page);
468 smtp_configuration (ModestAccountAssistant *self)
470 ModestAccountAssistantPrivate *priv;
471 GtkWidget *label, *box;
473 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
474 box = gtk_vbox_new (FALSE, 6);
476 label = gtk_label_new (NULL);
477 gtk_label_set_markup (GTK_LABEL(label),
478 _("<b>SMTP configuration</b>"));
479 gtk_box_pack_start (GTK_BOX(box), label, FALSE, FALSE, 6);
486 on_sending_combo_box_changed (GtkComboBox *combo, ModestAccountAssistant *self)
488 ModestAccountAssistantPrivate *priv;
491 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
493 chosen = gtk_combo_box_get_active_text (GTK_COMBO_BOX(combo));
495 if (priv->sending_child)
496 gtk_container_remove (GTK_CONTAINER(priv->sending_subwidget),
497 priv->sending_child);
499 if (strcmp (chosen, MODEST_PROTO_SENDMAIL) == 0) {
500 priv->sending_child = gtk_label_new (NULL);
502 } else if (strcmp (chosen, MODEST_PROTO_SMTP) == 0) {
503 if (!priv->smtp_config)
504 priv->smtp_config = smtp_configuration (self);
505 g_object_ref (G_OBJECT(priv->smtp_config));
506 priv->sending_child = priv->smtp_config;
508 g_assert_not_reached ();
510 gtk_container_add (GTK_CONTAINER(priv->sending_subwidget),
511 priv->sending_child);
512 gtk_widget_show_all (priv->sending_subwidget);
518 add_sending_page (ModestAccountAssistant *self)
520 GtkWidget *page, *box, *combo;
522 ModestAccountAssistantPrivate *priv;
524 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
525 page = gtk_vbox_new (FALSE, 6);
527 gtk_box_pack_start (GTK_BOX(page),
529 _("Please select among the following options")),
531 box = gtk_hbox_new (FALSE, 6);
532 gtk_box_pack_start (GTK_BOX(box),
533 gtk_label_new(_("Server type")),
536 combo = modest_widget_factory_get_combo_box (priv->factory,
537 MODEST_COMBO_BOX_TYPE_TRANSPORT_PROTOS);
538 g_signal_connect (G_OBJECT(combo), "changed",
539 G_CALLBACK(on_sending_combo_box_changed), self);
541 gtk_box_pack_start (GTK_BOX(box), combo, FALSE,FALSE,6);
542 gtk_box_pack_start (GTK_BOX(page), box, FALSE,FALSE, 6);
544 gtk_box_pack_start (GTK_BOX(page), gtk_hseparator_new(), FALSE, FALSE, 0);
546 priv->sending_subwidget = gtk_hbox_new (FALSE, 0);
547 gtk_box_pack_start (GTK_BOX(page), priv->sending_subwidget,
550 gtk_assistant_append_page (GTK_ASSISTANT(self), page);
552 gtk_assistant_set_page_title (GTK_ASSISTANT(self), page,
554 gtk_assistant_set_page_type (GTK_ASSISTANT(self), page,
555 GTK_ASSISTANT_PAGE_INTRO);
557 gtk_assistant_set_page_complete (GTK_ASSISTANT(self),
559 gtk_widget_show_all (page);
564 modest_account_assistant_init (ModestAccountAssistant *obj)
566 ModestAccountAssistantPrivate *priv;
568 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(obj);
570 priv->factory = NULL;
572 priv->maildir_config = NULL;
573 priv->mbox_config = NULL;
574 priv->imap_pop_config = NULL;
575 priv->smtp_config = NULL;
577 priv->receiving_child = NULL;
578 priv->sending_child = NULL;
582 modest_account_assistant_finalize (GObject *obj)
584 ModestAccountAssistantPrivate *priv;
586 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(obj);
589 g_object_unref (G_OBJECT(priv->factory));
590 priv->factory = NULL;
593 G_OBJECT_CLASS(parent_class)->finalize (obj);
597 on_cancel (ModestAccountAssistant *self, gpointer user_data)
603 label = gtk_label_new (_("Are you sure you want to cancel\n"
604 "setting up a new account?"));
606 dialog = gtk_dialog_new_with_buttons (_("Cancel"),
608 GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
609 GTK_STOCK_YES, GTK_RESPONSE_ACCEPT,
610 GTK_STOCK_NO, GTK_RESPONSE_CANCEL,
613 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
614 label, FALSE, FALSE, 6);
616 gtk_widget_show_all ((GTK_DIALOG(dialog)->vbox));
618 gtk_window_set_resizable (GTK_WINDOW(dialog), FALSE);
620 response = gtk_dialog_run (GTK_DIALOG(dialog));
621 gtk_widget_destroy (dialog);
624 case GTK_RESPONSE_ACCEPT:
625 /* close the assistant */
626 gtk_widget_destroy (GTK_WIDGET(self));
628 case GTK_RESPONSE_CANCEL:
629 /* don't do anything */
631 default: g_assert_not_reached ();
639 modest_account_assistant_new (ModestWidgetFactory *factory)
642 ModestAccountAssistant *self;
643 ModestAccountAssistantPrivate *priv;
645 g_return_val_if_fail (factory, NULL);
647 obj = g_object_new(MODEST_TYPE_ACCOUNT_ASSISTANT, NULL);
648 self = MODEST_ACCOUNT_ASSISTANT(obj);
650 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
651 g_object_ref (factory);
652 priv->factory = factory;
654 add_intro_page (self);
655 add_identity_page (self);
656 add_receiving_page (self);
657 add_sending_page (self);
659 gtk_assistant_set_current_page (GTK_ASSISTANT(self), 0);
660 gtk_window_set_title (GTK_WINDOW(self),
661 _("Modest Account Wizard"));
662 gtk_window_set_resizable (GTK_WINDOW(self), TRUE);
663 gtk_window_set_default_size (GTK_WINDOW(self), 400, 400);
665 gtk_window_set_modal (GTK_WINDOW(self), TRUE);
667 g_signal_connect (G_OBJECT(self), "cancel",
668 G_CALLBACK(on_cancel), NULL);
670 return GTK_WIDGET(self);