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 <glib/gi18n.h>
31 #include "modest-account-assistant.h"
32 #include "modest-store-widget.h"
33 #include "modest-transport-widget.h"
34 #include "modest-proto.h"
38 /* 'private'/'protected' functions */
39 static void modest_account_assistant_class_init (ModestAccountAssistantClass *klass);
40 static void modest_account_assistant_init (ModestAccountAssistant *obj);
41 static void modest_account_assistant_finalize (GObject *obj);
50 typedef struct _ModestAccountAssistantPrivate ModestAccountAssistantPrivate;
51 struct _ModestAccountAssistantPrivate {
53 ModestWidgetFactory *factory;
54 ModestAccountMgr *account_mgr;
56 GtkWidget *account_name;
60 GtkWidget *store_widget;
61 GtkWidget *transport_widget;
63 GtkWidget *transport_holder;
64 GtkWidget *store_holder;
67 #define MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
68 MODEST_TYPE_ACCOUNT_ASSISTANT, \
69 ModestAccountAssistantPrivate))
71 static GtkAssistantClass *parent_class = NULL;
73 /* uncomment the following if you have defined any signals */
74 /* static guint signals[LAST_SIGNAL] = {0}; */
77 modest_account_assistant_get_type (void)
79 static GType my_type = 0;
81 static const GTypeInfo my_info = {
82 sizeof(ModestAccountAssistantClass),
84 NULL, /* base finalize */
85 (GClassInitFunc) modest_account_assistant_class_init,
86 NULL, /* class finalize */
87 NULL, /* class data */
88 sizeof(ModestAccountAssistant),
90 (GInstanceInitFunc) modest_account_assistant_init,
93 my_type = g_type_register_static (GTK_TYPE_ASSISTANT,
94 "ModestAccountAssistant",
101 modest_account_assistant_class_init (ModestAccountAssistantClass *klass)
103 GObjectClass *gobject_class;
104 gobject_class = (GObjectClass*) klass;
106 parent_class = g_type_class_peek_parent (klass);
107 gobject_class->finalize = modest_account_assistant_finalize;
109 g_type_class_add_private (gobject_class, sizeof(ModestAccountAssistantPrivate));
111 /* signal definitions go here, e.g.: */
112 /* signals[MY_SIGNAL_1] = */
113 /* g_signal_new ("my_signal_1",....); */
114 /* signals[MY_SIGNAL_2] = */
115 /* g_signal_new ("my_signal_2",....); */
122 add_intro_page (ModestAccountAssistant *assistant)
124 GtkWidget *page, *label;
126 page = gtk_vbox_new (FALSE, 6);
128 label = gtk_label_new (
129 _("Welcome to the account assistant\n\n"
130 "It will help to set up a new e-mail account\n"));
131 gtk_box_pack_start (GTK_BOX(page), label, FALSE, FALSE, 6);
132 gtk_widget_show_all (page);
134 gtk_assistant_append_page (GTK_ASSISTANT(assistant), page);
136 gtk_assistant_set_page_title (GTK_ASSISTANT(assistant), page,
137 _("Modest Account Assistant"));
138 gtk_assistant_set_page_type (GTK_ASSISTANT(assistant), page,
139 GTK_ASSISTANT_PAGE_INTRO);
140 gtk_assistant_set_page_complete (GTK_ASSISTANT(assistant),
146 set_current_page_complete (ModestAccountAssistant *self, gboolean complete)
151 pageno = gtk_assistant_get_current_page (GTK_ASSISTANT(self));
152 page = gtk_assistant_get_nth_page (GTK_ASSISTANT(self), pageno);
154 gtk_assistant_set_page_complete (GTK_ASSISTANT(self), page, complete);
159 identity_page_update_completeness (GtkEditable *editable,
160 ModestAccountAssistant *self)
162 ModestAccountAssistantPrivate *priv;
165 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
167 txt = gtk_entry_get_text (GTK_ENTRY(priv->fullname));
168 if (!txt || strlen(txt) == 0) {
169 set_current_page_complete (self, FALSE);
173 /* FIXME: regexp check for email address */
174 txt = gtk_entry_get_text (GTK_ENTRY(priv->email));
175 if (!txt || strlen(txt) == 0) {
176 set_current_page_complete (self, FALSE);
179 set_current_page_complete (self, TRUE);
184 add_identity_page (ModestAccountAssistant *self)
186 GtkWidget *page, *label, *table;
187 ModestAccountAssistantPrivate *priv;
189 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
191 priv->fullname = gtk_entry_new_with_max_length (40);
192 priv->email = gtk_entry_new_with_max_length (40);
194 page = gtk_vbox_new (FALSE, 6);
196 label = gtk_label_new (
197 _("Please enter your name and your e-mail address below.\n\n"));
198 gtk_box_pack_start (GTK_BOX(page), label, FALSE, FALSE, 6);
200 table = gtk_table_new (2,2, FALSE);
201 gtk_table_attach_defaults (GTK_TABLE(table),gtk_label_new (_("Full name")),
203 gtk_table_attach_defaults (GTK_TABLE(table),gtk_label_new (_("E-mail address")),
205 gtk_table_attach_defaults (GTK_TABLE(table),priv->fullname,
207 gtk_table_attach_defaults (GTK_TABLE(table),priv->email,
210 g_signal_connect (G_OBJECT(priv->fullname), "changed",
211 G_CALLBACK(identity_page_update_completeness),
213 g_signal_connect (G_OBJECT(priv->email), "changed",
214 G_CALLBACK(identity_page_update_completeness),
217 gtk_box_pack_start (GTK_BOX(page), table, FALSE, FALSE, 6);
218 gtk_widget_show_all (page);
220 gtk_assistant_append_page (GTK_ASSISTANT(self), page);
222 gtk_assistant_set_page_title (GTK_ASSISTANT(self), page,
224 gtk_assistant_set_page_type (GTK_ASSISTANT(self), page,
225 GTK_ASSISTANT_PAGE_INTRO);
226 gtk_assistant_set_page_complete (GTK_ASSISTANT(self),
232 receiving_page_update_completeness (GtkEditable *editable,
233 ModestAccountAssistant *self)
235 ModestAccountAssistantPrivate *priv;
238 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
240 txt = modest_store_widget_get_username (priv->store_widget);
241 if (!txt || strlen(txt) == 0) {
242 set_current_page_complete (self, FALSE);
246 txt = modest_store_widget_get_servername (priv->store_widget);
247 if (!txt || strlen(txt) == 0) {
248 set_current_page_complete (self, FALSE);
251 set_current_page_complete (self, TRUE);
255 on_receiving_combo_box_changed (GtkComboBox *combo, ModestAccountAssistant *self)
257 ModestAccountAssistantPrivate *priv;
260 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
261 chosen = gtk_combo_box_get_active_text (GTK_COMBO_BOX(combo));
263 if (priv->store_widget)
264 gtk_container_remove (GTK_CONTAINER(priv->store_holder),
267 /* FIXME: we could have these widgets cached instead of
268 creating them every time */
269 priv->store_widget = modest_store_widget_new (priv->factory, chosen);
270 if (!strcmp (chosen, MODEST_PROTO_POP) || !strcmp (chosen, MODEST_PROTO_IMAP)) {
271 g_signal_connect (priv->store_widget,
273 receiving_page_update_completeness,
275 set_current_page_complete (self, FALSE);
277 set_current_page_complete (self, TRUE);
279 gtk_container_add (GTK_CONTAINER(priv->store_holder),
282 gtk_widget_show_all (priv->store_holder);
287 add_receiving_page (ModestAccountAssistant *self)
289 GtkWidget *page, *box, *combo;
291 ModestAccountAssistantPrivate *priv;
293 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
294 page = gtk_vbox_new (FALSE, 6);
296 gtk_box_pack_start (GTK_BOX(page),
298 _("Please select among the following options")),
300 box = gtk_hbox_new (FALSE, 6);
301 gtk_box_pack_start (GTK_BOX(box),
302 gtk_label_new(_("Server type")),
305 combo = modest_widget_factory_get_combo_box (priv->factory,
306 MODEST_COMBO_BOX_TYPE_STORE_PROTOS);
307 g_signal_connect (G_OBJECT(combo), "changed",
308 G_CALLBACK(on_receiving_combo_box_changed), self);
310 gtk_box_pack_start (GTK_BOX(box), combo, FALSE,FALSE,6);
311 gtk_box_pack_start (GTK_BOX(page), box, FALSE,FALSE, 6);
313 gtk_box_pack_start (GTK_BOX(page), gtk_hseparator_new(), FALSE, FALSE, 0);
315 priv->store_holder = gtk_hbox_new (FALSE, 0);
316 gtk_box_pack_start (GTK_BOX(page), priv->store_holder,
319 /* Force the selection */
320 on_receiving_combo_box_changed (combo, self);
322 gtk_assistant_append_page (GTK_ASSISTANT(self), page);
324 gtk_assistant_set_page_title (GTK_ASSISTANT(self), page,
325 _("Receiving mail"));
326 gtk_assistant_set_page_type (GTK_ASSISTANT(self), page,
327 GTK_ASSISTANT_PAGE_INTRO);
328 gtk_assistant_set_page_complete (GTK_ASSISTANT(self),
330 gtk_widget_show_all (page);
337 on_sending_combo_box_changed (GtkComboBox *combo, ModestAccountAssistant *self)
339 ModestAccountAssistantPrivate *priv;
342 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
344 chosen = gtk_combo_box_get_active_text (GTK_COMBO_BOX(combo));
346 if (priv->transport_widget)
347 gtk_container_remove (GTK_CONTAINER(priv->transport_holder),
348 priv->transport_widget);
350 priv->transport_widget = modest_transport_widget_new (priv->factory,
353 gtk_container_add (GTK_CONTAINER(priv->transport_holder),
354 priv->transport_widget);
356 gtk_widget_show_all (priv->transport_holder);
362 add_sending_page (ModestAccountAssistant *self)
364 GtkWidget *page, *box, *combo;
366 ModestAccountAssistantPrivate *priv;
368 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
369 page = gtk_vbox_new (FALSE, 6);
371 gtk_box_pack_start (GTK_BOX(page),
373 _("Please select among the following options")),
375 box = gtk_hbox_new (FALSE, 0);
376 gtk_box_pack_start (GTK_BOX(box),
377 gtk_label_new(_("Server type")),
380 combo = modest_widget_factory_get_combo_box (priv->factory,
381 MODEST_COMBO_BOX_TYPE_TRANSPORT_PROTOS);
382 g_signal_connect (G_OBJECT(combo), "changed",
383 G_CALLBACK(on_sending_combo_box_changed), self);
385 gtk_box_pack_start (GTK_BOX(box), combo, FALSE,FALSE,0);
386 gtk_box_pack_start (GTK_BOX(page), box, FALSE,FALSE, 0);
388 gtk_box_pack_start (GTK_BOX(page), gtk_hseparator_new(), FALSE, FALSE, 0);
390 priv->transport_holder = gtk_hbox_new (FALSE, 0);
391 gtk_box_pack_start (GTK_BOX(page), priv->transport_holder,
394 /* Force the selection */
395 on_sending_combo_box_changed (combo, self);
397 gtk_assistant_append_page (GTK_ASSISTANT(self), page);
399 gtk_assistant_set_page_title (GTK_ASSISTANT(self), page,
401 gtk_assistant_set_page_type (GTK_ASSISTANT(self), page,
402 GTK_ASSISTANT_PAGE_INTRO);
403 gtk_assistant_set_page_complete (GTK_ASSISTANT(self),
405 gtk_widget_show_all (page);
411 add_final_page (ModestAccountAssistant *self)
413 GtkWidget *page, *box;
414 ModestAccountAssistantPrivate *priv;
416 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
417 page = gtk_vbox_new (FALSE, 6);
419 gtk_box_pack_start (GTK_BOX(page),
421 _("We're almost done. Press 'Apply' to store this new account")),
423 box = gtk_hbox_new (FALSE, 6);
425 gtk_entry_new_with_max_length (40);
426 gtk_entry_set_text (GTK_ENTRY(priv->account_name),
427 gtk_entry_get_text(GTK_ENTRY(priv->email)));
428 gtk_box_pack_start (GTK_BOX(box),gtk_label_new(_("Account name:")),
430 gtk_box_pack_start (GTK_BOX(box),priv->account_name , FALSE,FALSE,6);
432 gtk_box_pack_start (GTK_BOX(page), box, FALSE, FALSE, 6);
434 gtk_assistant_append_page (GTK_ASSISTANT(self), page);
436 gtk_assistant_set_page_title (GTK_ASSISTANT(self), page,
437 _("Account Management"));
438 gtk_assistant_set_page_type (GTK_ASSISTANT(self), page,
439 GTK_ASSISTANT_PAGE_CONFIRM);
441 gtk_assistant_set_page_complete (GTK_ASSISTANT(self),
443 gtk_widget_show_all (page);
448 modest_account_assistant_init (ModestAccountAssistant *obj)
450 ModestAccountAssistantPrivate *priv;
452 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(obj);
453 priv->factory = NULL;
454 priv->account_mgr = NULL;
456 priv->store_widget = NULL;
457 priv->transport_widget = NULL;
461 modest_account_assistant_finalize (GObject *obj)
463 ModestAccountAssistantPrivate *priv;
465 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(obj);
468 g_object_unref (G_OBJECT(priv->factory));
469 priv->factory = NULL;
472 if (priv->account_mgr) {
473 g_object_unref (G_OBJECT(priv->account_mgr));
474 priv->account_mgr = NULL;
479 G_OBJECT_CLASS(parent_class)->finalize (obj);
483 on_cancel (ModestAccountAssistant *self, gpointer user_data)
489 label = gtk_label_new (_("Are you sure you want to cancel\n"
490 "setting up a new account?"));
492 dialog = gtk_dialog_new_with_buttons (_("Cancel"),
494 GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
495 GTK_STOCK_YES, GTK_RESPONSE_ACCEPT,
496 GTK_STOCK_NO, GTK_RESPONSE_CANCEL,
499 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
500 label, FALSE, FALSE, 6);
502 gtk_widget_show_all ((GTK_DIALOG(dialog)->vbox));
504 gtk_window_set_resizable (GTK_WINDOW(dialog), FALSE);
506 response = gtk_dialog_run (GTK_DIALOG(dialog));
507 gtk_widget_destroy (dialog);
510 case GTK_RESPONSE_ACCEPT:
511 /* close the assistant */
512 gtk_widget_hide (GTK_WIDGET(self));
514 case GTK_RESPONSE_CANCEL:
515 /* don't do anything */
517 default: g_assert_not_reached ();
523 get_account_name (ModestAccountAssistant *self)
525 ModestAccountAssistantPrivate *priv;
526 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
528 return gtk_entry_get_text (GTK_ENTRY(priv->account_name));
532 get_fullname (ModestAccountAssistant *self)
534 ModestAccountAssistantPrivate *priv;
535 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
537 return gtk_entry_get_text (GTK_ENTRY(priv->fullname));
543 get_email (ModestAccountAssistant *self)
545 ModestAccountAssistantPrivate *priv;
546 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
548 return gtk_entry_get_text (GTK_ENTRY(priv->email));
553 on_close (ModestAccountAssistant *self, gpointer user_data)
555 gtk_widget_hide (GTK_WIDGET (self));
559 on_apply (ModestAccountAssistant *self, gpointer user_data)
561 ModestAccountAssistantPrivate *priv;
562 gchar *store_name, *transport_name;
563 const gchar *account_name, *username, *servername, *proto;
564 ModestStoreWidget *store;
565 ModestTransportWidget *transport;
567 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
569 /* create server account -> store */
570 store = MODEST_STORE_WIDGET(priv->store_widget);
571 proto = modest_store_widget_get_proto (store);
572 username = modest_store_widget_get_username (store);
573 servername = modest_store_widget_get_servername (store);
574 store_name = g_strdup_printf ("%s:%s@%s", proto, username, servername);
576 modest_account_mgr_add_server_account (priv->account_mgr, store_name, servername,
577 username, NULL, proto);
579 /* create server account -> transport */
580 transport = MODEST_TRANSPORT_WIDGET(priv->transport_widget);
581 proto = modest_transport_widget_get_proto (transport);
583 if (!strcmp (proto, MODEST_PROTO_SMTP)) {
584 servername = modest_transport_widget_get_servername (transport);
585 if (modest_transport_widget_get_requires_auth (transport))
586 username = modest_transport_widget_get_username (transport);
588 username = g_get_user_name ();
590 username = g_get_user_name ();
591 servername = "localhost";
594 transport_name = g_strdup_printf ("%s:%s@%s", proto, username, servername);
596 modest_account_mgr_add_server_account (priv->account_mgr,
604 account_name = get_account_name (self);
605 modest_account_mgr_add_account (priv->account_mgr,
609 modest_account_mgr_set_string (priv->account_mgr,
611 MODEST_ACCOUNT_FULLNAME,
612 get_fullname(self), FALSE, NULL);
613 modest_account_mgr_set_string (priv->account_mgr,
615 MODEST_ACCOUNT_EMAIL,
616 get_email(self), FALSE, NULL);
620 g_free (transport_name);
626 modest_account_assistant_new (ModestAccountMgr *account_mgr, ModestWidgetFactory *factory)
629 ModestAccountAssistant *self;
630 ModestAccountAssistantPrivate *priv;
632 g_return_val_if_fail (factory, NULL);
633 g_return_val_if_fail (account_mgr, NULL);
635 obj = g_object_new(MODEST_TYPE_ACCOUNT_ASSISTANT, NULL);
636 self = MODEST_ACCOUNT_ASSISTANT(obj);
638 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
640 g_object_ref (factory);
641 priv->factory = factory;
643 g_object_ref (account_mgr);
644 priv->account_mgr = account_mgr;
646 add_intro_page (self);
647 add_identity_page (self);
648 add_receiving_page (self);
649 add_sending_page (self);
650 add_final_page (self);
652 gtk_assistant_set_current_page (GTK_ASSISTANT(self), 0);
653 gtk_window_set_title (GTK_WINDOW(self),
654 _("Modest Account Wizard"));
655 gtk_window_set_resizable (GTK_WINDOW(self), TRUE);
656 gtk_window_set_default_size (GTK_WINDOW(self), 400, 400);
658 gtk_window_set_modal (GTK_WINDOW(self), TRUE);
660 g_signal_connect (G_OBJECT(self), "apply",
661 G_CALLBACK(on_apply), NULL);
662 g_signal_connect (G_OBJECT(self), "cancel",
663 G_CALLBACK(on_cancel), NULL);
664 g_signal_connect (G_OBJECT(self), "close",
665 G_CALLBACK(on_close), NULL);
667 return GTK_WIDGET(self);