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-identity-mgr.h"
23 #include "../modest-tny-account-store.h"
24 #include "../modest-tny-folder-tree-view.h"
25 #include "../modest-tny-header-tree-view.h"
26 #include "../modest-tny-msg-view.h"
27 #include "../modest-tny-transport-actions.h"
29 #include "../modest-text-utils.h"
30 #include "../modest-tny-msg-actions.h"
32 #include "modest-ui-glade.h"
33 #include "modest-ui-wizzard.h"
35 /* 'private'/'protected' functions */
36 static void modest_ui_class_init (ModestUIClass *klass);
37 static void modest_ui_init (ModestUI *obj);
38 static void modest_ui_finalize (GObject *obj);
40 static void modest_ui_window_destroy (GtkWidget *win, GdkEvent *event, gpointer data);
41 static void modest_ui_last_window_closed (GObject *obj, gpointer data);
43 static GtkWidget* modest_main_window_toolbar (void);
44 static GtkWidget* modest_main_window_folder_tree (ModestAccountMgr *modest_acc_mgr,
45 TnyAccountStoreIface *account_store);
46 static GtkWidget* modest_main_window_header_tree (TnyMsgFolderIface *folder);
49 void on_account_settings1_activate (GtkMenuItem *,
52 static void on_password_requested (ModestTnyAccountStore *account_store,
53 const gchar *account_name, gpointer user_data);
55 static void on_folder_clicked (ModestTnyFolderTreeView *folder_tree,
56 TnyMsgFolderIface *folder,
58 static void on_message_clicked (ModestTnyFolderTreeView *folder_tree,
61 static void on_new_mail_clicked (GtkWidget *widget, ModestUI *modest_ui);
63 static void on_reply_clicked (GtkWidget *widget, ModestUI *modest_ui);
65 static void on_delete_clicked (GtkWidget *widget, ModestUI *modest_ui);
67 static void on_send_button_clicked (GtkWidget *widget, ModestUI *modest_ui);
69 static void register_toolbar_callbacks (ModestUI *modest_ui);
71 static void reply_to_msg (ModestUI *modest_ui, TnyMsgHeaderIface *header,
72 ModestTnyMsgView *msg_view);
82 static GObjectClass *parent_class = NULL;
84 /* uncomment the following if you have defined any signals */
85 /* static guint signals[LAST_SIGNAL] = {0}; */
88 modest_ui_get_type (void)
90 static GType my_type = 0;
92 static const GTypeInfo my_info = {
93 sizeof(ModestUIClass),
95 NULL, /* base finalize */
96 (GClassInitFunc) modest_ui_class_init,
97 NULL, /* class finalize */
98 NULL, /* class data */
101 (GInstanceInitFunc) modest_ui_init,
103 my_type = g_type_register_static (G_TYPE_OBJECT,
111 modest_ui_class_init (ModestUIClass *klass)
113 GObjectClass *gobject_class;
114 gobject_class = (GObjectClass*) klass;
116 parent_class = g_type_class_peek_parent (klass);
117 gobject_class->finalize = modest_ui_finalize;
119 g_type_class_add_private (gobject_class, sizeof(ModestUIPrivate));
121 /* signal definitions go here, e.g.: */
122 /* signals[MY_SIGNAL_1] = */
123 /* g_signal_new ("my_signal_1",....); */
124 /* signals[MY_SIGNAL_2] = */
125 /* g_signal_new ("my_signal_2",....); */
130 modest_ui_init (ModestUI *obj)
132 ModestUIPrivate *priv = MODEST_UI_GET_PRIVATE(obj);
134 priv->modest_acc_mgr = NULL;
135 priv->modest_id_mgr = NULL;
136 priv->modest_conf = NULL;
137 priv->modest_window_mgr = NULL;
138 priv->glade_xml = NULL;
143 modest_ui_finalize (GObject *obj)
145 ModestUIPrivate *priv = MODEST_UI_GET_PRIVATE(obj);
147 if (priv->modest_acc_mgr)
148 g_object_unref (priv->modest_acc_mgr);
149 priv->modest_acc_mgr = NULL;
151 if (priv->modest_id_mgr)
152 g_object_unref (priv->modest_id_mgr);
153 priv->modest_id_mgr = NULL;
155 if (priv->modest_conf)
156 g_object_unref (priv->modest_conf);
157 priv->modest_conf = NULL;
159 if (priv->modest_window_mgr)
160 g_object_unref (priv->modest_window_mgr);
161 priv->modest_window_mgr = NULL;
165 modest_ui_new (ModestConf *modest_conf)
168 ModestUIPrivate *priv;
169 ModestAccountMgr *modest_acc_mgr;
170 ModestIdentityMgr *modest_id_mgr;
171 TnyAccountStoreIface *account_store_iface;
173 g_return_val_if_fail (modest_conf, NULL);
175 obj = g_object_new(MODEST_TYPE_UI, NULL);
176 priv = MODEST_UI_GET_PRIVATE(obj);
179 MODEST_ACCOUNT_MGR(modest_account_mgr_new (modest_conf));
180 if (!modest_acc_mgr) {
181 g_warning ("could not create ModestAccountMgr instance");
182 g_object_unref (obj);
187 MODEST_IDENTITY_MGR(modest_identity_mgr_new (modest_conf));
188 if (!modest_id_mgr) {
189 g_warning ("could not create ModestIdentityMgr instance");
190 g_object_unref (obj);
194 account_store_iface =
195 TNY_ACCOUNT_STORE_IFACE(modest_tny_account_store_new (modest_acc_mgr));
196 if (!account_store_iface) {
197 g_warning ("could not initialze ModestTnyAccountStore");
200 g_signal_connect (account_store_iface, "password_requested",
201 G_CALLBACK(on_password_requested),
205 priv->glade_xml = glade_xml_new (MODEST_GLADE, NULL,NULL);
206 if (!priv->glade_xml) {
207 g_warning ("failed to do glade stuff");
208 g_object_unref (obj);
212 /* FIXME: could be used, but doesn't work atm.
213 * glade_xml_signal_autoconnect(priv->glade_xml);
216 priv->modest_acc_mgr = modest_acc_mgr;
217 priv->modest_id_mgr = modest_id_mgr;
218 g_object_ref (priv->modest_conf = modest_conf);
220 priv->account_store = account_store_iface;
222 priv->modest_window_mgr = MODEST_WINDOW_MGR(modest_window_mgr_new());
223 g_signal_connect (priv->modest_window_mgr, "last_window_closed",
224 G_CALLBACK(modest_ui_last_window_closed),
231 modest_ui_show_main_window (ModestUI *modest_ui)
235 ModestUIPrivate *priv;
236 GtkWidget *folder_view, *header_view;
237 GtkWidget *message_view;
238 GtkWidget *account_settings_item;
239 GtkWidget *new_account_item;
240 GtkWidget *close_window_item;
241 GtkWidget *delete_item;
243 GtkWidget *folder_view_holder,
247 priv = MODEST_UI_GET_PRIVATE(modest_ui);
249 height = modest_conf_get_int (priv->modest_conf,
250 MODEST_CONF_MAIN_WINDOW_HEIGHT,NULL);
251 width = modest_conf_get_int (priv->modest_conf,
252 MODEST_CONF_MAIN_WINDOW_WIDTH,NULL);
254 win = glade_xml_get_widget (priv->glade_xml, "main");
256 g_warning ("could not create main window");
261 GTK_WIDGET(modest_main_window_folder_tree(priv->modest_acc_mgr,
262 priv->account_store));
263 folder_view_holder = glade_xml_get_widget (priv->glade_xml, "folders");
264 if (!folder_view||!folder_view_holder) {
265 g_warning ("failed to create folder tree");
268 gtk_container_add (GTK_CONTAINER(folder_view_holder), folder_view);
270 header_view = GTK_WIDGET(modest_main_window_header_tree (NULL));
271 header_view_holder = glade_xml_get_widget (priv->glade_xml, "mail_list");
273 g_warning ("failed to create header tree");
276 gtk_container_add (GTK_CONTAINER(header_view_holder), header_view);
278 g_signal_connect (G_OBJECT(folder_view), "folder_selected",
279 G_CALLBACK(on_folder_clicked), modest_ui);
281 message_view = GTK_WIDGET(modest_tny_msg_view_new (NULL));
283 g_warning ("failed to create message view");
286 mail_paned = glade_xml_get_widget (priv->glade_xml, "mail_paned");
287 gtk_paned_add2 (GTK_PANED(mail_paned), message_view);
289 g_signal_connect (header_view, "message_selected",
290 G_CALLBACK(on_message_clicked),
293 account_settings_item = glade_xml_get_widget (priv->glade_xml, "account_settings1");
294 if (!account_settings_item)
296 g_warning ("The account settings item isn't available!\n");
299 g_signal_connect (account_settings_item, "activate",
300 G_CALLBACK(on_account_settings1_activate),
303 new_account_item = glade_xml_get_widget (priv->glade_xml, "new_account1");
304 if (!new_account_item)
306 g_warning ("The new account item isn't available!\n");
310 g_signal_connect (new_account_item, "activate",
311 G_CALLBACK(on_new_account1_activate),
314 close_window_item = glade_xml_get_widget (priv->glade_xml, "about1");
315 if (!close_window_item)
317 g_warning ("The close_window item isn't available!\n");
321 delete_item = glade_xml_get_widget (priv->glade_xml, "delete1");
324 g_warning ("The delete item isn't available!\n");
328 g_signal_connect (delete_item, "activate", G_CALLBACK(on_delete_clicked),
331 register_toolbar_callbacks (modest_ui);
333 modest_window_mgr_register (priv->modest_window_mgr,
334 G_OBJECT(win), MODEST_MAIN_WINDOW, 0);
335 g_signal_connect (win, "destroy-event", G_CALLBACK(modest_ui_window_destroy),
337 g_signal_connect (win, "delete-event", G_CALLBACK(modest_ui_window_destroy),
339 g_signal_connect (close_window_item, "activate",
340 G_CALLBACK(modest_ui_window_destroy),
342 gtk_widget_set_usize (GTK_WIDGET(win), height, width);
343 gtk_window_set_title (GTK_WINDOW(win), PACKAGE_STRING);
345 gtk_widget_show_all (win);
351 register_toolbar_callbacks (ModestUI *modest_ui)
353 ModestUIPrivate *priv;
356 g_return_if_fail (modest_ui);
358 priv = MODEST_UI_GET_PRIVATE (modest_ui);
360 button = glade_xml_get_widget (priv->glade_xml, "toolb_new_mail");
362 g_signal_connect (button, "clicked",
363 G_CALLBACK(on_new_mail_clicked), modest_ui);
365 button = glade_xml_get_widget (priv->glade_xml, "toolb_reply");
367 g_signal_connect (button, "clicked",
368 G_CALLBACK(on_reply_clicked), modest_ui);
369 gtk_widget_set_sensitive(button, FALSE);
372 button = glade_xml_get_widget (priv->glade_xml, "toolb_reply_all");
374 //g_signal_connect (button, "clicked",
375 // G_CALLBACK(on_reply_all_clicked), modest_ui);
376 gtk_widget_set_sensitive(button, FALSE);
379 button = glade_xml_get_widget (priv->glade_xml, "toolb_forward");
381 //g_signal_connect (button, "clicked",
382 // G_CALLBACK(on_forward_clicked), modest_ui);
383 gtk_widget_set_sensitive(button, FALSE);
386 button = glade_xml_get_widget (priv->glade_xml, "toolb_move_to");
388 //g_signal_connect (button, "clicked",
389 // G_CALLBACK(on_forward_clicked), modest_ui);
390 gtk_widget_set_sensitive(button, FALSE);
393 button = glade_xml_get_widget (priv->glade_xml, "toolb_delete");
395 g_signal_connect (button, "clicked",
396 G_CALLBACK(on_delete_clicked), modest_ui);
397 gtk_widget_set_sensitive(button, FALSE);
403 hide_edit_window (GtkWidget *win, GdkEvent *event, gpointer data)
405 ModestUIPrivate *priv;
407 priv = MODEST_UI_GET_PRIVATE(data);
408 gtk_widget_hide (win);
409 modest_window_mgr_unregister(priv->modest_window_mgr, G_OBJECT(win));
414 modest_ui_show_edit_window (ModestUI *modest_ui, const gchar* to,
415 const gchar* cc, const gchar* bcc,
416 const gchar* subject, const gchar *body,
419 GtkWidget *win, *to_entry, *subject_entry, *body_view;
421 ModestUIPrivate *priv;
425 priv = MODEST_UI_GET_PRIVATE(modest_ui);
426 int height = modest_conf_get_int (priv->modest_conf,
427 MODEST_CONF_EDIT_WINDOW_HEIGHT,NULL);
428 int width = modest_conf_get_int (priv->modest_conf,
429 MODEST_CONF_EDIT_WINDOW_WIDTH,NULL);
431 win = glade_xml_get_widget (priv->glade_xml, "new_mail");
433 g_warning ("could not create new mail window");
437 modest_window_mgr_register (priv->modest_window_mgr,
438 G_OBJECT(win), MODEST_EDIT_WINDOW, 0);
439 to_entry = glade_xml_get_widget (priv->glade_xml, "to_entry");
440 subject_entry = glade_xml_get_widget (priv->glade_xml, "subject_entry");
441 body_view = glade_xml_get_widget (priv->glade_xml, "body_view");
443 gtk_entry_set_text(GTK_ENTRY(subject_entry), subject);
444 gtk_entry_set_text(GTK_ENTRY(to_entry), to);
446 buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(body_view));
448 gtk_text_buffer_set_text(buf, body, -1);
450 gtk_text_buffer_set_text(buf, "", -1);
452 g_signal_connect (win, "destroy-event", G_CALLBACK(hide_edit_window),
454 g_signal_connect (win, "delete-event", G_CALLBACK(hide_edit_window),
457 gtk_widget_set_usize (GTK_WIDGET(win), height, width);
458 gtk_window_set_title (GTK_WINDOW(win),
459 subject ? subject : "Untitled");
462 btn = glade_xml_get_widget (priv->glade_xml, "toolb_send");
463 g_signal_connect (btn, "clicked", G_CALLBACK(on_send_button_clicked),
466 gtk_widget_show_all (win);
473 modest_ui_window_destroy (GtkWidget *win, GdkEvent *event, gpointer data)
475 ModestUIPrivate *priv;
477 g_return_if_fail (data);
478 g_return_if_fail(MODEST_IS_UI(data));
479 priv = MODEST_UI_GET_PRIVATE((ModestUI *)data);
480 g_return_if_fail(priv);
481 if (!modest_window_mgr_unregister (priv->modest_window_mgr, G_OBJECT(win)))
482 g_warning ("modest window mgr: failed to unregister %p",
485 gtk_widget_hide(win);
490 modest_ui_last_window_closed (GObject *obj, gpointer data)
492 /* FIXME: Other cleanups todo? Finalize Tinymail? */
498 on_account_selector_selection_changed (GtkWidget *widget,
501 GtkTreeModel *model = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
506 if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget), &iter))
508 gtk_tree_model_get(GTK_TREE_MODEL(model),
515 account_name="empty";
518 g_message("Value: '%s'\n", account_name);
523 on_account_settings1_activate (GtkMenuItem *menuitem,
527 GtkWidget *advanced_account_setup;
528 ModestUIPrivate *priv;
530 GSList *account_name_list;
531 GSList *account_name_list_iter;
532 GtkListStore *account_names;
533 GtkTreeIter account_names_iter;
534 GtkWidget *account_selector;
535 GtkCellRenderer *renderer;
537 priv = MODEST_UI_GET_PRIVATE(MODEST_UI(user_data));
539 glade_xml = glade_xml_new(MODEST_GLADE, "mailbox_setup_advanced", NULL);
540 advanced_account_setup = glade_xml_get_widget(glade_xml, "mailbox_setup_advanced");
542 account_name_list=modest_account_mgr_account_names(priv->modest_acc_mgr, NULL);
543 account_names = gtk_list_store_new(1, G_TYPE_STRING);
545 for (account_name_list_iter=account_name_list;
546 account_name_list_iter!=NULL;
547 account_name_list_iter=g_slist_next(account_name_list_iter))
549 gtk_list_store_append(account_names, &account_names_iter);
550 gtk_list_store_set(account_names, &account_names_iter,
551 0, account_name_list_iter->data,
555 g_slist_free(account_name_list);
557 account_selector = glade_xml_get_widget(glade_xml, "account_selector");
558 gtk_combo_box_set_model(GTK_COMBO_BOX(account_selector), GTK_TREE_MODEL(account_names));
560 renderer = gtk_cell_renderer_text_new ();
561 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (account_selector), renderer, TRUE);
562 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (account_selector), renderer,
566 g_signal_connect(GTK_WIDGET(account_selector), "changed",
567 G_CALLBACK(on_account_selector_selection_changed),
568 GTK_WIDGET(advanced_account_setup));
570 gtk_combo_box_set_active(GTK_COMBO_BOX(account_selector), 0);
572 gtk_widget_show_all(GTK_WIDGET(advanced_account_setup));
574 retval=gtk_dialog_run(GTK_DIALOG(advanced_account_setup));
576 g_object_unref(account_names);
578 gtk_widget_destroy(GTK_WIDGET(advanced_account_setup));
580 g_object_unref(glade_xml);
585 on_folder_clicked (ModestTnyFolderTreeView *folder_tree,
586 TnyMsgFolderIface *folder,
592 ModestTnyHeaderTreeView *tree_view;
593 ModestTnyMsgView *msg_view;
594 ModestUIPrivate *priv;
595 GtkWidget *scrollview;
597 g_return_if_fail (folder);
598 g_return_if_fail (data);
600 priv = MODEST_UI_GET_PRIVATE(data);
601 scrollview = glade_xml_get_widget (priv->glade_xml,"mail_list");
603 tree_view = MODEST_TNY_HEADER_TREE_VIEW(
604 gtk_bin_get_child(GTK_BIN(scrollview)));
605 win = glade_xml_get_widget (priv->glade_xml, "main");
606 gtk_window_set_title (GTK_WINDOW(win),
607 tny_msg_folder_iface_get_name(folder));
609 modest_tny_header_tree_view_set_folder (tree_view,
612 button = glade_xml_get_widget (priv->glade_xml, "toolb_reply");
614 gtk_widget_set_sensitive(button, FALSE);
617 button = glade_xml_get_widget (priv->glade_xml, "toolb_forward");
619 gtk_widget_set_sensitive(button, FALSE);
622 button = glade_xml_get_widget (priv->glade_xml, "toolb_delete");
624 gtk_widget_set_sensitive(button, FALSE);
627 paned = glade_xml_get_widget (priv->glade_xml,"mail_paned");
628 g_return_if_fail (paned);
630 msg_view = MODEST_TNY_MSG_VIEW(gtk_paned_get_child2 (GTK_PANED(paned)));
631 g_return_if_fail (msg_view);
633 modest_tny_msg_view_set_message (msg_view, NULL);
638 on_message_clicked (ModestTnyFolderTreeView *folder_tree,
639 TnyMsgIface *message,
644 ModestTnyMsgView *msg_view;
645 ModestUIPrivate *priv;
647 g_return_if_fail (data);
649 priv = MODEST_UI_GET_PRIVATE(data);
650 paned = glade_xml_get_widget (priv->glade_xml,"mail_paned");
651 msg_view = MODEST_TNY_MSG_VIEW(gtk_paned_get_child2 (GTK_PANED(paned)));
653 modest_tny_msg_view_set_message (msg_view,
655 button = glade_xml_get_widget (priv->glade_xml, "toolb_reply");
657 gtk_widget_set_sensitive(button, TRUE);
659 button = glade_xml_get_widget (priv->glade_xml, "toolb_forward");
661 gtk_widget_set_sensitive(button, TRUE);
663 button = glade_xml_get_widget (priv->glade_xml, "toolb_delete");
665 gtk_widget_set_sensitive(button, TRUE);
671 on_password_requested (ModestTnyAccountStore *account_store,
672 const gchar *account_name, gpointer user_data)
675 GtkWidget *passdialog;
677 GtkWidget *infolabel;
678 GtkWidget *passentry;
680 const gchar *infostring=g_strconcat("Please enter the password for ", account_name, ".", NULL);
682 passdialog = gtk_dialog_new_with_buttons("MyDialog",
684 GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
691 vbox=gtk_vbox_new(FALSE, 0);
693 infolabel=gtk_label_new(infostring);
694 passentry=gtk_entry_new();
696 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(passdialog)->vbox), infolabel, FALSE, FALSE, 0);
697 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(passdialog)->vbox), passentry, FALSE, FALSE, 0);
698 gtk_widget_show_all(passdialog);
700 retval = gtk_dialog_run (GTK_DIALOG(passdialog));
704 case GTK_RESPONSE_ACCEPT:
705 modest_account_mgr_set_server_account_string(modest_tny_account_store_get_accout_mgr(account_store),
708 gtk_entry_get_text(GTK_ENTRY(passentry)),
711 case GTK_RESPONSE_CANCEL:
713 * What happens, if canceled?"
718 gtk_widget_destroy (passdialog);
723 modest_main_window_header_tree (TnyMsgFolderIface *folder)
726 GSList *columns = NULL;
727 GtkWidget *header_tree;
728 ModestTnyHeaderTreeViewColumn cols[] = {
729 MODEST_TNY_HEADER_TREE_VIEW_COLUMN_MSGTYPE,
730 MODEST_TNY_HEADER_TREE_VIEW_COLUMN_ATTACH,
731 MODEST_TNY_HEADER_TREE_VIEW_COLUMN_COMPACT_HEADER
734 for (i = 0 ; i != sizeof(cols)/sizeof(ModestTnyHeaderTreeViewColumn); ++i)
735 columns = g_slist_append (columns, GINT_TO_POINTER(cols[i]));
737 header_tree = GTK_WIDGET(modest_tny_header_tree_view_new(folder, columns,
738 MODEST_TNY_HEADER_TREE_VIEW_STYLE_NORMAL));
739 g_slist_free (columns);
742 g_warning ("could not create header tree");
746 return GTK_WIDGET(header_tree);
751 modest_main_window_folder_tree (ModestAccountMgr *modest_acc_mgr,
752 TnyAccountStoreIface *account_store)
754 GtkWidget *folder_tree;
756 folder_tree = GTK_WIDGET(modest_tny_folder_tree_view_new (account_store));
758 g_warning ("could not create folder list");
767 on_new_mail_clicked (GtkWidget *widget, ModestUI *modest_ui)
769 g_return_if_fail (modest_ui);
770 modest_ui_show_edit_window (modest_ui, "", "", "", "", "", NULL);
775 reply_to_msg (ModestUI *modest_ui, TnyMsgHeaderIface *header,
776 ModestTnyMsgView *msg_view) {
777 const TnyMsgIface *msg;
778 const TnyMsgFolderIface *folder;
780 const gchar *subject, *from;
781 gchar *unquoted, *quoted;
783 gint line_limit = 76;
786 g_warning("no header");
790 folder = tny_msg_header_iface_get_folder (TNY_MSG_HEADER_IFACE(header));
792 g_warning ("cannot find folder");
796 msg = tny_msg_folder_iface_get_message (TNY_MSG_FOLDER_IFACE(folder), header);
798 g_warning ("cannot find msg");
802 subject = tny_msg_header_iface_get_subject(header);
803 re_sub = g_string_new(subject);
804 g_string_prepend(re_sub, "Re: ");
805 /* FIXME: honor replyto, cc */
806 from = tny_msg_header_iface_get_from(header);
807 sent_date = tny_msg_header_iface_get_date_sent(header);
809 unquoted = modest_tny_msg_view_get_selected_text(msg_view);
810 quoted = modest_tny_msg_actions_quote(msg, from, sent_date, line_limit, unquoted);
812 modest_ui_show_edit_window (modest_ui, from, /* cc */ "", /* bcc */ "", re_sub->str, quoted, NULL);
815 g_string_free(re_sub, TRUE);
820 on_reply_clicked (GtkWidget *widget, ModestUI *modest_ui)
822 GtkTreeSelection *sel;
826 GtkScrolledWindow *scroll;
828 TnyMsgHeaderIface *header;
830 ModestTnyHeaderTreeView *header_view;
831 ModestTnyMsgView *msg_view;
832 ModestUIPrivate *priv;
834 g_return_if_fail (modest_ui);
836 priv = MODEST_UI_GET_PRIVATE(modest_ui);
838 paned = glade_xml_get_widget (priv->glade_xml,"mail_paned");
839 g_return_if_fail (paned);
841 scroll = GTK_SCROLLED_WINDOW(gtk_paned_get_child1 (GTK_PANED(paned)));
842 g_return_if_fail (scroll);
844 msg_view = MODEST_TNY_MSG_VIEW(gtk_paned_get_child2 (GTK_PANED(paned)));
845 g_return_if_fail (msg_view);
847 header_view = MODEST_TNY_HEADER_TREE_VIEW(gtk_bin_get_child (GTK_BIN(scroll)));
848 g_return_if_fail (header_view);
850 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view));
851 g_return_if_fail (sel);
853 if (!gtk_tree_selection_get_selected (sel, &model, &iter)) {
854 /* no message was selected. TODO: disable reply button in this case */
855 g_warning("nothing to reply to");
859 gtk_tree_model_get (model, &iter,
860 TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN,
863 reply_to_msg (modest_ui, header, msg_view);
867 /* FIXME: truly evil --> we cannot really assume that
868 * there is only one edit window open...
871 on_send_button_clicked (GtkWidget *widget, ModestUI *modest_ui)
873 ModestTnyTransportActions *actions;
874 ModestUIPrivate *priv;
875 GtkWidget *to_entry, *subject_entry, *body_view;
876 const gchar *to, *subject, *email_from;
878 GtkTextIter start, end;
880 TnyAccountStoreIface *account_store;
881 const GList *transport_accounts;
882 TnyTransportAccountIface *transport_account;
884 ModestIdentityMgr *id_mgr;
886 g_return_if_fail (modest_ui);
888 actions = MODEST_TNY_TRANSPORT_ACTIONS
889 (modest_tny_transport_actions_new ());
890 priv = MODEST_UI_GET_PRIVATE(modest_ui);
892 account_store = priv->account_store;
894 tny_account_store_iface_get_transport_accounts (account_store);
895 if (!transport_accounts) {
896 g_message ("cannot send message: no transport account defined");
898 } else /* take the first one! */
900 TNY_TRANSPORT_ACCOUNT_IFACE(transport_accounts->data);
902 to_entry = glade_xml_get_widget (priv->glade_xml, "to_entry");
903 subject_entry = glade_xml_get_widget (priv->glade_xml, "subject_entry");
904 body_view = glade_xml_get_widget (priv->glade_xml, "body_view");
906 to = gtk_entry_get_text (GTK_ENTRY(to_entry));
907 subject = gtk_entry_get_text (GTK_ENTRY(subject_entry));
909 buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(body_view));
910 gtk_text_buffer_get_bounds (buf, &start, &end);
911 body = gtk_text_buffer_get_text (buf, &start, &end, FALSE);
913 id_mgr = priv->modest_id_mgr;
914 email_from = modest_identity_mgr_get_identity_string(id_mgr,
915 MODEST_IDENTITY_DEFAULT_IDENTITY,
916 MODEST_IDENTITY_EMAIL, NULL);
918 g_message("sending \"%s\" %s ==> %s", subject, email_from, to);
919 modest_tny_transport_actions_send_message (actions,
925 g_object_unref (G_OBJECT(actions));
927 gtk_entry_set_text (GTK_ENTRY(to_entry), "");
928 gtk_entry_set_text (GTK_ENTRY(subject_entry), "");
929 gtk_text_buffer_set_text (buf, "", 0);
931 gtk_widget_hide (glade_xml_get_widget (priv->glade_xml, "new_mail"));
936 on_delete_clicked (GtkWidget *widget, ModestUI *modest_ui)
938 GtkTreeSelection *sel;
942 GtkScrolledWindow *scroll;
943 GtkTreeModel *mymodel, *sortable;
945 ModestTnyHeaderTreeView *header_view;
946 ModestTnyMsgView *msg_view;
947 ModestUIPrivate *priv;
949 g_return_if_fail (modest_ui);
951 priv = MODEST_UI_GET_PRIVATE(modest_ui);
953 paned = glade_xml_get_widget (priv->glade_xml,"mail_paned");
954 g_return_if_fail (paned);
956 scroll = GTK_SCROLLED_WINDOW(gtk_paned_get_child1 (GTK_PANED(paned)));
957 g_return_if_fail (scroll);
959 msg_view = MODEST_TNY_MSG_VIEW(gtk_paned_get_child2 (GTK_PANED(paned)));
960 g_return_if_fail (msg_view);
962 header_view = MODEST_TNY_HEADER_TREE_VIEW(gtk_bin_get_child (GTK_BIN(scroll)));
963 g_return_if_fail (header_view);
965 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view));
966 g_return_if_fail (sel);
968 /* get all selected mails */
969 if (G_LIKELY (gtk_tree_selection_get_selected (sel, &model, &iter)))
971 TnyMsgHeaderIface *header;
973 gtk_tree_model_get (model, &iter, TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN,
976 if (G_LIKELY (header))
978 TnyMsgFolderIface *folder;
979 const TnyMsgIface *msg;
981 if (GTK_IS_TREE_MODEL_SORT (model))
983 mymodel = gtk_tree_model_sort_get_model
984 (GTK_TREE_MODEL_SORT (model));
988 folder = (TnyMsgFolderIface*)tny_msg_header_iface_get_folder (header);
990 /* this will make the message as deleted */
991 /* tny_msg_folder_iface_expunge (folder); will finally delete messages */
992 if (TNY_IS_MSG_FOLDER (folder))
993 tny_msg_folder_iface_remove_message (folder, header);
994 gtk_widget_queue_draw (GTK_WIDGET (header_view));