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