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"
31 #include "modest-store-widget.h"
32 #include "modest-transport-widget.h"
36 /* 'private'/'protected' functions */
37 static void modest_account_assistant_class_init (ModestAccountAssistantClass *klass);
38 static void modest_account_assistant_init (ModestAccountAssistant *obj);
39 static void modest_account_assistant_finalize (GObject *obj);
48 typedef struct _ModestAccountAssistantPrivate ModestAccountAssistantPrivate;
49 struct _ModestAccountAssistantPrivate {
51 ModestWidgetFactory *factory;
52 ModestAccountMgr *account_mgr;
54 GtkWidget *account_name;
58 GtkWidget *store_widget;
59 GtkWidget *transport_widget;
61 GtkWidget *transport_holder;
62 GtkWidget *store_holder;
65 #define MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
66 MODEST_TYPE_ACCOUNT_ASSISTANT, \
67 ModestAccountAssistantPrivate))
69 static GtkAssistantClass *parent_class = NULL;
71 /* uncomment the following if you have defined any signals */
72 /* static guint signals[LAST_SIGNAL] = {0}; */
75 modest_account_assistant_get_type (void)
77 static GType my_type = 0;
79 static const GTypeInfo my_info = {
80 sizeof(ModestAccountAssistantClass),
82 NULL, /* base finalize */
83 (GClassInitFunc) modest_account_assistant_class_init,
84 NULL, /* class finalize */
85 NULL, /* class data */
86 sizeof(ModestAccountAssistant),
88 (GInstanceInitFunc) modest_account_assistant_init,
91 my_type = g_type_register_static (GTK_TYPE_ASSISTANT,
92 "ModestAccountAssistant",
99 modest_account_assistant_class_init (ModestAccountAssistantClass *klass)
101 GObjectClass *gobject_class;
102 gobject_class = (GObjectClass*) klass;
104 parent_class = g_type_class_peek_parent (klass);
105 gobject_class->finalize = modest_account_assistant_finalize;
107 g_type_class_add_private (gobject_class, sizeof(ModestAccountAssistantPrivate));
109 /* signal definitions go here, e.g.: */
110 /* signals[MY_SIGNAL_1] = */
111 /* g_signal_new ("my_signal_1",....); */
112 /* signals[MY_SIGNAL_2] = */
113 /* g_signal_new ("my_signal_2",....); */
120 add_intro_page (ModestAccountAssistant *assistant)
122 GtkWidget *page, *label;
124 page = gtk_vbox_new (FALSE, 6);
126 label = gtk_label_new (
127 _("Welcome to the account assistant\n\n"
128 "It will help to set up a new e-mail account\n"));
129 gtk_box_pack_start (GTK_BOX(page), label, FALSE, FALSE, 6);
130 gtk_widget_show_all (page);
132 gtk_assistant_append_page (GTK_ASSISTANT(assistant), page);
134 gtk_assistant_set_page_title (GTK_ASSISTANT(assistant), page,
135 _("Modest Account Assistant"));
136 gtk_assistant_set_page_type (GTK_ASSISTANT(assistant), page,
137 GTK_ASSISTANT_PAGE_INTRO);
138 gtk_assistant_set_page_complete (GTK_ASSISTANT(assistant),
144 set_current_page_complete (ModestAccountAssistant *self, gboolean complete)
149 pageno = gtk_assistant_get_current_page (GTK_ASSISTANT(self));
150 page = gtk_assistant_get_nth_page (GTK_ASSISTANT(self), pageno);
152 gtk_assistant_set_page_complete (GTK_ASSISTANT(self), page, complete);
157 identity_page_update_completeness (GtkEditable *editable,
158 ModestAccountAssistant *self)
160 ModestAccountAssistantPrivate *priv;
163 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
165 txt = gtk_entry_get_text (GTK_ENTRY(priv->fullname));
166 if (!txt || strlen(txt) == 0) {
167 set_current_page_complete (self, FALSE);
171 /* FIXME: regexp check for email address */
172 txt = gtk_entry_get_text (GTK_ENTRY(priv->email));
173 if (!txt || strlen(txt) == 0) {
174 set_current_page_complete (self, FALSE);
177 set_current_page_complete (self, TRUE);
182 add_identity_page (ModestAccountAssistant *self)
184 GtkWidget *page, *label, *table;
185 ModestAccountAssistantPrivate *priv;
187 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
189 priv->fullname = gtk_entry_new_with_max_length (40);
190 priv->email = gtk_entry_new_with_max_length (40);
192 page = gtk_vbox_new (FALSE, 6);
194 label = gtk_label_new (
195 _("Please enter your name and your e-mail address below.\n\n"));
196 gtk_box_pack_start (GTK_BOX(page), label, FALSE, FALSE, 6);
198 table = gtk_table_new (2,2, FALSE);
199 gtk_table_attach_defaults (GTK_TABLE(table),gtk_label_new (_("Full name")),
201 gtk_table_attach_defaults (GTK_TABLE(table),gtk_label_new (_("E-mail address")),
203 gtk_table_attach_defaults (GTK_TABLE(table),priv->fullname,
205 gtk_table_attach_defaults (GTK_TABLE(table),priv->email,
208 g_signal_connect (G_OBJECT(priv->fullname), "changed",
209 G_CALLBACK(identity_page_update_completeness),
211 g_signal_connect (G_OBJECT(priv->email), "changed",
212 G_CALLBACK(identity_page_update_completeness),
215 gtk_box_pack_start (GTK_BOX(page), table, FALSE, FALSE, 6);
216 gtk_widget_show_all (page);
218 gtk_assistant_append_page (GTK_ASSISTANT(self), page);
220 gtk_assistant_set_page_title (GTK_ASSISTANT(self), page,
222 gtk_assistant_set_page_type (GTK_ASSISTANT(self), page,
223 GTK_ASSISTANT_PAGE_INTRO);
224 gtk_assistant_set_page_complete (GTK_ASSISTANT(self),
230 on_receiving_combo_box_changed (GtkComboBox *combo, ModestAccountAssistant *self)
232 ModestAccountAssistantPrivate *priv;
235 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
236 chosen = gtk_combo_box_get_active_text (GTK_COMBO_BOX(combo));
238 if (priv->store_widget)
239 gtk_container_remove (GTK_CONTAINER(priv->store_holder),
242 priv->store_widget = modest_store_widget_new (priv->factory, chosen);
244 gtk_container_add (GTK_CONTAINER(priv->store_holder),
247 gtk_widget_show_all (priv->store_holder);
252 add_receiving_page (ModestAccountAssistant *self)
254 GtkWidget *page, *box, *combo;
256 ModestAccountAssistantPrivate *priv;
258 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
259 page = gtk_vbox_new (FALSE, 6);
261 gtk_box_pack_start (GTK_BOX(page),
263 _("Please select among the following options")),
265 box = gtk_hbox_new (FALSE, 6);
266 gtk_box_pack_start (GTK_BOX(box),
267 gtk_label_new(_("Server type")),
270 combo = modest_widget_factory_get_combo_box (priv->factory,
271 MODEST_COMBO_BOX_TYPE_STORE_PROTOS);
272 g_signal_connect (G_OBJECT(combo), "changed",
273 G_CALLBACK(on_receiving_combo_box_changed), self);
275 gtk_box_pack_start (GTK_BOX(box), combo, FALSE,FALSE,6);
276 gtk_box_pack_start (GTK_BOX(page), box, FALSE,FALSE, 6);
278 gtk_box_pack_start (GTK_BOX(page), gtk_hseparator_new(), FALSE, FALSE, 0);
280 priv->store_holder = gtk_hbox_new (FALSE, 0);
281 gtk_box_pack_start (GTK_BOX(page), priv->store_holder,
284 gtk_assistant_append_page (GTK_ASSISTANT(self), page);
286 gtk_assistant_set_page_title (GTK_ASSISTANT(self), page,
287 _("Receiving mail"));
288 gtk_assistant_set_page_type (GTK_ASSISTANT(self), page,
289 GTK_ASSISTANT_PAGE_INTRO);
290 gtk_assistant_set_page_complete (GTK_ASSISTANT(self),
292 gtk_widget_show_all (page);
299 on_sending_combo_box_changed (GtkComboBox *combo, ModestAccountAssistant *self)
301 ModestAccountAssistantPrivate *priv;
304 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
306 chosen = gtk_combo_box_get_active_text (GTK_COMBO_BOX(combo));
308 if (priv->transport_widget)
309 gtk_container_remove (GTK_CONTAINER(priv->transport_holder),
310 priv->transport_widget);
312 priv->transport_widget = modest_transport_widget_new (priv->factory,
315 gtk_container_add (GTK_CONTAINER(priv->transport_holder),
316 priv->transport_widget);
318 gtk_widget_show_all (priv->transport_holder);
324 add_sending_page (ModestAccountAssistant *self)
326 GtkWidget *page, *box, *combo;
328 ModestAccountAssistantPrivate *priv;
330 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
331 page = gtk_vbox_new (FALSE, 6);
333 gtk_box_pack_start (GTK_BOX(page),
335 _("Please select among the following options")),
337 box = gtk_hbox_new (FALSE, 0);
338 gtk_box_pack_start (GTK_BOX(box),
339 gtk_label_new(_("Server type")),
342 combo = modest_widget_factory_get_combo_box (priv->factory,
343 MODEST_COMBO_BOX_TYPE_TRANSPORT_PROTOS);
344 g_signal_connect (G_OBJECT(combo), "changed",
345 G_CALLBACK(on_sending_combo_box_changed), self);
347 gtk_box_pack_start (GTK_BOX(box), combo, FALSE,FALSE,0);
348 gtk_box_pack_start (GTK_BOX(page), box, FALSE,FALSE, 0);
350 gtk_box_pack_start (GTK_BOX(page), gtk_hseparator_new(), FALSE, FALSE, 0);
352 priv->transport_holder = gtk_hbox_new (FALSE, 0);
353 gtk_box_pack_start (GTK_BOX(page), priv->transport_holder,
356 gtk_assistant_append_page (GTK_ASSISTANT(self), page);
358 gtk_assistant_set_page_title (GTK_ASSISTANT(self), page,
360 gtk_assistant_set_page_type (GTK_ASSISTANT(self), page,
361 GTK_ASSISTANT_PAGE_INTRO);
362 gtk_assistant_set_page_complete (GTK_ASSISTANT(self),
364 gtk_widget_show_all (page);
370 add_final_page (ModestAccountAssistant *self)
372 GtkWidget *page, *box;
373 ModestAccountAssistantPrivate *priv;
375 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
376 page = gtk_vbox_new (FALSE, 6);
378 gtk_box_pack_start (GTK_BOX(page),
380 _("We're almost done. Press 'Apply' to store this new account")),
382 box = gtk_hbox_new (FALSE, 6);
384 gtk_entry_new_with_max_length (40);
385 gtk_entry_set_text (GTK_ENTRY(priv->account_name),
386 gtk_entry_get_text(GTK_ENTRY(priv->email)));
387 gtk_box_pack_start (GTK_BOX(box),gtk_label_new(_("Account name:")),
389 gtk_box_pack_start (GTK_BOX(box),priv->account_name , FALSE,FALSE,6);
391 gtk_box_pack_start (GTK_BOX(page), box, FALSE, FALSE, 6);
393 gtk_assistant_append_page (GTK_ASSISTANT(self), page);
395 gtk_assistant_set_page_title (GTK_ASSISTANT(self), page,
396 _("Account Management"));
397 gtk_assistant_set_page_type (GTK_ASSISTANT(self), page,
398 GTK_ASSISTANT_PAGE_CONFIRM);
400 gtk_assistant_set_page_complete (GTK_ASSISTANT(self),
402 gtk_widget_show_all (page);
409 modest_account_assistant_init (ModestAccountAssistant *obj)
411 ModestAccountAssistantPrivate *priv;
413 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(obj);
414 priv->factory = NULL;
415 priv->account_mgr = NULL;
417 priv->store_widget = NULL;
418 priv->transport_widget = NULL;
422 modest_account_assistant_finalize (GObject *obj)
424 ModestAccountAssistantPrivate *priv;
426 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(obj);
429 g_object_unref (G_OBJECT(priv->factory));
430 priv->factory = NULL;
433 if (priv->account_mgr) {
434 g_object_unref (G_OBJECT(priv->account_mgr));
435 priv->account_mgr = NULL;
440 G_OBJECT_CLASS(parent_class)->finalize (obj);
444 on_cancel (ModestAccountAssistant *self, gpointer user_data)
450 label = gtk_label_new (_("Are you sure you want to cancel\n"
451 "setting up a new account?"));
453 dialog = gtk_dialog_new_with_buttons (_("Cancel"),
455 GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
456 GTK_STOCK_YES, GTK_RESPONSE_ACCEPT,
457 GTK_STOCK_NO, GTK_RESPONSE_CANCEL,
460 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
461 label, FALSE, FALSE, 6);
463 gtk_widget_show_all ((GTK_DIALOG(dialog)->vbox));
465 gtk_window_set_resizable (GTK_WINDOW(dialog), FALSE);
467 response = gtk_dialog_run (GTK_DIALOG(dialog));
468 gtk_widget_destroy (dialog);
471 case GTK_RESPONSE_ACCEPT:
472 /* close the assistant */
473 gtk_widget_destroy (GTK_WIDGET(self));
475 case GTK_RESPONSE_CANCEL:
476 /* don't do anything */
478 default: g_assert_not_reached ();
484 get_account_name (ModestAccountAssistant *self)
486 ModestAccountAssistantPrivate *priv;
487 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
489 return gtk_entry_get_text (GTK_ENTRY(priv->account_name));
493 get_fullname (ModestAccountAssistant *self)
495 ModestAccountAssistantPrivate *priv;
496 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
498 return gtk_entry_get_text (GTK_ENTRY(priv->fullname));
504 get_email (ModestAccountAssistant *self)
506 ModestAccountAssistantPrivate *priv;
507 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
509 return gtk_entry_get_text (GTK_ENTRY(priv->email));
515 on_apply (ModestAccountAssistant *self, gpointer user_data)
517 ModestAccountAssistantPrivate *priv;
519 const gchar *account_name;
520 ModestStoreWidget *store;
522 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
526 /* create server account -> store */
527 store = MODEST_STORE_WIDGET(priv->store_widget);
528 store_name = g_strdup_printf ("%s:%s@%s",
529 modest_store_widget_get_proto (store),
530 modest_store_widget_get_username (store),
531 modest_store_widget_get_servername (store));
533 modest_account_mgr_add_server_account (priv->account_mgr,
535 modest_store_widget_get_servername (store),
536 modest_store_widget_get_username (store),
538 modest_store_widget_get_proto (store));
540 /* create server account -> transport */
541 account_name = get_account_name (self);
542 modest_account_mgr_add_account (priv->account_mgr,
546 modest_account_mgr_set_string (priv->account_mgr,
548 MODEST_ACCOUNT_FULLNAME,
549 get_fullname(self), FALSE, NULL);
550 modest_account_mgr_set_string (priv->account_mgr,
552 MODEST_ACCOUNT_EMAIL,
553 get_email(self), FALSE, NULL);
561 modest_account_assistant_new (ModestAccountMgr *account_mgr, ModestWidgetFactory *factory)
564 ModestAccountAssistant *self;
565 ModestAccountAssistantPrivate *priv;
567 g_return_val_if_fail (factory, NULL);
568 g_return_val_if_fail (account_mgr, NULL);
570 obj = g_object_new(MODEST_TYPE_ACCOUNT_ASSISTANT, NULL);
571 self = MODEST_ACCOUNT_ASSISTANT(obj);
573 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
575 g_object_ref (factory);
576 priv->factory = factory;
578 g_object_ref (account_mgr);
579 priv->account_mgr = account_mgr;
581 add_intro_page (self);
582 add_identity_page (self);
583 add_receiving_page (self);
584 add_sending_page (self);
585 add_final_page (self);
587 gtk_assistant_set_current_page (GTK_ASSISTANT(self), 0);
588 gtk_window_set_title (GTK_WINDOW(self),
589 _("Modest Account Wizard"));
590 gtk_window_set_resizable (GTK_WINDOW(self), TRUE);
591 gtk_window_set_default_size (GTK_WINDOW(self), 400, 400);
593 gtk_window_set_modal (GTK_WINDOW(self), TRUE);
595 g_signal_connect (G_OBJECT(self), "apply",
596 G_CALLBACK(on_apply), NULL);
597 g_signal_connect (G_OBJECT(self), "cancel",
598 G_CALLBACK(on_cancel), NULL);
600 return GTK_WIDGET(self);