* install_test_account no longer used in modest-main.c
[modest] / src / gtk-glade / modest-ui.c
1 /* modest-ui.c */
2
3 /* insert (c)/licensing information) */
4
5 #include <gtk/gtk.h>
6 #include <glade/glade.h>
7 #include <glib/gi18n.h>
8 #include <string.h>
9
10 #ifdef HAVE_CONFIG_H
11 #include <config.h>
12 #endif /*HAVE_CONFIG_H*/
13
14 /* TODO: put in auto* */
15 #include <tny-text-buffer-stream.h>
16 #include <tny-msg-folder.h>
17
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"
23
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"
30
31 #include "../modest-text-utils.h"
32 #include "../modest-tny-msg-actions.h"
33
34 #include "../modest-editor-window.h"
35
36 #include "modest-ui-glade.h"
37 #include "modest-ui-wizard.h"
38
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);
43
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);
46
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);
50
51 //static void on_account_settings1_activate (GtkMenuItem *,
52 //                                  gpointer);
53
54 static void on_password_requested (ModestTnyAccountStore *account_store,
55                                    const gchar *account_name, gpointer user_data);
56
57 static void on_folder_clicked (ModestTnyFolderTreeView *folder_tree,
58                                TnyMsgFolderIface *folder,
59                                gpointer data);
60 static void on_message_clicked (ModestTnyFolderTreeView *folder_tree,
61                                 TnyMsgIface *message,
62                                 gpointer data);
63 static void on_new_mail_clicked (GtkWidget *widget, ModestUI *modest_ui);
64
65 static void on_reply_clicked (GtkWidget *widget, ModestUI *modest_ui);
66
67 static void on_forward_clicked (GtkWidget *widget, ModestUI *modest_ui);
68
69 static void on_delete_clicked (GtkWidget *widget, ModestUI *modest_ui);
70
71 #if 1
72 static void on_send_button_clicked (GtkWidget *widget, ModestEditorWindow *modest_editwin);
73 #else
74 static void on_send_button_clicked (GtkWidget *widget, ModestUI *modest_ui);
75 #endif
76
77 static void on_sendreceive_button_clicked (GtkWidget *widget, ModestUI *modest_ui);
78
79 static void register_toolbar_callbacks (ModestUI *modest_ui);
80
81 typedef enum {
82         QUOTED_SEND_REPLY,
83         QUOTED_SEND_REPLY_ALL,
84         QUOTED_SEND_FORWARD
85 } quoted_send_type;
86
87 static void quoted_send_msg (ModestUI *modest_ui, quoted_send_type qstype);
88
89
90 typedef struct {
91         ModestUI *modest_ui;
92         ModestEditorWindow *edit_win;
93         GladeXML *glade_xml;
94 } EditWinData;
95
96
97 /* list my signals */
98 enum {
99         /* MY_SIGNAL_1, */
100         /* MY_SIGNAL_2, */
101         LAST_SIGNAL
102 };
103
104 /* globals */
105 static GObjectClass *parent_class = NULL;
106
107 /* uncomment the following if you have defined any signals */
108 /* static guint signals[LAST_SIGNAL] = {0}; */
109
110 GType
111 modest_ui_get_type (void)
112 {
113         static GType my_type = 0;
114         if (!my_type) {
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 */
122                         sizeof(ModestUI),
123                         1,              /* n_preallocs */
124                         (GInstanceInitFunc) modest_ui_init,
125                 };
126                 my_type = g_type_register_static (G_TYPE_OBJECT,
127                                                   "ModestUI",
128                                                   &my_info, 0);
129         }
130         return my_type;
131 }
132
133
134 static void
135 modest_ui_class_init (ModestUIClass *klass)
136 {
137         GObjectClass *gobject_class;
138         gobject_class = (GObjectClass*) klass;
139
140         parent_class            = g_type_class_peek_parent (klass);
141         gobject_class->finalize = modest_ui_finalize;
142
143         g_type_class_add_private (gobject_class, sizeof(ModestUIPrivate));
144
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",....); */
150 /*      etc. */
151 }
152
153
154 static void
155 modest_ui_init (ModestUI *obj)
156 {
157         ModestUIPrivate *priv = MODEST_UI_GET_PRIVATE(obj);
158
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;
164
165 }
166
167
168 static void
169 modest_ui_finalize (GObject *obj)
170 {
171         ModestUIPrivate *priv = MODEST_UI_GET_PRIVATE(obj);
172
173         if (priv->modest_acc_mgr)
174                 g_object_unref (priv->modest_acc_mgr);
175         priv->modest_acc_mgr = NULL;
176
177         if (priv->modest_id_mgr)
178                 g_object_unref (priv->modest_id_mgr);
179         priv->modest_id_mgr = NULL;
180
181         if (priv->modest_conf)
182                 g_object_unref (priv->modest_conf);
183         priv->modest_conf = NULL;
184
185         if (priv->modest_window_mgr)
186                 g_object_unref (priv->modest_window_mgr);
187         priv->modest_window_mgr = NULL;
188 }
189
190
191 GObject*
192 modest_ui_new (ModestConf *modest_conf)
193 {
194         GObject *obj;
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;
201
202         g_return_val_if_fail (modest_conf, NULL);
203
204         obj = g_object_new(MODEST_TYPE_UI, NULL);
205         priv = MODEST_UI_GET_PRIVATE(obj);
206
207         modest_acc_mgr =
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);
212                 return NULL;
213         }
214
215         modest_id_mgr =
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);
220                 return NULL;
221         }
222
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");
227                 return NULL;
228         }
229         g_signal_connect (account_store_iface, "password_requested",
230                           G_CALLBACK(on_password_requested),
231                           NULL);
232
233         glade_init ();
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);
238                 return NULL;
239         }
240
241         /* FIXME: could be used, but doesn't work atm.
242          * glade_xml_signal_autoconnect(priv->glade_xml);
243          */
244
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);
248
249         priv->account_store = account_store_iface;
250
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),
254                           NULL);
255
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);
262
263         return obj;
264 }
265
266
267 gboolean
268 modest_ui_show_main_window (ModestUI *modest_ui)
269 {
270         GtkWidget       *win;
271         gint              height, width;
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;
278
279         GtkWidget  *folder_view_holder,
280                 *header_view_holder,
281                 *mail_paned;
282
283         priv = MODEST_UI_GET_PRIVATE(modest_ui);
284
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);
289
290         win = glade_xml_get_widget (priv->glade_xml, "main");
291         if (!win) {
292                 g_warning ("could not create main window");
293                 return FALSE;
294         }
295
296         folder_view =
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");
302                 return FALSE;
303         }
304         gtk_container_add (GTK_CONTAINER(folder_view_holder), folder_view);
305
306         header_view  =  GTK_WIDGET(modest_main_window_header_tree (NULL));
307         header_view_holder = glade_xml_get_widget (priv->glade_xml, "mail_list");
308         if (!header_view) {
309                 g_warning ("failed to create header tree");
310                 return FALSE;
311         }
312         gtk_container_add (GTK_CONTAINER(header_view_holder), header_view);
313
314         g_signal_connect (G_OBJECT(folder_view), "folder_selected",
315                           G_CALLBACK(on_folder_clicked), modest_ui);
316
317         message_view  = GTK_WIDGET(modest_tny_msg_view_new (NULL, priv->modest_conf));
318         if (!message_view) {
319                 g_warning ("failed to create message view");
320                 return FALSE;
321         }
322         mail_paned = glade_xml_get_widget (priv->glade_xml, "mail_paned");
323         gtk_paned_add2 (GTK_PANED(mail_paned), message_view);
324
325         g_signal_connect (header_view, "message_selected",
326                           G_CALLBACK(on_message_clicked),
327                           modest_ui);
328
329         account_settings_item = glade_xml_get_widget (priv->glade_xml, "AccountSettingsMenuItem");
330         if (!account_settings_item)
331         {
332                 g_warning ("The account settings item isn't available!\n");
333                 return FALSE;
334         }
335         /*
336         g_signal_connect (account_settings_item, "activate",
337                           G_CALLBACK(on_account_settings1_activate),
338                           modest_ui);
339         */
340
341         new_account_item = glade_xml_get_widget (priv->glade_xml, "NewAccountWizardMenuItem");
342         if (!new_account_item)
343         {
344                 g_warning ("The new account item isn't available!\n");
345                 return FALSE;
346         }
347
348         g_signal_connect (new_account_item, "activate",
349                           G_CALLBACK(new_wizard_account),
350                           modest_ui);
351
352         delete_item = glade_xml_get_widget (priv->glade_xml, "delete1");
353         if (!delete_item)
354         {
355                 g_warning ("The delete item isn't available!\n");
356                 return FALSE;
357         }
358
359         g_signal_connect (delete_item, "activate", G_CALLBACK(on_delete_clicked),
360                           modest_ui);
361
362         register_toolbar_callbacks (modest_ui);
363
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),
367                           modest_ui);
368         g_signal_connect (win, "delete-event", G_CALLBACK(modest_ui_window_destroy),
369                           modest_ui);
370         gtk_widget_set_usize (GTK_WIDGET(win), width, height);
371         gtk_window_set_title (GTK_WINDOW(win), PACKAGE_STRING);
372
373         gtk_widget_show_all (win);
374         return TRUE;
375 }
376
377
378 static void
379 register_toolbar_callbacks (ModestUI *modest_ui)
380 {
381         ModestUIPrivate *priv;
382         GtkWidget *button;
383
384         g_return_if_fail (modest_ui);
385
386         priv = MODEST_UI_GET_PRIVATE (modest_ui);
387
388         button = glade_xml_get_widget (priv->glade_xml, "toolb_new_mail");
389         if (button)
390                 g_signal_connect (button, "clicked",
391                                   G_CALLBACK(on_new_mail_clicked), modest_ui);
392
393         button = glade_xml_get_widget (priv->glade_xml, "toolb_reply");
394         if (button) {
395                 g_signal_connect (button, "clicked",
396                                   G_CALLBACK(on_reply_clicked), modest_ui);
397                 gtk_widget_set_sensitive(button, FALSE);
398         }
399
400         button = glade_xml_get_widget (priv->glade_xml, "toolb_reply_all");
401         if (button) {
402                 //g_signal_connect (button, "clicked",
403                 //                G_CALLBACK(on_reply_all_clicked), modest_ui);
404                 gtk_widget_set_sensitive(button, FALSE);
405         }
406
407         button = glade_xml_get_widget (priv->glade_xml, "toolb_forward");
408         if (button) {
409                 g_signal_connect (button, "clicked",
410                                   G_CALLBACK(on_forward_clicked), modest_ui);
411                 gtk_widget_set_sensitive(button, FALSE);
412         }
413
414         button = glade_xml_get_widget (priv->glade_xml, "toolb_move_to");
415         if (button) {
416                 //g_signal_connect (button, "clicked",
417                 //                G_CALLBACK(on_move_to_clicked), modest_ui);
418                 gtk_widget_set_sensitive(button, FALSE);
419         }
420
421         button = glade_xml_get_widget (priv->glade_xml, "toolb_delete");
422         if (button) {
423                 g_signal_connect (button, "clicked",
424                                   G_CALLBACK(on_delete_clicked), modest_ui);
425                 gtk_widget_set_sensitive(button, FALSE);
426         }
427
428         button = glade_xml_get_widget (priv->glade_xml, "toolb_send_receive");
429         if (button) {
430                 g_signal_connect (button, "clicked",
431                                   G_CALLBACK(on_sendreceive_button_clicked), modest_ui);
432                 gtk_widget_set_sensitive(button, TRUE);
433         }
434 }
435
436 #if 0
437 static void
438 hide_edit_window (GtkWidget *win, GdkEvent *event, gpointer data)
439 {
440         ModestUIPrivate *priv;
441
442         priv = MODEST_UI_GET_PRIVATE(data);
443         gtk_widget_hide (win);
444         modest_window_mgr_unregister(priv->modest_window_mgr, G_OBJECT(win));
445 }
446 #endif
447
448
449 static gboolean close_edit_confirm_dialog(ModestEditorWindow *edit_win)
450 {
451         GtkWidget *mdialog;
452         gint res;
453
454         mdialog = gtk_message_dialog_new(GTK_WINDOW(edit_win),
455                         GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
456                         GTK_MESSAGE_QUESTION,
457                         GTK_BUTTONS_YES_NO,
458                         _("Message was modified.\nDiscard Changes?"));
459         gtk_widget_show_all (mdialog);
460
461         res=gtk_dialog_run(GTK_DIALOG(mdialog));
462         gtk_widget_destroy (mdialog);
463         if (res == GTK_RESPONSE_YES)
464                 return TRUE;
465         else
466                 return FALSE;
467 }
468
469 static void
470 close_edit_window (GtkWidget *win, GdkEvent *event, gpointer data)
471 {
472         ModestEditorWindow *edit_win;
473         ModestUIPrivate *priv;
474         EditWinData *win_data;
475
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);
479
480         // g_message("window was %s modified", modest_editor_window_get_modified(edit_win) ? "" : "not");
481
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");
488                 } else {
489                         g_message("not closing window");
490                 }
491         }
492 }
493
494
495 GtkContainer
496 *modest_ui_new_editor_window (ModestUI *modest_ui, gpointer *user_data)
497 {
498         GtkWidget       *top_container;
499
500         GladeXML                *glade_xml;
501         EditWinData             *win_data;
502
503         glade_xml = glade_xml_new(MODEST_GLADE, "new_mail_top_container", NULL);
504         if (!glade_xml)
505                 return NULL;
506
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;
511
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));
515                 return NULL;
516         }
517
518         return GTK_CONTAINER(top_container);
519 }
520
521
522 gboolean
523 modest_ui_editor_window_set_to_header(const gchar *to, gpointer window_data)
524 {
525         GladeXML *glade_xml;
526         GtkWidget *w;
527         EditWinData *win_data;
528
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);
533
534         return TRUE;
535 }
536
537
538 gboolean
539 modest_ui_editor_window_set_cc_header(const gchar *cc, gpointer window_data)
540 {
541         GladeXML *glade_xml;
542         // GtkWidget *w;
543         EditWinData *win_data;
544
545         win_data = (EditWinData *)window_data;
546         glade_xml = win_data->glade_xml;
547 /*
548         w = glade_xml_get_widget(glade_xml, "cc_entry");
549         gtk_entry_set_text(GTK_ENTRY(w), cc);
550 */
551         return TRUE;
552 }
553
554
555 gboolean
556 modest_ui_editor_window_set_bcc_header(const gchar *bcc, gpointer window_data)
557 {
558         GladeXML *glade_xml;
559         // GtkWidget *w;
560         EditWinData *win_data;
561
562         win_data = (EditWinData *)window_data;
563         glade_xml = win_data->glade_xml;
564 /*
565         w = glade_xml_get_widget(glade_xml, "bcc_entry");
566         gtk_entry_set_text(GTK_ENTRY(w), bcc);
567 */
568         return TRUE;
569 }
570
571
572 gboolean
573 modest_ui_editor_window_set_subject_header(const gchar *subject, gpointer window_data)
574 {
575         GladeXML *glade_xml;
576         GtkWidget *w;
577         EditWinData *win_data;
578
579         win_data = (EditWinData *)window_data;
580         glade_xml = win_data->glade_xml;
581
582         w = glade_xml_get_widget(glade_xml, "subject_entry");
583         gtk_entry_set_text(GTK_ENTRY(w), subject);
584
585         return TRUE;
586 }
587
588
589 gboolean
590 modest_ui_editor_window_set_body(const gchar *body, gpointer window_data)
591 {
592         GladeXML *glade_xml;
593         GtkWidget *body_view;
594         GtkTextBuffer *buf;
595         EditWinData *win_data;
596
597         win_data = (EditWinData *)window_data;
598         glade_xml = win_data->glade_xml;
599
600         body_view = glade_xml_get_widget(glade_xml, "body_view");
601         buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(body_view));
602
603         gtk_text_buffer_set_text(GTK_TEXT_BUFFER(buf), body, -1);
604
605         return TRUE;
606 }
607
608 #if 0
609 gboolean
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,
613                             const GSList* att)
614 {
615         GtkWidget       *win, *to_entry, *subject_entry, *body_view;
616
617         ModestUIPrivate *priv;
618         GtkWidget       *btn;
619         GtkTextBuffer   *buf;
620
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);
626
627         win = glade_xml_get_widget (priv->glade_xml, "new_mail");
628         if (!win) {
629                 g_warning ("could not create new mail  window");
630                 return FALSE;
631         }
632
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);
638         }
639
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");
643
644         gtk_entry_set_text(GTK_ENTRY(subject_entry), subject);
645         gtk_entry_set_text(GTK_ENTRY(to_entry), to);
646
647         buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(body_view));
648         if (body) {
649                 gtk_text_buffer_set_text(buf, body, -1);
650         } else {
651                 gtk_text_buffer_set_text(buf, "", -1);
652         }
653         g_signal_connect (win, "destroy-event", G_CALLBACK(hide_edit_window),
654                           modest_ui);
655         g_signal_connect (win, "delete-event", G_CALLBACK(hide_edit_window),
656                           modest_ui);
657
658         gtk_widget_set_usize (GTK_WIDGET(win), height, width);
659         gtk_window_set_title (GTK_WINDOW(win),
660                               subject ? subject : "Untitled");
661
662
663         btn = glade_xml_get_widget (priv->glade_xml, "toolb_send");
664         g_signal_connect (btn, "clicked", G_CALLBACK(on_send_button_clicked),
665                           modest_ui);
666
667         gtk_widget_show_all (win);
668
669         return TRUE;
670 }
671 #endif
672
673 static void
674 modest_ui_window_destroy (GtkWidget *win, GdkEvent *event, gpointer data)
675 {
676         ModestUIPrivate *priv;
677
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",
684                            G_OBJECT(win));
685         else
686                 gtk_widget_hide(win);
687 }
688
689
690 static void
691 modest_ui_last_window_closed (GObject *obj, gpointer data)
692 {
693         /* FIXME: Other cleanups todo? Finalize Tinymail? */
694         gtk_main_quit ();
695 }
696
697
698 void
699 on_account_selector_selection_changed (GtkWidget *widget,
700                                        gpointer user_data)
701 {
702         GtkTreeModel *model = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
703         GtkTreeIter iter;
704
705         gchar *account_name;
706
707         if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget), &iter))
708         {
709                 gtk_tree_model_get(GTK_TREE_MODEL(model),
710                                    &iter,
711                                    0, &account_name,
712                                    -1);
713         }
714         else
715         {
716                 account_name="empty";
717         }
718
719         g_message("Value: '%s'\n", account_name);
720
721         free(account_name);
722 }
723
724 #if 0
725 static void
726 on_account_settings1_activate (GtkMenuItem *menuitem,
727                                gpointer user_data)
728 {
729         GladeXML *glade_xml;
730         GtkWidget *advanced_account_setup;
731         ModestUIPrivate *priv;
732         gint retval;
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;
739
740
741         g_return_if_fail(MODEST_IS_UI(user_data));
742         priv = MODEST_UI_GET_PRIVATE(MODEST_UI(user_data));
743
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");
746
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);
749
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))
753         {
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,
757                                    -1);
758         }
759
760         g_slist_free(account_name_list);
761
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));
764
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,
768                                         "text", 0,
769                                         NULL);
770
771         g_signal_connect(GTK_WIDGET(account_selector), "changed",
772                          G_CALLBACK(on_account_selector_selection_changed),
773                          GTK_WIDGET(advanced_account_setup));
774
775         gtk_combo_box_set_active(GTK_COMBO_BOX(account_selector), 0);
776
777         gtk_widget_show_all(GTK_WIDGET(advanced_account_setup));
778
779         retval=gtk_dialog_run(GTK_DIALOG(advanced_account_setup));
780
781         g_object_unref(account_names);
782
783         gtk_widget_destroy(GTK_WIDGET(advanced_account_setup));
784
785         g_object_unref(glade_xml);
786 }
787 #endif
788
789
790 static void
791 on_folder_clicked (ModestTnyFolderTreeView *folder_tree,
792                    TnyMsgFolderIface *folder,
793                    gpointer data)
794 {
795         GtkWidget *win;
796         GtkWidget *button;
797         GtkWidget *paned;
798         ModestTnyHeaderTreeView *tree_view;
799         ModestTnyMsgView *msg_view;
800         ModestUIPrivate *priv;
801         GtkWidget *scrollview;
802
803         g_return_if_fail (folder);
804         g_return_if_fail (data);
805
806         priv = MODEST_UI_GET_PRIVATE(data);
807         scrollview = glade_xml_get_widget (priv->glade_xml,"mail_list");
808
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));
814
815         modest_tny_header_tree_view_set_folder (tree_view,
816                                                 folder);
817
818         button = glade_xml_get_widget (priv->glade_xml, "toolb_reply");
819         if (button) {
820                 gtk_widget_set_sensitive(button, FALSE);
821         }
822
823         button = glade_xml_get_widget (priv->glade_xml, "toolb_forward");
824         if (button) {
825                 gtk_widget_set_sensitive(button, FALSE);
826         }
827
828         button = glade_xml_get_widget (priv->glade_xml, "toolb_delete");
829         if (button) {
830                 gtk_widget_set_sensitive(button, FALSE);
831         }
832
833         paned = glade_xml_get_widget (priv->glade_xml,"mail_paned");
834         g_return_if_fail (paned);
835
836         msg_view = MODEST_TNY_MSG_VIEW(gtk_paned_get_child2 (GTK_PANED(paned)));
837         g_return_if_fail (msg_view);
838
839         modest_tny_msg_view_set_message  (msg_view, NULL);
840 }
841
842
843 static void
844 on_message_clicked (ModestTnyFolderTreeView *folder_tree,
845                                 TnyMsgIface *message,
846                                 gpointer data)
847 {
848         GtkWidget *paned;
849         GtkWidget *button;
850         ModestTnyMsgView *msg_view;
851         ModestUIPrivate *priv;
852
853         g_return_if_fail (data);
854
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)));
858
859         modest_tny_msg_view_set_message (msg_view,
860                                          message);
861         button = glade_xml_get_widget (priv->glade_xml, "toolb_reply");
862         if (button) {
863                 gtk_widget_set_sensitive(button, TRUE);
864         }
865         button = glade_xml_get_widget (priv->glade_xml, "toolb_forward");
866         if (button) {
867                 gtk_widget_set_sensitive(button, TRUE);
868         }
869         button = glade_xml_get_widget (priv->glade_xml, "toolb_delete");
870         if (button) {
871                 gtk_widget_set_sensitive(button, TRUE);
872         }
873 }
874
875
876 static void
877 on_password_requested (ModestTnyAccountStore *account_store,
878                        const gchar *account_name, gpointer user_data)
879 {
880
881         GtkWidget *passdialog;
882         GtkWidget *vbox;
883         GtkWidget *infolabel;
884         GtkWidget *passentry;
885         gint retval;
886         const gchar *infostring=g_strconcat("Please enter the password for ", account_name, ".", NULL);
887
888         passdialog = gtk_dialog_new_with_buttons("MyDialog",
889                                                  NULL,
890                                                  GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
891                                                  GTK_STOCK_OK,
892                                                  GTK_RESPONSE_ACCEPT,
893                                                  GTK_STOCK_CANCEL,
894                                                  GTK_RESPONSE_REJECT,
895                                                  NULL);
896
897         vbox=gtk_vbox_new(FALSE, 0);
898
899         infolabel=gtk_label_new(infostring);
900         passentry=gtk_entry_new();
901
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);
905
906         retval = gtk_dialog_run (GTK_DIALOG(passdialog));
907
908         switch (retval)
909         {
910         case GTK_RESPONSE_ACCEPT:
911                 modest_account_mgr_set_server_account_string(modest_tny_account_store_get_accout_mgr(account_store),
912                                                              account_name,
913                                                              "password",
914                                                              gtk_entry_get_text(GTK_ENTRY(passentry)),
915                                                              NULL);
916                 break;
917         case GTK_RESPONSE_CANCEL:
918                 /* FIXME:
919                  * What happens, if canceled?"
920                  */
921                 break;
922         }
923
924         gtk_widget_destroy (passdialog);
925 }
926
927
928 static GtkWidget*
929 modest_main_window_header_tree (TnyMsgFolderIface *folder)
930 {
931         int i;
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
938         };
939
940         for (i = 0 ; i != sizeof(cols)/sizeof(ModestTnyHeaderTreeViewColumn); ++i)
941                 columns = g_slist_append (columns, GINT_TO_POINTER(cols[i]));
942
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);
946
947         if (!header_tree) {
948                 g_warning ("could not create header tree");
949                 return NULL;
950         }
951
952         return GTK_WIDGET(header_tree);
953 }
954
955
956 static GtkWidget*
957 modest_main_window_folder_tree (ModestAccountMgr *modest_acc_mgr,
958                                 TnyAccountStoreIface *account_store)
959 {
960         GtkWidget *folder_tree;
961
962         folder_tree = GTK_WIDGET(modest_tny_folder_tree_view_new (account_store));
963         if (!folder_tree) {
964                 g_warning ("could not create folder list");
965                 return NULL;
966         }
967
968         return folder_tree;
969 }
970
971 static void on_editor_entry_changed(GtkEditable *editable,
972                                             gpointer     user_data)
973 {
974         GtkWidget *edit_win;
975         EditWinData *windata;
976
977         edit_win = (GtkWidget *)user_data;
978         windata = (EditWinData *)modest_editor_window_get_data(MODEST_EDITOR_WINDOW(edit_win));
979
980         modest_editor_window_set_modified(MODEST_EDITOR_WINDOW(edit_win), TRUE);
981 }
982
983 static void on_editor_buffer_changed (GtkTextBuffer *textbuffer,
984                                             gpointer       user_data)
985 {
986         GtkWidget *edit_win;
987         EditWinData *windata;
988
989         edit_win = (GtkWidget *)user_data;
990         windata = (EditWinData *)modest_editor_window_get_data(MODEST_EDITOR_WINDOW(edit_win));
991
992         modest_editor_window_set_modified(MODEST_EDITOR_WINDOW(edit_win), TRUE);
993 }
994
995 static void
996 on_new_mail_clicked (GtkWidget *widget, ModestUI *modest_ui)
997 {
998         GtkWidget *edit_win;
999         GladeXML *glade_xml;
1000         GtkWidget *btn, *w;
1001         GtkTextBuffer *buf;
1002         EditWinData *windata;
1003         ModestUIPrivate *priv;
1004         gint height, width;
1005
1006         g_return_if_fail (modest_ui);
1007         //modest_ui_new_edit_window (modest_ui, "", "", "", "", "", NULL);
1008
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);
1012
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),
1017                           edit_win);
1018
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);
1027
1028         g_signal_connect (edit_win, "destroy-event", G_CALLBACK(close_edit_window),
1029                           edit_win);
1030         g_signal_connect (edit_win, "delete-event", G_CALLBACK(close_edit_window),
1031                           edit_win);
1032
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);
1038
1039         // g_message("new editor win@%dx%d", width, height);
1040
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);
1045 }
1046
1047
1048 static void
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)
1052 {
1053         GtkWidget *edit_win;
1054         GladeXML *glade_xml;
1055         GtkWidget *btn, *w;
1056         GtkTextBuffer *buf;
1057         EditWinData *windata;
1058         ModestUIPrivate *priv;
1059         gint height, width;
1060
1061         g_return_if_fail (modest_ui);
1062
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);
1066
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),
1070                           edit_win);
1071
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);
1079
1080         g_signal_connect (edit_win, "destroy-event", G_CALLBACK(close_edit_window),
1081                           edit_win);
1082         g_signal_connect (edit_win, "delete-event", G_CALLBACK(close_edit_window),
1083                           edit_win);
1084
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);
1090
1091         // g_message("new editor win@%dx%d", width, height);
1092
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);
1096
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);
1102
1103         modest_editor_window_set_modified(MODEST_EDITOR_WINDOW(edit_win), FALSE);
1104
1105         gtk_widget_show(edit_win);
1106 }
1107
1108
1109 static void
1110 quoted_send_msg (ModestUI *modest_ui, quoted_send_type qstype) {
1111         GtkTreeSelection *sel;
1112         GtkWidget *paned;
1113         GtkTreeModel *model;
1114         GtkTreeIter iter;
1115         GtkScrolledWindow *scroll;
1116
1117         TnyMsgHeaderIface *header;
1118
1119         ModestTnyHeaderTreeView *header_view;
1120         ModestTnyMsgView *msg_view;
1121         ModestUIPrivate *priv;
1122
1123         const TnyMsgIface *msg;
1124         const TnyMsgFolderIface *folder;
1125         GString *re_sub;
1126         const gchar *subject, *from;
1127         gchar *unquoted, *quoted;
1128         time_t sent_date;
1129         gint line_limit = 76;
1130
1131         g_return_if_fail (modest_ui);
1132
1133         priv = MODEST_UI_GET_PRIVATE(modest_ui);
1134
1135         paned = glade_xml_get_widget (priv->glade_xml,"mail_paned");
1136         g_return_if_fail (paned);
1137
1138         scroll = GTK_SCROLLED_WINDOW(gtk_paned_get_child1 (GTK_PANED(paned)));
1139         g_return_if_fail (scroll);
1140
1141         msg_view = MODEST_TNY_MSG_VIEW(gtk_paned_get_child2 (GTK_PANED(paned)));
1142         g_return_if_fail (msg_view);
1143
1144         header_view = MODEST_TNY_HEADER_TREE_VIEW(gtk_bin_get_child (GTK_BIN(scroll)));
1145         g_return_if_fail (header_view);
1146
1147         sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view));
1148         g_return_if_fail (sel);
1149
1150         if (!gtk_tree_selection_get_selected (sel, &model, &iter)) {
1151                 g_warning("nothing to reply to");
1152                 return;
1153         }
1154
1155         gtk_tree_model_get (model, &iter,
1156                             TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN,
1157                             &header, -1);
1158
1159         if (!header) {
1160                 g_warning("no header");
1161                 return;
1162         }
1163
1164         folder = tny_msg_header_iface_get_folder (TNY_MSG_HEADER_IFACE(header));
1165         if (!folder) {
1166                 g_warning ("cannot find folder");
1167                 return;
1168         }
1169
1170         msg = tny_msg_folder_iface_get_message (TNY_MSG_FOLDER_IFACE(folder), header);
1171         if (!msg) {
1172                 g_warning ("cannot find msg");
1173                 return;
1174         }
1175
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);
1181
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);
1184
1185         switch (qstype) {
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);
1189                         break;
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);
1193                         break;
1194                 default:
1195                         break;
1196         }
1197         g_free(quoted);
1198         g_free(unquoted);
1199         g_string_free(re_sub, TRUE);
1200 }
1201
1202
1203 static void
1204 on_reply_clicked (GtkWidget *widget, ModestUI *modest_ui)
1205 {
1206         quoted_send_msg (modest_ui, QUOTED_SEND_REPLY);
1207 }
1208
1209
1210 static void
1211 on_forward_clicked (GtkWidget *widget, ModestUI *modest_ui)
1212 {
1213         quoted_send_msg (modest_ui, QUOTED_SEND_FORWARD);
1214 }
1215
1216
1217 static void
1218 on_send_button_clicked (GtkWidget *widget, ModestEditorWindow *modest_editwin)
1219 {
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;
1225         gchar *body;
1226         GtkTextIter start, end;
1227         GtkTextBuffer *buf;
1228         /* TnyAccountStoreIface *account_store;
1229         const GList *transport_accounts;
1230         TnyTransportAccountIface *transport_account;
1231         ModestConf       *conf; */
1232         ModestIdentityMgr *id_mgr;
1233         EditWinData *win_data;
1234
1235
1236         win_data = modest_editor_window_get_data(modest_editwin);
1237         modest_ui = win_data->modest_ui;
1238
1239         g_return_if_fail (modest_ui);
1240
1241         actions = MODEST_TNY_TRANSPORT_ACTIONS
1242                 (modest_tny_transport_actions_new ());
1243
1244         priv = MODEST_UI_GET_PRIVATE(modest_ui);
1245 #if 0
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");
1251                 return;
1252         } else /* take the first one! */
1253                 transport_account =
1254                         TNY_TRANSPORT_ACCOUNT_IFACE(transport_accounts->data);
1255 #endif
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");
1259
1260         to      = gtk_entry_get_text (GTK_ENTRY(to_entry));
1261         subject = gtk_entry_get_text (GTK_ENTRY(subject_entry));
1262
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);
1266
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);
1271
1272         g_message("sending \"%s\" %s ==> %s", subject, email_from, to);
1273 /*
1274         modest_tny_transport_actions_send_message (actions,
1275                                                    transport_account,
1276                                                    email_from,
1277                                                    to, "", "", subject,
1278                                                    body);
1279 */
1280         g_free (body);
1281         g_object_unref (G_OBJECT(actions));
1282
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));
1287         } else
1288                 g_warning("editor window has vanished!");
1289 }
1290
1291
1292 static void
1293 on_delete_clicked (GtkWidget *widget, ModestUI *modest_ui)
1294 {
1295         GtkTreeSelection *sel;
1296         GtkWidget *paned;
1297         GtkTreeModel *model;
1298         GtkTreeIter iter;
1299         GtkScrolledWindow *scroll;
1300         GtkTreeModel *mymodel;
1301
1302         ModestTnyHeaderTreeView *header_view;
1303         ModestTnyMsgView *msg_view;
1304         ModestUIPrivate *priv;
1305
1306         g_return_if_fail (modest_ui);
1307
1308         priv = MODEST_UI_GET_PRIVATE(modest_ui);
1309
1310         paned = glade_xml_get_widget (priv->glade_xml,"mail_paned");
1311         g_return_if_fail (paned);
1312
1313         scroll = GTK_SCROLLED_WINDOW(gtk_paned_get_child1 (GTK_PANED(paned)));
1314         g_return_if_fail (scroll);
1315
1316         msg_view = MODEST_TNY_MSG_VIEW(gtk_paned_get_child2 (GTK_PANED(paned)));
1317         g_return_if_fail (msg_view);
1318
1319         header_view = MODEST_TNY_HEADER_TREE_VIEW(gtk_bin_get_child (GTK_BIN(scroll)));
1320         g_return_if_fail (header_view);
1321
1322         sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view));
1323         g_return_if_fail (sel);
1324
1325         /* get all selected mails */
1326         if (G_LIKELY (gtk_tree_selection_get_selected (sel, &model, &iter)))
1327         {
1328                 TnyMsgHeaderIface *header;
1329
1330                 gtk_tree_model_get (model, &iter, TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN,
1331                         &header, -1);
1332
1333                 if (G_LIKELY (header))
1334                 {
1335                         TnyMsgFolderIface *folder;
1336                         // const TnyMsgIface *msg;
1337
1338                         if (GTK_IS_TREE_MODEL_SORT (model))
1339                         {
1340                                 mymodel = gtk_tree_model_sort_get_model
1341                                         (GTK_TREE_MODEL_SORT (model));
1342                         } else
1343                                 mymodel = model;
1344
1345                         folder = (TnyMsgFolderIface*)tny_msg_header_iface_get_folder (header);
1346
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));
1352                 }
1353         }
1354 }
1355
1356 static void
1357 on_sendreceive_button_clicked (GtkWidget *widget, ModestUI *modest_ui)
1358 {
1359         ModestUIPrivate *priv;
1360         ModestTnyStoreActions *store_actions;
1361         TnyAccountStoreIface *account_store;
1362         const GList *store_accounts;
1363         const GList *iter;
1364
1365         g_return_if_fail (modest_ui);
1366
1367         store_actions = MODEST_TNY_STORE_ACTIONS (modest_tny_store_actions_new ());
1368         priv = MODEST_UI_GET_PRIVATE(modest_ui);
1369
1370         account_store = priv->account_store;
1371         store_accounts =
1372                 tny_account_store_iface_get_store_accounts (account_store);
1373
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));
1377
1378         /* TODO, lock, refresh display */
1379
1380         g_object_unref (store_actions);
1381
1382 }