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>
35 #include <glib/gprintf.h>
37 #include <modest-runtime.h>
38 #include <modest-tny-folder.h>
39 #include <modest-tny-msg.h>
40 #include <modest-tny-account.h>
41 #include <modest-address-book.h>
42 #include "modest-error.h"
43 #include "modest-ui-actions.h"
45 #include "modest-tny-platform-factory.h"
46 #include "modest-platform.h"
48 #ifdef MODEST_PLATFORM_MAEMO
49 #include "maemo/modest-osso-state-saving.h"
50 #endif /* MODEST_PLATFORM_MAEMO */
52 #include "widgets/modest-ui-constants.h"
53 #include <widgets/modest-main-window.h>
54 #include <widgets/modest-msg-view-window.h>
55 #include <widgets/modest-account-view-window.h>
56 #include <widgets/modest-details-dialog.h>
57 #include <widgets/modest-attachments-view.h>
58 #include "widgets/modest-folder-view.h"
59 #include "widgets/modest-global-settings-dialog.h"
60 #include "modest-connection-specific-smtp-window.h"
61 #include "modest-account-mgr-helpers.h"
62 #include "modest-mail-operation.h"
63 #include "modest-text-utils.h"
65 #ifdef MODEST_HAVE_EASYSETUP
66 #include "easysetup/modest-easysetup-wizard.h"
67 #endif /* MODEST_HAVE_EASYSETUP */
69 #include <modest-widget-memory.h>
70 #include <tny-error.h>
71 #include <tny-simple-list.h>
72 #include <tny-msg-view.h>
73 #include <tny-device.h>
74 #include <tny-merge-folder.h>
76 #include <gtkhtml/gtkhtml.h>
78 typedef struct _GetMsgAsyncHelper {
80 ModestMailOperation *mail_op;
87 typedef enum _ReplyForwardAction {
93 typedef struct _ReplyForwardHelper {
94 guint reply_forward_type;
95 ReplyForwardAction action;
97 GtkWidget *parent_window;
102 * The do_headers_action uses this kind of functions to perform some
103 * action to each member of a list of headers
105 typedef void (*HeadersFunc) (TnyHeader *header, ModestWindow *win, gpointer user_data);
108 do_headers_action (ModestWindow *win,
113 static void open_msg_cb (ModestMailOperation *mail_op,
118 static void reply_forward_cb (ModestMailOperation *mail_op,
123 static void reply_forward (ReplyForwardAction action, ModestWindow *win);
126 static void _on_send_receive_progress_changed (ModestMailOperation *mail_op,
127 ModestMailOperationState *state,
133 run_account_setup_wizard (ModestWindow *win)
135 ModestEasysetupWizardDialog *wizard;
137 g_return_if_fail (MODEST_IS_WINDOW(win));
139 wizard = modest_easysetup_wizard_dialog_new ();
140 gtk_window_set_transient_for (GTK_WINDOW (wizard), GTK_WINDOW (win));
141 gtk_dialog_run (GTK_DIALOG (wizard));
142 gtk_widget_destroy (GTK_WIDGET (wizard));
147 modest_ui_actions_on_about (GtkAction *action, ModestWindow *win)
150 const gchar *authors[] = {
151 "Dirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>",
154 about = gtk_about_dialog_new ();
155 gtk_about_dialog_set_name (GTK_ABOUT_DIALOG(about), PACKAGE_NAME);
156 gtk_about_dialog_set_version (GTK_ABOUT_DIALOG(about),PACKAGE_VERSION);
157 gtk_about_dialog_set_copyright (GTK_ABOUT_DIALOG(about),
158 _("Copyright (c) 2006, Nokia Corporation\n"
159 "All rights reserved."));
160 gtk_about_dialog_set_comments (GTK_ABOUT_DIALOG(about),
161 _("a modest e-mail client\n\n"
162 "design and implementation: Dirk-Jan C. Binnema\n"
163 "contributions from the fine people at KC and Ig\n"
164 "uses the tinymail email framework written by Philip van Hoof"));
165 gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG(about), authors);
166 gtk_about_dialog_set_website (GTK_ABOUT_DIALOG(about), "http://modest.garage.maemo.org");
168 gtk_dialog_run (GTK_DIALOG (about));
169 gtk_widget_destroy(about);
173 * Gets the list of currently selected messages. If the win is the
174 * main window, then it returns a newly allocated list of the headers
175 * selected in the header view. If win is the msg view window, then
176 * the value returned is a list with just a single header.
178 * The caller of this funcion must free the list.
181 get_selected_headers (ModestWindow *win)
183 if (MODEST_IS_MAIN_WINDOW(win)) {
184 GtkWidget *header_view;
186 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
187 MODEST_WIDGET_TYPE_HEADER_VIEW);
188 return modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
190 } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
191 /* for MsgViewWindows, we simply return a list with one element */
193 TnyList *list = NULL;
195 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
196 if (header != NULL) {
197 list = tny_simple_list_new ();
198 tny_list_prepend (list, G_OBJECT(header));
199 g_object_unref (G_OBJECT(header));
209 headers_action_mark_as_read (TnyHeader *header,
213 TnyHeaderFlags flags;
215 g_return_if_fail (TNY_IS_HEADER(header));
217 flags = tny_header_get_flags (header);
218 if (flags & TNY_HEADER_FLAG_SEEN) return;
219 tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN);
223 headers_action_mark_as_unread (TnyHeader *header,
227 TnyHeaderFlags flags;
229 g_return_if_fail (TNY_IS_HEADER(header));
231 flags = tny_header_get_flags (header);
232 if (flags & TNY_HEADER_FLAG_SEEN) {
233 tny_header_unset_flags (header, TNY_HEADER_FLAG_SEEN);
239 headers_action_delete (TnyHeader *header,
243 ModestMailOperation *mail_op = NULL;
245 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_DELETE, G_OBJECT(win));
246 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
249 /* Always delete. TODO: Move to trash still not supported */
250 modest_mail_operation_remove_msg (mail_op, header, FALSE);
251 g_object_unref (G_OBJECT (mail_op));
255 modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win)
257 TnyList *header_list = NULL;
258 TnyIterator *iter = NULL;
259 TnyHeader *header = NULL;
260 gchar *message = NULL;
264 ModestWindowMgr *mgr;
265 GtkWidget *header_view;
267 g_return_if_fail (MODEST_IS_WINDOW(win));
269 /* Check first if the header view has the focus */
270 if (MODEST_IS_MAIN_WINDOW (win)) {
271 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
272 MODEST_WIDGET_TYPE_HEADER_VIEW);
273 if (!gtk_widget_is_focus (header_view))
277 header_list = get_selected_headers (win);
278 if (!header_list) return;
280 /* Check if any of the headers is already opened */
281 iter = tny_list_create_iterator (header_list);
283 mgr = modest_runtime_get_window_mgr ();
284 while (!tny_iterator_is_done (iter) && !found) {
285 header = TNY_HEADER (tny_iterator_get_current (iter));
286 if (modest_window_mgr_find_window_by_header (mgr, header))
288 g_object_unref (header);
289 tny_iterator_next (iter);
291 g_object_unref (iter);
296 num = g_strdup_printf ("%d", tny_list_get_length (header_list));
297 msg = g_strdup_printf (_("mcen_nc_unable_to_delete_n_messages"), num);
299 modest_platform_run_information_dialog (GTK_WINDOW (win), (const gchar *) msg);
303 g_object_unref (header_list);
308 if (tny_list_get_length(header_list) == 1) {
309 iter = tny_list_create_iterator (header_list);
310 header = TNY_HEADER (tny_iterator_get_current (iter));
311 desc = g_strdup_printf ("%s", tny_header_get_subject (header));
312 g_object_unref (header);
313 g_object_unref (iter);
315 message = g_strdup_printf(ngettext("emev_nc_delete_message", "emev_nc_delete_messages",
316 tny_list_get_length(header_list)), desc);
318 /* Confirmation dialog */
319 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
323 if (response == GTK_RESPONSE_OK) {
324 if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
326 g_signal_emit_by_name (G_OBJECT (win), "delete-event", NULL, &ret_value);
330 /* Remove each header */
331 do_headers_action (win, headers_action_delete, NULL);
333 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
334 gtk_widget_destroy (GTK_WIDGET(win));
341 g_object_unref (header_list);
346 modest_ui_actions_on_quit (GtkAction *action, ModestWindow *win)
348 #ifdef MODEST_PLATFORM_MAEMO
349 modest_osso_save_state();
350 #endif /* MODEST_PLATFORM_MAEMO */
352 /* FIXME: we need to cancel all actions/threads here,
359 modest_ui_actions_on_close_window (GtkAction *action, ModestWindow *win)
361 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
362 gtk_widget_destroy (GTK_WIDGET (win));
363 } else if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
365 g_signal_emit_by_name (G_OBJECT (win), "delete-event", NULL, &ret_value);
366 } else if (MODEST_IS_WINDOW (win)) {
367 gtk_widget_destroy (GTK_WIDGET (win));
369 g_return_if_reached ();
374 modest_ui_actions_on_add_to_contacts (GtkAction *action, ModestWindow *win)
376 GtkClipboard *clipboard = NULL;
377 gchar *selection = NULL;
379 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
380 selection = gtk_clipboard_wait_for_text (clipboard);
382 /* Question: why is the clipboard being used here?
383 * It doesn't really make a lot of sense. */
387 modest_address_book_add_address (selection);
393 modest_ui_actions_on_accounts (GtkAction *action, ModestWindow *win)
395 /* This is currently only implemented for Maemo */
396 #ifdef MODEST_PLATFORM_MAEMO /* Defined in config.h */
397 if (!modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE)) {
398 run_account_setup_wizard (win);
401 /* Show the list of accounts: */
402 GtkDialog *account_win = GTK_DIALOG(modest_account_view_window_new ());
403 gtk_window_set_transient_for (GTK_WINDOW (account_win), GTK_WINDOW(win));
404 gtk_dialog_run (account_win);
405 gtk_widget_destroy (GTK_WIDGET(account_win));
408 GtkWidget *dialog, *label;
410 /* Create the widgets */
412 dialog = gtk_dialog_new_with_buttons ("Message",
414 GTK_DIALOG_DESTROY_WITH_PARENT,
418 label = gtk_label_new ("Hello World!");
420 /* Ensure that the dialog box is destroyed when the user responds. */
422 g_signal_connect_swapped (dialog, "response",
423 G_CALLBACK (gtk_widget_destroy),
426 /* Add the label, and show everything we've added to the dialog. */
428 gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox),
430 gtk_widget_show_all (dialog);
431 #endif /* MODEST_PLATFORM_MAEMO */
435 on_smtp_servers_window_hide (GtkWindow* window, gpointer user_data)
437 ModestWindow *main_window = MODEST_WINDOW (user_data);
439 /* Save any changes. */
440 modest_connection_specific_smtp_window_save_server_accounts (
441 MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (window),
442 modest_window_get_active_account (main_window));
443 gtk_widget_destroy (GTK_WIDGET (window));
449 modest_ui_actions_on_smtp_servers (GtkAction *action, ModestWindow *win)
451 /* This is currently only implemented for Maemo,
452 * because it requires an API (libconic) to detect different connection
455 #ifdef MODEST_PLATFORM_MAEMO /* Defined in config.h */
457 /* Create the window if necessary: */
458 const gchar *active_account_name = modest_window_get_active_account (win);
460 /* TODO: Dim the menu item (not in the UI spec)? or show a warning,
461 * or show the default account?
462 * If we show the default account then the account name should be shown in
463 * the window when we show it. */
464 if (!active_account_name) {
465 g_warning ("%s: No account is active.", __FUNCTION__);
469 GtkWidget *specific_window = GTK_WIDGET (modest_connection_specific_smtp_window_new ());
470 modest_connection_specific_smtp_window_fill_with_connections (
471 MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (specific_window),
472 modest_runtime_get_account_mgr(),
473 active_account_name);
475 /* Show the window: */
476 gtk_window_set_transient_for (GTK_WINDOW (specific_window), GTK_WINDOW (win));
477 gtk_window_set_modal (GTK_WINDOW (specific_window), TRUE);
478 gtk_widget_show (specific_window);
480 /* Save changes when the window is hidden: */
481 g_signal_connect (specific_window, "hide",
482 G_CALLBACK (on_smtp_servers_window_hide), win);
483 #endif /* MODEST_PLATFORM_MAEMO */
487 modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win)
489 ModestWindow *msg_win;
491 TnyFolder *folder = NULL;
492 gchar *account_name = NULL;
493 gchar *from_str = NULL;
494 /* GError *err = NULL; */
495 TnyAccount *account = NULL;
496 ModestWindowMgr *mgr;
497 gchar *signature = NULL, *blank_and_signature = NULL;
499 /* if there are no accounts yet, just show the wizard */
500 if (!modest_account_mgr_has_accounts (modest_runtime_get_account_mgr(), TRUE)) {
501 run_account_setup_wizard (win);
505 account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr ());
507 account_name = g_strdup (modest_window_get_active_account (win));
509 g_printerr ("modest: no account found\n");
513 account = modest_tny_account_store_get_server_account (modest_runtime_get_account_store(),
515 TNY_ACCOUNT_TYPE_STORE);
517 g_printerr ("modest: failed to get tnyaccount for '%s'\n", account_name);
521 from_str = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(), account_name);
523 g_printerr ("modest: failed get from string for '%s'\n", account_name);
527 if (modest_account_mgr_get_bool (modest_runtime_get_account_mgr (), account_name,
528 MODEST_ACCOUNT_USE_SIGNATURE, FALSE)) {
529 signature = modest_account_mgr_get_string (modest_runtime_get_account_mgr (), account_name,
530 MODEST_ACCOUNT_SIGNATURE, FALSE);
531 blank_and_signature = g_strconcat ("\n", signature, NULL);
534 blank_and_signature = g_strdup ("");
537 msg = modest_tny_msg_new ("", from_str, "", "", "", blank_and_signature, NULL);
539 g_printerr ("modest: failed to create new msg\n");
543 folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS);
545 g_printerr ("modest: failed to find Drafts folder\n");
550 /* Create and register edit window */
551 /* This is destroyed by TOOD. */
552 msg_win = modest_msg_edit_window_new (msg, account_name);
553 mgr = modest_runtime_get_window_mgr ();
554 modest_window_mgr_register_window (mgr, msg_win);
557 gtk_window_set_transient_for (GTK_WINDOW (msg_win),
559 gtk_widget_show_all (GTK_WIDGET (msg_win));
562 g_free (account_name);
564 g_free (blank_and_signature);
566 g_object_unref (msg_win);
568 g_object_unref (G_OBJECT(account));
570 g_object_unref (G_OBJECT(msg));
572 g_object_unref (G_OBJECT(folder));
576 open_msg_cb (ModestMailOperation *mail_op,
581 ModestWindowMgr *mgr = NULL;
582 ModestWindow *parent_win = NULL;
583 ModestWindow *win = NULL;
584 TnyFolderType folder_type = TNY_FOLDER_TYPE_UNKNOWN;
585 gchar *account = NULL;
588 /* TODO: Show an error? (review the specs) */
592 parent_win = (ModestWindow *) modest_mail_operation_get_source (mail_op);
593 folder = tny_header_get_folder (header);
595 /* Mark header as read */
596 headers_action_mark_as_read (header, MODEST_WINDOW(parent_win), NULL);
599 account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
601 account = g_strdup (modest_window_get_active_account (MODEST_WINDOW (parent_win)));
603 /* Gets folder type (OUTBOX headers will be opened in edit window */
604 if (modest_tny_folder_is_local_folder (folder))
605 folder_type = modest_tny_folder_get_local_folder_type (folder);
607 /* If the header is in the drafts folder then open the editor,
608 else the message view window */
609 if (folder_type == TNY_FOLDER_TYPE_DRAFTS) {
610 /* we cannot edit without a valid account... */
611 if (!modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE)) {
612 run_account_setup_wizard(parent_win);
615 win = modest_msg_edit_window_new (msg, account);
617 gchar *uid = modest_tny_folder_get_header_unique_id (header);
619 if (MODEST_IS_MAIN_WINDOW (parent_win)) {
620 GtkWidget *header_view;
621 GtkTreeSelection *sel;
622 GList *sel_list = NULL;
625 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(parent_win),
626 MODEST_WIDGET_TYPE_HEADER_VIEW);
628 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (header_view));
629 sel_list = gtk_tree_selection_get_selected_rows (sel, &model);
631 if (sel_list != NULL) {
632 GtkTreeRowReference *row_reference;
634 row_reference = gtk_tree_row_reference_new (model, (GtkTreePath *) sel_list->data);
635 g_list_foreach (sel_list, (GFunc) gtk_tree_path_free, NULL);
636 g_list_free (sel_list);
638 win = modest_msg_view_window_new_with_header_model (msg,
643 gtk_tree_row_reference_free (row_reference);
645 win = modest_msg_view_window_new (msg, account, (const gchar*) uid);
648 win = modest_msg_view_window_new (msg, account, (const gchar*) uid);
653 /* Register and show new window */
655 mgr = modest_runtime_get_window_mgr ();
656 modest_window_mgr_register_window (mgr, win);
657 g_object_unref (win);
658 gtk_window_set_transient_for (GTK_WINDOW (win), GTK_WINDOW (parent_win));
659 gtk_widget_show_all (GTK_WIDGET(win));
665 g_object_unref (parent_win);
666 g_object_unref (msg);
667 g_object_unref (folder);
668 g_object_unref (header);
672 * This function is the error handler of the
673 * modest_mail_operation_get_msgs_full operation
676 modest_ui_actions_get_msgs_full_error_handler (ModestMailOperation *mail_op,
681 error = modest_mail_operation_get_error (mail_op);
682 if (error->code == MODEST_MAIL_OPERATION_ERROR_MESSAGE_SIZE_LIMIT) {
683 GObject *win = modest_mail_operation_get_source (mail_op);
685 modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL,
687 g_object_unref (win);
692 * This function is used by both modest_ui_actions_on_open and
693 * modest_ui_actions_on_header_activated. This way we always do the
694 * same when trying to open messages.
697 _modest_ui_actions_open (TnyList *headers, ModestWindow *win)
699 ModestWindowMgr *mgr;
701 ModestMailOperation *mail_op;
702 TnyList *not_opened_headers;
704 /* Look if we already have a message view for each header. If
705 true, then remove the header from the list of headers to
707 mgr = modest_runtime_get_window_mgr ();
708 iter = tny_list_create_iterator (headers);
709 not_opened_headers = tny_simple_list_new ();
710 while (!tny_iterator_is_done (iter)) {
711 ModestWindow *window;
714 header = TNY_HEADER (tny_iterator_get_current (iter));
715 window = modest_window_mgr_find_window_by_header (mgr, header);
716 /* Do not open again the message and present the
717 window to the user */
719 gtk_window_present (GTK_WINDOW (window));
721 tny_list_append (not_opened_headers, G_OBJECT (header));
723 g_object_unref (header);
724 tny_iterator_next (iter);
727 /* Open each message */
728 mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
730 modest_ui_actions_get_msgs_full_error_handler,
732 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
733 if (tny_list_get_length (not_opened_headers) > 1) {
734 modest_mail_operation_get_msgs_full (mail_op,
740 TnyIterator *iter = tny_list_create_iterator (not_opened_headers);
741 TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter));
742 modest_mail_operation_get_msg (mail_op, header, open_msg_cb, NULL);
743 g_object_unref (header);
744 g_object_unref (iter);
748 g_object_unref (not_opened_headers);
749 g_object_unref (iter);
750 g_object_unref (mail_op);
754 modest_ui_actions_on_open (GtkAction *action, ModestWindow *win)
759 headers = get_selected_headers (win);
764 _modest_ui_actions_open (headers, win);
766 g_object_unref(headers);
771 free_reply_forward_helper (gpointer data)
773 ReplyForwardHelper *helper;
775 helper = (ReplyForwardHelper *) data;
776 g_free (helper->account_name);
777 g_slice_free (ReplyForwardHelper, helper);
781 reply_forward_cb (ModestMailOperation *mail_op,
787 ReplyForwardHelper *rf_helper;
788 ModestWindow *msg_win;
789 ModestEditType edit_type;
791 TnyAccount *account = NULL;
792 ModestWindowMgr *mgr;
793 gchar *signature = NULL;
795 g_return_if_fail (user_data != NULL);
796 rf_helper = (ReplyForwardHelper *) user_data;
798 from = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(),
799 rf_helper->account_name);
800 if (modest_account_mgr_get_bool (modest_runtime_get_account_mgr(),
801 rf_helper->account_name,
802 MODEST_ACCOUNT_USE_SIGNATURE, FALSE)) {
803 signature = modest_account_mgr_get_string (modest_runtime_get_account_mgr (),
804 rf_helper->account_name,
805 MODEST_ACCOUNT_SIGNATURE, FALSE);
808 /* Create reply mail */
809 switch (rf_helper->action) {
812 modest_tny_msg_create_reply_msg (msg, from, signature,
813 rf_helper->reply_forward_type,
814 MODEST_TNY_MSG_REPLY_MODE_SENDER);
816 case ACTION_REPLY_TO_ALL:
818 modest_tny_msg_create_reply_msg (msg, from, signature, rf_helper->reply_forward_type,
819 MODEST_TNY_MSG_REPLY_MODE_ALL);
820 edit_type = MODEST_EDIT_TYPE_REPLY;
824 modest_tny_msg_create_forward_msg (msg, from, signature, rf_helper->reply_forward_type);
825 edit_type = MODEST_EDIT_TYPE_FORWARD;
828 g_return_if_reached ();
835 g_printerr ("modest: failed to create message\n");
839 account = modest_tny_account_store_get_server_account (modest_runtime_get_account_store(),
840 rf_helper->account_name,
841 TNY_ACCOUNT_TYPE_STORE);
843 g_printerr ("modest: failed to get tnyaccount for '%s'\n", rf_helper->account_name);
847 /* Create and register the windows */
848 msg_win = modest_msg_edit_window_new (new_msg, rf_helper->account_name);
849 mgr = modest_runtime_get_window_mgr ();
850 modest_window_mgr_register_window (mgr, msg_win);
852 if (rf_helper->parent_window != NULL) {
855 parent_zoom = modest_window_get_zoom (MODEST_WINDOW (rf_helper->parent_window));
856 modest_window_set_zoom (msg_win, parent_zoom);
859 /* Show edit window */
860 gtk_widget_show_all (GTK_WIDGET (msg_win));
864 g_object_unref (msg_win);
866 g_object_unref (G_OBJECT (new_msg));
868 g_object_unref (G_OBJECT (account));
869 g_object_unref (msg);
870 g_object_unref (header);
874 * Checks a list of headers. If any of them are not currently
875 * downloaded (CACHED) then it asks the user for permission to
878 * Returns FALSE if the user does not want to download the
879 * messages. Returns TRUE if the user allowed the download or if all
880 * of them are currently downloaded
883 download_uncached_messages (TnyList *header_list, GtkWindow *win)
886 gboolean found, retval;
888 iter = tny_list_create_iterator (header_list);
890 while (!tny_iterator_is_done (iter) && !found) {
892 TnyHeaderFlags flags;
894 header = TNY_HEADER (tny_iterator_get_current (iter));
895 flags = tny_header_get_flags (header);
896 /* TODO: is this the right flag?, it seems that some
897 headers that have been previously downloaded do not
899 found = !(flags & TNY_HEADER_FLAG_CACHED);
900 g_object_unref (header);
901 tny_iterator_next (iter);
903 g_object_unref (iter);
905 /* Ask for user permission to download the messages */
908 GtkResponseType response;
910 modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
911 _("mcen_nc_get_multi_msg_txt"));
912 if (response == GTK_RESPONSE_CANCEL)
920 * Common code for the reply and forward actions
923 reply_forward (ReplyForwardAction action, ModestWindow *win)
925 ModestMailOperation *mail_op = NULL;
926 TnyList *header_list = NULL;
927 ReplyForwardHelper *rf_helper = NULL;
928 guint reply_forward_type;
929 gboolean continue_download;
931 g_return_if_fail (MODEST_IS_WINDOW(win));
933 /* we need an account when editing */
934 if (!modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE)) {
935 run_account_setup_wizard (win);
939 header_list = get_selected_headers (win);
943 /* Check that the messages have been previously downloaded */
944 continue_download = download_uncached_messages (header_list, GTK_WINDOW (win));
945 if (!continue_download) {
946 g_object_unref (header_list);
951 modest_conf_get_int (modest_runtime_get_conf (),
952 (action == ACTION_FORWARD) ? MODEST_CONF_FORWARD_TYPE : MODEST_CONF_REPLY_TYPE,
954 /* We assume that we can only select messages of the
955 same folder and that we reply all of them from the
956 same account. In fact the interface currently only
957 allows single selection */
960 rf_helper = g_slice_new0 (ReplyForwardHelper);
961 rf_helper->reply_forward_type = reply_forward_type;
962 rf_helper->action = action;
963 rf_helper->account_name = g_strdup (modest_window_get_active_account (win));
964 if ((win != NULL) && (MODEST_IS_WINDOW (win)))
965 rf_helper->parent_window = GTK_WIDGET (win);
966 if (!rf_helper->account_name)
967 rf_helper->account_name =
968 modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
970 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
973 /* Get header and message. Do not free them here, the
974 reply_forward_cb must do it */
975 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW(win));
976 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(win));
977 if (!msg || !header) {
979 g_object_unref (msg);
981 g_object_unref (header);
982 g_printerr ("modest: no message found\n");
985 reply_forward_cb (NULL, header, msg, rf_helper);
987 /* Retrieve messages */
988 mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
990 modest_ui_actions_get_msgs_full_error_handler,
992 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
993 modest_mail_operation_get_msgs_full (mail_op,
997 free_reply_forward_helper);
1000 g_object_unref(mail_op);
1004 g_object_unref (header_list);
1008 modest_ui_actions_on_reply (GtkAction *action, ModestWindow *win)
1010 g_return_if_fail (MODEST_IS_WINDOW(win));
1012 reply_forward (ACTION_REPLY, win);
1016 modest_ui_actions_on_forward (GtkAction *action, ModestWindow *win)
1018 g_return_if_fail (MODEST_IS_WINDOW(win));
1020 reply_forward (ACTION_FORWARD, win);
1024 modest_ui_actions_on_reply_all (GtkAction *action, ModestWindow *win)
1026 g_return_if_fail (MODEST_IS_WINDOW(win));
1028 reply_forward (ACTION_REPLY_TO_ALL, win);
1032 modest_ui_actions_on_next (GtkAction *action,
1033 ModestWindow *window)
1035 if (MODEST_IS_MAIN_WINDOW (window)) {
1036 GtkWidget *header_view;
1038 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
1039 MODEST_WIDGET_TYPE_HEADER_VIEW);
1043 modest_header_view_select_next (MODEST_HEADER_VIEW(header_view));
1044 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
1045 modest_msg_view_window_select_next_message (MODEST_MSG_VIEW_WINDOW (window));
1047 g_return_if_reached ();
1052 modest_ui_actions_on_prev (GtkAction *action,
1053 ModestWindow *window)
1055 g_return_if_fail (MODEST_IS_WINDOW(window));
1057 if (MODEST_IS_MAIN_WINDOW (window)) {
1058 GtkWidget *header_view;
1059 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
1060 MODEST_WIDGET_TYPE_HEADER_VIEW);
1064 modest_header_view_select_prev (MODEST_HEADER_VIEW(header_view));
1065 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
1066 modest_msg_view_window_select_previous_message (MODEST_MSG_VIEW_WINDOW (window));
1068 g_return_if_reached ();
1073 modest_ui_actions_on_sort (GtkAction *action,
1074 ModestWindow *window)
1076 g_return_if_fail (MODEST_IS_WINDOW(window));
1078 if (MODEST_IS_MAIN_WINDOW (window)) {
1079 GtkWidget *header_view;
1080 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
1081 MODEST_WIDGET_TYPE_HEADER_VIEW);
1085 /* Show sorting dialog */
1086 modest_platform_run_sort_dialog (GTK_WINDOW (window), MODEST_SORT_HEADERS);
1091 new_messages_arrived (ModestMailOperation *self,
1095 if (new_messages == 0)
1098 modest_platform_on_new_msg ();
1102 * This function performs the send & receive required actions. The
1103 * window is used to create the mail operation. Typically it should
1104 * always be the main window, but we pass it as argument in order to
1108 modest_ui_actions_do_send_receive (const gchar *account_name, ModestWindow *win)
1110 gchar *acc_name = NULL;
1111 ModestMailOperation *mail_op;
1113 /* If no account name was provided then get the current account, and if
1114 there is no current account then pick the default one: */
1115 if (!account_name) {
1116 acc_name = g_strdup (modest_window_get_active_account(win));
1118 acc_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
1120 g_printerr ("modest: cannot get default account\n");
1124 acc_name = g_strdup (account_name);
1127 /* Set send/receive operation in progress */
1128 modest_main_window_notify_send_receive_initied (MODEST_MAIN_WINDOW(win));
1130 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(win));
1131 g_signal_connect (G_OBJECT(mail_op), "progress-changed",
1132 G_CALLBACK (_on_send_receive_progress_changed),
1135 /* Send & receive. */
1136 /* TODO: The spec wants us to first do any pending deletions, before receiving. */
1137 /* Receive and then send. The operation is tagged initially as
1138 a receive operation because the account update performs a
1139 receive and then a send. The operation changes its type
1140 internally, so the progress objects will receive the proper
1141 progress information */
1142 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
1143 modest_mail_operation_update_account (mail_op, acc_name, new_messages_arrived, NULL);
1144 g_object_unref (G_OBJECT (mail_op));
1151 * Refreshes all accounts. This function will be used by automatic
1155 modest_ui_actions_do_send_receive_all (ModestWindow *win)
1157 GSList *account_names, *iter;
1159 account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr(),
1162 iter = account_names;
1164 modest_ui_actions_do_send_receive ((const char*) iter->data, win);
1165 iter = g_slist_next (iter);
1168 modest_account_mgr_free_account_names (account_names);
1169 account_names = NULL;
1173 * Handler of the click on Send&Receive button in the main toolbar
1176 modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win)
1178 /* Check if accounts exist */
1179 gboolean accounts_exist =
1180 modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE);
1182 /* If not, allow the user to create an account before trying to send/receive. */
1183 if (!accounts_exist)
1184 modest_ui_actions_on_accounts (NULL, win);
1186 /* Refresh the active account */
1187 modest_ui_actions_do_send_receive (NULL, win);
1192 modest_ui_actions_toggle_header_list_view (GtkAction *action, ModestMainWindow *main_window)
1195 GtkWidget *header_view;
1197 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1199 header_view = modest_main_window_get_child_widget (main_window,
1200 MODEST_WIDGET_TYPE_HEADER_VIEW);
1204 conf = modest_runtime_get_conf ();
1206 /* what is saved/restored is depending on the style; thus; we save with
1207 * old style, then update the style, and restore for this new style
1209 modest_widget_memory_save (conf, G_OBJECT(header_view), MODEST_CONF_HEADER_VIEW_KEY);
1211 if (modest_header_view_get_style
1212 (MODEST_HEADER_VIEW(header_view)) == MODEST_HEADER_VIEW_STYLE_DETAILS)
1213 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
1214 MODEST_HEADER_VIEW_STYLE_TWOLINES);
1216 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
1217 MODEST_HEADER_VIEW_STYLE_DETAILS);
1219 modest_widget_memory_restore (conf, G_OBJECT(header_view),
1220 MODEST_CONF_HEADER_VIEW_KEY);
1225 modest_ui_actions_on_header_selected (ModestHeaderView *header_view,
1227 ModestMainWindow *main_window)
1229 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1230 g_return_if_fail (MODEST_IS_HEADER_VIEW (header_view));
1232 /* If no header has been selected then exit */
1237 if (!gtk_widget_is_focus (GTK_WIDGET(header_view)))
1238 gtk_widget_grab_focus (GTK_WIDGET(header_view));
1240 /* Update Main window title */
1241 if (gtk_widget_is_focus (GTK_WIDGET(header_view))) {
1242 const gchar *subject = tny_header_get_subject (header);
1243 if (subject && strlen(subject) > 0)
1244 gtk_window_set_title (GTK_WINDOW (main_window), subject);
1246 gtk_window_set_title (GTK_WINDOW (main_window), _("mail_va_no_subject"));
1249 /* Update toolbar dimming state */
1250 modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
1254 modest_ui_actions_on_header_activated (ModestHeaderView *header_view,
1256 ModestMainWindow *main_window)
1260 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1265 headers = tny_simple_list_new ();
1266 tny_list_prepend (headers, G_OBJECT (header));
1268 _modest_ui_actions_open (headers, MODEST_WINDOW (main_window));
1270 g_object_unref (headers);
1274 set_active_account_from_tny_account (TnyAccount *account,
1275 ModestWindow *window)
1277 const gchar *server_acc_name = tny_account_get_id (account);
1279 /* We need the TnyAccount provided by the
1280 account store because that is the one that
1281 knows the name of the Modest account */
1282 TnyAccount *modest_server_account = modest_server_account =
1283 modest_tny_account_store_get_tny_account_by (modest_runtime_get_account_store (),
1284 MODEST_TNY_ACCOUNT_STORE_QUERY_ID,
1287 const gchar *modest_acc_name =
1288 modest_tny_account_get_parent_modest_account_name_for_server_account (modest_server_account);
1289 modest_window_set_active_account (window, modest_acc_name);
1290 g_object_unref (modest_server_account);
1295 folder_refreshed_cb (const GObject *obj,
1299 ModestMainWindow *win = NULL;
1300 GtkWidget *header_view;
1302 g_return_if_fail (TNY_IS_FOLDER (folder));
1304 win = MODEST_MAIN_WINDOW (user_data);
1306 modest_main_window_get_child_widget(win, MODEST_WIDGET_TYPE_HEADER_VIEW);
1308 /* Check if folder is empty and set headers view contents style */
1309 if (tny_folder_get_all_count (folder) == 0) {
1310 printf ("DEBUG: %s: tny_folder_get_all_count() returned 0.\n", __FUNCTION__);
1311 modest_main_window_set_contents_style (win,
1312 MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY);
1314 printf ("DEBUG: %s: tny_folder_get_all_count() returned >0.\n", __FUNCTION__);
1319 modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
1320 TnyFolderStore *folder_store,
1322 ModestMainWindow *main_window)
1325 GtkWidget *header_view;
1327 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1329 header_view = modest_main_window_get_child_widget(main_window,
1330 MODEST_WIDGET_TYPE_HEADER_VIEW);
1334 conf = modest_runtime_get_conf ();
1336 if (TNY_IS_ACCOUNT (folder_store)) {
1338 /* Update active account */
1339 set_active_account_from_tny_account (TNY_ACCOUNT (folder_store), MODEST_WINDOW (main_window));
1340 /* Show account details */
1341 modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS);
1344 if (TNY_IS_FOLDER (folder_store) && selected) {
1346 /* Update the active account */
1347 TnyAccount *account = modest_tny_folder_get_account (TNY_FOLDER (folder_store));
1349 set_active_account_from_tny_account (account, MODEST_WINDOW (main_window));
1350 g_object_unref (account);
1354 /* Set the header style by default, it could
1355 be changed later by the refresh callback to
1357 modest_main_window_set_contents_style (main_window,
1358 MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS);
1360 /* Set folder on header view. This function
1361 will call tny_folder_refresh_async so we
1362 pass a callback that will be called when
1363 finished. We use that callback to set the
1364 empty view if there are no messages */
1365 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view),
1366 TNY_FOLDER (folder_store),
1367 folder_refreshed_cb,
1370 /* Restore configuration. We need to do this
1371 *after* the set_folder because the widget
1372 memory asks the header view about its
1374 modest_widget_memory_restore (modest_runtime_get_conf (),
1375 G_OBJECT(header_view),
1376 MODEST_CONF_HEADER_VIEW_KEY);
1378 /* Update the active account */
1379 modest_window_set_active_account (MODEST_WINDOW (main_window), NULL);
1380 /* Save only if we're seeing headers */
1381 if (modest_main_window_get_contents_style (main_window) ==
1382 MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS)
1383 modest_widget_memory_save (conf, G_OBJECT (header_view),
1384 MODEST_CONF_HEADER_VIEW_KEY);
1385 modest_header_view_clear (MODEST_HEADER_VIEW(header_view));
1389 /* Update toolbar dimming state */
1390 modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
1394 modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemType type,
1401 item = (type == MODEST_ITEM_TYPE_FOLDER) ? "folder" : "message";
1403 if (g_main_depth > 0)
1404 gdk_threads_enter ();
1405 online = tny_device_is_online (modest_runtime_get_device());
1408 /* already online -- the item is simply not there... */
1409 dialog = gtk_message_dialog_new (GTK_WINDOW (win),
1411 GTK_MESSAGE_WARNING,
1413 _("The %s you selected cannot be found"),
1415 gtk_dialog_run (GTK_DIALOG(dialog));
1417 dialog = gtk_dialog_new_with_buttons (_("Connection requested"),
1421 GTK_RESPONSE_REJECT,
1423 GTK_RESPONSE_ACCEPT,
1425 txt = g_strdup_printf (_("This %s is not available in offline mode.\n"
1426 "Do you want to get online?"), item);
1427 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1428 gtk_label_new (txt), FALSE, FALSE, 0);
1429 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1432 gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300);
1433 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
1434 // modest_platform_connect_and_wait ();
1437 gtk_widget_destroy (dialog);
1438 if (g_main_depth > 0)
1439 gdk_threads_leave ();
1443 modest_ui_actions_on_msg_link_hover (ModestMsgView *msgview, const gchar* link,
1446 /* g_message ("%s %s", __FUNCTION__, link); */
1451 modest_ui_actions_on_msg_link_clicked (ModestMsgView *msgview, const gchar* link,
1454 modest_platform_activate_uri (link);
1458 modest_ui_actions_on_msg_link_contextual (ModestMsgView *msgview, const gchar* link,
1461 modest_platform_show_uri_popup (link);
1465 modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, TnyMimePart *mime_part,
1468 modest_msg_view_window_view_attachment (MODEST_MSG_VIEW_WINDOW (win), mime_part);
1472 modest_ui_actions_on_msg_recpt_activated (ModestMsgView *msgview,
1473 const gchar *address,
1476 /* g_message ("%s %s", __FUNCTION__, address); */
1480 modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edit_window)
1482 TnyTransportAccount *transport_account;
1483 ModestMailOperation *mail_operation;
1485 gchar *account_name, *from;
1486 ModestAccountMgr *account_mgr;
1487 gchar *info_text = NULL;
1489 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
1491 data = modest_msg_edit_window_get_msg_data (edit_window);
1493 account_mgr = modest_runtime_get_account_mgr();
1494 account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
1496 account_name = modest_account_mgr_get_default_account (account_mgr);
1497 if (!account_name) {
1498 g_printerr ("modest: no account found\n");
1499 modest_msg_edit_window_free_msg_data (edit_window, data);
1503 if (!strcmp (account_name, MODEST_LOCAL_FOLDERS_ACCOUNT_ID)) {
1504 account_name = g_strdup (data->account_name);
1508 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_server_account
1509 (modest_runtime_get_account_store(),
1511 TNY_ACCOUNT_TYPE_TRANSPORT));
1512 if (!transport_account) {
1513 g_printerr ("modest: no transport account found for '%s'\n", account_name);
1514 g_free (account_name);
1515 modest_msg_edit_window_free_msg_data (edit_window, data);
1518 from = modest_account_mgr_get_from_string (account_mgr, account_name);
1520 /* Create the mail operation */
1521 mail_operation = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_INFO, G_OBJECT(edit_window));
1522 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
1524 modest_mail_operation_save_to_drafts (mail_operation,
1535 data->priority_flags);
1538 g_free (account_name);
1539 g_object_unref (G_OBJECT (transport_account));
1540 g_object_unref (G_OBJECT (mail_operation));
1542 modest_msg_edit_window_free_msg_data (edit_window, data);
1544 info_text = g_strdup_printf (_("mail_va_saved_to_drafts"), _("mcen_me_folder_drafts"));
1545 modest_platform_information_banner (NULL, NULL, info_text);
1549 /* For instance, when clicking the Send toolbar button when editing a message: */
1551 modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
1553 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
1555 if (!modest_msg_edit_window_check_names (edit_window))
1558 /* FIXME: Code added just for testing. The final version will
1559 use the send queue provided by tinymail and some
1561 ModestAccountMgr *account_mgr = modest_runtime_get_account_mgr();
1562 gchar *account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
1564 account_name = modest_account_mgr_get_default_account (account_mgr);
1566 if (!account_name) {
1567 g_printerr ("modest: no account found\n");
1571 MsgData *data = modest_msg_edit_window_get_msg_data (edit_window);
1573 if (!strcmp (account_name, MODEST_LOCAL_FOLDERS_ACCOUNT_ID)) {
1574 account_name = g_strdup (data->account_name);
1577 /* Get the currently-active transport account for this modest account: */
1578 TnyTransportAccount *transport_account =
1579 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_transport_account_for_open_connection
1580 (modest_runtime_get_account_store(),
1582 if (!transport_account) {
1583 g_printerr ("modest: no transport account found for '%s'\n", account_name);
1584 g_free (account_name);
1585 modest_msg_edit_window_free_msg_data (edit_window, data);
1589 gchar *from = modest_account_mgr_get_from_string (account_mgr, account_name);
1591 /* mail content checks and dialogs */
1592 if (data->subject == NULL || data->subject[0] == '\0') {
1593 GtkResponseType response;
1594 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (edit_window),
1595 _("mcen_nc_subject_is_empty_send"));
1596 if (response == GTK_RESPONSE_CANCEL) {
1597 g_free (account_name);
1602 if (data->plain_body == NULL || data->plain_body[0] == '\0') {
1603 GtkResponseType response;
1604 gchar *note_message;
1605 gchar *note_subject = data->subject;
1606 if (note_subject == NULL || note_subject[0] == '\0')
1607 note_subject = _("mail_va_no_subject");
1608 note_message = g_strdup_printf (_("emev_ni_ui_smtp_message_null"), note_subject);
1609 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (edit_window),
1611 g_free (note_message);
1612 if (response == GTK_RESPONSE_CANCEL) {
1613 g_free (account_name);
1618 modest_platform_information_banner (NULL, NULL, _("mcen_ib_outbox_waiting_to_be_sent"));
1620 /* Create the mail operation */
1621 ModestMailOperation *mail_operation = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_SEND, G_OBJECT(edit_window));
1622 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
1624 modest_mail_operation_send_new_mail (mail_operation,
1635 data->priority_flags);
1639 g_free (account_name);
1640 g_object_unref (G_OBJECT (transport_account));
1641 g_object_unref (G_OBJECT (mail_operation));
1643 modest_msg_edit_window_free_msg_data (edit_window, data);
1645 /* Save settings and close the window: */
1646 gtk_widget_destroy (GTK_WIDGET (edit_window));
1650 modest_ui_actions_on_toggle_bold (GtkToggleAction *action,
1651 ModestMsgEditWindow *window)
1653 ModestMsgEditFormatState *format_state = NULL;
1655 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1656 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1658 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1661 format_state = modest_msg_edit_window_get_format_state (window);
1662 g_return_if_fail (format_state != NULL);
1664 format_state->bold = gtk_toggle_action_get_active (action);
1665 modest_msg_edit_window_set_format_state (window, format_state);
1666 g_free (format_state);
1671 modest_ui_actions_on_toggle_italics (GtkToggleAction *action,
1672 ModestMsgEditWindow *window)
1674 ModestMsgEditFormatState *format_state = NULL;
1676 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1677 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1679 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1682 format_state = modest_msg_edit_window_get_format_state (window);
1683 g_return_if_fail (format_state != NULL);
1685 format_state->italics = gtk_toggle_action_get_active (action);
1686 modest_msg_edit_window_set_format_state (window, format_state);
1687 g_free (format_state);
1692 modest_ui_actions_on_toggle_bullets (GtkToggleAction *action,
1693 ModestMsgEditWindow *window)
1695 ModestMsgEditFormatState *format_state = NULL;
1697 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1698 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1700 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1703 format_state = modest_msg_edit_window_get_format_state (window);
1704 g_return_if_fail (format_state != NULL);
1706 format_state->bullet = gtk_toggle_action_get_active (action);
1707 modest_msg_edit_window_set_format_state (window, format_state);
1708 g_free (format_state);
1713 modest_ui_actions_on_change_justify (GtkRadioAction *action,
1714 GtkRadioAction *selected,
1715 ModestMsgEditWindow *window)
1717 ModestMsgEditFormatState *format_state = NULL;
1718 GtkJustification value;
1720 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1722 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1725 value = gtk_radio_action_get_current_value (selected);
1727 format_state = modest_msg_edit_window_get_format_state (window);
1728 g_return_if_fail (format_state != NULL);
1730 format_state->justification = value;
1731 modest_msg_edit_window_set_format_state (window, format_state);
1732 g_free (format_state);
1736 modest_ui_actions_on_select_editor_color (GtkAction *action,
1737 ModestMsgEditWindow *window)
1739 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1740 g_return_if_fail (GTK_IS_ACTION (action));
1742 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1745 modest_msg_edit_window_select_color (window);
1749 modest_ui_actions_on_select_editor_background_color (GtkAction *action,
1750 ModestMsgEditWindow *window)
1752 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1753 g_return_if_fail (GTK_IS_ACTION (action));
1755 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1758 modest_msg_edit_window_select_background_color (window);
1762 modest_ui_actions_on_insert_image (GtkAction *action,
1763 ModestMsgEditWindow *window)
1765 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1766 g_return_if_fail (GTK_IS_ACTION (action));
1768 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1771 modest_msg_edit_window_insert_image (window);
1775 modest_ui_actions_on_attach_file (GtkAction *action,
1776 ModestMsgEditWindow *window)
1778 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1779 g_return_if_fail (GTK_IS_ACTION (action));
1781 modest_msg_edit_window_attach_file (window);
1785 modest_ui_actions_on_remove_attachments (GtkAction *action,
1786 ModestMsgEditWindow *window)
1788 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1789 g_return_if_fail (GTK_IS_ACTION (action));
1791 modest_msg_edit_window_remove_attachments (window, NULL);
1795 modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_window)
1797 TnyFolderStore *parent_folder;
1798 GtkWidget *folder_view;
1800 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1802 folder_view = modest_main_window_get_child_widget (main_window,
1803 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1807 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1809 if (parent_folder) {
1810 gboolean finished = FALSE;
1812 gchar *folder_name = NULL, *suggested_name = NULL;
1814 /* Run the new folder dialog */
1816 result = modest_platform_run_new_folder_dialog (GTK_WINDOW (main_window),
1821 if (result == GTK_RESPONSE_REJECT) {
1824 ModestMailOperation *mail_op;
1825 TnyFolder *new_folder = NULL;
1827 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_INFO,
1828 G_OBJECT(main_window));
1829 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1831 new_folder = modest_mail_operation_create_folder (mail_op,
1833 (const gchar *) folder_name);
1835 g_object_unref (new_folder);
1838 g_object_unref (mail_op);
1840 g_free (folder_name);
1844 g_object_unref (parent_folder);
1849 modest_ui_actions_on_rename_folder (GtkAction *action,
1850 ModestMainWindow *main_window)
1852 TnyFolderStore *folder;
1853 GtkWidget *folder_view;
1854 GtkWidget *header_view;
1856 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1858 folder_view = modest_main_window_get_child_widget (main_window,
1859 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1863 header_view = modest_main_window_get_child_widget (main_window,
1864 MODEST_WIDGET_TYPE_HEADER_VIEW);
1869 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1871 if (folder && TNY_IS_FOLDER (folder)) {
1874 const gchar *current_name;
1876 current_name = tny_folder_get_name (TNY_FOLDER (folder));
1877 response = modest_platform_run_rename_folder_dialog (GTK_WINDOW (main_window), NULL,
1878 current_name, &folder_name);
1880 if (response == GTK_RESPONSE_OK && strlen (folder_name) > 0) {
1881 ModestMailOperation *mail_op;
1883 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_INFO, G_OBJECT(main_window));
1884 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1887 modest_header_view_clear (MODEST_HEADER_VIEW (header_view));
1889 modest_mail_operation_rename_folder (mail_op,
1890 TNY_FOLDER (folder),
1891 (const gchar *) folder_name);
1893 g_object_unref (mail_op);
1894 g_free (folder_name);
1896 g_object_unref (folder);
1901 modest_ui_actions_delete_folder_error_handler (ModestMailOperation *mail_op,
1904 GObject *win = modest_mail_operation_get_source (mail_op);
1906 modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL,
1907 _("mail_in_ui_folder_delete_error"));
1908 g_object_unref (win);
1912 delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
1914 TnyFolderStore *folder;
1915 GtkWidget *folder_view;
1919 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1921 folder_view = modest_main_window_get_child_widget (main_window,
1922 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1926 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
1928 /* Show an error if it's an account */
1929 if (!TNY_IS_FOLDER (folder)) {
1930 modest_platform_run_information_dialog (GTK_WINDOW (main_window),
1931 _("mail_in_ui_folder_delete_error"));
1936 message = g_strdup_printf (_("mcen_nc_delete_folder_text"),
1937 tny_folder_get_name (TNY_FOLDER (folder)));
1938 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (main_window),
1939 (const gchar *) message);
1942 if (response == GTK_RESPONSE_OK) {
1943 ModestMailOperation *mail_op =
1944 modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_DELETE,
1945 G_OBJECT(main_window),
1946 modest_ui_actions_delete_folder_error_handler,
1949 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1951 modest_mail_operation_remove_folder (mail_op, TNY_FOLDER (folder), move_to_trash);
1952 g_object_unref (G_OBJECT (mail_op));
1955 g_object_unref (G_OBJECT (folder));
1959 modest_ui_actions_on_delete_folder (GtkAction *action,
1960 ModestMainWindow *main_window)
1962 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1964 delete_folder (main_window, FALSE);
1968 modest_ui_actions_on_move_folder_to_trash_folder (GtkAction *action, ModestMainWindow *main_window)
1970 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1972 delete_folder (main_window, TRUE);
1976 modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
1977 const gchar* server_account_name,
1982 ModestMainWindow *main_window)
1984 g_return_if_fail(server_account_name);
1985 /* printf("DEBUG: %s: server_account_name=%s\n", __FUNCTION__, server_account_name); */
1987 /* Initalize output parameters: */
1994 #ifdef MODEST_PLATFORM_MAEMO
1995 /* Maemo uses a different (awkward) button order,
1996 * It should probably just use gtk_alternative_dialog_button_order ().
1998 GtkWidget *dialog = gtk_dialog_new_with_buttons (_("mail_ti_password_protected"),
2002 GTK_RESPONSE_ACCEPT,
2004 GTK_RESPONSE_REJECT,
2007 GtkWidget *dialog = gtk_dialog_new_with_buttons (_("mail_ti_password_protected"),
2011 GTK_RESPONSE_REJECT,
2013 GTK_RESPONSE_ACCEPT,
2015 #endif /* MODEST_PLATFORM_MAEMO */
2017 gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(main_window));
2019 gchar *server_name = modest_server_account_get_hostname (
2020 modest_runtime_get_account_mgr(), server_account_name);
2021 if (!server_name) {/* This happened once, though I don't know why. murrayc. */
2022 g_warning("%s: Could not get server name for server account '%s'", __FUNCTION__, server_account_name);
2027 /* This causes a warning because the logical ID has no %s in it,
2028 * though the translation does, but there is not much we can do about that: */
2029 gchar *txt = g_strdup_printf (_("mail_ia_password_info"), server_name);
2030 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt),
2033 g_free (server_name);
2037 gchar *initial_username = modest_server_account_get_username (
2038 modest_runtime_get_account_mgr(), server_account_name);
2040 GtkWidget *entry_username = gtk_entry_new ();
2041 if (initial_username)
2042 gtk_entry_set_text (GTK_ENTRY (entry_username), initial_username);
2043 /* Dim this if a connection has ever succeeded with this username,
2044 * as per the UI spec: */
2045 const gboolean username_known =
2046 modest_server_account_get_username_has_succeeded(
2047 modest_runtime_get_account_mgr(), server_account_name);
2048 gtk_widget_set_sensitive (entry_username, !username_known);
2050 #ifdef MODEST_PLATFORM_MAEMO
2051 /* Auto-capitalization is the default, so let's turn it off: */
2052 hildon_gtk_entry_set_input_mode (GTK_ENTRY (entry_username), HILDON_GTK_INPUT_MODE_FULL);
2054 /* Create a size group to be used by all captions.
2055 * Note that HildonCaption does not create a default size group if we do not specify one.
2056 * We use GTK_SIZE_GROUP_HORIZONTAL, so that the widths are the same. */
2057 GtkSizeGroup *sizegroup = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
2059 GtkWidget *caption = hildon_caption_new (sizegroup,
2060 _("mail_fi_username"), entry_username, NULL, HILDON_CAPTION_MANDATORY);
2061 gtk_widget_show (entry_username);
2062 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), caption,
2063 FALSE, FALSE, MODEST_MARGIN_HALF);
2064 gtk_widget_show (caption);
2066 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry_username,
2068 #endif /* MODEST_PLATFORM_MAEMO */
2071 GtkWidget *entry_password = gtk_entry_new ();
2072 gtk_entry_set_visibility (GTK_ENTRY(entry_password), FALSE);
2073 /* gtk_entry_set_invisible_char (GTK_ENTRY(entry_password), "*"); */
2075 #ifdef MODEST_PLATFORM_MAEMO
2076 /* Auto-capitalization is the default, so let's turn it off: */
2077 hildon_gtk_entry_set_input_mode (GTK_ENTRY (entry_password),
2078 HILDON_GTK_INPUT_MODE_FULL | HILDON_GTK_INPUT_MODE_INVISIBLE);
2080 caption = hildon_caption_new (sizegroup,
2081 _("mail_fi_password"), entry_password, NULL, HILDON_CAPTION_MANDATORY);
2082 gtk_widget_show (entry_password);
2083 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), caption,
2084 FALSE, FALSE, MODEST_MARGIN_HALF);
2085 gtk_widget_show (caption);
2086 g_object_unref (sizegroup);
2088 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry_password,
2090 #endif /* MODEST_PLATFORM_MAEMO */
2092 /* This is not in the Maemo UI spec:
2093 remember_pass_check = gtk_check_button_new_with_label (_("Remember password"));
2094 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check,
2098 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
2100 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
2102 *username = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry_username)));
2104 modest_server_account_set_username (
2105 modest_runtime_get_account_mgr(), server_account_name,
2108 const gboolean username_was_changed =
2109 (strcmp (*username, initial_username) != 0);
2110 if (username_was_changed) {
2111 g_warning ("%s: tinymail does not yet support changing the "
2112 "username in the get_password() callback.\n", __FUNCTION__);
2117 *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry_password)));
2119 /* We do not save the password in the configuration,
2120 * because this function is only called for passwords that should
2121 * not be remembered:
2122 modest_server_account_set_password (
2123 modest_runtime_get_account_mgr(), server_account_name,
2142 /* This is not in the Maemo UI spec:
2143 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check)))
2149 gtk_widget_destroy (dialog);
2151 /* printf ("DEBUG: %s: cancel=%d\n", __FUNCTION__, *cancel); */
2155 modest_ui_actions_on_cut (GtkAction *action,
2156 ModestWindow *window)
2158 GtkWidget *focused_widget;
2160 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
2161 if (GTK_IS_EDITABLE (focused_widget)) {
2162 gtk_editable_cut_clipboard (GTK_EDITABLE(focused_widget));
2163 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
2164 GtkTextBuffer *buffer;
2165 GtkClipboard *clipboard;
2167 clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
2168 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
2169 gtk_text_buffer_cut_clipboard (buffer, clipboard, TRUE);
2170 } else if (MODEST_IS_HEADER_VIEW (focused_widget)) {
2171 modest_header_view_cut_selection (MODEST_HEADER_VIEW (focused_widget));
2172 } else if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
2173 modest_folder_view_cut_selection (MODEST_FOLDER_VIEW (focused_widget));
2178 modest_ui_actions_on_copy (GtkAction *action,
2179 ModestWindow *window)
2181 GtkClipboard *clipboard;
2182 GtkWidget *focused_widget;
2184 clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
2185 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
2187 if (GTK_IS_LABEL (focused_widget)) {
2188 gtk_clipboard_set_text (clipboard, gtk_label_get_text (GTK_LABEL (focused_widget)), -1);
2189 } else if (GTK_IS_EDITABLE (focused_widget)) {
2190 gtk_editable_copy_clipboard (GTK_EDITABLE(focused_widget));
2191 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
2192 GtkTextBuffer *buffer;
2193 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
2194 gtk_text_buffer_copy_clipboard (buffer, clipboard);
2195 modest_header_view_copy_selection (MODEST_HEADER_VIEW (focused_widget));
2196 } else if (MODEST_IS_HEADER_VIEW (focused_widget)) {
2197 TnyList *header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (focused_widget));
2198 TnyIterator *iter = tny_list_create_iterator (header_list);
2199 TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter));
2200 TnyFolder *folder = tny_header_get_folder (header);
2201 TnyAccount *account = tny_folder_get_account (folder);
2202 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (account));
2203 /* If it's POP then ask */
2204 gboolean ask = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
2205 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
2206 g_object_unref (account);
2207 g_object_unref (folder);
2208 g_object_unref (header);
2209 g_object_unref (iter);
2211 /* Check that the messages have been previously downloaded */
2212 gboolean continue_download = TRUE;
2214 continue_download = download_uncached_messages (header_list, GTK_WINDOW (window));
2215 if (continue_download)
2216 modest_header_view_copy_selection (MODEST_HEADER_VIEW (focused_widget));
2217 g_object_unref (header_list);
2218 } else if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
2219 modest_folder_view_copy_selection (MODEST_FOLDER_VIEW (focused_widget));
2222 /* Show information banner */
2223 modest_platform_information_banner (NULL, NULL, _CS("ecoc_ib_edwin_copied"));
2228 modest_ui_actions_on_undo (GtkAction *action,
2229 ModestWindow *window)
2231 if (MODEST_IS_MSG_EDIT_WINDOW (window)) {
2232 modest_msg_edit_window_undo (MODEST_MSG_EDIT_WINDOW (window));
2234 g_return_if_reached ();
2239 modest_ui_actions_on_paste (GtkAction *action,
2240 ModestWindow *window)
2242 GtkWidget *focused_widget;
2243 ModestMailOperation *mail_op = NULL;
2245 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
2246 if (GTK_IS_EDITABLE (focused_widget)) {
2247 gtk_editable_paste_clipboard (GTK_EDITABLE(focused_widget));
2248 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
2249 GtkTextBuffer *buffer;
2250 GtkClipboard *clipboard;
2252 clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
2253 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
2254 gtk_text_buffer_paste_clipboard (buffer, clipboard, NULL, TRUE);
2255 } else if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
2256 ModestEmailClipboard *clipboard = NULL;
2257 TnyFolder *src_folder = NULL;
2258 TnyFolderStore *folder_store = NULL;
2259 TnyList *data = NULL;
2260 gboolean delete = FALSE;
2262 /* Check clipboard source */
2263 clipboard = modest_runtime_get_email_clipboard ();
2264 if (modest_email_clipboard_cleared (clipboard))
2267 /* Get elements to paste */
2268 modest_email_clipboard_get_data (clipboard, &src_folder, &data, &delete);
2270 /* Create a new mail operation */
2271 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(window));
2272 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
2275 /* Get destination folder */
2276 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (focused_widget));
2278 /* transfer messages */
2280 modest_mail_operation_xfer_msgs (mail_op,
2282 TNY_FOLDER (folder_store),
2287 } else if (src_folder != NULL) {
2288 modest_mail_operation_xfer_folder (mail_op,
2296 g_object_unref (data);
2297 if (src_folder != NULL)
2298 g_object_unref (src_folder);
2299 if (folder_store != NULL)
2300 g_object_unref (folder_store);
2305 modest_ui_actions_on_select_all (GtkAction *action,
2306 ModestWindow *window)
2308 GtkWidget *focused_widget;
2310 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
2311 if (MODEST_IS_ATTACHMENTS_VIEW (focused_widget)) {
2312 modest_attachments_view_select_all (MODEST_ATTACHMENTS_VIEW (focused_widget));
2313 } else if (GTK_IS_LABEL (focused_widget)) {
2314 gtk_label_select_region (GTK_LABEL (focused_widget), 0, -1);
2315 } else if (GTK_IS_EDITABLE (focused_widget)) {
2316 gtk_editable_select_region (GTK_EDITABLE(focused_widget), 0, -1);
2317 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
2318 GtkTextBuffer *buffer;
2319 GtkTextIter start, end;
2321 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
2322 gtk_text_buffer_get_start_iter (buffer, &start);
2323 gtk_text_buffer_get_end_iter (buffer, &end);
2324 gtk_text_buffer_select_range (buffer, &start, &end);
2326 else if ((MODEST_IS_FOLDER_VIEW (focused_widget)) ||
2327 (MODEST_IS_HEADER_VIEW (focused_widget))) {
2329 GtkTreeSelection *selection = NULL;
2331 /* Get header view */
2332 GtkWidget *header_view = focused_widget;
2333 if (MODEST_IS_FOLDER_VIEW (focused_widget))
2334 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (window),
2335 MODEST_WIDGET_TYPE_HEADER_VIEW);
2337 /* Select all messages */
2338 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view));
2339 gtk_tree_selection_select_all (selection);
2341 /* Set focuse on header view */
2342 gtk_widget_grab_focus (header_view);
2344 } else if (GTK_IS_HTML (focused_widget)) {
2345 gtk_html_select_all (GTK_HTML (focused_widget));
2350 modest_ui_actions_on_mark_as_read (GtkAction *action,
2351 ModestWindow *window)
2353 g_return_if_fail (MODEST_IS_WINDOW(window));
2355 /* Mark each header as read */
2356 do_headers_action (window, headers_action_mark_as_read, NULL);
2360 modest_ui_actions_on_mark_as_unread (GtkAction *action,
2361 ModestWindow *window)
2363 g_return_if_fail (MODEST_IS_WINDOW(window));
2365 /* Mark each header as read */
2366 do_headers_action (window, headers_action_mark_as_unread, NULL);
2370 modest_ui_actions_on_change_zoom (GtkRadioAction *action,
2371 GtkRadioAction *selected,
2372 ModestWindow *window)
2376 value = gtk_radio_action_get_current_value (selected);
2377 if (MODEST_IS_WINDOW (window)) {
2378 modest_window_set_zoom (MODEST_WINDOW (window), ((gdouble)value)/100);
2382 void modest_ui_actions_msg_edit_on_change_priority (GtkRadioAction *action,
2383 GtkRadioAction *selected,
2384 ModestWindow *window)
2386 TnyHeaderFlags flags;
2387 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2389 flags = gtk_radio_action_get_current_value (selected);
2390 modest_msg_edit_window_set_priority_flags (MODEST_MSG_EDIT_WINDOW (window), flags);
2393 void modest_ui_actions_msg_edit_on_change_file_format (GtkRadioAction *action,
2394 GtkRadioAction *selected,
2395 ModestWindow *window)
2399 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2401 file_format = gtk_radio_action_get_current_value (selected);
2402 modest_msg_edit_window_set_file_format (MODEST_MSG_EDIT_WINDOW (window), file_format);
2407 modest_ui_actions_on_zoom_plus (GtkAction *action,
2408 ModestWindow *window)
2410 g_return_if_fail (MODEST_IS_WINDOW (window));
2412 modest_window_zoom_plus (MODEST_WINDOW (window));
2416 modest_ui_actions_on_zoom_minus (GtkAction *action,
2417 ModestWindow *window)
2419 g_return_if_fail (MODEST_IS_WINDOW (window));
2421 modest_window_zoom_minus (MODEST_WINDOW (window));
2425 modest_ui_actions_on_toggle_fullscreen (GtkToggleAction *toggle,
2426 ModestWindow *window)
2428 ModestWindowMgr *mgr;
2429 gboolean fullscreen, active;
2430 g_return_if_fail (MODEST_IS_WINDOW (window));
2432 mgr = modest_runtime_get_window_mgr ();
2434 active = (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle)))?1:0;
2435 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
2437 if (active != fullscreen) {
2438 modest_window_mgr_set_fullscreen_mode (mgr, active);
2439 gtk_window_present (GTK_WINDOW (window));
2444 modest_ui_actions_on_change_fullscreen (GtkAction *action,
2445 ModestWindow *window)
2447 ModestWindowMgr *mgr;
2448 gboolean fullscreen;
2450 g_return_if_fail (MODEST_IS_WINDOW (window));
2452 mgr = modest_runtime_get_window_mgr ();
2453 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
2454 modest_window_mgr_set_fullscreen_mode (mgr, !fullscreen);
2456 gtk_window_present (GTK_WINDOW (window));
2460 * Used by modest_ui_actions_on_details to call do_headers_action
2463 headers_action_show_details (TnyHeader *header,
2464 ModestWindow *window,
2471 dialog = modest_details_dialog_new_with_header (GTK_WINDOW (window), header);
2474 gtk_widget_show_all (dialog);
2475 gtk_dialog_run (GTK_DIALOG (dialog));
2477 gtk_widget_destroy (dialog);
2481 * Show the folder details in a ModestDetailsDialog widget
2484 show_folder_details (TnyFolder *folder,
2490 dialog = modest_details_dialog_new_with_folder (window, folder);
2493 gtk_widget_show_all (dialog);
2494 gtk_dialog_run (GTK_DIALOG (dialog));
2496 gtk_widget_destroy (dialog);
2500 * Show the header details in a ModestDetailsDialog widget
2503 modest_ui_actions_on_details (GtkAction *action,
2506 TnyList * headers_list;
2510 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2513 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2516 g_object_unref (msg);
2518 headers_list = get_selected_headers (win);
2522 iter = tny_list_create_iterator (headers_list);
2524 header = TNY_HEADER (tny_iterator_get_current (iter));
2525 headers_action_show_details (header, win, NULL);
2526 g_object_unref (header);
2528 g_object_unref (iter);
2529 g_object_unref (headers_list);
2531 } else if (MODEST_IS_MAIN_WINDOW (win)) {
2532 GtkWidget *folder_view, *header_view;
2534 /* Check which widget has the focus */
2535 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2536 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2537 if (gtk_widget_is_focus (folder_view)) {
2538 TnyFolderStore *folder_store
2539 = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
2540 if (!folder_store) {
2541 g_warning ("%s: No item was selected.\n", __FUNCTION__);
2544 /* Show only when it's a folder */
2545 /* This function should not be called for account items,
2546 * because we dim the menu item for them. */
2547 if (TNY_IS_FOLDER (folder_store)) {
2548 show_folder_details (TNY_FOLDER (folder_store), GTK_WINDOW (win));
2551 g_object_unref (folder_store);
2554 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2555 MODEST_WIDGET_TYPE_HEADER_VIEW);
2556 /* Show details of each header */
2557 do_headers_action (win, headers_action_show_details, header_view);
2563 modest_ui_actions_on_toggle_show_cc (GtkToggleAction *toggle,
2564 ModestMsgEditWindow *window)
2566 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2568 modest_msg_edit_window_show_cc (window, gtk_toggle_action_get_active (toggle));
2572 modest_ui_actions_on_toggle_show_bcc (GtkToggleAction *toggle,
2573 ModestMsgEditWindow *window)
2575 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2577 modest_msg_edit_window_show_bcc (window, gtk_toggle_action_get_active (toggle));
2581 modest_ui_actions_toggle_folders_view (GtkAction *action,
2582 ModestMainWindow *main_window)
2586 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
2588 conf = modest_runtime_get_conf ();
2590 if (modest_main_window_get_style (main_window) == MODEST_MAIN_WINDOW_STYLE_SPLIT)
2591 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SIMPLE);
2593 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SPLIT);
2597 modest_ui_actions_on_toggle_toolbar (GtkToggleAction *toggle,
2598 ModestWindow *window)
2600 gboolean active, fullscreen = FALSE;
2601 ModestWindowMgr *mgr;
2603 active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle));
2605 /* Check if we want to toggle the toolbar vuew in fullscreen
2607 if (!strcmp (gtk_action_get_name (GTK_ACTION (toggle)),
2608 "ViewShowToolbarFullScreen")) {
2612 /* Toggle toolbar */
2613 mgr = modest_runtime_get_window_mgr ();
2614 modest_window_mgr_show_toolbars (mgr, active, fullscreen);
2618 modest_ui_actions_msg_edit_on_select_font (GtkAction *action,
2619 ModestMsgEditWindow *window)
2621 modest_msg_edit_window_select_font (window);
2625 modest_ui_actions_on_folder_display_name_changed (ModestFolderView *folder_view,
2626 const gchar *display_name,
2629 /* Do not change the application name if the widget has not
2630 the focus. This callback could be called even if the folder
2631 view has not the focus, because the handled signal could be
2632 emitted when the folder view is redrawn */
2633 if (gtk_widget_is_focus (GTK_WIDGET (folder_view))) {
2635 gtk_window_set_title (window, display_name);
2637 gtk_window_set_title (window, " ");
2642 modest_ui_actions_on_select_contacts (GtkAction *action, ModestMsgEditWindow *window)
2644 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2645 modest_msg_edit_window_select_contacts (window);
2649 modest_ui_actions_on_check_names (GtkAction *action, ModestMsgEditWindow *window)
2651 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2652 modest_msg_edit_window_check_names (window);
2657 create_move_to_dialog (ModestWindow *win,
2658 GtkWidget *folder_view,
2659 GtkWidget **tree_view)
2661 GtkWidget *dialog, *scroll;
2663 dialog = gtk_dialog_new_with_buttons (_("mcen_ti_moveto_folders_title"),
2665 GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR | GTK_DIALOG_DESTROY_WITH_PARENT,
2667 GTK_RESPONSE_ACCEPT,
2669 GTK_RESPONSE_REJECT,
2672 /* Create scrolled window */
2673 scroll = gtk_scrolled_window_new (NULL, NULL);
2674 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
2675 GTK_POLICY_AUTOMATIC,
2676 GTK_POLICY_AUTOMATIC);
2678 /* Create folder view */
2679 *tree_view = modest_platform_create_folder_view (NULL);
2681 /* It could happen that we're trying to move a message from a
2682 window (msg window for example) after the main window was
2683 closed, so we can not just get the model of the folder
2685 if (MODEST_IS_FOLDER_VIEW (folder_view))
2686 gtk_tree_view_set_model (GTK_TREE_VIEW (*tree_view),
2687 gtk_tree_view_get_model (GTK_TREE_VIEW (folder_view)));
2689 modest_folder_view_update_model (MODEST_FOLDER_VIEW (*tree_view),
2690 TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()));
2692 gtk_container_add (GTK_CONTAINER (scroll), *tree_view);
2694 /* Add scroll to dialog */
2695 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
2696 scroll, FALSE, FALSE, 0);
2698 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
2700 /* Select INBOX or local account */
2701 modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (*tree_view));
2707 * Returns TRUE if at least one of the headers of the list belongs to
2708 * a message that has been fully retrieved.
2711 has_retrieved_msgs (TnyList *list)
2714 gboolean found = FALSE;
2716 iter = tny_list_create_iterator (list);
2717 while (tny_iterator_is_done (iter) && !found) {
2719 TnyHeaderFlags flags;
2721 header = TNY_HEADER (tny_iterator_get_current (iter));
2722 flags = tny_header_get_flags (header);
2723 if (!(flags & TNY_HEADER_FLAG_PARTIAL))
2727 tny_iterator_next (iter);
2729 g_object_unref (iter);
2735 * Shows a confirmation dialog to the user when we're moving messages
2736 * from a remote server to the local storage. Returns the dialog
2737 * response. If it's other kind of movement the it always returns
2741 msgs_move_to_confirmation (GtkWindow *win,
2742 TnyFolder *dest_folder,
2745 gint response = GTK_RESPONSE_OK;
2747 /* If the destination is a local folder */
2748 if (modest_tny_folder_is_local_folder (dest_folder)) {
2749 TnyFolder *src_folder;
2753 /* Get source folder */
2754 iter = tny_list_create_iterator (headers);
2755 header = TNY_HEADER (tny_iterator_get_current (iter));
2756 src_folder = tny_header_get_folder (header);
2757 g_object_unref (header);
2758 g_object_unref (iter);
2760 /* If the source is a remote folder */
2761 if (!modest_tny_folder_is_local_folder (src_folder)) {
2762 const gchar *message;
2764 if (has_retrieved_msgs (headers))
2765 message = ngettext ("mcen_nc_move_retrieve", "mcen_nc_move_retrieves",
2766 tny_list_get_length (headers));
2768 message = ngettext ("mcen_nc_move_header", "mcen_nc_move_headers",
2769 tny_list_get_length (headers));
2771 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
2772 (const gchar *) message);
2774 g_object_unref (src_folder);
2781 transfer_msgs_from_viewer_cb (const GObject *object, gpointer user_data)
2783 ModestMsgViewWindow *self = NULL;
2785 g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (object));
2786 self = MODEST_MSG_VIEW_WINDOW (object);
2788 /* If there are not more messages don't do anything. The
2789 viewer will show the same message */
2790 if (!modest_msg_view_window_select_first_message (self))
2795 modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op,
2798 GObject *win = modest_mail_operation_get_source (mail_op);
2800 /* TODO: show error message */
2801 modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL,
2802 _("mail_in_ui_folder_move_target_error"));
2803 g_object_unref (win);
2807 * UI handler for the "Move to" action when invoked from the
2811 modest_ui_actions_on_main_window_move_to (GtkAction *action,
2812 ModestMainWindow *win)
2814 GtkWidget *dialog = NULL, *folder_view = NULL, *tree_view = NULL;
2815 GtkWidget *header_view = NULL;
2817 TnyFolderStore *folder_store = NULL;
2818 ModestMailOperation *mail_op = NULL;
2820 g_return_if_fail (MODEST_IS_MAIN_WINDOW (win));
2822 /* Get the folder view */
2823 folder_view = modest_main_window_get_child_widget (win,
2824 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2826 /* Get header view */
2827 header_view = modest_main_window_get_child_widget (win,
2828 MODEST_WIDGET_TYPE_HEADER_VIEW);
2830 /* Create and run the dialog */
2831 dialog = create_move_to_dialog (MODEST_WINDOW (win), folder_view, &tree_view);
2832 modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (tree_view));
2833 result = gtk_dialog_run (GTK_DIALOG(dialog));
2834 g_object_ref (tree_view);
2836 /* We do this to save an indentation level ;-) */
2837 if (result != GTK_RESPONSE_ACCEPT)
2840 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (tree_view));
2842 if (TNY_IS_ACCOUNT (folder_store))
2845 /* Get folder or messages to transfer */
2846 if (gtk_widget_is_focus (folder_view)) {
2847 TnyFolderStore *src_folder;
2848 src_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
2850 /* Clean folder on header view before moving it */
2851 modest_header_view_clear (MODEST_HEADER_VIEW (header_view));
2853 if (TNY_IS_FOLDER (src_folder)) {
2855 modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
2857 modest_ui_actions_move_folder_error_handler,
2859 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
2861 modest_mail_operation_xfer_folder (mail_op,
2862 TNY_FOLDER (src_folder),
2865 /* Unref mail operation */
2866 g_object_unref (G_OBJECT (mail_op));
2870 g_object_unref (G_OBJECT (src_folder));
2872 if (gtk_widget_is_focus (header_view)) {
2876 headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (header_view));
2878 /* Ask for user confirmation */
2879 response = msgs_move_to_confirmation (GTK_WINDOW (win),
2880 TNY_FOLDER (folder_store),
2883 /* Transfer messages */
2884 if (response == GTK_RESPONSE_OK) {
2885 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(win));
2886 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
2889 modest_mail_operation_xfer_msgs (mail_op,
2891 TNY_FOLDER (folder_store),
2896 g_object_unref (G_OBJECT (mail_op));
2898 g_object_unref (headers);
2902 if (folder_store != NULL)
2903 g_object_unref (folder_store);
2904 gtk_widget_destroy (dialog);
2909 * UI handler for the "Move to" action when invoked from the
2910 * ModestMsgViewWindow
2913 modest_ui_actions_on_msg_view_window_move_to (GtkAction *action,
2914 ModestMsgViewWindow *win)
2916 GtkWidget *dialog, *folder_view, *tree_view = NULL;
2918 ModestMainWindow *main_window;
2922 /* Get the folder view */
2923 main_window = MODEST_MAIN_WINDOW (modest_window_mgr_get_main_window (modest_runtime_get_window_mgr ()));
2925 folder_view = modest_main_window_get_child_widget (main_window,
2926 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2930 /* Create and run the dialog */
2931 dialog = create_move_to_dialog (MODEST_WINDOW (win), folder_view, &tree_view);
2932 result = gtk_dialog_run (GTK_DIALOG(dialog));
2933 g_object_ref (tree_view);
2935 if (result == GTK_RESPONSE_ACCEPT) {
2936 TnyFolderStore *folder_store;
2939 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (tree_view));
2941 /* Create header list */
2942 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
2943 headers = tny_simple_list_new ();
2944 tny_list_prepend (headers, G_OBJECT (header));
2945 g_object_unref (header);
2947 /* Ask user for confirmation. MSG-NOT404 */
2948 response = msgs_move_to_confirmation (GTK_WINDOW (win),
2949 TNY_FOLDER (folder_store),
2952 /* Transfer current msg */
2953 if (response == GTK_RESPONSE_OK) {
2954 ModestMailOperation *mail_op;
2956 /* Create mail op */
2957 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(win));
2958 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
2961 /* Transfer messages */
2962 modest_mail_operation_xfer_msgs (mail_op,
2964 TNY_FOLDER (folder_store),
2966 transfer_msgs_from_viewer_cb,
2968 g_object_unref (G_OBJECT (mail_op));
2970 g_object_unref (headers);
2971 g_object_unref (folder_store);
2973 gtk_widget_destroy (dialog);
2977 modest_ui_actions_on_move_to (GtkAction *action,
2980 g_return_if_fail (MODEST_IS_MAIN_WINDOW (win) ||
2981 MODEST_IS_MSG_VIEW_WINDOW (win));
2983 if (MODEST_IS_MAIN_WINDOW (win))
2984 modest_ui_actions_on_main_window_move_to (action,
2985 MODEST_MAIN_WINDOW (win));
2987 modest_ui_actions_on_msg_view_window_move_to (action,
2988 MODEST_MSG_VIEW_WINDOW (win));
2992 * Calls #HeadersFunc for each header already selected in the main
2993 * window or the message currently being shown in the msg view window
2996 do_headers_action (ModestWindow *win,
3000 TnyList *headers_list;
3006 headers_list = get_selected_headers (win);
3010 /* Get the folder */
3011 iter = tny_list_create_iterator (headers_list);
3012 header = TNY_HEADER (tny_iterator_get_current (iter));
3013 folder = tny_header_get_folder (header);
3014 g_object_unref (header);
3016 /* Call the function for each header */
3017 while (!tny_iterator_is_done (iter)) {
3018 header = TNY_HEADER (tny_iterator_get_current (iter));
3019 func (header, win, user_data);
3020 g_object_unref (header);
3021 tny_iterator_next (iter);
3024 /* Trick: do a poke status in order to speed up the signaling
3026 tny_folder_poke_status (folder);
3029 g_object_unref (folder);
3030 g_object_unref (iter);
3031 g_object_unref (headers_list);
3035 modest_ui_actions_view_attachment (GtkAction *action,
3036 ModestWindow *window)
3038 if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
3039 modest_msg_view_window_view_attachment (MODEST_MSG_VIEW_WINDOW (window), NULL);
3041 /* not supported window for this action */
3042 g_return_if_reached ();
3047 modest_ui_actions_save_attachments (GtkAction *action,
3048 ModestWindow *window)
3050 if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
3051 modest_msg_view_window_save_attachments (MODEST_MSG_VIEW_WINDOW (window), NULL);
3053 /* not supported window for this action */
3054 g_return_if_reached ();
3059 modest_ui_actions_remove_attachments (GtkAction *action,
3060 ModestWindow *window)
3062 if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
3063 modest_msg_view_window_remove_attachments (MODEST_MSG_VIEW_WINDOW (window));
3065 /* not supported window for this action */
3066 g_return_if_reached ();
3071 modest_ui_actions_on_settings (GtkAction *action,
3076 dialog = modest_platform_get_global_settings_dialog ();
3077 gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (win));
3078 gtk_widget_show (dialog);
3080 gtk_dialog_run (GTK_DIALOG (dialog));
3082 gtk_widget_destroy (dialog);
3086 modest_ui_actions_on_help (GtkAction *action,
3089 const gchar *help_id = NULL;
3091 if (MODEST_IS_MAIN_WINDOW (win)) {
3092 const gchar *action_name;
3093 action_name = gtk_action_get_name (action);
3095 if (!strcmp (action_name, "FolderViewCSMHelp") ||
3096 !strcmp (action_name, "HeaderViewCSMHelp")) {
3097 GtkWidget *folder_view;
3098 TnyFolderStore *folder_store;
3099 /* Get selected folder */
3100 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
3101 MODEST_WIDGET_TYPE_FOLDER_VIEW);
3102 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
3104 /* Switch help_id */
3105 if (TNY_IS_FOLDER (folder_store)) {
3106 switch (tny_folder_get_folder_type (TNY_FOLDER (folder_store))) {
3107 case TNY_FOLDER_TYPE_NORMAL:
3108 help_id = "applications_email_userfolder";
3110 case TNY_FOLDER_TYPE_INBOX:
3111 help_id = "applications_email_inbox";
3113 case TNY_FOLDER_TYPE_OUTBOX:
3114 help_id = "applications_email_outbox";
3116 case TNY_FOLDER_TYPE_SENT:
3117 help_id = "applications_email_sent";
3119 case TNY_FOLDER_TYPE_DRAFTS:
3120 help_id = "applications_email_drafts";
3122 case TNY_FOLDER_TYPE_ARCHIVE:
3123 help_id = "applications_email_archive";
3129 g_object_unref (folder_store);
3131 help_id = "applications_email_mainview";
3133 } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
3134 help_id = "applications_email_viewer";
3135 } else if (MODEST_IS_MSG_EDIT_WINDOW (win))
3136 help_id = "applications_email_editor";
3138 modest_platform_show_help (GTK_WINDOW (win), help_id);
3142 modest_ui_actions_on_retrieve_msg_contents (GtkAction *action,
3143 ModestWindow *window)
3145 ModestMailOperation *mail_op;
3149 headers = get_selected_headers (window);
3153 /* Create mail operation */
3154 mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
3156 modest_ui_actions_get_msgs_full_error_handler,
3158 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
3159 modest_mail_operation_get_msgs_full (mail_op, headers, NULL, NULL, NULL);
3162 g_object_unref (headers);
3163 g_object_unref (mail_op);
3167 modest_ui_actions_on_email_menu_activated (GtkAction *action,
3168 ModestWindow *window)
3170 g_return_if_fail (MODEST_IS_WINDOW (window));
3173 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3177 modest_ui_actions_on_edit_menu_activated (GtkAction *action,
3178 ModestWindow *window)
3180 g_return_if_fail (MODEST_IS_WINDOW (window));
3183 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3187 modest_ui_actions_on_view_menu_activated (GtkAction *action,
3188 ModestWindow *window)
3190 g_return_if_fail (MODEST_IS_WINDOW (window));
3193 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3197 modest_ui_actions_on_tools_menu_activated (GtkAction *action,
3198 ModestWindow *window)
3200 g_return_if_fail (MODEST_IS_WINDOW (window));
3203 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3207 modest_ui_actions_on_attachment_menu_activated (GtkAction *action,
3208 ModestWindow *window)
3210 g_return_if_fail (MODEST_IS_WINDOW (window));
3213 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3217 modest_ui_actions_on_toolbar_csm_menu_activated (GtkAction *action,
3218 ModestWindow *window)
3220 g_return_if_fail (MODEST_IS_WINDOW (window));
3223 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3227 modest_ui_actions_on_folder_view_csm_menu_activated (GtkAction *action,
3228 ModestWindow *window)
3230 g_return_if_fail (MODEST_IS_WINDOW (window));
3233 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3237 modest_ui_actions_on_header_view_csm_menu_activated (GtkAction *action,
3238 ModestWindow *window)
3240 g_return_if_fail (MODEST_IS_WINDOW (window));
3243 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3247 modest_ui_actions_check_toolbar_dimming_rules (ModestWindow *window)
3249 g_return_if_fail (MODEST_IS_WINDOW (window));
3252 modest_window_check_dimming_rules_group (window, "ModestToolbarDimmingRules");
3256 modest_ui_actions_on_search_messages (GtkAction *action, ModestWindow *window)
3258 g_return_if_fail (MODEST_IS_WINDOW (window));
3260 modest_platform_show_search_messages (GTK_WINDOW (window));
3264 modest_ui_actions_on_open_addressbook (GtkAction *action, ModestWindow *win)
3266 g_return_if_fail (MODEST_IS_WINDOW (win));
3267 modest_platform_show_addressbook (GTK_WINDOW (win));
3272 modest_ui_actions_on_toggle_find_in_page (GtkToggleAction *action,
3273 ModestWindow *window)
3275 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
3277 modest_msg_edit_window_toggle_find_toolbar (MODEST_MSG_EDIT_WINDOW (window), gtk_toggle_action_get_active (action));
3281 _on_send_receive_progress_changed (ModestMailOperation *mail_op,
3282 ModestMailOperationState *state,
3285 g_return_if_fail (MODEST_IS_MAIN_WINDOW(user_data));
3287 /* Set send/receive operation finished */
3288 if (state->status != MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS)
3289 modest_main_window_notify_send_receive_completed (MODEST_MAIN_WINDOW(user_data));