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