2f179d87f37277ebf5f21a2ea3cd54aa119a6417
[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 *tmpaccount_name;
151         ModestUIPrivate *priv;
152         ModestConf *conf;
153         gchar *tmptext;
154         gchar *tmptext2;
155
156         g_return_val_if_fail (MODEST_IS_UI(modest_ui), FALSE);
157         priv = MODEST_UI_GET_PRIVATE(MODEST_UI(modest_ui));
158         conf = priv->modest_conf;
159
160         acc_mgr = priv->modest_acc_mgr;
161         id_mgr = priv->modest_id_mgr;
162
163         tmptext2=get_text_from_combobox(glade_xml_get_widget(glade_xml, "AWMailboxtypeComboBox"));
164         tmptext=g_utf8_strdown(tmptext2, -1);
165         g_free(tmptext2);
166
167         tmpaccount_name=search_unused_account_or_identity_name(acc_mgr, "incoming");
168         modest_account_mgr_add_server_account (acc_mgr,
169                                                tmpaccount_name,
170                                                gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "AWInServerComboEntry"))),
171                                                gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "AWUserNameEntry"))),
172                                                gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "AWPasswordEntry"))),
173                                                tmptext);
174         g_free(tmpaccount_name);
175         g_free(tmptext);
176
177         tmpaccount_name=search_unused_account_or_identity_name(acc_mgr, "outgoing");
178         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(glade_xml, "AWUseIncomingCheckButton")))==TRUE)
179                 modest_account_mgr_add_server_account (acc_mgr,
180                                                        tmpaccount_name,
181                                                        gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "AWOutServerComboEntry"))),
182                                                        gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "AWUserNameEntry"))),
183                                                        gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "AWPasswordEntry"))),
184                                                        "smtp");
185         else
186                 modest_account_mgr_add_server_account (acc_mgr,
187                                                        tmpaccount_name,
188                                                        gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "AWOutServerComboEntry"))),
189                                                        gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "AWOutUserNameEntry"))),
190                                                        gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "AWOutPasswordEntry"))),
191                                                        "smtp");
192         g_free(tmpaccount_name);
193
194         tmpaccount_name=search_unused_account_or_identity_name(id_mgr, MODEST_IDENTITY_DEFAULT_IDENTITY);
195         if (!modest_identity_mgr_add_identity (id_mgr,
196                                                tmpaccount_name,
197                                                gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "AWEMailAddressEntry"))),
198                                                "", "", FALSE, NULL, FALSE ))
199                 g_warning ("failed to add default identity");
200
201         g_free(tmpaccount_name);
202         return TRUE;
203 }
204
205
206 void wizard_account_dialog(ModestUI *modest_ui)
207 {
208         GladeXML *glade_xml;
209         GtkWidget *dialog;
210         ModestUIPrivate *priv;
211         GtkWidget *finish_button;
212         GtkWidget *back_button;
213         GtkWidget *next_button;
214         GtkWidget *cancel_button;
215         GtkWidget *notebook;
216         GtkWidget *use_incoming_button;
217         gint cp;
218         gint result;
219         gboolean account_added_successfully=FALSE;
220
221         g_return_if_fail(MODEST_IS_UI(modest_ui));
222         priv = MODEST_UI_GET_PRIVATE(MODEST_UI(modest_ui));
223
224         glade_xml = glade_xml_new(MODEST_GLADE, "account_wizard", NULL);
225
226         dialog = glade_xml_get_widget(glade_xml, "account_wizard");
227
228         gtk_widget_show_all(dialog);
229
230         finish_button=glade_xml_get_widget(glade_xml, "AWFinishButton");
231         back_button=glade_xml_get_widget(glade_xml, "AWBackButton");
232         next_button=glade_xml_get_widget(glade_xml, "AWNextButton");
233         cancel_button=glade_xml_get_widget(glade_xml, "AWCancelButton");
234         notebook=glade_xml_get_widget(glade_xml, "AWNotebook");
235
236         gtk_widget_set_sensitive(finish_button, FALSE);
237
238         use_incoming_button=glade_xml_get_widget(glade_xml, "AWUseIncomingCheckButton");
239         g_signal_connect(use_incoming_button,
240                          "toggled",
241                          G_CALLBACK(wizard_incoming_button_toggled),
242                          glade_xml);
243
244         /* First page not used currently. It's reserved for the account preset. */
245         gtk_notebook_set_current_page (GTK_NOTEBOOK(notebook), 1);
246
247         do {
248                 cp=gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook));
249                 switch (cp) {
250                 case 1:
251                         gtk_widget_set_sensitive(back_button, FALSE);
252                         break;
253                 case 2:
254                         gtk_widget_set_sensitive(back_button, TRUE);
255                         break;
256                 case 3:
257                         gtk_widget_set_sensitive(finish_button, FALSE);
258                         gtk_widget_set_sensitive(next_button, TRUE);
259                         break;
260                 case 4:
261                         gtk_widget_set_sensitive(finish_button, TRUE);
262                         gtk_widget_set_sensitive(next_button, FALSE);
263                         break;
264                 default:
265                         g_error("I'm on page %d of notebook AWNotebook, which shouldn't have happened. Pulling emergency breaks.", cp);
266                         break;
267                 }
268
269                 result=gtk_dialog_run(GTK_DIALOG(dialog));
270
271                 switch (result) {
272                 case 1:
273                         if (advance_sanity_check(NULL, glade_xml, cp)==TRUE)
274                                 gtk_notebook_next_page(GTK_NOTEBOOK(notebook));
275                         break;
276                 case 2:
277                         gtk_notebook_prev_page(GTK_NOTEBOOK(notebook));
278                         break;
279                 case GTK_RESPONSE_ACCEPT:
280                         account_added_successfully=wizard_account_add(glade_xml, modest_ui);
281                         break;
282                 default:
283                         account_added_successfully=FALSE;
284                 }
285         }
286         while(result!=GTK_RESPONSE_DELETE_EVENT && result!=GTK_RESPONSE_CANCEL && account_added_successfully!=TRUE);
287
288         gtk_widget_destroy(dialog);
289         g_object_unref(glade_xml);
290 }
291
292 void new_wizard_account (GtkWidget *widget,
293                          gpointer user_data)
294 {
295         /* This will probably never be used to modify any existing account. */
296         wizard_account_dialog(MODEST_UI(user_data));
297 }
298
299