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"
37 /* 'private'/'protected' functions */
38 static void modest_account_assistant_class_init (ModestAccountAssistantClass *klass);
39 static void modest_account_assistant_init (ModestAccountAssistant *obj);
40 static void modest_account_assistant_finalize (GObject *obj);
49 typedef struct _ModestAccountAssistantPrivate ModestAccountAssistantPrivate;
50 struct _ModestAccountAssistantPrivate {
52 ModestWidgetFactory *factory;
53 ModestAccountMgr *account_mgr;
55 GtkWidget *account_name;
59 GtkWidget *store_widget;
60 GtkWidget *transport_widget;
62 GtkWidget *transport_holder;
63 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 HildonWizardDialogClass *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 (HILDON_TYPE_WIZARD_DIALOG,
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 *self)
125 GtkWidget *page, *label;
126 ModestAccountAssistantPrivate *priv;
128 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
130 page = gtk_vbox_new (FALSE, 6);
132 label = gtk_label_new (
133 _("Welcome to the account assistant\n\n"
134 "It will help to set up a new e-mail account\n"));
135 gtk_box_pack_start (GTK_BOX(page), label, FALSE, FALSE, 6);
136 gtk_widget_show_all (page);
138 gtk_notebook_append_page (GTK_NOTEBOOK(priv->notebook), page);
140 //gtk_nootbook_set_page_title (GTK_ASSISTANT(assistant), page,
141 // _("Modest Account Assistant"));
142 //gtk_assistant_set_page_type (GTK_ASSISTANT(assistant), page,
143 // GTK_ASSISTANT_PAGE_INTRO);
144 //gtk_assistant_set_page_complete (GTK_ASSISTANT(assistant),
151 set_current_page_complete (ModestAccountAssistant *self, gboolean complete)
156 pageno = gtk_assistant_get_current_page (GTK_ASSISTANT(self));
157 page = gtk_assistant_get_nth_page (GTK_ASSISTANT(self), pageno);
159 gtk_assistant_set_page_complete (GTK_ASSISTANT(self), page, complete);
166 identity_page_update_completeness (GtkEditable *editable,
167 ModestAccountAssistant *self)
169 ModestAccountAssistantPrivate *priv;
172 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
174 txt = gtk_entry_get_text (GTK_ENTRY(priv->fullname));
175 if (!txt || strlen(txt) == 0) {
176 set_current_page_complete (self, FALSE);
180 txt = gtk_entry_get_text (GTK_ENTRY(priv->email)); // regex scan email address
181 if (!txt || strlen(txt) == 0) {
182 set_current_page_complete (self, FALSE);
185 set_current_page_complete (self, TRUE);
190 add_identity_page (ModestAccountAssistant *self)
192 GtkWidget *page, *label, *table;
193 ModestAccountAssistantPrivate *priv;
195 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
197 priv->fullname = gtk_entry_new_with_max_length (40);
198 priv->email = gtk_entry_new_with_max_length (40);
200 page = gtk_vbox_new (FALSE, 6);
202 label = gtk_label_new (
203 _("Please enter your name and your e-mail address below.\n\n"));
204 gtk_box_pack_start (GTK_BOX(page), label, FALSE, FALSE, 6);
206 table = gtk_table_new (2,2, FALSE);
207 gtk_table_attach_defaults (GTK_TABLE(table),gtk_label_new (_("Full name")),
209 gtk_table_attach_defaults (GTK_TABLE(table),gtk_label_new (_("E-mail address")),
211 gtk_table_attach_defaults (GTK_TABLE(table),priv->fullname,
213 gtk_table_attach_defaults (GTK_TABLE(table),priv->email,
216 g_signal_connect (G_OBJECT(priv->fullname), "changed",
217 G_CALLBACK(identity_page_update_completeness),
219 g_signal_connect (G_OBJECT(priv->email), "changed",
220 G_CALLBACK(identity_page_update_completeness),
223 gtk_box_pack_start (GTK_BOX(page), table, FALSE, FALSE, 6);
225 gtk_notebook_append_page (GTK_NOTEBOOK(priv->notebook), page);
226 gtk_widget_show_all (page);
228 /* gtk_assistant_set_page_title (GTK_ASSISTANT(self), page, */
229 /* _("Identity")); */
230 /* gtk_assistant_set_page_type (GTK_ASSISTANT(self), page, */
231 /* GTK_ASSISTANT_PAGE_INTRO); */
232 /* gtk_assistant_set_page_complete (GTK_ASSISTANT(self), */
238 on_receiving_combo_box_changed (GtkComboBox *combo, ModestAccountAssistant *self)
240 ModestAccountAssistantPrivate *priv;
243 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
244 chosen = gtk_combo_box_get_active_text (GTK_COMBO_BOX(combo));
246 if (priv->store_widget)
247 gtk_container_remove (GTK_CONTAINER(priv->store_holder),
250 priv->store_widget = modest_store_widget_new (priv->factory, chosen);
252 gtk_container_add (GTK_CONTAINER(priv->store_holder),
255 gtk_widget_show_all (priv->store_holder);
260 add_receiving_page (ModestAccountAssistant *self)
262 GtkWidget *page, *box, *combo;
264 ModestAccountAssistantPrivate *priv;
266 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
267 page = gtk_vbox_new (FALSE, 6);
269 gtk_box_pack_start (GTK_BOX(page),
271 _("Please select among the following options")),
273 box = gtk_hbox_new (FALSE, 6);
274 gtk_box_pack_start (GTK_BOX(box),
275 gtk_label_new(_("Server type")),
278 combo = modest_widget_factory_get_combo_box (priv->factory,
279 MODEST_COMBO_BOX_TYPE_STORE_PROTOS);
280 g_signal_connect (G_OBJECT(combo), "changed",
281 G_CALLBACK(on_receiving_combo_box_changed), self);
283 gtk_box_pack_start (GTK_BOX(box), combo, FALSE,FALSE,6);
284 gtk_box_pack_start (GTK_BOX(page), box, FALSE,FALSE, 6);
286 gtk_box_pack_start (GTK_BOX(page), gtk_hseparator_new(), FALSE, FALSE, 0);
288 priv->store_holder = gtk_hbox_new (FALSE, 0);
289 gtk_box_pack_start (GTK_BOX(page), priv->store_holder,
292 gtk_notebook_append_page (GTK_NOTEBOOK(priv->notebook), page);
294 /* gtk_assistant_set_page_title (GTK_ASSISTANT(self), page, */
295 /* _("Receiving mail")); */
296 /* gtk_assistant_set_page_type (GTK_ASSISTANT(self), page, */
297 /* GTK_ASSISTANT_PAGE_INTRO); */
298 /* gtk_assistant_set_page_complete (GTK_ASSISTANT(self), */
300 gtk_widget_show_all (page);
307 on_sending_combo_box_changed (GtkComboBox *combo, ModestAccountAssistant *self)
309 ModestAccountAssistantPrivate *priv;
312 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
314 chosen = gtk_combo_box_get_active_text (GTK_COMBO_BOX(combo));
316 if (priv->transport_widget)
317 gtk_container_remove (GTK_CONTAINER(priv->transport_holder),
318 priv->transport_widget);
320 priv->transport_widget = modest_transport_widget_new (priv->factory,
323 gtk_container_add (GTK_CONTAINER(priv->transport_holder),
324 priv->transport_widget);
326 gtk_widget_show_all (priv->transport_holder);
332 add_sending_page (ModestAccountAssistant *self)
334 GtkWidget *page, *box, *combo;
336 ModestAccountAssistantPrivate *priv;
338 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
339 page = gtk_vbox_new (FALSE, 6);
341 gtk_box_pack_start (GTK_BOX(page),
343 _("Please select among the following options")),
345 box = gtk_hbox_new (FALSE, 0);
346 gtk_box_pack_start (GTK_BOX(box),
347 gtk_label_new(_("Server type")),
350 combo = modest_widget_factory_get_combo_box (priv->factory,
351 MODEST_COMBO_BOX_TYPE_TRANSPORT_PROTOS);
352 g_signal_connect (G_OBJECT(combo), "changed",
353 G_CALLBACK(on_sending_combo_box_changed), self);
355 gtk_box_pack_start (GTK_BOX(box), combo, FALSE,FALSE,0);
356 gtk_box_pack_start (GTK_BOX(page), box, FALSE,FALSE, 0);
358 gtk_box_pack_start (GTK_BOX(page), gtk_hseparator_new(), FALSE, FALSE, 0);
360 priv->transport_holder = gtk_hbox_new (FALSE, 0);
361 gtk_box_pack_start (GTK_BOX(page), priv->transport_holder,
364 gtk_notebook_append_page (GTK_NOTEBOOK(priv->notebook), page);
366 /* gtk_assistant_set_page_title (GTK_ASSISTANT(self), page, */
367 /* _("Sending mail")); */
368 /* gtk_assistant_set_page_type (GTK_ASSISTANT(self), page, */
369 /* GTK_ASSISTANT_PAGE_INTRO); */
370 /* gtk_assistant_set_page_complete (GTK_ASSISTANT(self), */
372 gtk_widget_show_all (page);
378 add_final_page (ModestAccountAssistant *self)
380 GtkWidget *page, *box;
381 ModestAccountAssistantPrivate *priv;
383 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
384 page = gtk_vbox_new (FALSE, 6);
386 gtk_box_pack_start (GTK_BOX(page),
388 _("We're almost done. Press 'Apply' to store this new account")),
390 box = gtk_hbox_new (FALSE, 6);
392 gtk_entry_new_with_max_length (40);
393 gtk_entry_set_text (GTK_ENTRY(priv->account_name),
394 gtk_entry_get_text(GTK_ENTRY(priv->email)));
395 gtk_box_pack_start (GTK_BOX(box),gtk_label_new(_("Account name:")),
397 gtk_box_pack_start (GTK_BOX(box),priv->account_name , FALSE,FALSE,6);
399 gtk_box_pack_start (GTK_BOX(page), box, FALSE, FALSE, 6);
401 gtk_notebook_append_page (GTK_NOTEBOOK(priv->notebook), page);
403 /* gtk_assistant_set_page_title (GTK_ASSISTANT(self), page, */
404 /* _("Account Management")); */
405 /* gtk_assistant_set_page_type (GTK_ASSISTANT(self), page, */
406 /* GTK_ASSISTANT_PAGE_CONFIRM); */
408 /* gtk_assistant_set_page_complete (GTK_ASSISTANT(self), */
410 gtk_widget_show_all (page);
417 modest_account_assistant_init (ModestAccountAssistant *obj)
419 ModestAccountAssistantPrivate *priv;
421 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(obj);
422 priv->factory = NULL;
423 priv->account_mgr = NULL;
425 priv->store_widget = NULL;
426 priv->transport_widget = NULL;
427 priv->notebook = gtk_notebook_new ();
431 modest_account_assistant_finalize (GObject *obj)
433 ModestAccountAssistantPrivate *priv;
435 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(obj);
438 g_object_unref (G_OBJECT(priv->factory));
439 priv->factory = NULL;
442 if (priv->account_mgr) {
443 g_object_unref (G_OBJECT(priv->account_mgr));
444 priv->account_mgr = NULL;
447 G_OBJECT_CLASS(parent_class)->finalize (obj);
451 on_cancel (ModestAccountAssistant *self, gpointer user_data)
457 label = gtk_label_new (_("Are you sure you want to cancel\n"
458 "setting up a new account?"));
460 dialog = gtk_dialog_new_with_buttons (_("Cancel"),
462 GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
463 GTK_STOCK_YES, GTK_RESPONSE_ACCEPT,
464 GTK_STOCK_NO, GTK_RESPONSE_CANCEL,
467 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
468 label, FALSE, FALSE, 6);
470 gtk_widget_show_all ((GTK_DIALOG(dialog)->vbox));
472 gtk_window_set_resizable (GTK_WINDOW(dialog), FALSE);
474 response = gtk_dialog_run (GTK_DIALOG(dialog));
475 gtk_widget_destroy (dialog);
478 case GTK_RESPONSE_ACCEPT:
479 /* close the assistant */
480 gtk_widget_destroy (GTK_WIDGET(self));
482 case GTK_RESPONSE_CANCEL:
483 /* don't do anything */
485 default: g_assert_not_reached ();
491 get_account_name (ModestAccountAssistant *self)
493 ModestAccountAssistantPrivate *priv;
494 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
496 return gtk_entry_get_text (GTK_ENTRY(priv->account_name));
500 get_fullname (ModestAccountAssistant *self)
502 ModestAccountAssistantPrivate *priv;
503 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
505 return gtk_entry_get_text (GTK_ENTRY(priv->fullname));
511 get_email (ModestAccountAssistant *self)
513 ModestAccountAssistantPrivate *priv;
514 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
516 return gtk_entry_get_text (GTK_ENTRY(priv->email));
522 on_apply (ModestAccountAssistant *self, gpointer user_data)
524 ModestAccountAssistantPrivate *priv;
526 const gchar *account_name;
527 ModestStoreWidget *store;
529 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
533 /* create server account -> store */
534 store = MODEST_STORE_WIDGET(priv->store_widget);
535 store_name = g_strdup_printf ("%s:%s@%s",
536 modest_store_widget_get_proto (store),
537 modest_store_widget_get_username (store),
538 modest_store_widget_get_servername (store));
540 modest_account_mgr_add_server_account (priv->account_mgr,
542 modest_store_widget_get_servername (store),
543 modest_store_widget_get_username (store),
545 modest_store_widget_get_proto (store));
547 /* create server account -> transport */
548 account_name = get_account_name (self);
549 modest_account_mgr_add_account (priv->account_mgr,
553 modest_account_mgr_set_string (priv->account_mgr,
555 MODEST_ACCOUNT_FULLNAME,
556 get_fullname(self), FALSE, NULL);
557 modest_account_mgr_set_string (priv->account_mgr,
559 MODEST_ACCOUNT_EMAIL,
560 get_email(self), FALSE, NULL);
568 modest_account_assistant_new (GtkWidget *parent,
569 ModestAccountMgr *account_mgr,
570 ModestWidgetFactory *factory)
573 ModestAccountAssistant *self;
574 ModestAccountAssistantPrivate *priv;
576 g_return_val_if_fail (factory, NULL);
577 g_return_val_if_fail (account_mgr, NULL);
579 obj = g_object_new(MODEST_TYPE_ACCOUNT_ASSISTANT, NULL);
580 self = MODEST_ACCOUNT_ASSISTANT(obj);
582 priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
584 g_object_ref (factory);
585 priv->factory = factory;
587 g_object_ref (account_mgr);
588 priv->account_mgr = account_mgr;
590 add_intro_page (self);
591 add_identity_page (self);
592 add_receiving_page (self);
593 add_sending_page (self);
594 add_final_page (self);
597 //gtk_assistant_set_current_page (GTK_ASSISTANT(self), 0);
598 gtk_window_set_title (GTK_WINDOW(self),
599 _("Modest Account Wizard"));
600 gtk_window_set_resizable (GTK_WINDOW(self), TRUE);
601 gtk_window_set_default_size (GTK_WINDOW(self), 400, 400);
603 gtk_window_set_modal (GTK_WINDOW(self), TRUE);
605 g_signal_connect (G_OBJECT(self), "apply",
606 G_CALLBACK(on_apply), NULL);
607 g_signal_connect (G_OBJECT(self), "cancel",
608 G_CALLBACK(on_cancel), NULL);
610 return GTK_WIDGET(self);