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-folder.h>
38 #include <modest-tny-msg.h>
39 #include <modest-tny-account.h>
40 #include <modest-address-book.h>
42 #include "modest-ui-actions.h"
44 #include "modest-tny-platform-factory.h"
45 #include "modest-platform.h"
47 #ifdef MODEST_PLATFORM_MAEMO
48 #include "maemo/modest-osso-state-saving.h"
49 #endif /* MODEST_PLATFORM_MAEMO */
52 #include <widgets/modest-main-window.h>
53 #include <widgets/modest-msg-view-window.h>
54 #include <widgets/modest-account-view-window.h>
55 #include <widgets/modest-details-dialog.h>
57 #include "modest-account-mgr-helpers.h"
58 #include "modest-mail-operation.h"
59 #include "modest-text-utils.h"
61 #ifdef MODEST_HAVE_EASYSETUP
62 #include "easysetup/modest-easysetup-wizard.h"
63 #endif /* MODEST_HAVE_EASYSETUP */
65 #include <modest-widget-memory.h>
66 #include <tny-error.h>
67 #include <tny-simple-list.h>
68 #include <tny-msg-view.h>
69 #include <tny-device.h>
71 typedef struct _GetMsgAsyncHelper {
73 ModestMailOperation *mail_op;
80 typedef enum _ReplyForwardAction {
86 typedef struct _ReplyForwardHelper {
87 guint reply_forward_type;
88 ReplyForwardAction action;
93 * The do_headers_action uses this kind of functions to perform some
94 * action to each member of a list of headers
96 typedef void (*HeadersFunc) (TnyHeader *header, ModestWindow *win, gpointer user_data);
99 do_headers_action (ModestWindow *win,
104 static void reply_forward_func (gpointer data, gpointer user_data);
106 static void get_msg_cb (TnyFolder *folder, gboolean canceled, TnyMsg *msg, GError **err,
108 static void reply_forward (ReplyForwardAction action, ModestWindow *win);
110 static gchar* ask_for_folder_name (GtkWindow *parent_window, const gchar *title);
113 modest_ui_actions_on_about (GtkAction *action, ModestWindow *win)
116 const gchar *authors[] = {
117 "Dirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>",
120 about = gtk_about_dialog_new ();
121 gtk_about_dialog_set_name (GTK_ABOUT_DIALOG(about), PACKAGE_NAME);
122 gtk_about_dialog_set_version (GTK_ABOUT_DIALOG(about),PACKAGE_VERSION);
123 gtk_about_dialog_set_copyright (GTK_ABOUT_DIALOG(about),
124 _("Copyright (c) 2006, Nokia Corporation\n"
125 "All rights reserved."));
126 gtk_about_dialog_set_comments (GTK_ABOUT_DIALOG(about),
127 _("a modest e-mail client\n\n"
128 "design and implementation: Dirk-Jan C. Binnema\n"
129 "contributions from the fine people at KC and Ig\n"
130 "uses the tinymail email framework written by Philip van Hoof"));
131 gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG(about), authors);
132 gtk_about_dialog_set_website (GTK_ABOUT_DIALOG(about), "http://modest.garage.maemo.org");
134 gtk_dialog_run (GTK_DIALOG (about));
135 gtk_widget_destroy(about);
140 get_selected_headers (ModestWindow *win)
142 if (MODEST_IS_MAIN_WINDOW(win)) {
143 GtkWidget *header_view;
145 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
146 MODEST_WIDGET_TYPE_HEADER_VIEW);
147 return modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
149 } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
150 /* for MsgViewWindows, we simply return a list with one element */
153 TnyList *list = NULL;
155 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW(win));
157 header = tny_msg_get_header (msg);
158 list = tny_simple_list_new ();
159 tny_list_prepend (list, G_OBJECT(header));
160 g_object_unref (G_OBJECT(header));
169 headers_action_delete (TnyHeader *header,
173 ModestMailOperation *mail_op;
175 /* TODO: add confirmation dialog */
176 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_DELETE, G_OBJECT(win));
177 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
180 /* Always delete. TODO: Move to trash still not supported */
181 modest_mail_operation_remove_msg (mail_op, header, FALSE);
182 g_object_unref (G_OBJECT (mail_op));
186 modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win)
188 g_return_if_fail (MODEST_IS_WINDOW(win));
190 if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
192 g_signal_emit_by_name (G_OBJECT (win), "delete-event", NULL, &ret_value);
196 /* Remove each header */
197 do_headers_action (win, headers_action_delete, NULL);
199 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
200 gtk_widget_destroy (GTK_WIDGET(win));
206 modest_ui_actions_on_quit (GtkAction *action, ModestWindow *win)
208 #ifdef MODEST_PLATFORM_MAEMO
209 modest_osso_save_state();
210 #endif /* MODEST_PLATFORM_MAEMO */
216 modest_ui_actions_on_close_window (GtkAction *action, ModestWindow *win)
218 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
219 gtk_widget_destroy (GTK_WIDGET (win));
220 } else if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
222 g_signal_emit_by_name (G_OBJECT (win), "delete-event", NULL, &ret_value);
223 } else if (MODEST_IS_WINDOW (win)) {
224 gtk_widget_destroy (GTK_WIDGET (win));
226 g_return_if_reached ();
231 modest_ui_actions_on_add_to_contacts (GtkAction *action, ModestWindow *win)
233 GtkClipboard *clipboard = NULL;
234 gchar *selection = NULL;
236 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
237 selection = gtk_clipboard_wait_for_text (clipboard);
239 modest_address_book_add_address (selection);
244 modest_ui_actions_on_accounts (GtkAction *action, ModestWindow *win)
247 /* This is currently only implemented for Maemo,
248 * because it requires a providers preset file which is not publically available.
250 #ifdef MODEST_PLATFORM_MAEMO /* Defined in config.h */
251 GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr(),
252 TRUE /* enabled accounts only */);
253 gboolean accounts_exist = account_names != NULL;
254 g_slist_free (account_names);
256 if (!accounts_exist) {
257 /* If there are no accounts yet, just show the easy-setup wizard, as per the UI spec: */
258 ModestEasysetupWizardDialog *wizard = modest_easysetup_wizard_dialog_new ();
259 gtk_window_set_transient_for (GTK_WINDOW (wizard), GTK_WINDOW (win));
260 gtk_dialog_run (GTK_DIALOG (wizard));
261 gtk_widget_destroy (GTK_WIDGET (wizard));
263 /* Show the list of accounts: */
264 GtkDialog *account_win = GTK_DIALOG(modest_account_view_window_new ());
265 gtk_window_set_transient_for (GTK_WINDOW (account_win), GTK_WINDOW(win));
266 gtk_dialog_run (account_win);
267 gtk_widget_destroy (GTK_WIDGET(account_win));
270 GtkWidget *dialog, *label;
272 /* Create the widgets */
274 dialog = gtk_dialog_new_with_buttons ("Message",
276 GTK_DIALOG_DESTROY_WITH_PARENT,
280 label = gtk_label_new ("Hello World!");
282 /* Ensure that the dialog box is destroyed when the user responds. */
284 g_signal_connect_swapped (dialog, "response",
285 G_CALLBACK (gtk_widget_destroy),
288 /* Add the label, and show everything we've added to the dialog. */
290 gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox),
292 gtk_widget_show_all (dialog);
293 #endif /* MODEST_PLATFORM_MAEMO */
297 modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win)
299 ModestWindow *msg_win;
301 TnyFolder *folder = NULL;
302 gchar *account_name = NULL;
303 gchar *from_str = NULL;
304 /* GError *err = NULL; */
305 TnyAccount *account = NULL;
306 ModestWindowMgr *mgr;
307 gchar *signature = NULL;
309 account_name = g_strdup(modest_window_get_active_account (win));
311 account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
313 g_printerr ("modest: no account found\n");
317 account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
319 TNY_ACCOUNT_TYPE_STORE);
321 g_printerr ("modest: failed to get tnyaccount for '%s'\n", account_name);
325 from_str = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(), account_name);
327 g_printerr ("modest: failed get from string for '%s'\n", account_name);
331 if (modest_account_mgr_get_bool (modest_runtime_get_account_mgr (), account_name,
332 MODEST_ACCOUNT_USE_SIGNATURE, FALSE)) {
333 signature = modest_account_mgr_get_string (modest_runtime_get_account_mgr (), account_name,
334 MODEST_ACCOUNT_SIGNATURE, FALSE);
336 signature = g_strdup ("");
339 msg = modest_tny_msg_new ("", from_str, "", "", "", signature, NULL);
341 g_printerr ("modest: failed to create new msg\n");
345 folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS);
347 g_printerr ("modest: failed to find Drafts folder\n");
351 /* tny_folder_add_msg (folder, msg, &err); */
353 /* g_printerr ("modest: error adding msg to Drafts folder: %s", */
355 /* g_error_free (err); */
359 /* Create and register edit window */
360 msg_win = modest_msg_edit_window_new (msg, account_name);
361 mgr = modest_runtime_get_window_mgr ();
362 modest_window_mgr_register_window (mgr, msg_win);
365 gtk_window_set_transient_for (GTK_WINDOW (msg_win),
367 gtk_widget_show_all (GTK_WIDGET (msg_win));
370 g_free (account_name);
374 g_object_unref (G_OBJECT(account));
376 g_object_unref (G_OBJECT(msg));
378 g_object_unref (G_OBJECT(folder));
382 headers_action_open (TnyHeader *header,
386 modest_ui_actions_on_header_activated (MODEST_HEADER_VIEW (user_data),
388 MODEST_MAIN_WINDOW (win));
392 modest_ui_actions_on_open (GtkAction *action, ModestWindow *win)
394 GtkWidget *header_view;
396 /* Get header view */
397 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
398 MODEST_WIDGET_TYPE_HEADER_VIEW);
400 /* Open each message */
401 do_headers_action (win, headers_action_open, header_view);
406 reply_forward_func (gpointer data, gpointer user_data)
408 TnyMsg *msg, *new_msg;
409 GetMsgAsyncHelper *helper;
410 ReplyForwardHelper *rf_helper;
411 ModestWindow *msg_win;
412 ModestEditType edit_type;
415 TnyFolder *folder = NULL;
416 TnyAccount *account = NULL;
417 ModestWindowMgr *mgr;
418 gchar *signature = NULL;
420 msg = TNY_MSG (data);
421 helper = (GetMsgAsyncHelper *) user_data;
422 rf_helper = (ReplyForwardHelper *) helper->user_data;
424 from = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(),
425 rf_helper->account_name);
426 if (modest_account_mgr_get_bool (modest_runtime_get_account_mgr(),
427 rf_helper->account_name,
428 MODEST_ACCOUNT_USE_SIGNATURE, FALSE)) {
429 signature = modest_account_mgr_get_string (modest_runtime_get_account_mgr (),
430 rf_helper->account_name,
431 MODEST_ACCOUNT_SIGNATURE, FALSE);
433 /* Create reply mail */
434 switch (rf_helper->action) {
437 modest_tny_msg_create_reply_msg (msg, from, signature,
438 rf_helper->reply_forward_type,
439 MODEST_TNY_MSG_REPLY_MODE_SENDER);
441 case ACTION_REPLY_TO_ALL:
443 modest_tny_msg_create_reply_msg (msg, from, signature, rf_helper->reply_forward_type,
444 MODEST_TNY_MSG_REPLY_MODE_ALL);
445 edit_type = MODEST_EDIT_TYPE_REPLY;
449 modest_tny_msg_create_forward_msg (msg, from, signature, rf_helper->reply_forward_type);
450 edit_type = MODEST_EDIT_TYPE_FORWARD;
453 g_return_if_reached ();
460 g_printerr ("modest: failed to create message\n");
464 account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
465 rf_helper->account_name,
466 TNY_ACCOUNT_TYPE_STORE);
468 g_printerr ("modest: failed to get tnyaccount for '%s'\n", rf_helper->account_name);
472 folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS);
474 g_printerr ("modest: failed to find Drafts folder\n");
478 tny_folder_add_msg (folder, msg, &err);
480 g_printerr ("modest: error adding msg to Drafts folder: %s",
486 /* Create and register the windows */
487 msg_win = modest_msg_edit_window_new (new_msg, rf_helper->account_name);
488 mgr = modest_runtime_get_window_mgr ();
489 modest_window_mgr_register_window (mgr, msg_win);
491 /* Show edit window */
492 gtk_widget_show_all (GTK_WIDGET (msg_win));
496 g_object_unref (G_OBJECT (new_msg));
498 g_object_unref (G_OBJECT (folder));
500 g_object_unref (G_OBJECT (account));
502 /* g_free (rf_helper->account_name); */
503 /* g_slice_free (ReplyForwardHelper, rf_helper); */
506 * Common code for the reply and forward actions
509 reply_forward (ReplyForwardAction action, ModestWindow *win)
511 TnyList *header_list;
512 guint reply_forward_type;
514 GetMsgAsyncHelper *helper;
515 ReplyForwardHelper *rf_helper;
517 g_return_if_fail (MODEST_IS_WINDOW(win));
519 header_list = get_selected_headers (win);
523 reply_forward_type = modest_conf_get_int (modest_runtime_get_conf (),
524 (action == ACTION_FORWARD) ? MODEST_CONF_FORWARD_TYPE : MODEST_CONF_REPLY_TYPE,
526 /* We assume that we can only select messages of the
527 same folder and that we reply all of them from the
528 same account. In fact the interface currently only
529 allows single selection */
532 rf_helper = g_slice_new0 (ReplyForwardHelper);
533 rf_helper->reply_forward_type = reply_forward_type;
534 rf_helper->action = action;
536 rf_helper->account_name = g_strdup (modest_window_get_active_account (win));
537 if (!rf_helper->account_name)
538 rf_helper->account_name =
539 modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
541 helper = g_slice_new0 (GetMsgAsyncHelper);
542 helper->window = win;
543 helper->func = reply_forward_func;
544 helper->iter = tny_list_create_iterator (header_list);
545 helper->user_data = rf_helper;
546 helper->num_ops = tny_list_get_length (header_list);
548 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
550 msg = modest_msg_view_window_get_message(MODEST_MSG_VIEW_WINDOW(win));
552 g_printerr ("modest: no message found\n");
555 reply_forward_func (msg, helper);
557 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
559 helper->mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE, G_OBJECT(win));
560 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), helper->mail_op);
561 modest_mail_operation_process_msg (helper->mail_op, header, helper->num_ops, get_msg_cb, helper);
564 g_object_unref (G_OBJECT (header));
570 modest_ui_actions_on_reply (GtkAction *action, ModestWindow *win)
572 g_return_if_fail (MODEST_IS_WINDOW(win));
574 reply_forward (ACTION_REPLY, win);
578 modest_ui_actions_on_forward (GtkAction *action, ModestWindow *win)
580 g_return_if_fail (MODEST_IS_WINDOW(win));
582 reply_forward (ACTION_FORWARD, win);
586 modest_ui_actions_on_reply_all (GtkAction *action, ModestWindow *win)
588 g_return_if_fail (MODEST_IS_WINDOW(win));
590 reply_forward (ACTION_REPLY_TO_ALL, win);
594 modest_ui_actions_on_next (GtkAction *action,
595 ModestWindow *window)
597 if (MODEST_IS_MAIN_WINDOW (window)) {
598 GtkWidget *header_view;
600 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
601 MODEST_WIDGET_TYPE_HEADER_VIEW);
605 modest_header_view_select_next (MODEST_HEADER_VIEW(header_view));
606 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
607 modest_msg_view_window_select_next_message (MODEST_MSG_VIEW_WINDOW (window));
609 g_return_if_reached ();
614 modest_ui_actions_on_prev (GtkAction *action,
615 ModestWindow *window)
617 g_return_if_fail (MODEST_IS_WINDOW(window));
619 if (MODEST_IS_MAIN_WINDOW (window)) {
620 GtkWidget *header_view;
621 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
622 MODEST_WIDGET_TYPE_HEADER_VIEW);
626 modest_header_view_select_prev (MODEST_HEADER_VIEW(header_view));
627 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
628 modest_msg_view_window_select_previous_message (MODEST_MSG_VIEW_WINDOW (window));
630 g_return_if_reached ();
635 modest_ui_actions_on_sort (GtkAction *action,
636 ModestWindow *window)
638 g_return_if_fail (MODEST_IS_WINDOW(window));
640 if (MODEST_IS_MAIN_WINDOW (window)) {
641 GtkWidget *header_view;
642 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
643 MODEST_WIDGET_TYPE_HEADER_VIEW);
647 /* Show sorting dialog */
648 modest_platform_run_sort_dialog (GTK_WINDOW (window), MODEST_SORT_HEADERS);
654 action_send (const gchar* account_name)
656 TnyAccount *tny_account;
657 ModestTnySendQueue *send_queue;
659 g_return_val_if_fail (account_name, FALSE);
661 /* Get the transport account according to the open connection,
662 * because the account might specify connection-specific SMTP servers.
665 modest_tny_account_store_get_transport_account_for_open_connection (modest_runtime_get_account_store(),
668 g_printerr ("modest: cannot get tny transport account for %s\n", account_name);
672 send_queue = modest_tny_send_queue_new (TNY_CAMEL_TRANSPORT_ACCOUNT(tny_account));
674 g_object_unref (G_OBJECT(tny_account));
675 g_printerr ("modest: cannot get send queue for %s\n", account_name);
679 modest_tny_send_queue_flush (send_queue);
681 g_object_unref (G_OBJECT(send_queue));
682 g_object_unref (G_OBJECT(tny_account));
689 action_receive (const gchar* account_name,
692 TnyAccount *tny_account;
693 ModestMailOperation *mail_op;
695 g_return_val_if_fail (account_name, FALSE);
698 modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
700 TNY_ACCOUNT_TYPE_STORE);
702 g_printerr ("modest: cannot get tny store account for %s\n", account_name);
706 /* Create the mail operation */
707 /* TODO: The spec wants us to first do any pending deletions, before receiving. */
708 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE, G_OBJECT(win));
709 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
710 modest_mail_operation_update_account (mail_op, TNY_STORE_ACCOUNT(tny_account));
712 g_object_unref (G_OBJECT(tny_account));
713 g_object_unref (G_OBJECT (mail_op));
718 /** Check that an appropriate connection is open.
720 gboolean check_for_connection (const gchar *account_name)
722 TnyDevice *device = modest_runtime_get_device ();
725 g_assert (TNY_IS_MAEMO_CONIC_DEVICE (device));
727 TnyMaemoConicDevice *maemo_device = TNY_MAEMO_CONIC_DEVICE (device);
730 if (tny_device_is_online (device))
733 modest_platform_connect_and_wait (NULL);
735 /* TODO: Wait until a result. */
741 do_send_receive_current_or_default (ModestWindow *win)
745 g_message ("%s: online? %s", __FUNCTION__,
746 tny_device_is_online(modest_runtime_get_device()) ? "yes":"no");
748 /* As per the UI spec, only the active account should be affected,
749 * else the default folder if there is no active account: */
751 g_strdup(modest_window_get_active_account(MODEST_WINDOW(win)));
753 account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
755 g_printerr ("modest: cannot get default account\n");
759 /* Do not continue if no suitable connection is open: */
760 if (check_for_connection (account_name)) {
761 /* As per the UI spec,
762 * for POP accounts, we should receive,
763 * for IMAP we should synchronize everything, including receiving,
764 * for SMTP we should send,
765 * first receiving, then sending:
767 if (!action_receive(account_name, win))
768 g_printerr ("modest: failed to receive\n");
769 if (!action_send(account_name))
770 g_printerr ("modest: failed to send\n");
772 g_free (account_name);
778 do_send_receive_auto (ModestWindow *win)
780 g_message ("%s: online? %s", __FUNCTION__,
781 tny_device_is_online(modest_runtime_get_device()) ? "yes":"no");
783 /* TODO: Delete the item->data strings as well as the list? */
784 GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr(),
785 TRUE /* enabled accounts only */);
786 GSList *iter = account_names;
788 const gchar * account_name = (const char*) iter->data;
790 /* Do not continue if no suitable connection is open: */
791 if (account_name && check_for_connection (account_name)) {
792 /* As per the UI spec,
793 * for POP accounts, we should receive,
794 * for IMAP we should synchronize everything, including receiving,
795 * for SMTP we should send,
796 * first receiving, then sending:
798 if (!action_receive(account_name, win))
799 g_printerr ("modest: failed to receive for account %s\n", account_name);
800 if (!action_send(account_name))
801 g_printerr ("modest: failed to send for account %s\n", account_name);
806 g_slist_free (account_names);
810 do_send_receive (ModestWindow *win)
812 const gboolean auto_update = TRUE; /* TODO: Get gconf setting. */
814 do_send_receive_current_or_default (win);
816 do_send_receive_auto (win);
820 modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win)
822 /* Check that at least one account exists: */
823 GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr(),
824 TRUE /* enabled accounts only */);
825 gboolean accounts_exist = account_names != NULL;
826 g_slist_free (account_names);
828 /* If not, allow the user to create an account before trying to send/receive. */
829 if (!accounts_exist) {
830 modest_ui_actions_on_accounts (NULL, win);
833 do_send_receive (win);
840 modest_ui_actions_toggle_header_list_view (GtkAction *action, ModestMainWindow *main_window)
843 GtkWidget *header_view;
845 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
847 header_view = modest_main_window_get_child_widget (main_window,
848 MODEST_WIDGET_TYPE_HEADER_VIEW);
852 conf = modest_runtime_get_conf ();
854 /* what is saved/restored is depending on the style; thus; we save with
855 * old style, then update the style, and restore for this new style
857 modest_widget_memory_save (conf, G_OBJECT(header_view), MODEST_CONF_HEADER_VIEW_KEY);
859 if (modest_header_view_get_style
860 (MODEST_HEADER_VIEW(header_view)) == MODEST_HEADER_VIEW_STYLE_DETAILS)
861 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
862 MODEST_HEADER_VIEW_STYLE_TWOLINES);
864 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
865 MODEST_HEADER_VIEW_STYLE_DETAILS);
867 modest_widget_memory_restore (conf, G_OBJECT(header_view),
868 MODEST_CONF_HEADER_VIEW_KEY);
872 * This function is a generic handler for the tny_folder_get_msg_async
873 * call. It expects as user_data a #GetMsgAsyncHelper. This helper
874 * contains a user provided function that is called inside this
875 * method. This will allow us to use this callback in many different
876 * places. This callback performs the common actions for the
877 * get_msg_async call, more specific actions will be done by the user
881 get_msg_cb (TnyFolder *folder, gboolean canceled, TnyMsg *msg, GError **err, gpointer user_data)
883 GetMsgAsyncHelper *helper;
885 helper = (GetMsgAsyncHelper *) user_data;
888 if ((*err && ((*err)->code == TNY_FOLDER_ERROR_GET_MSG)) || !msg) {
889 modest_ui_actions_on_item_not_found (NULL,
890 MODEST_ITEM_TYPE_MESSAGE,
895 /* Call user function */
897 helper->func (msg, user_data);
899 /* Process next element (if exists) */
900 tny_iterator_next (helper->iter);
901 if (tny_iterator_is_done (helper->iter)) {
902 /* Notify the queue */
903 if (helper->mail_op != NULL)
904 modest_mail_operation_queue_remove (modest_runtime_get_mail_operation_queue (), helper->mail_op);
908 ReplyForwardHelper *rf_helper = (ReplyForwardHelper *) helper->user_data;
909 headers = tny_iterator_get_list (helper->iter);
910 g_object_unref (G_OBJECT (headers));
911 g_object_unref (G_OBJECT (helper->iter));
912 g_object_unref (G_OBJECT (helper->mail_op));
913 if (rf_helper != NULL) {
914 g_free (rf_helper->account_name);
915 g_slice_free (ReplyForwardHelper, rf_helper);
917 g_slice_free (GetMsgAsyncHelper, helper);
920 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
921 modest_mail_operation_process_msg (helper->mail_op, header, helper->num_ops, get_msg_cb, helper);
923 g_object_unref (G_OBJECT(header));
928 modest_ui_actions_on_header_selected (ModestHeaderView *header_view,
930 ModestMainWindow *main_window)
932 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
934 /* If no header has been selected then exit */
938 /* Update Main window title */
939 if (GTK_WIDGET_HAS_FOCUS (header_view)) {
940 const gchar *subject = tny_header_get_subject (header);
941 if (subject && strcmp (subject, ""))
942 gtk_window_set_title (GTK_WINDOW (main_window), subject);
944 gtk_window_set_title (GTK_WINDOW (main_window), _("mail_va_no_subject"));
951 modest_ui_actions_on_header_activated (ModestHeaderView *header_view, TnyHeader *header,
952 ModestMainWindow *main_window)
954 ModestWindow *win = NULL;
955 TnyFolder *folder = NULL;
957 TnyFolderType folder_type = TNY_FOLDER_TYPE_UNKNOWN;
958 ModestWindowMgr *mgr;
961 GtkTreeSelection *sel = NULL;
962 GList *sel_list = NULL;
964 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
969 folder = tny_header_get_folder (header);
971 g_printerr ("modest: cannot get folder for header\n");
974 if (modest_tny_folder_is_local_folder (folder))
975 folder_type = modest_tny_folder_get_local_folder_type (folder);
977 /* FIXME: make async?; check error */
978 msg = tny_folder_get_msg (folder, header, NULL);
980 g_printerr ("modest: cannot get msg for header\n");
984 /* Look if we already have a message view for that header */
985 mgr = modest_runtime_get_window_mgr ();
986 win = modest_window_mgr_find_window_by_msguid (mgr, tny_header_get_uid (header));
988 /* If not, create a new window */
992 account = g_strdup(modest_window_get_active_account(MODEST_WINDOW(main_window)));
994 account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
996 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (header_view));
997 sel_list = gtk_tree_selection_get_selected_rows (sel, &model);
998 if (sel_list != NULL) {
999 gtk_tree_model_get_iter (model, &iter, (GtkTreePath *) sel_list->data);
1001 switch (folder_type) {
1002 case TNY_FOLDER_TYPE_DRAFTS:
1003 win = modest_msg_edit_window_new (msg, account);
1006 win = modest_msg_view_window_new_with_header_model (msg, account, model, iter);
1009 g_list_foreach (sel_list, (GFunc) gtk_tree_path_free, NULL);
1010 g_list_free (sel_list);
1012 win = modest_msg_view_window_new (msg, account);
1014 modest_window_mgr_register_window (mgr, win);
1016 gtk_window_set_transient_for (GTK_WINDOW (win),
1017 GTK_WINDOW (main_window));
1020 gtk_widget_show_all (GTK_WIDGET(win));
1022 g_object_unref (G_OBJECT (msg));
1025 g_object_unref (G_OBJECT (folder));
1029 modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
1030 TnyFolderStore *folder_store,
1032 ModestMainWindow *main_window)
1035 GtkWidget *header_view;
1037 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1039 header_view = modest_main_window_get_child_widget(main_window,
1040 MODEST_WIDGET_TYPE_HEADER_VIEW);
1044 conf = modest_runtime_get_conf ();
1046 if (TNY_IS_FOLDER (folder_store)) {
1048 modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS);
1051 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view),
1052 TNY_FOLDER (folder_store));
1053 modest_widget_memory_restore (conf, G_OBJECT(header_view),
1054 MODEST_CONF_HEADER_VIEW_KEY);
1056 modest_widget_memory_save (conf, G_OBJECT (header_view), MODEST_CONF_HEADER_VIEW_KEY);
1057 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), NULL);
1059 } else if (TNY_IS_ACCOUNT (folder_store)) {
1061 modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS);
1066 modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemType type,
1073 item = (type == MODEST_ITEM_TYPE_FOLDER) ? "folder" : "message";
1075 if (g_main_depth > 0)
1076 gdk_threads_enter ();
1077 online = tny_device_is_online (modest_runtime_get_device());
1080 /* already online -- the item is simply not there... */
1081 dialog = gtk_message_dialog_new (GTK_WINDOW (win),
1083 GTK_MESSAGE_WARNING,
1085 _("The %s you selected cannot be found"),
1087 gtk_dialog_run (GTK_DIALOG(dialog));
1089 dialog = gtk_dialog_new_with_buttons (_("Connection requested"),
1093 GTK_RESPONSE_REJECT,
1095 GTK_RESPONSE_ACCEPT,
1097 txt = g_strdup_printf (_("This %s is not available in offline mode.\n"
1098 "Do you want to get online?"), item);
1099 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1100 gtk_label_new (txt), FALSE, FALSE, 0);
1101 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1104 gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300);
1105 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
1106 // modest_platform_connect_and_wait ();;
1109 gtk_widget_destroy (dialog);
1110 if (g_main_depth > 0)
1111 gdk_threads_leave ();
1115 modest_ui_actions_on_msg_link_hover (ModestMsgView *msgview, const gchar* link,
1118 g_message ("%s %s", __FUNCTION__, link);
1123 modest_ui_actions_on_msg_link_clicked (ModestMsgView *msgview, const gchar* link,
1126 modest_platform_activate_uri (link);
1130 modest_ui_actions_on_msg_link_contextual (ModestMsgView *msgview, const gchar* link,
1133 modest_platform_show_uri_popup (link);
1137 modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, TnyMimePart *mime_part,
1140 g_message (__FUNCTION__);
1145 modest_ui_actions_on_msg_recpt_activated (ModestMsgView *msgview,
1146 const gchar *address,
1149 g_message ("%s %s", __FUNCTION__, address);
1153 modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edit_window)
1155 TnyTransportAccount *transport_account;
1156 ModestMailOperation *mail_operation;
1158 gchar *account_name, *from;
1159 ModestAccountMgr *account_mgr;
1161 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
1163 data = modest_msg_edit_window_get_msg_data (edit_window);
1165 account_mgr = modest_runtime_get_account_mgr();
1166 account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
1168 account_name = modest_account_mgr_get_default_account (account_mgr);
1169 if (!account_name) {
1170 g_printerr ("modest: no account found\n");
1171 modest_msg_edit_window_free_msg_data (edit_window, data);
1175 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_tny_account_by_account
1176 (modest_runtime_get_account_store(),
1178 TNY_ACCOUNT_TYPE_TRANSPORT));
1179 if (!transport_account) {
1180 g_printerr ("modest: no transport account found for '%s'\n", account_name);
1181 g_free (account_name);
1182 modest_msg_edit_window_free_msg_data (edit_window, data);
1185 from = modest_account_mgr_get_from_string (account_mgr, account_name);
1187 /* Create the mail operation */
1188 mail_operation = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_INFO, G_OBJECT(edit_window));
1189 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
1191 modest_mail_operation_save_to_drafts (mail_operation,
1201 data->priority_flags);
1204 g_free (account_name);
1205 g_object_unref (G_OBJECT (transport_account));
1206 g_object_unref (G_OBJECT (mail_operation));
1208 modest_msg_edit_window_free_msg_data (edit_window, data);
1210 /* Save settings and close the window */
1211 gtk_widget_destroy (GTK_WIDGET (edit_window));
1214 modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
1216 TnyTransportAccount *transport_account;
1217 ModestMailOperation *mail_operation;
1219 gchar *account_name, *from;
1220 ModestAccountMgr *account_mgr;
1222 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
1224 if (!modest_msg_edit_window_check_names (edit_window))
1227 data = modest_msg_edit_window_get_msg_data (edit_window);
1229 /* FIXME: Code added just for testing. The final version will
1230 use the send queue provided by tinymail and some
1232 account_mgr = modest_runtime_get_account_mgr();
1233 account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
1235 account_name = modest_account_mgr_get_default_account (account_mgr);
1236 if (!account_name) {
1237 g_printerr ("modest: no account found\n");
1238 modest_msg_edit_window_free_msg_data (edit_window, data);
1242 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_transport_account_for_open_connection
1243 (modest_runtime_get_account_store(),
1245 if (!transport_account) {
1246 g_printerr ("modest: no transport account found for '%s'\n", account_name);
1247 g_free (account_name);
1248 modest_msg_edit_window_free_msg_data (edit_window, data);
1251 from = modest_account_mgr_get_from_string (account_mgr, account_name);
1253 /* Create the mail operation */
1254 mail_operation = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_SEND, G_OBJECT(edit_window));
1255 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
1257 modest_mail_operation_send_new_mail (mail_operation,
1267 data->priority_flags);
1270 g_free (account_name);
1271 g_object_unref (G_OBJECT (transport_account));
1272 g_object_unref (G_OBJECT (mail_operation));
1274 modest_msg_edit_window_free_msg_data (edit_window, data);
1276 /* Save settings and close the window */
1277 gtk_widget_destroy (GTK_WIDGET (edit_window));
1281 modest_ui_actions_on_toggle_bold (GtkToggleAction *action,
1282 ModestMsgEditWindow *window)
1284 ModestMsgEditFormatState *format_state = NULL;
1286 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1287 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1289 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1292 format_state = modest_msg_edit_window_get_format_state (window);
1293 g_return_if_fail (format_state != NULL);
1295 format_state->bold = gtk_toggle_action_get_active (action);
1296 modest_msg_edit_window_set_format_state (window, format_state);
1297 g_free (format_state);
1302 modest_ui_actions_on_toggle_italics (GtkToggleAction *action,
1303 ModestMsgEditWindow *window)
1305 ModestMsgEditFormatState *format_state = NULL;
1307 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1308 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1310 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1313 format_state = modest_msg_edit_window_get_format_state (window);
1314 g_return_if_fail (format_state != NULL);
1316 format_state->italics = gtk_toggle_action_get_active (action);
1317 modest_msg_edit_window_set_format_state (window, format_state);
1318 g_free (format_state);
1323 modest_ui_actions_on_toggle_bullets (GtkToggleAction *action,
1324 ModestMsgEditWindow *window)
1326 ModestMsgEditFormatState *format_state = NULL;
1328 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1329 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1331 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1334 format_state = modest_msg_edit_window_get_format_state (window);
1335 g_return_if_fail (format_state != NULL);
1337 format_state->bullet = gtk_toggle_action_get_active (action);
1338 modest_msg_edit_window_set_format_state (window, format_state);
1339 g_free (format_state);
1344 modest_ui_actions_on_change_justify (GtkRadioAction *action,
1345 GtkRadioAction *selected,
1346 ModestMsgEditWindow *window)
1348 ModestMsgEditFormatState *format_state = NULL;
1349 GtkJustification value;
1351 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1353 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1356 value = gtk_radio_action_get_current_value (selected);
1358 format_state = modest_msg_edit_window_get_format_state (window);
1359 g_return_if_fail (format_state != NULL);
1361 format_state->justification = value;
1362 modest_msg_edit_window_set_format_state (window, format_state);
1363 g_free (format_state);
1367 modest_ui_actions_on_select_editor_color (GtkAction *action,
1368 ModestMsgEditWindow *window)
1370 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1371 g_return_if_fail (GTK_IS_ACTION (action));
1373 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1376 modest_msg_edit_window_select_color (window);
1380 modest_ui_actions_on_select_editor_background_color (GtkAction *action,
1381 ModestMsgEditWindow *window)
1383 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1384 g_return_if_fail (GTK_IS_ACTION (action));
1386 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1389 modest_msg_edit_window_select_background_color (window);
1393 modest_ui_actions_on_insert_image (GtkAction *action,
1394 ModestMsgEditWindow *window)
1396 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1397 g_return_if_fail (GTK_IS_ACTION (action));
1399 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1402 modest_msg_edit_window_insert_image (window);
1406 * Shows a dialog with an entry that asks for some text. The returned
1407 * value must be freed by the caller. The dialog window title will be
1411 ask_for_folder_name (GtkWindow *parent_window,
1414 GtkWidget *dialog, *entry;
1415 gchar *folder_name = NULL;
1417 /* Ask for folder name */
1418 dialog = gtk_dialog_new_with_buttons (_("New Folder Name"),
1422 GTK_RESPONSE_REJECT,
1424 GTK_RESPONSE_ACCEPT,
1426 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1427 gtk_label_new(title),
1430 entry = gtk_entry_new_with_max_length (40);
1431 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1435 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1437 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
1438 folder_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
1440 gtk_widget_destroy (dialog);
1446 modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_window)
1448 TnyFolderStore *parent_folder;
1449 GtkWidget *folder_view;
1451 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1453 folder_view = modest_main_window_get_child_widget (main_window,
1454 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1458 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1460 if (parent_folder) {
1461 gboolean finished = FALSE;
1463 gchar *folder_name = NULL, *suggested_name = NULL;
1465 /* Run the new folder dialog */
1467 result = modest_platform_run_new_folder_dialog (GTK_WINDOW (main_window),
1472 if (result == GTK_RESPONSE_REJECT) {
1475 ModestMailOperation *mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_INFO, G_OBJECT(main_window));
1476 TnyFolder *new_folder = NULL;
1478 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1481 new_folder = modest_mail_operation_create_folder (mail_op,
1483 (const gchar *) folder_name);
1485 g_object_unref (new_folder);
1489 /* /\* TODO: check error and follow proper actions *\/ */
1490 /* /\* suggested_name = X; *\/ */
1491 /* /\* Show error to the user *\/ */
1492 /* modest_platform_run_information_dialog (GTK_WINDOW (main_window), */
1493 /* MODEST_INFORMATION_CREATE_FOLDER); */
1495 g_object_unref (mail_op);
1497 g_free (folder_name);
1501 g_object_unref (parent_folder);
1506 modest_ui_actions_on_rename_folder (GtkAction *action,
1507 ModestMainWindow *main_window)
1509 TnyFolderStore *folder;
1510 GtkWidget *folder_view;
1512 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1514 folder_view = modest_main_window_get_child_widget (main_window,
1515 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1519 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1521 if (folder && TNY_IS_FOLDER (folder)) {
1523 folder_name = ask_for_folder_name (GTK_WINDOW (main_window),
1524 _("Please enter a new name for the folder"));
1526 if (folder_name != NULL && strlen (folder_name) > 0) {
1527 ModestMailOperation *mail_op;
1529 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_INFO, G_OBJECT(main_window));
1530 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1533 modest_mail_operation_rename_folder (mail_op,
1534 TNY_FOLDER (folder),
1535 (const gchar *) folder_name);
1537 g_object_unref (mail_op);
1538 g_free (folder_name);
1540 g_object_unref (folder);
1545 delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
1547 TnyFolderStore *folder;
1548 GtkWidget *folder_view;
1552 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1554 folder_view = modest_main_window_get_child_widget (main_window,
1555 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1559 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
1562 message = g_strdup_printf (_("mcen_nc_delete_folder_text"),
1563 tny_folder_get_name (TNY_FOLDER (folder)));
1564 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (main_window),
1565 (const gchar *) message);
1568 if (response == GTK_RESPONSE_OK) {
1569 ModestMailOperation *mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_DELETE, G_OBJECT(main_window));
1571 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1573 modest_mail_operation_remove_folder (mail_op, TNY_FOLDER (folder), move_to_trash);
1575 /* Show error if happened */
1576 if (modest_mail_operation_get_error (mail_op))
1577 modest_platform_run_information_dialog (GTK_WINDOW (main_window),
1578 MODEST_INFORMATION_DELETE_FOLDER);
1580 g_object_unref (G_OBJECT (mail_op));
1583 g_object_unref (G_OBJECT (folder));
1587 modest_ui_actions_on_delete_folder (GtkAction *action,
1588 ModestMainWindow *main_window)
1590 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1592 delete_folder (main_window, FALSE);
1596 modest_ui_actions_on_move_folder_to_trash_folder (GtkAction *action, ModestMainWindow *main_window)
1598 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1600 delete_folder (main_window, TRUE);
1604 modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
1605 const gchar* account_name,
1609 ModestMainWindow *main_window)
1612 GtkWidget *dialog, *entry, *remember_pass_check;
1614 dialog = gtk_dialog_new_with_buttons (_("Password requested"),
1618 GTK_RESPONSE_REJECT,
1620 GTK_RESPONSE_ACCEPT,
1622 gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(main_window));
1624 txt = g_strdup_printf (_("Please enter your password for %s"), account_name);
1625 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt),
1629 entry = gtk_entry_new_with_max_length (40);
1630 gtk_entry_set_visibility (GTK_ENTRY(entry), FALSE);
1631 gtk_entry_set_invisible_char (GTK_ENTRY(entry), 0x2022); /* bullet unichar */
1633 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry,
1636 remember_pass_check = gtk_check_button_new_with_label (_("Remember password"));
1637 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check,
1640 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1642 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
1643 *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry)));
1650 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check)))
1655 gtk_widget_destroy (dialog);
1659 modest_ui_actions_on_cut (GtkAction *action,
1660 ModestWindow *window)
1662 GtkWidget *focused_widget;
1664 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1665 if (GTK_IS_EDITABLE (focused_widget)) {
1666 gtk_editable_cut_clipboard (GTK_EDITABLE(focused_widget));
1667 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1668 GtkTextBuffer *buffer;
1669 GtkClipboard *clipboard;
1671 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1672 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1673 gtk_text_buffer_cut_clipboard (buffer, clipboard, TRUE);
1678 modest_ui_actions_on_copy (GtkAction *action,
1679 ModestWindow *window)
1681 GtkClipboard *clipboard;
1682 GtkWidget *focused_widget;
1684 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1685 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1686 if (GTK_IS_LABEL (focused_widget)) {
1687 gtk_clipboard_set_text (clipboard, gtk_label_get_text (GTK_LABEL (focused_widget)), -1);
1688 } else if (GTK_IS_EDITABLE (focused_widget)) {
1689 gtk_editable_copy_clipboard (GTK_EDITABLE(focused_widget));
1690 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1691 GtkTextBuffer *buffer;
1693 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1694 gtk_text_buffer_copy_clipboard (buffer, clipboard);
1699 modest_ui_actions_on_undo (GtkAction *action,
1700 ModestWindow *window)
1702 if (MODEST_IS_MSG_EDIT_WINDOW (window)) {
1703 modest_msg_edit_window_undo (MODEST_MSG_EDIT_WINDOW (window));
1705 g_return_if_reached ();
1710 modest_ui_actions_on_paste (GtkAction *action,
1711 ModestWindow *window)
1713 GtkWidget *focused_widget;
1715 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1716 if (GTK_IS_EDITABLE (focused_widget)) {
1717 gtk_editable_paste_clipboard (GTK_EDITABLE(focused_widget));
1718 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1719 GtkTextBuffer *buffer;
1720 GtkClipboard *clipboard;
1722 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1723 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1724 gtk_text_buffer_paste_clipboard (buffer, clipboard, NULL, TRUE);
1729 modest_ui_actions_on_select_all (GtkAction *action,
1730 ModestWindow *window)
1732 GtkWidget *focused_widget;
1734 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1735 if (GTK_IS_LABEL (focused_widget)) {
1736 gtk_label_select_region (GTK_LABEL (focused_widget), 0, -1);
1737 } else if (GTK_IS_EDITABLE (focused_widget)) {
1738 gtk_editable_select_region (GTK_EDITABLE(focused_widget), 0, -1);
1739 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1740 GtkTextBuffer *buffer;
1741 GtkTextIter start, end;
1743 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1744 gtk_text_buffer_get_start_iter (buffer, &start);
1745 gtk_text_buffer_get_end_iter (buffer, &end);
1746 gtk_text_buffer_select_range (buffer, &start, &end);
1751 modest_ui_actions_on_change_zoom (GtkRadioAction *action,
1752 GtkRadioAction *selected,
1753 ModestWindow *window)
1757 value = gtk_radio_action_get_current_value (selected);
1758 if (MODEST_IS_WINDOW (window)) {
1759 modest_window_set_zoom (MODEST_WINDOW (window), ((gdouble)value)/100);
1763 void modest_ui_actions_msg_edit_on_change_priority (GtkRadioAction *action,
1764 GtkRadioAction *selected,
1765 ModestWindow *window)
1767 TnyHeaderFlags flags;
1768 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1770 flags = gtk_radio_action_get_current_value (selected);
1771 modest_msg_edit_window_set_priority_flags (MODEST_MSG_EDIT_WINDOW (window), flags);
1774 void modest_ui_actions_msg_edit_on_change_file_format (GtkRadioAction *action,
1775 GtkRadioAction *selected,
1776 ModestWindow *window)
1780 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1782 file_format = gtk_radio_action_get_current_value (selected);
1783 modest_msg_edit_window_set_file_format (MODEST_MSG_EDIT_WINDOW (window), file_format);
1788 modest_ui_actions_on_zoom_plus (GtkAction *action,
1789 ModestWindow *window)
1791 g_return_if_fail (MODEST_IS_WINDOW (window));
1793 modest_window_zoom_plus (MODEST_WINDOW (window));
1797 modest_ui_actions_on_zoom_minus (GtkAction *action,
1798 ModestWindow *window)
1800 g_return_if_fail (MODEST_IS_WINDOW (window));
1802 modest_window_zoom_minus (MODEST_WINDOW (window));
1806 modest_ui_actions_on_toggle_fullscreen (GtkToggleAction *toggle,
1807 ModestWindow *window)
1809 ModestWindowMgr *mgr;
1810 gboolean fullscreen, active;
1811 g_return_if_fail (MODEST_IS_WINDOW (window));
1813 mgr = modest_runtime_get_window_mgr ();
1815 active = (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle)))?1:0;
1816 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
1818 if (active != fullscreen) {
1819 modest_window_mgr_set_fullscreen_mode (mgr, active);
1820 gtk_window_present (GTK_WINDOW (window));
1825 modest_ui_actions_on_change_fullscreen (GtkAction *action,
1826 ModestWindow *window)
1828 ModestWindowMgr *mgr;
1829 gboolean fullscreen;
1831 g_return_if_fail (MODEST_IS_WINDOW (window));
1833 mgr = modest_runtime_get_window_mgr ();
1834 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
1835 modest_window_mgr_set_fullscreen_mode (mgr, !fullscreen);
1837 gtk_window_present (GTK_WINDOW (window));
1841 * Used by modest_ui_actions_on_details to call do_headers_action
1844 headers_action_show_details (TnyHeader *header,
1845 ModestWindow *window,
1852 dialog = modest_details_dialog_new_with_header (GTK_WINDOW (window), header);
1855 gtk_widget_show_all (dialog);
1856 gtk_dialog_run (GTK_DIALOG (dialog));
1858 gtk_widget_destroy (dialog);
1862 * Show the folder details in a ModestDetailsDialog widget
1865 show_folder_details (TnyFolder *folder,
1871 dialog = modest_details_dialog_new_with_folder (window, folder);
1874 gtk_widget_show_all (dialog);
1875 gtk_dialog_run (GTK_DIALOG (dialog));
1877 gtk_widget_destroy (dialog);
1881 * Show the header details in a ModestDetailsDialog widget
1884 modest_ui_actions_on_details (GtkAction *action,
1887 TnyList * headers_list;
1891 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1894 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1898 headers_list = get_selected_headers (win);
1902 iter = tny_list_create_iterator (headers_list);
1904 header = TNY_HEADER (tny_iterator_get_current (iter));
1905 headers_action_show_details (header, win, NULL);
1906 g_object_unref (header);
1908 g_object_unref (iter);
1910 } else if (MODEST_IS_MAIN_WINDOW (win)) {
1911 GtkWidget *folder_view, *header_view;
1913 /* Check which widget has the focus */
1914 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
1915 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1916 if (gtk_widget_is_focus (folder_view)) {
1919 folder = (TnyFolder *) modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
1921 /* Show only when it's a folder */
1922 if (!folder || !TNY_IS_FOLDER (folder))
1925 show_folder_details (folder, GTK_WINDOW (win));
1928 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
1929 MODEST_WIDGET_TYPE_HEADER_VIEW);
1930 /* Show details of each header */
1931 do_headers_action (win, headers_action_show_details, header_view);
1937 modest_ui_actions_on_toggle_show_cc (GtkToggleAction *toggle,
1938 ModestMsgEditWindow *window)
1940 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1942 modest_msg_edit_window_show_cc (window, gtk_toggle_action_get_active (toggle));
1946 modest_ui_actions_on_toggle_show_bcc (GtkToggleAction *toggle,
1947 ModestMsgEditWindow *window)
1949 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1951 modest_msg_edit_window_show_bcc (window, gtk_toggle_action_get_active (toggle));
1955 modest_ui_actions_toggle_folders_view (GtkAction *action,
1956 ModestMainWindow *main_window)
1960 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1962 conf = modest_runtime_get_conf ();
1964 if (modest_main_window_get_style (main_window) == MODEST_MAIN_WINDOW_STYLE_SPLIT)
1965 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SIMPLE);
1967 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SPLIT);
1971 modest_ui_actions_on_toggle_toolbar (GtkToggleAction *toggle,
1972 ModestWindow *window)
1974 gboolean active, fullscreen = FALSE;
1975 ModestWindowMgr *mgr;
1977 active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle));
1979 /* Check if we want to toggle the toolbar vuew in fullscreen
1981 if (!strcmp (gtk_action_get_name (GTK_ACTION (toggle)),
1982 "ViewShowToolbarFullScreen")) {
1986 /* Toggle toolbar */
1987 mgr = modest_runtime_get_window_mgr ();
1988 modest_window_mgr_show_toolbars (mgr, active, fullscreen);
1992 modest_ui_actions_msg_edit_on_select_font (GtkAction *action,
1993 ModestMsgEditWindow *window)
1995 modest_msg_edit_window_select_font (window);
1999 modest_ui_actions_on_folder_display_name_changed (ModestFolderView *folder_view,
2000 const gchar *display_name,
2003 /* Do not change the application name if the widget has not
2004 the focus. This callback could be called even if the folder
2005 view has not the focus, because the handled signal could be
2006 emitted when the folder view is redrawn */
2007 if (gtk_widget_is_focus (GTK_WIDGET (folder_view))) {
2009 gtk_window_set_title (window, display_name);
2011 gtk_window_set_title (window, " ");
2016 modest_ui_actions_on_select_contacts (GtkAction *action, ModestMsgEditWindow *window)
2018 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2019 modest_msg_edit_window_select_contacts (window);
2023 modest_ui_actions_on_check_names (GtkAction *action, ModestMsgEditWindow *window)
2025 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2026 modest_msg_edit_window_check_names (window);
2031 create_move_to_dialog (ModestWindow *win,
2032 GtkWidget *folder_view,
2033 GtkWidget **tree_view)
2035 GtkWidget *dialog, *scroll;
2037 dialog = gtk_dialog_new_with_buttons (_("mcen_ti_moveto_folders_title"),
2039 GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR | GTK_DIALOG_DESTROY_WITH_PARENT,
2041 GTK_RESPONSE_ACCEPT,
2043 GTK_RESPONSE_REJECT,
2046 /* Create scrolled window */
2047 scroll = gtk_scrolled_window_new (NULL, NULL);
2048 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
2049 GTK_POLICY_AUTOMATIC,
2050 GTK_POLICY_AUTOMATIC);
2052 /* Create folder view */
2053 *tree_view = modest_folder_view_new (NULL);
2054 gtk_tree_view_set_model (GTK_TREE_VIEW (*tree_view),
2055 gtk_tree_view_get_model (GTK_TREE_VIEW (folder_view)));
2056 gtk_container_add (GTK_CONTAINER (scroll), *tree_view);
2058 /* Add scroll to dialog */
2059 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
2060 scroll, FALSE, FALSE, 0);
2062 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
2068 * Returns TRUE if at least one of the headers of the list belongs to
2069 * a message that has been fully retrieved.
2072 has_retrieved_msgs (TnyList *list)
2075 gboolean found = FALSE;
2077 iter = tny_list_create_iterator (list);
2078 while (tny_iterator_is_done (iter) && !found) {
2080 TnyHeaderFlags flags;
2082 header = TNY_HEADER (tny_iterator_get_current (iter));
2083 flags = tny_header_get_flags (header);
2084 if (!(flags & TNY_HEADER_FLAG_PARTIAL))
2088 tny_iterator_next (iter);
2090 g_object_unref (iter);
2096 * Shows a confirmation dialog to the user when we're moving messages
2097 * from a remote server to the local storage. Returns the dialog
2098 * response. If it's other kind of movement the it always returns
2102 msgs_move_to_confirmation (GtkWindow *win,
2103 TnyFolder *dest_folder,
2106 gint response = GTK_RESPONSE_OK;
2108 /* If the destination is a local folder */
2109 if (modest_tny_folder_is_local_folder (dest_folder)) {
2110 TnyFolder *src_folder;
2114 /* Get source folder */
2115 iter = tny_list_create_iterator (headers);
2116 header = TNY_HEADER (tny_iterator_get_current (iter));
2117 src_folder = tny_header_get_folder (header);
2118 g_object_unref (header);
2119 g_object_unref (iter);
2121 /* If the source is a remote folder */
2122 if (!modest_tny_folder_is_local_folder (src_folder)) {
2123 const gchar *message;
2125 if (tny_list_get_length (headers) == 1)
2126 if (has_retrieved_msgs (headers))
2127 message = _("mcen_nc_move_retrieve");
2129 message = _("mcen_nc_move_header");
2131 if (has_retrieved_msgs (headers))
2132 message = _("mcen_nc_move_retrieves");
2134 message = _("mcen_nc_move_headers");
2136 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
2137 (const gchar *) message);
2144 * UI handler for the "Move to" action when invoked from the
2148 modest_ui_actions_on_main_window_move_to (GtkAction *action,
2149 ModestMainWindow *win)
2151 GtkWidget *dialog, *folder_view, *tree_view = NULL;
2153 TnyFolderStore *folder_store;
2154 ModestMailOperation *mail_op = NULL;
2156 g_return_if_fail (MODEST_IS_MAIN_WINDOW (win));
2158 /* Get the folder view */
2159 folder_view = modest_main_window_get_child_widget (win,
2160 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2162 /* Create and run the dialog */
2163 dialog = create_move_to_dialog (MODEST_WINDOW (win), folder_view, &tree_view);
2164 result = gtk_dialog_run (GTK_DIALOG(dialog));
2166 /* We do this to save an indentation level ;-) */
2167 if (result != GTK_RESPONSE_ACCEPT)
2170 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (tree_view));
2172 if (TNY_IS_ACCOUNT (folder_store))
2175 /* Get folder or messages to transfer */
2176 if (gtk_widget_is_focus (folder_view)) {
2177 TnyFolderStore *src_folder;
2178 src_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
2180 if (TNY_IS_FOLDER (src_folder)) {
2181 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE, G_OBJECT(win));
2182 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
2185 modest_mail_operation_xfer_folder (mail_op,
2186 TNY_FOLDER (src_folder),
2189 g_object_unref (G_OBJECT (mail_op));
2193 g_object_unref (G_OBJECT (src_folder));
2195 GtkWidget *header_view;
2196 header_view = modest_main_window_get_child_widget (win,
2197 MODEST_WIDGET_TYPE_HEADER_VIEW);
2198 if (gtk_widget_is_focus (header_view)) {
2202 headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (header_view));
2204 /* Ask for user confirmation */
2205 response = msgs_move_to_confirmation (GTK_WINDOW (win),
2206 TNY_FOLDER (folder_store),
2209 /* Transfer messages */
2210 if (response == GTK_RESPONSE_OK) {
2211 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE, G_OBJECT(win));
2212 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
2215 modest_mail_operation_xfer_msgs (mail_op,
2217 TNY_FOLDER (folder_store),
2219 g_object_unref (G_OBJECT (mail_op));
2223 g_object_unref (folder_store);
2226 gtk_widget_destroy (dialog);
2231 * UI handler for the "Move to" action when invoked from the
2232 * ModestMsgViewWindow
2235 modest_ui_actions_on_msg_view_window_move_to (GtkAction *action,
2236 ModestMsgViewWindow *win)
2238 GtkWidget *dialog, *folder_view, *tree_view = NULL;
2240 ModestMainWindow *main_window;
2245 /* Get the folder view */
2246 main_window = MODEST_MAIN_WINDOW (modest_window_mgr_get_main_window (modest_runtime_get_window_mgr ()));
2247 folder_view = modest_main_window_get_child_widget (main_window,
2248 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2250 /* Create and run the dialog */
2251 dialog = create_move_to_dialog (MODEST_WINDOW (win), folder_view, &tree_view);
2252 result = gtk_dialog_run (GTK_DIALOG(dialog));
2254 if (result == GTK_RESPONSE_ACCEPT) {
2255 TnyFolderStore *folder_store;
2258 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (tree_view));
2260 /* Create header list */
2261 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2262 header = tny_msg_get_header (msg);
2263 headers = tny_simple_list_new ();
2264 tny_list_prepend (headers, G_OBJECT (header));
2265 g_object_unref (header);
2266 g_object_unref (msg);
2268 /* Ask user for confirmation. MSG-NOT404 */
2269 response = msgs_move_to_confirmation (GTK_WINDOW (win),
2270 TNY_FOLDER (folder_store),
2273 /* Transfer current msg */
2274 if (response == GTK_RESPONSE_OK) {
2275 ModestMailOperation *mail_op;
2277 /* Create mail op */
2278 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE, G_OBJECT(win));
2279 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
2282 /* Transfer messages */
2283 modest_mail_operation_xfer_msgs (mail_op,
2285 TNY_FOLDER (folder_store),
2287 g_object_unref (G_OBJECT (mail_op));
2289 g_object_unref (headers);
2291 g_object_unref (folder_store);
2293 gtk_widget_destroy (dialog);
2297 modest_ui_actions_on_move_to (GtkAction *action,
2300 g_return_if_fail (MODEST_IS_MAIN_WINDOW (win) ||
2301 MODEST_IS_MSG_VIEW_WINDOW (win));
2303 if (MODEST_IS_MAIN_WINDOW (win))
2304 modest_ui_actions_on_main_window_move_to (action,
2305 MODEST_MAIN_WINDOW (win));
2307 modest_ui_actions_on_msg_view_window_move_to (action,
2308 MODEST_MSG_VIEW_WINDOW (win));
2312 * Calls #HeadersFunc for each header already selected in the main
2313 * window or the message currently being shown in the msg view window
2316 do_headers_action (ModestWindow *win,
2320 TnyList *headers_list;
2324 headers_list = get_selected_headers (win);
2328 /* Call the function for each header */
2329 iter = tny_list_create_iterator (headers_list);
2330 while (!tny_iterator_is_done (iter)) {
2333 header = TNY_HEADER (tny_iterator_get_current (iter));
2334 func (header, win, user_data);
2335 g_object_unref (header);
2336 tny_iterator_next (iter);
2338 g_object_unref (iter);