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));
636 g_object_unref (G_OBJECT(tny_account));
637 g_object_unref (G_OBJECT (mail_op));
645 modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win)
650 g_strdup(modest_window_get_active_account(MODEST_WINDOW(win)));
652 account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
654 g_printerr ("modest: cannot get account\n");
658 if (!action_send(account_name))
659 g_printerr ("modest: failed to send\n");
660 if (!action_receive(account_name))
661 g_printerr ("modest: failed to receive\n");
667 modest_ui_actions_toggle_header_list_view (GtkAction *action, ModestMainWindow *main_window)
670 GtkWidget *header_view;
672 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
674 header_view = modest_main_window_get_child_widget (main_window,
675 MODEST_WIDGET_TYPE_HEADER_VIEW);
679 conf = modest_runtime_get_conf ();
681 /* what is saved/restored is depending on the style; thus; we save with
682 * old style, then update the style, and restore for this new style
684 modest_widget_memory_save (conf, G_OBJECT(header_view), "header-view");
686 if (modest_header_view_get_style
687 (MODEST_HEADER_VIEW(header_view)) == MODEST_HEADER_VIEW_STYLE_DETAILS)
688 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
689 MODEST_HEADER_VIEW_STYLE_TWOLINES);
691 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
692 MODEST_HEADER_VIEW_STYLE_DETAILS);
694 modest_widget_memory_restore (conf, G_OBJECT(header_view),
701 * Marks a message as read and passes it to the msg preview widget
704 read_msg_func (gpointer data, gpointer user_data)
708 GetMsgAsyncHelper *helper;
709 TnyHeaderFlags header_flags;
710 GtkWidget *msg_preview;
712 msg = TNY_MSG (data);
713 helper = (GetMsgAsyncHelper *) user_data;
715 msg_preview = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (helper->window),
716 MODEST_WIDGET_TYPE_MSG_PREVIEW);
720 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
721 header_flags = tny_header_get_flags (header);
722 tny_header_set_flags (header, header_flags | TNY_HEADER_FLAG_SEEN);
723 g_object_unref (G_OBJECT (header));
725 /* Set message on msg view */
726 modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), msg);
730 * This function is a generic handler for the tny_folder_get_msg_async
731 * call. It expects as user_data a #GetMsgAsyncHelper. This helper
732 * contains a user provided function that is called inside this
733 * method. This will allow us to use this callback in many different
734 * places. This callback performs the common actions for the
735 * get_msg_async call, more specific actions will be done by the user
739 get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data)
741 GetMsgAsyncHelper *helper;
743 helper = (GetMsgAsyncHelper *) user_data;
745 if ((*err && ((*err)->code == TNY_FOLDER_ERROR_GET_MSG)) || !msg) {
746 modest_ui_actions_on_item_not_found (NULL,
747 MODEST_ITEM_TYPE_MESSAGE,
752 /* Call user function */
753 helper->func (msg, user_data);
755 /* Process next element (if exists) */
756 tny_iterator_next (helper->iter);
757 if (tny_iterator_is_done (helper->iter)) {
759 headers = tny_iterator_get_list (helper->iter);
761 g_object_unref (G_OBJECT (headers));
762 g_object_unref (G_OBJECT (helper->iter));
763 g_slice_free (GetMsgAsyncHelper, helper);
766 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
767 tny_folder_get_msg_async (folder, header,
769 g_object_unref (G_OBJECT(header));
774 modest_ui_actions_on_header_selected (ModestHeaderView *folder_view,
776 ModestMainWindow *main_window)
778 GtkWidget *msg_preview;
780 GetMsgAsyncHelper *helper;
783 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
785 msg_preview = modest_main_window_get_child_widget(main_window,
786 MODEST_WIDGET_TYPE_MSG_PREVIEW);
790 /* when there's no header, clear the msgview */
792 modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), NULL);
796 folder = tny_header_get_folder (TNY_HEADER(header));
799 list = tny_simple_list_new ();
800 tny_list_prepend (list, G_OBJECT (header));
802 /* Fill helper data */
803 helper = g_slice_new0 (GetMsgAsyncHelper);
804 helper->window = MODEST_WINDOW (main_window);
805 helper->iter = tny_list_create_iterator (list);
806 helper->func = read_msg_func;
808 tny_folder_get_msg_async (TNY_FOLDER(folder),
813 g_object_unref (G_OBJECT (folder));
819 modest_ui_actions_on_header_activated (ModestHeaderView *folder_view, TnyHeader *header,
820 ModestMainWindow *main_window)
822 ModestWindow *win = NULL;
823 TnyFolder *folder = NULL;
825 ModestWindowMgr *mgr;
827 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
832 folder = tny_header_get_folder (header);
834 g_printerr ("modest: cannot get folder for header\n");
838 /* FIXME: make async?; check error */
839 msg = tny_folder_get_msg (folder, header, NULL);
841 g_printerr ("modest: cannot get msg for header\n");
845 /* Look if we already have a message view for that header */
846 mgr = modest_runtime_get_window_mgr ();
847 win = modest_window_mgr_find_window_by_msguid (mgr, tny_header_get_uid (header));
849 /* If not, create a new window */
853 account = g_strdup(modest_window_get_active_account(MODEST_WINDOW(main_window)));
855 account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
857 win = modest_msg_view_window_new (msg, account);
858 modest_window_mgr_register_window (mgr, win);
860 gtk_window_set_transient_for (GTK_WINDOW (win),
861 GTK_WINDOW (main_window));
864 gtk_widget_show_all (GTK_WIDGET(win));
866 g_object_unref (G_OBJECT (msg));
869 g_object_unref (G_OBJECT (folder));
873 modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
876 ModestMainWindow *main_window)
880 GtkWidget *header_view;
882 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
884 header_view = modest_main_window_get_child_widget(main_window,
885 MODEST_WIDGET_TYPE_HEADER_VIEW);
889 conf = modest_runtime_get_conf ();
891 if (!selected) { /* the folder was unselected; save it's settings */
892 modest_widget_memory_save (conf, G_OBJECT (header_view), "header-view");
893 gtk_window_set_title (GTK_WINDOW(main_window), "Modest");
894 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), NULL);
895 } else { /* the folder was selected */
896 if (folder) { /* folder may be NULL */
900 num = tny_folder_get_all_count (folder);
901 unread = tny_folder_get_unread_count (folder);
903 title = g_strdup_printf ("Modest: %s",
904 tny_folder_get_name (folder));
906 gtk_window_set_title (GTK_WINDOW(main_window), title);
909 txt = g_strdup_printf (_("%d %s, %d unread"),
910 num, num==1 ? _("item") : _("items"), unread);
911 //gtk_label_set_label (GTK_LABEL(folder_info_label), txt);
914 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), folder);
915 modest_widget_memory_restore (conf, G_OBJECT(header_view),
921 modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemType type,
928 item = (type == MODEST_ITEM_TYPE_FOLDER) ? "folder" : "message";
930 if (g_main_depth > 0)
931 gdk_threads_enter ();
932 online = tny_device_is_online (modest_runtime_get_device());
935 /* already online -- the item is simply not there... */
936 dialog = gtk_message_dialog_new (GTK_WINDOW (win),
940 _("The %s you selected cannot be found"),
942 gtk_dialog_run (GTK_DIALOG(dialog));
944 dialog = gtk_dialog_new_with_buttons (_("Connection requested"),
952 txt = g_strdup_printf (_("This %s is not available in offline mode.\n"
953 "Do you want to get online?"), item);
954 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
955 gtk_label_new (txt), FALSE, FALSE, 0);
956 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
959 gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300);
960 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
961 // tny_device_force_online (modest_runtime_get_device());
964 gtk_widget_destroy (dialog);
965 if (g_main_depth > 0)
966 gdk_threads_leave ();
970 modest_ui_actions_on_msg_link_hover (ModestMsgView *msgview, const gchar* link,
973 g_message ("%s %s", __FUNCTION__, link);
978 modest_ui_actions_on_msg_link_clicked (ModestMsgView *msgview, const gchar* link,
981 modest_platform_activate_uri (link);
985 modest_ui_actions_on_msg_link_contextual (ModestMsgView *msgview, const gchar* link,
988 modest_platform_show_uri_popup (link);
992 modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, TnyMimePart *mime_part,
995 g_message (__FUNCTION__);
1000 modest_ui_actions_on_msg_recpt_activated (ModestMsgView *msgview,
1001 const gchar *address,
1004 g_message ("%s %s", __FUNCTION__, address);
1008 modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
1010 TnyTransportAccount *transport_account;
1011 ModestMailOperation *mail_operation;
1013 gchar *account_name, *from;
1014 ModestAccountMgr *account_mgr;
1016 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
1018 data = modest_msg_edit_window_get_msg_data (edit_window);
1020 /* FIXME: Code added just for testing. The final version will
1021 use the send queue provided by tinymail and some
1023 account_mgr = modest_runtime_get_account_mgr();
1024 account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
1026 account_name = modest_account_mgr_get_default_account (account_mgr);
1027 if (!account_name) {
1028 g_printerr ("modest: no account found\n");
1029 modest_msg_edit_window_free_msg_data (edit_window, data);
1033 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_tny_account_by_account
1034 (modest_runtime_get_account_store(),
1036 TNY_ACCOUNT_TYPE_TRANSPORT));
1037 if (!transport_account) {
1038 g_printerr ("modest: no transport account found for '%s'\n", account_name);
1039 g_free (account_name);
1040 modest_msg_edit_window_free_msg_data (edit_window, data);
1043 from = modest_account_mgr_get_from_string (account_mgr, account_name);
1045 /* Create the mail operation */
1046 mail_operation = modest_mail_operation_new ();
1047 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
1049 modest_mail_operation_send_new_mail (mail_operation,
1061 g_free (account_name);
1062 g_object_unref (G_OBJECT (transport_account));
1063 g_object_unref (G_OBJECT (mail_operation));
1065 modest_msg_edit_window_free_msg_data (edit_window, data);
1067 /* Save settings and close the window */
1068 gtk_widget_destroy (GTK_WIDGET (edit_window));
1072 modest_ui_actions_on_toggle_bold (GtkToggleAction *action,
1073 ModestMsgEditWindow *window)
1075 ModestMsgEditFormatState *format_state = NULL;
1077 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1078 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1080 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1083 format_state = modest_msg_edit_window_get_format_state (window);
1084 g_return_if_fail (format_state != NULL);
1086 format_state->bold = gtk_toggle_action_get_active (action);
1087 modest_msg_edit_window_set_format_state (window, format_state);
1088 g_free (format_state);
1093 modest_ui_actions_on_toggle_italics (GtkToggleAction *action,
1094 ModestMsgEditWindow *window)
1096 ModestMsgEditFormatState *format_state = NULL;
1098 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1099 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1101 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1104 format_state = modest_msg_edit_window_get_format_state (window);
1105 g_return_if_fail (format_state != NULL);
1107 format_state->italics = gtk_toggle_action_get_active (action);
1108 modest_msg_edit_window_set_format_state (window, format_state);
1109 g_free (format_state);
1114 modest_ui_actions_on_toggle_bullets (GtkToggleAction *action,
1115 ModestMsgEditWindow *window)
1117 ModestMsgEditFormatState *format_state = NULL;
1119 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1120 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1122 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1125 format_state = modest_msg_edit_window_get_format_state (window);
1126 g_return_if_fail (format_state != NULL);
1128 format_state->bullet = gtk_toggle_action_get_active (action);
1129 modest_msg_edit_window_set_format_state (window, format_state);
1130 g_free (format_state);
1135 modest_ui_actions_on_change_justify (GtkRadioAction *action,
1136 GtkRadioAction *selected,
1137 ModestMsgEditWindow *window)
1139 ModestMsgEditFormatState *format_state = NULL;
1140 GtkJustification value;
1142 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1144 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1147 value = gtk_radio_action_get_current_value (selected);
1149 format_state = modest_msg_edit_window_get_format_state (window);
1150 g_return_if_fail (format_state != NULL);
1152 format_state->justification = value;
1153 modest_msg_edit_window_set_format_state (window, format_state);
1154 g_free (format_state);
1158 modest_ui_actions_on_select_editor_color (GtkAction *action,
1159 ModestMsgEditWindow *window)
1161 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1162 g_return_if_fail (GTK_IS_ACTION (action));
1164 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1167 modest_msg_edit_window_select_color (window);
1171 modest_ui_actions_on_select_editor_background_color (GtkAction *action,
1172 ModestMsgEditWindow *window)
1174 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1175 g_return_if_fail (GTK_IS_ACTION (action));
1177 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1180 modest_msg_edit_window_select_background_color (window);
1184 modest_ui_actions_on_insert_image (GtkAction *action,
1185 ModestMsgEditWindow *window)
1187 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1188 g_return_if_fail (GTK_IS_ACTION (action));
1190 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1193 modest_msg_edit_window_insert_image (window);
1197 * Shows a dialog with an entry that asks for some text. The returned
1198 * value must be freed by the caller. The dialog window title will be
1202 ask_for_folder_name (GtkWindow *parent_window,
1205 GtkWidget *dialog, *entry;
1206 gchar *folder_name = NULL;
1208 /* Ask for folder name */
1209 dialog = gtk_dialog_new_with_buttons (_("New Folder Name"),
1213 GTK_RESPONSE_REJECT,
1215 GTK_RESPONSE_ACCEPT,
1217 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1218 gtk_label_new(title),
1221 entry = gtk_entry_new_with_max_length (40);
1222 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1226 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1228 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
1229 folder_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
1231 gtk_widget_destroy (dialog);
1237 modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_window)
1239 TnyFolder *parent_folder;
1240 GtkWidget *folder_view;
1242 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1244 folder_view = modest_main_window_get_child_widget (main_window,
1245 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1249 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1251 if (parent_folder) {
1254 folder_name = ask_for_folder_name (GTK_WINDOW (main_window),
1255 _("Please enter a name for the new folder"));
1257 if (folder_name != NULL && strlen (folder_name) > 0) {
1258 TnyFolder *new_folder;
1259 ModestMailOperation *mail_op;
1261 mail_op = modest_mail_operation_new ();
1262 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1265 new_folder = modest_mail_operation_create_folder (mail_op,
1266 TNY_FOLDER_STORE (parent_folder),
1267 (const gchar *) folder_name);
1269 g_object_unref (new_folder);
1270 g_object_unref (mail_op);
1271 g_free (folder_name);
1273 g_object_unref (parent_folder);
1278 modest_ui_actions_on_rename_folder (GtkAction *action,
1279 ModestMainWindow *main_window)
1282 GtkWidget *folder_view;
1284 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1286 folder_view = modest_main_window_get_child_widget (main_window,
1287 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1291 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1295 folder_name = ask_for_folder_name (GTK_WINDOW (main_window),
1296 _("Please enter a new name for the folder"));
1298 if (folder_name != NULL && strlen (folder_name) > 0) {
1299 ModestMailOperation *mail_op;
1301 mail_op = modest_mail_operation_new ();
1302 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1305 modest_mail_operation_rename_folder (mail_op,
1307 (const gchar *) folder_name);
1309 g_object_unref (mail_op);
1310 g_free (folder_name);
1312 g_object_unref (folder);
1317 delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
1320 ModestMailOperation *mail_op;
1321 GtkWidget *folder_view;
1323 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1325 folder_view = modest_main_window_get_child_widget (main_window,
1326 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1330 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
1332 mail_op = modest_mail_operation_new ();
1333 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1335 modest_mail_operation_remove_folder (mail_op, folder, move_to_trash);
1337 g_object_unref (G_OBJECT (mail_op));
1338 g_object_unref (G_OBJECT (folder));
1342 modest_ui_actions_on_delete_folder (GtkAction *action,
1343 ModestMainWindow *main_window)
1345 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1347 delete_folder (main_window, FALSE);
1351 modest_ui_actions_on_move_folder_to_trash_folder (GtkAction *action, ModestMainWindow *main_window)
1353 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1355 delete_folder (main_window, TRUE);
1359 modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
1360 const gchar* account_name,
1364 ModestMainWindow *main_window)
1367 GtkWidget *dialog, *entry, *remember_pass_check;
1369 dialog = gtk_dialog_new_with_buttons (_("Password requested"),
1373 GTK_RESPONSE_REJECT,
1375 GTK_RESPONSE_ACCEPT,
1377 gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(main_window));
1379 txt = g_strdup_printf (_("Please enter your password for %s"), account_name);
1380 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt),
1384 entry = gtk_entry_new_with_max_length (40);
1385 gtk_entry_set_visibility (GTK_ENTRY(entry), FALSE);
1386 gtk_entry_set_invisible_char (GTK_ENTRY(entry), 0x2022); /* bullet unichar */
1388 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry,
1391 remember_pass_check = gtk_check_button_new_with_label (_("Remember password"));
1392 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check,
1395 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1397 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
1398 *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry)));
1405 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check)))
1410 gtk_widget_destroy (dialog);
1414 modest_ui_actions_on_cut (GtkAction *action,
1415 ModestWindow *window)
1417 GtkWidget *focused_widget;
1419 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1420 if (GTK_IS_EDITABLE (focused_widget)) {
1421 gtk_editable_cut_clipboard (GTK_EDITABLE(focused_widget));
1422 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1423 GtkTextBuffer *buffer;
1424 GtkClipboard *clipboard;
1426 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1427 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1428 gtk_text_buffer_cut_clipboard (buffer, clipboard, TRUE);
1433 modest_ui_actions_on_copy (GtkAction *action,
1434 ModestWindow *window)
1436 GtkClipboard *clipboard;
1437 GtkWidget *focused_widget;
1439 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1440 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1441 if (GTK_IS_LABEL (focused_widget)) {
1442 gtk_clipboard_set_text (clipboard, gtk_label_get_text (GTK_LABEL (focused_widget)), -1);
1443 } else if (GTK_IS_EDITABLE (focused_widget)) {
1444 gtk_editable_copy_clipboard (GTK_EDITABLE(focused_widget));
1445 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1446 GtkTextBuffer *buffer;
1448 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1449 gtk_text_buffer_copy_clipboard (buffer, clipboard);
1454 modest_ui_actions_on_paste (GtkAction *action,
1455 ModestWindow *window)
1457 GtkWidget *focused_widget;
1459 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1460 if (GTK_IS_EDITABLE (focused_widget)) {
1461 gtk_editable_paste_clipboard (GTK_EDITABLE(focused_widget));
1462 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1463 GtkTextBuffer *buffer;
1464 GtkClipboard *clipboard;
1466 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1467 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1468 gtk_text_buffer_paste_clipboard (buffer, clipboard, NULL, TRUE);
1473 modest_ui_actions_on_select_all (GtkAction *action,
1474 ModestWindow *window)
1476 GtkWidget *focused_widget;
1478 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1479 if (GTK_IS_LABEL (focused_widget)) {
1480 gtk_label_select_region (GTK_LABEL (focused_widget), 0, -1);
1481 } else if (GTK_IS_EDITABLE (focused_widget)) {
1482 gtk_editable_select_region (GTK_EDITABLE(focused_widget), 0, -1);
1483 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1484 GtkTextBuffer *buffer;
1485 GtkTextIter start, end;
1487 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1488 gtk_text_buffer_get_start_iter (buffer, &start);
1489 gtk_text_buffer_get_end_iter (buffer, &end);
1490 gtk_text_buffer_select_range (buffer, &start, &end);
1495 modest_ui_actions_on_change_zoom (GtkRadioAction *action,
1496 GtkRadioAction *selected,
1497 ModestWindow *window)
1501 value = gtk_radio_action_get_current_value (selected);
1502 if (MODEST_IS_WINDOW (window)) {
1503 modest_window_set_zoom (MODEST_WINDOW (window), ((gdouble)value)/100);
1508 modest_ui_actions_on_zoom_plus (GtkAction *action,
1509 ModestWindow *window)
1511 g_return_if_fail (MODEST_IS_WINDOW (window));
1513 modest_window_zoom_plus (MODEST_WINDOW (window));
1517 modest_ui_actions_on_zoom_minus (GtkAction *action,
1518 ModestWindow *window)
1520 g_return_if_fail (MODEST_IS_WINDOW (window));
1522 modest_window_zoom_minus (MODEST_WINDOW (window));
1526 modest_ui_actions_on_toggle_fullscreen (GtkToggleAction *toggle,
1527 ModestWindow *window)
1529 ModestWindowMgr *mgr;
1530 gboolean fullscreen, active;
1531 g_return_if_fail (MODEST_IS_WINDOW (window));
1533 mgr = modest_runtime_get_window_mgr ();
1535 active = (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle)))?1:0;
1536 fullscreen = (modest_window_mgr_get_fullscreen_mode (mgr))?1:0;
1538 if (active != fullscreen) {
1539 modest_window_mgr_set_fullscreen_mode (mgr, active);
1540 gtk_window_present (GTK_WINDOW (window));
1545 modest_ui_actions_on_change_fullscreen (GtkAction *action,
1546 ModestWindow *window)
1548 ModestWindowMgr *mgr;
1549 gboolean fullscreen;
1551 g_return_if_fail (MODEST_IS_WINDOW (window));
1553 mgr = modest_runtime_get_window_mgr ();
1554 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
1555 modest_window_mgr_set_fullscreen_mode (mgr, !fullscreen);
1557 gtk_window_present (GTK_WINDOW (window));
1561 modest_ui_actions_message_details_cb (gpointer msg_data,
1562 gpointer helper_data)
1565 TnyMsg *msg = (TnyMsg *) msg_data;
1567 GetMsgAsyncHelper *helper = (GetMsgAsyncHelper *) helper_data;
1569 header = tny_msg_get_header (msg);
1571 dialog = modest_msg_view_details_dialog_new (GTK_WINDOW (helper->window), header);
1572 g_object_unref (header);
1573 gtk_widget_show_all (dialog);
1575 gtk_dialog_run (GTK_DIALOG (dialog));
1577 gtk_widget_destroy (dialog);
1581 modest_ui_actions_on_message_details (GtkAction *action,
1584 TnyList * headers_list;
1585 GetMsgAsyncHelper *helper;
1587 headers_list = get_selected_headers (win);
1591 helper = g_slice_new0 (GetMsgAsyncHelper);
1592 helper->window = win;
1593 helper->func = modest_ui_actions_message_details_cb;
1594 helper->iter = tny_list_create_iterator (headers_list);
1595 helper->user_data = NULL;
1597 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1600 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1604 modest_ui_actions_message_details_cb (msg, helper);
1607 /* here we should add an implementation to run the message details dialog
1608 from the main window */
1609 g_return_if_reached ();
1614 modest_ui_actions_on_toggle_show_cc (GtkToggleAction *toggle,
1615 ModestMsgEditWindow *window)
1617 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1619 modest_msg_edit_window_show_cc (window, gtk_toggle_action_get_active (toggle));
1623 modest_ui_actions_on_toggle_show_bcc (GtkToggleAction *toggle,
1624 ModestMsgEditWindow *window)
1626 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1628 modest_msg_edit_window_show_bcc (window, gtk_toggle_action_get_active (toggle));
1632 modest_ui_actions_toggle_folders_view (GtkAction *action,
1633 ModestMainWindow *main_window)
1637 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1639 conf = modest_runtime_get_conf ();
1641 if (modest_main_window_get_style (main_window) == MODEST_MAIN_WINDOW_STYLE_SPLIT)
1642 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SIMPLE);
1644 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SPLIT);