aaea6c0346dd86b5e8c60ba56f52c3804739f917
[modest] / src / hildon / modest-ui-main-view.c
1 /* Copyright (c) 2006, Nokia Corporation
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  * * Redistributions of source code must retain the above copyright
9  *   notice, this list of conditions and the following disclaimer.
10  * * Redistributions in binary form must reproduce the above copyright
11  *   notice, this list of conditions and the following disclaimer in the
12  *   documentation and/or other materials provided with the distribution.
13  * * Neither the name of the Nokia Corporation nor the names of its
14  *   contributors may be used to endorse or promote products derived from
15  *   this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
18  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30
31 #include <gtk/gtk.h>
32 #include <glade/glade.h>
33 #include <glib/gi18n.h>
34 #include <string.h>
35
36 #ifdef HAVE_CONFIG_H
37 #include <config.h>
38 #endif /*HAVE_CONFIG_H*/
39
40 #include <hildon-widgets/hildon-window.h>
41 #include <hildon-widgets/hildon-program.h>
42
43 /* TODO: put in auto* */
44 #include <tny-text-buffer-stream.h>
45 #include <tny-msg-folder.h>
46
47 #include "../modest-ui.h"
48 #include "../modest-window-mgr.h"
49 #include "../modest-account-mgr.h"
50 #include "../modest-account-mgr.h"
51 #include "../modest-identity-mgr.h"
52
53 #include "../modest-tny-account-store.h"
54 #include "../modest-tny-folder-tree-view.h"
55 #include "../modest-tny-header-tree-view.h"
56 #include "../modest-tny-msg-view.h"
57 #include "../modest-tny-transport-actions.h"
58 #include "../modest-tny-store-actions.h"
59
60 #include "../modest-text-utils.h"
61 #include "../modest-tny-msg-actions.h"
62
63 #include "../modest-editor-window.h"
64
65 #include "modest-ui-glade.h"
66 #include "modest-ui-wizard.h"
67 #include "modest-ui-account-setup.h"
68
69 #include "modest-ui-main-view.h"
70 #include "modest-ui-message-editor.h"
71 #include "modest-ui-message-viewer.h"
72
73
74 static GtkWidget* modest_main_window_folder_tree (ModestAccountMgr *modest_acc_mgr,
75                                                   TnyAccountStoreIface *account_store);
76
77 static GtkWidget* modest_main_window_header_tree (TnyMsgFolderIface *folder);
78
79 static void on_folder_clicked (ModestTnyFolderTreeView *folder_tree,
80                                TnyMsgFolderIface *folder,
81                                gpointer data);
82
83 static void on_message_clicked (ModestTnyFolderTreeView *folder_tree,
84                                 TnyMsgIface *message,
85                                 gpointer data);
86
87 static void on_reply_clicked (GtkWidget *widget, gpointer user_data);
88
89 static void on_forward_clicked (GtkWidget *widget, gpointer user_data);
90
91 static void on_delete_clicked (GtkWidget *widget, gpointer user_data);
92
93 static void on_view_attachments_toggled(GtkWidget *widget, gpointer user_data);
94
95 static void on_sendreceive_button_clicked (GtkWidget *widget, gpointer user_data);
96
97 static void on_forward_attached_activated (GtkWidget *widget, gpointer user_data);
98
99 static void on_headers_status_update (GtkWidget *header_view, const gchar *msg, gint status,
100                           gpointer user_data);
101 static void on_status_cleanup (gpointer user_data);
102
103 static void register_toolbar_callbacks (ModestUI *modest_ui);
104
105
106 static void
107 modest_ui_main_view_destroy (GtkWidget *win, GdkEvent *event, gpointer data)
108 {
109         ModestUIPrivate *priv;
110
111         g_return_if_fail (data);
112         g_return_if_fail(MODEST_IS_UI(data));
113         priv = MODEST_UI_GET_PRIVATE((ModestUI *)data);
114         g_return_if_fail(priv);
115         if (!modest_window_mgr_unregister (priv->modest_window_mgr, G_OBJECT(win)))
116                 g_warning ("modest window mgr: failed to unregister %p",
117                            G_OBJECT(win));
118         else
119                 gtk_widget_hide(win);
120 }
121
122
123 gboolean
124 modest_ui_show_main_window (ModestUI *modest_ui)
125 {
126         GtkWidget       *win;
127         gint            height, width;
128         ModestUIPrivate *priv;
129         GtkWidget       *folder_view, *header_view;
130         GtkWidget       *message_view;
131         GtkWidget       *account_settings_item;
132         GtkWidget       *forward_attached_menu_item;
133         GtkWidget       *delete_item;
134         GtkWidget       *open_item;
135         GtkWidget       *view_attachments_item;
136         GtkWidget       *new_account_item;
137         GtkWidget       *main_menu, *menu_item, *main_toolbar;
138         
139         GtkWidget  *folder_view_holder,
140                 *header_view_holder,
141                 *mail_paned;
142         gboolean show_attachments_inline;
143         HildonProgram *program;
144
145         priv = MODEST_UI_GET_PRIVATE(modest_ui);
146         
147         height = modest_conf_get_int (priv->modest_conf,
148                                       MODEST_CONF_MAIN_WINDOW_HEIGHT,NULL);
149         width  = modest_conf_get_int (priv->modest_conf,
150                                       MODEST_CONF_MAIN_WINDOW_WIDTH,NULL);
151
152         program = HILDON_PROGRAM (hildon_program_get_instance ());
153         priv->program = program;
154         g_set_application_name (_("Modest"));
155         
156         win = glade_xml_get_widget (priv->glade_xml, "appview1");
157         if (!win) {
158                 g_warning ("could not create main window");
159                 return FALSE;
160         }
161
162         folder_view = GTK_WIDGET(modest_main_window_folder_tree(priv->modest_acc_mgr,
163                                                           priv->account_store));
164         priv->folder_view = folder_view;
165         folder_view_holder = glade_xml_get_widget (priv->glade_xml, "folders");
166         if (!folder_view||!folder_view_holder) {
167                 g_warning ("failed to create folder tree");
168                 return FALSE;
169         }
170         gtk_container_add (GTK_CONTAINER(folder_view_holder), folder_view);
171
172         header_view  =  GTK_WIDGET(modest_main_window_header_tree (NULL));
173         priv->header_view = header_view;
174         header_view_holder = glade_xml_get_widget (priv->glade_xml, "mail_list");
175         if (!header_view) {
176                 g_warning ("failed to create header tree");
177                 return FALSE;
178         }
179         gtk_container_add (GTK_CONTAINER(header_view_holder), header_view);
180
181         g_signal_connect (G_OBJECT(folder_view), "folder_selected",
182                           G_CALLBACK(on_folder_clicked), modest_ui);
183
184         show_attachments_inline = modest_conf_get_bool(priv->modest_conf,
185                                              MODEST_CONF_MSG_VIEW_SHOW_ATTACHMENTS_INLINE,
186                                              NULL);
187
188         message_view  = GTK_WIDGET(modest_tny_msg_view_new (NULL, show_attachments_inline));
189         priv->message_view = message_view;
190         if (!message_view) {
191                 g_warning ("failed to create message view");
192                 return FALSE;
193         }
194         g_signal_connect(G_OBJECT(message_view), "on_mailto_clicked",
195                      G_CALLBACK(ui_on_mailto_clicked), modest_ui);
196         
197         mail_paned = glade_xml_get_widget (priv->glade_xml, "mail_paned");
198         gtk_paned_add2 (GTK_PANED(mail_paned), message_view);
199
200         g_signal_connect (header_view, "message_selected",
201                           G_CALLBACK(on_message_clicked),
202                           modest_ui);
203
204         g_signal_connect (header_view, "status_update",
205                           G_CALLBACK(on_headers_status_update), modest_ui);
206
207         g_signal_connect (header_view, "row-activated",
208                           G_CALLBACK(on_message_activated),
209                           modest_ui);
210
211         account_settings_item = glade_xml_get_widget (priv->glade_xml, "AccountSettingsMenuItem");
212         if (!account_settings_item) {
213                 g_warning ("The account settings item isn't available!\n");
214                 return FALSE;
215         }
216
217         g_signal_connect (account_settings_item, "activate",
218                           G_CALLBACK(account_settings), modest_ui);
219
220         new_account_item = glade_xml_get_widget (priv->glade_xml, "NewAccountWizardMenuItem");
221         if (!new_account_item) {
222                 g_warning ("The new account item isn't available!\n");
223                 return FALSE;
224         }
225
226         g_signal_connect (new_account_item, "activate",
227                 G_CALLBACK(new_wizard_account), modest_ui);
228
229         open_item = glade_xml_get_widget (priv->glade_xml, "open1");
230         if (!open_item) {
231                 g_warning ("The open item isn't available!\n");
232                 return FALSE;
233         }
234         g_signal_connect (open_item, "activate", G_CALLBACK(on_open_message_clicked),
235                           modest_ui);
236
237         delete_item = glade_xml_get_widget (priv->glade_xml, "delete1");
238         if (!delete_item) {
239                 g_warning ("The delete item isn't available!\n");
240                 return FALSE;
241         }
242         g_signal_connect (delete_item, "activate", G_CALLBACK(on_delete_clicked),
243                           modest_ui);
244
245         view_attachments_item = glade_xml_get_widget (priv->glade_xml, "menu_view_attachments");
246         if (!view_attachments_item) {
247                 g_warning ("The view_attachments_item isn't available!");
248                 return FALSE;
249         }
250
251         forward_attached_menu_item = glade_xml_get_widget (priv->glade_xml, "forward_attached");
252         if (!forward_attached_menu_item) {
253                 g_warning ("The forward_attached_menu_item isn't available!");
254                 return FALSE;
255         }
256         g_signal_connect (forward_attached_menu_item, "activate", G_CALLBACK(on_forward_attached_activated),
257                           modest_ui);
258
259         gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(view_attachments_item),
260                                         modest_conf_get_bool(priv->modest_conf,
261                                         MODEST_CONF_MSG_VIEW_SHOW_ATTACHMENTS_INLINE,
262                                         NULL));
263
264         g_signal_connect (view_attachments_item, "toggled",
265                                 G_CALLBACK(on_view_attachments_toggled), modest_ui);
266
267         register_toolbar_callbacks (modest_ui);
268
269         modest_window_mgr_register (priv->modest_window_mgr,
270                                     G_OBJECT(win), MODEST_MAIN_WINDOW, 0);
271         g_signal_connect (win, "destroy-event", G_CALLBACK(modest_ui_main_view_destroy),
272                           modest_ui);
273         g_signal_connect (win, "delete-event", G_CALLBACK(modest_ui_main_view_destroy),
274                           modest_ui);
275         
276         gtk_window_set_title (GTK_WINDOW(win), _("Main"));
277
278         main_menu = gtk_menu_new ();
279         menu_item = glade_xml_get_widget (priv->glade_xml, "MessageMenuItem");
280         gtk_widget_reparent(menu_item, main_menu);
281         menu_item = glade_xml_get_widget (priv->glade_xml, "EditMenuItem");
282         gtk_widget_reparent(menu_item, main_menu);
283         menu_item = glade_xml_get_widget (priv->glade_xml, "FoldersMenuItem");
284         gtk_widget_reparent(menu_item, main_menu);
285         menu_item = glade_xml_get_widget (priv->glade_xml, "ViewMenuItem");
286         gtk_widget_reparent(menu_item, main_menu);
287         menu_item = glade_xml_get_widget (priv->glade_xml, "EMailMenuItem");
288         gtk_widget_reparent(menu_item, main_menu);
289         menu_item = glade_xml_get_widget (priv->glade_xml, "ToolsMenuItem");
290         gtk_widget_reparent(menu_item, main_menu);
291         menu_item = glade_xml_get_widget (priv->glade_xml, "CloseMenuItem");
292         gtk_widget_reparent(menu_item, main_menu);
293
294         hildon_window_set_menu (win, main_menu);
295
296         main_toolbar = glade_xml_get_widget (priv->glade_xml, "toolbar1");
297         g_object_ref (main_toolbar);
298         gtk_container_remove (glade_xml_get_widget (priv->glade_xml, 
299                               "main_top_container"), main_toolbar);
300         hildon_window_add_toolbar (HILDON_WINDOW(win), GTK_TOOLBAR(main_toolbar));
301
302         gtk_widget_show_all (win);
303         
304         menu_item = glade_xml_get_widget (priv->glade_xml, "menubar1");
305         gtk_widget_hide(menu_item);
306         
307         hildon_program_add_window (program, win);
308
309         return TRUE;
310 }
311
312
313 static void
314 register_toolbar_callbacks (ModestUI *modest_ui)
315 {
316         ModestUIPrivate *priv;
317         GtkWidget *button;
318
319         g_return_if_fail (modest_ui);
320
321         priv = MODEST_UI_GET_PRIVATE (modest_ui);
322
323         button = glade_xml_get_widget (priv->glade_xml, "toolb_new_mail");
324         if (button)
325                 g_signal_connect (button, "clicked",
326                                   G_CALLBACK(on_new_mail_clicked), modest_ui);
327
328         button = glade_xml_get_widget (priv->glade_xml, "toolb_reply");
329         if (button) {
330                 g_signal_connect (button, "clicked",
331                                   G_CALLBACK(on_reply_clicked), modest_ui);
332                 gtk_widget_set_sensitive(button, FALSE);
333         }
334
335         button = glade_xml_get_widget (priv->glade_xml, "toolb_reply_all");
336         if (button) {
337                 //g_signal_connect (button, "clicked",
338                 //                G_CALLBACK(on_reply_all_clicked), modest_ui);
339                 gtk_widget_set_sensitive(button, FALSE);
340         }
341
342         button = glade_xml_get_widget (priv->glade_xml, "toolb_forward");
343         if (button) {
344                 g_signal_connect (button, "clicked",
345                                   G_CALLBACK(on_forward_clicked), modest_ui);
346                 gtk_widget_set_sensitive(button, FALSE);
347         }
348
349         button = glade_xml_get_widget (priv->glade_xml, "toolb_move_to");
350         if (button) {
351                 //g_signal_connect (button, "clicked",
352                 //                G_CALLBACK(on_move_to_clicked), modest_ui);
353                 gtk_widget_set_sensitive(button, FALSE);
354         }
355
356         button = glade_xml_get_widget (priv->glade_xml, "toolb_delete");
357         if (button) {
358                 g_signal_connect (button, "clicked",
359                                   G_CALLBACK(on_delete_clicked), modest_ui);
360                 gtk_widget_set_sensitive(button, FALSE);
361         }
362
363         button = glade_xml_get_widget (priv->glade_xml, "toolb_send_receive");
364         if (button) {
365                 g_signal_connect (button, "clicked",
366                                   G_CALLBACK(on_sendreceive_button_clicked), modest_ui);
367                 gtk_widget_set_sensitive(button, TRUE);
368         }
369 }
370
371
372 static void
373 on_folder_clicked (ModestTnyFolderTreeView *folder_tree,
374                    TnyMsgFolderIface *folder,
375                    gpointer data)
376 {
377         GtkWidget *win;
378         GtkWidget *button;
379         ModestTnyHeaderTreeView *tree_view;
380         ModestTnyMsgView *msg_view;
381         ModestUIPrivate *priv;
382         GtkWidget *scrollview;
383
384         g_return_if_fail (folder);
385         g_return_if_fail (data);
386
387         priv = MODEST_UI_GET_PRIVATE(data);
388         scrollview = glade_xml_get_widget (priv->glade_xml,"mail_list");
389
390         tree_view = MODEST_TNY_HEADER_TREE_VIEW (priv->header_view);
391
392         win = glade_xml_get_widget (priv->glade_xml, "main");
393         gtk_window_set_title (GTK_WINDOW(win),
394                               tny_msg_folder_iface_get_name(folder));
395
396         modest_tny_header_tree_view_set_folder (tree_view, folder);
397         priv->current_folder = folder;
398
399         button = glade_xml_get_widget (priv->glade_xml, "toolb_reply");
400         if (button) {
401                 gtk_widget_set_sensitive(button, FALSE);
402         }
403
404         button = glade_xml_get_widget (priv->glade_xml, "toolb_forward");
405         if (button) {
406                 gtk_widget_set_sensitive(button, FALSE);
407         }
408
409         button = glade_xml_get_widget (priv->glade_xml, "toolb_delete");
410         if (button) {
411                 gtk_widget_set_sensitive(button, FALSE);
412         }
413
414         msg_view = MODEST_TNY_MSG_VIEW (priv->message_view);
415         g_return_if_fail (msg_view);
416
417         modest_tny_msg_view_set_message  (msg_view, NULL);
418 }
419
420
421 static void
422 on_message_clicked (ModestTnyFolderTreeView *folder_tree,
423                                 TnyMsgIface *message,
424                                 gpointer data)
425 {
426         GtkWidget *button;
427         ModestTnyMsgView *msg_view;
428         ModestUIPrivate *priv;
429
430         g_return_if_fail (data);
431
432         priv = MODEST_UI_GET_PRIVATE (data);
433         msg_view = MODEST_TNY_MSG_VIEW (priv->message_view);
434
435         modest_tny_msg_view_set_message (msg_view, message);
436         
437         button = glade_xml_get_widget (priv->glade_xml, "toolb_reply");
438         if (button) {
439                 gtk_widget_set_sensitive(button, TRUE);
440         }
441         button = glade_xml_get_widget (priv->glade_xml, "toolb_forward");
442         if (button) {
443                 gtk_widget_set_sensitive(button, TRUE);
444         }
445         button = glade_xml_get_widget (priv->glade_xml, "toolb_delete");
446         if (button) {
447                 gtk_widget_set_sensitive(button, TRUE);
448         }
449 }
450
451
452 static GtkWidget*
453 modest_main_window_header_tree (TnyMsgFolderIface *folder)
454 {
455         int i;
456         GSList *columns = NULL;
457         GtkWidget *header_tree;
458         ModestTnyHeaderTreeViewColumn cols[] = {
459                 MODEST_TNY_HEADER_TREE_VIEW_COLUMN_MSGTYPE,
460                 MODEST_TNY_HEADER_TREE_VIEW_COLUMN_ATTACH,
461                 MODEST_TNY_HEADER_TREE_VIEW_COLUMN_FROM,
462                 MODEST_TNY_HEADER_TREE_VIEW_COLUMN_SUBJECT,
463                 MODEST_TNY_HEADER_TREE_VIEW_COLUMN_RECEIVED_DATE
464         };
465
466         for (i = 0 ; i != sizeof(cols) / sizeof(ModestTnyHeaderTreeViewColumn); ++i)
467                 columns = g_slist_append (columns, GINT_TO_POINTER(cols[i]));
468
469         header_tree = GTK_WIDGET(modest_tny_header_tree_view_new(folder, columns,
470                                                                  MODEST_TNY_HEADER_TREE_VIEW_STYLE_NORMAL));
471         g_slist_free (columns);
472
473         if (!header_tree) {
474                 g_warning ("could not create header tree");
475                 return NULL;
476         }
477
478         return GTK_WIDGET(header_tree);
479 }
480
481
482 static GtkWidget*
483 modest_main_window_folder_tree (ModestAccountMgr *modest_acc_mgr,
484                                 TnyAccountStoreIface *account_store)
485 {
486         GtkWidget *folder_tree;
487
488         folder_tree = GTK_WIDGET (modest_tny_folder_tree_view_new (account_store));
489         if (!folder_tree) {
490                 g_warning ("could not create folder list");
491                 return NULL;
492         }
493
494         return folder_tree;
495 }
496
497
498 static void
499 on_reply_clicked (GtkWidget *widget, gpointer user_data)
500 {
501         ModestUI *modest_ui = (ModestUI *)user_data;
502
503         quoted_send_msg (modest_ui, QUOTED_SEND_REPLY);
504 }
505
506
507 static void
508 on_forward_clicked (GtkWidget *widget, gpointer user_data)
509 {
510         ModestUI *modest_ui = (ModestUI *)user_data;
511
512         quoted_send_msg (modest_ui, QUOTED_SEND_FORWARD);
513 }
514
515
516 static void
517 on_view_attachments_toggled(GtkWidget *widget, gpointer user_data)
518 {
519         ModestUI *modest_ui = (ModestUI *)user_data;
520         GtkWidget *view_attachments_item;
521         ModestTnyMsgView *msg_view;
522         ModestUIPrivate *priv;
523         gboolean view_attachments_inline;
524
525         priv = MODEST_UI_GET_PRIVATE(modest_ui);
526         view_attachments_item = glade_xml_get_widget (priv->glade_xml, "menu_view_attachments");
527         g_return_if_fail(view_attachments_item);
528
529         msg_view = MODEST_TNY_MSG_VIEW(priv->message_view);
530
531         view_attachments_inline = gtk_check_menu_item_get_active(
532                                         GTK_CHECK_MENU_ITEM(view_attachments_item));
533
534         modest_conf_set_bool(priv->modest_conf,
535                              MODEST_CONF_MSG_VIEW_SHOW_ATTACHMENTS_INLINE,
536                              view_attachments_inline,
537                              NULL);
538
539         modest_tny_msg_view_set_show_attachments_inline_flag(msg_view, view_attachments_inline);
540 }
541
542
543 static void
544 on_delete_clicked (GtkWidget *widget, gpointer user_data)
545 {
546         ModestUI *modest_ui = (ModestUI *)user_data;
547         GtkTreeSelection *sel;
548         GtkTreeModel *model;
549         GtkTreeIter iter;
550         GtkTreeModel *mymodel;
551
552         ModestTnyHeaderTreeView *header_view;
553         ModestTnyMsgView *msg_view;
554         ModestUIPrivate *priv;
555
556         g_return_if_fail (modest_ui);
557
558         priv = MODEST_UI_GET_PRIVATE(modest_ui);
559
560         msg_view = MODEST_TNY_MSG_VIEW(priv->message_view);
561         g_return_if_fail (msg_view);
562
563         header_view = MODEST_TNY_HEADER_TREE_VIEW(priv->header_view);
564         g_return_if_fail (header_view);
565
566         sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view));
567         g_return_if_fail (sel);
568
569         /* get all selected mails */
570         if (G_LIKELY (gtk_tree_selection_get_selected (sel, &model, &iter))) {
571                 TnyMsgHeaderIface *header;
572
573                 gtk_tree_model_get (model, &iter, TNY_MSG_HEADER_LIST_MODEL_INSTANCE_COLUMN,
574                         &header, -1);
575
576                 if (G_LIKELY (header)) {
577                         TnyMsgFolderIface *folder;
578                         // const TnyMsgIface *msg;
579
580                         if (GTK_IS_TREE_MODEL_SORT (model)) {
581                                 mymodel = gtk_tree_model_sort_get_model
582                                         (GTK_TREE_MODEL_SORT (model));
583                         } else
584                                 mymodel = model;
585
586                         folder = (TnyMsgFolderIface*)tny_msg_header_iface_get_folder (header);
587
588                         /* this will make the message as deleted */
589                         /*      tny_msg_folder_iface_expunge (folder); will finally delete messages */
590                         if (TNY_IS_MSG_FOLDER (folder))
591                                 tny_msg_folder_iface_remove_message (folder, header);
592                         gtk_widget_queue_draw (GTK_WIDGET (header_view));
593                 }
594         }
595 }
596
597
598 static void
599 on_sendreceive_button_clicked (GtkWidget *widget, gpointer user_data)
600 {
601         ModestUI *modest_ui = (ModestUI *)user_data;
602         ModestUIPrivate *priv;
603         TnyAccountStoreIface *account_store;
604         const GList *store_accounts;
605         const GList *iter;
606
607         g_return_if_fail (modest_ui);
608         priv = MODEST_UI_GET_PRIVATE(modest_ui);
609
610         account_store = priv->account_store;
611         store_accounts =
612                 tny_account_store_iface_get_store_accounts (account_store);
613                 
614         for (iter = store_accounts; iter; iter = iter->next) {
615                 modest_tny_store_actions_update_folders (TNY_STORE_ACCOUNT_IFACE (iter->data));
616
617         }
618         
619         if (priv->header_view && priv->current_folder) {
620                         
621                 modest_tny_header_tree_view_set_folder (MODEST_TNY_HEADER_TREE_VIEW(priv->header_view),
622                                                         priv->current_folder);
623                 gtk_widget_queue_draw (priv->header_view);
624         }
625 }
626 static void
627 on_forward_attached_activated (GtkWidget *widget, gpointer user_data)
628 {
629         ModestUI *modest_ui = (ModestUI *)user_data;
630
631         quoted_send_msg (modest_ui, QUOTED_SEND_FORWARD_ATTACHED);
632 }
633
634 static void
635 on_headers_status_update (GtkWidget *header_view, const gchar *msg, gint status_id,
636                           gpointer user_data)
637 {
638         ModestUIPrivate *priv;
639         ModestUI *modest_ui;
640
641         GtkStatusbar *status_bar;
642         GtkProgressBar *progress_bar;
643         GtkWidget    *status_box;
644         
645         modest_ui = MODEST_UI (user_data);
646         priv      = MODEST_UI_GET_PRIVATE(modest_ui);
647
648         progress_bar = GTK_PROGRESS_BAR(glade_xml_get_widget
649                                         (priv->glade_xml, "progressbar"));
650         status_bar   = GTK_STATUSBAR  (glade_xml_get_widget
651                                        (priv->glade_xml, "statusbar"));
652
653         
654         status_box   = glade_xml_get_widget (priv->glade_xml, "statusbox");
655         
656         
657         if (!status_bar || !progress_bar) {
658                 g_warning ("failed to find status / progress bar");
659                 return;
660         }
661
662         if (msg && status_id) {
663                 gtk_widget_show (status_box);
664                 gtk_progress_bar_pulse (progress_bar);
665                 gtk_statusbar_push (status_bar, status_id, msg);
666         } else {
667                 gtk_widget_hide   (status_box);
668                 gtk_statusbar_pop (status_bar, status_id);
669         }
670 }