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 = NULL;
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);
671 * This function is the error handler of the
672 * modest_mail_operation_get_msgs_full operation
675 modest_ui_actions_get_msgs_full_error_handler (ModestMailOperation *mail_op,
680 error = modest_mail_operation_get_error (mail_op);
681 if (error->code == MODEST_MAIL_OPERATION_ERROR_MESSAGE_SIZE_LIMIT) {
682 GObject *win = modest_mail_operation_get_source (mail_op);
684 modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL,
686 g_object_unref (win);
691 * This function is used by both modest_ui_actions_on_open and
692 * modest_ui_actions_on_header_activated. This way we always do the
693 * same when trying to open messages.
696 _modest_ui_actions_open (TnyList *headers, ModestWindow *win)
698 ModestWindowMgr *mgr;
700 ModestMailOperation *mail_op;
701 TnyList *not_opened_headers;
703 /* Look if we already have a message view for each header. If
704 true, then remove the header from the list of headers to
706 mgr = modest_runtime_get_window_mgr ();
707 iter = tny_list_create_iterator (headers);
708 not_opened_headers = tny_simple_list_new ();
709 while (!tny_iterator_is_done (iter)) {
710 ModestWindow *window;
713 header = TNY_HEADER (tny_iterator_get_current (iter));
714 window = modest_window_mgr_find_window_by_header (mgr, header);
715 /* Do not open again the message and present the
716 window to the user */
718 gtk_window_present (GTK_WINDOW (window));
720 tny_list_append (not_opened_headers, G_OBJECT (header));
722 g_object_unref (header);
723 tny_iterator_next (iter);
726 /* Open each message */
727 mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
729 modest_ui_actions_get_msgs_full_error_handler,
731 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
732 if (tny_list_get_length (not_opened_headers) > 1) {
733 modest_mail_operation_get_msgs_full (mail_op,
739 TnyIterator *iter = tny_list_create_iterator (not_opened_headers);
740 TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter));
741 modest_mail_operation_get_msg (mail_op, header, open_msg_cb, NULL);
742 g_object_unref (header);
743 g_object_unref (iter);
747 g_object_unref (not_opened_headers);
748 g_object_unref (iter);
749 g_object_unref (mail_op);
753 modest_ui_actions_on_open (GtkAction *action, ModestWindow *win)
758 headers = get_selected_headers (win);
763 _modest_ui_actions_open (headers, win);
765 g_object_unref(headers);
770 free_reply_forward_helper (gpointer data)
772 ReplyForwardHelper *helper;
774 helper = (ReplyForwardHelper *) data;
775 g_free (helper->account_name);
776 g_slice_free (ReplyForwardHelper, helper);
780 reply_forward_cb (ModestMailOperation *mail_op,
786 ReplyForwardHelper *rf_helper;
787 ModestWindow *msg_win = NULL;
788 ModestEditType edit_type;
790 TnyAccount *account = NULL;
791 ModestWindowMgr *mgr = NULL;
792 gchar *signature = NULL;
794 g_return_if_fail (user_data != NULL);
795 rf_helper = (ReplyForwardHelper *) user_data;
797 from = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(),
798 rf_helper->account_name);
799 if (modest_account_mgr_get_bool (modest_runtime_get_account_mgr(),
800 rf_helper->account_name,
801 MODEST_ACCOUNT_USE_SIGNATURE, FALSE)) {
802 signature = modest_account_mgr_get_string (modest_runtime_get_account_mgr (),
803 rf_helper->account_name,
804 MODEST_ACCOUNT_SIGNATURE, FALSE);
807 /* Create reply mail */
808 switch (rf_helper->action) {
811 modest_tny_msg_create_reply_msg (msg, from, signature,
812 rf_helper->reply_forward_type,
813 MODEST_TNY_MSG_REPLY_MODE_SENDER);
815 case ACTION_REPLY_TO_ALL:
817 modest_tny_msg_create_reply_msg (msg, from, signature, rf_helper->reply_forward_type,
818 MODEST_TNY_MSG_REPLY_MODE_ALL);
819 edit_type = MODEST_EDIT_TYPE_REPLY;
823 modest_tny_msg_create_forward_msg (msg, from, signature, rf_helper->reply_forward_type);
824 edit_type = MODEST_EDIT_TYPE_FORWARD;
827 g_return_if_reached ();
834 g_printerr ("modest: failed to create message\n");
838 account = modest_tny_account_store_get_server_account (modest_runtime_get_account_store(),
839 rf_helper->account_name,
840 TNY_ACCOUNT_TYPE_STORE);
842 g_printerr ("modest: failed to get tnyaccount for '%s'\n", rf_helper->account_name);
846 /* Create and register the windows */
847 msg_win = modest_msg_edit_window_new (new_msg, rf_helper->account_name);
848 mgr = modest_runtime_get_window_mgr ();
849 modest_window_mgr_register_window (mgr, msg_win);
851 if (rf_helper->parent_window != NULL) {
854 parent_zoom = modest_window_get_zoom (MODEST_WINDOW (rf_helper->parent_window));
855 modest_window_set_zoom (msg_win, parent_zoom);
858 /* Show edit window */
859 gtk_widget_show_all (GTK_WIDGET (msg_win));
863 g_object_unref (msg_win);
865 g_object_unref (G_OBJECT (new_msg));
867 g_object_unref (G_OBJECT (account));
868 g_object_unref (msg);
869 g_object_unref (header);
873 * Checks a list of headers. If any of them are not currently
874 * downloaded (CACHED) then it asks the user for permission to
877 * Returns FALSE if the user does not want to download the
878 * messages. Returns TRUE if the user allowed the download or if all
879 * of them are currently downloaded
882 download_uncached_messages (TnyList *header_list, GtkWindow *win)
885 gboolean found, retval;
887 iter = tny_list_create_iterator (header_list);
889 while (!tny_iterator_is_done (iter) && !found) {
891 TnyHeaderFlags flags;
893 header = TNY_HEADER (tny_iterator_get_current (iter));
894 flags = tny_header_get_flags (header);
895 /* TODO: is this the right flag?, it seems that some
896 headers that have been previously downloaded do not
898 found = !(flags & TNY_HEADER_FLAG_CACHED);
899 g_object_unref (header);
900 tny_iterator_next (iter);
902 g_object_unref (iter);
904 /* Ask for user permission to download the messages */
907 GtkResponseType response;
909 modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
910 _("mcen_nc_get_multi_msg_txt"));
911 if (response == GTK_RESPONSE_CANCEL)
919 * Common code for the reply and forward actions
922 reply_forward (ReplyForwardAction action, ModestWindow *win)
924 ModestMailOperation *mail_op = NULL;
925 TnyList *header_list = NULL;
926 ReplyForwardHelper *rf_helper = NULL;
927 guint reply_forward_type;
928 gboolean continue_download;
930 g_return_if_fail (MODEST_IS_WINDOW(win));
932 /* we need an account when editing */
933 if (!modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE)) {
934 run_account_setup_wizard (win);
938 header_list = get_selected_headers (win);
942 /* Check that the messages have been previously downloaded */
943 continue_download = download_uncached_messages (header_list, GTK_WINDOW (win));
944 if (!continue_download) {
945 g_object_unref (header_list);
950 modest_conf_get_int (modest_runtime_get_conf (),
951 (action == ACTION_FORWARD) ? MODEST_CONF_FORWARD_TYPE : MODEST_CONF_REPLY_TYPE,
953 /* We assume that we can only select messages of the
954 same folder and that we reply all of them from the
955 same account. In fact the interface currently only
956 allows single selection */
959 rf_helper = g_slice_new0 (ReplyForwardHelper);
960 rf_helper->reply_forward_type = reply_forward_type;
961 rf_helper->action = action;
962 rf_helper->account_name = g_strdup (modest_window_get_active_account (win));
963 if ((win != NULL) && (MODEST_IS_WINDOW (win)))
964 rf_helper->parent_window = GTK_WIDGET (win);
965 if (!rf_helper->account_name)
966 rf_helper->account_name =
967 modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
969 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
972 /* Get header and message. Do not free them here, the
973 reply_forward_cb must do it */
974 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW(win));
975 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(win));
976 if (!msg || !header) {
978 g_object_unref (msg);
980 g_object_unref (header);
981 g_printerr ("modest: no message found\n");
984 reply_forward_cb (NULL, header, msg, rf_helper);
986 /* Retrieve messages */
987 mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
989 modest_ui_actions_get_msgs_full_error_handler,
991 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
992 modest_mail_operation_get_msgs_full (mail_op,
996 free_reply_forward_helper);
999 g_object_unref(mail_op);
1003 g_object_unref (header_list);
1007 modest_ui_actions_on_reply (GtkAction *action, ModestWindow *win)
1009 g_return_if_fail (MODEST_IS_WINDOW(win));
1011 reply_forward (ACTION_REPLY, win);
1015 modest_ui_actions_on_forward (GtkAction *action, ModestWindow *win)
1017 g_return_if_fail (MODEST_IS_WINDOW(win));
1019 reply_forward (ACTION_FORWARD, win);
1023 modest_ui_actions_on_reply_all (GtkAction *action, ModestWindow *win)
1025 g_return_if_fail (MODEST_IS_WINDOW(win));
1027 reply_forward (ACTION_REPLY_TO_ALL, win);
1031 modest_ui_actions_on_next (GtkAction *action,
1032 ModestWindow *window)
1034 if (MODEST_IS_MAIN_WINDOW (window)) {
1035 GtkWidget *header_view;
1037 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
1038 MODEST_WIDGET_TYPE_HEADER_VIEW);
1042 modest_header_view_select_next (MODEST_HEADER_VIEW(header_view));
1043 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
1044 modest_msg_view_window_select_next_message (MODEST_MSG_VIEW_WINDOW (window));
1046 g_return_if_reached ();
1051 modest_ui_actions_on_prev (GtkAction *action,
1052 ModestWindow *window)
1054 g_return_if_fail (MODEST_IS_WINDOW(window));
1056 if (MODEST_IS_MAIN_WINDOW (window)) {
1057 GtkWidget *header_view;
1058 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
1059 MODEST_WIDGET_TYPE_HEADER_VIEW);
1063 modest_header_view_select_prev (MODEST_HEADER_VIEW(header_view));
1064 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
1065 modest_msg_view_window_select_previous_message (MODEST_MSG_VIEW_WINDOW (window));
1067 g_return_if_reached ();
1072 modest_ui_actions_on_sort (GtkAction *action,
1073 ModestWindow *window)
1075 g_return_if_fail (MODEST_IS_WINDOW(window));
1077 if (MODEST_IS_MAIN_WINDOW (window)) {
1078 GtkWidget *header_view;
1079 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
1080 MODEST_WIDGET_TYPE_HEADER_VIEW);
1084 /* Show sorting dialog */
1085 modest_platform_run_sort_dialog (GTK_WINDOW (window), MODEST_SORT_HEADERS);
1090 new_messages_arrived (ModestMailOperation *self,
1094 if (new_messages == 0)
1097 modest_platform_on_new_msg ();
1101 * This function performs the send & receive required actions. The
1102 * window is used to create the mail operation. Typically it should
1103 * always be the main window, but we pass it as argument in order to
1107 modest_ui_actions_do_send_receive (const gchar *account_name, ModestWindow *win)
1109 gchar *acc_name = NULL;
1110 ModestMailOperation *mail_op;
1112 /* If no account name was provided then get the current account, and if
1113 there is no current account then pick the default one: */
1114 if (!account_name) {
1115 acc_name = g_strdup (modest_window_get_active_account(win));
1117 acc_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
1119 g_printerr ("modest: cannot get default account\n");
1123 acc_name = g_strdup (account_name);
1126 /* Set send/receive operation in progress */
1127 modest_main_window_notify_send_receive_initied (MODEST_MAIN_WINDOW(win));
1129 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(win));
1130 g_signal_connect (G_OBJECT(mail_op), "progress-changed",
1131 G_CALLBACK (_on_send_receive_progress_changed),
1134 /* Send & receive. */
1135 /* TODO: The spec wants us to first do any pending deletions, before receiving. */
1136 /* Receive and then send. The operation is tagged initially as
1137 a receive operation because the account update performs a
1138 receive and then a send. The operation changes its type
1139 internally, so the progress objects will receive the proper
1140 progress information */
1141 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
1142 modest_mail_operation_update_account (mail_op, acc_name, new_messages_arrived, NULL);
1143 g_object_unref (G_OBJECT (mail_op));
1150 * Refreshes all accounts. This function will be used by automatic
1154 modest_ui_actions_do_send_receive_all (ModestWindow *win)
1156 GSList *account_names, *iter;
1158 account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr(),
1161 iter = account_names;
1163 modest_ui_actions_do_send_receive ((const char*) iter->data, win);
1164 iter = g_slist_next (iter);
1167 modest_account_mgr_free_account_names (account_names);
1168 account_names = NULL;
1172 * Handler of the click on Send&Receive button in the main toolbar
1175 modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win)
1177 /* Check if accounts exist */
1178 gboolean accounts_exist =
1179 modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE);
1181 /* If not, allow the user to create an account before trying to send/receive. */
1182 if (!accounts_exist)
1183 modest_ui_actions_on_accounts (NULL, win);
1185 /* Refresh the active account */
1186 modest_ui_actions_do_send_receive (NULL, win);
1191 modest_ui_actions_toggle_header_list_view (GtkAction *action, ModestMainWindow *main_window)
1194 GtkWidget *header_view;
1196 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1198 header_view = modest_main_window_get_child_widget (main_window,
1199 MODEST_WIDGET_TYPE_HEADER_VIEW);
1203 conf = modest_runtime_get_conf ();
1205 /* what is saved/restored is depending on the style; thus; we save with
1206 * old style, then update the style, and restore for this new style
1208 modest_widget_memory_save (conf, G_OBJECT(header_view), MODEST_CONF_HEADER_VIEW_KEY);
1210 if (modest_header_view_get_style
1211 (MODEST_HEADER_VIEW(header_view)) == MODEST_HEADER_VIEW_STYLE_DETAILS)
1212 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
1213 MODEST_HEADER_VIEW_STYLE_TWOLINES);
1215 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
1216 MODEST_HEADER_VIEW_STYLE_DETAILS);
1218 modest_widget_memory_restore (conf, G_OBJECT(header_view),
1219 MODEST_CONF_HEADER_VIEW_KEY);
1224 modest_ui_actions_on_header_selected (ModestHeaderView *header_view,
1226 ModestMainWindow *main_window)
1228 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1229 g_return_if_fail (MODEST_IS_HEADER_VIEW (header_view));
1231 /* If no header has been selected then exit */
1236 if (!gtk_widget_is_focus (GTK_WIDGET(header_view)))
1237 gtk_widget_grab_focus (GTK_WIDGET(header_view));
1239 /* Update Main window title */
1240 if (gtk_widget_is_focus (GTK_WIDGET(header_view))) {
1241 const gchar *subject = tny_header_get_subject (header);
1242 if (subject && strlen(subject) > 0)
1243 gtk_window_set_title (GTK_WINDOW (main_window), subject);
1245 gtk_window_set_title (GTK_WINDOW (main_window), _("mail_va_no_subject"));
1248 /* Update toolbar dimming state */
1249 modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
1253 modest_ui_actions_on_header_activated (ModestHeaderView *header_view,
1255 ModestMainWindow *main_window)
1259 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1264 headers = tny_simple_list_new ();
1265 tny_list_prepend (headers, G_OBJECT (header));
1267 _modest_ui_actions_open (headers, MODEST_WINDOW (main_window));
1269 g_object_unref (headers);
1273 set_active_account_from_tny_account (TnyAccount *account,
1274 ModestWindow *window)
1276 const gchar *server_acc_name = tny_account_get_id (account);
1278 /* We need the TnyAccount provided by the
1279 account store because that is the one that
1280 knows the name of the Modest account */
1281 TnyAccount *modest_server_account = modest_server_account =
1282 modest_tny_account_store_get_tny_account_by (modest_runtime_get_account_store (),
1283 MODEST_TNY_ACCOUNT_STORE_QUERY_ID,
1286 const gchar *modest_acc_name =
1287 modest_tny_account_get_parent_modest_account_name_for_server_account (modest_server_account);
1288 modest_window_set_active_account (window, modest_acc_name);
1289 g_object_unref (modest_server_account);
1294 folder_refreshed_cb (const GObject *obj,
1298 ModestMainWindow *win = NULL;
1299 GtkWidget *header_view;
1301 g_return_if_fail (TNY_IS_FOLDER (folder));
1303 win = MODEST_MAIN_WINDOW (user_data);
1305 modest_main_window_get_child_widget(win, MODEST_WIDGET_TYPE_HEADER_VIEW);
1307 /* Check if folder is empty and set headers view contents style */
1308 if (tny_folder_get_all_count (folder) == 0) {
1309 printf ("DEBUG: %s: tny_folder_get_all_count() returned 0.\n", __FUNCTION__);
1310 modest_main_window_set_contents_style (win,
1311 MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY);
1313 printf ("DEBUG: %s: tny_folder_get_all_count() returned >0.\n", __FUNCTION__);
1318 modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
1319 TnyFolderStore *folder_store,
1321 ModestMainWindow *main_window)
1324 GtkWidget *header_view;
1326 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1328 header_view = modest_main_window_get_child_widget(main_window,
1329 MODEST_WIDGET_TYPE_HEADER_VIEW);
1333 conf = modest_runtime_get_conf ();
1335 if (TNY_IS_ACCOUNT (folder_store)) {
1337 /* Update active account */
1338 set_active_account_from_tny_account (TNY_ACCOUNT (folder_store), MODEST_WINDOW (main_window));
1339 /* Show account details */
1340 modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS);
1343 if (TNY_IS_FOLDER (folder_store) && selected) {
1345 /* Update the active account */
1346 TnyAccount *account = modest_tny_folder_get_account (TNY_FOLDER (folder_store));
1348 set_active_account_from_tny_account (account, MODEST_WINDOW (main_window));
1349 g_object_unref (account);
1353 /* Set the header style by default, it could
1354 be changed later by the refresh callback to
1356 modest_main_window_set_contents_style (main_window,
1357 MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS);
1359 /* Set folder on header view. This function
1360 will call tny_folder_refresh_async so we
1361 pass a callback that will be called when
1362 finished. We use that callback to set the
1363 empty view if there are no messages */
1364 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view),
1365 TNY_FOLDER (folder_store),
1366 folder_refreshed_cb,
1369 /* Restore configuration. We need to do this
1370 *after* the set_folder because the widget
1371 memory asks the header view about its
1373 modest_widget_memory_restore (modest_runtime_get_conf (),
1374 G_OBJECT(header_view),
1375 MODEST_CONF_HEADER_VIEW_KEY);
1377 /* Update the active account */
1378 modest_window_set_active_account (MODEST_WINDOW (main_window), NULL);
1379 /* Save only if we're seeing headers */
1380 if (modest_main_window_get_contents_style (main_window) ==
1381 MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS)
1382 modest_widget_memory_save (conf, G_OBJECT (header_view),
1383 MODEST_CONF_HEADER_VIEW_KEY);
1384 modest_header_view_clear (MODEST_HEADER_VIEW(header_view));
1388 /* Update toolbar dimming state */
1389 modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
1393 modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemType type,
1400 item = (type == MODEST_ITEM_TYPE_FOLDER) ? "folder" : "message";
1402 if (g_main_depth > 0)
1403 gdk_threads_enter ();
1404 online = tny_device_is_online (modest_runtime_get_device());
1407 /* already online -- the item is simply not there... */
1408 dialog = gtk_message_dialog_new (GTK_WINDOW (win),
1410 GTK_MESSAGE_WARNING,
1412 _("The %s you selected cannot be found"),
1414 gtk_dialog_run (GTK_DIALOG(dialog));
1416 dialog = gtk_dialog_new_with_buttons (_("Connection requested"),
1420 GTK_RESPONSE_REJECT,
1422 GTK_RESPONSE_ACCEPT,
1424 txt = g_strdup_printf (_("This %s is not available in offline mode.\n"
1425 "Do you want to get online?"), item);
1426 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1427 gtk_label_new (txt), FALSE, FALSE, 0);
1428 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1431 gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300);
1432 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
1433 // modest_platform_connect_and_wait ();
1436 gtk_widget_destroy (dialog);
1437 if (g_main_depth > 0)
1438 gdk_threads_leave ();
1442 modest_ui_actions_on_msg_link_hover (ModestMsgView *msgview, const gchar* link,
1445 /* g_message ("%s %s", __FUNCTION__, link); */
1450 modest_ui_actions_on_msg_link_clicked (ModestMsgView *msgview, const gchar* link,
1453 modest_platform_activate_uri (link);
1457 modest_ui_actions_on_msg_link_contextual (ModestMsgView *msgview, const gchar* link,
1460 modest_platform_show_uri_popup (link);
1464 modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, TnyMimePart *mime_part,
1467 modest_msg_view_window_view_attachment (MODEST_MSG_VIEW_WINDOW (win), mime_part);
1471 modest_ui_actions_on_msg_recpt_activated (ModestMsgView *msgview,
1472 const gchar *address,
1475 /* g_message ("%s %s", __FUNCTION__, address); */
1479 modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edit_window)
1481 TnyTransportAccount *transport_account;
1482 ModestMailOperation *mail_operation;
1484 gchar *account_name, *from;
1485 ModestAccountMgr *account_mgr;
1486 gchar *info_text = NULL;
1488 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
1490 data = modest_msg_edit_window_get_msg_data (edit_window);
1492 account_mgr = modest_runtime_get_account_mgr();
1493 account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
1495 account_name = modest_account_mgr_get_default_account (account_mgr);
1496 if (!account_name) {
1497 g_printerr ("modest: no account found\n");
1498 modest_msg_edit_window_free_msg_data (edit_window, data);
1502 if (!strcmp (account_name, MODEST_LOCAL_FOLDERS_ACCOUNT_ID)) {
1503 account_name = g_strdup (data->account_name);
1507 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_server_account
1508 (modest_runtime_get_account_store(),
1510 TNY_ACCOUNT_TYPE_TRANSPORT));
1511 if (!transport_account) {
1512 g_printerr ("modest: no transport account found for '%s'\n", account_name);
1513 g_free (account_name);
1514 modest_msg_edit_window_free_msg_data (edit_window, data);
1517 from = modest_account_mgr_get_from_string (account_mgr, account_name);
1519 /* Create the mail operation */
1520 mail_operation = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_INFO, G_OBJECT(edit_window));
1521 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
1523 modest_mail_operation_save_to_drafts (mail_operation,
1534 data->priority_flags);
1537 g_free (account_name);
1538 g_object_unref (G_OBJECT (transport_account));
1539 g_object_unref (G_OBJECT (mail_operation));
1541 modest_msg_edit_window_free_msg_data (edit_window, data);
1543 info_text = g_strdup_printf (_("mail_va_saved_to_drafts"), _("mcen_me_folder_drafts"));
1544 modest_platform_information_banner (NULL, NULL, info_text);
1548 /* For instance, when clicking the Send toolbar button when editing a message: */
1550 modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
1552 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
1554 if (!modest_msg_edit_window_check_names (edit_window))
1557 /* FIXME: Code added just for testing. The final version will
1558 use the send queue provided by tinymail and some
1560 ModestAccountMgr *account_mgr = modest_runtime_get_account_mgr();
1561 gchar *account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
1563 account_name = modest_account_mgr_get_default_account (account_mgr);
1565 if (!account_name) {
1566 g_printerr ("modest: no account found\n");
1570 MsgData *data = modest_msg_edit_window_get_msg_data (edit_window);
1572 if (!strcmp (account_name, MODEST_LOCAL_FOLDERS_ACCOUNT_ID)) {
1573 account_name = g_strdup (data->account_name);
1576 /* Get the currently-active transport account for this modest account: */
1577 TnyTransportAccount *transport_account =
1578 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_transport_account_for_open_connection
1579 (modest_runtime_get_account_store(),
1581 if (!transport_account) {
1582 g_printerr ("modest: no transport account found for '%s'\n", account_name);
1583 g_free (account_name);
1584 modest_msg_edit_window_free_msg_data (edit_window, data);
1588 gchar *from = modest_account_mgr_get_from_string (account_mgr, account_name);
1590 /* mail content checks and dialogs */
1591 if (data->subject == NULL || data->subject[0] == '\0') {
1592 GtkResponseType response;
1593 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (edit_window),
1594 _("mcen_nc_subject_is_empty_send"));
1595 if (response == GTK_RESPONSE_CANCEL) {
1596 g_free (account_name);
1601 if (data->plain_body == NULL || data->plain_body[0] == '\0') {
1602 GtkResponseType response;
1603 gchar *note_message;
1604 gchar *note_subject = data->subject;
1605 if (note_subject == NULL || note_subject[0] == '\0')
1606 note_subject = _("mail_va_no_subject");
1607 note_message = g_strdup_printf (_("emev_ni_ui_smtp_message_null"), note_subject);
1608 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (edit_window),
1610 g_free (note_message);
1611 if (response == GTK_RESPONSE_CANCEL) {
1612 g_free (account_name);
1617 modest_platform_information_banner (NULL, NULL, _("mcen_ib_outbox_waiting_to_be_sent"));
1619 /* Create the mail operation */
1620 ModestMailOperation *mail_operation = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_SEND, G_OBJECT(edit_window));
1621 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
1623 modest_mail_operation_send_new_mail (mail_operation,
1634 data->priority_flags);
1638 g_free (account_name);
1639 g_object_unref (G_OBJECT (transport_account));
1640 g_object_unref (G_OBJECT (mail_operation));
1642 modest_msg_edit_window_free_msg_data (edit_window, data);
1644 /* Save settings and close the window: */
1645 gtk_widget_destroy (GTK_WIDGET (edit_window));
1649 modest_ui_actions_on_toggle_bold (GtkToggleAction *action,
1650 ModestMsgEditWindow *window)
1652 ModestMsgEditFormatState *format_state = NULL;
1654 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1655 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1657 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1660 format_state = modest_msg_edit_window_get_format_state (window);
1661 g_return_if_fail (format_state != NULL);
1663 format_state->bold = gtk_toggle_action_get_active (action);
1664 modest_msg_edit_window_set_format_state (window, format_state);
1665 g_free (format_state);
1670 modest_ui_actions_on_toggle_italics (GtkToggleAction *action,
1671 ModestMsgEditWindow *window)
1673 ModestMsgEditFormatState *format_state = NULL;
1675 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1676 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1678 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1681 format_state = modest_msg_edit_window_get_format_state (window);
1682 g_return_if_fail (format_state != NULL);
1684 format_state->italics = gtk_toggle_action_get_active (action);
1685 modest_msg_edit_window_set_format_state (window, format_state);
1686 g_free (format_state);
1691 modest_ui_actions_on_toggle_bullets (GtkToggleAction *action,
1692 ModestMsgEditWindow *window)
1694 ModestMsgEditFormatState *format_state = NULL;
1696 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1697 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1699 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1702 format_state = modest_msg_edit_window_get_format_state (window);
1703 g_return_if_fail (format_state != NULL);
1705 format_state->bullet = gtk_toggle_action_get_active (action);
1706 modest_msg_edit_window_set_format_state (window, format_state);
1707 g_free (format_state);
1712 modest_ui_actions_on_change_justify (GtkRadioAction *action,
1713 GtkRadioAction *selected,
1714 ModestMsgEditWindow *window)
1716 ModestMsgEditFormatState *format_state = NULL;
1717 GtkJustification value;
1719 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1721 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1724 value = gtk_radio_action_get_current_value (selected);
1726 format_state = modest_msg_edit_window_get_format_state (window);
1727 g_return_if_fail (format_state != NULL);
1729 format_state->justification = value;
1730 modest_msg_edit_window_set_format_state (window, format_state);
1731 g_free (format_state);
1735 modest_ui_actions_on_select_editor_color (GtkAction *action,
1736 ModestMsgEditWindow *window)
1738 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1739 g_return_if_fail (GTK_IS_ACTION (action));
1741 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1744 modest_msg_edit_window_select_color (window);
1748 modest_ui_actions_on_select_editor_background_color (GtkAction *action,
1749 ModestMsgEditWindow *window)
1751 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1752 g_return_if_fail (GTK_IS_ACTION (action));
1754 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1757 modest_msg_edit_window_select_background_color (window);
1761 modest_ui_actions_on_insert_image (GtkAction *action,
1762 ModestMsgEditWindow *window)
1764 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1765 g_return_if_fail (GTK_IS_ACTION (action));
1767 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1770 modest_msg_edit_window_insert_image (window);
1774 modest_ui_actions_on_attach_file (GtkAction *action,
1775 ModestMsgEditWindow *window)
1777 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1778 g_return_if_fail (GTK_IS_ACTION (action));
1780 modest_msg_edit_window_attach_file (window);
1784 modest_ui_actions_on_remove_attachments (GtkAction *action,
1785 ModestMsgEditWindow *window)
1787 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1788 g_return_if_fail (GTK_IS_ACTION (action));
1790 modest_msg_edit_window_remove_attachments (window, NULL);
1794 modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_window)
1796 TnyFolderStore *parent_folder;
1797 GtkWidget *folder_view;
1799 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1801 folder_view = modest_main_window_get_child_widget (main_window,
1802 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1806 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1808 if (parent_folder) {
1809 gboolean finished = FALSE;
1811 gchar *folder_name = NULL, *suggested_name = NULL;
1813 /* Run the new folder dialog */
1815 result = modest_platform_run_new_folder_dialog (GTK_WINDOW (main_window),
1820 if (result == GTK_RESPONSE_REJECT) {
1823 ModestMailOperation *mail_op;
1824 TnyFolder *new_folder = NULL;
1826 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_INFO,
1827 G_OBJECT(main_window));
1828 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1830 new_folder = modest_mail_operation_create_folder (mail_op,
1832 (const gchar *) folder_name);
1834 g_object_unref (new_folder);
1837 g_object_unref (mail_op);
1839 g_free (folder_name);
1843 g_object_unref (parent_folder);
1848 modest_ui_actions_on_rename_folder (GtkAction *action,
1849 ModestMainWindow *main_window)
1851 TnyFolderStore *folder;
1852 GtkWidget *folder_view;
1853 GtkWidget *header_view;
1855 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1857 folder_view = modest_main_window_get_child_widget (main_window,
1858 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1862 header_view = modest_main_window_get_child_widget (main_window,
1863 MODEST_WIDGET_TYPE_HEADER_VIEW);
1868 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1870 if (folder && TNY_IS_FOLDER (folder)) {
1873 const gchar *current_name;
1875 current_name = tny_folder_get_name (TNY_FOLDER (folder));
1876 response = modest_platform_run_rename_folder_dialog (GTK_WINDOW (main_window), NULL,
1877 current_name, &folder_name);
1879 if (response == GTK_RESPONSE_OK && strlen (folder_name) > 0) {
1880 ModestMailOperation *mail_op;
1882 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_INFO, G_OBJECT(main_window));
1883 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1886 modest_header_view_clear (MODEST_HEADER_VIEW (header_view));
1888 modest_mail_operation_rename_folder (mail_op,
1889 TNY_FOLDER (folder),
1890 (const gchar *) folder_name);
1892 g_object_unref (mail_op);
1893 g_free (folder_name);
1895 g_object_unref (folder);
1900 modest_ui_actions_delete_folder_error_handler (ModestMailOperation *mail_op,
1903 GObject *win = modest_mail_operation_get_source (mail_op);
1905 modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL,
1906 _("mail_in_ui_folder_delete_error"));
1907 g_object_unref (win);
1911 delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
1913 TnyFolderStore *folder;
1914 GtkWidget *folder_view;
1918 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1920 folder_view = modest_main_window_get_child_widget (main_window,
1921 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1925 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
1927 /* Show an error if it's an account */
1928 if (!TNY_IS_FOLDER (folder)) {
1929 modest_platform_run_information_dialog (GTK_WINDOW (main_window),
1930 _("mail_in_ui_folder_delete_error"));
1935 message = g_strdup_printf (_("mcen_nc_delete_folder_text"),
1936 tny_folder_get_name (TNY_FOLDER (folder)));
1937 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (main_window),
1938 (const gchar *) message);
1941 if (response == GTK_RESPONSE_OK) {
1942 ModestMailOperation *mail_op =
1943 modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_DELETE,
1944 G_OBJECT(main_window),
1945 modest_ui_actions_delete_folder_error_handler,
1948 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1950 modest_mail_operation_remove_folder (mail_op, TNY_FOLDER (folder), move_to_trash);
1951 g_object_unref (G_OBJECT (mail_op));
1954 g_object_unref (G_OBJECT (folder));
1958 modest_ui_actions_on_delete_folder (GtkAction *action,
1959 ModestMainWindow *main_window)
1961 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1963 delete_folder (main_window, FALSE);
1967 modest_ui_actions_on_move_folder_to_trash_folder (GtkAction *action, ModestMainWindow *main_window)
1969 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1971 delete_folder (main_window, TRUE);
1975 modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
1976 const gchar* server_account_name,
1981 ModestMainWindow *main_window)
1983 g_return_if_fail(server_account_name);
1984 /* printf("DEBUG: %s: server_account_name=%s\n", __FUNCTION__, server_account_name); */
1986 /* Initalize output parameters: */
1993 #ifdef MODEST_PLATFORM_MAEMO
1994 /* Maemo uses a different (awkward) button order,
1995 * It should probably just use gtk_alternative_dialog_button_order ().
1997 GtkWidget *dialog = gtk_dialog_new_with_buttons (_("mail_ti_password_protected"),
2001 GTK_RESPONSE_ACCEPT,
2003 GTK_RESPONSE_REJECT,
2006 GtkWidget *dialog = gtk_dialog_new_with_buttons (_("mail_ti_password_protected"),
2010 GTK_RESPONSE_REJECT,
2012 GTK_RESPONSE_ACCEPT,
2014 #endif /* MODEST_PLATFORM_MAEMO */
2016 gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(main_window));
2018 gchar *server_name = modest_server_account_get_hostname (
2019 modest_runtime_get_account_mgr(), server_account_name);
2020 if (!server_name) {/* This happened once, though I don't know why. murrayc. */
2021 g_warning("%s: Could not get server name for server account '%s'", __FUNCTION__, server_account_name);
2026 /* This causes a warning because the logical ID has no %s in it,
2027 * though the translation does, but there is not much we can do about that: */
2028 gchar *txt = g_strdup_printf (_("mail_ia_password_info"), server_name);
2029 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt),
2032 g_free (server_name);
2036 gchar *initial_username = modest_server_account_get_username (
2037 modest_runtime_get_account_mgr(), server_account_name);
2039 GtkWidget *entry_username = gtk_entry_new ();
2040 if (initial_username)
2041 gtk_entry_set_text (GTK_ENTRY (entry_username), initial_username);
2042 /* Dim this if a connection has ever succeeded with this username,
2043 * as per the UI spec: */
2044 const gboolean username_known =
2045 modest_server_account_get_username_has_succeeded(
2046 modest_runtime_get_account_mgr(), server_account_name);
2047 gtk_widget_set_sensitive (entry_username, !username_known);
2049 #ifdef MODEST_PLATFORM_MAEMO
2050 /* Auto-capitalization is the default, so let's turn it off: */
2051 hildon_gtk_entry_set_input_mode (GTK_ENTRY (entry_username), HILDON_GTK_INPUT_MODE_FULL);
2053 /* Create a size group to be used by all captions.
2054 * Note that HildonCaption does not create a default size group if we do not specify one.
2055 * We use GTK_SIZE_GROUP_HORIZONTAL, so that the widths are the same. */
2056 GtkSizeGroup *sizegroup = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
2058 GtkWidget *caption = hildon_caption_new (sizegroup,
2059 _("mail_fi_username"), entry_username, NULL, HILDON_CAPTION_MANDATORY);
2060 gtk_widget_show (entry_username);
2061 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), caption,
2062 FALSE, FALSE, MODEST_MARGIN_HALF);
2063 gtk_widget_show (caption);
2065 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry_username,
2067 #endif /* MODEST_PLATFORM_MAEMO */
2070 GtkWidget *entry_password = gtk_entry_new ();
2071 gtk_entry_set_visibility (GTK_ENTRY(entry_password), FALSE);
2072 /* gtk_entry_set_invisible_char (GTK_ENTRY(entry_password), "*"); */
2074 #ifdef MODEST_PLATFORM_MAEMO
2075 /* Auto-capitalization is the default, so let's turn it off: */
2076 hildon_gtk_entry_set_input_mode (GTK_ENTRY (entry_password),
2077 HILDON_GTK_INPUT_MODE_FULL | HILDON_GTK_INPUT_MODE_INVISIBLE);
2079 caption = hildon_caption_new (sizegroup,
2080 _("mail_fi_password"), entry_password, NULL, HILDON_CAPTION_MANDATORY);
2081 gtk_widget_show (entry_password);
2082 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), caption,
2083 FALSE, FALSE, MODEST_MARGIN_HALF);
2084 gtk_widget_show (caption);
2085 g_object_unref (sizegroup);
2087 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry_password,
2089 #endif /* MODEST_PLATFORM_MAEMO */
2091 /* This is not in the Maemo UI spec:
2092 remember_pass_check = gtk_check_button_new_with_label (_("Remember password"));
2093 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check,
2097 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
2099 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
2101 *username = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry_username)));
2103 modest_server_account_set_username (
2104 modest_runtime_get_account_mgr(), server_account_name,
2107 const gboolean username_was_changed =
2108 (strcmp (*username, initial_username) != 0);
2109 if (username_was_changed) {
2110 g_warning ("%s: tinymail does not yet support changing the "
2111 "username in the get_password() callback.\n", __FUNCTION__);
2116 *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry_password)));
2118 /* We do not save the password in the configuration,
2119 * because this function is only called for passwords that should
2120 * not be remembered:
2121 modest_server_account_set_password (
2122 modest_runtime_get_account_mgr(), server_account_name,
2141 /* This is not in the Maemo UI spec:
2142 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check)))
2148 gtk_widget_destroy (dialog);
2150 /* printf ("DEBUG: %s: cancel=%d\n", __FUNCTION__, *cancel); */
2154 modest_ui_actions_on_cut (GtkAction *action,
2155 ModestWindow *window)
2157 GtkWidget *focused_widget;
2159 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
2160 if (GTK_IS_EDITABLE (focused_widget)) {
2161 gtk_editable_cut_clipboard (GTK_EDITABLE(focused_widget));
2162 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
2163 GtkTextBuffer *buffer;
2164 GtkClipboard *clipboard;
2166 clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
2167 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
2168 gtk_text_buffer_cut_clipboard (buffer, clipboard, TRUE);
2169 } else if (MODEST_IS_HEADER_VIEW (focused_widget)) {
2170 modest_header_view_cut_selection (MODEST_HEADER_VIEW (focused_widget));
2171 } else if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
2172 modest_folder_view_cut_selection (MODEST_FOLDER_VIEW (focused_widget));
2177 modest_ui_actions_on_copy (GtkAction *action,
2178 ModestWindow *window)
2180 GtkClipboard *clipboard;
2181 GtkWidget *focused_widget;
2183 clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
2184 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
2186 if (GTK_IS_LABEL (focused_widget)) {
2187 gtk_clipboard_set_text (clipboard, gtk_label_get_text (GTK_LABEL (focused_widget)), -1);
2188 } else if (GTK_IS_EDITABLE (focused_widget)) {
2189 gtk_editable_copy_clipboard (GTK_EDITABLE(focused_widget));
2190 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
2191 GtkTextBuffer *buffer;
2192 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
2193 gtk_text_buffer_copy_clipboard (buffer, clipboard);
2194 modest_header_view_copy_selection (MODEST_HEADER_VIEW (focused_widget));
2195 } else if (MODEST_IS_HEADER_VIEW (focused_widget)) {
2196 TnyList *header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (focused_widget));
2197 TnyIterator *iter = tny_list_create_iterator (header_list);
2198 TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter));
2199 TnyFolder *folder = tny_header_get_folder (header);
2200 TnyAccount *account = tny_folder_get_account (folder);
2201 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (account));
2202 /* If it's POP then ask */
2203 gboolean ask = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
2204 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
2205 g_object_unref (account);
2206 g_object_unref (folder);
2207 g_object_unref (header);
2208 g_object_unref (iter);
2210 /* Check that the messages have been previously downloaded */
2211 gboolean continue_download = TRUE;
2213 continue_download = download_uncached_messages (header_list, GTK_WINDOW (window));
2214 if (continue_download)
2215 modest_header_view_copy_selection (MODEST_HEADER_VIEW (focused_widget));
2216 g_object_unref (header_list);
2217 } else if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
2218 modest_folder_view_copy_selection (MODEST_FOLDER_VIEW (focused_widget));
2221 /* Show information banner */
2222 modest_platform_information_banner (NULL, NULL, _CS("ecoc_ib_edwin_copied"));
2227 modest_ui_actions_on_undo (GtkAction *action,
2228 ModestWindow *window)
2230 if (MODEST_IS_MSG_EDIT_WINDOW (window)) {
2231 modest_msg_edit_window_undo (MODEST_MSG_EDIT_WINDOW (window));
2233 g_return_if_reached ();
2238 modest_ui_actions_on_paste (GtkAction *action,
2239 ModestWindow *window)
2241 GtkWidget *focused_widget;
2242 ModestMailOperation *mail_op = NULL;
2244 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
2245 if (GTK_IS_EDITABLE (focused_widget)) {
2246 gtk_editable_paste_clipboard (GTK_EDITABLE(focused_widget));
2247 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
2248 GtkTextBuffer *buffer;
2249 GtkClipboard *clipboard;
2251 clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
2252 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
2253 gtk_text_buffer_paste_clipboard (buffer, clipboard, NULL, TRUE);
2254 } else if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
2255 ModestEmailClipboard *clipboard = NULL;
2256 TnyFolder *src_folder = NULL;
2257 TnyFolderStore *folder_store = NULL;
2258 TnyList *data = NULL;
2259 gboolean delete = FALSE;
2261 /* Check clipboard source */
2262 clipboard = modest_runtime_get_email_clipboard ();
2263 if (modest_email_clipboard_cleared (clipboard))
2266 /* Get elements to paste */
2267 modest_email_clipboard_get_data (clipboard, &src_folder, &data, &delete);
2269 /* Create a new mail operation */
2270 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(window));
2271 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
2274 /* Get destination folder */
2275 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (focused_widget));
2277 /* transfer messages */
2279 modest_mail_operation_xfer_msgs (mail_op,
2281 TNY_FOLDER (folder_store),
2286 } else if (src_folder != NULL) {
2287 modest_mail_operation_xfer_folder (mail_op,
2295 g_object_unref (data);
2296 if (src_folder != NULL)
2297 g_object_unref (src_folder);
2298 if (folder_store != NULL)
2299 g_object_unref (folder_store);
2304 modest_ui_actions_on_select_all (GtkAction *action,
2305 ModestWindow *window)
2307 GtkWidget *focused_widget;
2309 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
2310 if (MODEST_IS_ATTACHMENTS_VIEW (focused_widget)) {
2311 modest_attachments_view_select_all (MODEST_ATTACHMENTS_VIEW (focused_widget));
2312 } else if (GTK_IS_LABEL (focused_widget)) {
2313 gtk_label_select_region (GTK_LABEL (focused_widget), 0, -1);
2314 } else if (GTK_IS_EDITABLE (focused_widget)) {
2315 gtk_editable_select_region (GTK_EDITABLE(focused_widget), 0, -1);
2316 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
2317 GtkTextBuffer *buffer;
2318 GtkTextIter start, end;
2320 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
2321 gtk_text_buffer_get_start_iter (buffer, &start);
2322 gtk_text_buffer_get_end_iter (buffer, &end);
2323 gtk_text_buffer_select_range (buffer, &start, &end);
2325 else if ((MODEST_IS_FOLDER_VIEW (focused_widget)) ||
2326 (MODEST_IS_HEADER_VIEW (focused_widget))) {
2328 GtkTreeSelection *selection = NULL;
2330 /* Get header view */
2331 GtkWidget *header_view = focused_widget;
2332 if (MODEST_IS_FOLDER_VIEW (focused_widget))
2333 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (window),
2334 MODEST_WIDGET_TYPE_HEADER_VIEW);
2336 /* Select all messages */
2337 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view));
2338 gtk_tree_selection_select_all (selection);
2340 /* Set focuse on header view */
2341 gtk_widget_grab_focus (header_view);
2343 } else if (GTK_IS_HTML (focused_widget)) {
2344 gtk_html_select_all (GTK_HTML (focused_widget));
2349 modest_ui_actions_on_mark_as_read (GtkAction *action,
2350 ModestWindow *window)
2352 g_return_if_fail (MODEST_IS_WINDOW(window));
2354 /* Mark each header as read */
2355 do_headers_action (window, headers_action_mark_as_read, NULL);
2359 modest_ui_actions_on_mark_as_unread (GtkAction *action,
2360 ModestWindow *window)
2362 g_return_if_fail (MODEST_IS_WINDOW(window));
2364 /* Mark each header as read */
2365 do_headers_action (window, headers_action_mark_as_unread, NULL);
2369 modest_ui_actions_on_change_zoom (GtkRadioAction *action,
2370 GtkRadioAction *selected,
2371 ModestWindow *window)
2375 value = gtk_radio_action_get_current_value (selected);
2376 if (MODEST_IS_WINDOW (window)) {
2377 modest_window_set_zoom (MODEST_WINDOW (window), ((gdouble)value)/100);
2381 void modest_ui_actions_msg_edit_on_change_priority (GtkRadioAction *action,
2382 GtkRadioAction *selected,
2383 ModestWindow *window)
2385 TnyHeaderFlags flags;
2386 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2388 flags = gtk_radio_action_get_current_value (selected);
2389 modest_msg_edit_window_set_priority_flags (MODEST_MSG_EDIT_WINDOW (window), flags);
2392 void modest_ui_actions_msg_edit_on_change_file_format (GtkRadioAction *action,
2393 GtkRadioAction *selected,
2394 ModestWindow *window)
2398 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2400 file_format = gtk_radio_action_get_current_value (selected);
2401 modest_msg_edit_window_set_file_format (MODEST_MSG_EDIT_WINDOW (window), file_format);
2406 modest_ui_actions_on_zoom_plus (GtkAction *action,
2407 ModestWindow *window)
2409 g_return_if_fail (MODEST_IS_WINDOW (window));
2411 modest_window_zoom_plus (MODEST_WINDOW (window));
2415 modest_ui_actions_on_zoom_minus (GtkAction *action,
2416 ModestWindow *window)
2418 g_return_if_fail (MODEST_IS_WINDOW (window));
2420 modest_window_zoom_minus (MODEST_WINDOW (window));
2424 modest_ui_actions_on_toggle_fullscreen (GtkToggleAction *toggle,
2425 ModestWindow *window)
2427 ModestWindowMgr *mgr;
2428 gboolean fullscreen, active;
2429 g_return_if_fail (MODEST_IS_WINDOW (window));
2431 mgr = modest_runtime_get_window_mgr ();
2433 active = (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle)))?1:0;
2434 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
2436 if (active != fullscreen) {
2437 modest_window_mgr_set_fullscreen_mode (mgr, active);
2438 gtk_window_present (GTK_WINDOW (window));
2443 modest_ui_actions_on_change_fullscreen (GtkAction *action,
2444 ModestWindow *window)
2446 ModestWindowMgr *mgr;
2447 gboolean fullscreen;
2449 g_return_if_fail (MODEST_IS_WINDOW (window));
2451 mgr = modest_runtime_get_window_mgr ();
2452 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
2453 modest_window_mgr_set_fullscreen_mode (mgr, !fullscreen);
2455 gtk_window_present (GTK_WINDOW (window));
2459 * Used by modest_ui_actions_on_details to call do_headers_action
2462 headers_action_show_details (TnyHeader *header,
2463 ModestWindow *window,
2470 dialog = modest_details_dialog_new_with_header (GTK_WINDOW (window), header);
2473 gtk_widget_show_all (dialog);
2474 gtk_dialog_run (GTK_DIALOG (dialog));
2476 gtk_widget_destroy (dialog);
2480 * Show the folder details in a ModestDetailsDialog widget
2483 show_folder_details (TnyFolder *folder,
2489 dialog = modest_details_dialog_new_with_folder (window, folder);
2492 gtk_widget_show_all (dialog);
2493 gtk_dialog_run (GTK_DIALOG (dialog));
2495 gtk_widget_destroy (dialog);
2499 * Show the header details in a ModestDetailsDialog widget
2502 modest_ui_actions_on_details (GtkAction *action,
2505 TnyList * headers_list;
2509 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2512 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2515 g_object_unref (msg);
2517 headers_list = get_selected_headers (win);
2521 iter = tny_list_create_iterator (headers_list);
2523 header = TNY_HEADER (tny_iterator_get_current (iter));
2524 headers_action_show_details (header, win, NULL);
2525 g_object_unref (header);
2527 g_object_unref (iter);
2528 g_object_unref (headers_list);
2530 } else if (MODEST_IS_MAIN_WINDOW (win)) {
2531 GtkWidget *folder_view, *header_view;
2533 /* Check which widget has the focus */
2534 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2535 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2536 if (gtk_widget_is_focus (folder_view)) {
2537 TnyFolderStore *folder_store
2538 = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
2539 if (!folder_store) {
2540 g_warning ("%s: No item was selected.\n", __FUNCTION__);
2543 /* Show only when it's a folder */
2544 /* This function should not be called for account items,
2545 * because we dim the menu item for them. */
2546 if (TNY_IS_FOLDER (folder_store)) {
2547 show_folder_details (TNY_FOLDER (folder_store), GTK_WINDOW (win));
2550 g_object_unref (folder_store);
2553 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2554 MODEST_WIDGET_TYPE_HEADER_VIEW);
2555 /* Show details of each header */
2556 do_headers_action (win, headers_action_show_details, header_view);
2562 modest_ui_actions_on_toggle_show_cc (GtkToggleAction *toggle,
2563 ModestMsgEditWindow *window)
2565 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2567 modest_msg_edit_window_show_cc (window, gtk_toggle_action_get_active (toggle));
2571 modest_ui_actions_on_toggle_show_bcc (GtkToggleAction *toggle,
2572 ModestMsgEditWindow *window)
2574 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2576 modest_msg_edit_window_show_bcc (window, gtk_toggle_action_get_active (toggle));
2580 modest_ui_actions_toggle_folders_view (GtkAction *action,
2581 ModestMainWindow *main_window)
2585 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
2587 conf = modest_runtime_get_conf ();
2589 if (modest_main_window_get_style (main_window) == MODEST_MAIN_WINDOW_STYLE_SPLIT)
2590 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SIMPLE);
2592 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SPLIT);
2596 modest_ui_actions_on_toggle_toolbar (GtkToggleAction *toggle,
2597 ModestWindow *window)
2599 gboolean active, fullscreen = FALSE;
2600 ModestWindowMgr *mgr;
2602 active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle));
2604 /* Check if we want to toggle the toolbar vuew in fullscreen
2606 if (!strcmp (gtk_action_get_name (GTK_ACTION (toggle)),
2607 "ViewShowToolbarFullScreen")) {
2611 /* Toggle toolbar */
2612 mgr = modest_runtime_get_window_mgr ();
2613 modest_window_mgr_show_toolbars (mgr, active, fullscreen);
2617 modest_ui_actions_msg_edit_on_select_font (GtkAction *action,
2618 ModestMsgEditWindow *window)
2620 modest_msg_edit_window_select_font (window);
2624 modest_ui_actions_on_folder_display_name_changed (ModestFolderView *folder_view,
2625 const gchar *display_name,
2628 /* Do not change the application name if the widget has not
2629 the focus. This callback could be called even if the folder
2630 view has not the focus, because the handled signal could be
2631 emitted when the folder view is redrawn */
2632 if (gtk_widget_is_focus (GTK_WIDGET (folder_view))) {
2634 gtk_window_set_title (window, display_name);
2636 gtk_window_set_title (window, " ");
2641 modest_ui_actions_on_select_contacts (GtkAction *action, ModestMsgEditWindow *window)
2643 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2644 modest_msg_edit_window_select_contacts (window);
2648 modest_ui_actions_on_check_names (GtkAction *action, ModestMsgEditWindow *window)
2650 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2651 modest_msg_edit_window_check_names (window);
2656 create_move_to_dialog (ModestWindow *win,
2657 GtkWidget *folder_view,
2658 GtkWidget **tree_view)
2660 GtkWidget *dialog, *scroll;
2662 dialog = gtk_dialog_new_with_buttons (_("mcen_ti_moveto_folders_title"),
2664 GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR | GTK_DIALOG_DESTROY_WITH_PARENT,
2666 GTK_RESPONSE_ACCEPT,
2668 GTK_RESPONSE_REJECT,
2671 /* Create scrolled window */
2672 scroll = gtk_scrolled_window_new (NULL, NULL);
2673 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
2674 GTK_POLICY_AUTOMATIC,
2675 GTK_POLICY_AUTOMATIC);
2677 /* Create folder view */
2678 *tree_view = modest_platform_create_folder_view (NULL);
2680 /* It could happen that we're trying to move a message from a
2681 window (msg window for example) after the main window was
2682 closed, so we can not just get the model of the folder
2684 if (MODEST_IS_FOLDER_VIEW (folder_view))
2685 gtk_tree_view_set_model (GTK_TREE_VIEW (*tree_view),
2686 gtk_tree_view_get_model (GTK_TREE_VIEW (folder_view)));
2688 modest_folder_view_update_model (MODEST_FOLDER_VIEW (*tree_view),
2689 TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()));
2691 gtk_container_add (GTK_CONTAINER (scroll), *tree_view);
2693 /* Add scroll to dialog */
2694 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
2695 scroll, FALSE, FALSE, 0);
2697 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
2699 /* Select INBOX or local account */
2700 modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (*tree_view));
2706 * Returns TRUE if at least one of the headers of the list belongs to
2707 * a message that has been fully retrieved.
2710 has_retrieved_msgs (TnyList *list)
2713 gboolean found = FALSE;
2715 iter = tny_list_create_iterator (list);
2716 while (tny_iterator_is_done (iter) && !found) {
2718 TnyHeaderFlags flags;
2720 header = TNY_HEADER (tny_iterator_get_current (iter));
2721 flags = tny_header_get_flags (header);
2722 if (!(flags & TNY_HEADER_FLAG_PARTIAL))
2726 tny_iterator_next (iter);
2728 g_object_unref (iter);
2734 * Shows a confirmation dialog to the user when we're moving messages
2735 * from a remote server to the local storage. Returns the dialog
2736 * response. If it's other kind of movement the it always returns
2740 msgs_move_to_confirmation (GtkWindow *win,
2741 TnyFolder *dest_folder,
2744 gint response = GTK_RESPONSE_OK;
2746 /* If the destination is a local folder */
2747 if (modest_tny_folder_is_local_folder (dest_folder)) {
2748 TnyFolder *src_folder;
2752 /* Get source folder */
2753 iter = tny_list_create_iterator (headers);
2754 header = TNY_HEADER (tny_iterator_get_current (iter));
2755 src_folder = tny_header_get_folder (header);
2756 g_object_unref (header);
2757 g_object_unref (iter);
2759 /* If the source is a remote folder */
2760 if (!modest_tny_folder_is_local_folder (src_folder)) {
2761 const gchar *message;
2763 if (has_retrieved_msgs (headers))
2764 message = ngettext ("mcen_nc_move_retrieve", "mcen_nc_move_retrieves",
2765 tny_list_get_length (headers));
2767 message = ngettext ("mcen_nc_move_header", "mcen_nc_move_headers",
2768 tny_list_get_length (headers));
2770 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
2771 (const gchar *) message);
2773 g_object_unref (src_folder);
2780 transfer_msgs_from_viewer_cb (const GObject *object, gpointer user_data)
2782 ModestMsgViewWindow *self = NULL;
2784 g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (object));
2785 self = MODEST_MSG_VIEW_WINDOW (object);
2787 /* If there are not more messages don't do anything. The
2788 viewer will show the same message */
2789 if (!modest_msg_view_window_select_first_message (self))
2794 modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op,
2797 GObject *win = modest_mail_operation_get_source (mail_op);
2799 /* TODO: show error message */
2800 modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL,
2801 _("mail_in_ui_folder_move_target_error"));
2802 g_object_unref (win);
2806 * UI handler for the "Move to" action when invoked from the
2810 modest_ui_actions_on_main_window_move_to (GtkAction *action,
2811 ModestMainWindow *win)
2813 GtkWidget *dialog = NULL, *folder_view = NULL, *tree_view = NULL;
2814 GtkWidget *header_view = NULL;
2816 TnyFolderStore *folder_store = NULL;
2817 ModestMailOperation *mail_op = NULL;
2819 g_return_if_fail (MODEST_IS_MAIN_WINDOW (win));
2821 /* Get the folder view */
2822 folder_view = modest_main_window_get_child_widget (win,
2823 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2825 /* Get header view */
2826 header_view = modest_main_window_get_child_widget (win,
2827 MODEST_WIDGET_TYPE_HEADER_VIEW);
2829 /* Create and run the dialog */
2830 dialog = create_move_to_dialog (MODEST_WINDOW (win), folder_view, &tree_view);
2831 modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (tree_view));
2832 result = gtk_dialog_run (GTK_DIALOG(dialog));
2833 g_object_ref (tree_view);
2835 /* We do this to save an indentation level ;-) */
2836 if (result != GTK_RESPONSE_ACCEPT)
2839 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (tree_view));
2841 if (TNY_IS_ACCOUNT (folder_store))
2844 /* Get folder or messages to transfer */
2845 if (gtk_widget_is_focus (folder_view)) {
2846 TnyFolderStore *src_folder;
2847 src_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
2849 /* Clean folder on header view before moving it */
2850 modest_header_view_clear (MODEST_HEADER_VIEW (header_view));
2852 if (TNY_IS_FOLDER (src_folder)) {
2854 modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
2856 modest_ui_actions_move_folder_error_handler,
2858 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
2860 modest_mail_operation_xfer_folder (mail_op,
2861 TNY_FOLDER (src_folder),
2864 /* Unref mail operation */
2865 g_object_unref (G_OBJECT (mail_op));
2869 g_object_unref (G_OBJECT (src_folder));
2871 if (gtk_widget_is_focus (header_view)) {
2875 headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (header_view));
2877 /* Ask for user confirmation */
2878 response = msgs_move_to_confirmation (GTK_WINDOW (win),
2879 TNY_FOLDER (folder_store),
2882 /* Transfer messages */
2883 if (response == GTK_RESPONSE_OK) {
2884 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(win));
2885 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
2888 modest_mail_operation_xfer_msgs (mail_op,
2890 TNY_FOLDER (folder_store),
2895 g_object_unref (G_OBJECT (mail_op));
2897 g_object_unref (headers);
2901 if (folder_store != NULL)
2902 g_object_unref (folder_store);
2903 gtk_widget_destroy (dialog);
2908 * UI handler for the "Move to" action when invoked from the
2909 * ModestMsgViewWindow
2912 modest_ui_actions_on_msg_view_window_move_to (GtkAction *action,
2913 ModestMsgViewWindow *win)
2915 GtkWidget *dialog, *folder_view, *tree_view = NULL;
2917 ModestMainWindow *main_window;
2921 /* Get the folder view */
2922 main_window = MODEST_MAIN_WINDOW (modest_window_mgr_get_main_window (modest_runtime_get_window_mgr ()));
2924 folder_view = modest_main_window_get_child_widget (main_window,
2925 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2929 /* Create and run the dialog */
2930 dialog = create_move_to_dialog (MODEST_WINDOW (win), folder_view, &tree_view);
2931 result = gtk_dialog_run (GTK_DIALOG(dialog));
2932 g_object_ref (tree_view);
2934 if (result == GTK_RESPONSE_ACCEPT) {
2935 TnyFolderStore *folder_store;
2938 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (tree_view));
2940 /* Create header list */
2941 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
2942 headers = tny_simple_list_new ();
2943 tny_list_prepend (headers, G_OBJECT (header));
2944 g_object_unref (header);
2946 /* Ask user for confirmation. MSG-NOT404 */
2947 response = msgs_move_to_confirmation (GTK_WINDOW (win),
2948 TNY_FOLDER (folder_store),
2951 /* Transfer current msg */
2952 if (response == GTK_RESPONSE_OK) {
2953 ModestMailOperation *mail_op;
2955 /* Create mail op */
2956 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(win));
2957 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
2960 /* Transfer messages */
2961 modest_mail_operation_xfer_msgs (mail_op,
2963 TNY_FOLDER (folder_store),
2965 transfer_msgs_from_viewer_cb,
2967 g_object_unref (G_OBJECT (mail_op));
2969 g_object_unref (headers);
2970 g_object_unref (folder_store);
2972 gtk_widget_destroy (dialog);
2976 modest_ui_actions_on_move_to (GtkAction *action,
2979 g_return_if_fail (MODEST_IS_MAIN_WINDOW (win) ||
2980 MODEST_IS_MSG_VIEW_WINDOW (win));
2982 if (MODEST_IS_MAIN_WINDOW (win))
2983 modest_ui_actions_on_main_window_move_to (action,
2984 MODEST_MAIN_WINDOW (win));
2986 modest_ui_actions_on_msg_view_window_move_to (action,
2987 MODEST_MSG_VIEW_WINDOW (win));
2991 * Calls #HeadersFunc for each header already selected in the main
2992 * window or the message currently being shown in the msg view window
2995 do_headers_action (ModestWindow *win,
2999 TnyList *headers_list;
3005 headers_list = get_selected_headers (win);
3009 /* Get the folder */
3010 iter = tny_list_create_iterator (headers_list);
3011 header = TNY_HEADER (tny_iterator_get_current (iter));
3012 folder = tny_header_get_folder (header);
3013 g_object_unref (header);
3015 /* Call the function for each header */
3016 while (!tny_iterator_is_done (iter)) {
3017 header = TNY_HEADER (tny_iterator_get_current (iter));
3018 func (header, win, user_data);
3019 g_object_unref (header);
3020 tny_iterator_next (iter);
3023 /* Trick: do a poke status in order to speed up the signaling
3025 tny_folder_poke_status (folder);
3028 g_object_unref (folder);
3029 g_object_unref (iter);
3030 g_object_unref (headers_list);
3034 modest_ui_actions_view_attachment (GtkAction *action,
3035 ModestWindow *window)
3037 if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
3038 modest_msg_view_window_view_attachment (MODEST_MSG_VIEW_WINDOW (window), NULL);
3040 /* not supported window for this action */
3041 g_return_if_reached ();
3046 modest_ui_actions_save_attachments (GtkAction *action,
3047 ModestWindow *window)
3049 if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
3050 modest_msg_view_window_save_attachments (MODEST_MSG_VIEW_WINDOW (window), NULL);
3052 /* not supported window for this action */
3053 g_return_if_reached ();
3058 modest_ui_actions_remove_attachments (GtkAction *action,
3059 ModestWindow *window)
3061 if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
3062 modest_msg_view_window_remove_attachments (MODEST_MSG_VIEW_WINDOW (window));
3064 /* not supported window for this action */
3065 g_return_if_reached ();
3070 modest_ui_actions_on_settings (GtkAction *action,
3075 dialog = modest_platform_get_global_settings_dialog ();
3076 gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (win));
3077 gtk_widget_show_all (dialog);
3079 gtk_dialog_run (GTK_DIALOG (dialog));
3081 gtk_widget_destroy (dialog);
3085 modest_ui_actions_on_help (GtkAction *action,
3088 const gchar *help_id = NULL;
3090 if (MODEST_IS_MAIN_WINDOW (win)) {
3091 const gchar *action_name;
3092 action_name = gtk_action_get_name (action);
3094 if (!strcmp (action_name, "FolderViewCSMHelp") ||
3095 !strcmp (action_name, "HeaderViewCSMHelp")) {
3096 GtkWidget *folder_view;
3097 TnyFolderStore *folder_store;
3098 /* Get selected folder */
3099 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
3100 MODEST_WIDGET_TYPE_FOLDER_VIEW);
3101 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
3103 /* Switch help_id */
3104 if (TNY_IS_FOLDER (folder_store)) {
3105 switch (tny_folder_get_folder_type (TNY_FOLDER (folder_store))) {
3106 case TNY_FOLDER_TYPE_NORMAL:
3107 help_id = "applications_email_userfolder";
3109 case TNY_FOLDER_TYPE_INBOX:
3110 help_id = "applications_email_inbox";
3112 case TNY_FOLDER_TYPE_OUTBOX:
3113 help_id = "applications_email_outbox";
3115 case TNY_FOLDER_TYPE_SENT:
3116 help_id = "applications_email_sent";
3118 case TNY_FOLDER_TYPE_DRAFTS:
3119 help_id = "applications_email_drafts";
3121 case TNY_FOLDER_TYPE_ARCHIVE:
3122 help_id = "applications_email_archive";
3128 g_object_unref (folder_store);
3130 help_id = "applications_email_mainview";
3132 } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
3133 help_id = "applications_email_viewer";
3134 } else if (MODEST_IS_MSG_EDIT_WINDOW (win))
3135 help_id = "applications_email_editor";
3137 modest_platform_show_help (GTK_WINDOW (win), help_id);
3141 modest_ui_actions_on_retrieve_msg_contents (GtkAction *action,
3142 ModestWindow *window)
3144 ModestMailOperation *mail_op;
3148 headers = get_selected_headers (window);
3152 /* Create mail operation */
3153 mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
3155 modest_ui_actions_get_msgs_full_error_handler,
3157 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
3158 modest_mail_operation_get_msgs_full (mail_op, headers, NULL, NULL, NULL);
3161 g_object_unref (headers);
3162 g_object_unref (mail_op);
3166 modest_ui_actions_on_email_menu_activated (GtkAction *action,
3167 ModestWindow *window)
3169 g_return_if_fail (MODEST_IS_WINDOW (window));
3172 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3176 modest_ui_actions_on_edit_menu_activated (GtkAction *action,
3177 ModestWindow *window)
3179 g_return_if_fail (MODEST_IS_WINDOW (window));
3182 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3186 modest_ui_actions_on_view_menu_activated (GtkAction *action,
3187 ModestWindow *window)
3189 g_return_if_fail (MODEST_IS_WINDOW (window));
3192 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3196 modest_ui_actions_on_tools_menu_activated (GtkAction *action,
3197 ModestWindow *window)
3199 g_return_if_fail (MODEST_IS_WINDOW (window));
3202 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3206 modest_ui_actions_on_attachment_menu_activated (GtkAction *action,
3207 ModestWindow *window)
3209 g_return_if_fail (MODEST_IS_WINDOW (window));
3212 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3216 modest_ui_actions_on_toolbar_csm_menu_activated (GtkAction *action,
3217 ModestWindow *window)
3219 g_return_if_fail (MODEST_IS_WINDOW (window));
3222 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3226 modest_ui_actions_on_folder_view_csm_menu_activated (GtkAction *action,
3227 ModestWindow *window)
3229 g_return_if_fail (MODEST_IS_WINDOW (window));
3232 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3236 modest_ui_actions_on_header_view_csm_menu_activated (GtkAction *action,
3237 ModestWindow *window)
3239 g_return_if_fail (MODEST_IS_WINDOW (window));
3242 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3246 modest_ui_actions_check_toolbar_dimming_rules (ModestWindow *window)
3248 g_return_if_fail (MODEST_IS_WINDOW (window));
3251 modest_window_check_dimming_rules_group (window, "ModestToolbarDimmingRules");
3255 modest_ui_actions_on_search_messages (GtkAction *action, ModestWindow *window)
3257 g_return_if_fail (MODEST_IS_WINDOW (window));
3259 modest_platform_show_search_messages (GTK_WINDOW (window));
3263 modest_ui_actions_on_open_addressbook (GtkAction *action, ModestWindow *win)
3265 g_return_if_fail (MODEST_IS_WINDOW (win));
3266 modest_platform_show_addressbook (GTK_WINDOW (win));
3271 modest_ui_actions_on_toggle_find_in_page (GtkToggleAction *action,
3272 ModestWindow *window)
3274 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
3276 modest_msg_edit_window_toggle_find_toolbar (MODEST_MSG_EDIT_WINDOW (window), gtk_toggle_action_get_active (action));
3280 _on_send_receive_progress_changed (ModestMailOperation *mail_op,
3281 ModestMailOperationState *state,
3284 g_return_if_fail (MODEST_IS_MAIN_WINDOW(user_data));
3286 /* Set send/receive operation finished */
3287 if (state->status != MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS)
3288 modest_main_window_notify_send_receive_completed (MODEST_MAIN_WINDOW(user_data));