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