1 /* Copyright (c) 2006, Nokia Corporation
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
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.
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.
32 #endif /*HAVE_CONFIG_H*/
34 #include <glib/gi18n.h>
36 #include <modest-runtime.h>
37 #include <modest-tny-msg.h>
38 #include <modest-tny-account.h>
39 #include <modest-address-book.h>
41 #include "modest-ui-actions.h"
43 #include "modest-tny-platform-factory.h"
44 #include "modest-platform.h"
46 #include <widgets/modest-main-window.h>
47 #include <widgets/modest-msg-view-window.h>
48 #include <widgets/modest-account-view-window.h>
49 #include <widgets/modest-msg-view-details-dialog.h>
51 #include "modest-account-mgr-helpers.h"
52 #include "modest-mail-operation.h"
54 #ifdef MODEST_HAVE_EASYSETUP
55 #include "easysetup/modest-easysetup-wizard.h"
56 #endif /*MODEST_HAVE_EASYSETUP*/
58 #include <modest-widget-memory.h>
59 #include <tny-error.h>
60 #include <tny-simple-list.h>
61 #include <tny-msg-view.h>
62 #include <tny-device.h>
65 typedef struct _GetMsgAsyncHelper {
72 typedef enum _ReplyForwardAction {
78 typedef struct _ReplyForwardHelper {
79 guint reply_forward_type;
80 ReplyForwardAction action;
85 static void reply_forward_func (gpointer data, gpointer user_data);
86 static void read_msg_func (gpointer data, gpointer user_data);
87 static void get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err,
89 static void reply_forward (ReplyForwardAction action, ModestWindow *win);
90 static void modest_ui_actions_message_details_cb (gpointer msg_data,
91 gpointer helper_data);
92 static gchar* ask_for_folder_name (GtkWindow *parent_window, const gchar *title);
96 modest_ui_actions_on_about (GtkAction *action, ModestWindow *win)
99 const gchar *authors[] = {
100 "Dirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>",
103 about = gtk_about_dialog_new ();
104 gtk_about_dialog_set_name (GTK_ABOUT_DIALOG(about), PACKAGE_NAME);
105 gtk_about_dialog_set_version (GTK_ABOUT_DIALOG(about),PACKAGE_VERSION);
106 gtk_about_dialog_set_copyright (GTK_ABOUT_DIALOG(about),
107 _("Copyright (c) 2006, Nokia Corporation\n"
108 "All rights reserved."));
109 gtk_about_dialog_set_comments (GTK_ABOUT_DIALOG(about),
110 _("a modest e-mail client\n\n"
111 "design and implementation: Dirk-Jan C. Binnema\n"
112 "contributions from the fine people at KernelConcepts and Igalia\n"
113 "uses the tinymail email framework written by Philip van Hoof"));
114 gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG(about), authors);
115 gtk_about_dialog_set_website (GTK_ABOUT_DIALOG(about), "http://modest.garage.maemo.org");
117 gtk_dialog_run (GTK_DIALOG (about));
118 gtk_widget_destroy(about);
123 get_selected_headers (ModestWindow *win)
125 if (MODEST_IS_MAIN_WINDOW(win)) {
126 GtkWidget *header_view;
128 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
129 MODEST_WIDGET_TYPE_HEADER_VIEW);
130 return modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
132 } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
133 /* for MsgViewWindows, we simply return a list with one element */
136 TnyList *list = NULL;
138 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW(win));
140 header = tny_msg_get_header (msg);
141 list = tny_simple_list_new ();
142 tny_list_prepend (list, G_OBJECT(header));
143 g_object_unref (G_OBJECT(header));
152 modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win)
154 TnyList *header_list;
157 g_return_if_fail (MODEST_IS_WINDOW(win));
159 header_list = get_selected_headers (win);
162 iter = tny_list_create_iterator (header_list);
165 ModestMailOperation *mail_op;
167 header = TNY_HEADER (tny_iterator_get_current (iter));
168 /* TODO: thick grain mail operation involving
169 a list of objects. Composite pattern ??? */
170 /* TODO: add confirmation dialog */
171 mail_op = modest_mail_operation_new ();
172 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
175 /* Always delete. TODO: Move to trash still not supported */
176 modest_mail_operation_remove_msg (mail_op, header, FALSE);
179 g_object_unref (G_OBJECT (mail_op));
180 g_object_unref (G_OBJECT (header));
182 tny_iterator_next (iter);
184 } while (!tny_iterator_is_done (iter));
187 g_object_unref (G_OBJECT (iter));
190 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
191 gtk_widget_destroy (GTK_WIDGET(win));
197 modest_ui_actions_on_quit (GtkAction *action, ModestWindow *win)
203 modest_ui_actions_on_close_window (GtkAction *action, ModestWindow *win)
205 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
206 gtk_widget_destroy (GTK_WIDGET (win));
207 } else if (MODEST_IS_WINDOW (win)) {
208 gtk_widget_destroy (GTK_WIDGET (win));
210 g_return_if_reached ();
215 modest_ui_actions_on_add_to_contacts (GtkAction *action, ModestWindow *win)
217 GtkClipboard *clipboard = NULL;
218 gchar *selection = NULL;
220 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
221 selection = gtk_clipboard_wait_for_text (clipboard);
223 modest_address_book_add_address (selection);
228 modest_ui_actions_on_accounts (GtkAction *action, ModestWindow *win)
231 /* This is currently only implemented for Maemo,
232 * because it requires a providers preset file which is not publically available.
234 #ifdef MODEST_PLATFORM_MAEMO /* Defined in config.h */
235 GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr());
236 gboolean accounts_exist = account_names != NULL;
237 g_slist_free (account_names);
239 /* To test, while modest_account_mgr_account_names() is broken: accounts_exist = TRUE; */
240 if (!accounts_exist) {
241 /* If there are no accounts yet, just show the easy-setup wizard, as per the UI spec: */
242 ModestEasysetupWizardDialog *wizard = modest_easysetup_wizard_dialog_new ();
243 gtk_window_set_transient_for (GTK_WINDOW (wizard), GTK_WINDOW (win));
244 gtk_dialog_run (GTK_DIALOG (wizard));
245 gtk_widget_destroy (GTK_WIDGET (wizard));
247 /* Show the list of accounts: */
248 GtkDialog *account_win = GTK_DIALOG(modest_account_view_window_new ());
249 gtk_window_set_transient_for (GTK_WINDOW (account_win), GTK_WINDOW(win));
250 gtk_dialog_run (account_win);
251 gtk_widget_destroy (GTK_WIDGET(account_win));
254 GtkWidget *dialog, *label;
256 /* Create the widgets */
258 dialog = gtk_dialog_new_with_buttons ("Message",
260 GTK_DIALOG_DESTROY_WITH_PARENT,
264 label = gtk_label_new ("Hello World!");
266 /* Ensure that the dialog box is destroyed when the user responds. */
268 g_signal_connect_swapped (dialog, "response",
269 G_CALLBACK (gtk_widget_destroy),
272 /* Add the label, and show everything we've added to the dialog. */
274 gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox),
276 gtk_widget_show_all (dialog);
277 #endif /* MODEST_PLATFORM_MAEMO */
281 modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win)
283 ModestWindow *msg_win;
285 TnyFolder *folder = NULL;
286 gchar *account_name = NULL;
287 gchar *from_str = NULL;
289 TnyAccount *account = NULL;
290 ModestWindowMgr *mgr;
292 account_name = g_strdup(modest_window_get_active_account (win));
294 account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
296 g_printerr ("modest: no account found\n");
300 account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
302 TNY_ACCOUNT_TYPE_STORE);
304 g_printerr ("modest: failed to get tnyaccount for '%s'\n", account_name);
308 from_str = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(), account_name);
310 msg = modest_tny_msg_new ("", from_str, "", "", "", "", NULL);
312 g_printerr ("modest: failed to create new msg\n");
316 folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS);
318 g_printerr ("modest: failed to find Drafts folder\n");
322 tny_folder_add_msg (folder, msg, &err);
324 g_printerr ("modest: error adding msg to Drafts folder: %s",
330 /* Create and register edit window */
331 msg_win = modest_msg_edit_window_new (msg, account_name);
332 mgr = modest_runtime_get_window_mgr ();
333 modest_window_mgr_register_window (mgr, msg_win);
336 gtk_window_set_transient_for (GTK_WINDOW (msg_win),
338 gtk_widget_show_all (GTK_WIDGET (msg_win));
341 g_free (account_name);
344 g_object_unref (G_OBJECT(account));
346 g_object_unref (G_OBJECT(msg));
348 g_object_unref (G_OBJECT(folder));
353 modest_ui_actions_on_open (GtkAction *action, ModestWindow *win)
355 modest_runtime_not_implemented (GTK_WINDOW(win)); /* FIXME */
361 reply_forward_func (gpointer data, gpointer user_data)
363 TnyMsg *msg, *new_msg;
364 GetMsgAsyncHelper *helper;
365 ReplyForwardHelper *rf_helper;
366 ModestWindow *msg_win;
367 ModestEditType edit_type;
370 TnyFolder *folder = NULL;
371 TnyAccount *account = NULL;
372 ModestWindowMgr *mgr;
374 msg = TNY_MSG (data);
375 helper = (GetMsgAsyncHelper *) user_data;
376 rf_helper = (ReplyForwardHelper *) helper->user_data;
378 from = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(),
379 rf_helper->account_name);
380 /* Create reply mail */
381 switch (rf_helper->action) {
384 modest_tny_msg_create_reply_msg (msg, from,
385 rf_helper->reply_forward_type,
386 MODEST_TNY_MSG_REPLY_MODE_SENDER);
388 case ACTION_REPLY_TO_ALL:
390 modest_tny_msg_create_reply_msg (msg, from, rf_helper->reply_forward_type,
391 MODEST_TNY_MSG_REPLY_MODE_ALL);
392 edit_type = MODEST_EDIT_TYPE_REPLY;
396 modest_tny_msg_create_forward_msg (msg, from, rf_helper->reply_forward_type);
397 edit_type = MODEST_EDIT_TYPE_FORWARD;
400 g_return_if_reached ();
405 g_printerr ("modest: failed to create message\n");
409 account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
410 rf_helper->account_name,
411 TNY_ACCOUNT_TYPE_STORE);
413 g_printerr ("modest: failed to get tnyaccount for '%s'\n", rf_helper->account_name);
417 folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS);
419 g_printerr ("modest: failed to find Drafts folder\n");
423 tny_folder_add_msg (folder, msg, &err);
425 g_printerr ("modest: error adding msg to Drafts folder: %s",
431 /* Create and register the windows */
432 msg_win = modest_msg_edit_window_new (new_msg, rf_helper->account_name);
433 mgr = modest_runtime_get_window_mgr ();
434 modest_window_mgr_register_window (mgr, msg_win);
436 /* Show edit window */
437 gtk_widget_show_all (GTK_WIDGET (msg_win));
441 g_object_unref (G_OBJECT (new_msg));
443 g_object_unref (G_OBJECT (folder));
445 g_object_unref (G_OBJECT (account));
447 g_free (rf_helper->account_name);
448 g_slice_free (ReplyForwardHelper, rf_helper);
451 * Common code for the reply and forward actions
454 reply_forward (ReplyForwardAction action, ModestWindow *win)
456 TnyList *header_list;
457 guint reply_forward_type;
460 GetMsgAsyncHelper *helper;
461 ReplyForwardHelper *rf_helper;
463 g_return_if_fail (MODEST_IS_WINDOW(win));
465 header_list = get_selected_headers (win);
469 reply_forward_type = modest_conf_get_int (modest_runtime_get_conf (),
470 (action == ACTION_FORWARD) ? MODEST_CONF_FORWARD_TYPE : MODEST_CONF_REPLY_TYPE,
472 /* We assume that we can only select messages of the
473 same folder and that we reply all of them from the
474 same account. In fact the interface currently only
475 allows single selection */
478 rf_helper = g_slice_new0 (ReplyForwardHelper);
479 rf_helper->reply_forward_type = reply_forward_type;
480 rf_helper->action = action;
482 rf_helper->account_name = g_strdup (modest_window_get_active_account (win));
483 if (!rf_helper->account_name)
484 rf_helper->account_name =
485 modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
487 helper = g_slice_new0 (GetMsgAsyncHelper);
488 helper->window = win;
489 helper->func = reply_forward_func;
490 helper->iter = tny_list_create_iterator (header_list);
491 helper->user_data = rf_helper;
493 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
495 msg = modest_msg_view_window_get_message(MODEST_MSG_VIEW_WINDOW(win));
497 g_printerr ("modest: no message found\n");
500 reply_forward_func (msg, helper);
502 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
503 folder = tny_header_get_folder (header);
505 /* The callback will call it per each header */
506 tny_folder_get_msg_async (folder, header, get_msg_cb, helper);
507 g_object_unref (G_OBJECT (folder));
509 g_printerr ("modest: no folder for header\n");
512 g_object_unref (G_OBJECT (header));
518 modest_ui_actions_on_reply (GtkAction *action, ModestWindow *win)
520 g_return_if_fail (MODEST_IS_WINDOW(win));
522 reply_forward (ACTION_REPLY, win);
526 modest_ui_actions_on_forward (GtkAction *action, ModestWindow *win)
528 g_return_if_fail (MODEST_IS_WINDOW(win));
530 reply_forward (ACTION_FORWARD, win);
534 modest_ui_actions_on_reply_all (GtkAction *action, ModestWindow *win)
536 g_return_if_fail (MODEST_IS_WINDOW(win));
538 reply_forward (ACTION_REPLY_TO_ALL, win);
542 modest_ui_actions_on_next (GtkAction *action,
543 ModestWindow *window)
545 if (MODEST_IS_MAIN_WINDOW (window)) {
546 GtkWidget *header_view;
548 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
549 MODEST_WIDGET_TYPE_HEADER_VIEW);
553 modest_header_view_select_next (MODEST_HEADER_VIEW(header_view));
554 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
555 modest_msg_view_window_select_next_message (MODEST_MSG_VIEW_WINDOW (window));
557 g_return_if_reached ();
562 modest_ui_actions_on_prev (GtkAction *action,
563 ModestWindow *window)
565 g_return_if_fail (MODEST_IS_WINDOW(window));
567 if (MODEST_IS_MAIN_WINDOW (window)) {
568 GtkWidget *header_view;
569 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
570 MODEST_WIDGET_TYPE_HEADER_VIEW);
574 modest_header_view_select_prev (MODEST_HEADER_VIEW(header_view));
575 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
576 modest_msg_view_window_select_previous_message (MODEST_MSG_VIEW_WINDOW (window));
578 g_return_if_reached ();
584 action_send (const gchar* account_name)
586 TnyAccount *tny_account;
587 ModestTnySendQueue *send_queue;
589 g_return_val_if_fail (account_name, FALSE);
592 modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
594 TNY_ACCOUNT_TYPE_TRANSPORT);
596 g_printerr ("modest: cannot get tny transport account for %s\n", account_name);
599 send_queue = modest_tny_send_queue_new (TNY_CAMEL_TRANSPORT_ACCOUNT(tny_account));
601 g_object_unref (G_OBJECT(tny_account));
602 g_printerr ("modest: cannot get send queue for %s\n", account_name);
606 //modest_tny_send_queue_flush (send_queue);
608 g_object_unref (G_OBJECT(send_queue));
609 g_object_unref (G_OBJECT(tny_account));
616 action_receive (const gchar* account_name)
618 TnyAccount *tny_account;
619 ModestMailOperation *mail_op;
621 g_return_val_if_fail (account_name, FALSE);
624 modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
626 TNY_ACCOUNT_TYPE_STORE);
628 g_printerr ("modest: cannot get tny store account for %s\n", account_name);
632 /* Create the mail operation */
633 mail_op = modest_mail_operation_new ();
634 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
635 modest_mail_operation_update_account (mail_op, TNY_STORE_ACCOUNT(tny_account));
637 g_object_unref (G_OBJECT(tny_account));
638 g_object_unref (G_OBJECT (mail_op));
646 modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win)
651 g_strdup(modest_window_get_active_account(MODEST_WINDOW(win)));
653 account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
655 g_printerr ("modest: cannot get account\n");
659 if (!action_send(account_name))
660 g_printerr ("modest: failed to send\n");
661 if (!action_receive(account_name))
662 g_printerr ("modest: failed to receive\n");
668 modest_ui_actions_toggle_header_list_view (GtkAction *action, ModestMainWindow *main_window)
671 GtkWidget *header_view;
673 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
675 header_view = modest_main_window_get_child_widget (main_window,
676 MODEST_WIDGET_TYPE_HEADER_VIEW);
680 conf = modest_runtime_get_conf ();
682 /* what is saved/restored is depending on the style; thus; we save with
683 * old style, then update the style, and restore for this new style
685 modest_widget_memory_save (conf, G_OBJECT(header_view), "header-view");
687 if (modest_header_view_get_style
688 (MODEST_HEADER_VIEW(header_view)) == MODEST_HEADER_VIEW_STYLE_DETAILS)
689 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
690 MODEST_HEADER_VIEW_STYLE_TWOLINES);
692 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
693 MODEST_HEADER_VIEW_STYLE_DETAILS);
695 modest_widget_memory_restore (conf, G_OBJECT(header_view),
702 * Marks a message as read and passes it to the msg preview widget
705 read_msg_func (gpointer data, gpointer user_data)
709 GetMsgAsyncHelper *helper;
710 TnyHeaderFlags header_flags;
711 GtkWidget *msg_preview;
713 msg = TNY_MSG (data);
714 helper = (GetMsgAsyncHelper *) user_data;
716 msg_preview = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (helper->window),
717 MODEST_WIDGET_TYPE_MSG_PREVIEW);
721 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
722 header_flags = tny_header_get_flags (header);
723 tny_header_set_flags (header, header_flags | TNY_HEADER_FLAG_SEEN);
724 g_object_unref (G_OBJECT (header));
726 /* Set message on msg view */
727 modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), msg);
731 * This function is a generic handler for the tny_folder_get_msg_async
732 * call. It expects as user_data a #GetMsgAsyncHelper. This helper
733 * contains a user provided function that is called inside this
734 * method. This will allow us to use this callback in many different
735 * places. This callback performs the common actions for the
736 * get_msg_async call, more specific actions will be done by the user
740 get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data)
742 GetMsgAsyncHelper *helper;
744 helper = (GetMsgAsyncHelper *) user_data;
746 if ((*err && ((*err)->code == TNY_FOLDER_ERROR_GET_MSG)) || !msg) {
747 modest_ui_actions_on_item_not_found (NULL,
748 MODEST_ITEM_TYPE_MESSAGE,
753 /* Call user function */
754 helper->func (msg, user_data);
756 /* Process next element (if exists) */
757 tny_iterator_next (helper->iter);
758 if (tny_iterator_is_done (helper->iter)) {
760 headers = tny_iterator_get_list (helper->iter);
762 g_object_unref (G_OBJECT (headers));
763 g_object_unref (G_OBJECT (helper->iter));
764 g_slice_free (GetMsgAsyncHelper, helper);
767 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
768 tny_folder_get_msg_async (folder, header,
770 g_object_unref (G_OBJECT(header));
775 modest_ui_actions_on_header_selected (ModestHeaderView *folder_view,
777 ModestMainWindow *main_window)
779 GtkWidget *msg_preview;
781 GetMsgAsyncHelper *helper;
784 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
786 msg_preview = modest_main_window_get_child_widget(main_window,
787 MODEST_WIDGET_TYPE_MSG_PREVIEW);
791 /* when there's no header, clear the msgview */
793 modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), NULL);
797 folder = tny_header_get_folder (TNY_HEADER(header));
800 list = tny_simple_list_new ();
801 tny_list_prepend (list, G_OBJECT (header));
803 /* Fill helper data */
804 helper = g_slice_new0 (GetMsgAsyncHelper);
805 helper->window = MODEST_WINDOW (main_window);
806 helper->iter = tny_list_create_iterator (list);
807 helper->func = read_msg_func;
809 tny_folder_get_msg_async (TNY_FOLDER(folder),
814 g_object_unref (G_OBJECT (folder));
820 modest_ui_actions_on_header_activated (ModestHeaderView *folder_view, TnyHeader *header,
821 ModestMainWindow *main_window)
823 ModestWindow *win = NULL;
824 TnyFolder *folder = NULL;
826 ModestWindowMgr *mgr;
828 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
833 folder = tny_header_get_folder (header);
835 g_printerr ("modest: cannot get folder for header\n");
839 /* FIXME: make async?; check error */
840 msg = tny_folder_get_msg (folder, header, NULL);
842 g_printerr ("modest: cannot get msg for header\n");
846 /* Look if we already have a message view for that header */
847 mgr = modest_runtime_get_window_mgr ();
848 win = modest_window_mgr_find_window_by_msguid (mgr, tny_header_get_uid (header));
850 /* If not, create a new window */
854 account = g_strdup(modest_window_get_active_account(MODEST_WINDOW(main_window)));
856 account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
858 win = modest_msg_view_window_new (msg, account);
859 modest_window_mgr_register_window (mgr, win);
861 gtk_window_set_transient_for (GTK_WINDOW (win),
862 GTK_WINDOW (main_window));
865 gtk_widget_show_all (GTK_WIDGET(win));
867 g_object_unref (G_OBJECT (msg));
870 g_object_unref (G_OBJECT (folder));
874 modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
877 ModestMainWindow *main_window)
881 GtkWidget *header_view;
883 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
885 header_view = modest_main_window_get_child_widget(main_window,
886 MODEST_WIDGET_TYPE_HEADER_VIEW);
890 conf = modest_runtime_get_conf ();
892 if (!selected) { /* the folder was unselected; save it's settings */
893 modest_widget_memory_save (conf, G_OBJECT (header_view), "header-view");
894 gtk_window_set_title (GTK_WINDOW(main_window), "Modest");
895 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), NULL);
896 } else { /* the folder was selected */
897 if (folder) { /* folder may be NULL */
901 num = tny_folder_get_all_count (folder);
902 unread = tny_folder_get_unread_count (folder);
904 title = g_strdup_printf ("Modest: %s",
905 tny_folder_get_name (folder));
907 gtk_window_set_title (GTK_WINDOW(main_window), title);
910 txt = g_strdup_printf (_("%d %s, %d unread"),
911 num, num==1 ? _("item") : _("items"), unread);
912 //gtk_label_set_label (GTK_LABEL(folder_info_label), txt);
915 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), folder);
916 modest_widget_memory_restore (conf, G_OBJECT(header_view),
922 modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemType type,
929 item = (type == MODEST_ITEM_TYPE_FOLDER) ? "folder" : "message";
931 if (g_main_depth > 0)
932 gdk_threads_enter ();
933 online = tny_device_is_online (modest_runtime_get_device());
936 /* already online -- the item is simply not there... */
937 dialog = gtk_message_dialog_new (GTK_WINDOW (win),
941 _("The %s you selected cannot be found"),
943 gtk_dialog_run (GTK_DIALOG(dialog));
945 dialog = gtk_dialog_new_with_buttons (_("Connection requested"),
953 txt = g_strdup_printf (_("This %s is not available in offline mode.\n"
954 "Do you want to get online?"), item);
955 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
956 gtk_label_new (txt), FALSE, FALSE, 0);
957 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
960 gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300);
961 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
962 // tny_device_force_online (modest_runtime_get_device());
965 gtk_widget_destroy (dialog);
966 if (g_main_depth > 0)
967 gdk_threads_leave ();
971 modest_ui_actions_on_msg_link_hover (ModestMsgView *msgview, const gchar* link,
974 g_message ("%s %s", __FUNCTION__, link);
979 modest_ui_actions_on_msg_link_clicked (ModestMsgView *msgview, const gchar* link,
982 modest_platform_activate_uri (link);
986 modest_ui_actions_on_msg_link_contextual (ModestMsgView *msgview, const gchar* link,
989 modest_platform_show_uri_popup (link);
993 modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, TnyMimePart *mime_part,
996 g_message (__FUNCTION__);
1001 modest_ui_actions_on_msg_recpt_activated (ModestMsgView *msgview,
1002 const gchar *address,
1005 g_message ("%s %s", __FUNCTION__, address);
1009 modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
1011 TnyTransportAccount *transport_account;
1012 ModestMailOperation *mail_operation;
1014 gchar *account_name, *from;
1015 ModestAccountMgr *account_mgr;
1017 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
1019 data = modest_msg_edit_window_get_msg_data (edit_window);
1021 /* FIXME: Code added just for testing. The final version will
1022 use the send queue provided by tinymail and some
1024 account_mgr = modest_runtime_get_account_mgr();
1025 account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
1027 account_name = modest_account_mgr_get_default_account (account_mgr);
1028 if (!account_name) {
1029 g_printerr ("modest: no account found\n");
1030 modest_msg_edit_window_free_msg_data (edit_window, data);
1034 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_tny_account_by_account
1035 (modest_runtime_get_account_store(),
1037 TNY_ACCOUNT_TYPE_TRANSPORT));
1038 if (!transport_account) {
1039 g_printerr ("modest: no transport account found for '%s'\n", account_name);
1040 g_free (account_name);
1041 modest_msg_edit_window_free_msg_data (edit_window, data);
1044 from = modest_account_mgr_get_from_string (account_mgr, account_name);
1046 /* Create the mail operation */
1047 mail_operation = modest_mail_operation_new ();
1048 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
1050 modest_mail_operation_send_new_mail (mail_operation,
1062 g_free (account_name);
1063 g_object_unref (G_OBJECT (transport_account));
1064 g_object_unref (G_OBJECT (mail_operation));
1066 modest_msg_edit_window_free_msg_data (edit_window, data);
1068 /* Save settings and close the window */
1069 gtk_widget_destroy (GTK_WIDGET (edit_window));
1073 modest_ui_actions_on_toggle_bold (GtkToggleAction *action,
1074 ModestMsgEditWindow *window)
1076 ModestMsgEditFormatState *format_state = NULL;
1078 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1079 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1081 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1084 format_state = modest_msg_edit_window_get_format_state (window);
1085 g_return_if_fail (format_state != NULL);
1087 format_state->bold = gtk_toggle_action_get_active (action);
1088 modest_msg_edit_window_set_format_state (window, format_state);
1089 g_free (format_state);
1094 modest_ui_actions_on_toggle_italics (GtkToggleAction *action,
1095 ModestMsgEditWindow *window)
1097 ModestMsgEditFormatState *format_state = NULL;
1099 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1100 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1102 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1105 format_state = modest_msg_edit_window_get_format_state (window);
1106 g_return_if_fail (format_state != NULL);
1108 format_state->italics = gtk_toggle_action_get_active (action);
1109 modest_msg_edit_window_set_format_state (window, format_state);
1110 g_free (format_state);
1115 modest_ui_actions_on_toggle_bullets (GtkToggleAction *action,
1116 ModestMsgEditWindow *window)
1118 ModestMsgEditFormatState *format_state = NULL;
1120 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1121 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1123 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1126 format_state = modest_msg_edit_window_get_format_state (window);
1127 g_return_if_fail (format_state != NULL);
1129 format_state->bullet = gtk_toggle_action_get_active (action);
1130 modest_msg_edit_window_set_format_state (window, format_state);
1131 g_free (format_state);
1136 modest_ui_actions_on_change_justify (GtkRadioAction *action,
1137 GtkRadioAction *selected,
1138 ModestMsgEditWindow *window)
1140 ModestMsgEditFormatState *format_state = NULL;
1141 GtkJustification value;
1143 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1145 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1148 value = gtk_radio_action_get_current_value (selected);
1150 format_state = modest_msg_edit_window_get_format_state (window);
1151 g_return_if_fail (format_state != NULL);
1153 format_state->justification = value;
1154 modest_msg_edit_window_set_format_state (window, format_state);
1155 g_free (format_state);
1159 modest_ui_actions_on_select_editor_color (GtkAction *action,
1160 ModestMsgEditWindow *window)
1162 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1163 g_return_if_fail (GTK_IS_ACTION (action));
1165 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1168 modest_msg_edit_window_select_color (window);
1172 modest_ui_actions_on_select_editor_background_color (GtkAction *action,
1173 ModestMsgEditWindow *window)
1175 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1176 g_return_if_fail (GTK_IS_ACTION (action));
1178 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1181 modest_msg_edit_window_select_background_color (window);
1185 modest_ui_actions_on_insert_image (GtkAction *action,
1186 ModestMsgEditWindow *window)
1188 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1189 g_return_if_fail (GTK_IS_ACTION (action));
1191 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1194 modest_msg_edit_window_insert_image (window);
1198 * Shows a dialog with an entry that asks for some text. The returned
1199 * value must be freed by the caller. The dialog window title will be
1203 ask_for_folder_name (GtkWindow *parent_window,
1206 GtkWidget *dialog, *entry;
1207 gchar *folder_name = NULL;
1209 /* Ask for folder name */
1210 dialog = gtk_dialog_new_with_buttons (_("New Folder Name"),
1214 GTK_RESPONSE_REJECT,
1216 GTK_RESPONSE_ACCEPT,
1218 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1219 gtk_label_new(title),
1222 entry = gtk_entry_new_with_max_length (40);
1223 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1227 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1229 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
1230 folder_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
1232 gtk_widget_destroy (dialog);
1238 modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_window)
1240 TnyFolder *parent_folder;
1241 GtkWidget *folder_view;
1243 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1245 folder_view = modest_main_window_get_child_widget (main_window,
1246 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1250 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1252 if (parent_folder) {
1255 folder_name = ask_for_folder_name (GTK_WINDOW (main_window),
1256 _("Please enter a name for the new folder"));
1258 if (folder_name != NULL && strlen (folder_name) > 0) {
1259 TnyFolder *new_folder;
1260 ModestMailOperation *mail_op;
1262 mail_op = modest_mail_operation_new ();
1263 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1266 new_folder = modest_mail_operation_create_folder (mail_op,
1267 TNY_FOLDER_STORE (parent_folder),
1268 (const gchar *) folder_name);
1270 g_object_unref (new_folder);
1271 g_object_unref (mail_op);
1272 g_free (folder_name);
1274 g_object_unref (parent_folder);
1279 modest_ui_actions_on_rename_folder (GtkAction *action,
1280 ModestMainWindow *main_window)
1283 GtkWidget *folder_view;
1285 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1287 folder_view = modest_main_window_get_child_widget (main_window,
1288 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1292 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1296 folder_name = ask_for_folder_name (GTK_WINDOW (main_window),
1297 _("Please enter a new name for the folder"));
1299 if (folder_name != NULL && strlen (folder_name) > 0) {
1300 ModestMailOperation *mail_op;
1302 mail_op = modest_mail_operation_new ();
1303 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1306 modest_mail_operation_rename_folder (mail_op,
1308 (const gchar *) folder_name);
1310 g_object_unref (mail_op);
1311 g_free (folder_name);
1313 g_object_unref (folder);
1318 delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
1321 ModestMailOperation *mail_op;
1322 GtkWidget *folder_view;
1324 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1326 folder_view = modest_main_window_get_child_widget (main_window,
1327 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1331 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
1333 mail_op = modest_mail_operation_new ();
1334 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1336 modest_mail_operation_remove_folder (mail_op, folder, move_to_trash);
1338 g_object_unref (G_OBJECT (mail_op));
1339 g_object_unref (G_OBJECT (folder));
1343 modest_ui_actions_on_delete_folder (GtkAction *action,
1344 ModestMainWindow *main_window)
1346 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1348 delete_folder (main_window, FALSE);
1352 modest_ui_actions_on_move_folder_to_trash_folder (GtkAction *action, ModestMainWindow *main_window)
1354 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1356 delete_folder (main_window, TRUE);
1360 modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
1361 const gchar* account_name,
1365 ModestMainWindow *main_window)
1368 GtkWidget *dialog, *entry, *remember_pass_check;
1370 dialog = gtk_dialog_new_with_buttons (_("Password requested"),
1374 GTK_RESPONSE_REJECT,
1376 GTK_RESPONSE_ACCEPT,
1378 gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(main_window));
1380 txt = g_strdup_printf (_("Please enter your password for %s"), account_name);
1381 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt),
1385 entry = gtk_entry_new_with_max_length (40);
1386 gtk_entry_set_visibility (GTK_ENTRY(entry), FALSE);
1387 gtk_entry_set_invisible_char (GTK_ENTRY(entry), 0x2022); /* bullet unichar */
1389 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry,
1392 remember_pass_check = gtk_check_button_new_with_label (_("Remember password"));
1393 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check,
1396 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1398 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
1399 *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry)));
1406 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check)))
1411 gtk_widget_destroy (dialog);
1415 modest_ui_actions_on_cut (GtkAction *action,
1416 ModestWindow *window)
1418 GtkWidget *focused_widget;
1420 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1421 if (GTK_IS_EDITABLE (focused_widget)) {
1422 gtk_editable_cut_clipboard (GTK_EDITABLE(focused_widget));
1423 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1424 GtkTextBuffer *buffer;
1425 GtkClipboard *clipboard;
1427 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1428 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1429 gtk_text_buffer_cut_clipboard (buffer, clipboard, TRUE);
1434 modest_ui_actions_on_copy (GtkAction *action,
1435 ModestWindow *window)
1437 GtkClipboard *clipboard;
1438 GtkWidget *focused_widget;
1440 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1441 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1442 if (GTK_IS_LABEL (focused_widget)) {
1443 gtk_clipboard_set_text (clipboard, gtk_label_get_text (GTK_LABEL (focused_widget)), -1);
1444 } else if (GTK_IS_EDITABLE (focused_widget)) {
1445 gtk_editable_copy_clipboard (GTK_EDITABLE(focused_widget));
1446 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1447 GtkTextBuffer *buffer;
1449 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1450 gtk_text_buffer_copy_clipboard (buffer, clipboard);
1455 modest_ui_actions_on_paste (GtkAction *action,
1456 ModestWindow *window)
1458 GtkWidget *focused_widget;
1460 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1461 if (GTK_IS_EDITABLE (focused_widget)) {
1462 gtk_editable_paste_clipboard (GTK_EDITABLE(focused_widget));
1463 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1464 GtkTextBuffer *buffer;
1465 GtkClipboard *clipboard;
1467 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1468 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1469 gtk_text_buffer_paste_clipboard (buffer, clipboard, NULL, TRUE);
1474 modest_ui_actions_on_select_all (GtkAction *action,
1475 ModestWindow *window)
1477 GtkWidget *focused_widget;
1479 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1480 if (GTK_IS_LABEL (focused_widget)) {
1481 gtk_label_select_region (GTK_LABEL (focused_widget), 0, -1);
1482 } else if (GTK_IS_EDITABLE (focused_widget)) {
1483 gtk_editable_select_region (GTK_EDITABLE(focused_widget), 0, -1);
1484 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1485 GtkTextBuffer *buffer;
1486 GtkTextIter start, end;
1488 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1489 gtk_text_buffer_get_start_iter (buffer, &start);
1490 gtk_text_buffer_get_end_iter (buffer, &end);
1491 gtk_text_buffer_select_range (buffer, &start, &end);
1496 modest_ui_actions_on_change_zoom (GtkRadioAction *action,
1497 GtkRadioAction *selected,
1498 ModestWindow *window)
1502 value = gtk_radio_action_get_current_value (selected);
1503 if (MODEST_IS_WINDOW (window)) {
1504 modest_window_set_zoom (MODEST_WINDOW (window), ((gdouble)value)/100);
1509 modest_ui_actions_on_zoom_plus (GtkAction *action,
1510 ModestWindow *window)
1512 g_return_if_fail (MODEST_IS_WINDOW (window));
1514 modest_window_zoom_plus (MODEST_WINDOW (window));
1518 modest_ui_actions_on_zoom_minus (GtkAction *action,
1519 ModestWindow *window)
1521 g_return_if_fail (MODEST_IS_WINDOW (window));
1523 modest_window_zoom_minus (MODEST_WINDOW (window));
1527 modest_ui_actions_on_toggle_fullscreen (GtkToggleAction *toggle,
1528 ModestWindow *window)
1530 ModestWindowMgr *mgr;
1531 gboolean fullscreen, active;
1532 g_return_if_fail (MODEST_IS_WINDOW (window));
1534 mgr = modest_runtime_get_window_mgr ();
1536 active = (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle)))?1:0;
1537 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
1539 if (active != fullscreen) {
1540 modest_window_mgr_set_fullscreen_mode (mgr, active);
1541 gtk_window_present (GTK_WINDOW (window));
1546 modest_ui_actions_on_change_fullscreen (GtkAction *action,
1547 ModestWindow *window)
1549 ModestWindowMgr *mgr;
1550 gboolean fullscreen;
1552 g_return_if_fail (MODEST_IS_WINDOW (window));
1554 mgr = modest_runtime_get_window_mgr ();
1555 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
1556 modest_window_mgr_set_fullscreen_mode (mgr, !fullscreen);
1558 gtk_window_present (GTK_WINDOW (window));
1562 modest_ui_actions_message_details_cb (gpointer msg_data,
1563 gpointer helper_data)
1566 TnyMsg *msg = (TnyMsg *) msg_data;
1568 GetMsgAsyncHelper *helper = (GetMsgAsyncHelper *) helper_data;
1570 header = tny_msg_get_header (msg);
1572 dialog = modest_msg_view_details_dialog_new (GTK_WINDOW (helper->window), header);
1573 g_object_unref (header);
1574 gtk_widget_show_all (dialog);
1576 gtk_dialog_run (GTK_DIALOG (dialog));
1578 gtk_widget_destroy (dialog);
1582 modest_ui_actions_on_message_details (GtkAction *action,
1585 TnyList * headers_list;
1586 GetMsgAsyncHelper *helper;
1588 headers_list = get_selected_headers (win);
1592 helper = g_slice_new0 (GetMsgAsyncHelper);
1593 helper->window = win;
1594 helper->func = modest_ui_actions_message_details_cb;
1595 helper->iter = tny_list_create_iterator (headers_list);
1596 helper->user_data = NULL;
1598 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1601 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1605 modest_ui_actions_message_details_cb (msg, helper);
1608 /* here we should add an implementation to run the message details dialog
1609 from the main window */
1610 g_return_if_reached ();
1615 modest_ui_actions_on_toggle_show_cc (GtkToggleAction *toggle,
1616 ModestMsgEditWindow *window)
1618 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1620 modest_msg_edit_window_show_cc (window, gtk_toggle_action_get_active (toggle));
1624 modest_ui_actions_on_toggle_show_bcc (GtkToggleAction *toggle,
1625 ModestMsgEditWindow *window)
1627 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1629 modest_msg_edit_window_show_bcc (window, gtk_toggle_action_get_active (toggle));
1633 modest_ui_actions_toggle_folders_view (GtkAction *action,
1634 ModestMainWindow *main_window)
1638 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1640 conf = modest_runtime_get_conf ();
1642 if (modest_main_window_get_style (main_window) == MODEST_MAIN_WINDOW_STYLE_SPLIT)
1643 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SIMPLE);
1645 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SPLIT);
1649 modest_ui_actions_on_toggle_toolbar (GtkToggleAction *toggle,
1650 ModestWindow *window)
1652 gboolean active, fullscreen = FALSE;
1653 ModestWindowMgr *mgr;
1655 active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle));
1657 /* Check if we want to toggle the toolbar vuew in fullscreen
1659 if (!strcmp (gtk_action_get_name (GTK_ACTION (toggle)),
1660 "ViewShowToolbarFullScreen")) {
1664 /* Toggle toolbar */
1665 mgr = modest_runtime_get_window_mgr ();
1666 modest_window_mgr_show_toolbars (mgr, active, fullscreen);