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"
47 #include <tny-mime-part.h>
49 #ifdef MODEST_PLATFORM_MAEMO
50 #include "maemo/modest-osso-state-saving.h"
51 #endif /* MODEST_PLATFORM_MAEMO */
53 #include "widgets/modest-ui-constants.h"
54 #include <widgets/modest-main-window.h>
55 #include <widgets/modest-msg-view-window.h>
56 #include <widgets/modest-account-view-window.h>
57 #include <widgets/modest-details-dialog.h>
58 #include <widgets/modest-attachments-view.h>
59 #include "widgets/modest-folder-view.h"
60 #include "widgets/modest-global-settings-dialog.h"
61 #include "modest-connection-specific-smtp-window.h"
62 #include "modest-account-mgr-helpers.h"
63 #include "modest-mail-operation.h"
64 #include "modest-text-utils.h"
66 #ifdef MODEST_HAVE_EASYSETUP
67 #include "easysetup/modest-easysetup-wizard.h"
68 #endif /* MODEST_HAVE_EASYSETUP */
70 #include <modest-widget-memory.h>
71 #include <tny-error.h>
72 #include <tny-simple-list.h>
73 #include <tny-msg-view.h>
74 #include <tny-device.h>
75 #include <tny-merge-folder.h>
77 #include <gtkhtml/gtkhtml.h>
79 typedef struct _GetMsgAsyncHelper {
81 ModestMailOperation *mail_op;
88 typedef enum _ReplyForwardAction {
94 typedef struct _ReplyForwardHelper {
95 guint reply_forward_type;
96 ReplyForwardAction action;
98 GtkWidget *parent_window;
103 * The do_headers_action uses this kind of functions to perform some
104 * action to each member of a list of headers
106 typedef void (*HeadersFunc) (TnyHeader *header, ModestWindow *win, gpointer user_data);
108 static void do_headers_action (ModestWindow *win,
112 static void open_msg_cb (ModestMailOperation *mail_op,
117 static void reply_forward_cb (ModestMailOperation *mail_op,
122 static void reply_forward (ReplyForwardAction action, ModestWindow *win);
124 static void folder_refreshed_cb (ModestMailOperation *mail_op,
128 static void _on_send_receive_progress_changed (ModestMailOperation *mail_op,
129 ModestMailOperationState *state,
135 run_account_setup_wizard (ModestWindow *win)
137 ModestEasysetupWizardDialog *wizard;
139 g_return_if_fail (MODEST_IS_WINDOW(win));
141 wizard = modest_easysetup_wizard_dialog_new ();
142 gtk_window_set_transient_for (GTK_WINDOW (wizard), GTK_WINDOW (win));
143 gtk_dialog_run (GTK_DIALOG (wizard));
144 gtk_widget_destroy (GTK_WIDGET (wizard));
149 modest_ui_actions_on_about (GtkAction *action, ModestWindow *win)
152 const gchar *authors[] = {
153 "Dirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>",
156 about = gtk_about_dialog_new ();
157 gtk_about_dialog_set_name (GTK_ABOUT_DIALOG(about), PACKAGE_NAME);
158 gtk_about_dialog_set_version (GTK_ABOUT_DIALOG(about),PACKAGE_VERSION);
159 gtk_about_dialog_set_copyright (GTK_ABOUT_DIALOG(about),
160 _("Copyright (c) 2006, Nokia Corporation\n"
161 "All rights reserved."));
162 gtk_about_dialog_set_comments (GTK_ABOUT_DIALOG(about),
163 _("a modest e-mail client\n\n"
164 "design and implementation: Dirk-Jan C. Binnema\n"
165 "contributions from the fine people at KC and Ig\n"
166 "uses the tinymail email framework written by Philip van Hoof"));
167 gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG(about), authors);
168 gtk_about_dialog_set_website (GTK_ABOUT_DIALOG(about), "http://modest.garage.maemo.org");
170 gtk_dialog_run (GTK_DIALOG (about));
171 gtk_widget_destroy(about);
175 * Gets the list of currently selected messages. If the win is the
176 * main window, then it returns a newly allocated list of the headers
177 * selected in the header view. If win is the msg view window, then
178 * the value returned is a list with just a single header.
180 * The caller of this funcion must free the list.
183 get_selected_headers (ModestWindow *win)
185 if (MODEST_IS_MAIN_WINDOW(win)) {
186 GtkWidget *header_view;
188 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
189 MODEST_WIDGET_TYPE_HEADER_VIEW);
190 return modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
192 } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
193 /* for MsgViewWindows, we simply return a list with one element */
195 TnyList *list = NULL;
197 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
198 if (header != NULL) {
199 list = tny_simple_list_new ();
200 tny_list_prepend (list, G_OBJECT(header));
201 g_object_unref (G_OBJECT(header));
211 headers_action_mark_as_read (TnyHeader *header,
215 TnyHeaderFlags flags;
217 g_return_if_fail (TNY_IS_HEADER(header));
219 flags = tny_header_get_flags (header);
220 if (flags & TNY_HEADER_FLAG_SEEN) return;
221 tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN);
225 headers_action_mark_as_unread (TnyHeader *header,
229 TnyHeaderFlags flags;
231 g_return_if_fail (TNY_IS_HEADER(header));
233 flags = tny_header_get_flags (header);
234 if (flags & TNY_HEADER_FLAG_SEEN) {
235 tny_header_unset_flags (header, TNY_HEADER_FLAG_SEEN);
241 headers_action_delete (TnyHeader *header,
245 ModestMailOperation *mail_op = NULL;
247 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_DELETE, G_OBJECT(win));
248 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
251 /* Always delete. TODO: Move to trash still not supported */
252 modest_mail_operation_remove_msg (mail_op, header, FALSE);
253 g_object_unref (G_OBJECT (mail_op));
255 /* refilter treemodel to hide marked-as-deleted rows */
256 if (MODEST_IS_HEADER_VIEW (user_data))
257 modest_header_view_refilter (MODEST_HEADER_VIEW (user_data));
261 modest_ui_actions_on_delete_message (GtkAction *action, ModestWindow *win)
263 TnyList *header_list = NULL;
264 TnyIterator *iter = NULL;
265 TnyHeader *header = NULL;
266 gchar *message = NULL;
269 ModestWindowMgr *mgr;
270 GtkWidget *header_view = NULL;
272 g_return_if_fail (MODEST_IS_WINDOW(win));
274 /* Check first if the header view has the focus */
275 if (MODEST_IS_MAIN_WINDOW (win)) {
277 modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
278 MODEST_WIDGET_TYPE_HEADER_VIEW);
279 if (!gtk_widget_is_focus (header_view))
283 header_list = get_selected_headers (win);
284 if (!header_list) return;
286 /* Check if any of the headers is already opened, or in the process of being opened */
287 if (MODEST_IS_MAIN_WINDOW (win)) {
289 iter = tny_list_create_iterator (header_list);
291 mgr = modest_runtime_get_window_mgr ();
292 while (!tny_iterator_is_done (iter) && !found) {
293 header = TNY_HEADER (tny_iterator_get_current (iter));
294 found = modest_window_mgr_find_registered_header (mgr, header, NULL);
295 g_object_unref (header);
296 tny_iterator_next (iter);
298 g_object_unref (iter);
303 num = g_strdup_printf ("%d", tny_list_get_length (header_list));
304 msg = g_strdup_printf (_("mcen_nc_unable_to_delete_n_messages"), num);
306 modest_platform_run_information_dialog (GTK_WINDOW (win), (const gchar *) msg);
310 g_object_unref (header_list);
316 if (tny_list_get_length(header_list) == 1) {
317 iter = tny_list_create_iterator (header_list);
318 header = TNY_HEADER (tny_iterator_get_current (iter));
319 desc = g_strdup_printf ("%s", tny_header_get_subject (header));
320 g_object_unref (header);
321 g_object_unref (iter);
323 message = g_strdup_printf(ngettext("emev_nc_delete_message", "emev_nc_delete_messages",
324 tny_list_get_length(header_list)), desc);
326 /* Confirmation dialog */
327 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
331 if (response == GTK_RESPONSE_OK) {
332 ModestMainWindow *main_window;
333 ModestWindowMgr *mgr;
335 /* Remove each header. If it's a view window header_view == NULL */
336 do_headers_action (win, headers_action_delete, header_view);
338 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
339 /* Close msg view window or select next */
340 if (modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW (win)) &&
341 modest_msg_view_window_first_message_selected (MODEST_MSG_VIEW_WINDOW (win))) {
342 modest_ui_actions_on_close_window (NULL, MODEST_WINDOW (win));
344 modest_msg_view_window_select_next_message (MODEST_MSG_VIEW_WINDOW (win));
348 /* Refilter header view model, if main window still exists */
349 mgr = modest_runtime_get_window_mgr ();
350 main_window = MODEST_MAIN_WINDOW (modest_window_mgr_get_main_window (mgr));
354 widget = modest_main_window_get_child_widget (main_window,
355 MODEST_WIDGET_TYPE_HEADER_VIEW);
356 modest_header_view_refilter (MODEST_HEADER_VIEW (widget));
358 /* Update toolbar dimming state */
359 modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
366 g_object_unref (header_list);
372 /* delete either message or folder, based on what has focus */
374 modest_ui_actions_on_delete_message_or_folder (GtkAction *action, ModestWindow *win)
376 g_return_if_fail (MODEST_IS_WINDOW(win));
378 /* Check first if the header view has the focus */
379 if (MODEST_IS_MAIN_WINDOW (win)) {
382 w = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
383 MODEST_WIDGET_TYPE_HEADER_VIEW);
384 if (gtk_widget_is_focus (w)) {
385 modest_ui_actions_on_delete_message (action, win);
389 w = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
390 MODEST_WIDGET_TYPE_FOLDER_VIEW);
391 if (gtk_widget_is_focus (w)) {
392 modest_ui_actions_on_delete_folder (action, MODEST_MAIN_WINDOW(win));
396 g_warning ("BUG: delete toolbar button pressed with neither headerview nor folderview "
403 modest_ui_actions_on_quit (GtkAction *action, ModestWindow *win)
405 #ifdef MODEST_PLATFORM_MAEMO
406 modest_osso_save_state();
407 #endif /* MODEST_PLATFORM_MAEMO */
409 g_debug ("closing down, clearing %d item(s) from operation queue",
410 modest_mail_operation_queue_num_elements
411 (modest_runtime_get_mail_operation_queue()));
413 /* cancel all outstanding operations */
414 modest_mail_operation_queue_cancel_all
415 (modest_runtime_get_mail_operation_queue());
417 g_debug ("queue has been cleared");
419 /* note: when modest-tny-account-store is finalized,
420 it will automatically set all network connections
427 modest_ui_actions_on_close_window (GtkAction *action, ModestWindow *win)
430 g_signal_emit_by_name (G_OBJECT (win), "delete-event", NULL, &ret_value);
432 /* if (MODEST_IS_MSG_VIEW_WINDOW (win)) { */
433 /* gtk_widget_destroy (GTK_WIDGET (win)); */
434 /* } else if (MODEST_IS_MSG_EDIT_WINDOW (win)) { */
435 /* gboolean ret_value; */
436 /* g_signal_emit_by_name (G_OBJECT (win), "delete-event", NULL, &ret_value); */
437 /* } else if (MODEST_IS_WINDOW (win)) { */
438 /* gtk_widget_destroy (GTK_WIDGET (win)); */
440 /* g_return_if_reached (); */
445 modest_ui_actions_on_add_to_contacts (GtkAction *action, ModestWindow *win)
447 GtkClipboard *clipboard = NULL;
448 gchar *selection = NULL;
450 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
451 selection = gtk_clipboard_wait_for_text (clipboard);
453 /* Question: why is the clipboard being used here?
454 * It doesn't really make a lot of sense. */
458 modest_address_book_add_address (selection);
464 modest_ui_actions_on_accounts (GtkAction *action, ModestWindow *win)
466 /* This is currently only implemented for Maemo */
467 #ifdef MODEST_PLATFORM_MAEMO /* Defined in config.h */
468 if (!modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE)) {
469 run_account_setup_wizard (win);
472 /* Show the list of accounts: */
473 GtkDialog *account_win = GTK_DIALOG(modest_account_view_window_new ());
474 gtk_window_set_transient_for (GTK_WINDOW (account_win), GTK_WINDOW(win));
475 gtk_dialog_run (account_win);
476 gtk_widget_destroy (GTK_WIDGET(account_win));
479 GtkWidget *dialog, *label;
481 /* Create the widgets */
483 dialog = gtk_dialog_new_with_buttons ("Message",
485 GTK_DIALOG_DESTROY_WITH_PARENT,
489 label = gtk_label_new ("Hello World!");
491 /* Ensure that the dialog box is destroyed when the user responds. */
493 g_signal_connect_swapped (dialog, "response",
494 G_CALLBACK (gtk_widget_destroy),
497 /* Add the label, and show everything we've added to the dialog. */
499 gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox),
501 gtk_widget_show_all (dialog);
502 #endif /* MODEST_PLATFORM_MAEMO */
506 on_smtp_servers_window_hide (GtkWindow* window, gpointer user_data)
508 ModestWindow *main_window = MODEST_WINDOW (user_data);
510 /* Save any changes. */
511 modest_connection_specific_smtp_window_save_server_accounts (
512 MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (window),
513 modest_window_get_active_account (main_window));
514 gtk_widget_destroy (GTK_WIDGET (window));
520 modest_ui_actions_on_smtp_servers (GtkAction *action, ModestWindow *win)
522 /* This is currently only implemented for Maemo,
523 * because it requires an API (libconic) to detect different connection
526 #ifdef MODEST_PLATFORM_MAEMO /* Defined in config.h */
528 /* Create the window if necessary: */
529 const gchar *active_account_name = modest_window_get_active_account (win);
531 /* TODO: Dim the menu item (not in the UI spec)? or show a warning,
532 * or show the default account?
533 * If we show the default account then the account name should be shown in
534 * the window when we show it. */
535 if (!active_account_name) {
536 g_warning ("%s: No account is active.", __FUNCTION__);
540 GtkWidget *specific_window = GTK_WIDGET (modest_connection_specific_smtp_window_new ());
541 modest_connection_specific_smtp_window_fill_with_connections (
542 MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (specific_window),
543 modest_runtime_get_account_mgr(),
544 active_account_name);
546 /* Show the window: */
547 gtk_window_set_transient_for (GTK_WINDOW (specific_window), GTK_WINDOW (win));
548 gtk_window_set_modal (GTK_WINDOW (specific_window), TRUE);
549 gtk_widget_show (specific_window);
551 /* Save changes when the window is hidden: */
552 g_signal_connect (specific_window, "hide",
553 G_CALLBACK (on_smtp_servers_window_hide), win);
554 #endif /* MODEST_PLATFORM_MAEMO */
558 modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win)
560 ModestWindow *msg_win = NULL;
562 TnyFolder *folder = NULL;
563 gchar *account_name = NULL;
564 gchar *from_str = NULL;
565 /* GError *err = NULL; */
566 TnyAccount *account = NULL;
567 ModestWindowMgr *mgr;
568 gchar *signature = NULL, *blank_and_signature = NULL;
570 /* if there are no accounts yet, just show the wizard */
571 if (!modest_account_mgr_has_accounts (modest_runtime_get_account_mgr(), TRUE)) {
572 run_account_setup_wizard (win);
576 account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr ());
578 account_name = g_strdup (modest_window_get_active_account (win));
580 g_printerr ("modest: no account found\n");
584 account = modest_tny_account_store_get_server_account (modest_runtime_get_account_store(),
586 TNY_ACCOUNT_TYPE_STORE);
588 g_printerr ("modest: failed to get tnyaccount for '%s'\n", account_name);
592 from_str = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(), account_name);
594 g_printerr ("modest: failed get from string for '%s'\n", account_name);
598 if (modest_account_mgr_get_bool (modest_runtime_get_account_mgr (), account_name,
599 MODEST_ACCOUNT_USE_SIGNATURE, FALSE)) {
600 signature = modest_account_mgr_get_string (modest_runtime_get_account_mgr (), account_name,
601 MODEST_ACCOUNT_SIGNATURE, FALSE);
602 blank_and_signature = g_strconcat ("\n", signature, NULL);
605 blank_and_signature = g_strdup ("");
608 msg = modest_tny_msg_new ("", from_str, "", "", "", blank_and_signature, NULL);
610 g_printerr ("modest: failed to create new msg\n");
614 folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS);
616 g_printerr ("modest: failed to find Drafts folder\n");
621 /* Create and register edit window */
622 /* This is destroyed by TOOD. */
623 msg_win = modest_msg_edit_window_new (msg, account_name);
624 mgr = modest_runtime_get_window_mgr ();
625 modest_window_mgr_register_window (mgr, msg_win);
628 gtk_window_set_transient_for (GTK_WINDOW (msg_win),
630 gtk_widget_show_all (GTK_WIDGET (msg_win));
633 g_free (account_name);
635 g_free (blank_and_signature);
637 g_object_unref (msg_win);
639 g_object_unref (G_OBJECT(account));
641 g_object_unref (G_OBJECT(msg));
643 g_object_unref (G_OBJECT(folder));
647 modest_ui_actions_msg_retrieval_check (ModestMailOperation *mail_op,
651 ModestMailOperationStatus status;
653 /* If there is no message or the operation was not successful */
654 status = modest_mail_operation_get_status (mail_op);
655 if (!msg || status != MODEST_MAIL_OPERATION_STATUS_SUCCESS) {
657 /* Remove the header from the preregistered uids */
658 modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (),
668 open_msg_cb (ModestMailOperation *mail_op,
673 ModestWindowMgr *mgr = NULL;
674 ModestWindow *parent_win = NULL;
675 ModestWindow *win = NULL;
676 TnyFolderType folder_type = TNY_FOLDER_TYPE_UNKNOWN;
677 gchar *account = NULL;
680 /* Do nothing if there was any problem with the mail
681 operation. The error will be shown by the error_handler of
682 the mail operation */
683 if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg)) {
684 printf ("DEBUG: %s: modest_ui_actions_msg_retrieval_check() failed.\n",
689 parent_win = (ModestWindow *) modest_mail_operation_get_source (mail_op);
690 folder = tny_header_get_folder (header);
692 /* Mark header as read */
693 headers_action_mark_as_read (header, MODEST_WINDOW(parent_win), NULL);
696 account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
698 account = g_strdup (modest_window_get_active_account (MODEST_WINDOW (parent_win)));
700 /* Gets folder type (OUTBOX headers will be opened in edit window */
701 if (modest_tny_folder_is_local_folder (folder))
702 folder_type = modest_tny_folder_get_local_folder_type (folder);
704 /* If the header is in the drafts folder then open the editor,
705 else the message view window */
706 if (folder_type == TNY_FOLDER_TYPE_DRAFTS) {
707 /* we cannot edit without a valid account... */
708 if (!modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE)) {
709 run_account_setup_wizard(parent_win);
712 win = modest_msg_edit_window_new (msg, account);
714 gchar *uid = modest_tny_folder_get_header_unique_id (header);
716 if (MODEST_IS_MAIN_WINDOW (parent_win)) {
717 GtkWidget *header_view;
718 GtkTreeSelection *sel;
719 GList *sel_list = NULL;
722 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(parent_win),
723 MODEST_WIDGET_TYPE_HEADER_VIEW);
725 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (header_view));
726 sel_list = gtk_tree_selection_get_selected_rows (sel, &model);
728 if (sel_list != NULL) {
729 GtkTreeRowReference *row_reference;
731 row_reference = gtk_tree_row_reference_new (model, (GtkTreePath *) sel_list->data);
732 g_list_foreach (sel_list, (GFunc) gtk_tree_path_free, NULL);
733 g_list_free (sel_list);
735 win = modest_msg_view_window_new_with_header_model (msg,
740 gtk_tree_row_reference_free (row_reference);
742 win = modest_msg_view_window_new (msg, account, (const gchar*) uid);
745 win = modest_msg_view_window_new (msg, account, (const gchar*) uid);
750 /* Register and show new window */
752 mgr = modest_runtime_get_window_mgr ();
753 modest_window_mgr_register_window (mgr, win);
754 g_object_unref (win);
755 gtk_window_set_transient_for (GTK_WINDOW (win), GTK_WINDOW (parent_win));
756 gtk_widget_show_all (GTK_WIDGET(win));
759 /* Update toolbar dimming state */
760 if (MODEST_IS_MAIN_WINDOW (parent_win)) {
761 modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (parent_win));
767 g_object_unref (parent_win);
768 /* g_object_unref (msg); */
769 g_object_unref (folder);
773 modest_ui_actions_get_msgs_full_error_handler (ModestMailOperation *mail_op,
777 GObject *win = modest_mail_operation_get_source (mail_op);
779 error = modest_mail_operation_get_error (mail_op);
780 printf ("DEBUG: %s: Error: code=%d, text=%s\n", __FUNCTION__, error->code, error->message);
782 if (error->code == MODEST_MAIL_OPERATION_ERROR_MESSAGE_SIZE_LIMIT) {
784 modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL,
787 modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL,
788 _("mail_ni_ui_folder_get_msg_folder_error"));
792 g_object_unref (win);
796 * This function is used by both modest_ui_actions_on_open and
797 * modest_ui_actions_on_header_activated. This way we always do the
798 * same when trying to open messages.
801 _modest_ui_actions_open (TnyList *headers, ModestWindow *win)
803 ModestWindowMgr *mgr = NULL;
804 TnyIterator *iter = NULL;
805 ModestMailOperation *mail_op1 = NULL;
806 ModestMailOperation *mail_op2 = NULL;
807 TnyList *not_opened_headers = NULL;
808 TnyList *not_opened_cached_headers = NULL;
809 TnyHeaderFlags flags;
811 /* Look if we already have a message view for each header. If
812 true, then remove the header from the list of headers to
814 mgr = modest_runtime_get_window_mgr ();
815 iter = tny_list_create_iterator (headers);
816 not_opened_headers = tny_simple_list_new ();
817 not_opened_cached_headers = tny_simple_list_new ();
818 while (!tny_iterator_is_done (iter)) {
820 ModestWindow *window;
824 header = TNY_HEADER (tny_iterator_get_current (iter));
825 flags = tny_header_get_flags (header);
828 found = modest_window_mgr_find_registered_header (mgr, header, &window);
830 /* Do not open again the message and present the
831 window to the user */
834 gtk_window_present (GTK_WINDOW (window));
836 /* the header has been registered already, we don't do
837 * anything but wait for the window to come up*/
838 g_warning ("debug: header %p already registered, waiting for window",
841 if (!(flags & TNY_HEADER_FLAG_CACHED))
842 tny_list_append (not_opened_headers, G_OBJECT (header));
843 /* Check if msg has already been retreived */
845 tny_list_append (not_opened_cached_headers, G_OBJECT (header));
847 g_object_unref (header);
848 tny_iterator_next (iter);
850 g_object_unref (iter);
853 /* If some messages would have to be downloaded, ask the user to
854 * make a connection. It's generally easier to do this here (in the mainloop)
855 * than later in a thread:
857 if (tny_list_get_length (not_opened_cached_headers) > 0) {
858 gboolean connected = modest_platform_connect_and_wait (GTK_WINDOW (win));
860 /* Don't go further if a connection would be necessary but none is available: */
862 g_object_unref (not_opened_headers);
863 g_object_unref (not_opened_cached_headers);
868 /* Register the headers before actually creating the windows: */
869 TnyIterator *iter_not_opened = tny_list_create_iterator (not_opened_headers);
870 while (!tny_iterator_is_done (iter_not_opened)) {
871 TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter_not_opened));
872 modest_window_mgr_register_header (mgr, header);
873 g_object_unref (header);
875 tny_iterator_next (iter_not_opened);
877 g_object_unref (iter_not_opened);
878 iter_not_opened = NULL;
880 TnyIterator *iter_cached = tny_list_create_iterator (not_opened_cached_headers);
881 while (!tny_iterator_is_done (iter_cached)) {
882 TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter_cached));
883 modest_window_mgr_register_header (mgr, header);
884 g_object_unref (header);
886 tny_iterator_next (iter_cached);
888 g_object_unref (iter_cached);
892 /* Open each uncached message */
893 if (tny_list_get_length (not_opened_headers) > 0) {
894 mail_op1 = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
896 modest_ui_actions_get_msgs_full_error_handler,
898 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op1);
899 if (tny_list_get_length (not_opened_headers) > 1) {
900 modest_mail_operation_get_msgs_full (mail_op1,
906 TnyIterator *iter = tny_list_create_iterator (not_opened_headers);
907 TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter));
908 modest_mail_operation_get_msg (mail_op1, header, open_msg_cb, NULL);
909 g_object_unref (header);
910 g_object_unref (iter);
914 /* Open each cached message */
915 if (tny_list_get_length (not_opened_cached_headers) > 0) {
916 mail_op2 = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
918 modest_ui_actions_get_msgs_full_error_handler,
920 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op2);
921 if (tny_list_get_length (not_opened_cached_headers) > 1) {
922 modest_mail_operation_get_msgs_full (mail_op2,
928 TnyIterator *iter = tny_list_create_iterator (not_opened_cached_headers);
929 TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter));
930 modest_mail_operation_get_msg (mail_op2, header, open_msg_cb, NULL);
931 g_object_unref (header);
932 g_object_unref (iter);
937 if (not_opened_headers != NULL)
938 g_object_unref (not_opened_headers);
939 if (not_opened_cached_headers != NULL)
940 g_object_unref (not_opened_cached_headers);
942 g_object_unref (iter);
943 if (mail_op1 != NULL)
944 g_object_unref (mail_op1);
945 if (mail_op2 != NULL)
946 g_object_unref (mail_op2);
950 modest_ui_actions_on_open (GtkAction *action, ModestWindow *win)
955 headers = get_selected_headers (win);
960 _modest_ui_actions_open (headers, win);
962 g_object_unref(headers);
967 free_reply_forward_helper (gpointer data)
969 ReplyForwardHelper *helper;
971 helper = (ReplyForwardHelper *) data;
972 g_free (helper->account_name);
973 g_slice_free (ReplyForwardHelper, helper);
977 reply_forward_cb (ModestMailOperation *mail_op,
983 ReplyForwardHelper *rf_helper;
984 ModestWindow *msg_win = NULL;
985 ModestEditType edit_type;
987 TnyAccount *account = NULL;
988 ModestWindowMgr *mgr = NULL;
989 gchar *signature = NULL;
991 /* If there was any error */
992 if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg))
995 g_return_if_fail (user_data != NULL);
996 rf_helper = (ReplyForwardHelper *) user_data;
998 from = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(),
999 rf_helper->account_name);
1000 if (modest_account_mgr_get_bool (modest_runtime_get_account_mgr(),
1001 rf_helper->account_name,
1002 MODEST_ACCOUNT_USE_SIGNATURE, FALSE)) {
1003 signature = modest_account_mgr_get_string (modest_runtime_get_account_mgr (),
1004 rf_helper->account_name,
1005 MODEST_ACCOUNT_SIGNATURE, FALSE);
1008 /* Create reply mail */
1009 switch (rf_helper->action) {
1012 modest_tny_msg_create_reply_msg (msg, from, signature,
1013 rf_helper->reply_forward_type,
1014 MODEST_TNY_MSG_REPLY_MODE_SENDER);
1016 case ACTION_REPLY_TO_ALL:
1018 modest_tny_msg_create_reply_msg (msg, from, signature, rf_helper->reply_forward_type,
1019 MODEST_TNY_MSG_REPLY_MODE_ALL);
1020 edit_type = MODEST_EDIT_TYPE_REPLY;
1022 case ACTION_FORWARD:
1024 modest_tny_msg_create_forward_msg (msg, from, signature, rf_helper->reply_forward_type);
1025 edit_type = MODEST_EDIT_TYPE_FORWARD;
1028 g_return_if_reached ();
1035 g_printerr ("modest: failed to create message\n");
1039 account = modest_tny_account_store_get_server_account (modest_runtime_get_account_store(),
1040 rf_helper->account_name,
1041 TNY_ACCOUNT_TYPE_STORE);
1043 g_printerr ("modest: failed to get tnyaccount for '%s'\n", rf_helper->account_name);
1047 /* Create and register the windows */
1048 msg_win = modest_msg_edit_window_new (new_msg, rf_helper->account_name);
1049 mgr = modest_runtime_get_window_mgr ();
1050 modest_window_mgr_register_window (mgr, msg_win);
1052 if (rf_helper->parent_window != NULL) {
1053 gdouble parent_zoom;
1055 parent_zoom = modest_window_get_zoom (MODEST_WINDOW (rf_helper->parent_window));
1056 modest_window_set_zoom (msg_win, parent_zoom);
1059 /* Show edit window */
1060 gtk_widget_show_all (GTK_WIDGET (msg_win));
1064 g_object_unref (msg_win);
1066 g_object_unref (G_OBJECT (new_msg));
1068 g_object_unref (G_OBJECT (account));
1069 /* g_object_unref (msg); */
1070 g_object_unref (header);
1071 free_reply_forward_helper (rf_helper);
1075 * Checks a list of headers. If any of them are not currently
1076 * downloaded (CACHED) then it asks the user for permission to
1079 * Returns FALSE if the user does not want to download the
1080 * messages. Returns TRUE if the user allowed the download or if all
1081 * of them are currently downloaded
1084 download_uncached_messages (TnyList *header_list, GtkWindow *win)
1088 gint uncached_messages = 0;
1090 iter = tny_list_create_iterator (header_list);
1091 while (!tny_iterator_is_done (iter)) {
1093 TnyHeaderFlags flags;
1095 header = TNY_HEADER (tny_iterator_get_current (iter));
1096 flags = tny_header_get_flags (header);
1097 /* TODO: is this the right flag?, it seems that some
1098 headers that have been previously downloaded do not
1100 if (! (flags & TNY_HEADER_FLAG_CACHED))
1101 uncached_messages ++;
1102 g_object_unref (header);
1103 tny_iterator_next (iter);
1105 g_object_unref (iter);
1107 /* Ask for user permission to download the messages */
1109 if (uncached_messages > 0) {
1110 GtkResponseType response;
1112 modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
1113 ngettext("mcen_nc_get_msg",
1115 uncached_messages));
1116 if (response == GTK_RESPONSE_CANCEL)
1119 /* If a download will be necessary, make sure that we have a connection: */
1120 retval = modest_platform_connect_and_wait(win);
1128 * Common code for the reply and forward actions
1131 reply_forward (ReplyForwardAction action, ModestWindow *win)
1133 ModestMailOperation *mail_op = NULL;
1134 TnyList *header_list = NULL;
1135 ReplyForwardHelper *rf_helper = NULL;
1136 guint reply_forward_type;
1137 gboolean continue_download;
1139 g_return_if_fail (MODEST_IS_WINDOW(win));
1141 /* we need an account when editing */
1142 if (!modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE)) {
1143 run_account_setup_wizard (win);
1147 header_list = get_selected_headers (win);
1151 /* Check that the messages have been previously downloaded */
1152 continue_download = download_uncached_messages (header_list, GTK_WINDOW (win));
1153 if (!continue_download) {
1154 g_object_unref (header_list);
1158 reply_forward_type =
1159 modest_conf_get_int (modest_runtime_get_conf (),
1160 (action == ACTION_FORWARD) ? MODEST_CONF_FORWARD_TYPE : MODEST_CONF_REPLY_TYPE,
1162 /* We assume that we can only select messages of the
1163 same folder and that we reply all of them from the
1164 same account. In fact the interface currently only
1165 allows single selection */
1168 rf_helper = g_slice_new0 (ReplyForwardHelper);
1169 rf_helper->reply_forward_type = reply_forward_type;
1170 rf_helper->action = action;
1171 rf_helper->account_name = g_strdup (modest_window_get_active_account (win));
1172 if ((win != NULL) && (MODEST_IS_WINDOW (win)))
1173 rf_helper->parent_window = GTK_WIDGET (win);
1174 if (!rf_helper->account_name)
1175 rf_helper->account_name =
1176 modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
1178 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
1181 /* Get header and message. Do not free them here, the
1182 reply_forward_cb must do it */
1183 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW(win));
1184 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(win));
1185 if (!msg || !header) {
1187 g_object_unref (msg);
1189 g_object_unref (header);
1190 g_printerr ("modest: no message found\n");
1193 reply_forward_cb (NULL, header, msg, rf_helper);
1199 /* Retrieve messages */
1200 mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
1202 modest_ui_actions_get_msgs_full_error_handler,
1204 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
1206 /* Only reply/forward to one message */
1207 iter = tny_list_create_iterator (header_list);
1208 header = TNY_HEADER (tny_iterator_get_current (iter));
1209 g_object_unref (iter);
1211 modest_mail_operation_get_msg (mail_op,
1216 /* modest_mail_operation_get_msgs_full (mail_op, */
1218 /* reply_forward_cb, */
1220 /* free_reply_forward_helper); */
1223 g_object_unref(mail_op);
1227 g_object_unref (header_list);
1231 modest_ui_actions_on_reply (GtkAction *action, ModestWindow *win)
1233 g_return_if_fail (MODEST_IS_WINDOW(win));
1235 reply_forward (ACTION_REPLY, win);
1239 modest_ui_actions_on_forward (GtkAction *action, ModestWindow *win)
1241 g_return_if_fail (MODEST_IS_WINDOW(win));
1243 reply_forward (ACTION_FORWARD, win);
1247 modest_ui_actions_on_reply_all (GtkAction *action, ModestWindow *win)
1249 g_return_if_fail (MODEST_IS_WINDOW(win));
1251 reply_forward (ACTION_REPLY_TO_ALL, win);
1255 modest_ui_actions_on_next (GtkAction *action,
1256 ModestWindow *window)
1258 if (MODEST_IS_MAIN_WINDOW (window)) {
1259 GtkWidget *header_view;
1261 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
1262 MODEST_WIDGET_TYPE_HEADER_VIEW);
1266 modest_header_view_select_next (MODEST_HEADER_VIEW(header_view));
1267 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
1268 modest_msg_view_window_select_next_message (MODEST_MSG_VIEW_WINDOW (window));
1270 g_return_if_reached ();
1275 modest_ui_actions_on_prev (GtkAction *action,
1276 ModestWindow *window)
1278 g_return_if_fail (MODEST_IS_WINDOW(window));
1280 if (MODEST_IS_MAIN_WINDOW (window)) {
1281 GtkWidget *header_view;
1282 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
1283 MODEST_WIDGET_TYPE_HEADER_VIEW);
1287 modest_header_view_select_prev (MODEST_HEADER_VIEW(header_view));
1288 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
1289 modest_msg_view_window_select_previous_message (MODEST_MSG_VIEW_WINDOW (window));
1291 g_return_if_reached ();
1296 modest_ui_actions_on_sort (GtkAction *action,
1297 ModestWindow *window)
1299 g_return_if_fail (MODEST_IS_WINDOW(window));
1301 if (MODEST_IS_MAIN_WINDOW (window)) {
1302 GtkWidget *header_view;
1303 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
1304 MODEST_WIDGET_TYPE_HEADER_VIEW);
1308 /* Show sorting dialog */
1309 modest_platform_run_sort_dialog (GTK_WINDOW (window), MODEST_SORT_HEADERS);
1314 new_messages_arrived (ModestMailOperation *self,
1318 if (new_messages == 0)
1321 modest_platform_on_new_msg ();
1325 * This function performs the send & receive required actions. The
1326 * window is used to create the mail operation. Typically it should
1327 * always be the main window, but we pass it as argument in order to
1331 modest_ui_actions_do_send_receive (const gchar *account_name, ModestWindow *win)
1333 gchar *acc_name = NULL;
1334 ModestMailOperation *mail_op;
1336 /* If no account name was provided then get the current account, and if
1337 there is no current account then pick the default one: */
1338 if (!account_name) {
1339 acc_name = g_strdup (modest_window_get_active_account(win));
1341 acc_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
1343 g_printerr ("modest: cannot get default account\n");
1347 acc_name = g_strdup (account_name);
1350 /* Set send/receive operation in progress */
1351 modest_main_window_notify_send_receive_initied (MODEST_MAIN_WINDOW(win));
1353 mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
1355 modest_ui_actions_send_receive_error_handler,
1358 g_signal_connect (G_OBJECT(mail_op), "progress-changed",
1359 G_CALLBACK (_on_send_receive_progress_changed),
1362 /* Send & receive. */
1363 /* TODO: The spec wants us to first do any pending deletions, before receiving. */
1364 /* Receive and then send. The operation is tagged initially as
1365 a receive operation because the account update performs a
1366 receive and then a send. The operation changes its type
1367 internally, so the progress objects will receive the proper
1368 progress information */
1369 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
1370 modest_mail_operation_update_account (mail_op, acc_name, new_messages_arrived, NULL);
1371 g_object_unref (G_OBJECT (mail_op));
1379 modest_ui_actions_do_cancel_send (const gchar *account_name,
1382 TnyTransportAccount *transport_account;
1383 TnySendQueue *send_queue = NULL;
1384 GError *error = NULL;
1386 /* Get transport account */
1388 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_server_account
1389 (modest_runtime_get_account_store(),
1391 TNY_ACCOUNT_TYPE_TRANSPORT));
1392 if (!transport_account) {
1393 g_printerr ("modest: no transport account found for '%s'\n", account_name);
1398 send_queue = TNY_SEND_QUEUE (modest_runtime_get_send_queue (transport_account));
1399 if (!TNY_IS_SEND_QUEUE(send_queue)) {
1400 g_set_error (&error, MODEST_MAIL_OPERATION_ERROR,
1401 MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND,
1402 "modest: could not find send queue for account\n");
1404 /* Keeep messages in outbox folder */
1405 tny_send_queue_cancel (send_queue, FALSE, &error);
1409 if (transport_account != NULL)
1410 g_object_unref (G_OBJECT (transport_account));
1414 modest_ui_actions_cancel_send_all (ModestWindow *win)
1416 GSList *account_names, *iter;
1418 account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr(),
1421 iter = account_names;
1423 modest_ui_actions_do_cancel_send ((const char*) iter->data, win);
1424 iter = g_slist_next (iter);
1427 modest_account_mgr_free_account_names (account_names);
1428 account_names = NULL;
1432 modest_ui_actions_cancel_send (GtkAction *action, ModestWindow *win)
1435 /* Check if accounts exist */
1436 gboolean accounts_exist =
1437 modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE);
1439 /* If not, allow the user to create an account before trying to send/receive. */
1440 if (!accounts_exist)
1441 modest_ui_actions_on_accounts (NULL, win);
1443 /* Cancel all sending operaitons */
1444 modest_ui_actions_cancel_send_all (win);
1448 * Refreshes all accounts. This function will be used by automatic
1452 modest_ui_actions_do_send_receive_all (ModestWindow *win)
1454 GSList *account_names, *iter;
1456 account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr(),
1459 iter = account_names;
1461 modest_ui_actions_do_send_receive ((const char*) iter->data, win);
1462 iter = g_slist_next (iter);
1465 modest_account_mgr_free_account_names (account_names);
1466 account_names = NULL;
1470 * Handler of the click on Send&Receive button in the main toolbar
1473 modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win)
1475 /* Check if accounts exist */
1476 gboolean accounts_exist =
1477 modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE);
1479 /* If not, allow the user to create an account before trying to send/receive. */
1480 if (!accounts_exist)
1481 modest_ui_actions_on_accounts (NULL, win);
1483 /* Refresh currently selected folder. Note that if we only
1484 want to retrive the headers, then the refresh only will
1485 invoke a poke_status over all folders, i.e., only the
1486 total/unread count will be updated */
1487 if (MODEST_IS_MAIN_WINDOW (win)) {
1488 GtkWidget *header_view, *folder_view;
1489 TnyFolderStore *folder_store;
1491 /* Get folder and header view */
1493 modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
1494 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1496 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
1498 if (TNY_IS_FOLDER (folder_store)) {
1500 modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
1501 MODEST_WIDGET_TYPE_HEADER_VIEW);
1503 /* We do not need to set the contents style
1504 because it hasn't changed. We also do not
1505 need to save the widget status. Just force
1507 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view),
1508 TNY_FOLDER (folder_store),
1509 folder_refreshed_cb,
1510 MODEST_MAIN_WINDOW (win));
1512 g_object_unref (folder_store);
1515 /* Refresh the active account */
1516 modest_ui_actions_do_send_receive (NULL, win);
1521 modest_ui_actions_toggle_header_list_view (GtkAction *action, ModestMainWindow *main_window)
1524 GtkWidget *header_view;
1526 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1528 header_view = modest_main_window_get_child_widget (main_window,
1529 MODEST_WIDGET_TYPE_HEADER_VIEW);
1533 conf = modest_runtime_get_conf ();
1535 /* what is saved/restored is depending on the style; thus; we save with
1536 * old style, then update the style, and restore for this new style
1538 modest_widget_memory_save (conf, G_OBJECT(header_view), MODEST_CONF_HEADER_VIEW_KEY);
1540 if (modest_header_view_get_style
1541 (MODEST_HEADER_VIEW(header_view)) == MODEST_HEADER_VIEW_STYLE_DETAILS)
1542 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
1543 MODEST_HEADER_VIEW_STYLE_TWOLINES);
1545 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
1546 MODEST_HEADER_VIEW_STYLE_DETAILS);
1548 modest_widget_memory_restore (conf, G_OBJECT(header_view),
1549 MODEST_CONF_HEADER_VIEW_KEY);
1554 modest_ui_actions_on_header_selected (ModestHeaderView *header_view,
1556 ModestMainWindow *main_window)
1558 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1559 g_return_if_fail (MODEST_IS_HEADER_VIEW (header_view));
1561 /* If no header has been selected then exit */
1566 if (!gtk_widget_is_focus (GTK_WIDGET(header_view)))
1567 gtk_widget_grab_focus (GTK_WIDGET(header_view));
1569 /* Update Main window title */
1570 if (gtk_widget_is_focus (GTK_WIDGET(header_view))) {
1571 const gchar *subject = tny_header_get_subject (header);
1572 if (subject && strlen(subject) > 0)
1573 gtk_window_set_title (GTK_WINDOW (main_window), subject);
1575 gtk_window_set_title (GTK_WINDOW (main_window), _("mail_va_no_subject"));
1578 /* Update toolbar dimming state */
1579 modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
1583 modest_ui_actions_on_header_activated (ModestHeaderView *header_view,
1585 ModestMainWindow *main_window)
1589 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1594 headers = tny_simple_list_new ();
1595 tny_list_prepend (headers, G_OBJECT (header));
1597 _modest_ui_actions_open (headers, MODEST_WINDOW (main_window));
1599 g_object_unref (headers);
1603 set_active_account_from_tny_account (TnyAccount *account,
1604 ModestWindow *window)
1606 const gchar *server_acc_name = tny_account_get_id (account);
1608 /* We need the TnyAccount provided by the
1609 account store because that is the one that
1610 knows the name of the Modest account */
1611 TnyAccount *modest_server_account = modest_server_account =
1612 modest_tny_account_store_get_tny_account_by (modest_runtime_get_account_store (),
1613 MODEST_TNY_ACCOUNT_STORE_QUERY_ID,
1616 const gchar *modest_acc_name =
1617 modest_tny_account_get_parent_modest_account_name_for_server_account (modest_server_account);
1618 modest_window_set_active_account (window, modest_acc_name);
1619 g_object_unref (modest_server_account);
1624 folder_refreshed_cb (ModestMailOperation *mail_op,
1628 ModestMainWindow *win = NULL;
1629 GtkWidget *header_view;
1631 g_return_if_fail (TNY_IS_FOLDER (folder));
1633 win = MODEST_MAIN_WINDOW (user_data);
1635 modest_main_window_get_child_widget(win, MODEST_WIDGET_TYPE_HEADER_VIEW);
1637 /* Check if folder is empty and set headers view contents style */
1638 if (tny_folder_get_all_count (folder) == 0) {
1639 printf ("DEBUG: %s: tny_folder_get_all_count() returned 0.\n", __FUNCTION__);
1640 modest_main_window_set_contents_style (win,
1641 MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY);
1643 printf ("DEBUG: %s: tny_folder_get_all_count() returned >0.\n", __FUNCTION__);
1648 modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
1649 TnyFolderStore *folder_store,
1651 ModestMainWindow *main_window)
1654 GtkWidget *header_view;
1656 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1658 header_view = modest_main_window_get_child_widget(main_window,
1659 MODEST_WIDGET_TYPE_HEADER_VIEW);
1663 conf = modest_runtime_get_conf ();
1665 if (TNY_IS_ACCOUNT (folder_store)) {
1667 /* Update active account */
1668 set_active_account_from_tny_account (TNY_ACCOUNT (folder_store), MODEST_WINDOW (main_window));
1669 /* Show account details */
1670 modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS);
1673 if (TNY_IS_FOLDER (folder_store) && selected) {
1675 /* Update the active account */
1676 TnyAccount *account = modest_tny_folder_get_account (TNY_FOLDER (folder_store));
1678 set_active_account_from_tny_account (account, MODEST_WINDOW (main_window));
1679 g_object_unref (account);
1683 /* Set the header style by default, it could
1684 be changed later by the refresh callback to
1686 modest_main_window_set_contents_style (main_window,
1687 MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS);
1689 /* Set folder on header view. This function
1690 will call tny_folder_refresh_async so we
1691 pass a callback that will be called when
1692 finished. We use that callback to set the
1693 empty view if there are no messages */
1694 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view),
1695 TNY_FOLDER (folder_store),
1696 folder_refreshed_cb,
1699 /* Restore configuration. We need to do this
1700 *after* the set_folder because the widget
1701 memory asks the header view about its
1703 modest_widget_memory_restore (modest_runtime_get_conf (),
1704 G_OBJECT(header_view),
1705 MODEST_CONF_HEADER_VIEW_KEY);
1707 /* Update the active account */
1708 modest_window_set_active_account (MODEST_WINDOW (main_window), NULL);
1709 /* Save only if we're seeing headers */
1710 if (modest_main_window_get_contents_style (main_window) ==
1711 MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS)
1712 modest_widget_memory_save (conf, G_OBJECT (header_view),
1713 MODEST_CONF_HEADER_VIEW_KEY);
1714 modest_header_view_clear (MODEST_HEADER_VIEW(header_view));
1718 /* Update toolbar dimming state */
1719 modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
1723 modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemType type,
1730 item = (type == MODEST_ITEM_TYPE_FOLDER) ? "folder" : "message";
1732 online = tny_device_is_online (modest_runtime_get_device());
1735 /* already online -- the item is simply not there... */
1736 dialog = gtk_message_dialog_new (GTK_WINDOW (win),
1738 GTK_MESSAGE_WARNING,
1740 _("The %s you selected cannot be found"),
1742 gtk_dialog_run (GTK_DIALOG(dialog));
1744 dialog = gtk_dialog_new_with_buttons (_("Connection requested"),
1748 GTK_RESPONSE_REJECT,
1750 GTK_RESPONSE_ACCEPT,
1752 txt = g_strdup_printf (_("This %s is not available in offline mode.\n"
1753 "Do you want to get online?"), item);
1754 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1755 gtk_label_new (txt), FALSE, FALSE, 0);
1756 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1759 gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300);
1760 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
1761 // modest_platform_connect_and_wait ();
1764 gtk_widget_destroy (dialog);
1768 modest_ui_actions_on_msg_link_hover (ModestMsgView *msgview, const gchar* link,
1771 /* g_message ("%s %s", __FUNCTION__, link); */
1776 modest_ui_actions_on_msg_link_clicked (ModestMsgView *msgview, const gchar* link,
1779 modest_platform_activate_uri (link);
1783 modest_ui_actions_on_msg_link_contextual (ModestMsgView *msgview, const gchar* link,
1786 modest_platform_show_uri_popup (link);
1790 modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, TnyMimePart *mime_part,
1793 modest_msg_view_window_view_attachment (MODEST_MSG_VIEW_WINDOW (win), mime_part);
1797 modest_ui_actions_on_msg_recpt_activated (ModestMsgView *msgview,
1798 const gchar *address,
1801 /* g_message ("%s %s", __FUNCTION__, address); */
1805 modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edit_window)
1807 TnyTransportAccount *transport_account;
1808 ModestMailOperation *mail_operation;
1810 gchar *account_name, *from;
1811 ModestAccountMgr *account_mgr;
1812 gchar *info_text = NULL;
1813 TnyMsg *new_draft = NULL;
1815 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
1817 data = modest_msg_edit_window_get_msg_data (edit_window);
1819 account_mgr = modest_runtime_get_account_mgr();
1820 account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
1822 account_name = modest_account_mgr_get_default_account (account_mgr);
1823 if (!account_name) {
1824 g_printerr ("modest: no account found\n");
1825 modest_msg_edit_window_free_msg_data (edit_window, data);
1829 if (!strcmp (account_name, MODEST_LOCAL_FOLDERS_ACCOUNT_ID)) {
1830 account_name = g_strdup (data->account_name);
1834 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_server_account
1835 (modest_runtime_get_account_store(),
1837 TNY_ACCOUNT_TYPE_TRANSPORT));
1838 if (!transport_account) {
1839 g_printerr ("modest: no transport account found for '%s'\n", account_name);
1840 g_free (account_name);
1841 modest_msg_edit_window_free_msg_data (edit_window, data);
1844 from = modest_account_mgr_get_from_string (account_mgr, account_name);
1846 /* Create the mail operation */
1847 mail_operation = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_INFO, G_OBJECT(edit_window));
1848 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
1850 new_draft = modest_mail_operation_save_to_drafts (mail_operation,
1861 data->priority_flags);
1864 g_free (account_name);
1865 g_object_unref (G_OBJECT (transport_account));
1866 g_object_unref (G_OBJECT (mail_operation));
1868 modest_msg_edit_window_free_msg_data (edit_window, data);
1870 modest_msg_edit_window_set_draft (edit_window, new_draft);
1871 if (new_draft != NULL)
1872 g_object_unref (new_draft);
1874 info_text = g_strdup_printf (_("mail_va_saved_to_drafts"), _("mcen_me_folder_drafts"));
1875 modest_platform_information_banner (NULL, NULL, info_text);
1879 /* For instance, when clicking the Send toolbar button when editing a message: */
1881 modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
1883 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
1885 if (!modest_msg_edit_window_check_names (edit_window))
1888 /* Offer the connection dialog, if necessary: */
1889 if (!modest_platform_connect_and_wait (GTK_WINDOW (edit_window)))
1892 /* FIXME: Code added just for testing. The final version will
1893 use the send queue provided by tinymail and some
1895 ModestAccountMgr *account_mgr = modest_runtime_get_account_mgr();
1896 gchar *account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
1898 account_name = modest_account_mgr_get_default_account (account_mgr);
1900 if (!account_name) {
1901 g_printerr ("modest: no account found\n");
1905 MsgData *data = modest_msg_edit_window_get_msg_data (edit_window);
1907 if (!strcmp (account_name, MODEST_LOCAL_FOLDERS_ACCOUNT_ID)) {
1908 account_name = g_strdup (data->account_name);
1911 /* Get the currently-active transport account for this modest account: */
1912 TnyTransportAccount *transport_account =
1913 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_transport_account_for_open_connection
1914 (modest_runtime_get_account_store(),
1916 if (!transport_account) {
1917 g_printerr ("modest: no transport account found for '%s'\n", account_name);
1918 g_free (account_name);
1919 modest_msg_edit_window_free_msg_data (edit_window, data);
1923 gchar *from = modest_account_mgr_get_from_string (account_mgr, account_name);
1925 /* mail content checks and dialogs */
1926 if (data->subject == NULL || data->subject[0] == '\0') {
1927 GtkResponseType response;
1928 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (edit_window),
1929 _("mcen_nc_subject_is_empty_send"));
1930 if (response == GTK_RESPONSE_CANCEL) {
1931 g_free (account_name);
1936 if (data->plain_body == NULL || data->plain_body[0] == '\0') {
1937 GtkResponseType response;
1938 gchar *note_message;
1939 gchar *note_subject = data->subject;
1940 if (note_subject == NULL || note_subject[0] == '\0')
1941 note_subject = _("mail_va_no_subject");
1942 note_message = g_strdup_printf (_("emev_ni_ui_smtp_message_null"), note_subject);
1943 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (edit_window),
1945 g_free (note_message);
1946 if (response == GTK_RESPONSE_CANCEL) {
1947 g_free (account_name);
1952 modest_platform_information_banner (NULL, NULL, _("mcen_ib_outbox_waiting_to_be_sent"));
1954 /* Create the mail operation */
1955 ModestMailOperation *mail_operation = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_SEND, G_OBJECT(edit_window));
1956 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
1958 modest_mail_operation_send_new_mail (mail_operation,
1969 data->priority_flags);
1973 g_free (account_name);
1974 g_object_unref (G_OBJECT (transport_account));
1975 g_object_unref (G_OBJECT (mail_operation));
1977 modest_msg_edit_window_free_msg_data (edit_window, data);
1978 modest_msg_edit_window_set_sent (edit_window, TRUE);
1980 /* Save settings and close the window: */
1981 modest_ui_actions_on_close_window (NULL, MODEST_WINDOW (edit_window));
1985 modest_ui_actions_on_toggle_bold (GtkToggleAction *action,
1986 ModestMsgEditWindow *window)
1988 ModestMsgEditFormatState *format_state = NULL;
1990 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1991 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1993 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1996 format_state = modest_msg_edit_window_get_format_state (window);
1997 g_return_if_fail (format_state != NULL);
1999 format_state->bold = gtk_toggle_action_get_active (action);
2000 modest_msg_edit_window_set_format_state (window, format_state);
2001 g_free (format_state);
2006 modest_ui_actions_on_toggle_italics (GtkToggleAction *action,
2007 ModestMsgEditWindow *window)
2009 ModestMsgEditFormatState *format_state = NULL;
2011 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2012 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
2014 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
2017 format_state = modest_msg_edit_window_get_format_state (window);
2018 g_return_if_fail (format_state != NULL);
2020 format_state->italics = gtk_toggle_action_get_active (action);
2021 modest_msg_edit_window_set_format_state (window, format_state);
2022 g_free (format_state);
2027 modest_ui_actions_on_toggle_bullets (GtkToggleAction *action,
2028 ModestMsgEditWindow *window)
2030 ModestMsgEditFormatState *format_state = NULL;
2032 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2033 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
2035 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
2038 format_state = modest_msg_edit_window_get_format_state (window);
2039 g_return_if_fail (format_state != NULL);
2041 format_state->bullet = gtk_toggle_action_get_active (action);
2042 modest_msg_edit_window_set_format_state (window, format_state);
2043 g_free (format_state);
2048 modest_ui_actions_on_change_justify (GtkRadioAction *action,
2049 GtkRadioAction *selected,
2050 ModestMsgEditWindow *window)
2052 ModestMsgEditFormatState *format_state = NULL;
2053 GtkJustification value;
2055 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2057 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
2060 value = gtk_radio_action_get_current_value (selected);
2062 format_state = modest_msg_edit_window_get_format_state (window);
2063 g_return_if_fail (format_state != NULL);
2065 format_state->justification = value;
2066 modest_msg_edit_window_set_format_state (window, format_state);
2067 g_free (format_state);
2071 modest_ui_actions_on_select_editor_color (GtkAction *action,
2072 ModestMsgEditWindow *window)
2074 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2075 g_return_if_fail (GTK_IS_ACTION (action));
2077 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
2080 modest_msg_edit_window_select_color (window);
2084 modest_ui_actions_on_select_editor_background_color (GtkAction *action,
2085 ModestMsgEditWindow *window)
2087 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2088 g_return_if_fail (GTK_IS_ACTION (action));
2090 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
2093 modest_msg_edit_window_select_background_color (window);
2097 modest_ui_actions_on_insert_image (GtkAction *action,
2098 ModestMsgEditWindow *window)
2100 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2101 g_return_if_fail (GTK_IS_ACTION (action));
2103 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
2106 modest_msg_edit_window_insert_image (window);
2110 modest_ui_actions_on_attach_file (GtkAction *action,
2111 ModestMsgEditWindow *window)
2113 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2114 g_return_if_fail (GTK_IS_ACTION (action));
2116 modest_msg_edit_window_attach_file (window);
2120 modest_ui_actions_on_remove_attachments (GtkAction *action,
2121 ModestMsgEditWindow *window)
2123 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2124 g_return_if_fail (GTK_IS_ACTION (action));
2126 modest_msg_edit_window_remove_attachments (window, NULL);
2130 modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_window)
2132 TnyFolderStore *parent_folder;
2133 GtkWidget *folder_view;
2135 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
2137 folder_view = modest_main_window_get_child_widget (main_window,
2138 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2142 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2144 if (parent_folder) {
2145 gboolean finished = FALSE;
2147 gchar *folder_name = NULL, *suggested_name = NULL;
2149 /* Run the new folder dialog */
2151 result = modest_platform_run_new_folder_dialog (GTK_WINDOW (main_window),
2156 if (result == GTK_RESPONSE_REJECT) {
2159 ModestMailOperation *mail_op;
2160 TnyFolder *new_folder = NULL;
2162 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_INFO,
2163 G_OBJECT(main_window));
2164 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
2166 new_folder = modest_mail_operation_create_folder (mail_op,
2168 (const gchar *) folder_name);
2170 g_object_unref (new_folder);
2173 g_object_unref (mail_op);
2175 g_free (folder_name);
2179 g_object_unref (parent_folder);
2184 modest_ui_actions_rename_folder_error_handler (ModestMailOperation *mail_op,
2187 GObject *win = modest_mail_operation_get_source (mail_op);
2188 const GError *error = NULL;
2189 const gchar *message = NULL;
2191 /* Get error message */
2192 error = modest_mail_operation_get_error (mail_op);
2193 if (error != NULL && error->message != NULL) {
2194 message = error->message;
2196 message = _("!!! FIXME: Unable to rename");
2199 /* Show notification dialog */
2200 modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL, message);
2201 g_object_unref (win);
2205 modest_ui_actions_on_rename_folder (GtkAction *action,
2206 ModestMainWindow *main_window)
2208 TnyFolderStore *folder;
2209 GtkWidget *folder_view;
2210 GtkWidget *header_view;
2212 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
2214 folder_view = modest_main_window_get_child_widget (main_window,
2215 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2219 header_view = modest_main_window_get_child_widget (main_window,
2220 MODEST_WIDGET_TYPE_HEADER_VIEW);
2225 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2227 /* Offer the connection dialog if necessary: */
2228 if (!modest_platform_connect_and_wait_if_network_folderstore (NULL, folder)) {
2229 g_object_unref (G_OBJECT (folder));
2234 if (folder && TNY_IS_FOLDER (folder)) {
2237 const gchar *current_name;
2239 current_name = tny_folder_get_name (TNY_FOLDER (folder));
2240 response = modest_platform_run_rename_folder_dialog (GTK_WINDOW (main_window), NULL,
2241 current_name, &folder_name);
2243 if (response == GTK_RESPONSE_ACCEPT && strlen (folder_name) > 0) {
2244 ModestMailOperation *mail_op;
2247 modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_INFO,
2248 G_OBJECT(main_window),
2249 modest_ui_actions_rename_folder_error_handler,
2253 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
2256 modest_header_view_clear (MODEST_HEADER_VIEW (header_view));
2258 modest_mail_operation_rename_folder (mail_op,
2259 TNY_FOLDER (folder),
2260 (const gchar *) folder_name);
2262 g_object_unref (mail_op);
2263 g_free (folder_name);
2265 g_object_unref (folder);
2270 modest_ui_actions_delete_folder_error_handler (ModestMailOperation *mail_op,
2273 GObject *win = modest_mail_operation_get_source (mail_op);
2275 modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL,
2276 _("mail_in_ui_folder_delete_error"));
2277 g_object_unref (win);
2281 delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
2283 TnyFolderStore *folder;
2284 GtkWidget *folder_view;
2288 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
2290 folder_view = modest_main_window_get_child_widget (main_window,
2291 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2295 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
2297 /* Show an error if it's an account */
2298 if (!TNY_IS_FOLDER (folder)) {
2299 modest_platform_run_information_dialog (GTK_WINDOW (main_window),
2300 _("mail_in_ui_folder_delete_error"));
2301 g_object_unref (G_OBJECT (folder));
2305 /* Offer the connection dialog if necessary: */
2306 if (!modest_platform_connect_and_wait_if_network_folderstore (NULL, folder)) {
2307 g_object_unref (G_OBJECT (folder));
2312 message = g_strdup_printf (_("mcen_nc_delete_folder_text"),
2313 tny_folder_get_name (TNY_FOLDER (folder)));
2314 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (main_window),
2315 (const gchar *) message);
2318 if (response == GTK_RESPONSE_OK) {
2319 ModestMailOperation *mail_op =
2320 modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_DELETE,
2321 G_OBJECT(main_window),
2322 modest_ui_actions_delete_folder_error_handler,
2325 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
2327 modest_mail_operation_remove_folder (mail_op, TNY_FOLDER (folder), move_to_trash);
2328 g_object_unref (G_OBJECT (mail_op));
2331 g_object_unref (G_OBJECT (folder));
2335 modest_ui_actions_on_delete_folder (GtkAction *action,
2336 ModestMainWindow *main_window)
2338 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
2340 delete_folder (main_window, FALSE);
2344 modest_ui_actions_on_move_folder_to_trash_folder (GtkAction *action, ModestMainWindow *main_window)
2346 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
2348 delete_folder (main_window, TRUE);
2352 modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
2353 const gchar* server_account_name,
2358 ModestMainWindow *main_window)
2360 g_return_if_fail(server_account_name);
2361 /* printf("DEBUG: %s: server_account_name=%s\n", __FUNCTION__, server_account_name); */
2363 /* Initalize output parameters: */
2370 #ifdef MODEST_PLATFORM_MAEMO
2371 /* Maemo uses a different (awkward) button order,
2372 * It should probably just use gtk_alternative_dialog_button_order ().
2374 GtkWidget *dialog = gtk_dialog_new_with_buttons (_("mail_ti_password_protected"),
2378 GTK_RESPONSE_ACCEPT,
2380 GTK_RESPONSE_REJECT,
2383 GtkWidget *dialog = gtk_dialog_new_with_buttons (_("mail_ti_password_protected"),
2387 GTK_RESPONSE_REJECT,
2389 GTK_RESPONSE_ACCEPT,
2391 #endif /* MODEST_PLATFORM_MAEMO */
2393 gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(main_window));
2395 gchar *server_name = modest_server_account_get_hostname (
2396 modest_runtime_get_account_mgr(), server_account_name);
2397 if (!server_name) {/* This happened once, though I don't know why. murrayc. */
2398 g_warning("%s: Could not get server name for server account '%s'", __FUNCTION__, server_account_name);
2403 /* This causes a warning because the logical ID has no %s in it,
2404 * though the translation does, but there is not much we can do about that: */
2405 gchar *txt = g_strdup_printf (_("mail_ia_password_info"), server_name);
2406 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt),
2409 g_free (server_name);
2413 gchar *initial_username = modest_server_account_get_username (
2414 modest_runtime_get_account_mgr(), server_account_name);
2416 GtkWidget *entry_username = gtk_entry_new ();
2417 if (initial_username)
2418 gtk_entry_set_text (GTK_ENTRY (entry_username), initial_username);
2419 /* Dim this if a connection has ever succeeded with this username,
2420 * as per the UI spec: */
2421 const gboolean username_known =
2422 modest_server_account_get_username_has_succeeded(
2423 modest_runtime_get_account_mgr(), server_account_name);
2424 gtk_widget_set_sensitive (entry_username, !username_known);
2426 #ifdef MODEST_PLATFORM_MAEMO
2427 /* Auto-capitalization is the default, so let's turn it off: */
2428 hildon_gtk_entry_set_input_mode (GTK_ENTRY (entry_username), HILDON_GTK_INPUT_MODE_FULL);
2430 /* Create a size group to be used by all captions.
2431 * Note that HildonCaption does not create a default size group if we do not specify one.
2432 * We use GTK_SIZE_GROUP_HORIZONTAL, so that the widths are the same. */
2433 GtkSizeGroup *sizegroup = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
2435 GtkWidget *caption = hildon_caption_new (sizegroup,
2436 _("mail_fi_username"), entry_username, NULL, HILDON_CAPTION_MANDATORY);
2437 gtk_widget_show (entry_username);
2438 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), caption,
2439 FALSE, FALSE, MODEST_MARGIN_HALF);
2440 gtk_widget_show (caption);
2442 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry_username,
2444 #endif /* MODEST_PLATFORM_MAEMO */
2447 GtkWidget *entry_password = gtk_entry_new ();
2448 gtk_entry_set_visibility (GTK_ENTRY(entry_password), FALSE);
2449 /* gtk_entry_set_invisible_char (GTK_ENTRY(entry_password), "*"); */
2451 #ifdef MODEST_PLATFORM_MAEMO
2452 /* Auto-capitalization is the default, so let's turn it off: */
2453 hildon_gtk_entry_set_input_mode (GTK_ENTRY (entry_password),
2454 HILDON_GTK_INPUT_MODE_FULL | HILDON_GTK_INPUT_MODE_INVISIBLE);
2456 caption = hildon_caption_new (sizegroup,
2457 _("mail_fi_password"), entry_password, NULL, HILDON_CAPTION_MANDATORY);
2458 gtk_widget_show (entry_password);
2459 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), caption,
2460 FALSE, FALSE, MODEST_MARGIN_HALF);
2461 gtk_widget_show (caption);
2462 g_object_unref (sizegroup);
2464 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry_password,
2466 #endif /* MODEST_PLATFORM_MAEMO */
2468 /* This is not in the Maemo UI spec:
2469 remember_pass_check = gtk_check_button_new_with_label (_("Remember password"));
2470 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check,
2474 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
2476 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
2478 *username = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry_username)));
2480 modest_server_account_set_username (
2481 modest_runtime_get_account_mgr(), server_account_name,
2484 const gboolean username_was_changed =
2485 (strcmp (*username, initial_username) != 0);
2486 if (username_was_changed) {
2487 g_warning ("%s: tinymail does not yet support changing the "
2488 "username in the get_password() callback.\n", __FUNCTION__);
2493 *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry_password)));
2495 /* We do not save the password in the configuration,
2496 * because this function is only called for passwords that should
2497 * not be remembered:
2498 modest_server_account_set_password (
2499 modest_runtime_get_account_mgr(), server_account_name,
2518 /* This is not in the Maemo UI spec:
2519 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check)))
2525 gtk_widget_destroy (dialog);
2527 /* printf ("DEBUG: %s: cancel=%d\n", __FUNCTION__, *cancel); */
2531 modest_ui_actions_on_cut (GtkAction *action,
2532 ModestWindow *window)
2534 GtkWidget *focused_widget;
2536 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
2537 if (GTK_IS_EDITABLE (focused_widget)) {
2538 gtk_editable_cut_clipboard (GTK_EDITABLE(focused_widget));
2539 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
2540 GtkTextBuffer *buffer;
2541 GtkClipboard *clipboard;
2543 clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
2544 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
2545 gtk_text_buffer_cut_clipboard (buffer, clipboard, TRUE);
2546 gtk_clipboard_set_can_store (clipboard, NULL, 0);
2547 } else if (MODEST_IS_HEADER_VIEW (focused_widget)) {
2548 modest_header_view_cut_selection (MODEST_HEADER_VIEW (focused_widget));
2549 } else if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
2550 modest_folder_view_cut_selection (MODEST_FOLDER_VIEW (focused_widget));
2555 modest_ui_actions_on_copy (GtkAction *action,
2556 ModestWindow *window)
2558 GtkClipboard *clipboard;
2559 GtkWidget *focused_widget;
2561 clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
2562 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
2564 if (GTK_IS_LABEL (focused_widget)) {
2565 gtk_clipboard_set_text (clipboard, gtk_label_get_text (GTK_LABEL (focused_widget)), -1);
2566 } else if (GTK_IS_EDITABLE (focused_widget)) {
2567 gtk_editable_copy_clipboard (GTK_EDITABLE(focused_widget));
2568 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
2569 GtkTextBuffer *buffer;
2570 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
2571 gtk_text_buffer_copy_clipboard (buffer, clipboard);
2572 gtk_clipboard_set_can_store (clipboard, NULL, 0);
2573 } else if (MODEST_IS_HEADER_VIEW (focused_widget)) {
2574 TnyList *header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (focused_widget));
2575 TnyIterator *iter = tny_list_create_iterator (header_list);
2576 TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter));
2577 TnyFolder *folder = tny_header_get_folder (header);
2578 TnyAccount *account = tny_folder_get_account (folder);
2579 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (account));
2580 /* If it's POP then ask */
2581 gboolean ask = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
2582 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
2583 g_object_unref (account);
2584 g_object_unref (folder);
2585 g_object_unref (header);
2586 g_object_unref (iter);
2588 /* Check that the messages have been previously downloaded */
2589 gboolean continue_download = TRUE;
2591 continue_download = download_uncached_messages (header_list, GTK_WINDOW (window));
2592 if (continue_download)
2593 modest_header_view_copy_selection (MODEST_HEADER_VIEW (focused_widget));
2594 g_object_unref (header_list);
2595 } else if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
2596 modest_folder_view_copy_selection (MODEST_FOLDER_VIEW (focused_widget));
2599 /* Show information banner */
2600 modest_platform_information_banner (NULL, NULL, _CS("ecoc_ib_edwin_copied"));
2605 modest_ui_actions_on_undo (GtkAction *action,
2606 ModestWindow *window)
2608 ModestEmailClipboard *clipboard = NULL;
2610 if (MODEST_IS_MSG_EDIT_WINDOW (window)) {
2611 modest_msg_edit_window_undo (MODEST_MSG_EDIT_WINDOW (window));
2612 } else if (MODEST_IS_MAIN_WINDOW (window)) {
2613 /* Clear clipboard source */
2614 clipboard = modest_runtime_get_email_clipboard ();
2615 modest_email_clipboard_clear (clipboard);
2618 g_return_if_reached ();
2623 modest_ui_actions_on_redo (GtkAction *action,
2624 ModestWindow *window)
2626 if (MODEST_IS_MSG_EDIT_WINDOW (window)) {
2627 modest_msg_edit_window_redo (MODEST_MSG_EDIT_WINDOW (window));
2630 g_return_if_reached ();
2636 paste_msgs_cb (const GObject *object, gpointer user_data)
2638 g_return_if_fail (MODEST_IS_MAIN_WINDOW (object));
2639 g_return_if_fail (GTK_IS_WIDGET (user_data));
2641 /* destroy information note */
2642 gtk_widget_destroy (GTK_WIDGET(user_data));
2646 modest_ui_actions_on_paste (GtkAction *action,
2647 ModestWindow *window)
2649 GtkWidget *focused_widget = NULL;
2650 GtkWidget *inf_note = NULL;
2651 ModestMailOperation *mail_op = NULL;
2653 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
2654 if (GTK_IS_EDITABLE (focused_widget)) {
2655 gtk_editable_paste_clipboard (GTK_EDITABLE(focused_widget));
2656 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
2657 GtkTextBuffer *buffer;
2658 GtkClipboard *clipboard;
2660 clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
2661 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
2662 gtk_text_buffer_paste_clipboard (buffer, clipboard, NULL, TRUE);
2663 } else if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
2664 ModestEmailClipboard *clipboard = NULL;
2665 TnyFolder *src_folder = NULL;
2666 TnyFolderStore *folder_store = NULL;
2667 TnyList *data = NULL;
2668 gboolean delete = FALSE;
2670 /* Check clipboard source */
2671 clipboard = modest_runtime_get_email_clipboard ();
2672 if (modest_email_clipboard_cleared (clipboard))
2675 /* Get elements to paste */
2676 modest_email_clipboard_get_data (clipboard, &src_folder, &data, &delete);
2678 /* Create a new mail operation */
2679 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(window));
2680 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
2683 /* Get destination folder */
2684 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (focused_widget));
2686 /* Launch notification */
2687 inf_note = modest_platform_animation_banner (GTK_WIDGET (window), NULL,
2688 _CS("ckct_nw_pasting"));
2689 if (inf_note != NULL) {
2690 gtk_window_set_modal (GTK_WINDOW(inf_note), FALSE);
2691 gtk_widget_show (GTK_WIDGET(inf_note));
2694 /* transfer messages */
2696 modest_mail_operation_xfer_msgs (mail_op,
2698 TNY_FOLDER (folder_store),
2703 } else if (src_folder != NULL) {
2704 modest_mail_operation_xfer_folder (mail_op,
2714 g_object_unref (data);
2715 if (src_folder != NULL)
2716 g_object_unref (src_folder);
2717 if (folder_store != NULL)
2718 g_object_unref (folder_store);
2724 modest_ui_actions_on_select_all (GtkAction *action,
2725 ModestWindow *window)
2727 GtkWidget *focused_widget;
2729 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
2730 if (MODEST_IS_ATTACHMENTS_VIEW (focused_widget)) {
2731 modest_attachments_view_select_all (MODEST_ATTACHMENTS_VIEW (focused_widget));
2732 } else if (GTK_IS_LABEL (focused_widget)) {
2733 gtk_label_select_region (GTK_LABEL (focused_widget), 0, -1);
2734 } else if (GTK_IS_EDITABLE (focused_widget)) {
2735 gtk_editable_select_region (GTK_EDITABLE(focused_widget), 0, -1);
2736 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
2737 GtkTextBuffer *buffer;
2738 GtkTextIter start, end;
2740 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
2741 gtk_text_buffer_get_start_iter (buffer, &start);
2742 gtk_text_buffer_get_end_iter (buffer, &end);
2743 gtk_text_buffer_select_range (buffer, &start, &end);
2744 } else if (GTK_IS_HTML (focused_widget)) {
2745 gtk_html_select_all (GTK_HTML (focused_widget));
2746 } else if (MODEST_IS_MAIN_WINDOW (window)) {
2747 GtkWidget *header_view = focused_widget;
2748 GtkTreeSelection *selection = NULL;
2750 if (!(MODEST_IS_HEADER_VIEW (focused_widget)))
2751 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (window),
2752 MODEST_WIDGET_TYPE_HEADER_VIEW);
2754 /* Select all messages */
2755 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view));
2756 gtk_tree_selection_select_all (selection);
2758 /* Set focuse on header view */
2759 gtk_widget_grab_focus (header_view);
2765 modest_ui_actions_on_mark_as_read (GtkAction *action,
2766 ModestWindow *window)
2768 g_return_if_fail (MODEST_IS_WINDOW(window));
2770 /* Mark each header as read */
2771 do_headers_action (window, headers_action_mark_as_read, NULL);
2775 modest_ui_actions_on_mark_as_unread (GtkAction *action,
2776 ModestWindow *window)
2778 g_return_if_fail (MODEST_IS_WINDOW(window));
2780 /* Mark each header as read */
2781 do_headers_action (window, headers_action_mark_as_unread, NULL);
2785 modest_ui_actions_on_change_zoom (GtkRadioAction *action,
2786 GtkRadioAction *selected,
2787 ModestWindow *window)
2791 value = gtk_radio_action_get_current_value (selected);
2792 if (MODEST_IS_WINDOW (window)) {
2793 modest_window_set_zoom (MODEST_WINDOW (window), ((gdouble)value)/100);
2797 void modest_ui_actions_msg_edit_on_change_priority (GtkRadioAction *action,
2798 GtkRadioAction *selected,
2799 ModestWindow *window)
2801 TnyHeaderFlags flags;
2802 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2804 flags = gtk_radio_action_get_current_value (selected);
2805 modest_msg_edit_window_set_priority_flags (MODEST_MSG_EDIT_WINDOW (window), flags);
2808 void modest_ui_actions_msg_edit_on_change_file_format (GtkRadioAction *action,
2809 GtkRadioAction *selected,
2810 ModestWindow *window)
2814 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2816 file_format = gtk_radio_action_get_current_value (selected);
2817 modest_msg_edit_window_set_file_format (MODEST_MSG_EDIT_WINDOW (window), file_format);
2822 modest_ui_actions_on_zoom_plus (GtkAction *action,
2823 ModestWindow *window)
2825 g_return_if_fail (MODEST_IS_WINDOW (window));
2827 modest_window_zoom_plus (MODEST_WINDOW (window));
2831 modest_ui_actions_on_zoom_minus (GtkAction *action,
2832 ModestWindow *window)
2834 g_return_if_fail (MODEST_IS_WINDOW (window));
2836 modest_window_zoom_minus (MODEST_WINDOW (window));
2840 modest_ui_actions_on_toggle_fullscreen (GtkToggleAction *toggle,
2841 ModestWindow *window)
2843 ModestWindowMgr *mgr;
2844 gboolean fullscreen, active;
2845 g_return_if_fail (MODEST_IS_WINDOW (window));
2847 mgr = modest_runtime_get_window_mgr ();
2849 active = (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle)))?1:0;
2850 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
2852 if (active != fullscreen) {
2853 modest_window_mgr_set_fullscreen_mode (mgr, active);
2854 gtk_window_present (GTK_WINDOW (window));
2859 modest_ui_actions_on_change_fullscreen (GtkAction *action,
2860 ModestWindow *window)
2862 ModestWindowMgr *mgr;
2863 gboolean fullscreen;
2865 g_return_if_fail (MODEST_IS_WINDOW (window));
2867 mgr = modest_runtime_get_window_mgr ();
2868 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
2869 modest_window_mgr_set_fullscreen_mode (mgr, !fullscreen);
2871 gtk_window_present (GTK_WINDOW (window));
2875 * Used by modest_ui_actions_on_details to call do_headers_action
2878 headers_action_show_details (TnyHeader *header,
2879 ModestWindow *window,
2886 dialog = modest_details_dialog_new_with_header (GTK_WINDOW (window), header);
2889 gtk_widget_show_all (dialog);
2890 gtk_dialog_run (GTK_DIALOG (dialog));
2892 gtk_widget_destroy (dialog);
2896 * Show the folder details in a ModestDetailsDialog widget
2899 show_folder_details (TnyFolder *folder,
2905 dialog = modest_details_dialog_new_with_folder (window, folder);
2908 gtk_widget_show_all (dialog);
2909 gtk_dialog_run (GTK_DIALOG (dialog));
2911 gtk_widget_destroy (dialog);
2915 * Show the header details in a ModestDetailsDialog widget
2918 modest_ui_actions_on_details (GtkAction *action,
2921 TnyList * headers_list;
2925 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2928 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2931 g_object_unref (msg);
2933 headers_list = get_selected_headers (win);
2937 iter = tny_list_create_iterator (headers_list);
2939 header = TNY_HEADER (tny_iterator_get_current (iter));
2940 headers_action_show_details (header, win, NULL);
2941 g_object_unref (header);
2943 g_object_unref (iter);
2944 g_object_unref (headers_list);
2946 } else if (MODEST_IS_MAIN_WINDOW (win)) {
2947 GtkWidget *folder_view, *header_view;
2949 /* Check which widget has the focus */
2950 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2951 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2952 if (gtk_widget_is_focus (folder_view)) {
2953 TnyFolderStore *folder_store
2954 = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
2955 if (!folder_store) {
2956 g_warning ("%s: No item was selected.\n", __FUNCTION__);
2959 /* Show only when it's a folder */
2960 /* This function should not be called for account items,
2961 * because we dim the menu item for them. */
2962 if (TNY_IS_FOLDER (folder_store)) {
2963 show_folder_details (TNY_FOLDER (folder_store), GTK_WINDOW (win));
2966 g_object_unref (folder_store);
2969 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2970 MODEST_WIDGET_TYPE_HEADER_VIEW);
2971 /* Show details of each header */
2972 do_headers_action (win, headers_action_show_details, header_view);
2978 modest_ui_actions_on_toggle_show_cc (GtkToggleAction *toggle,
2979 ModestMsgEditWindow *window)
2981 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2983 modest_msg_edit_window_show_cc (window, gtk_toggle_action_get_active (toggle));
2987 modest_ui_actions_on_toggle_show_bcc (GtkToggleAction *toggle,
2988 ModestMsgEditWindow *window)
2990 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2992 modest_msg_edit_window_show_bcc (window, gtk_toggle_action_get_active (toggle));
2996 modest_ui_actions_toggle_folders_view (GtkAction *action,
2997 ModestMainWindow *main_window)
3001 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
3003 conf = modest_runtime_get_conf ();
3005 if (modest_main_window_get_style (main_window) == MODEST_MAIN_WINDOW_STYLE_SPLIT)
3006 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SIMPLE);
3008 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SPLIT);
3012 modest_ui_actions_on_toggle_toolbar (GtkToggleAction *toggle,
3013 ModestWindow *window)
3015 gboolean active, fullscreen = FALSE;
3016 ModestWindowMgr *mgr;
3018 active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle));
3020 /* Check if we want to toggle the toolbar vuew in fullscreen
3022 if (!strcmp (gtk_action_get_name (GTK_ACTION (toggle)),
3023 "ViewShowToolbarFullScreen")) {
3027 /* Toggle toolbar */
3028 mgr = modest_runtime_get_window_mgr ();
3029 modest_window_mgr_show_toolbars (mgr, active, fullscreen);
3033 modest_ui_actions_msg_edit_on_select_font (GtkAction *action,
3034 ModestMsgEditWindow *window)
3036 modest_msg_edit_window_select_font (window);
3040 modest_ui_actions_on_folder_display_name_changed (ModestFolderView *folder_view,
3041 const gchar *display_name,
3044 /* Do not change the application name if the widget has not
3045 the focus. This callback could be called even if the folder
3046 view has not the focus, because the handled signal could be
3047 emitted when the folder view is redrawn */
3048 if (gtk_widget_is_focus (GTK_WIDGET (folder_view))) {
3050 gtk_window_set_title (window, display_name);
3052 gtk_window_set_title (window, " ");
3057 modest_ui_actions_on_select_contacts (GtkAction *action, ModestMsgEditWindow *window)
3059 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
3060 modest_msg_edit_window_select_contacts (window);
3064 modest_ui_actions_on_check_names (GtkAction *action, ModestMsgEditWindow *window)
3066 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
3067 modest_msg_edit_window_check_names (window);
3072 create_move_to_dialog (ModestWindow *win,
3073 GtkWidget *folder_view,
3074 GtkWidget **tree_view)
3076 GtkWidget *dialog, *scroll;
3078 dialog = gtk_dialog_new_with_buttons (_("mcen_ti_moveto_folders_title"),
3080 GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR | GTK_DIALOG_DESTROY_WITH_PARENT,
3082 GTK_RESPONSE_ACCEPT,
3084 GTK_RESPONSE_REJECT,
3087 /* Create scrolled window */
3088 scroll = gtk_scrolled_window_new (NULL, NULL);
3089 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
3090 GTK_POLICY_AUTOMATIC,
3091 GTK_POLICY_AUTOMATIC);
3093 /* Create folder view */
3094 *tree_view = modest_platform_create_folder_view (NULL);
3096 /* It could happen that we're trying to move a message from a
3097 window (msg window for example) after the main window was
3098 closed, so we can not just get the model of the folder
3100 if (MODEST_IS_FOLDER_VIEW (folder_view))
3101 gtk_tree_view_set_model (GTK_TREE_VIEW (*tree_view),
3102 gtk_tree_view_get_model (GTK_TREE_VIEW (folder_view)));
3104 modest_folder_view_update_model (MODEST_FOLDER_VIEW (*tree_view),
3105 TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()));
3107 gtk_container_add (GTK_CONTAINER (scroll), *tree_view);
3109 /* Add scroll to dialog */
3110 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
3111 scroll, FALSE, FALSE, 0);
3113 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
3115 /* Select INBOX or local account */
3116 modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (*tree_view));
3122 * Returns TRUE if at least one of the headers of the list belongs to
3123 * a message that has been fully retrieved.
3126 has_retrieved_msgs (TnyList *list)
3129 gboolean found = FALSE;
3131 iter = tny_list_create_iterator (list);
3132 while (tny_iterator_is_done (iter) && !found) {
3134 TnyHeaderFlags flags;
3136 header = TNY_HEADER (tny_iterator_get_current (iter));
3137 flags = tny_header_get_flags (header);
3138 if (!(flags & TNY_HEADER_FLAG_PARTIAL))
3142 tny_iterator_next (iter);
3144 g_object_unref (iter);
3150 * Shows a confirmation dialog to the user when we're moving messages
3151 * from a remote server to the local storage. Returns the dialog
3152 * response. If it's other kind of movement the it always returns
3156 msgs_move_to_confirmation (GtkWindow *win,
3157 TnyFolder *dest_folder,
3160 gint response = GTK_RESPONSE_OK;
3162 /* If the destination is a local folder */
3163 if (modest_tny_folder_is_local_folder (dest_folder)) {
3164 TnyFolder *src_folder;
3168 /* Get source folder */
3169 iter = tny_list_create_iterator (headers);
3170 header = TNY_HEADER (tny_iterator_get_current (iter));
3171 src_folder = tny_header_get_folder (header);
3172 g_object_unref (header);
3173 g_object_unref (iter);
3175 /* if no src_folder, message may be an attahcment */
3176 if (src_folder == NULL)
3177 return GTK_RESPONSE_CANCEL;
3179 /* If the source is a remote folder */
3180 if (!modest_tny_folder_is_local_folder (src_folder)) {
3181 const gchar *message;
3183 if (has_retrieved_msgs (headers))
3184 message = ngettext ("mcen_nc_move_retrieve", "mcen_nc_move_retrieves",
3185 tny_list_get_length (headers));
3187 message = ngettext ("mcen_nc_move_header", "mcen_nc_move_headers",
3188 tny_list_get_length (headers));
3190 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
3191 (const gchar *) message);
3193 g_object_unref (src_folder);
3201 transfer_msgs_from_viewer_cb (const GObject *object, gpointer user_data)
3203 ModestMsgViewWindow *self = NULL;
3204 gboolean last, first;
3206 g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (object));
3207 self = MODEST_MSG_VIEW_WINDOW (object);
3209 last = modest_msg_view_window_last_message_selected (self);
3210 first = modest_msg_view_window_first_message_selected (self);
3212 /* No more messages to view, so close this window */
3213 /* gboolean ret_value; */
3214 /* g_signal_emit_by_name (G_OBJECT (self), "delete-event", NULL, &ret_value); */
3215 modest_ui_actions_on_close_window (NULL, MODEST_WINDOW(self));
3217 modest_msg_view_window_select_previous_message (self);
3219 modest_msg_view_window_select_next_message (self);
3223 modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op,
3226 GObject *win = modest_mail_operation_get_source (mail_op);
3227 const GError *error = NULL;
3228 const gchar *message = NULL;
3230 /* Get error message */
3231 error = modest_mail_operation_get_error (mail_op);
3232 if (error != NULL && error->message != NULL) {
3233 message = error->message;
3235 message = _("mail_in_ui_folder_move_target_error");
3238 /* Show notification dialog */
3239 modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL, message);
3240 g_object_unref (win);
3244 modest_ui_actions_send_receive_error_handler (ModestMailOperation *mail_op,
3247 GObject *win = modest_mail_operation_get_source (mail_op);
3248 const GError *error = modest_mail_operation_get_error (mail_op);
3250 g_return_if_fail (error != NULL);
3251 if (error->message != NULL)
3252 g_printerr ("modest: %s\n", error->message);
3254 g_printerr ("modest: unkonw error on send&receive operation");
3256 /* Show error message */
3257 /* if (modest_mail_operation_get_id (mail_op) == MODEST_MAIL_OPERATION_TYPE_RECEIVE) */
3258 /* modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL, */
3259 /* _CS("sfil_ib_unable_to_receive")); */
3261 /* modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL, */
3262 /* _CS("sfil_ib_unable_to_send")); */
3263 g_object_unref (win);
3267 open_msg_for_purge_cb (ModestMailOperation *mail_op,
3274 gint pending_purges = 0;
3275 gboolean some_purged = FALSE;
3276 ModestWindow *win = MODEST_WINDOW (user_data);
3278 /* If there was any error */
3279 if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg))
3282 /* Once the message has been retrieved for purging, we check if
3283 * it's all ok for purging */
3285 parts = tny_simple_list_new ();
3286 tny_mime_part_get_parts (TNY_MIME_PART (msg), parts);
3287 iter = tny_list_create_iterator (parts);
3289 while (!tny_iterator_is_done (iter)) {
3291 part = TNY_MIME_PART (tny_iterator_get_current (iter));
3292 if (tny_mime_part_is_attachment (part) || TNY_IS_MSG (part)) {
3293 if (tny_mime_part_is_purged (part))
3298 tny_iterator_next (iter);
3301 if (pending_purges>0) {
3303 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),_("mcen_nc_purge_file_text_inbox"));
3305 if (response == GTK_RESPONSE_OK) {
3306 modest_platform_information_banner (NULL, NULL, _("mcen_ib_removing_attachment"));
3307 tny_iterator_first (iter);
3308 while (!tny_iterator_is_done (iter)) {
3311 part = TNY_MIME_PART (tny_iterator_get_current (iter));
3312 if (tny_mime_part_is_attachment (part) || TNY_IS_MSG (part))
3313 tny_mime_part_set_purged (part);
3314 tny_iterator_next (iter);
3317 tny_msg_rewrite_cache (msg);
3320 modest_platform_information_banner (NULL, NULL, _("mail_ib_attachment_already_purged"));
3323 /* remove attachments */
3324 tny_iterator_first (iter);
3325 while (!tny_iterator_is_done (iter)) {
3328 part = TNY_MIME_PART (tny_iterator_get_current (iter));
3329 g_object_unref (part);
3330 tny_iterator_next (iter);
3333 g_object_unref (iter);
3334 g_object_unref (parts);
3338 modest_ui_actions_on_main_window_remove_attachments (GtkAction *action,
3339 ModestMainWindow *win)
3341 GtkWidget *header_view;
3342 TnyList *header_list;
3345 TnyHeaderFlags flags;
3346 ModestWindow *msg_view_window = NULL;
3349 g_return_if_fail (MODEST_IS_MAIN_WINDOW (win));
3351 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
3352 MODEST_WIDGET_TYPE_HEADER_VIEW);
3354 header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (header_view));
3356 if (tny_list_get_length (header_list) == 1) {
3357 iter = tny_list_create_iterator (header_list);
3358 header = TNY_HEADER (tny_iterator_get_current (iter));
3359 g_object_unref (iter);
3364 found = modest_window_mgr_find_registered_header (modest_runtime_get_window_mgr (),
3365 header, &msg_view_window);
3366 flags = tny_header_get_flags (header);
3367 if (!(flags & TNY_HEADER_FLAG_CACHED))
3370 if (msg_view_window != NULL)
3371 modest_msg_view_window_remove_attachments (MODEST_MSG_VIEW_WINDOW (msg_view_window), TRUE);
3373 /* do nothing; uid was registered before, so window is probably on it's way */
3374 g_warning ("debug: header %p has already been registered", header);
3377 ModestMailOperation *mail_op = NULL;
3378 modest_window_mgr_register_header (modest_runtime_get_window_mgr (), header);
3379 mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
3381 modest_ui_actions_get_msgs_full_error_handler,
3383 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
3384 modest_mail_operation_get_msg (mail_op, header, open_msg_for_purge_cb, win);
3386 g_object_unref (mail_op);
3389 g_object_unref (header);
3391 g_object_unref (header_list);
3395 * UI handler for the "Move to" action when invoked from the
3399 modest_ui_actions_on_main_window_move_to (GtkAction *action,
3400 ModestMainWindow *win)
3402 GtkWidget *dialog = NULL, *folder_view = NULL, *tree_view = NULL;
3403 GtkWidget *header_view = NULL;
3405 TnyFolderStore *folder_store = NULL;
3406 ModestMailOperation *mail_op = NULL;
3408 g_return_if_fail (MODEST_IS_MAIN_WINDOW (win));
3410 /* Get the folder view */
3411 folder_view = modest_main_window_get_child_widget (win,
3412 MODEST_WIDGET_TYPE_FOLDER_VIEW);
3414 TnyFolderStore *src_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
3416 /* Offer the connection dialog if necessary, if the source folder is in a networked account: */
3417 if (!modest_platform_connect_and_wait_if_network_folderstore (GTK_WINDOW (win), src_folder)) {
3419 g_object_unref (src_folder);
3425 /* Get header view */
3426 header_view = modest_main_window_get_child_widget (win,
3427 MODEST_WIDGET_TYPE_HEADER_VIEW);
3429 /* Create and run the dialog */
3430 dialog = create_move_to_dialog (MODEST_WINDOW (win), folder_view, &tree_view);
3431 modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (tree_view));
3432 result = gtk_dialog_run (GTK_DIALOG(dialog));
3433 g_object_ref (tree_view);
3435 /* We do this to save an indentation level ;-) */
3436 if (result != GTK_RESPONSE_ACCEPT)
3439 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (tree_view));
3441 if (TNY_IS_ACCOUNT (folder_store) &&
3442 !MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (folder_store))
3445 /* Offer the connection dialog if necessary: */
3446 if (!modest_platform_connect_and_wait_if_network_folderstore (GTK_WINDOW (win), folder_store)) {
3450 /* Get folder or messages to transfer */
3451 if (gtk_widget_is_focus (folder_view)) {
3453 /* Clean folder on header view before moving it */
3454 modest_header_view_clear (MODEST_HEADER_VIEW (header_view));
3456 if (TNY_IS_FOLDER (src_folder)) {
3458 modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
3460 modest_ui_actions_move_folder_error_handler,
3462 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
3464 modest_mail_operation_xfer_folder (mail_op,
3465 TNY_FOLDER (src_folder),
3468 /* Unref mail operation */
3469 g_object_unref (G_OBJECT (mail_op));
3471 g_warning ("%s: src_folder is not a TnyFolder.\n", __FUNCTION__);
3474 if (gtk_widget_is_focus (header_view)) {
3475 TnyList *headers = NULL;
3478 /* TODO: Check for connection if the headers are on a network account. */
3479 headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (header_view));
3481 /* Ask for user confirmation */
3482 response = msgs_move_to_confirmation (GTK_WINDOW (win),
3483 TNY_FOLDER (folder_store),
3486 /* Transfer messages */
3487 if (response == GTK_RESPONSE_OK) {
3489 modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
3491 modest_ui_actions_move_folder_error_handler,
3493 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
3496 modest_mail_operation_xfer_msgs (mail_op,
3498 TNY_FOLDER (folder_store),
3503 g_object_unref (G_OBJECT (mail_op));
3505 g_object_unref (headers);
3511 g_object_unref (src_folder);
3514 g_object_unref (folder_store);
3516 gtk_widget_destroy (dialog);
3521 * UI handler for the "Move to" action when invoked from the
3522 * ModestMsgViewWindow
3525 modest_ui_actions_on_msg_view_window_move_to (GtkAction *action,
3526 ModestMsgViewWindow *win)
3528 GtkWidget *dialog, *folder_view, *tree_view = NULL;
3530 ModestMainWindow *main_window = NULL;
3531 TnyHeader *header = NULL;
3532 TnyList *headers = NULL;
3534 /* Get the folder view */
3535 main_window = MODEST_MAIN_WINDOW (modest_window_mgr_get_main_window (modest_runtime_get_window_mgr ()));
3537 folder_view = modest_main_window_get_child_widget (main_window,
3538 MODEST_WIDGET_TYPE_FOLDER_VIEW);
3542 /* Create and run the dialog */
3543 dialog = create_move_to_dialog (MODEST_WINDOW (win), folder_view, &tree_view);
3544 result = gtk_dialog_run (GTK_DIALOG(dialog));
3546 if (result == GTK_RESPONSE_ACCEPT) {
3547 TnyFolderStore *folder_store;
3550 /* Create header list */
3551 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
3552 g_return_if_fail (header != NULL);
3554 /* Offer the connection dialog if necessary: */
3555 /* TODO: What's the extra g_object_ref() for? Isn't this leaking a ref? */
3556 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (g_object_ref (tree_view)));
3557 TnyFolder *header_folder = tny_header_get_folder(header);
3558 if (modest_platform_connect_and_wait_if_network_folderstore (NULL, folder_store) &&
3559 modest_platform_connect_and_wait_if_network_folderstore (NULL, TNY_FOLDER_STORE (header_folder))) {
3561 headers = tny_simple_list_new ();
3562 tny_list_prepend (headers, G_OBJECT (header));
3563 g_object_unref (header);
3565 /* Ask user for confirmation. MSG-NOT404 */
3566 response = msgs_move_to_confirmation (GTK_WINDOW (win),
3567 TNY_FOLDER (folder_store),
3570 /* Transfer current msg */
3571 if (response == GTK_RESPONSE_OK) {
3572 ModestMailOperation *mail_op;
3574 /* Create mail op */
3575 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(win));
3576 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
3579 /* Transfer messages */
3580 modest_mail_operation_xfer_msgs (mail_op,
3582 TNY_FOLDER (folder_store),
3584 transfer_msgs_from_viewer_cb,
3586 g_object_unref (G_OBJECT (mail_op));
3591 g_object_unref (header_folder);
3594 g_object_unref (headers);
3597 g_object_unref (folder_store);
3600 gtk_widget_destroy (dialog);
3604 modest_ui_actions_on_move_to (GtkAction *action,
3607 g_return_if_fail (MODEST_IS_MAIN_WINDOW (win) ||
3608 MODEST_IS_MSG_VIEW_WINDOW (win));
3610 if (MODEST_IS_MAIN_WINDOW (win))
3611 modest_ui_actions_on_main_window_move_to (action,
3612 MODEST_MAIN_WINDOW (win));
3614 modest_ui_actions_on_msg_view_window_move_to (action,
3615 MODEST_MSG_VIEW_WINDOW (win));
3619 * Calls #HeadersFunc for each header already selected in the main
3620 * window or the message currently being shown in the msg view window
3623 do_headers_action (ModestWindow *win,
3627 TnyList *headers_list;
3633 headers_list = get_selected_headers (win);
3637 /* Get the folder */
3638 iter = tny_list_create_iterator (headers_list);
3639 header = TNY_HEADER (tny_iterator_get_current (iter));
3640 folder = tny_header_get_folder (header);
3641 g_object_unref (header);
3643 /* Call the function for each header */
3644 while (!tny_iterator_is_done (iter)) {
3645 header = TNY_HEADER (tny_iterator_get_current (iter));
3646 func (header, win, user_data);
3647 g_object_unref (header);
3648 tny_iterator_next (iter);
3651 /* Trick: do a poke status in order to speed up the signaling
3653 tny_folder_poke_status (folder);
3656 g_object_unref (folder);
3657 g_object_unref (iter);
3658 g_object_unref (headers_list);
3662 modest_ui_actions_view_attachment (GtkAction *action,
3663 ModestWindow *window)
3665 if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
3666 modest_msg_view_window_view_attachment (MODEST_MSG_VIEW_WINDOW (window), NULL);
3668 /* not supported window for this action */
3669 g_return_if_reached ();
3674 modest_ui_actions_save_attachments (GtkAction *action,
3675 ModestWindow *window)
3677 if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
3678 modest_msg_view_window_save_attachments (MODEST_MSG_VIEW_WINDOW (window), NULL);
3680 /* not supported window for this action */
3681 g_return_if_reached ();
3686 modest_ui_actions_remove_attachments (GtkAction *action,
3687 ModestWindow *window)
3689 if (MODEST_IS_MAIN_WINDOW (window)) {
3690 modest_ui_actions_on_main_window_remove_attachments (action, MODEST_MAIN_WINDOW (window));
3691 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
3692 modest_msg_view_window_remove_attachments (MODEST_MSG_VIEW_WINDOW (window), FALSE);
3694 /* not supported window for this action */
3695 g_return_if_reached ();
3700 modest_ui_actions_on_settings (GtkAction *action,
3705 dialog = modest_platform_get_global_settings_dialog ();
3706 gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (win));
3707 gtk_widget_show_all (dialog);
3709 gtk_dialog_run (GTK_DIALOG (dialog));
3711 gtk_widget_destroy (dialog);
3715 modest_ui_actions_on_help (GtkAction *action,
3718 const gchar *help_id = NULL;
3720 if (MODEST_IS_MAIN_WINDOW (win)) {
3721 const gchar *action_name;
3722 action_name = gtk_action_get_name (action);
3724 if (!strcmp (action_name, "FolderViewCSMHelp") ||
3725 !strcmp (action_name, "HeaderViewCSMHelp")) {
3726 GtkWidget *folder_view;
3727 TnyFolderStore *folder_store;
3728 /* Get selected folder */
3729 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
3730 MODEST_WIDGET_TYPE_FOLDER_VIEW);
3731 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
3733 /* Switch help_id */
3734 if (TNY_IS_FOLDER (folder_store)) {
3735 switch (tny_folder_get_folder_type (TNY_FOLDER (folder_store))) {
3736 case TNY_FOLDER_TYPE_NORMAL:
3737 help_id = "applications_email_userfolder";
3739 case TNY_FOLDER_TYPE_INBOX:
3740 help_id = "applications_email_inbox";
3742 case TNY_FOLDER_TYPE_OUTBOX:
3743 help_id = "applications_email_outbox";
3745 case TNY_FOLDER_TYPE_SENT:
3746 help_id = "applications_email_sent";
3748 case TNY_FOLDER_TYPE_DRAFTS:
3749 help_id = "applications_email_drafts";
3751 case TNY_FOLDER_TYPE_ARCHIVE:
3752 help_id = "applications_email_archive";
3758 g_object_unref (folder_store);
3760 help_id = "applications_email_mainview";
3762 } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
3763 help_id = "applications_email_viewer";
3764 } else if (MODEST_IS_MSG_EDIT_WINDOW (win))
3765 help_id = "applications_email_editor";
3767 modest_platform_show_help (GTK_WINDOW (win), help_id);
3771 modest_ui_actions_on_retrieve_msg_contents (GtkAction *action,
3772 ModestWindow *window)
3774 ModestMailOperation *mail_op;
3778 headers = get_selected_headers (window);
3782 /* Create mail operation */
3783 mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
3785 modest_ui_actions_get_msgs_full_error_handler,
3787 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
3788 modest_mail_operation_get_msgs_full (mail_op, headers, NULL, NULL, NULL);
3791 g_object_unref (headers);
3792 g_object_unref (mail_op);
3796 modest_ui_actions_on_email_menu_activated (GtkAction *action,
3797 ModestWindow *window)
3799 g_return_if_fail (MODEST_IS_WINDOW (window));
3802 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3806 modest_ui_actions_on_edit_menu_activated (GtkAction *action,
3807 ModestWindow *window)
3809 g_return_if_fail (MODEST_IS_WINDOW (window));
3812 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3816 modest_ui_actions_on_view_menu_activated (GtkAction *action,
3817 ModestWindow *window)
3819 g_return_if_fail (MODEST_IS_WINDOW (window));
3822 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3826 modest_ui_actions_on_tools_menu_activated (GtkAction *action,
3827 ModestWindow *window)
3829 g_return_if_fail (MODEST_IS_WINDOW (window));
3832 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3836 modest_ui_actions_on_attachment_menu_activated (GtkAction *action,
3837 ModestWindow *window)
3839 g_return_if_fail (MODEST_IS_WINDOW (window));
3842 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3846 modest_ui_actions_on_toolbar_csm_menu_activated (GtkAction *action,
3847 ModestWindow *window)
3849 g_return_if_fail (MODEST_IS_WINDOW (window));
3852 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3856 modest_ui_actions_on_folder_view_csm_menu_activated (GtkAction *action,
3857 ModestWindow *window)
3859 g_return_if_fail (MODEST_IS_WINDOW (window));
3862 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3866 modest_ui_actions_on_header_view_csm_menu_activated (GtkAction *action,
3867 ModestWindow *window)
3869 g_return_if_fail (MODEST_IS_WINDOW (window));
3872 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3876 modest_ui_actions_check_toolbar_dimming_rules (ModestWindow *window)
3878 g_return_if_fail (MODEST_IS_WINDOW (window));
3881 modest_window_check_dimming_rules_group (window, "ModestToolbarDimmingRules");
3885 modest_ui_actions_on_search_messages (GtkAction *action, ModestWindow *window)
3887 g_return_if_fail (MODEST_IS_WINDOW (window));
3889 modest_platform_show_search_messages (GTK_WINDOW (window));
3893 modest_ui_actions_on_open_addressbook (GtkAction *action, ModestWindow *win)
3895 g_return_if_fail (MODEST_IS_WINDOW (win));
3896 modest_platform_show_addressbook (GTK_WINDOW (win));
3901 modest_ui_actions_on_toggle_find_in_page (GtkToggleAction *action,
3902 ModestWindow *window)
3904 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
3906 modest_msg_edit_window_toggle_find_toolbar (MODEST_MSG_EDIT_WINDOW (window), gtk_toggle_action_get_active (action));
3910 _on_send_receive_progress_changed (ModestMailOperation *mail_op,
3911 ModestMailOperationState *state,
3914 g_return_if_fail (MODEST_IS_MAIN_WINDOW(user_data));
3916 /* Set send/receive operation finished */
3917 if (state->status != MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS)
3918 modest_main_window_notify_send_receive_completed (MODEST_MAIN_WINDOW(user_data));