* added default transport to account creation through wizard
[modest] / src / gtk-glade / modest-ui-wizard.c
1 /* modest-ui-wizard.c */
2
3 /* insert (c)/licensing information) */
4
5 #include <gtk/gtk.h>
6 #include <glade/glade.h>
7 #include <glib/gi18n.h>
8 #include <string.h>
9
10 #ifdef HAVE_CONFIG_H
11 #include <config.h>
12 #endif /*HAVE_CONFIG_H*/
13
14 #include "../modest-account-mgr.h"
15 #include "../modest-identity-mgr.h"
16
17 #include "modest-ui-glade.h"
18 #include "modest-ui-wizard.h"
19
20
21 static void wizard_incoming_button_toggled(GtkWidget *button,
22                                            gpointer userdata) {
23         GtkWidget *awidget;
24         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(button))==TRUE) {
25                 awidget=glade_xml_get_widget(GLADE_XML(userdata), "AWOutUserNameEntry");
26                 gtk_widget_set_sensitive(GTK_WIDGET(awidget), FALSE);
27                 awidget=glade_xml_get_widget(GLADE_XML(userdata), "AWOutPasswordEntry");
28                 gtk_widget_set_sensitive(GTK_WIDGET(awidget), FALSE);
29         }
30         else {
31                 awidget=glade_xml_get_widget(GLADE_XML(userdata), "AWOutUserNameEntry");
32                 gtk_widget_set_sensitive(GTK_WIDGET(awidget), TRUE);
33                 awidget=glade_xml_get_widget(GLADE_XML(userdata), "AWOutPasswordEntry");
34                 gtk_widget_set_sensitive(GTK_WIDGET(awidget), TRUE);
35         }
36 }
37
38 void wizard_missing_notification(GtkWindow *parent, gchar *info_message) {
39         GtkWidget *DenyDialog;
40
41         DenyDialog=gtk_message_dialog_new(parent,
42                                           GTK_DIALOG_MODAL,
43                                           GTK_MESSAGE_INFO,
44                                           GTK_BUTTONS_OK,
45                                           "%s",
46                                           info_message);
47
48         gtk_dialog_run(GTK_DIALOG(DenyDialog));
49
50         gtk_widget_destroy(DenyDialog);
51 }
52
53 gchar *get_text_from_combobox (GtkWidget *combobox){
54         /* Remember to free the returned variable after usage! */
55
56         GtkTreeModel *model = gtk_combo_box_get_model(GTK_COMBO_BOX(combobox));
57         GtkTreeIter iter;
58
59         gchar *value;
60
61         if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combobox), &iter)) {
62                 gtk_tree_model_get(GTK_TREE_MODEL(model),
63                                    &iter,
64                                    0, &value,
65                                    -1);
66         }
67
68         return value;
69 }
70
71
72 gboolean advance_sanity_check(GtkWindow *parent, GladeXML *glade_xml, gint cp) {
73         gchar *tmptext;
74
75         /* FIXME:
76          * all calls to wizard_missing_notification lack the parent window.
77          */
78
79         switch (cp) {
80         case 1:
81                 /* Only needed if the "mailbox name" field is used in the first page of the wizard.
82                  * if (strlen(gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "AWMailboxnameEntry"))))==0)
83                  * {
84                  *         wizard_missing_notification(NULL, "Please enter mailbox name");
85                  *         return FALSE;
86                  * }
87                  */
88                 if (strlen(gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "AWEMailAddressEntry"))))==0) {
89                         wizard_missing_notification(NULL, "Please enter the E-Mail address.");
90                         return FALSE;
91                 }
92                 return TRUE;
93                 break;
94         case 2:
95                 tmptext=gtk_combo_box_get_active_text(GTK_COMBO_BOX(glade_xml_get_widget(glade_xml, "AWMailboxtypeComboBox")));
96                 if (tmptext==NULL) {
97                         wizard_missing_notification(NULL, "Please select mailbox type.");
98                         return FALSE;
99                 }
100                 g_free(tmptext);
101                 if (strlen(gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "AWInServerComboEntry"))))==0) {
102                         wizard_missing_notification(NULL, "Please specify incoming server adress.");
103                         return FALSE;
104                 }
105                 if (strlen(gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "AWUserNameEntry"))))==0) {
106                         wizard_missing_notification(NULL, "Please enter user name.");
107                         return FALSE;
108                 }
109                 return TRUE;
110                 break;
111         case 3:
112                 if (strlen(gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "AWOutServerComboEntry"))))==0) {
113                         wizard_missing_notification(NULL, "Please specify outgoing server address.");
114                         return FALSE;
115                 }
116                 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(glade_xml, "AWUseIncomingCheckButton")))==FALSE
117                     && strlen(gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "AWOutUserNameEntry"))))==0) {
118                         wizard_missing_notification(NULL, "Please enter user name.");
119                         return FALSE;
120                 }
121
122                 return TRUE;
123                 break;
124         }
125
126         return FALSE;
127 }
128
129 gchar *search_unused_account_or_identity_name(gpointer mgr, gchar *draft) {
130         GString *tmpaccount_name;
131         gint counter;
132
133         tmpaccount_name=g_string_new("");
134         g_string_printf(tmpaccount_name, "%s", draft);
135         if(MODEST_IS_ACCOUNT_MGR(mgr)) {
136                 for(counter=0; modest_account_mgr_server_account_exists(mgr, tmpaccount_name->str, NULL); counter++)
137                         g_string_printf(tmpaccount_name, "%s%d", draft, counter);
138         }
139         else
140                 for(counter=0;      modest_identity_mgr_identity_exists(mgr, tmpaccount_name->str, NULL); counter++)
141                         g_string_printf(tmpaccount_name, "%s%d", draft, counter);
142
143         return g_string_free(tmpaccount_name, FALSE);
144 }
145
146 gboolean wizard_account_add(GladeXML *glade_xml, ModestUI *modest_ui)
147 {
148         ModestAccountMgr *acc_mgr;
149         ModestIdentityMgr *id_mgr;
150         gchar *store;
151         gchar *transport;
152         gchar *identity;
153         ModestUIPrivate *priv;
154         ModestConf *conf;
155         gchar *tmptext;
156         gchar *tmptext2;
157
158         g_return_val_if_fail (MODEST_IS_UI(modest_ui), FALSE);
159         priv = MODEST_UI_GET_PRIVATE(MODEST_UI(modest_ui));
160         conf = priv->modest_conf;
161
162         acc_mgr = priv->modest_acc_mgr;
163         id_mgr = priv->modest_id_mgr;
164
165         tmptext2=get_text_from_combobox(glade_xml_get_widget(glade_xml, "AWMailboxtypeComboBox"));
166         tmptext=g_utf8_strdown(tmptext2, -1);
167         g_free(tmptext2);
168
169         store=search_unused_account_or_identity_name(acc_mgr, "incoming");
170         modest_account_mgr_add_server_account (acc_mgr,
171                                                store,
172                                                gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "AWInServerComboEntry"))),
173                                                gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "AWUserNameEntry"))),
174                                                gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "AWPasswordEntry"))),
175                                                tmptext);
176         g_free(store);
177         g_free(tmptext);
178
179         transport=search_unused_account_or_identity_name(acc_mgr, "outgoing");
180         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(glade_xml, "AWUseIncomingCheckButton")))==TRUE)
181                 modest_account_mgr_add_server_account (acc_mgr,
182                                                        transport,
183                                                        gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "AWOutServerComboEntry"))),
184                                                        gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "AWUserNameEntry"))),
185                                                        gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "AWPasswordEntry"))),
186                                                        "smtp");
187         else
188                 modest_account_mgr_add_server_account (acc_mgr,
189                                                        transport,
190                                                        gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "AWOutServerComboEntry"))),
191                                                        gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "AWOutUserNameEntry"))),
192                                                        gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "AWOutPasswordEntry"))),
193                                                        "smtp");
194
195         identity=search_unused_account_or_identity_name(id_mgr, MODEST_IDENTITY_DEFAULT_IDENTITY);
196         if (!modest_identity_mgr_add_identity (id_mgr,
197                                                identity,
198                                                gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "AWEMailAddressEntry"))),
199                                                "", "", FALSE, transport, FALSE ))
200                 g_warning ("failed to add default identity");
201
202         g_free(transport);
203         g_free(identity);
204         return TRUE;
205 }
206
207
208 void wizard_account_dialog(ModestUI *modest_ui)
209 {
210         GladeXML *glade_xml;
211         GtkWidget *dialog;
212         ModestUIPrivate *priv;
213         GtkWidget *finish_button;
214         GtkWidget *back_button;
215         GtkWidget *next_button;
216         GtkWidget *cancel_button;
217         GtkWidget *notebook;
218         GtkWidget *use_incoming_button;
219         gint cp;
220         gint result;
221         gboolean account_added_successfully=FALSE;
222
223         g_return_if_fail(MODEST_IS_UI(modest_ui));
224         priv = MODEST_UI_GET_PRIVATE(MODEST_UI(modest_ui));
225
226         glade_xml = glade_xml_new(MODEST_GLADE, "account_wizard", NULL);
227
228         dialog = glade_xml_get_widget(glade_xml, "account_wizard");
229
230         gtk_widget_show_all(dialog);
231
232         finish_button=glade_xml_get_widget(glade_xml, "AWFinishButton");
233         back_button=glade_xml_get_widget(glade_xml, "AWBackButton");
234         next_button=glade_xml_get_widget(glade_xml, "AWNextButton");
235         cancel_button=glade_xml_get_widget(glade_xml, "AWCancelButton");
236         notebook=glade_xml_get_widget(glade_xml, "AWNotebook");
237
238         gtk_widget_set_sensitive(finish_button, FALSE);
239
240         use_incoming_button=glade_xml_get_widget(glade_xml, "AWUseIncomingCheckButton");
241         g_signal_connect(use_incoming_button,
242                          "toggled",
243                          G_CALLBACK(wizard_incoming_button_toggled),
244                          glade_xml);
245
246         /* First page not used currently. It's reserved for the account preset. */
247         gtk_notebook_set_current_page (GTK_NOTEBOOK(notebook), 1);
248
249         do {
250                 cp=gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook));
251                 switch (cp) {
252                 case 1:
253                         gtk_widget_set_sensitive(back_button, FALSE);
254                         break;
255                 case 2:
256                         gtk_widget_set_sensitive(back_button, TRUE);
257                         break;
258                 case 3:
259                         gtk_widget_set_sensitive(finish_button, FALSE);
260                         gtk_widget_set_sensitive(next_button, TRUE);
261                         break;
262                 case 4:
263                         gtk_widget_set_sensitive(finish_button, TRUE);
264                         gtk_widget_set_sensitive(next_button, FALSE);
265                         break;
266                 default:
267                         g_error("I'm on page %d of notebook AWNotebook, which shouldn't have happened. Pulling emergency breaks.", cp);
268                         break;
269                 }
270
271                 result=gtk_dialog_run(GTK_DIALOG(dialog));
272
273                 switch (result) {
274                 case 1:
275                         if (advance_sanity_check(NULL, glade_xml, cp)==TRUE)
276                                 gtk_notebook_next_page(GTK_NOTEBOOK(notebook));
277                         break;
278                 case 2:
279                         gtk_notebook_prev_page(GTK_NOTEBOOK(notebook));
280                         break;
281                 case GTK_RESPONSE_ACCEPT:
282                         account_added_successfully=wizard_account_add(glade_xml, modest_ui);
283                         break;
284                 default:
285                         account_added_successfully=FALSE;
286                 }
287         }
288         while(result!=GTK_RESPONSE_DELETE_EVENT && result!=GTK_RESPONSE_CANCEL && account_added_successfully!=TRUE);
289
290         gtk_widget_destroy(dialog);
291         g_object_unref(glade_xml);
292 }
293
294 void new_wizard_account (GtkWidget *widget,
295                          gpointer user_data)
296 {
297         /* This will probably never be used to modify any existing account. */
298         wizard_account_dialog(MODEST_UI(user_data));
299 }
300
301