19b57030a5a192acd93a620babcb93bb3c910369
[modest] / src / gtk2 / modest-account-assistant.c
1 /* Copyright (c) 2006, Nokia Corporation
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
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.
16  *
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.
28  */
29
30 #include "modest-account-assistant.h"
31 #include <string.h>
32
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);
37
38 /* list my signals */
39 enum {
40         /* MY_SIGNAL_1, */
41         /* MY_SIGNAL_2, */
42         LAST_SIGNAL
43 };
44
45 typedef struct _ModestAccountAssistantPrivate ModestAccountAssistantPrivate;
46 struct _ModestAccountAssistantPrivate {
47         ModestWidgetFactory *factory;
48         
49         GtkWidget *fullname;
50         GtkWidget *email;
51
52         /* sending */
53         GtkWidget *servertype_s;
54         GtkWidget *servername_s;
55         GtkWidget *username_s;
56         GtkWidget *server_type_s;
57
58         /* receiving */
59         GtkWidget *servertype_r;
60         GtkWidget *servername_r;
61         GtkWidget *username_r;
62         GtkWidget *server_type_r;
63
64         GtkWidget *remember_pwd;
65         GtkWidget *maildir_chooser;
66         GtkWidget *mbox_chooser;
67
68         GtkWidget *maildir_config;
69         GtkWidget *mbox_config;
70         GtkWidget *imap_pop_config;
71         GtkWidget *smtp_config;
72
73         GtkWidget *receiving_subwidget;
74         GtkWidget *sending_subwidget;   
75         GtkWidget *receiving_child;
76         GtkWidget *sending_child;
77 };
78
79 #define MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
80                                                       MODEST_TYPE_ACCOUNT_ASSISTANT, \
81                                                       ModestAccountAssistantPrivate))
82 /* globals */
83 static GtkAssistantClass *parent_class = NULL;
84
85 /* uncomment the following if you have defined any signals */
86 /* static guint signals[LAST_SIGNAL] = {0}; */
87
88 GType
89 modest_account_assistant_get_type (void)
90 {
91         static GType my_type = 0;
92         if (!my_type) {
93                 static const GTypeInfo my_info = {
94                         sizeof(ModestAccountAssistantClass),
95                         NULL,           /* base init */
96                         NULL,           /* base finalize */
97                         (GClassInitFunc) modest_account_assistant_class_init,
98                         NULL,           /* class finalize */
99                         NULL,           /* class data */
100                         sizeof(ModestAccountAssistant),
101                         1,              /* n_preallocs */
102                         (GInstanceInitFunc) modest_account_assistant_init,
103                 };
104                 my_type = g_type_register_static (GTK_TYPE_ASSISTANT,
105                                                   "ModestAccountAssistant",
106                                                   &my_info, 0);
107         }
108         return my_type;
109 }
110
111 static void
112 modest_account_assistant_class_init (ModestAccountAssistantClass *klass)
113 {
114         GObjectClass *gobject_class;
115         gobject_class = (GObjectClass*) klass;
116
117         parent_class            = g_type_class_peek_parent (klass);
118         gobject_class->finalize = modest_account_assistant_finalize;
119
120         g_type_class_add_private (gobject_class, sizeof(ModestAccountAssistantPrivate));
121
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",....); */
127 /*      etc. */
128 }
129
130
131
132 static void
133 add_intro_page (ModestAccountAssistant *assistant)
134 {
135         GtkWidget *page;
136         GtkWidget *label;
137         
138         page = gtk_vbox_new (FALSE, 6);
139         
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);
145         
146         gtk_assistant_append_page (GTK_ASSISTANT(assistant), page);
147                 
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),
153                                          page, TRUE);
154 }
155
156
157 static void
158 set_current_page_complete (ModestAccountAssistant *self, gboolean complete)
159 {
160         GtkWidget *page;
161         gint pageno;
162
163         pageno = gtk_assistant_get_current_page (GTK_ASSISTANT(self));
164         page   = gtk_assistant_get_nth_page (GTK_ASSISTANT(self), pageno);
165
166         gtk_assistant_set_page_complete (GTK_ASSISTANT(self), page, complete);
167 }
168
169
170 static void
171 identity_page_update_completeness (GtkEditable *editable,
172                                    ModestAccountAssistant *self)
173 {
174         ModestAccountAssistantPrivate *priv;
175         const gchar *txt;
176
177         priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
178
179         txt = gtk_entry_get_text (GTK_ENTRY(priv->fullname));
180         if (!txt || strlen(txt) == 0) {
181                 set_current_page_complete (self, FALSE);
182                 return;
183         }
184
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);
189                 return;
190         }
191         set_current_page_complete (self, TRUE);
192 }
193
194
195 static void
196 add_identity_page (ModestAccountAssistant *self)
197 {
198         GtkWidget *page;
199         GtkWidget *label;
200         GtkWidget *table;
201
202         ModestAccountAssistantPrivate *priv;
203
204         priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
205
206         priv->fullname = gtk_entry_new_with_max_length (40);
207         priv->email    = gtk_entry_new_with_max_length (40);
208         
209         page = gtk_vbox_new (FALSE, 6);
210
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);
214         
215         table = gtk_table_new (2,2, FALSE);
216         gtk_table_attach_defaults (GTK_TABLE(table),gtk_label_new (_("Full name")),
217                                    0,1,0,1);
218         gtk_table_attach_defaults (GTK_TABLE(table),gtk_label_new (_("E-mail address")),
219                                    0,1,1,2);
220         gtk_table_attach_defaults (GTK_TABLE(table),priv->fullname,
221                                    1,2,0,1);
222         gtk_table_attach_defaults (GTK_TABLE(table),priv->email,
223                                    1,2,1,2);
224
225         g_signal_connect (G_OBJECT(priv->fullname), "changed",
226                           G_CALLBACK(identity_page_update_completeness),
227                           self);
228         g_signal_connect (G_OBJECT(priv->email), "changed",
229                           G_CALLBACK(identity_page_update_completeness),
230                           self);
231         
232         gtk_box_pack_start (GTK_BOX(page), table, FALSE, FALSE, 6);
233         gtk_widget_show_all (page);
234         
235         gtk_assistant_append_page (GTK_ASSISTANT(self), page);
236         
237         gtk_assistant_set_page_title (GTK_ASSISTANT(self), page,
238                                       _("Identity"));
239         gtk_assistant_set_page_type (GTK_ASSISTANT(self), page,
240                                      GTK_ASSISTANT_PAGE_INTRO);
241         gtk_assistant_set_page_complete (GTK_ASSISTANT(self),
242                                          page, FALSE);
243 }       
244
245
246
247 static GtkWidget *
248 maildir_configuration (ModestAccountAssistant *self)
249 {
250         ModestAccountAssistantPrivate *priv;
251         GtkWidget *label, *box, *hbox;
252         
253         priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
254         box = gtk_vbox_new (FALSE, 6);
255         
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);
264         
265         label = gtk_label_new (_("Path:"));
266
267         priv->maildir_chooser =
268                 gtk_file_chooser_button_new (_("(none)"),
269                                              GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
270
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);
274
275         gtk_box_pack_start (GTK_BOX(box), hbox, FALSE, FALSE, 6);       
276
277         return box;
278 }
279
280
281 static GtkWidget*
282 mbox_configuration (ModestAccountAssistant *self)
283 {
284         ModestAccountAssistantPrivate *priv;
285         GtkWidget *label, *box, *hbox;
286         
287         priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
288         box = gtk_vbox_new (FALSE, 6);
289         
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);
298         
299         label = gtk_label_new (_("mbox:"));
300
301         priv->mbox_chooser =
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);
307
308         gtk_box_pack_start (GTK_BOX(box), hbox, FALSE, FALSE, 6);       
309
310         return box;
311 }
312
313
314 static GtkWidget*
315 imap_pop_configuration (ModestAccountAssistant *self)
316 {
317         ModestAccountAssistantPrivate *priv;
318         GtkWidget *label, *box, *hbox;
319
320         priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
321         box = gtk_vbox_new (FALSE, 6);
322         
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);
326
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);       
334
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);       
342
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);
346
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),
353                             FALSE, FALSE,0);
354         gtk_box_pack_start (GTK_BOX(box), hbox, FALSE, FALSE, 0);
355         
356         hbox = gtk_hbox_new (FALSE, 6);
357         label = gtk_label_new(NULL);
358
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),
363                             FALSE, FALSE, 0);
364
365         priv->remember_pwd =
366                 gtk_check_button_new_with_label (_("Remember password"));
367         gtk_box_pack_start (GTK_BOX(hbox),priv->remember_pwd,
368                             FALSE, FALSE, 0);
369         
370
371         gtk_box_pack_start (GTK_BOX(box), hbox, FALSE, FALSE, 0);
372
373         return box;
374 }
375
376
377
378 static void
379 on_receiving_combo_box_changed (GtkComboBox *combo, ModestAccountAssistant *self)
380 {
381         ModestAccountAssistantPrivate *priv;
382         gchar *chosen;
383         
384         priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
385         chosen = gtk_combo_box_get_active_text (GTK_COMBO_BOX(combo));
386
387         if (priv->receiving_child)
388                 gtk_container_remove (GTK_CONTAINER(priv->receiving_subwidget),
389                                       priv->receiving_child);
390         
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;
397
398         } else if (strcmp (chosen, MODEST_PROTO_MAILDIR) == 0) {
399
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;
404
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;
410         } else
411                 priv->receiving_child = gtk_label_new (NULL);
412
413         
414         gtk_container_add (GTK_CONTAINER(priv->receiving_subwidget),
415                            priv->receiving_child);
416         
417         gtk_widget_show_all (priv->receiving_subwidget);
418         
419 }       
420
421 static void
422 add_receiving_page (ModestAccountAssistant *self)
423 {
424         GtkWidget *page, *box, *combo;
425
426         ModestAccountAssistantPrivate *priv;
427
428         priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);      
429         page = gtk_vbox_new (FALSE, 6);
430
431         gtk_box_pack_start (GTK_BOX(page),
432                             gtk_label_new (
433                                     _("Please select among the following options")),
434                             FALSE, FALSE, 6);
435         box = gtk_hbox_new (FALSE, 6);
436         gtk_box_pack_start (GTK_BOX(box),
437                             gtk_label_new(_("Server type")),
438                             FALSE,FALSE,6);
439
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);
444
445         gtk_box_pack_start (GTK_BOX(box), combo, FALSE,FALSE,6);
446         gtk_box_pack_start (GTK_BOX(page), box, FALSE,FALSE, 6);
447         
448         gtk_box_pack_start (GTK_BOX(page), gtk_hseparator_new(), FALSE, FALSE, 0);
449
450         priv->receiving_subwidget = gtk_hbox_new (FALSE, 0);
451         gtk_box_pack_start (GTK_BOX(page), priv->receiving_subwidget,
452                             TRUE, TRUE, 0);
453         
454         gtk_assistant_append_page (GTK_ASSISTANT(self), page);
455                 
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);
460
461         gtk_assistant_set_page_complete (GTK_ASSISTANT(self),
462                                          page, TRUE);
463         gtk_widget_show_all (page);
464 }
465
466
467 static GtkWidget*
468 smtp_configuration (ModestAccountAssistant *self)
469 {
470         ModestAccountAssistantPrivate *priv;
471         GtkWidget *label, *box;
472         
473         priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
474         box = gtk_vbox_new (FALSE, 6);
475         
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);
480
481         return box;
482 }
483
484
485 static void
486 on_sending_combo_box_changed (GtkComboBox *combo, ModestAccountAssistant *self)
487 {
488         ModestAccountAssistantPrivate *priv;
489         gchar *chosen;
490         
491         priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
492
493         chosen = gtk_combo_box_get_active_text (GTK_COMBO_BOX(combo));
494
495         if (priv->sending_child)
496                 gtk_container_remove (GTK_CONTAINER(priv->sending_subwidget),
497                                       priv->sending_child);
498         
499         if (strcmp (chosen, MODEST_PROTO_SENDMAIL) == 0) {
500                 priv->sending_child = gtk_label_new (NULL);
501
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;
507         } else
508                 g_assert_not_reached ();
509         
510         gtk_container_add (GTK_CONTAINER(priv->sending_subwidget),
511                            priv->sending_child);
512         gtk_widget_show_all (priv->sending_subwidget);
513 }
514
515
516
517 static void
518 add_sending_page (ModestAccountAssistant *self)
519 {
520         GtkWidget *page, *box, *combo;
521
522         ModestAccountAssistantPrivate *priv;
523
524         priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
525         page = gtk_vbox_new (FALSE, 6);
526         
527         gtk_box_pack_start (GTK_BOX(page),
528                             gtk_label_new (
529                                     _("Please select among the following options")),
530                             FALSE, FALSE, 6);
531         box = gtk_hbox_new (FALSE, 6);
532         gtk_box_pack_start (GTK_BOX(box),
533                             gtk_label_new(_("Server type")),
534                             FALSE,FALSE,6);
535
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);
540
541         gtk_box_pack_start (GTK_BOX(box), combo, FALSE,FALSE,6);
542         gtk_box_pack_start (GTK_BOX(page), box, FALSE,FALSE, 6);
543         
544         gtk_box_pack_start (GTK_BOX(page), gtk_hseparator_new(), FALSE, FALSE, 0);
545
546         priv->sending_subwidget = gtk_hbox_new (FALSE, 0);
547         gtk_box_pack_start (GTK_BOX(page), priv->sending_subwidget,
548                             TRUE, TRUE, 0);
549         
550         gtk_assistant_append_page (GTK_ASSISTANT(self), page);
551                 
552         gtk_assistant_set_page_title (GTK_ASSISTANT(self), page,
553                                       _("Sending mail"));
554         gtk_assistant_set_page_type (GTK_ASSISTANT(self), page,
555                                      GTK_ASSISTANT_PAGE_INTRO);
556
557         gtk_assistant_set_page_complete (GTK_ASSISTANT(self),
558                                          page, TRUE);
559         gtk_widget_show_all (page);
560 }
561
562
563 static void
564 modest_account_assistant_init (ModestAccountAssistant *obj)
565 {       
566         ModestAccountAssistantPrivate *priv;
567                 
568         priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(obj);
569         
570         priv->factory           = NULL;
571
572         priv->maildir_config    = NULL;
573         priv->mbox_config       = NULL;
574         priv->imap_pop_config   = NULL;
575         priv->smtp_config       = NULL;
576         
577         priv->receiving_child   = NULL;
578         priv->sending_child     = NULL;
579 }
580
581 static void
582 modest_account_assistant_finalize (GObject *obj)
583 {
584         ModestAccountAssistantPrivate *priv;
585                 
586         priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(obj);
587
588         if (priv->factory) {
589                 g_object_unref (G_OBJECT(priv->factory));
590                 priv->factory = NULL;
591         }
592
593         G_OBJECT_CLASS(parent_class)->finalize (obj);
594 }
595
596 static void
597 on_cancel (ModestAccountAssistant *self, gpointer user_data)
598 {
599         GtkWidget *label;
600         GtkWidget *dialog;
601         int response;
602         
603         label = gtk_label_new (_("Are you sure you want to cancel\n"
604                                  "setting up a new account?"));
605         
606         dialog = gtk_dialog_new_with_buttons (_("Cancel"),
607                                               GTK_WINDOW(self),
608                                               GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
609                                               GTK_STOCK_YES, GTK_RESPONSE_ACCEPT,
610                                               GTK_STOCK_NO,  GTK_RESPONSE_CANCEL,
611                                               NULL);
612         
613         gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
614                             label, FALSE, FALSE, 6);
615
616         gtk_widget_show_all ((GTK_DIALOG(dialog)->vbox));
617         
618         gtk_window_set_resizable (GTK_WINDOW(dialog), FALSE);
619         
620         response = gtk_dialog_run (GTK_DIALOG(dialog));
621         gtk_widget_destroy (dialog);
622
623         switch (response) {
624         case GTK_RESPONSE_ACCEPT:
625                 /* close the assistant */
626                 gtk_widget_destroy (GTK_WIDGET(self));
627                 break;
628         case GTK_RESPONSE_CANCEL:
629                 /* don't do anything */
630                 break;
631         default: g_assert_not_reached ();
632
633         };
634                              
635 }
636
637
638 GtkWidget*
639 modest_account_assistant_new (ModestWidgetFactory *factory)
640 {
641         GObject *obj;
642         ModestAccountAssistant *self;
643         ModestAccountAssistantPrivate *priv;
644                 
645         g_return_val_if_fail (factory, NULL);
646         
647         obj  = g_object_new(MODEST_TYPE_ACCOUNT_ASSISTANT, NULL);
648         self = MODEST_ACCOUNT_ASSISTANT(obj);
649
650         priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self);
651         g_object_ref (factory);
652         priv->factory = factory;
653         
654         add_intro_page (self);
655         add_identity_page (self); 
656         add_receiving_page (self); 
657         add_sending_page (self); 
658
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);
664         
665         gtk_window_set_modal (GTK_WINDOW(self), TRUE);
666
667         g_signal_connect (G_OBJECT(self), "cancel",
668                           G_CALLBACK(on_cancel), NULL);
669
670         return GTK_WIDGET(self);
671 }