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-text-utils.h"
35 #include <modest-protocol-info.h>
39 /* 'private'/'protected' functions */
40 static void modest_account_assistant_class_init (ModestAccountAssistantClass *klass);
41 static void modest_account_assistant_init (ModestAccountAssistant *obj);
42 static void modest_account_assistant_finalize (GObject *obj);
51 typedef struct _ModestAccountAssistantPrivate ModestAccountAssistantPrivate;
52 struct _ModestAccountAssistantPrivate {
54 ModestWidgetFactory *factory;
55 ModestAccountMgr *account_mgr;
57 GtkWidget *account_name;
61 GtkWidget *store_widget;
62 GtkWidget *transport_widget;
64 GtkWidget *transport_holder;
65 GtkWidget *store_holder;
68 #define MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
69 MODEST_TYPE_ACCOUNT_ASSISTANT, \
70 ModestAccountAssistantPrivate))
72 static GtkAssistantClass *parent_class = NULL;
74 /* uncomment the following if you have defined any signals */
75 /* static guint signals[LAST_SIGNAL] = {0}; */
78 modest_account_assistant_get_type (void)
80 static GType my_type = 0;
82 static const GTypeInfo my_info = {
83 sizeof(ModestAccountAssistantClass),
85 NULL, /* base finalize */
86 (GClassInitFunc) modest_account_assistant_class_init,
87 NULL, /* class finalize */
88 NULL, /* class data */
89 sizeof(ModestAccountAssistant),
91 (GInstanceInitFunc) modest_account_assistant_init,
94 my_type = g_type_register_static (GTK_TYPE_ASSISTANT,
95 "ModestAccountAssistant",
102 modest_account_assistant_class_init (ModestAccountAssistantClass *klass)
104 GObjectClass *gobject_class;
105 gobject_class = (GObjectClass*) klass;
107 parent_class = g_type_class_peek_parent (klass);
108 gobject_class->finalize = modest_account_assistant_finalize;
110 g_type_class_add_private (gobject_class, sizeof(ModestAccountAssistantPrivate));
112 /* signal definitions go here, e.g.: */
113 /* signals[MY_SIGNAL_1] = */
114 /* g_signal_new ("my_signal_1",....); */
115 /* signals[MY_SIGNAL_2] = */
116 /* g_signal_new ("my_signal_2",....); */
123 add_intro_page (ModestAccountAssistant *assistant)
125 GtkWidget *page, *label;
127 page = gtk_vbox_new (FALSE, 6);
129 label = gtk_label_new (
130 _("Welcome to the account assistant\n\n"
131 "It will help to set up a new e-mail account\n"));
132 gtk_box_pack_start (GTK_BOX(page), label, FALSE, FALSE, 6);
133 gtk_widget_show_all (page);
135 gtk_assistant_append_page (GTK_ASSISTANT(assistant), page);
137 gtk_assistant_set_page_title (GTK_ASSISTANT(assistant), page,
138 _("Modest Account Assistant"));
139 gtk_assistant_set_page_type (GTK_ASSISTANT(assistant), page,
140 GTK_ASSISTANT_PAGE_INTRO);
141 gtk_assistant_set_page_complete (GTK_ASSISTANT(assistant),
147 set_current_page_complete (ModestAccountAssistant *self, gboolean complete)
152 pageno = gtk_assistant_get_current_page (GTK_ASSISTANT(self));
155 page = gtk_assistant_get_nth_page (GTK_ASSISTANT(self), pageno);
156 gtk_assistant_set_page_complete (GTK_ASSISTANT(self), page, complete);
162 identity_page_update_completeness (GtkEditable *editable,
163 ModestAccountAssistant *self)
165 ModestAccountAssistantPrivate *priv;
168 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
170 txt = gtk_entry_get_text (GTK_ENTRY(priv->fullname));
171 if (!txt || strlen(txt) == 0) {
172 set_current_page_complete (self, FALSE);
176 /* FIXME: regexp check for email address */
177 txt = gtk_entry_get_text (GTK_ENTRY(priv->email));
178 if (!modest_text_utils_validate_email_address (txt))
179 set_current_page_complete (self, FALSE);
181 set_current_page_complete (self, TRUE);
186 add_identity_page (ModestAccountAssistant *self)
188 GtkWidget *page, *label, *table;
189 ModestAccountAssistantPrivate *priv;
191 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
193 priv->fullname = gtk_entry_new_with_max_length (40);
194 priv->email = gtk_entry_new_with_max_length (40);
196 page = gtk_vbox_new (FALSE, 6);
198 label = gtk_label_new (
199 _("Please enter your name and your e-mail address below.\n\n"));
200 gtk_box_pack_start (GTK_BOX(page), label, FALSE, FALSE, 6);
202 table = gtk_table_new (2,2, FALSE);
203 gtk_table_attach_defaults (GTK_TABLE(table),gtk_label_new (_("Full name")),
205 gtk_table_attach_defaults (GTK_TABLE(table),gtk_label_new (_("E-mail address")),
207 gtk_table_attach_defaults (GTK_TABLE(table),priv->fullname,
209 gtk_table_attach_defaults (GTK_TABLE(table),priv->email,
212 g_signal_connect (G_OBJECT(priv->fullname), "changed",
213 G_CALLBACK(identity_page_update_completeness),
215 g_signal_connect (G_OBJECT(priv->email), "changed",
216 G_CALLBACK(identity_page_update_completeness),
219 gtk_box_pack_start (GTK_BOX(page), table, FALSE, FALSE, 6);
220 gtk_widget_show_all (page);
222 gtk_assistant_append_page (GTK_ASSISTANT(self), page);
224 gtk_assistant_set_page_title (GTK_ASSISTANT(self), page,
226 gtk_assistant_set_page_type (GTK_ASSISTANT(self), page,
227 GTK_ASSISTANT_PAGE_INTRO);
228 gtk_assistant_set_page_complete (GTK_ASSISTANT(self),
234 receiving_page_update_completeness (GtkEditable *editable,
235 ModestAccountAssistant *self)
237 ModestAccountAssistantPrivate *priv;
240 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
242 txt = modest_store_widget_get_username (MODEST_STORE_WIDGET (priv->store_widget));
243 if (!txt || strlen(txt) == 0) {
244 set_current_page_complete (self, FALSE);
248 txt = modest_store_widget_get_servername (MODEST_STORE_WIDGET (priv->store_widget));
249 if (!txt || strlen(txt) == 0) {
250 set_current_page_complete (self, FALSE);
253 set_current_page_complete (self, TRUE);
257 on_receiving_combo_box_changed (GtkComboBox *combo, ModestAccountAssistant *self)
259 ModestAccountAssistantPrivate *priv;
261 ModestProtocol proto;
263 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
264 chosen = gtk_combo_box_get_active_text (GTK_COMBO_BOX(combo));
265 if (priv->store_widget)
266 gtk_container_remove (GTK_CONTAINER(priv->store_holder),
269 proto = modest_protocol_info_get_protocol (chosen);
271 /* FIXME: we could have these widgets cached instead of
272 creating them every time */
273 priv->store_widget = modest_store_widget_new (priv->factory, proto);
274 if (proto == MODEST_PROTOCOL_STORE_POP || proto == MODEST_PROTOCOL_STORE_IMAP) {
275 g_signal_connect (priv->store_widget,
277 G_CALLBACK (receiving_page_update_completeness),
279 set_current_page_complete (self, FALSE);
281 set_current_page_complete (self, TRUE);
283 gtk_container_add (GTK_CONTAINER(priv->store_holder),
286 gtk_widget_show_all (priv->store_holder);
291 add_receiving_page (ModestAccountAssistant *self)
293 GtkWidget *page, *box, *combo;
295 ModestAccountAssistantPrivate *priv;
297 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
298 page = gtk_vbox_new (FALSE, 6);
300 gtk_box_pack_start (GTK_BOX(page),
302 _("Please select among the following options")),
304 box = gtk_hbox_new (FALSE, 6);
305 gtk_box_pack_start (GTK_BOX(box),
306 gtk_label_new(_("Server type")),
309 combo = modest_widget_factory_get_combo_box (priv->factory,
310 MODEST_COMBO_BOX_TYPE_STORE_PROTOS);
311 g_signal_connect (G_OBJECT(combo), "changed",
312 G_CALLBACK(on_receiving_combo_box_changed), self);
314 gtk_box_pack_start (GTK_BOX(box), combo, FALSE,FALSE,6);
315 gtk_box_pack_start (GTK_BOX(page), box, FALSE,FALSE, 6);
317 gtk_box_pack_start (GTK_BOX(page), gtk_hseparator_new(), FALSE, FALSE, 0);
319 priv->store_holder = gtk_hbox_new (FALSE, 0);
320 gtk_box_pack_start (GTK_BOX(page), priv->store_holder,
323 /* Force the selection */
324 on_receiving_combo_box_changed (GTK_COMBO_BOX (combo), self);
326 gtk_assistant_append_page (GTK_ASSISTANT(self), page);
328 gtk_assistant_set_page_title (GTK_ASSISTANT(self), page,
329 _("Receiving mail"));
330 gtk_assistant_set_page_type (GTK_ASSISTANT(self), page,
331 GTK_ASSISTANT_PAGE_INTRO);
332 gtk_assistant_set_page_complete (GTK_ASSISTANT(self),
334 gtk_widget_show_all (page);
341 on_sending_combo_box_changed (GtkComboBox *combo, ModestAccountAssistant *self)
343 ModestAccountAssistantPrivate *priv;
346 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
348 chosen = gtk_combo_box_get_active_text (GTK_COMBO_BOX(combo));
350 if (priv->transport_widget)
351 gtk_container_remove (GTK_CONTAINER(priv->transport_holder),
352 priv->transport_widget);
354 priv->transport_widget = modest_transport_widget_new (priv->factory,
355 modest_protocol_info_get_protocol(chosen));
357 gtk_container_add (GTK_CONTAINER(priv->transport_holder),
358 priv->transport_widget);
360 gtk_widget_show_all (priv->transport_holder);
366 add_sending_page (ModestAccountAssistant *self)
368 GtkWidget *page, *box, *combo;
370 ModestAccountAssistantPrivate *priv;
372 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
373 page = gtk_vbox_new (FALSE, 6);
375 gtk_box_pack_start (GTK_BOX(page),
377 _("Please select among the following options")),
379 box = gtk_hbox_new (FALSE, 0);
380 gtk_box_pack_start (GTK_BOX(box),
381 gtk_label_new(_("Server type")),
384 combo = modest_widget_factory_get_combo_box (priv->factory,
385 MODEST_COMBO_BOX_TYPE_TRANSPORT_PROTOS);
386 g_signal_connect (G_OBJECT(combo), "changed",
387 G_CALLBACK(on_sending_combo_box_changed), self);
389 gtk_box_pack_start (GTK_BOX(box), combo, FALSE,FALSE,0);
390 gtk_box_pack_start (GTK_BOX(page), box, FALSE,FALSE, 0);
392 gtk_box_pack_start (GTK_BOX(page), gtk_hseparator_new(), FALSE, FALSE, 0);
394 priv->transport_holder = gtk_hbox_new (FALSE, 0);
395 gtk_box_pack_start (GTK_BOX(page), priv->transport_holder,
398 /* Force the selection */
399 on_sending_combo_box_changed (GTK_COMBO_BOX (combo), self);
401 gtk_assistant_append_page (GTK_ASSISTANT(self), page);
403 gtk_assistant_set_page_title (GTK_ASSISTANT(self), page,
405 gtk_assistant_set_page_type (GTK_ASSISTANT(self), page,
406 GTK_ASSISTANT_PAGE_INTRO);
407 gtk_assistant_set_page_complete (GTK_ASSISTANT(self),
409 gtk_widget_show_all (page);
415 add_final_page (ModestAccountAssistant *self)
417 GtkWidget *page, *box;
418 ModestAccountAssistantPrivate *priv;
420 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
421 page = gtk_vbox_new (FALSE, 6);
423 gtk_box_pack_start (GTK_BOX(page),
425 _("We're almost done. Press 'Apply' to store this new account")),
427 box = gtk_hbox_new (FALSE, 6);
429 gtk_entry_new_with_max_length (40);
430 gtk_entry_set_text (GTK_ENTRY(priv->account_name),
431 gtk_entry_get_text(GTK_ENTRY(priv->email)));
432 gtk_box_pack_start (GTK_BOX(box),gtk_label_new(_("Account name:")),
434 gtk_box_pack_start (GTK_BOX(box),priv->account_name , FALSE,FALSE,6);
436 gtk_box_pack_start (GTK_BOX(page), box, FALSE, FALSE, 6);
438 gtk_assistant_append_page (GTK_ASSISTANT(self), page);
440 gtk_assistant_set_page_title (GTK_ASSISTANT(self), page,
441 _("Account Management"));
442 gtk_assistant_set_page_type (GTK_ASSISTANT(self), page,
443 GTK_ASSISTANT_PAGE_CONFIRM);
445 gtk_assistant_set_page_complete (GTK_ASSISTANT(self),
447 gtk_widget_show_all (page);
452 modest_account_assistant_init (ModestAccountAssistant *obj)
454 ModestAccountAssistantPrivate *priv;
456 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(obj);
457 priv->factory = NULL;
458 priv->account_mgr = NULL;
460 priv->store_widget = NULL;
461 priv->transport_widget = NULL;
465 modest_account_assistant_finalize (GObject *obj)
467 ModestAccountAssistantPrivate *priv;
469 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(obj);
472 g_object_unref (G_OBJECT(priv->factory));
473 priv->factory = NULL;
476 if (priv->account_mgr) {
477 g_object_unref (G_OBJECT(priv->account_mgr));
478 priv->account_mgr = NULL;
483 G_OBJECT_CLASS(parent_class)->finalize (obj);
487 on_cancel (ModestAccountAssistant *self, gpointer user_data)
493 label = gtk_label_new (_("Are you sure you want to cancel\n"
494 "setting up a new account?"));
496 dialog = gtk_dialog_new_with_buttons (_("Cancel"),
498 GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
499 GTK_STOCK_YES, GTK_RESPONSE_ACCEPT,
500 GTK_STOCK_NO, GTK_RESPONSE_CANCEL,
503 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
504 label, FALSE, FALSE, 6);
506 gtk_widget_show_all ((GTK_DIALOG(dialog)->vbox));
508 gtk_window_set_resizable (GTK_WINDOW(dialog), FALSE);
510 response = gtk_dialog_run (GTK_DIALOG(dialog));
511 gtk_widget_destroy (dialog);
514 case GTK_RESPONSE_ACCEPT:
515 /* close the assistant */
516 gtk_widget_hide (GTK_WIDGET(self));
518 case GTK_RESPONSE_CANCEL:
519 /* don't do anything */
521 default: g_assert_not_reached ();
527 get_account_name (ModestAccountAssistant *self)
529 ModestAccountAssistantPrivate *priv;
530 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
532 return gtk_entry_get_text (GTK_ENTRY(priv->account_name));
536 get_fullname (ModestAccountAssistant *self)
538 ModestAccountAssistantPrivate *priv;
539 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
541 return gtk_entry_get_text (GTK_ENTRY(priv->fullname));
547 get_email (ModestAccountAssistant *self)
549 ModestAccountAssistantPrivate *priv;
550 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
552 return gtk_entry_get_text (GTK_ENTRY(priv->email));
557 on_close (ModestAccountAssistant *self, gpointer user_data)
559 gtk_widget_hide (GTK_WIDGET (self));
563 on_apply (ModestAccountAssistant *self, gpointer user_data)
565 ModestAccountAssistantPrivate *priv;
566 ModestProtocol proto;
567 gchar *store_name, *transport_name;
568 const gchar *account_name, *username, *servername;
569 ModestStoreWidget *store;
570 ModestTransportWidget *transport;
572 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
574 /* create server account -> store */
575 store = MODEST_STORE_WIDGET(priv->store_widget);
576 proto = modest_store_widget_get_proto (store);
577 username = modest_store_widget_get_username (store);
578 servername = modest_store_widget_get_servername (store);
579 store_name = g_strdup_printf ("%s:%s@%s", modest_protocol_info_get_protocol_name(proto),
580 username, servername);
582 modest_account_mgr_add_server_account (priv->account_mgr, store_name, servername,
583 username, NULL, proto);
585 /* create server account -> transport */
586 transport = MODEST_TRANSPORT_WIDGET(priv->transport_widget);
587 proto = modest_transport_widget_get_proto (transport);
589 if (proto == MODEST_PROTOCOL_TRANSPORT_SMTP) {
590 servername = modest_transport_widget_get_servername (transport);
591 if (modest_transport_widget_get_requires_auth (transport))
592 username = modest_transport_widget_get_username (transport);
594 username = g_get_user_name ();
596 username = g_get_user_name ();
597 servername = "localhost";
600 transport_name = g_strdup_printf ("%s:%s@%s",
601 modest_protocol_info_get_protocol_name(proto),
602 username, servername);
603 modest_account_mgr_add_server_account (priv->account_mgr,
611 account_name = get_account_name (self);
612 modest_account_mgr_add_account (priv->account_mgr,
616 modest_account_mgr_set_string (priv->account_mgr,
618 MODEST_ACCOUNT_FULLNAME,
619 get_fullname(self), FALSE, NULL);
620 modest_account_mgr_set_string (priv->account_mgr,
622 MODEST_ACCOUNT_EMAIL,
623 get_email(self), FALSE, NULL);
627 g_free (transport_name);
633 modest_account_assistant_new (ModestAccountMgr *account_mgr, ModestWidgetFactory *factory)
636 ModestAccountAssistant *self;
637 ModestAccountAssistantPrivate *priv;
639 g_return_val_if_fail (factory, NULL);
640 g_return_val_if_fail (account_mgr, NULL);
642 obj = g_object_new(MODEST_TYPE_ACCOUNT_ASSISTANT, NULL);
643 self = MODEST_ACCOUNT_ASSISTANT(obj);
645 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
647 g_object_ref (factory);
648 priv->factory = factory;
650 g_object_ref (account_mgr);
651 priv->account_mgr = account_mgr;
653 add_intro_page (self);
654 add_identity_page (self);
655 add_receiving_page (self);
656 add_sending_page (self);
657 add_final_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), "apply",
668 G_CALLBACK(on_apply), NULL);
669 g_signal_connect (G_OBJECT(self), "cancel",
670 G_CALLBACK(on_cancel), NULL);
671 g_signal_connect (G_OBJECT(self), "close",
672 G_CALLBACK(on_close), NULL);
674 return GTK_WIDGET(self);