3 /* insert (c)/licensing information) */
6 #include <glade/glade.h>
7 #include <glib/gi18n.h>
12 #endif /*HAVE_CONFIG_H*/
14 /* TODO: put in auto* */
15 #include <tny-text-buffer-stream.h>
16 #include <tny-msg-folder.h>
18 #include "../modest-ui.h"
19 #include "../modest-window-mgr.h"
20 #include "../modest-account-mgr.h"
21 #include "../modest-account-mgr.h"
22 #include "../modest-identity-mgr.h"
24 #include "../modest-tny-account-store.h"
25 #include "../modest-tny-folder-tree-view.h"
26 #include "../modest-tny-header-tree-view.h"
27 #include "../modest-tny-msg-view.h"
28 #include "../modest-tny-transport-actions.h"
29 #include "../modest-tny-store-actions.h"
31 #include "../modest-text-utils.h"
32 #include "../modest-tny-msg-actions.h"
34 #include "../modest-editor-window.h"
36 #include "modest-ui-glade.h"
37 #include "modest-ui-wizard.h"
39 /* 'private'/'protected' functions */
40 static void modest_ui_class_init (ModestUIClass *klass);
41 static void modest_ui_init (ModestUI *obj);
42 static void modest_ui_finalize (GObject *obj);
44 static void modest_ui_window_destroy (GtkWidget *win, GdkEvent *event, gpointer data);
45 static void modest_ui_last_window_closed (GObject *obj, gpointer data);
47 static GtkWidget* modest_main_window_toolbar (void);
48 static GtkWidget* modest_main_window_folder_tree (ModestAccountMgr *modest_acc_mgr,
49 TnyAccountStoreIface *account_store);
50 static GtkWidget* modest_main_window_header_tree (TnyMsgFolderIface *folder);
53 static void on_account_settings1_activate (GtkMenuItem *,
56 static void on_password_requested (ModestTnyAccountStore *account_store,
57 const gchar *account_name, gpointer user_data);
59 static void on_folder_clicked (ModestTnyFolderTreeView *folder_tree,
60 TnyMsgFolderIface *folder,
62 static void on_message_clicked (ModestTnyFolderTreeView *folder_tree,
65 static void on_new_mail_clicked (GtkWidget *widget, ModestUI *modest_ui);
67 static void on_reply_clicked (GtkWidget *widget, ModestUI *modest_ui);
69 static void on_forward_clicked (GtkWidget *widget, ModestUI *modest_ui);
71 static void on_delete_clicked (GtkWidget *widget, ModestUI *modest_ui);
74 static void on_send_button_clicked (GtkWidget *widget, ModestEditorWindow *modest_editwin);
76 static void on_send_button_clicked (GtkWidget *widget, ModestUI *modest_ui);
79 static void on_sendreceive_button_clicked (GtkWidget *widget, ModestUI *modest_ui);
81 static void register_toolbar_callbacks (ModestUI *modest_ui);
85 QUOTED_SEND_REPLY_ALL,
89 static void quoted_send_msg (ModestUI *modest_ui, quoted_send_type qstype);
94 ModestEditorWindow *edit_win;
107 static GObjectClass *parent_class = NULL;
109 /* uncomment the following if you have defined any signals */
110 /* static guint signals[LAST_SIGNAL] = {0}; */
113 modest_ui_get_type (void)
115 static GType my_type = 0;
117 static const GTypeInfo my_info = {
118 sizeof(ModestUIClass),
119 NULL, /* base init */
120 NULL, /* base finalize */
121 (GClassInitFunc) modest_ui_class_init,
122 NULL, /* class finalize */
123 NULL, /* class data */
126 (GInstanceInitFunc) modest_ui_init,
128 my_type = g_type_register_static (G_TYPE_OBJECT,
137 modest_ui_class_init (ModestUIClass *klass)
139 GObjectClass *gobject_class;
140 gobject_class = (GObjectClass*) klass;
142 parent_class = g_type_class_peek_parent (klass);
143 gobject_class->finalize = modest_ui_finalize;
145 g_type_class_add_private (gobject_class, sizeof(ModestUIPrivate));
147 /* signal definitions go here, e.g.: */
148 /* signals[MY_SIGNAL_1] = */
149 /* g_signal_new ("my_signal_1",....); */
150 /* signals[MY_SIGNAL_2] = */
151 /* g_signal_new ("my_signal_2",....); */
157 modest_ui_init (ModestUI *obj)
159 ModestUIPrivate *priv = MODEST_UI_GET_PRIVATE(obj);
161 priv->modest_acc_mgr = NULL;
162 priv->modest_id_mgr = NULL;
163 priv->modest_conf = NULL;
164 priv->modest_window_mgr = NULL;
165 priv->glade_xml = NULL;
171 modest_ui_finalize (GObject *obj)
173 ModestUIPrivate *priv = MODEST_UI_GET_PRIVATE(obj);
175 if (priv->modest_acc_mgr)
176 g_object_unref (priv->modest_acc_mgr);
177 priv->modest_acc_mgr = NULL;
179 if (priv->modest_id_mgr)
180 g_object_unref (priv->modest_id_mgr);
181 priv->modest_id_mgr = NULL;
183 if (priv->modest_conf)
184 g_object_unref (priv->modest_conf);
185 priv->modest_conf = NULL;
187 if (priv->modest_window_mgr)
188 g_object_unref (priv->modest_window_mgr);
189 priv->modest_window_mgr = NULL;
194 modest_ui_new (ModestConf *modest_conf)
197 ModestUIPrivate *priv;
198 ModestAccountMgr *modest_acc_mgr;
199 ModestIdentityMgr *modest_id_mgr;
200 TnyAccountStoreIface *account_store_iface;
202 g_return_val_if_fail (modest_conf, NULL);
204 obj = g_object_new(MODEST_TYPE_UI, NULL);
205 priv = MODEST_UI_GET_PRIVATE(obj);
208 MODEST_ACCOUNT_MGR(modest_account_mgr_new (modest_conf));
209 if (!modest_acc_mgr) {
210 g_warning ("could not create ModestAccountMgr instance");
211 g_object_unref (obj);
216 MODEST_IDENTITY_MGR(modest_identity_mgr_new (modest_conf));
217 if (!modest_id_mgr) {
218 g_warning ("could not create ModestIdentityMgr instance");
219 g_object_unref (obj);
223 account_store_iface =
224 TNY_ACCOUNT_STORE_IFACE(modest_tny_account_store_new (modest_acc_mgr));
225 if (!account_store_iface) {
226 g_warning ("could not initialze ModestTnyAccountStore");
229 g_signal_connect (account_store_iface, "password_requested",
230 G_CALLBACK(on_password_requested),
234 priv->glade_xml = glade_xml_new (MODEST_GLADE, NULL,NULL);
235 if (!priv->glade_xml) {
236 g_warning ("failed to do glade stuff");
237 g_object_unref (obj);
241 /* FIXME: could be used, but doesn't work atm.
242 * glade_xml_signal_autoconnect(priv->glade_xml);
245 priv->modest_acc_mgr = modest_acc_mgr;
246 priv->modest_id_mgr = modest_id_mgr;
247 g_object_ref (priv->modest_conf = modest_conf);
249 priv->account_store = account_store_iface;
251 priv->modest_window_mgr = MODEST_WINDOW_MGR(modest_window_mgr_new());
252 g_signal_connect (priv->modest_window_mgr, "last_window_closed",
253 G_CALLBACK(modest_ui_last_window_closed),
260 modest_ui_show_main_window (ModestUI *modest_ui)
264 ModestUIPrivate *priv;
265 GtkWidget *folder_view, *header_view;
266 GtkWidget *message_view;
267 GtkWidget *account_settings_item;
268 GtkWidget *new_account_item;
269 GtkWidget *delete_item;
270 GtkWidget *AccountWizardryMenu;
272 GtkWidget *folder_view_holder,
276 priv = MODEST_UI_GET_PRIVATE(modest_ui);
278 height = modest_conf_get_int (priv->modest_conf,
279 MODEST_CONF_MAIN_WINDOW_HEIGHT,NULL);
280 width = modest_conf_get_int (priv->modest_conf,
281 MODEST_CONF_MAIN_WINDOW_WIDTH,NULL);
283 win = glade_xml_get_widget (priv->glade_xml, "main");
285 g_warning ("could not create main window");
290 GTK_WIDGET(modest_main_window_folder_tree(priv->modest_acc_mgr,
291 priv->account_store));
292 folder_view_holder = glade_xml_get_widget (priv->glade_xml, "folders");
293 if (!folder_view||!folder_view_holder) {
294 g_warning ("failed to create folder tree");
297 gtk_container_add (GTK_CONTAINER(folder_view_holder), folder_view);
299 header_view = GTK_WIDGET(modest_main_window_header_tree (NULL));
300 header_view_holder = glade_xml_get_widget (priv->glade_xml, "mail_list");
302 g_warning ("failed to create header tree");
305 gtk_container_add (GTK_CONTAINER(header_view_holder), header_view);
307 g_signal_connect (G_OBJECT(folder_view), "folder_selected",
308 G_CALLBACK(on_folder_clicked), modest_ui);
310 message_view = GTK_WIDGET(modest_tny_msg_view_new (NULL));
312 g_warning ("failed to create message view");
315 mail_paned = glade_xml_get_widget (priv->glade_xml, "mail_paned");
316 gtk_paned_add2 (GTK_PANED(mail_paned), message_view);
318 g_signal_connect (header_view, "message_selected",
319 G_CALLBACK(on_message_clicked),
322 account_settings_item = glade_xml_get_widget (priv->glade_xml, "AccountSettingsMenuItem");
323 if (!account_settings_item)
325 g_warning ("The account settings item isn't available!\n");
328 g_signal_connect (account_settings_item, "activate",
329 G_CALLBACK(on_account_settings1_activate),
332 new_account_item = glade_xml_get_widget (priv->glade_xml, "NewAccountWizardMenuItem");
333 if (!new_account_item)
335 g_warning ("The new account item isn't available!\n");
339 g_signal_connect (new_account_item, "activate",
340 G_CALLBACK(new_wizard_account),
343 delete_item = glade_xml_get_widget (priv->glade_xml, "delete1");
346 g_warning ("The delete item isn't available!\n");
350 g_signal_connect (delete_item, "activate", G_CALLBACK(on_delete_clicked),
353 register_toolbar_callbacks (modest_ui);
355 modest_window_mgr_register (priv->modest_window_mgr,
356 G_OBJECT(win), MODEST_MAIN_WINDOW, 0);
357 g_signal_connect (win, "destroy-event", G_CALLBACK(modest_ui_window_destroy),
359 g_signal_connect (win, "delete-event", G_CALLBACK(modest_ui_window_destroy),
361 gtk_widget_set_usize (GTK_WIDGET(win), width, height);
362 gtk_window_set_title (GTK_WINDOW(win), PACKAGE_STRING);
364 gtk_widget_show_all (win);
370 register_toolbar_callbacks (ModestUI *modest_ui)
372 ModestUIPrivate *priv;
375 g_return_if_fail (modest_ui);
377 priv = MODEST_UI_GET_PRIVATE (modest_ui);
379 button = glade_xml_get_widget (priv->glade_xml, "toolb_new_mail");
381 g_signal_connect (button, "clicked",
382 G_CALLBACK(on_new_mail_clicked), modest_ui);
384 button = glade_xml_get_widget (priv->glade_xml, "toolb_reply");
386 g_signal_connect (button, "clicked",
387 G_CALLBACK(on_reply_clicked), modest_ui);
388 gtk_widget_set_sensitive(button, FALSE);
391 button = glade_xml_get_widget (priv->glade_xml, "toolb_reply_all");
393 //g_signal_connect (button, "clicked",
394 // G_CALLBACK(on_reply_all_clicked), modest_ui);
395 gtk_widget_set_sensitive(button, FALSE);
398 button = glade_xml_get_widget (priv->glade_xml, "toolb_forward");
400 g_signal_connect (button, "clicked",
401 G_CALLBACK(on_forward_clicked), modest_ui);
402 gtk_widget_set_sensitive(button, FALSE);
405 button = glade_xml_get_widget (priv->glade_xml, "toolb_move_to");
407 //g_signal_connect (button, "clicked",
408 // G_CALLBACK(on_move_to_clicked), modest_ui);
409 gtk_widget_set_sensitive(button, FALSE);
412 button = glade_xml_get_widget (priv->glade_xml, "toolb_delete");
414 g_signal_connect (button, "clicked",
415 G_CALLBACK(on_delete_clicked), modest_ui);
416 gtk_widget_set_sensitive(button, FALSE);
419 button = glade_xml_get_widget (priv->glade_xml, "toolb_send_receive");
421 g_signal_connect (button, "clicked",
422 G_CALLBACK(on_sendreceive_button_clicked), modest_ui);
423 gtk_widget_set_sensitive(button, TRUE);
429 hide_edit_window (GtkWidget *win, GdkEvent *event, gpointer data)
431 ModestUIPrivate *priv;
433 priv = MODEST_UI_GET_PRIVATE(data);
434 gtk_widget_hide (win);
435 modest_window_mgr_unregister(priv->modest_window_mgr, G_OBJECT(win));
440 close_edit_window (GtkWidget *win, GdkEvent *event, gpointer data)
442 ModestEditorWindow *edit_win;
444 ModestUIPrivate *priv;
445 EditWinData *win_data;
447 edit_win = (ModestEditorWindow *)data;
448 win_data = modest_editor_window_get_data(edit_win);
449 priv = MODEST_UI_GET_PRIVATE(win_data->modest_ui);
451 gtk_widget_hide (GTK_WIDGET(edit_win));
452 modest_window_mgr_unregister(priv->modest_window_mgr, G_OBJECT(edit_win));
453 gtk_widget_destroy(GTK_WIDGET(edit_win));
458 *modest_ui_new_editor_window (ModestUI *modest_ui, gpointer *user_data)
460 GtkWidget *top_container, *to_entry, *subject_entry, *body_view;
462 ModestUIPrivate *priv;
464 GtkWidget *btn, *dummy;
466 EditWinData *win_data;
468 glade_xml = glade_xml_new(MODEST_GLADE, "new_mail_top_container", NULL);
472 win_data = g_malloc(sizeof(EditWinData));
473 win_data->modest_ui = modest_ui;
474 win_data->glade_xml = glade_xml;
475 *user_data = win_data;
477 top_container = glade_xml_get_widget(glade_xml, "new_mail_top_container");
478 if (!top_container) {
479 g_object_unref(G_OBJECT(glade_xml));
483 return GTK_CONTAINER(top_container);
488 modest_ui_editor_window_set_to_header(const gchar *to, gpointer window_data)
492 EditWinData *win_data;
494 win_data = (EditWinData *)window_data;
495 glade_xml = win_data->glade_xml;
496 w = glade_xml_get_widget(glade_xml, "to_entry");
497 gtk_entry_set_text(GTK_ENTRY(w), to);
504 modest_ui_editor_window_set_cc_header(const gchar *cc, gpointer window_data)
508 EditWinData *win_data;
510 win_data = (EditWinData *)window_data;
511 glade_xml = win_data->glade_xml;
513 w = glade_xml_get_widget(glade_xml, "cc_entry");
514 gtk_entry_set_text(GTK_ENTRY(w), cc);
521 modest_ui_editor_window_set_bcc_header(const gchar *bcc, gpointer window_data)
525 EditWinData *win_data;
527 win_data = (EditWinData *)window_data;
528 glade_xml = win_data->glade_xml;
530 w = glade_xml_get_widget(glade_xml, "bcc_entry");
531 gtk_entry_set_text(GTK_ENTRY(w), bcc);
538 modest_ui_editor_window_set_subject_header(const gchar *subject, gpointer window_data)
542 EditWinData *win_data;
544 win_data = (EditWinData *)window_data;
545 glade_xml = win_data->glade_xml;
547 w = glade_xml_get_widget(glade_xml, "subject_entry");
548 gtk_entry_set_text(GTK_ENTRY(w), subject);
555 modest_ui_editor_window_set_body(const gchar *body, gpointer window_data)
558 GtkWidget *body_view;
560 EditWinData *win_data;
562 win_data = (EditWinData *)window_data;
563 glade_xml = win_data->glade_xml;
565 body_view = glade_xml_get_widget(glade_xml, "body_view");
566 buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(body_view));
568 gtk_text_buffer_set_text(GTK_TEXT_BUFFER(buf), body, -1);
575 modest_ui_new_edit_window (ModestUI *modest_ui, const gchar* to,
576 const gchar* cc, const gchar* bcc,
577 const gchar* subject, const gchar *body,
580 GtkWidget *win, *to_entry, *subject_entry, *body_view;
582 ModestUIPrivate *priv;
583 GtkWidget *btn, *dummy;
586 priv = MODEST_UI_GET_PRIVATE(modest_ui);
587 int height = modest_conf_get_int (priv->modest_conf,
588 MODEST_CONF_EDIT_WINDOW_HEIGHT,NULL);
589 int width = modest_conf_get_int (priv->modest_conf,
590 MODEST_CONF_EDIT_WINDOW_WIDTH,NULL);
592 win = glade_xml_get_widget (priv->glade_xml, "new_mail");
594 g_warning ("could not create new mail window");
598 /* FIXME: this also assumes that there can be only one edit window! */
599 if (!modest_window_mgr_find_by_type(priv->modest_window_mgr, MODEST_EDIT_WINDOW)) {
600 /* there already is one edit win, maybe we should preserver its contents */
601 modest_window_mgr_register (priv->modest_window_mgr,
602 G_OBJECT(win), MODEST_EDIT_WINDOW, 0);
605 to_entry = glade_xml_get_widget (priv->glade_xml, "to_entry");
606 subject_entry = glade_xml_get_widget (priv->glade_xml, "subject_entry");
607 body_view = glade_xml_get_widget (priv->glade_xml, "body_view");
609 gtk_entry_set_text(GTK_ENTRY(subject_entry), subject);
610 gtk_entry_set_text(GTK_ENTRY(to_entry), to);
612 buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(body_view));
614 gtk_text_buffer_set_text(buf, body, -1);
616 gtk_text_buffer_set_text(buf, "", -1);
618 g_signal_connect (win, "destroy-event", G_CALLBACK(hide_edit_window),
620 g_signal_connect (win, "delete-event", G_CALLBACK(hide_edit_window),
623 gtk_widget_set_usize (GTK_WIDGET(win), height, width);
624 gtk_window_set_title (GTK_WINDOW(win),
625 subject ? subject : "Untitled");
628 btn = glade_xml_get_widget (priv->glade_xml, "toolb_send");
629 g_signal_connect (btn, "clicked", G_CALLBACK(on_send_button_clicked),
632 gtk_widget_show_all (win);
639 modest_ui_window_destroy (GtkWidget *win, GdkEvent *event, gpointer data)
641 ModestUIPrivate *priv;
643 g_return_if_fail (data);
644 g_return_if_fail(MODEST_IS_UI(data));
645 priv = MODEST_UI_GET_PRIVATE((ModestUI *)data);
646 g_return_if_fail(priv);
647 if (!modest_window_mgr_unregister (priv->modest_window_mgr, G_OBJECT(win)))
648 g_warning ("modest window mgr: failed to unregister %p",
651 gtk_widget_hide(win);
656 modest_ui_last_window_closed (GObject *obj, gpointer data)
658 /* FIXME: Other cleanups todo? Finalize Tinymail? */
664 on_account_selector_selection_changed (GtkWidget *widget,
667 GtkTreeModel *model = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
672 if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget), &iter))
674 gtk_tree_model_get(GTK_TREE_MODEL(model),
681 account_name="empty";
684 g_message("Value: '%s'\n", account_name);
691 on_account_settings1_activate (GtkMenuItem *menuitem,
695 GtkWidget *advanced_account_setup;
696 ModestUIPrivate *priv;
698 GSList *account_name_list;
699 GSList *account_name_list_iter;
700 GtkListStore *account_names;
701 GtkTreeIter account_names_iter;
702 GtkWidget *account_selector;
703 GtkCellRenderer *renderer;
706 g_return_if_fail(MODEST_IS_UI(user_data));
707 priv = MODEST_UI_GET_PRIVATE(MODEST_UI(user_data));
709 glade_xml = glade_xml_new(MODEST_GLADE, "mailbox_setup_advanced", NULL);
710 advanced_account_setup = glade_xml_get_widget(glade_xml, "mailbox_setup_advanced");
712 account_name_list=modest_account_mgr_account_names(priv->modest_acc_mgr, NULL);
713 account_names = gtk_list_store_new(1, G_TYPE_STRING);
715 for (account_name_list_iter=account_name_list;
716 account_name_list_iter!=NULL;
717 account_name_list_iter=g_slist_next(account_name_list_iter))
719 gtk_list_store_append(account_names, &account_names_iter);
720 gtk_list_store_set(account_names, &account_names_iter,
721 0, account_name_list_iter->data,
725 g_slist_free(account_name_list);
727 account_selector = glade_xml_get_widget(glade_xml, "account_selector");
728 gtk_combo_box_set_model(GTK_COMBO_BOX(account_selector), GTK_TREE_MODEL(account_names));
730 renderer = gtk_cell_renderer_text_new ();
731 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (account_selector), renderer, TRUE);
732 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (account_selector), renderer,
736 g_signal_connect(GTK_WIDGET(account_selector), "changed",
737 G_CALLBACK(on_account_selector_selection_changed),
738 GTK_WIDGET(advanced_account_setup));
740 gtk_combo_box_set_active(GTK_COMBO_BOX(account_selector), 0);
742 gtk_widget_show_all(GTK_WIDGET(advanced_account_setup));
744 retval=gtk_dialog_run(GTK_DIALOG(advanced_account_setup));
746 g_object_unref(account_names);
748 gtk_widget_destroy(GTK_WIDGET(advanced_account_setup));
750 g_object_unref(glade_xml);
755 on_folder_clicked (ModestTnyFolderTreeView *folder_tree,
756 TnyMsgFolderIface *folder,
762 ModestTnyHeaderTreeView *tree_view;
763 ModestTnyMsgView *msg_view;
764 ModestUIPrivate *priv;
765 GtkWidget *scrollview;
767 g_return_if_fail (folder);
768 g_return_if_fail (data);
770 priv = MODEST_UI_GET_PRIVATE(data);
771 scrollview = glade_xml_get_widget (priv->glade_xml,"mail_list");
773 tree_view = MODEST_TNY_HEADER_TREE_VIEW(
774 gtk_bin_get_child(GTK_BIN(scrollview)));
775 win = glade_xml_get_widget (priv->glade_xml, "main");
776 gtk_window_set_title (GTK_WINDOW(win),
777 tny_msg_folder_iface_get_name(folder));
779 modest_tny_header_tree_view_set_folder (tree_view,
782 button = glade_xml_get_widget (priv->glade_xml, "toolb_reply");
784 gtk_widget_set_sensitive(button, FALSE);
787 button = glade_xml_get_widget (priv->glade_xml, "toolb_forward");
789 gtk_widget_set_sensitive(button, FALSE);
792 button = glade_xml_get_widget (priv->glade_xml, "toolb_delete");
794 gtk_widget_set_sensitive(button, FALSE);
797 paned = glade_xml_get_widget (priv->glade_xml,"mail_paned");
798 g_return_if_fail (paned);
800 msg_view = MODEST_TNY_MSG_VIEW(gtk_paned_get_child2 (GTK_PANED(paned)));
801 g_return_if_fail (msg_view);
803 modest_tny_msg_view_set_message (msg_view, NULL);
808 on_message_clicked (ModestTnyFolderTreeView *folder_tree,
809 TnyMsgIface *message,
814 ModestTnyMsgView *msg_view;
815 ModestUIPrivate *priv;
817 g_return_if_fail (data);
819 priv = MODEST_UI_GET_PRIVATE(data);
820 paned = glade_xml_get_widget (priv->glade_xml,"mail_paned");
821 msg_view = MODEST_TNY_MSG_VIEW(gtk_paned_get_child2 (GTK_PANED(paned)));
823 modest_tny_msg_view_set_message (msg_view,
825 button = glade_xml_get_widget (priv->glade_xml, "toolb_reply");
827 gtk_widget_set_sensitive(button, TRUE);
829 button = glade_xml_get_widget (priv->glade_xml, "toolb_forward");
831 gtk_widget_set_sensitive(button, TRUE);
833 button = glade_xml_get_widget (priv->glade_xml, "toolb_delete");
835 gtk_widget_set_sensitive(button, TRUE);
841 on_password_requested (ModestTnyAccountStore *account_store,
842 const gchar *account_name, gpointer user_data)
845 GtkWidget *passdialog;
847 GtkWidget *infolabel;
848 GtkWidget *passentry;
850 const gchar *infostring=g_strconcat("Please enter the password for ", account_name, ".", NULL);
852 passdialog = gtk_dialog_new_with_buttons("MyDialog",
854 GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
861 vbox=gtk_vbox_new(FALSE, 0);
863 infolabel=gtk_label_new(infostring);
864 passentry=gtk_entry_new();
866 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(passdialog)->vbox), infolabel, FALSE, FALSE, 0);
867 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(passdialog)->vbox), passentry, FALSE, FALSE, 0);
868 gtk_widget_show_all(passdialog);
870 retval = gtk_dialog_run (GTK_DIALOG(passdialog));
874 case GTK_RESPONSE_ACCEPT:
875 modest_account_mgr_set_server_account_string(modest_tny_account_store_get_accout_mgr(account_store),
878 gtk_entry_get_text(GTK_ENTRY(passentry)),
881 case GTK_RESPONSE_CANCEL:
883 * What happens, if canceled?"
888 gtk_widget_destroy (passdialog);
893 modest_main_window_header_tree (TnyMsgFolderIface *folder)
896 GSList *columns = NULL;
897 GtkWidget *header_tree;
898 ModestTnyHeaderTreeViewColumn cols[] = {
899 MODEST_TNY_HEADER_TREE_VIEW_COLUMN_MSGTYPE,
900 MODEST_TNY_HEADER_TREE_VIEW_COLUMN_ATTACH,
901 MODEST_TNY_HEADER_TREE_VIEW_COLUMN_COMPACT_HEADER
904 for (i = 0 ; i != sizeof(cols)/sizeof(ModestTnyHeaderTreeViewColumn); ++i)
905 columns = g_slist_append (columns, GINT_TO_POINTER(cols[i]));
907 header_tree = GTK_WIDGET(modest_tny_header_tree_view_new(folder, columns,
908 MODEST_TNY_HEADER_TREE_VIEW_STYLE_NORMAL));
909 g_slist_free (columns);
912 g_warning ("could not create header tree");
916 return GTK_WIDGET(header_tree);
921 modest_main_window_folder_tree (ModestAccountMgr *modest_acc_mgr,
922 TnyAccountStoreIface *account_store)
924 GtkWidget *folder_tree;
926 folder_tree = GTK_WIDGET(modest_tny_folder_tree_view_new (account_store));
928 g_warning ("could not create folder list");
937 on_new_mail_clicked (GtkWidget *widget, ModestUI *modest_ui)
942 EditWinData *windata;
943 ModestUIPrivate *priv;
946 g_return_if_fail (modest_ui);
947 //modest_ui_new_edit_window (modest_ui, "", "", "", "", "", NULL);
949 edit_win = modest_editor_window_new(modest_ui);
950 windata = (EditWinData *)modest_editor_window_get_data(MODEST_EDITOR_WINDOW(edit_win));
951 g_return_if_fail(windata);
953 glade_xml = windata->glade_xml;
954 btn = glade_xml_get_widget (glade_xml, "toolb_send");
955 g_signal_connect (btn, "clicked", G_CALLBACK(on_send_button_clicked),
958 g_signal_connect (edit_win, "destroy-event", G_CALLBACK(close_edit_window),
960 g_signal_connect (edit_win, "delete-event", G_CALLBACK(close_edit_window),
963 priv = MODEST_UI_GET_PRIVATE(windata->modest_ui);
964 height = modest_conf_get_int (priv->modest_conf,
965 MODEST_CONF_EDIT_WINDOW_HEIGHT, NULL);
966 width = modest_conf_get_int (priv->modest_conf,
967 MODEST_CONF_EDIT_WINDOW_WIDTH, NULL);
969 // g_message("new editor win@%dx%d", width, height);
971 gtk_widget_set_usize (GTK_WIDGET(edit_win), width, height);
972 gtk_window_set_title (GTK_WINDOW(edit_win), _("Untitled"));
973 modest_window_mgr_register(priv->modest_window_mgr, G_OBJECT(edit_win), MODEST_EDIT_WINDOW, 0);
974 gtk_widget_show(edit_win);
979 new_editor_with_presets (ModestUI *modest_ui, const gchar *to_header,
980 const gchar *cc_header, const gchar *bcc_header,
981 const gchar *subject_header, const gchar *body)
986 EditWinData *windata;
987 ModestUIPrivate *priv;
990 g_return_if_fail (modest_ui);
992 edit_win = modest_editor_window_new(modest_ui);
993 windata = (EditWinData *)modest_editor_window_get_data(MODEST_EDITOR_WINDOW(edit_win));
994 g_return_if_fail(windata);
996 glade_xml = windata->glade_xml;
997 btn = glade_xml_get_widget (glade_xml, "toolb_send");
998 g_signal_connect (btn, "clicked", G_CALLBACK(on_send_button_clicked),
1001 g_signal_connect (edit_win, "destroy-event", G_CALLBACK(close_edit_window),
1003 g_signal_connect (edit_win, "delete-event", G_CALLBACK(close_edit_window),
1006 priv = MODEST_UI_GET_PRIVATE(windata->modest_ui);
1007 height = modest_conf_get_int (priv->modest_conf,
1008 MODEST_CONF_EDIT_WINDOW_HEIGHT, NULL);
1009 width = modest_conf_get_int (priv->modest_conf,
1010 MODEST_CONF_EDIT_WINDOW_WIDTH, NULL);
1012 // g_message("new editor win@%dx%d", width, height);
1014 gtk_widget_set_usize (GTK_WIDGET(edit_win), width, height);
1015 gtk_window_set_title (GTK_WINDOW(edit_win), _("Untitled"));
1016 modest_window_mgr_register(priv->modest_window_mgr, G_OBJECT(edit_win), MODEST_EDIT_WINDOW, 0);
1018 modest_editor_window_set_to_header(MODEST_EDITOR_WINDOW(edit_win), to_header);
1019 modest_editor_window_set_cc_header(MODEST_EDITOR_WINDOW(edit_win), cc_header);
1020 modest_editor_window_set_bcc_header(MODEST_EDITOR_WINDOW(edit_win), bcc_header);
1021 modest_editor_window_set_subject_header(MODEST_EDITOR_WINDOW(edit_win), subject_header);
1022 modest_editor_window_set_body(MODEST_EDITOR_WINDOW(edit_win), body);
1024 gtk_widget_show(edit_win);
1029 quoted_send_msg (ModestUI *modest_ui, quoted_send_type qstype) {
1030 GtkTreeSelection *sel;
1032 GtkTreeModel *model;
1034 GtkScrolledWindow *scroll;
1036 TnyMsgHeaderIface *header;
1038 ModestTnyHeaderTreeView *header_view;
1039 ModestTnyMsgView *msg_view;
1040 ModestUIPrivate *priv;
1042 const TnyMsgIface *msg;
1043 const TnyMsgFolderIface *folder;
1045 const gchar *subject, *from;
1046 gchar *unquoted, *quoted;
1048 gint line_limit = 76;
1050 g_return_if_fail (modest_ui);
1052 priv = MODEST_UI_GET_PRIVATE(modest_ui);
1054 paned = glade_xml_get_widget (priv->glade_xml,"mail_paned");
1055 g_return_if_fail (paned);
1057 scroll = GTK_SCROLLED_WINDOW(gtk_paned_get_child1 (GTK_PANED(paned)));
1058 g_return_if_fail (scroll);
1060 msg_view = MODEST_TNY_MSG_VIEW(gtk_paned_get_child2 (GTK_PANED(paned)));
1061 g_return_if_fail (msg_view);
1063 header_view = MODEST_TNY_HEADER_TREE_VIEW(gtk_bin_get_child (GTK_BIN(scroll)));
1064 g_return_if_fail (header_view);
1066 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view));
1067 g_return_if_fail (sel);
1069 if (!gtk_tree_selection_get_selected (sel, &model, &iter)) {
1070 g_warning("nothing to reply to");
1074 gtk_tree_model_get (model, &iter,
1075 TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN,
1079 g_warning("no header");
1083 folder = tny_msg_header_iface_get_folder (TNY_MSG_HEADER_IFACE(header));
1085 g_warning ("cannot find folder");
1089 msg = tny_msg_folder_iface_get_message (TNY_MSG_FOLDER_IFACE(folder), header);
1091 g_warning ("cannot find msg");
1095 subject = tny_msg_header_iface_get_subject(header);
1096 re_sub = g_string_new(subject);
1097 /* FIXME: honor replyto, cc */
1098 from = tny_msg_header_iface_get_from(header);
1099 sent_date = tny_msg_header_iface_get_date_sent(header);
1101 unquoted = modest_tny_msg_view_get_selected_text(msg_view);
1102 quoted = modest_tny_msg_actions_quote(msg, from, sent_date, line_limit, unquoted);
1105 case QUOTED_SEND_REPLY:
1106 g_string_prepend(re_sub, _("Re: "));
1107 // modest_ui_new_edit_window (modest_ui, from, /* cc */ "", /* bcc */ "", re_sub->str, quoted, NULL);
1108 new_editor_with_presets(modest_ui, from, /* cc */ "", /* bcc */ "", re_sub->str, quoted);
1110 case QUOTED_SEND_FORWARD:
1111 g_string_prepend(re_sub, _("Fwd: "));
1112 // modest_ui_new_edit_window (modest_ui, /* from */ "", /* cc */ "", /* bcc */ "", re_sub->str, quoted, NULL);
1113 new_editor_with_presets(modest_ui, /* from */ "", /* cc */ "", /* bcc */ "", re_sub->str, quoted);
1120 g_string_free(re_sub, TRUE);
1125 on_reply_clicked (GtkWidget *widget, ModestUI *modest_ui)
1127 quoted_send_msg (modest_ui, QUOTED_SEND_REPLY);
1132 on_forward_clicked (GtkWidget *widget, ModestUI *modest_ui)
1134 quoted_send_msg (modest_ui, QUOTED_SEND_FORWARD);
1139 on_send_button_clicked (GtkWidget *widget, ModestEditorWindow *modest_editwin)
1141 ModestTnyTransportActions *actions;
1142 ModestUI *modest_ui;
1143 ModestUIPrivate *priv;
1144 GtkWidget *to_entry, *subject_entry, *body_view;
1145 const gchar *to, *subject, *email_from;
1147 GtkTextIter start, end;
1149 TnyAccountStoreIface *account_store;
1150 const GList *transport_accounts;
1151 TnyTransportAccountIface *transport_account;
1153 ModestIdentityMgr *id_mgr;
1154 EditWinData *win_data;
1157 win_data = modest_editor_window_get_data(modest_editwin);
1158 modest_ui = win_data->modest_ui;
1160 g_return_if_fail (modest_ui);
1162 actions = MODEST_TNY_TRANSPORT_ACTIONS
1163 (modest_tny_transport_actions_new ());
1165 priv = MODEST_UI_GET_PRIVATE(modest_ui);
1167 account_store = priv->account_store;
1168 transport_accounts =
1169 tny_account_store_iface_get_transport_accounts (account_store);
1170 if (!transport_accounts) {
1171 g_message ("cannot send message: no transport account defined");
1173 } else /* take the first one! */
1175 TNY_TRANSPORT_ACCOUNT_IFACE(transport_accounts->data);
1177 to_entry = glade_xml_get_widget (win_data->glade_xml, "to_entry");
1178 subject_entry = glade_xml_get_widget (win_data->glade_xml, "subject_entry");
1179 body_view = glade_xml_get_widget (win_data->glade_xml, "body_view");
1181 to = gtk_entry_get_text (GTK_ENTRY(to_entry));
1182 subject = gtk_entry_get_text (GTK_ENTRY(subject_entry));
1184 buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(body_view));
1185 gtk_text_buffer_get_bounds (buf, &start, &end);
1186 body = gtk_text_buffer_get_text (buf, &start, &end, FALSE);
1188 id_mgr = priv->modest_id_mgr;
1189 email_from = modest_identity_mgr_get_identity_string(id_mgr,
1190 MODEST_IDENTITY_DEFAULT_IDENTITY,
1191 MODEST_IDENTITY_EMAIL, NULL);
1193 g_message("sending \"%s\" %s ==> %s", subject, email_from, to);
1195 modest_tny_transport_actions_send_message (actions,
1198 to, "", "", subject,
1202 g_object_unref (G_OBJECT(actions));
1204 gtk_widget_hide (GTK_WIDGET(modest_editwin));
1205 modest_window_mgr_unregister(priv->modest_window_mgr, G_OBJECT(modest_editwin));
1206 if (GTK_IS_WIDGET(modest_editwin)) {
1207 gtk_widget_destroy(GTK_WIDGET(modest_editwin));
1209 g_warning("editor window has vanished!");
1214 on_delete_clicked (GtkWidget *widget, ModestUI *modest_ui)
1216 GtkTreeSelection *sel;
1218 GtkTreeModel *model;
1220 GtkScrolledWindow *scroll;
1221 GtkTreeModel *mymodel, *sortable;
1223 ModestTnyHeaderTreeView *header_view;
1224 ModestTnyMsgView *msg_view;
1225 ModestUIPrivate *priv;
1227 g_return_if_fail (modest_ui);
1229 priv = MODEST_UI_GET_PRIVATE(modest_ui);
1231 paned = glade_xml_get_widget (priv->glade_xml,"mail_paned");
1232 g_return_if_fail (paned);
1234 scroll = GTK_SCROLLED_WINDOW(gtk_paned_get_child1 (GTK_PANED(paned)));
1235 g_return_if_fail (scroll);
1237 msg_view = MODEST_TNY_MSG_VIEW(gtk_paned_get_child2 (GTK_PANED(paned)));
1238 g_return_if_fail (msg_view);
1240 header_view = MODEST_TNY_HEADER_TREE_VIEW(gtk_bin_get_child (GTK_BIN(scroll)));
1241 g_return_if_fail (header_view);
1243 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view));
1244 g_return_if_fail (sel);
1246 /* get all selected mails */
1247 if (G_LIKELY (gtk_tree_selection_get_selected (sel, &model, &iter)))
1249 TnyMsgHeaderIface *header;
1251 gtk_tree_model_get (model, &iter, TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN,
1254 if (G_LIKELY (header))
1256 TnyMsgFolderIface *folder;
1257 const TnyMsgIface *msg;
1259 if (GTK_IS_TREE_MODEL_SORT (model))
1261 mymodel = gtk_tree_model_sort_get_model
1262 (GTK_TREE_MODEL_SORT (model));
1266 folder = (TnyMsgFolderIface*)tny_msg_header_iface_get_folder (header);
1268 /* this will make the message as deleted */
1269 /* tny_msg_folder_iface_expunge (folder); will finally delete messages */
1270 if (TNY_IS_MSG_FOLDER (folder))
1271 tny_msg_folder_iface_remove_message (folder, header);
1272 gtk_widget_queue_draw (GTK_WIDGET (header_view));
1278 on_sendreceive_button_clicked (GtkWidget *widget, ModestUI *modest_ui)
1280 ModestUIPrivate *priv;
1281 ModestTnyStoreActions *store_actions;
1282 TnyAccountStoreIface *account_store;
1283 const GList *store_accounts;
1286 g_return_if_fail (modest_ui);
1288 store_actions = MODEST_TNY_STORE_ACTIONS (modest_tny_store_actions_new ());
1289 priv = MODEST_UI_GET_PRIVATE(modest_ui);
1291 account_store = priv->account_store;
1293 tny_account_store_iface_get_store_accounts (account_store);
1295 for (iter = store_accounts; iter; iter = iter->next)
1296 modest_tny_store_actions_update_folders (store_actions,
1297 TNY_STORE_ACCOUNT_IFACE (iter->data));
1299 /* TODO, lock, refresh display */
1301 g_object_unref (store_actions);