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