1 /* modest-ui-wizard.c */
3 /* insert (c)/licensing information) */
6 #include <glade/glade.h>
7 #include <glib/gi18n.h>
12 #endif /*HAVE_CONFIG_H*/
14 #include "../modest-account-mgr.h"
15 #include "../modest-identity-mgr.h"
17 #include "modest-ui-glade.h"
18 #include "modest-ui-account-setup.h"
33 typedef struct _CallbackData CallbackData;
35 struct _CallbackData {
36 GtkWidget *id_tree_view;
37 GtkWidget *acc_tree_view;
43 identity_setup_dialog (ModestUI *, GtkListStore *, gchar *);
46 missing_notification(GtkWindow *, gchar *);
51 edit_action(GtkWidget *button,
54 CallbackData *cb_data;
55 GtkListStore *acc_liststore;
56 GtkTreeModel *id_liststore;
57 GtkTreeSelection *selection;
58 GtkTreeIter selected_iter;
61 cb_data = (CallbackData *) userdata;
62 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(cb_data->id_tree_view));
64 gtk_tree_selection_get_selected(selection,
67 gtk_tree_model_get(GTK_TREE_MODEL(id_liststore),
69 ACCOUNT_NAME, &identity_name,
71 acc_liststore=GTK_LIST_STORE(gtk_tree_view_get_model (GTK_TREE_VIEW(cb_data->acc_tree_view)));
73 identity_setup_dialog (cb_data->modest_ui, acc_liststore, identity_name);
74 g_free(identity_name);
78 create_action(GtkWidget *button,
81 CallbackData *cb_data;
82 GtkListStore *acc_liststore;
84 cb_data = (CallbackData *) userdata;
86 acc_liststore=GTK_LIST_STORE(gtk_tree_view_get_model (GTK_TREE_VIEW(cb_data->acc_tree_view)));
88 identity_setup_dialog(cb_data->modest_ui, acc_liststore, NULL);
92 delete_action(GtkWidget *button,
95 CallbackData *cb_data;
96 GtkTreeSelection *selection;
97 GtkTreeIter selected_iter;
98 GtkTreeModel *id_liststore;
100 GtkWidget *confirmation_dialog;
101 GtkWidget *confirmation_message;
104 cb_data = (CallbackData *) userdata;
105 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(cb_data->id_tree_view));
107 gtk_tree_selection_get_selected(selection,
110 gtk_tree_model_get(GTK_TREE_MODEL(id_liststore),
112 ACCOUNT_NAME, &identity_name,
115 confirmation_dialog = gtk_dialog_new_with_buttons ("Confirm removal of identity",
116 GTK_WINDOW(gtk_widget_get_toplevel(button)),
117 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
124 gchar *messy = g_strdup_printf("Remove selected identity '%s'?", identity_name);
125 confirmation_message = gtk_label_new_with_mnemonic (messy);
127 gtk_container_add(GTK_CONTAINER(confirmation_dialog),
128 confirmation_message);
130 gtk_widget_show_all(confirmation_dialog);
132 result=gtk_dialog_run(GTK_DIALOG(confirmation_dialog));
133 if (result==GTK_RESPONSE_OK)
135 modest_identity_mgr_remove_identity(MODEST_UI_GET_PRIVATE(cb_data->modest_ui)->modest_id_mgr,
139 gtk_widget_destroy(confirmation_dialog);
140 g_free(identity_name);
146 activate_buttons_on_identity(GtkTreeView *tree_view,
152 glade_xml=(GladeXML *) user_data;
154 button = glade_xml_get_widget(GLADE_XML(glade_xml), "IdentityEditButton");
155 gtk_widget_set_sensitive(GTK_WIDGET(button), TRUE);
156 button = glade_xml_get_widget(GLADE_XML(glade_xml), "IdentityDeleteButton");
157 gtk_widget_set_sensitive(GTK_WIDGET(button), TRUE);
161 use_sig_toggled(GtkToggleButton *button,
165 GladeXML *glade_xml = (GladeXML *) userdata;
167 awidget=glade_xml_get_widget(glade_xml, "ISSignatureTextView");
168 gtk_widget_set_sensitive(awidget, gtk_toggle_button_get_active(button));
174 missing_notification(GtkWindow *parent, gchar *info_message) {
175 GtkWidget *DenyDialog;
177 DenyDialog=gtk_message_dialog_new(parent,
184 gtk_dialog_run(GTK_DIALOG(DenyDialog));
186 gtk_widget_destroy(DenyDialog);
190 add_identity(GladeXML *glade_xml, ModestUI *modest_ui, GtkListStore *accounts_model)
193 GtkTextBuffer *sigbuff;
195 GtkTextIter start_iter;
196 GtkTextIter end_iter;
197 GtkTreeIter transport_iter;
198 ModestUIPrivate *priv;
202 priv = MODEST_UI_GET_PRIVATE(MODEST_UI(modest_ui));
204 reply_to = g_strdup_printf("%s", gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "ISReplyToEntry"))));
206 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(glade_xml, "ISUseSignatureCheckButton"))))
208 sigbuff = gtk_text_view_get_buffer(GTK_TEXT_VIEW(glade_xml_get_widget(glade_xml, "ISSignatureTextView")));
209 gtk_text_buffer_get_bounds(sigbuff,
212 signature = gtk_text_buffer_get_text(sigbuff,
220 if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(glade_xml_get_widget(glade_xml, "ISOutServerComboBox")), &transport_iter)) {
221 gtk_tree_model_get(GTK_TREE_MODEL(accounts_model),
223 ACCOUNT_NAME, &transport,
227 missing_notification(NULL, "Please select an outgoing server!");
231 if (modest_identity_mgr_add_identity (priv->modest_id_mgr,
232 gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "ISIdentityEntry"))),
233 gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "ISNameEntry"))),
234 gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(glade_xml, "ISEMailAddress"))),
237 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(glade_xml, "ISUseSignatureCheckButton"))),
248 identity_setup_dialog (ModestUI *modest_ui, GtkListStore *accounts_model, gchar *identity)
252 GtkWidget *id_dialog;
253 GtkWidget *outgoing_server;
255 GtkCellRenderer *renderer;
256 ModestIdentityMgr *id_mgr;
257 GtkTextBuffer *sigbuff;
259 gint account_added_successfully;
262 glade_xml = glade_xml_new(MODEST_GLADE, "IdentitySetupDialog", NULL);
263 id_dialog = glade_xml_get_widget(glade_xml, "IdentitySetupDialog");
265 outgoing_server = glade_xml_get_widget(glade_xml, "ISOutServerComboBox");
266 gtk_combo_box_set_model(GTK_COMBO_BOX(outgoing_server), GTK_TREE_MODEL(accounts_model));
267 renderer = gtk_cell_renderer_text_new ();
268 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (outgoing_server), renderer, TRUE);
269 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (outgoing_server), renderer,
272 awidget=glade_xml_get_widget(glade_xml, "ISUseSignatureCheckButton");
273 g_signal_connect(awidget,
275 G_CALLBACK(use_sig_toggled),
278 if (identity!=NULL) {
279 id_mgr = MODEST_UI_GET_PRIVATE(modest_ui)->modest_id_mgr;
281 awidget=glade_xml_get_widget(glade_xml, "ISIdentityEntry");
282 gtk_widget_set_sensitive(awidget, FALSE);
283 gtk_entry_set_text(GTK_ENTRY(awidget), identity);
284 tmptext = modest_identity_mgr_get_identity_string(id_mgr,
286 MODEST_IDENTITY_EMAIL,
288 awidget=glade_xml_get_widget(glade_xml, "ISEMailAddress");
289 gtk_entry_set_text(GTK_ENTRY(awidget), tmptext);
292 if (modest_identity_mgr_get_identity_bool(id_mgr,
294 MODEST_IDENTITY_USE_SIGNATURE,
296 awidget=glade_xml_get_widget(glade_xml, "ISUseSignatureCheckButton");
297 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(awidget), TRUE);
298 awidget=glade_xml_get_widget(glade_xml, "ISSignatureTextView");
299 gtk_widget_set_sensitive(awidget, TRUE);
302 sigbuff=gtk_text_buffer_new(NULL);
303 tmptext = modest_identity_mgr_get_identity_string(id_mgr,
305 MODEST_IDENTITY_SIGNATURE,
307 gtk_text_buffer_set_text(sigbuff, tmptext, -1);
308 gtk_text_view_set_buffer(GTK_TEXT_VIEW(glade_xml_get_widget(glade_xml, "ISSignatureTextView")),
310 g_object_unref(sigbuff);
313 tmptext = modest_identity_mgr_get_identity_string(id_mgr,
315 MODEST_IDENTITY_EMAIL,
317 awidget=glade_xml_get_widget(glade_xml, "ISEMailAddress");
318 gtk_entry_set_text(GTK_ENTRY(awidget), tmptext);
321 tmptext = modest_identity_mgr_get_identity_string(id_mgr,
323 MODEST_IDENTITY_REALNAME,
325 awidget=glade_xml_get_widget(glade_xml, "ISNameEntry");
326 gtk_entry_set_text(GTK_ENTRY(awidget), tmptext);
329 tmptext = modest_identity_mgr_get_identity_string(id_mgr,
331 MODEST_IDENTITY_REALNAME,
333 awidget=glade_xml_get_widget(glade_xml, "ISNameEntry");
334 gtk_entry_set_text(GTK_ENTRY(awidget), tmptext);
338 tmptext = modest_identity_mgr_get_identity_string(id_mgr,
340 MODEST_IDENTITY_REPLYTO,
342 awidget=glade_xml_get_widget(glade_xml, "ISReplyToEntry");
343 gtk_entry_set_text(GTK_ENTRY(awidget), tmptext);
348 gtk_widget_show_all(id_dialog);
351 result=gtk_dialog_run(GTK_DIALOG(id_dialog));
354 case GTK_RESPONSE_OK:
355 account_added_successfully = add_identity(glade_xml, modest_ui, accounts_model);
358 account_added_successfully = FALSE;
361 } while(result!=GTK_RESPONSE_DELETE_EVENT && result!=GTK_RESPONSE_CANCEL && account_added_successfully!=TRUE);
363 gtk_widget_destroy(id_dialog);
364 g_object_unref(glade_xml);
368 static CallbackData *
369 setup_callback_data(GtkWidget *id_tree_view,
370 GtkWidget *acc_tree_view,
374 self = g_malloc(sizeof(CallbackData));
375 self->modest_ui=modest_ui;
376 self->id_tree_view=id_tree_view;
377 self->acc_tree_view=acc_tree_view;
382 free_callback_data(CallbackData *data)
387 static GtkTreeModel *
388 create_identities_model(ModestIdentityMgr *id_mgr) {
390 GSList *id_names_list;
391 GSList *id_names_list_iter;
392 GtkListStore *id_list_store;
393 GtkTreeIter id_list_store_iter;
397 id_names_list = modest_identity_mgr_identity_names(id_mgr, NULL);
398 id_list_store = gtk_list_store_new(IDENTITY_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
400 for (id_names_list_iter=id_names_list;
401 id_names_list_iter!=NULL;
402 id_names_list_iter=g_slist_next(id_names_list_iter)) {
403 gtk_list_store_append(id_list_store, &id_list_store_iter);
404 tmptext1=modest_identity_mgr_get_identity_string(id_mgr,
405 id_names_list_iter->data,
406 MODEST_IDENTITY_EMAIL,
408 tmptext2=modest_identity_mgr_get_identity_string(id_mgr,
409 id_names_list_iter->data,
410 MODEST_IDENTITY_ID_VIA,
412 gtk_list_store_set(id_list_store, &id_list_store_iter,
413 IDENTITY_NAME, id_names_list_iter->data,
414 IDENTITY_ADDRESS, tmptext1,
415 IDENTITY_VIA, tmptext2,
421 g_slist_free(id_names_list);
423 return GTK_TREE_MODEL(id_list_store);
426 static GtkTreeModel *
427 create_accounts_model(ModestAccountMgr *acc_mgr) {
429 GSList *acc_names_list;
430 GSList *acc_names_list_iter;
431 GtkListStore *acc_list_store;
432 GtkTreeIter acc_list_store_iter;
435 acc_names_list = modest_account_mgr_server_account_names(acc_mgr,
437 MODEST_PROTO_TYPE_ANY,
440 acc_list_store = gtk_list_store_new(ACCOUNT_COLUMNS, G_TYPE_STRING, G_TYPE_STRING);
442 for (acc_names_list_iter=acc_names_list;
443 acc_names_list_iter!=NULL;
444 acc_names_list_iter=g_slist_next(acc_names_list_iter)) {
445 gtk_list_store_append(acc_list_store, &acc_list_store_iter);
446 tmptext=modest_account_mgr_get_server_account_string(acc_mgr,
447 acc_names_list_iter->data,
448 MODEST_ACCOUNT_HOSTNAME,
450 gtk_list_store_set(acc_list_store, &acc_list_store_iter,
451 ACCOUNT_NAME, acc_names_list_iter->data,
452 ACCOUNT_HOST, tmptext,
457 g_slist_free(acc_names_list);
459 return GTK_TREE_MODEL(acc_list_store);
464 accounts_and_identities_dialog (gpointer user_data)
467 GtkWidget *main_dialog;
468 GtkWidget *identities_tree_view;
469 GtkWidget *accounts_tree_view;
470 GtkTreeModel *identities_model;
471 GtkTreeModel *accounts_model;
473 ModestUIPrivate *priv;
475 GtkCellRenderer *renderer;
476 GtkTreeViewColumn *column;
477 CallbackData *cb_data;
480 g_return_if_fail(MODEST_IS_UI(user_data));
481 modest_ui = (ModestUI *) user_data;
482 priv = MODEST_UI_GET_PRIVATE(modest_ui);
484 glade_xml = glade_xml_new(MODEST_GLADE, "IdentitiesAndAccountsDialog", NULL);
485 main_dialog = glade_xml_get_widget(glade_xml, "IdentitiesAndAccountsDialog");
488 accounts_tree_view = glade_xml_get_widget(glade_xml, "AccountsTreeview");
489 accounts_model=create_accounts_model(priv->modest_acc_mgr);
490 gtk_tree_view_set_model(GTK_TREE_VIEW(accounts_tree_view), accounts_model);
491 /* Account -> Accountname */
492 renderer = gtk_cell_renderer_text_new ();
493 column = gtk_tree_view_column_new_with_attributes ("Account",
495 "text", ACCOUNT_NAME,
497 gtk_tree_view_append_column (GTK_TREE_VIEW(accounts_tree_view), column);
498 /* Account -> Hostname */
499 renderer = gtk_cell_renderer_text_new ();
500 column = gtk_tree_view_column_new_with_attributes ("Hostname",
502 "text", ACCOUNT_HOST,
504 gtk_tree_view_append_column (GTK_TREE_VIEW(accounts_tree_view), column);
507 identities_tree_view = glade_xml_get_widget(glade_xml, "IdentitiesTreeview");
508 identities_model=create_identities_model(priv->modest_id_mgr);
509 gtk_tree_view_set_model(GTK_TREE_VIEW(identities_tree_view), identities_model);
511 /* Identities -> Identityname */
512 renderer = gtk_cell_renderer_text_new ();
513 column = gtk_tree_view_column_new_with_attributes ("Identity",
515 "text", IDENTITY_NAME,
517 gtk_tree_view_append_column (GTK_TREE_VIEW(identities_tree_view), column);
519 /* Identities -> E-mail address */
520 renderer = gtk_cell_renderer_text_new ();
521 column = gtk_tree_view_column_new_with_attributes ("E-mail address",
523 "text", IDENTITY_ADDRESS,
525 gtk_tree_view_append_column (GTK_TREE_VIEW(identities_tree_view), column);
527 /* Identities -> Relay */
528 renderer = gtk_cell_renderer_text_new ();
529 column = gtk_tree_view_column_new_with_attributes ("Transport",
531 "text", IDENTITY_VIA,
533 gtk_tree_view_append_column (GTK_TREE_VIEW(identities_tree_view), column);
535 cb_data=setup_callback_data(identities_tree_view, accounts_tree_view, modest_ui);
537 abutton=glade_xml_get_widget(glade_xml, "IdentityCreateButton");
538 g_signal_connect(abutton,
540 G_CALLBACK(create_action),
542 abutton=glade_xml_get_widget(glade_xml, "IdentityEditButton");
543 g_signal_connect(abutton,
545 G_CALLBACK(edit_action),
547 abutton=glade_xml_get_widget(glade_xml, "IdentityDeleteButton");
548 g_signal_connect(abutton,
550 G_CALLBACK(delete_action),
553 /* FIXME: the edit/delete buttons are sensitive by default
554 * but we have no selection by default.
557 activate_buttons_on_identity(NULL, glade_xml);
559 gtk_widget_show_all(GTK_WIDGET(main_dialog));
561 retval=gtk_dialog_run(GTK_DIALOG(main_dialog));
563 gtk_widget_destroy(GTK_WIDGET(main_dialog));
564 g_object_unref(accounts_model);
565 g_object_unref(identities_model);
566 free_callback_data(cb_data);
567 g_object_unref(glade_xml);
570 void account_settings (GtkWidget *widget,
573 accounts_and_identities_dialog (MODEST_UI(user_data));