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_folder_tree (ModestAccountMgr *modest_acc_mgr,
48 TnyAccountStoreIface *account_store);
49 static GtkWidget* modest_main_window_header_tree (TnyMsgFolderIface *folder);
51 //static void on_account_settings1_activate (GtkMenuItem *,
54 static void on_password_requested (ModestTnyAccountStore *account_store,
55 const gchar *account_name, gpointer user_data);
57 static void on_folder_clicked (ModestTnyFolderTreeView *folder_tree,
58 TnyMsgFolderIface *folder,
60 static void on_message_clicked (ModestTnyFolderTreeView *folder_tree,
63 static void on_new_mail_clicked (GtkWidget *widget, ModestUI *modest_ui);
65 static void on_reply_clicked (GtkWidget *widget, ModestUI *modest_ui);
67 static void on_forward_clicked (GtkWidget *widget, ModestUI *modest_ui);
69 static void on_delete_clicked (GtkWidget *widget, ModestUI *modest_ui);
72 static void on_send_button_clicked (GtkWidget *widget, ModestEditorWindow *modest_editwin);
74 static void on_send_button_clicked (GtkWidget *widget, ModestUI *modest_ui);
77 static void on_sendreceive_button_clicked (GtkWidget *widget, ModestUI *modest_ui);
79 static void register_toolbar_callbacks (ModestUI *modest_ui);
83 QUOTED_SEND_REPLY_ALL,
87 static void quoted_send_msg (ModestUI *modest_ui, quoted_send_type qstype);
92 ModestEditorWindow *edit_win;
105 static GObjectClass *parent_class = NULL;
107 /* uncomment the following if you have defined any signals */
108 /* static guint signals[LAST_SIGNAL] = {0}; */
111 modest_ui_get_type (void)
113 static GType my_type = 0;
115 static const GTypeInfo my_info = {
116 sizeof(ModestUIClass),
117 NULL, /* base init */
118 NULL, /* base finalize */
119 (GClassInitFunc) modest_ui_class_init,
120 NULL, /* class finalize */
121 NULL, /* class data */
124 (GInstanceInitFunc) modest_ui_init,
126 my_type = g_type_register_static (G_TYPE_OBJECT,
135 modest_ui_class_init (ModestUIClass *klass)
137 GObjectClass *gobject_class;
138 gobject_class = (GObjectClass*) klass;
140 parent_class = g_type_class_peek_parent (klass);
141 gobject_class->finalize = modest_ui_finalize;
143 g_type_class_add_private (gobject_class, sizeof(ModestUIPrivate));
145 /* signal definitions go here, e.g.: */
146 /* signals[MY_SIGNAL_1] = */
147 /* g_signal_new ("my_signal_1",....); */
148 /* signals[MY_SIGNAL_2] = */
149 /* g_signal_new ("my_signal_2",....); */
155 modest_ui_init (ModestUI *obj)
157 ModestUIPrivate *priv = MODEST_UI_GET_PRIVATE(obj);
159 priv->modest_acc_mgr = NULL;
160 priv->modest_id_mgr = NULL;
161 priv->modest_conf = NULL;
162 priv->modest_window_mgr = NULL;
163 priv->glade_xml = NULL;
169 modest_ui_finalize (GObject *obj)
171 ModestUIPrivate *priv = MODEST_UI_GET_PRIVATE(obj);
173 if (priv->modest_acc_mgr)
174 g_object_unref (priv->modest_acc_mgr);
175 priv->modest_acc_mgr = NULL;
177 if (priv->modest_id_mgr)
178 g_object_unref (priv->modest_id_mgr);
179 priv->modest_id_mgr = NULL;
181 if (priv->modest_conf)
182 g_object_unref (priv->modest_conf);
183 priv->modest_conf = NULL;
185 if (priv->modest_window_mgr)
186 g_object_unref (priv->modest_window_mgr);
187 priv->modest_window_mgr = NULL;
192 modest_ui_new (ModestConf *modest_conf)
195 ModestUIPrivate *priv;
196 ModestAccountMgr *modest_acc_mgr;
197 ModestIdentityMgr *modest_id_mgr;
198 TnyAccountStoreIface *account_store_iface;
199 GSList *account_names_list;
200 GSList *identities_list;
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),
256 account_names_list=modest_account_mgr_server_account_names(modest_acc_mgr, NULL, MODEST_PROTO_TYPE_ANY, NULL, FALSE);
257 identities_list=modest_identity_mgr_identity_names(modest_id_mgr, NULL);
258 if (!(account_names_list!=NULL || identities_list!=NULL))
259 wizard_account_dialog(obj);
260 g_slist_free(account_names_list);
261 g_slist_free(identities_list);
268 modest_ui_show_main_window (ModestUI *modest_ui)
272 ModestUIPrivate *priv;
273 GtkWidget *folder_view, *header_view;
274 GtkWidget *message_view;
275 GtkWidget *account_settings_item;
276 GtkWidget *new_account_item;
277 GtkWidget *delete_item;
279 GtkWidget *folder_view_holder,
283 priv = MODEST_UI_GET_PRIVATE(modest_ui);
285 height = modest_conf_get_int (priv->modest_conf,
286 MODEST_CONF_MAIN_WINDOW_HEIGHT,NULL);
287 width = modest_conf_get_int (priv->modest_conf,
288 MODEST_CONF_MAIN_WINDOW_WIDTH,NULL);
290 win = glade_xml_get_widget (priv->glade_xml, "main");
292 g_warning ("could not create main window");
297 GTK_WIDGET(modest_main_window_folder_tree(priv->modest_acc_mgr,
298 priv->account_store));
299 folder_view_holder = glade_xml_get_widget (priv->glade_xml, "folders");
300 if (!folder_view||!folder_view_holder) {
301 g_warning ("failed to create folder tree");
304 gtk_container_add (GTK_CONTAINER(folder_view_holder), folder_view);
306 header_view = GTK_WIDGET(modest_main_window_header_tree (NULL));
307 header_view_holder = glade_xml_get_widget (priv->glade_xml, "mail_list");
309 g_warning ("failed to create header tree");
312 gtk_container_add (GTK_CONTAINER(header_view_holder), header_view);
314 g_signal_connect (G_OBJECT(folder_view), "folder_selected",
315 G_CALLBACK(on_folder_clicked), modest_ui);
317 message_view = GTK_WIDGET(modest_tny_msg_view_new (NULL, priv->modest_conf));
319 g_warning ("failed to create message view");
322 mail_paned = glade_xml_get_widget (priv->glade_xml, "mail_paned");
323 gtk_paned_add2 (GTK_PANED(mail_paned), message_view);
325 g_signal_connect (header_view, "message_selected",
326 G_CALLBACK(on_message_clicked),
329 account_settings_item = glade_xml_get_widget (priv->glade_xml, "AccountSettingsMenuItem");
330 if (!account_settings_item)
332 g_warning ("The account settings item isn't available!\n");
336 g_signal_connect (account_settings_item, "activate",
337 G_CALLBACK(on_account_settings1_activate),
341 new_account_item = glade_xml_get_widget (priv->glade_xml, "NewAccountWizardMenuItem");
342 if (!new_account_item)
344 g_warning ("The new account item isn't available!\n");
348 g_signal_connect (new_account_item, "activate",
349 G_CALLBACK(new_wizard_account),
352 delete_item = glade_xml_get_widget (priv->glade_xml, "delete1");
355 g_warning ("The delete item isn't available!\n");
359 g_signal_connect (delete_item, "activate", G_CALLBACK(on_delete_clicked),
362 register_toolbar_callbacks (modest_ui);
364 modest_window_mgr_register (priv->modest_window_mgr,
365 G_OBJECT(win), MODEST_MAIN_WINDOW, 0);
366 g_signal_connect (win, "destroy-event", G_CALLBACK(modest_ui_window_destroy),
368 g_signal_connect (win, "delete-event", G_CALLBACK(modest_ui_window_destroy),
370 gtk_widget_set_usize (GTK_WIDGET(win), width, height);
371 gtk_window_set_title (GTK_WINDOW(win), PACKAGE_STRING);
373 gtk_widget_show_all (win);
379 register_toolbar_callbacks (ModestUI *modest_ui)
381 ModestUIPrivate *priv;
384 g_return_if_fail (modest_ui);
386 priv = MODEST_UI_GET_PRIVATE (modest_ui);
388 button = glade_xml_get_widget (priv->glade_xml, "toolb_new_mail");
390 g_signal_connect (button, "clicked",
391 G_CALLBACK(on_new_mail_clicked), modest_ui);
393 button = glade_xml_get_widget (priv->glade_xml, "toolb_reply");
395 g_signal_connect (button, "clicked",
396 G_CALLBACK(on_reply_clicked), modest_ui);
397 gtk_widget_set_sensitive(button, FALSE);
400 button = glade_xml_get_widget (priv->glade_xml, "toolb_reply_all");
402 //g_signal_connect (button, "clicked",
403 // G_CALLBACK(on_reply_all_clicked), modest_ui);
404 gtk_widget_set_sensitive(button, FALSE);
407 button = glade_xml_get_widget (priv->glade_xml, "toolb_forward");
409 g_signal_connect (button, "clicked",
410 G_CALLBACK(on_forward_clicked), modest_ui);
411 gtk_widget_set_sensitive(button, FALSE);
414 button = glade_xml_get_widget (priv->glade_xml, "toolb_move_to");
416 //g_signal_connect (button, "clicked",
417 // G_CALLBACK(on_move_to_clicked), modest_ui);
418 gtk_widget_set_sensitive(button, FALSE);
421 button = glade_xml_get_widget (priv->glade_xml, "toolb_delete");
423 g_signal_connect (button, "clicked",
424 G_CALLBACK(on_delete_clicked), modest_ui);
425 gtk_widget_set_sensitive(button, FALSE);
428 button = glade_xml_get_widget (priv->glade_xml, "toolb_send_receive");
430 g_signal_connect (button, "clicked",
431 G_CALLBACK(on_sendreceive_button_clicked), modest_ui);
432 gtk_widget_set_sensitive(button, TRUE);
438 hide_edit_window (GtkWidget *win, GdkEvent *event, gpointer data)
440 ModestUIPrivate *priv;
442 priv = MODEST_UI_GET_PRIVATE(data);
443 gtk_widget_hide (win);
444 modest_window_mgr_unregister(priv->modest_window_mgr, G_OBJECT(win));
449 static gboolean close_edit_confirm_dialog(ModestEditorWindow *edit_win)
454 mdialog = gtk_message_dialog_new(GTK_WINDOW(edit_win),
455 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
456 GTK_MESSAGE_QUESTION,
458 _("Message was modified.\nDiscard Changes?"));
459 gtk_widget_show_all (mdialog);
461 res=gtk_dialog_run(GTK_DIALOG(mdialog));
462 gtk_widget_destroy (mdialog);
463 if (res == GTK_RESPONSE_YES)
470 close_edit_window (GtkWidget *win, GdkEvent *event, gpointer data)
472 ModestEditorWindow *edit_win;
473 ModestUIPrivate *priv;
474 EditWinData *win_data;
476 edit_win = (ModestEditorWindow *)data;
477 win_data = modest_editor_window_get_data(edit_win);
478 priv = MODEST_UI_GET_PRIVATE(win_data->modest_ui);
480 // g_message("window was %s modified", modest_editor_window_get_modified(edit_win) ? "" : "not");
482 if (modest_editor_window_get_modified(edit_win)) {
483 if (close_edit_confirm_dialog(edit_win)) {
484 gtk_widget_hide (GTK_WIDGET(edit_win));
485 modest_window_mgr_unregister(priv->modest_window_mgr, G_OBJECT(edit_win));
486 gtk_widget_destroy(GTK_WIDGET(edit_win));
487 g_message("closing window");
489 g_message("not closing window");
496 *modest_ui_new_editor_window (ModestUI *modest_ui, gpointer *user_data)
498 GtkWidget *top_container;
501 EditWinData *win_data;
503 glade_xml = glade_xml_new(MODEST_GLADE, "new_mail_top_container", NULL);
507 win_data = g_malloc(sizeof(EditWinData));
508 win_data->modest_ui = modest_ui;
509 win_data->glade_xml = glade_xml;
510 *user_data = win_data;
512 top_container = glade_xml_get_widget(glade_xml, "new_mail_top_container");
513 if (!top_container) {
514 g_object_unref(G_OBJECT(glade_xml));
518 return GTK_CONTAINER(top_container);
523 modest_ui_editor_window_set_to_header(const gchar *to, gpointer window_data)
527 EditWinData *win_data;
529 win_data = (EditWinData *)window_data;
530 glade_xml = win_data->glade_xml;
531 w = glade_xml_get_widget(glade_xml, "to_entry");
532 gtk_entry_set_text(GTK_ENTRY(w), to);
539 modest_ui_editor_window_set_cc_header(const gchar *cc, gpointer window_data)
543 EditWinData *win_data;
545 win_data = (EditWinData *)window_data;
546 glade_xml = win_data->glade_xml;
548 w = glade_xml_get_widget(glade_xml, "cc_entry");
549 gtk_entry_set_text(GTK_ENTRY(w), cc);
556 modest_ui_editor_window_set_bcc_header(const gchar *bcc, gpointer window_data)
560 EditWinData *win_data;
562 win_data = (EditWinData *)window_data;
563 glade_xml = win_data->glade_xml;
565 w = glade_xml_get_widget(glade_xml, "bcc_entry");
566 gtk_entry_set_text(GTK_ENTRY(w), bcc);
573 modest_ui_editor_window_set_subject_header(const gchar *subject, gpointer window_data)
577 EditWinData *win_data;
579 win_data = (EditWinData *)window_data;
580 glade_xml = win_data->glade_xml;
582 w = glade_xml_get_widget(glade_xml, "subject_entry");
583 gtk_entry_set_text(GTK_ENTRY(w), subject);
590 modest_ui_editor_window_set_body(const gchar *body, gpointer window_data)
593 GtkWidget *body_view;
595 EditWinData *win_data;
597 win_data = (EditWinData *)window_data;
598 glade_xml = win_data->glade_xml;
600 body_view = glade_xml_get_widget(glade_xml, "body_view");
601 buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(body_view));
603 gtk_text_buffer_set_text(GTK_TEXT_BUFFER(buf), body, -1);
610 modest_ui_new_edit_window (ModestUI *modest_ui, const gchar* to,
611 const gchar* cc, const gchar* bcc,
612 const gchar* subject, const gchar *body,
615 GtkWidget *win, *to_entry, *subject_entry, *body_view;
617 ModestUIPrivate *priv;
621 priv = MODEST_UI_GET_PRIVATE(modest_ui);
622 int height = modest_conf_get_int (priv->modest_conf,
623 MODEST_CONF_EDIT_WINDOW_HEIGHT,NULL);
624 int width = modest_conf_get_int (priv->modest_conf,
625 MODEST_CONF_EDIT_WINDOW_WIDTH,NULL);
627 win = glade_xml_get_widget (priv->glade_xml, "new_mail");
629 g_warning ("could not create new mail window");
633 /* FIXME: this also assumes that there can be only one edit window! */
634 if (!modest_window_mgr_find_by_type(priv->modest_window_mgr, MODEST_EDIT_WINDOW)) {
635 /* there already is one edit win, maybe we should preserver its contents */
636 modest_window_mgr_register (priv->modest_window_mgr,
637 G_OBJECT(win), MODEST_EDIT_WINDOW, 0);
640 to_entry = glade_xml_get_widget (priv->glade_xml, "to_entry");
641 subject_entry = glade_xml_get_widget (priv->glade_xml, "subject_entry");
642 body_view = glade_xml_get_widget (priv->glade_xml, "body_view");
644 gtk_entry_set_text(GTK_ENTRY(subject_entry), subject);
645 gtk_entry_set_text(GTK_ENTRY(to_entry), to);
647 buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(body_view));
649 gtk_text_buffer_set_text(buf, body, -1);
651 gtk_text_buffer_set_text(buf, "", -1);
653 g_signal_connect (win, "destroy-event", G_CALLBACK(hide_edit_window),
655 g_signal_connect (win, "delete-event", G_CALLBACK(hide_edit_window),
658 gtk_widget_set_usize (GTK_WIDGET(win), height, width);
659 gtk_window_set_title (GTK_WINDOW(win),
660 subject ? subject : "Untitled");
663 btn = glade_xml_get_widget (priv->glade_xml, "toolb_send");
664 g_signal_connect (btn, "clicked", G_CALLBACK(on_send_button_clicked),
667 gtk_widget_show_all (win);
674 modest_ui_window_destroy (GtkWidget *win, GdkEvent *event, gpointer data)
676 ModestUIPrivate *priv;
678 g_return_if_fail (data);
679 g_return_if_fail(MODEST_IS_UI(data));
680 priv = MODEST_UI_GET_PRIVATE((ModestUI *)data);
681 g_return_if_fail(priv);
682 if (!modest_window_mgr_unregister (priv->modest_window_mgr, G_OBJECT(win)))
683 g_warning ("modest window mgr: failed to unregister %p",
686 gtk_widget_hide(win);
691 modest_ui_last_window_closed (GObject *obj, gpointer data)
693 /* FIXME: Other cleanups todo? Finalize Tinymail? */
699 on_account_selector_selection_changed (GtkWidget *widget,
702 GtkTreeModel *model = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
707 if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget), &iter))
709 gtk_tree_model_get(GTK_TREE_MODEL(model),
716 account_name="empty";
719 g_message("Value: '%s'\n", account_name);
726 on_account_settings1_activate (GtkMenuItem *menuitem,
730 GtkWidget *advanced_account_setup;
731 ModestUIPrivate *priv;
733 GSList *account_name_list;
734 GSList *account_name_list_iter;
735 GtkListStore *account_names;
736 GtkTreeIter account_names_iter;
737 GtkWidget *account_selector;
738 GtkCellRenderer *renderer;
741 g_return_if_fail(MODEST_IS_UI(user_data));
742 priv = MODEST_UI_GET_PRIVATE(MODEST_UI(user_data));
744 glade_xml = glade_xml_new(MODEST_GLADE, "mailbox_setup_advanced", NULL);
745 advanced_account_setup = glade_xml_get_widget(glade_xml, "mailbox_setup_advanced");
747 account_name_list=modest_account_mgr_account_names(priv->modest_acc_mgr, NULL);
748 account_names = gtk_list_store_new(1, G_TYPE_STRING);
750 for (account_name_list_iter=account_name_list;
751 account_name_list_iter!=NULL;
752 account_name_list_iter=g_slist_next(account_name_list_iter))
754 gtk_list_store_append(account_names, &account_names_iter);
755 gtk_list_store_set(account_names, &account_names_iter,
756 0, account_name_list_iter->data,
760 g_slist_free(account_name_list);
762 account_selector = glade_xml_get_widget(glade_xml, "account_selector");
763 gtk_combo_box_set_model(GTK_COMBO_BOX(account_selector), GTK_TREE_MODEL(account_names));
765 renderer = gtk_cell_renderer_text_new ();
766 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (account_selector), renderer, TRUE);
767 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (account_selector), renderer,
771 g_signal_connect(GTK_WIDGET(account_selector), "changed",
772 G_CALLBACK(on_account_selector_selection_changed),
773 GTK_WIDGET(advanced_account_setup));
775 gtk_combo_box_set_active(GTK_COMBO_BOX(account_selector), 0);
777 gtk_widget_show_all(GTK_WIDGET(advanced_account_setup));
779 retval=gtk_dialog_run(GTK_DIALOG(advanced_account_setup));
781 g_object_unref(account_names);
783 gtk_widget_destroy(GTK_WIDGET(advanced_account_setup));
785 g_object_unref(glade_xml);
791 on_folder_clicked (ModestTnyFolderTreeView *folder_tree,
792 TnyMsgFolderIface *folder,
798 ModestTnyHeaderTreeView *tree_view;
799 ModestTnyMsgView *msg_view;
800 ModestUIPrivate *priv;
801 GtkWidget *scrollview;
803 g_return_if_fail (folder);
804 g_return_if_fail (data);
806 priv = MODEST_UI_GET_PRIVATE(data);
807 scrollview = glade_xml_get_widget (priv->glade_xml,"mail_list");
809 tree_view = MODEST_TNY_HEADER_TREE_VIEW(
810 gtk_bin_get_child(GTK_BIN(scrollview)));
811 win = glade_xml_get_widget (priv->glade_xml, "main");
812 gtk_window_set_title (GTK_WINDOW(win),
813 tny_msg_folder_iface_get_name(folder));
815 modest_tny_header_tree_view_set_folder (tree_view,
818 button = glade_xml_get_widget (priv->glade_xml, "toolb_reply");
820 gtk_widget_set_sensitive(button, FALSE);
823 button = glade_xml_get_widget (priv->glade_xml, "toolb_forward");
825 gtk_widget_set_sensitive(button, FALSE);
828 button = glade_xml_get_widget (priv->glade_xml, "toolb_delete");
830 gtk_widget_set_sensitive(button, FALSE);
833 paned = glade_xml_get_widget (priv->glade_xml,"mail_paned");
834 g_return_if_fail (paned);
836 msg_view = MODEST_TNY_MSG_VIEW(gtk_paned_get_child2 (GTK_PANED(paned)));
837 g_return_if_fail (msg_view);
839 modest_tny_msg_view_set_message (msg_view, NULL);
844 on_message_clicked (ModestTnyFolderTreeView *folder_tree,
845 TnyMsgIface *message,
850 ModestTnyMsgView *msg_view;
851 ModestUIPrivate *priv;
853 g_return_if_fail (data);
855 priv = MODEST_UI_GET_PRIVATE(data);
856 paned = glade_xml_get_widget (priv->glade_xml,"mail_paned");
857 msg_view = MODEST_TNY_MSG_VIEW(gtk_paned_get_child2 (GTK_PANED(paned)));
859 modest_tny_msg_view_set_message (msg_view,
861 button = glade_xml_get_widget (priv->glade_xml, "toolb_reply");
863 gtk_widget_set_sensitive(button, TRUE);
865 button = glade_xml_get_widget (priv->glade_xml, "toolb_forward");
867 gtk_widget_set_sensitive(button, TRUE);
869 button = glade_xml_get_widget (priv->glade_xml, "toolb_delete");
871 gtk_widget_set_sensitive(button, TRUE);
877 on_password_requested (ModestTnyAccountStore *account_store,
878 const gchar *account_name, gpointer user_data)
881 GtkWidget *passdialog;
883 GtkWidget *infolabel;
884 GtkWidget *passentry;
886 const gchar *infostring=g_strconcat("Please enter the password for ", account_name, ".", NULL);
888 passdialog = gtk_dialog_new_with_buttons("MyDialog",
890 GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
897 vbox=gtk_vbox_new(FALSE, 0);
899 infolabel=gtk_label_new(infostring);
900 passentry=gtk_entry_new();
902 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(passdialog)->vbox), infolabel, FALSE, FALSE, 0);
903 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(passdialog)->vbox), passentry, FALSE, FALSE, 0);
904 gtk_widget_show_all(passdialog);
906 retval = gtk_dialog_run (GTK_DIALOG(passdialog));
910 case GTK_RESPONSE_ACCEPT:
911 modest_account_mgr_set_server_account_string(modest_tny_account_store_get_accout_mgr(account_store),
914 gtk_entry_get_text(GTK_ENTRY(passentry)),
917 case GTK_RESPONSE_CANCEL:
919 * What happens, if canceled?"
924 gtk_widget_destroy (passdialog);
929 modest_main_window_header_tree (TnyMsgFolderIface *folder)
932 GSList *columns = NULL;
933 GtkWidget *header_tree;
934 ModestTnyHeaderTreeViewColumn cols[] = {
935 MODEST_TNY_HEADER_TREE_VIEW_COLUMN_MSGTYPE,
936 MODEST_TNY_HEADER_TREE_VIEW_COLUMN_ATTACH,
937 MODEST_TNY_HEADER_TREE_VIEW_COLUMN_COMPACT_HEADER
940 for (i = 0 ; i != sizeof(cols)/sizeof(ModestTnyHeaderTreeViewColumn); ++i)
941 columns = g_slist_append (columns, GINT_TO_POINTER(cols[i]));
943 header_tree = GTK_WIDGET(modest_tny_header_tree_view_new(folder, columns,
944 MODEST_TNY_HEADER_TREE_VIEW_STYLE_NORMAL));
945 g_slist_free (columns);
948 g_warning ("could not create header tree");
952 return GTK_WIDGET(header_tree);
957 modest_main_window_folder_tree (ModestAccountMgr *modest_acc_mgr,
958 TnyAccountStoreIface *account_store)
960 GtkWidget *folder_tree;
962 folder_tree = GTK_WIDGET(modest_tny_folder_tree_view_new (account_store));
964 g_warning ("could not create folder list");
971 static void on_editor_entry_changed(GtkEditable *editable,
975 EditWinData *windata;
977 edit_win = (GtkWidget *)user_data;
978 windata = (EditWinData *)modest_editor_window_get_data(MODEST_EDITOR_WINDOW(edit_win));
980 modest_editor_window_set_modified(MODEST_EDITOR_WINDOW(edit_win), TRUE);
983 static void on_editor_buffer_changed (GtkTextBuffer *textbuffer,
987 EditWinData *windata;
989 edit_win = (GtkWidget *)user_data;
990 windata = (EditWinData *)modest_editor_window_get_data(MODEST_EDITOR_WINDOW(edit_win));
992 modest_editor_window_set_modified(MODEST_EDITOR_WINDOW(edit_win), TRUE);
996 on_new_mail_clicked (GtkWidget *widget, ModestUI *modest_ui)
1002 EditWinData *windata;
1003 ModestUIPrivate *priv;
1006 g_return_if_fail (modest_ui);
1007 //modest_ui_new_edit_window (modest_ui, "", "", "", "", "", NULL);
1009 edit_win = modest_editor_window_new(modest_ui);
1010 windata = (EditWinData *)modest_editor_window_get_data(MODEST_EDITOR_WINDOW(edit_win));
1011 g_return_if_fail(windata);
1013 windata->edit_win = MODEST_EDITOR_WINDOW(edit_win);
1014 glade_xml = windata->glade_xml;
1015 btn = glade_xml_get_widget (glade_xml, "toolb_send");
1016 g_signal_connect (btn, "clicked", G_CALLBACK(on_send_button_clicked),
1019 w = glade_xml_get_widget (glade_xml, "to_entry");
1020 g_signal_connect(w, "changed", G_CALLBACK(on_editor_entry_changed), edit_win);
1021 w = glade_xml_get_widget (glade_xml, "subject_entry");
1022 g_signal_connect(w, "changed", G_CALLBACK(on_editor_entry_changed), edit_win);
1023 w = glade_xml_get_widget (glade_xml, "body_view");
1024 buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(w));
1025 gtk_text_buffer_set_text(buf, "", -1);
1026 g_signal_connect(buf, "changed", G_CALLBACK(on_editor_buffer_changed), edit_win);
1028 g_signal_connect (edit_win, "destroy-event", G_CALLBACK(close_edit_window),
1030 g_signal_connect (edit_win, "delete-event", G_CALLBACK(close_edit_window),
1033 priv = MODEST_UI_GET_PRIVATE(windata->modest_ui);
1034 height = modest_conf_get_int (priv->modest_conf,
1035 MODEST_CONF_EDIT_WINDOW_HEIGHT, NULL);
1036 width = modest_conf_get_int (priv->modest_conf,
1037 MODEST_CONF_EDIT_WINDOW_WIDTH, NULL);
1039 // g_message("new editor win@%dx%d", width, height);
1041 gtk_widget_set_usize (GTK_WIDGET(edit_win), width, height);
1042 gtk_window_set_title (GTK_WINDOW(edit_win), _("Untitled"));
1043 modest_window_mgr_register(priv->modest_window_mgr, G_OBJECT(edit_win), MODEST_EDIT_WINDOW, 0);
1044 gtk_widget_show(edit_win);
1049 new_editor_with_presets (ModestUI *modest_ui, const gchar *to_header,
1050 const gchar *cc_header, const gchar *bcc_header,
1051 const gchar *subject_header, const gchar *body)
1053 GtkWidget *edit_win;
1054 GladeXML *glade_xml;
1057 EditWinData *windata;
1058 ModestUIPrivate *priv;
1061 g_return_if_fail (modest_ui);
1063 edit_win = modest_editor_window_new(modest_ui);
1064 windata = (EditWinData *)modest_editor_window_get_data(MODEST_EDITOR_WINDOW(edit_win));
1065 g_return_if_fail(windata);
1067 glade_xml = windata->glade_xml;
1068 btn = glade_xml_get_widget (glade_xml, "toolb_send");
1069 g_signal_connect (btn, "clicked", G_CALLBACK(on_send_button_clicked),
1072 w = glade_xml_get_widget (glade_xml, "to_entry");
1073 g_signal_connect(w, "changed", G_CALLBACK(on_editor_entry_changed), edit_win);
1074 w = glade_xml_get_widget (glade_xml, "subject_entry");
1075 g_signal_connect(w, "changed", G_CALLBACK(on_editor_entry_changed), edit_win);
1076 w = glade_xml_get_widget (glade_xml, "body_view");
1077 buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(w));
1078 g_signal_connect(buf, "changed", G_CALLBACK(on_editor_buffer_changed), edit_win);
1080 g_signal_connect (edit_win, "destroy-event", G_CALLBACK(close_edit_window),
1082 g_signal_connect (edit_win, "delete-event", G_CALLBACK(close_edit_window),
1085 priv = MODEST_UI_GET_PRIVATE(windata->modest_ui);
1086 height = modest_conf_get_int (priv->modest_conf,
1087 MODEST_CONF_EDIT_WINDOW_HEIGHT, NULL);
1088 width = modest_conf_get_int (priv->modest_conf,
1089 MODEST_CONF_EDIT_WINDOW_WIDTH, NULL);
1091 // g_message("new editor win@%dx%d", width, height);
1093 gtk_widget_set_usize (GTK_WIDGET(edit_win), width, height);
1094 gtk_window_set_title (GTK_WINDOW(edit_win), _("Untitled"));
1095 modest_window_mgr_register(priv->modest_window_mgr, G_OBJECT(edit_win), MODEST_EDIT_WINDOW, 0);
1097 modest_editor_window_set_to_header(MODEST_EDITOR_WINDOW(edit_win), to_header);
1098 modest_editor_window_set_cc_header(MODEST_EDITOR_WINDOW(edit_win), cc_header);
1099 modest_editor_window_set_bcc_header(MODEST_EDITOR_WINDOW(edit_win), bcc_header);
1100 modest_editor_window_set_subject_header(MODEST_EDITOR_WINDOW(edit_win), subject_header);
1101 modest_editor_window_set_body(MODEST_EDITOR_WINDOW(edit_win), body);
1103 modest_editor_window_set_modified(MODEST_EDITOR_WINDOW(edit_win), FALSE);
1105 gtk_widget_show(edit_win);
1110 quoted_send_msg (ModestUI *modest_ui, quoted_send_type qstype) {
1111 GtkTreeSelection *sel;
1113 GtkTreeModel *model;
1115 GtkScrolledWindow *scroll;
1117 TnyMsgHeaderIface *header;
1119 ModestTnyHeaderTreeView *header_view;
1120 ModestTnyMsgView *msg_view;
1121 ModestUIPrivate *priv;
1123 const TnyMsgIface *msg;
1124 const TnyMsgFolderIface *folder;
1126 const gchar *subject, *from;
1127 gchar *unquoted, *quoted;
1129 gint line_limit = 76;
1131 g_return_if_fail (modest_ui);
1133 priv = MODEST_UI_GET_PRIVATE(modest_ui);
1135 paned = glade_xml_get_widget (priv->glade_xml,"mail_paned");
1136 g_return_if_fail (paned);
1138 scroll = GTK_SCROLLED_WINDOW(gtk_paned_get_child1 (GTK_PANED(paned)));
1139 g_return_if_fail (scroll);
1141 msg_view = MODEST_TNY_MSG_VIEW(gtk_paned_get_child2 (GTK_PANED(paned)));
1142 g_return_if_fail (msg_view);
1144 header_view = MODEST_TNY_HEADER_TREE_VIEW(gtk_bin_get_child (GTK_BIN(scroll)));
1145 g_return_if_fail (header_view);
1147 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view));
1148 g_return_if_fail (sel);
1150 if (!gtk_tree_selection_get_selected (sel, &model, &iter)) {
1151 g_warning("nothing to reply to");
1155 gtk_tree_model_get (model, &iter,
1156 TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN,
1160 g_warning("no header");
1164 folder = tny_msg_header_iface_get_folder (TNY_MSG_HEADER_IFACE(header));
1166 g_warning ("cannot find folder");
1170 msg = tny_msg_folder_iface_get_message (TNY_MSG_FOLDER_IFACE(folder), header);
1172 g_warning ("cannot find msg");
1176 subject = tny_msg_header_iface_get_subject(header);
1177 re_sub = g_string_new(subject);
1178 /* FIXME: honor replyto, cc */
1179 from = tny_msg_header_iface_get_from(header);
1180 sent_date = tny_msg_header_iface_get_date_sent(header);
1182 unquoted = modest_tny_msg_view_get_selected_text(msg_view);
1183 quoted = modest_tny_msg_actions_quote(msg, from, sent_date, line_limit, unquoted);
1186 case QUOTED_SEND_REPLY:
1187 g_string_prepend(re_sub, _("Re: "));
1188 new_editor_with_presets(modest_ui, from, /* cc */ "", /* bcc */ "", re_sub->str, quoted);
1190 case QUOTED_SEND_FORWARD:
1191 g_string_prepend(re_sub, _("Fwd: "));
1192 new_editor_with_presets(modest_ui, /* from */ "", /* cc */ "", /* bcc */ "", re_sub->str, quoted);
1199 g_string_free(re_sub, TRUE);
1204 on_reply_clicked (GtkWidget *widget, ModestUI *modest_ui)
1206 quoted_send_msg (modest_ui, QUOTED_SEND_REPLY);
1211 on_forward_clicked (GtkWidget *widget, ModestUI *modest_ui)
1213 quoted_send_msg (modest_ui, QUOTED_SEND_FORWARD);
1218 on_send_button_clicked (GtkWidget *widget, ModestEditorWindow *modest_editwin)
1220 ModestTnyTransportActions *actions;
1221 ModestUI *modest_ui;
1222 ModestUIPrivate *priv;
1223 GtkWidget *to_entry, *subject_entry, *body_view;
1224 const gchar *to, *subject, *email_from;
1226 GtkTextIter start, end;
1228 /* TnyAccountStoreIface *account_store;
1229 const GList *transport_accounts;
1230 TnyTransportAccountIface *transport_account;
1231 ModestConf *conf; */
1232 ModestIdentityMgr *id_mgr;
1233 EditWinData *win_data;
1236 win_data = modest_editor_window_get_data(modest_editwin);
1237 modest_ui = win_data->modest_ui;
1239 g_return_if_fail (modest_ui);
1241 actions = MODEST_TNY_TRANSPORT_ACTIONS
1242 (modest_tny_transport_actions_new ());
1244 priv = MODEST_UI_GET_PRIVATE(modest_ui);
1246 account_store = priv->account_store;
1247 transport_accounts =
1248 tny_account_store_iface_get_transport_accounts (account_store);
1249 if (!transport_accounts) {
1250 g_message ("cannot send message: no transport account defined");
1252 } else /* take the first one! */
1254 TNY_TRANSPORT_ACCOUNT_IFACE(transport_accounts->data);
1256 to_entry = glade_xml_get_widget (win_data->glade_xml, "to_entry");
1257 subject_entry = glade_xml_get_widget (win_data->glade_xml, "subject_entry");
1258 body_view = glade_xml_get_widget (win_data->glade_xml, "body_view");
1260 to = gtk_entry_get_text (GTK_ENTRY(to_entry));
1261 subject = gtk_entry_get_text (GTK_ENTRY(subject_entry));
1263 buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(body_view));
1264 gtk_text_buffer_get_bounds (buf, &start, &end);
1265 body = gtk_text_buffer_get_text (buf, &start, &end, FALSE);
1267 id_mgr = priv->modest_id_mgr;
1268 email_from = modest_identity_mgr_get_identity_string(id_mgr,
1269 MODEST_IDENTITY_DEFAULT_IDENTITY,
1270 MODEST_IDENTITY_EMAIL, NULL);
1272 g_message("sending \"%s\" %s ==> %s", subject, email_from, to);
1274 modest_tny_transport_actions_send_message (actions,
1277 to, "", "", subject,
1281 g_object_unref (G_OBJECT(actions));
1283 gtk_widget_hide (GTK_WIDGET(modest_editwin));
1284 modest_window_mgr_unregister(priv->modest_window_mgr, G_OBJECT(modest_editwin));
1285 if (GTK_IS_WIDGET(modest_editwin)) {
1286 gtk_widget_destroy(GTK_WIDGET(modest_editwin));
1288 g_warning("editor window has vanished!");
1293 on_delete_clicked (GtkWidget *widget, ModestUI *modest_ui)
1295 GtkTreeSelection *sel;
1297 GtkTreeModel *model;
1299 GtkScrolledWindow *scroll;
1300 GtkTreeModel *mymodel;
1302 ModestTnyHeaderTreeView *header_view;
1303 ModestTnyMsgView *msg_view;
1304 ModestUIPrivate *priv;
1306 g_return_if_fail (modest_ui);
1308 priv = MODEST_UI_GET_PRIVATE(modest_ui);
1310 paned = glade_xml_get_widget (priv->glade_xml,"mail_paned");
1311 g_return_if_fail (paned);
1313 scroll = GTK_SCROLLED_WINDOW(gtk_paned_get_child1 (GTK_PANED(paned)));
1314 g_return_if_fail (scroll);
1316 msg_view = MODEST_TNY_MSG_VIEW(gtk_paned_get_child2 (GTK_PANED(paned)));
1317 g_return_if_fail (msg_view);
1319 header_view = MODEST_TNY_HEADER_TREE_VIEW(gtk_bin_get_child (GTK_BIN(scroll)));
1320 g_return_if_fail (header_view);
1322 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view));
1323 g_return_if_fail (sel);
1325 /* get all selected mails */
1326 if (G_LIKELY (gtk_tree_selection_get_selected (sel, &model, &iter)))
1328 TnyMsgHeaderIface *header;
1330 gtk_tree_model_get (model, &iter, TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN,
1333 if (G_LIKELY (header))
1335 TnyMsgFolderIface *folder;
1336 // const TnyMsgIface *msg;
1338 if (GTK_IS_TREE_MODEL_SORT (model))
1340 mymodel = gtk_tree_model_sort_get_model
1341 (GTK_TREE_MODEL_SORT (model));
1345 folder = (TnyMsgFolderIface*)tny_msg_header_iface_get_folder (header);
1347 /* this will make the message as deleted */
1348 /* tny_msg_folder_iface_expunge (folder); will finally delete messages */
1349 if (TNY_IS_MSG_FOLDER (folder))
1350 tny_msg_folder_iface_remove_message (folder, header);
1351 gtk_widget_queue_draw (GTK_WIDGET (header_view));
1357 on_sendreceive_button_clicked (GtkWidget *widget, ModestUI *modest_ui)
1359 ModestUIPrivate *priv;
1360 ModestTnyStoreActions *store_actions;
1361 TnyAccountStoreIface *account_store;
1362 const GList *store_accounts;
1365 g_return_if_fail (modest_ui);
1367 store_actions = MODEST_TNY_STORE_ACTIONS (modest_tny_store_actions_new ());
1368 priv = MODEST_UI_GET_PRIVATE(modest_ui);
1370 account_store = priv->account_store;
1372 tny_account_store_iface_get_store_accounts (account_store);
1374 for (iter = store_accounts; iter; iter = iter->next)
1375 modest_tny_store_actions_update_folders (store_actions,
1376 TNY_STORE_ACCOUNT_IFACE (iter->data));
1378 /* TODO, lock, refresh display */
1380 g_object_unref (store_actions);