550c6c07a0f31b6046835ada1abb5676cea4bc10
[modest] / src / gtk-glade / modest-ui-main-view.c
1 #include <gtk/gtk.h>
2 #include <glade/glade.h>
3 #include <glib/gi18n.h>
4 #include <string.h>
5
6 #ifdef HAVE_CONFIG_H
7 #include <config.h>
8 #endif /*HAVE_CONFIG_H*/
9
10 /* TODO: put in auto* */
11 #include <tny-text-buffer-stream.h>
12 #include <tny-msg-folder.h>
13
14 #include "../modest-ui.h"
15 #include "../modest-window-mgr.h"
16 #include "../modest-account-mgr.h"
17 #include "../modest-account-mgr.h"
18 #include "../modest-identity-mgr.h"
19
20 #include "../modest-tny-account-store.h"
21 #include "../modest-tny-folder-tree-view.h"
22 #include "../modest-tny-header-tree-view.h"
23 #include "../modest-tny-msg-view.h"
24 #include "../modest-tny-transport-actions.h"
25 #include "../modest-tny-store-actions.h"
26
27 #include "../modest-text-utils.h"
28 #include "../modest-tny-msg-actions.h"
29
30 #include "../modest-editor-window.h"
31
32 #include "modest-ui-glade.h"
33 #include "modest-ui-wizard.h"
34 #include "modest-ui-account-setup.h"
35
36 #include "modest-ui-main-view.h"
37 #include "modest-ui-message-editor.h"
38 #include "modest-ui-message-viewer.h"
39
40
41 static GtkWidget* modest_main_window_folder_tree (ModestAccountMgr *modest_acc_mgr,
42                                                   TnyAccountStoreIface *account_store);
43
44 static GtkWidget* modest_main_window_header_tree (TnyMsgFolderIface *folder);
45
46 static void on_folder_clicked (ModestTnyFolderTreeView *folder_tree,
47                                TnyMsgFolderIface *folder,
48                                gpointer data);
49
50 static void on_message_clicked (ModestTnyFolderTreeView *folder_tree,
51                                 TnyMsgIface *message,
52                                 gpointer data);
53
54 static void on_reply_clicked (GtkWidget *widget, gpointer user_data);
55
56 static void on_forward_clicked (GtkWidget *widget, gpointer user_data);
57
58 static void on_delete_clicked (GtkWidget *widget, gpointer user_data);
59
60 static void on_view_attachments_toggled(GtkWidget *widget, gpointer user_data);
61
62 static void on_sendreceive_button_clicked (GtkWidget *widget, gpointer user_data);
63
64 static void on_forward_attached_activated (GtkWidget *widget, gpointer user_data);
65
66 static void register_toolbar_callbacks (ModestUI *modest_ui);
67
68
69 static void
70 modest_ui_main_view_destroy (GtkWidget *win, GdkEvent *event, gpointer data)
71 {
72         ModestUIPrivate *priv;
73
74         g_return_if_fail (data);
75         g_return_if_fail(MODEST_IS_UI(data));
76         priv = MODEST_UI_GET_PRIVATE((ModestUI *)data);
77         g_return_if_fail(priv);
78         if (!modest_window_mgr_unregister (priv->modest_window_mgr, G_OBJECT(win)))
79                 g_warning ("modest window mgr: failed to unregister %p",
80                            G_OBJECT(win));
81         else
82                 gtk_widget_hide(win);
83 }
84
85
86 gboolean
87 modest_ui_show_main_window (ModestUI *modest_ui)
88 {
89         GtkWidget       *win;
90         gint              height, width;
91         ModestUIPrivate *priv;
92         GtkWidget     *folder_view, *header_view;
93         GtkWidget     *message_view;
94         GtkWidget     *account_settings_item;
95         GtkWidget     *forward_attached_menu_item;
96         GtkWidget     *delete_item;
97         GtkWidget     *open_item;
98         GtkWidget     *view_attachments_item;
99         GtkWidget     *new_account_item;
100
101         GtkWidget  *folder_view_holder,
102                 *header_view_holder,
103                 *mail_paned;
104         gboolean show_attachments_inline;
105
106         priv = MODEST_UI_GET_PRIVATE(modest_ui);
107
108         height = modest_conf_get_int (priv->modest_conf,
109                                       MODEST_CONF_MAIN_WINDOW_HEIGHT,NULL);
110         width  = modest_conf_get_int (priv->modest_conf,
111                                       MODEST_CONF_MAIN_WINDOW_WIDTH,NULL);
112
113         win = glade_xml_get_widget (priv->glade_xml, "main");
114         if (!win) {
115                 g_warning ("could not create main window");
116                 return FALSE;
117         }
118
119         folder_view = GTK_WIDGET(modest_main_window_folder_tree(priv->modest_acc_mgr,
120                                                           priv->account_store));
121         priv->folder_view = folder_view;
122         folder_view_holder = glade_xml_get_widget (priv->glade_xml, "folders");
123         if (!folder_view||!folder_view_holder) {
124                 g_warning ("failed to create folder tree");
125                 return FALSE;
126         }
127         gtk_container_add (GTK_CONTAINER(folder_view_holder), folder_view);
128
129         header_view  =  GTK_WIDGET(modest_main_window_header_tree (NULL));
130         priv->header_view = header_view;
131         header_view_holder = glade_xml_get_widget (priv->glade_xml, "mail_list");
132         if (!header_view) {
133                 g_warning ("failed to create header tree");
134                 return FALSE;
135         }
136         gtk_container_add (GTK_CONTAINER(header_view_holder), header_view);
137
138         g_signal_connect (G_OBJECT(folder_view), "folder_selected",
139                           G_CALLBACK(on_folder_clicked), modest_ui);
140
141         show_attachments_inline = modest_conf_get_bool(priv->modest_conf,
142                                              MODEST_CONF_MSG_VIEW_SHOW_ATTACHMENTS_INLINE,
143                                              NULL);
144
145         message_view  = GTK_WIDGET(modest_tny_msg_view_new (NULL, show_attachments_inline));
146         priv->message_view = message_view;
147         if (!message_view) {
148                 g_warning ("failed to create message view");
149                 return FALSE;
150         }
151
152         mail_paned = glade_xml_get_widget (priv->glade_xml, "mail_paned");
153         gtk_paned_add2 (GTK_PANED(mail_paned), message_view);
154
155         g_signal_connect (header_view, "message_selected",
156                           G_CALLBACK(on_message_clicked),
157                           modest_ui);
158
159         g_signal_connect (header_view, "row-activated",
160                           G_CALLBACK(on_message_activated),
161                           modest_ui);
162
163         account_settings_item = glade_xml_get_widget (priv->glade_xml, "AccountSettingsMenuItem");
164         if (!account_settings_item) {
165                 g_warning ("The account settings item isn't available!\n");
166                 return FALSE;
167         }
168
169         g_signal_connect (account_settings_item, "activate",
170                           G_CALLBACK(account_settings), modest_ui);
171
172         new_account_item = glade_xml_get_widget (priv->glade_xml, "NewAccountWizardMenuItem");
173         if (!new_account_item) {
174                 g_warning ("The new account item isn't available!\n");
175                 return FALSE;
176         }
177
178         g_signal_connect (new_account_item, "activate",
179                 G_CALLBACK(new_wizard_account), modest_ui);
180
181         open_item = glade_xml_get_widget (priv->glade_xml, "open1");
182         if (!open_item) {
183                 g_warning ("The open item isn't available!\n");
184                 return FALSE;
185         }
186         g_signal_connect (open_item, "activate", G_CALLBACK(on_open_message_clicked),
187                           modest_ui);
188
189         delete_item = glade_xml_get_widget (priv->glade_xml, "delete1");
190         if (!delete_item) {
191                 g_warning ("The delete item isn't available!\n");
192                 return FALSE;
193         }
194         g_signal_connect (delete_item, "activate", G_CALLBACK(on_delete_clicked),
195                           modest_ui);
196
197         view_attachments_item = glade_xml_get_widget (priv->glade_xml, "menu_view_attachments");
198         if (!view_attachments_item) {
199                 g_warning ("The view_attachments_item isn't available!");
200                 return FALSE;
201         }
202
203         forward_attached_menu_item = glade_xml_get_widget (priv->glade_xml, "forward_attached");
204         if (!forward_attached_menu_item) {
205                 g_warning ("The forward_attached_menu_item isn't available!");
206                 return FALSE;
207         }
208         g_signal_connect (forward_attached_menu_item, "activate", G_CALLBACK(on_forward_attached_activated),
209                           modest_ui);
210
211         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(view_attachments_item),
212                                         modest_conf_get_bool(priv->modest_conf,
213                                         MODEST_CONF_MSG_VIEW_SHOW_ATTACHMENTS_INLINE,
214                                         NULL));
215
216         g_signal_connect (view_attachments_item, "toggled",
217                                 G_CALLBACK(on_view_attachments_toggled), modest_ui);
218
219         register_toolbar_callbacks (modest_ui);
220
221         modest_window_mgr_register (priv->modest_window_mgr,
222                                     G_OBJECT(win), MODEST_MAIN_WINDOW, 0);
223         g_signal_connect (win, "destroy-event", G_CALLBACK(modest_ui_main_view_destroy),
224                           modest_ui);
225         g_signal_connect (win, "delete-event", G_CALLBACK(modest_ui_main_view_destroy),
226                           modest_ui);
227         gtk_widget_set_usize (GTK_WIDGET(win), width, height);
228         gtk_window_set_title (GTK_WINDOW(win), PACKAGE_STRING);
229
230         gtk_widget_show_all (win);
231         return TRUE;
232 }
233
234
235 static void
236 register_toolbar_callbacks (ModestUI *modest_ui)
237 {
238         ModestUIPrivate *priv;
239         GtkWidget *button;
240
241         g_return_if_fail (modest_ui);
242
243         priv = MODEST_UI_GET_PRIVATE (modest_ui);
244
245         button = glade_xml_get_widget (priv->glade_xml, "toolb_new_mail");
246         if (button)
247                 g_signal_connect (button, "clicked",
248                                   G_CALLBACK(on_new_mail_clicked), modest_ui);
249
250         button = glade_xml_get_widget (priv->glade_xml, "toolb_reply");
251         if (button) {
252                 g_signal_connect (button, "clicked",
253                                   G_CALLBACK(on_reply_clicked), modest_ui);
254                 gtk_widget_set_sensitive(button, FALSE);
255         }
256
257         button = glade_xml_get_widget (priv->glade_xml, "toolb_reply_all");
258         if (button) {
259                 //g_signal_connect (button, "clicked",
260                 //                G_CALLBACK(on_reply_all_clicked), modest_ui);
261                 gtk_widget_set_sensitive(button, FALSE);
262         }
263
264         button = glade_xml_get_widget (priv->glade_xml, "toolb_forward");
265         if (button) {
266                 g_signal_connect (button, "clicked",
267                                   G_CALLBACK(on_forward_clicked), modest_ui);
268                 gtk_widget_set_sensitive(button, FALSE);
269         }
270
271         button = glade_xml_get_widget (priv->glade_xml, "toolb_move_to");
272         if (button) {
273                 //g_signal_connect (button, "clicked",
274                 //                G_CALLBACK(on_move_to_clicked), modest_ui);
275                 gtk_widget_set_sensitive(button, FALSE);
276         }
277
278         button = glade_xml_get_widget (priv->glade_xml, "toolb_delete");
279         if (button) {
280                 g_signal_connect (button, "clicked",
281                                   G_CALLBACK(on_delete_clicked), modest_ui);
282                 gtk_widget_set_sensitive(button, FALSE);
283         }
284
285         button = glade_xml_get_widget (priv->glade_xml, "toolb_send_receive");
286         if (button) {
287                 g_signal_connect (button, "clicked",
288                                   G_CALLBACK(on_sendreceive_button_clicked), modest_ui);
289                 gtk_widget_set_sensitive(button, TRUE);
290         }
291 }
292
293
294 static void
295 on_folder_clicked (ModestTnyFolderTreeView *folder_tree,
296                    TnyMsgFolderIface *folder,
297                    gpointer data)
298 {
299         GtkWidget *win;
300         GtkWidget *button;
301         ModestTnyHeaderTreeView *tree_view;
302         ModestTnyMsgView *msg_view;
303         ModestUIPrivate *priv;
304         GtkWidget *scrollview;
305
306         g_return_if_fail (folder);
307         g_return_if_fail (data);
308
309         priv = MODEST_UI_GET_PRIVATE(data);
310         scrollview = glade_xml_get_widget (priv->glade_xml,"mail_list");
311
312         tree_view = MODEST_TNY_HEADER_TREE_VIEW (priv->header_view);
313
314         win = glade_xml_get_widget (priv->glade_xml, "main");
315         gtk_window_set_title (GTK_WINDOW(win),
316                               tny_msg_folder_iface_get_name(folder));
317
318         modest_tny_header_tree_view_set_folder (tree_view, folder);
319         priv->current_folder = folder;
320
321         button = glade_xml_get_widget (priv->glade_xml, "toolb_reply");
322         if (button) {
323                 gtk_widget_set_sensitive(button, FALSE);
324         }
325
326         button = glade_xml_get_widget (priv->glade_xml, "toolb_forward");
327         if (button) {
328                 gtk_widget_set_sensitive(button, FALSE);
329         }
330
331         button = glade_xml_get_widget (priv->glade_xml, "toolb_delete");
332         if (button) {
333                 gtk_widget_set_sensitive(button, FALSE);
334         }
335
336         msg_view = MODEST_TNY_MSG_VIEW (priv->message_view);
337         g_return_if_fail (msg_view);
338
339         modest_tny_msg_view_set_message  (msg_view, NULL);
340 }
341
342
343 static void
344 on_message_clicked (ModestTnyFolderTreeView *folder_tree,
345                                 TnyMsgIface *message,
346                                 gpointer data)
347 {
348         GtkWidget *button;
349         ModestTnyMsgView *msg_view;
350         ModestUIPrivate *priv;
351
352         g_return_if_fail (data);
353
354         priv = MODEST_UI_GET_PRIVATE (data);
355         msg_view = MODEST_TNY_MSG_VIEW (priv->message_view);
356
357         modest_tny_msg_view_set_message (msg_view, message);
358         
359         button = glade_xml_get_widget (priv->glade_xml, "toolb_reply");
360         if (button) {
361                 gtk_widget_set_sensitive(button, TRUE);
362         }
363         button = glade_xml_get_widget (priv->glade_xml, "toolb_forward");
364         if (button) {
365                 gtk_widget_set_sensitive(button, TRUE);
366         }
367         button = glade_xml_get_widget (priv->glade_xml, "toolb_delete");
368         if (button) {
369                 gtk_widget_set_sensitive(button, TRUE);
370         }
371 }
372
373
374 static GtkWidget*
375 modest_main_window_header_tree (TnyMsgFolderIface *folder)
376 {
377         int i;
378         GSList *columns = NULL;
379         GtkWidget *header_tree;
380         ModestTnyHeaderTreeViewColumn cols[] = {
381                 MODEST_TNY_HEADER_TREE_VIEW_COLUMN_MSGTYPE,
382                 MODEST_TNY_HEADER_TREE_VIEW_COLUMN_ATTACH,
383                 MODEST_TNY_HEADER_TREE_VIEW_COLUMN_FROM,
384                 MODEST_TNY_HEADER_TREE_VIEW_COLUMN_SUBJECT,
385                 MODEST_TNY_HEADER_TREE_VIEW_COLUMN_RECEIVED_DATE
386         };
387
388         for (i = 0 ; i != sizeof(cols) / sizeof(ModestTnyHeaderTreeViewColumn); ++i)
389                 columns = g_slist_append (columns, GINT_TO_POINTER(cols[i]));
390
391         header_tree = GTK_WIDGET(modest_tny_header_tree_view_new(folder, columns,
392                                                                  MODEST_TNY_HEADER_TREE_VIEW_STYLE_NORMAL));
393         g_slist_free (columns);
394
395         if (!header_tree) {
396                 g_warning ("could not create header tree");
397                 return NULL;
398         }
399
400         return GTK_WIDGET(header_tree);
401 }
402
403
404 static GtkWidget*
405 modest_main_window_folder_tree (ModestAccountMgr *modest_acc_mgr,
406                                 TnyAccountStoreIface *account_store)
407 {
408         GtkWidget *folder_tree;
409
410         folder_tree = GTK_WIDGET (modest_tny_folder_tree_view_new (account_store));
411         if (!folder_tree) {
412                 g_warning ("could not create folder list");
413                 return NULL;
414         }
415
416         return folder_tree;
417 }
418
419
420 static void
421 on_reply_clicked (GtkWidget *widget, gpointer user_data)
422 {
423         ModestUI *modest_ui = (ModestUI *)user_data;
424
425         quoted_send_msg (modest_ui, QUOTED_SEND_REPLY);
426 }
427
428
429 static void
430 on_forward_clicked (GtkWidget *widget, gpointer user_data)
431 {
432         ModestUI *modest_ui = (ModestUI *)user_data;
433
434         quoted_send_msg (modest_ui, QUOTED_SEND_FORWARD);
435 }
436
437
438 static void
439 on_view_attachments_toggled(GtkWidget *widget, gpointer user_data)
440 {
441         ModestUI *modest_ui = (ModestUI *)user_data;
442         GtkWidget *view_attachments_item;
443         ModestTnyMsgView *msg_view;
444         ModestUIPrivate *priv;
445         gboolean view_attachments_inline;
446
447         priv = MODEST_UI_GET_PRIVATE(modest_ui);
448         view_attachments_item = glade_xml_get_widget (priv->glade_xml, "menu_view_attachments");
449         g_return_if_fail(view_attachments_item);
450
451         msg_view = MODEST_TNY_MSG_VIEW(priv->message_view);
452
453         view_attachments_inline = gtk_check_menu_item_get_active(
454                                         GTK_CHECK_MENU_ITEM(view_attachments_item));
455
456         modest_conf_set_bool(priv->modest_conf,
457                              MODEST_CONF_MSG_VIEW_SHOW_ATTACHMENTS_INLINE,
458                              view_attachments_inline,
459                              NULL);
460
461         modest_tny_msg_view_set_show_attachments_inline_flag(msg_view, view_attachments_inline);
462 }
463
464
465 static void
466 on_delete_clicked (GtkWidget *widget, gpointer user_data)
467 {
468         ModestUI *modest_ui = (ModestUI *)user_data;
469         GtkTreeSelection *sel;
470         GtkTreeModel *model;
471         GtkTreeIter iter;
472         GtkTreeModel *mymodel;
473
474         ModestTnyHeaderTreeView *header_view;
475         ModestTnyMsgView *msg_view;
476         ModestUIPrivate *priv;
477
478         g_return_if_fail (modest_ui);
479
480         priv = MODEST_UI_GET_PRIVATE(modest_ui);
481
482         msg_view = MODEST_TNY_MSG_VIEW(priv->message_view);
483         g_return_if_fail (msg_view);
484
485         header_view = MODEST_TNY_HEADER_TREE_VIEW(priv->header_view);
486         g_return_if_fail (header_view);
487
488         sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view));
489         g_return_if_fail (sel);
490
491         /* get all selected mails */
492         if (G_LIKELY (gtk_tree_selection_get_selected (sel, &model, &iter))) {
493                 TnyMsgHeaderIface *header;
494
495                 gtk_tree_model_get (model, &iter, TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN,
496                         &header, -1);
497
498                 if (G_LIKELY (header)) {
499                         TnyMsgFolderIface *folder;
500                         // const TnyMsgIface *msg;
501
502                         if (GTK_IS_TREE_MODEL_SORT (model)) {
503                                 mymodel = gtk_tree_model_sort_get_model
504                                         (GTK_TREE_MODEL_SORT (model));
505                         } else
506                                 mymodel = model;
507
508                         folder = (TnyMsgFolderIface*)tny_msg_header_iface_get_folder (header);
509
510                         /* this will make the message as deleted */
511                         /*      tny_msg_folder_iface_expunge (folder); will finally delete messages */
512                         if (TNY_IS_MSG_FOLDER (folder))
513                                 tny_msg_folder_iface_remove_message (folder, header);
514                         gtk_widget_queue_draw (GTK_WIDGET (header_view));
515                 }
516         }
517 }
518
519
520 static void
521 on_sendreceive_button_clicked (GtkWidget *widget, gpointer user_data)
522 {
523         ModestUI *modest_ui = (ModestUI *)user_data;
524         ModestUIPrivate *priv;
525         TnyAccountStoreIface *account_store;
526         const GList *store_accounts;
527         const GList *iter;
528
529         g_return_if_fail (modest_ui);
530         priv = MODEST_UI_GET_PRIVATE(modest_ui);
531
532         account_store = priv->account_store;
533         store_accounts =
534                 tny_account_store_iface_get_store_accounts (account_store);
535                 
536         for (iter = store_accounts; iter; iter = iter->next) {
537                 modest_tny_store_actions_update_folders (TNY_STORE_ACCOUNT_IFACE (iter->data));
538
539         }
540         
541         if (priv->header_view && priv->current_folder) {
542                         
543                 modest_tny_header_tree_view_set_folder (priv->header_view, priv->current_folder);
544                 gtk_widget_queue_draw (priv->header_view);
545         }
546 }
547 static void
548 on_forward_attached_activated (GtkWidget *widget, gpointer user_data)
549 {
550         ModestUI *modest_ui = (ModestUI *)user_data;
551
552         quoted_send_msg (modest_ui, QUOTED_SEND_FORWARD_ATTACHED);
553 }