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_new_folder_error_handler (ModestMailOperation *mail_op,
2133 ModestMainWindow *window = MODEST_MAIN_WINDOW (user_data);
2135 /* TODO: Note that folder creation might go wrong due to other
2136 * failures such as when the parent folder is non-writable. We can
2137 * query a GError* with modest_mail_operation_get_error(), but the
2138 * the error code (from tinymail) does not give us a clue about what
2139 * has gone wrong. We might use the error->message but it might come
2140 * from camel and not be suitable to show to the user directly. */
2141 modest_platform_information_banner (GTK_WIDGET (window), NULL,
2142 _CS("ckdg_ib_folder_already_exists"));
2144 /* modest_platform_information_banner (GTK_WIDGET (window), NULL,
2145 modest_mail_operation_get_error (mail_op)->message);*/
2149 modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_window)
2151 TnyFolderStore *parent_folder;
2152 GtkWidget *folder_view;
2154 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
2156 folder_view = modest_main_window_get_child_widget (main_window,
2157 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2161 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2163 if (parent_folder) {
2164 gboolean finished = FALSE;
2166 gchar *folder_name = NULL, *suggested_name = NULL;
2168 /* Run the new folder dialog */
2170 result = modest_platform_run_new_folder_dialog (GTK_WINDOW (main_window),
2175 g_free (suggested_name);
2176 suggested_name = NULL;
2178 if (result == GTK_RESPONSE_REJECT) {
2181 ModestMailOperation *mail_op;
2182 TnyFolder *new_folder = NULL;
2184 mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_INFO,
2185 G_OBJECT(main_window),
2186 modest_ui_actions_new_folder_error_handler,
2189 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
2191 new_folder = modest_mail_operation_create_folder (mail_op,
2193 (const gchar *) folder_name);
2195 g_object_unref (new_folder);
2198 g_object_unref (mail_op);
2201 suggested_name = folder_name;
2205 g_object_unref (parent_folder);
2210 modest_ui_actions_rename_folder_error_handler (ModestMailOperation *mail_op,
2213 GObject *win = modest_mail_operation_get_source (mail_op);
2214 const GError *error = NULL;
2215 const gchar *message = NULL;
2217 /* Get error message */
2218 error = modest_mail_operation_get_error (mail_op);
2219 if (error != NULL && error->message != NULL) {
2220 message = error->message;
2222 message = _("!!! FIXME: Unable to rename");
2225 /* Show notification dialog */
2226 modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL, message);
2227 g_object_unref (win);
2231 modest_ui_actions_on_rename_folder (GtkAction *action,
2232 ModestMainWindow *main_window)
2234 TnyFolderStore *folder;
2235 GtkWidget *folder_view;
2236 GtkWidget *header_view;
2238 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
2240 folder_view = modest_main_window_get_child_widget (main_window,
2241 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2245 header_view = modest_main_window_get_child_widget (main_window,
2246 MODEST_WIDGET_TYPE_HEADER_VIEW);
2251 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
2253 /* Offer the connection dialog if necessary: */
2254 if (!modest_platform_connect_and_wait_if_network_folderstore (NULL, folder)) {
2255 g_object_unref (G_OBJECT (folder));
2260 if (folder && TNY_IS_FOLDER (folder)) {
2263 const gchar *current_name;
2265 current_name = tny_folder_get_name (TNY_FOLDER (folder));
2266 response = modest_platform_run_rename_folder_dialog (GTK_WINDOW (main_window), NULL,
2267 current_name, &folder_name);
2269 if (response == GTK_RESPONSE_ACCEPT && strlen (folder_name) > 0) {
2270 ModestMailOperation *mail_op;
2273 modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_INFO,
2274 G_OBJECT(main_window),
2275 modest_ui_actions_rename_folder_error_handler,
2279 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
2282 modest_header_view_clear (MODEST_HEADER_VIEW (header_view));
2284 modest_mail_operation_rename_folder (mail_op,
2285 TNY_FOLDER (folder),
2286 (const gchar *) folder_name);
2288 g_object_unref (mail_op);
2289 g_free (folder_name);
2291 g_object_unref (folder);
2296 modest_ui_actions_delete_folder_error_handler (ModestMailOperation *mail_op,
2299 GObject *win = modest_mail_operation_get_source (mail_op);
2301 modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL,
2302 _("mail_in_ui_folder_delete_error"));
2303 g_object_unref (win);
2307 delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
2309 TnyFolderStore *folder;
2310 GtkWidget *folder_view;
2314 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
2316 folder_view = modest_main_window_get_child_widget (main_window,
2317 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2321 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
2323 /* Show an error if it's an account */
2324 if (!TNY_IS_FOLDER (folder)) {
2325 modest_platform_run_information_dialog (GTK_WINDOW (main_window),
2326 _("mail_in_ui_folder_delete_error"));
2327 g_object_unref (G_OBJECT (folder));
2331 /* Offer the connection dialog if necessary: */
2332 if (!modest_platform_connect_and_wait_if_network_folderstore (NULL, folder)) {
2333 g_object_unref (G_OBJECT (folder));
2338 message = g_strdup_printf (_("mcen_nc_delete_folder_text"),
2339 tny_folder_get_name (TNY_FOLDER (folder)));
2340 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (main_window),
2341 (const gchar *) message);
2344 if (response == GTK_RESPONSE_OK) {
2345 ModestMailOperation *mail_op =
2346 modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_DELETE,
2347 G_OBJECT(main_window),
2348 modest_ui_actions_delete_folder_error_handler,
2351 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
2353 modest_mail_operation_remove_folder (mail_op, TNY_FOLDER (folder), move_to_trash);
2354 g_object_unref (G_OBJECT (mail_op));
2357 g_object_unref (G_OBJECT (folder));
2361 modest_ui_actions_on_delete_folder (GtkAction *action,
2362 ModestMainWindow *main_window)
2364 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
2366 delete_folder (main_window, FALSE);
2370 modest_ui_actions_on_move_folder_to_trash_folder (GtkAction *action, ModestMainWindow *main_window)
2372 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
2374 delete_folder (main_window, TRUE);
2378 modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
2379 const gchar* server_account_name,
2384 ModestMainWindow *main_window)
2386 g_return_if_fail(server_account_name);
2387 /* printf("DEBUG: %s: server_account_name=%s\n", __FUNCTION__, server_account_name); */
2389 /* Initalize output parameters: */
2396 #ifdef MODEST_PLATFORM_MAEMO
2397 /* Maemo uses a different (awkward) button order,
2398 * It should probably just use gtk_alternative_dialog_button_order ().
2400 GtkWidget *dialog = gtk_dialog_new_with_buttons (_("mail_ti_password_protected"),
2404 GTK_RESPONSE_ACCEPT,
2406 GTK_RESPONSE_REJECT,
2409 GtkWidget *dialog = gtk_dialog_new_with_buttons (_("mail_ti_password_protected"),
2413 GTK_RESPONSE_REJECT,
2415 GTK_RESPONSE_ACCEPT,
2417 #endif /* MODEST_PLATFORM_MAEMO */
2419 gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(main_window));
2421 gchar *server_name = modest_server_account_get_hostname (
2422 modest_runtime_get_account_mgr(), server_account_name);
2423 if (!server_name) {/* This happened once, though I don't know why. murrayc. */
2424 g_warning("%s: Could not get server name for server account '%s'", __FUNCTION__, server_account_name);
2429 /* This causes a warning because the logical ID has no %s in it,
2430 * though the translation does, but there is not much we can do about that: */
2431 gchar *txt = g_strdup_printf (_("mail_ia_password_info"), server_name);
2432 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt),
2435 g_free (server_name);
2439 gchar *initial_username = modest_server_account_get_username (
2440 modest_runtime_get_account_mgr(), server_account_name);
2442 GtkWidget *entry_username = gtk_entry_new ();
2443 if (initial_username)
2444 gtk_entry_set_text (GTK_ENTRY (entry_username), initial_username);
2445 /* Dim this if a connection has ever succeeded with this username,
2446 * as per the UI spec: */
2447 const gboolean username_known =
2448 modest_server_account_get_username_has_succeeded(
2449 modest_runtime_get_account_mgr(), server_account_name);
2450 gtk_widget_set_sensitive (entry_username, !username_known);
2452 #ifdef MODEST_PLATFORM_MAEMO
2453 /* Auto-capitalization is the default, so let's turn it off: */
2454 hildon_gtk_entry_set_input_mode (GTK_ENTRY (entry_username), HILDON_GTK_INPUT_MODE_FULL);
2456 /* Create a size group to be used by all captions.
2457 * Note that HildonCaption does not create a default size group if we do not specify one.
2458 * We use GTK_SIZE_GROUP_HORIZONTAL, so that the widths are the same. */
2459 GtkSizeGroup *sizegroup = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
2461 GtkWidget *caption = hildon_caption_new (sizegroup,
2462 _("mail_fi_username"), entry_username, NULL, HILDON_CAPTION_MANDATORY);
2463 gtk_widget_show (entry_username);
2464 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), caption,
2465 FALSE, FALSE, MODEST_MARGIN_HALF);
2466 gtk_widget_show (caption);
2468 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry_username,
2470 #endif /* MODEST_PLATFORM_MAEMO */
2473 GtkWidget *entry_password = gtk_entry_new ();
2474 gtk_entry_set_visibility (GTK_ENTRY(entry_password), FALSE);
2475 /* gtk_entry_set_invisible_char (GTK_ENTRY(entry_password), "*"); */
2477 #ifdef MODEST_PLATFORM_MAEMO
2478 /* Auto-capitalization is the default, so let's turn it off: */
2479 hildon_gtk_entry_set_input_mode (GTK_ENTRY (entry_password),
2480 HILDON_GTK_INPUT_MODE_FULL | HILDON_GTK_INPUT_MODE_INVISIBLE);
2482 caption = hildon_caption_new (sizegroup,
2483 _("mail_fi_password"), entry_password, NULL, HILDON_CAPTION_MANDATORY);
2484 gtk_widget_show (entry_password);
2485 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), caption,
2486 FALSE, FALSE, MODEST_MARGIN_HALF);
2487 gtk_widget_show (caption);
2488 g_object_unref (sizegroup);
2490 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry_password,
2492 #endif /* MODEST_PLATFORM_MAEMO */
2494 /* This is not in the Maemo UI spec:
2495 remember_pass_check = gtk_check_button_new_with_label (_("Remember password"));
2496 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check,
2500 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
2502 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
2504 *username = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry_username)));
2506 modest_server_account_set_username (
2507 modest_runtime_get_account_mgr(), server_account_name,
2510 const gboolean username_was_changed =
2511 (strcmp (*username, initial_username) != 0);
2512 if (username_was_changed) {
2513 g_warning ("%s: tinymail does not yet support changing the "
2514 "username in the get_password() callback.\n", __FUNCTION__);
2519 *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry_password)));
2521 /* We do not save the password in the configuration,
2522 * because this function is only called for passwords that should
2523 * not be remembered:
2524 modest_server_account_set_password (
2525 modest_runtime_get_account_mgr(), server_account_name,
2544 /* This is not in the Maemo UI spec:
2545 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check)))
2551 gtk_widget_destroy (dialog);
2553 /* printf ("DEBUG: %s: cancel=%d\n", __FUNCTION__, *cancel); */
2557 modest_ui_actions_on_cut (GtkAction *action,
2558 ModestWindow *window)
2560 GtkWidget *focused_widget;
2562 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
2563 if (GTK_IS_EDITABLE (focused_widget)) {
2564 gtk_editable_cut_clipboard (GTK_EDITABLE(focused_widget));
2565 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
2566 GtkTextBuffer *buffer;
2567 GtkClipboard *clipboard;
2569 clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
2570 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
2571 gtk_text_buffer_cut_clipboard (buffer, clipboard, TRUE);
2572 gtk_clipboard_set_can_store (clipboard, NULL, 0);
2573 } else if (MODEST_IS_HEADER_VIEW (focused_widget)) {
2574 modest_header_view_cut_selection (MODEST_HEADER_VIEW (focused_widget));
2575 } else if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
2576 modest_folder_view_cut_selection (MODEST_FOLDER_VIEW (focused_widget));
2581 modest_ui_actions_on_copy (GtkAction *action,
2582 ModestWindow *window)
2584 GtkClipboard *clipboard;
2585 GtkWidget *focused_widget;
2587 clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
2588 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
2590 if (GTK_IS_LABEL (focused_widget)) {
2591 gtk_clipboard_set_text (clipboard, gtk_label_get_text (GTK_LABEL (focused_widget)), -1);
2592 } else if (GTK_IS_EDITABLE (focused_widget)) {
2593 gtk_editable_copy_clipboard (GTK_EDITABLE(focused_widget));
2594 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
2595 GtkTextBuffer *buffer;
2596 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
2597 gtk_text_buffer_copy_clipboard (buffer, clipboard);
2598 gtk_clipboard_set_can_store (clipboard, NULL, 0);
2599 } else if (MODEST_IS_HEADER_VIEW (focused_widget)) {
2600 TnyList *header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (focused_widget));
2601 TnyIterator *iter = tny_list_create_iterator (header_list);
2602 TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter));
2603 TnyFolder *folder = tny_header_get_folder (header);
2604 TnyAccount *account = tny_folder_get_account (folder);
2605 const gchar *proto_str = tny_account_get_proto (TNY_ACCOUNT (account));
2606 /* If it's POP then ask */
2607 gboolean ask = (modest_protocol_info_get_transport_store_protocol (proto_str) ==
2608 MODEST_PROTOCOL_STORE_POP) ? TRUE : FALSE;
2609 g_object_unref (account);
2610 g_object_unref (folder);
2611 g_object_unref (header);
2612 g_object_unref (iter);
2614 /* Check that the messages have been previously downloaded */
2615 gboolean continue_download = TRUE;
2617 continue_download = download_uncached_messages (header_list, GTK_WINDOW (window));
2618 if (continue_download)
2619 modest_header_view_copy_selection (MODEST_HEADER_VIEW (focused_widget));
2620 g_object_unref (header_list);
2621 } else if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
2622 modest_folder_view_copy_selection (MODEST_FOLDER_VIEW (focused_widget));
2625 /* Show information banner */
2626 modest_platform_information_banner (NULL, NULL, _CS("ecoc_ib_edwin_copied"));
2631 modest_ui_actions_on_undo (GtkAction *action,
2632 ModestWindow *window)
2634 ModestEmailClipboard *clipboard = NULL;
2636 if (MODEST_IS_MSG_EDIT_WINDOW (window)) {
2637 modest_msg_edit_window_undo (MODEST_MSG_EDIT_WINDOW (window));
2638 } else if (MODEST_IS_MAIN_WINDOW (window)) {
2639 /* Clear clipboard source */
2640 clipboard = modest_runtime_get_email_clipboard ();
2641 modest_email_clipboard_clear (clipboard);
2644 g_return_if_reached ();
2649 modest_ui_actions_on_redo (GtkAction *action,
2650 ModestWindow *window)
2652 if (MODEST_IS_MSG_EDIT_WINDOW (window)) {
2653 modest_msg_edit_window_redo (MODEST_MSG_EDIT_WINDOW (window));
2656 g_return_if_reached ();
2662 paste_msgs_cb (const GObject *object, gpointer user_data)
2664 g_return_if_fail (MODEST_IS_MAIN_WINDOW (object));
2665 g_return_if_fail (GTK_IS_WIDGET (user_data));
2667 /* destroy information note */
2668 gtk_widget_destroy (GTK_WIDGET(user_data));
2672 modest_ui_actions_on_paste (GtkAction *action,
2673 ModestWindow *window)
2675 GtkWidget *focused_widget = NULL;
2676 GtkWidget *inf_note = NULL;
2677 ModestMailOperation *mail_op = NULL;
2679 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
2680 if (GTK_IS_EDITABLE (focused_widget)) {
2681 gtk_editable_paste_clipboard (GTK_EDITABLE(focused_widget));
2682 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
2683 GtkTextBuffer *buffer;
2684 GtkClipboard *clipboard;
2686 clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
2687 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
2688 gtk_text_buffer_paste_clipboard (buffer, clipboard, NULL, TRUE);
2689 } else if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
2690 ModestEmailClipboard *clipboard = NULL;
2691 TnyFolder *src_folder = NULL;
2692 TnyFolderStore *folder_store = NULL;
2693 TnyList *data = NULL;
2694 gboolean delete = FALSE;
2696 /* Check clipboard source */
2697 clipboard = modest_runtime_get_email_clipboard ();
2698 if (modest_email_clipboard_cleared (clipboard))
2701 /* Get elements to paste */
2702 modest_email_clipboard_get_data (clipboard, &src_folder, &data, &delete);
2704 /* Create a new mail operation */
2705 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(window));
2706 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
2709 /* Get destination folder */
2710 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (focused_widget));
2712 /* Launch notification */
2713 inf_note = modest_platform_animation_banner (GTK_WIDGET (window), NULL,
2714 _CS("ckct_nw_pasting"));
2715 if (inf_note != NULL) {
2716 gtk_window_set_modal (GTK_WINDOW(inf_note), FALSE);
2717 gtk_widget_show (GTK_WIDGET(inf_note));
2720 /* transfer messages */
2722 modest_mail_operation_xfer_msgs (mail_op,
2724 TNY_FOLDER (folder_store),
2729 } else if (src_folder != NULL) {
2730 modest_mail_operation_xfer_folder (mail_op,
2740 g_object_unref (data);
2741 if (src_folder != NULL)
2742 g_object_unref (src_folder);
2743 if (folder_store != NULL)
2744 g_object_unref (folder_store);
2750 modest_ui_actions_on_select_all (GtkAction *action,
2751 ModestWindow *window)
2753 GtkWidget *focused_widget;
2755 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
2756 if (MODEST_IS_ATTACHMENTS_VIEW (focused_widget)) {
2757 modest_attachments_view_select_all (MODEST_ATTACHMENTS_VIEW (focused_widget));
2758 } else if (GTK_IS_LABEL (focused_widget)) {
2759 gtk_label_select_region (GTK_LABEL (focused_widget), 0, -1);
2760 } else if (GTK_IS_EDITABLE (focused_widget)) {
2761 gtk_editable_select_region (GTK_EDITABLE(focused_widget), 0, -1);
2762 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
2763 GtkTextBuffer *buffer;
2764 GtkTextIter start, end;
2766 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
2767 gtk_text_buffer_get_start_iter (buffer, &start);
2768 gtk_text_buffer_get_end_iter (buffer, &end);
2769 gtk_text_buffer_select_range (buffer, &start, &end);
2770 } else if (GTK_IS_HTML (focused_widget)) {
2771 gtk_html_select_all (GTK_HTML (focused_widget));
2772 } else if (MODEST_IS_MAIN_WINDOW (window)) {
2773 GtkWidget *header_view = focused_widget;
2774 GtkTreeSelection *selection = NULL;
2776 if (!(MODEST_IS_HEADER_VIEW (focused_widget)))
2777 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (window),
2778 MODEST_WIDGET_TYPE_HEADER_VIEW);
2780 /* Select all messages */
2781 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view));
2782 gtk_tree_selection_select_all (selection);
2784 /* Set focuse on header view */
2785 gtk_widget_grab_focus (header_view);
2791 modest_ui_actions_on_mark_as_read (GtkAction *action,
2792 ModestWindow *window)
2794 g_return_if_fail (MODEST_IS_WINDOW(window));
2796 /* Mark each header as read */
2797 do_headers_action (window, headers_action_mark_as_read, NULL);
2801 modest_ui_actions_on_mark_as_unread (GtkAction *action,
2802 ModestWindow *window)
2804 g_return_if_fail (MODEST_IS_WINDOW(window));
2806 /* Mark each header as read */
2807 do_headers_action (window, headers_action_mark_as_unread, NULL);
2811 modest_ui_actions_on_change_zoom (GtkRadioAction *action,
2812 GtkRadioAction *selected,
2813 ModestWindow *window)
2817 value = gtk_radio_action_get_current_value (selected);
2818 if (MODEST_IS_WINDOW (window)) {
2819 modest_window_set_zoom (MODEST_WINDOW (window), ((gdouble)value)/100);
2823 void modest_ui_actions_msg_edit_on_change_priority (GtkRadioAction *action,
2824 GtkRadioAction *selected,
2825 ModestWindow *window)
2827 TnyHeaderFlags flags;
2828 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2830 flags = gtk_radio_action_get_current_value (selected);
2831 modest_msg_edit_window_set_priority_flags (MODEST_MSG_EDIT_WINDOW (window), flags);
2834 void modest_ui_actions_msg_edit_on_change_file_format (GtkRadioAction *action,
2835 GtkRadioAction *selected,
2836 ModestWindow *window)
2840 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2842 file_format = gtk_radio_action_get_current_value (selected);
2843 modest_msg_edit_window_set_file_format (MODEST_MSG_EDIT_WINDOW (window), file_format);
2848 modest_ui_actions_on_zoom_plus (GtkAction *action,
2849 ModestWindow *window)
2851 g_return_if_fail (MODEST_IS_WINDOW (window));
2853 modest_window_zoom_plus (MODEST_WINDOW (window));
2857 modest_ui_actions_on_zoom_minus (GtkAction *action,
2858 ModestWindow *window)
2860 g_return_if_fail (MODEST_IS_WINDOW (window));
2862 modest_window_zoom_minus (MODEST_WINDOW (window));
2866 modest_ui_actions_on_toggle_fullscreen (GtkToggleAction *toggle,
2867 ModestWindow *window)
2869 ModestWindowMgr *mgr;
2870 gboolean fullscreen, active;
2871 g_return_if_fail (MODEST_IS_WINDOW (window));
2873 mgr = modest_runtime_get_window_mgr ();
2875 active = (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle)))?1:0;
2876 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
2878 if (active != fullscreen) {
2879 modest_window_mgr_set_fullscreen_mode (mgr, active);
2880 gtk_window_present (GTK_WINDOW (window));
2885 modest_ui_actions_on_change_fullscreen (GtkAction *action,
2886 ModestWindow *window)
2888 ModestWindowMgr *mgr;
2889 gboolean fullscreen;
2891 g_return_if_fail (MODEST_IS_WINDOW (window));
2893 mgr = modest_runtime_get_window_mgr ();
2894 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
2895 modest_window_mgr_set_fullscreen_mode (mgr, !fullscreen);
2897 gtk_window_present (GTK_WINDOW (window));
2901 * Used by modest_ui_actions_on_details to call do_headers_action
2904 headers_action_show_details (TnyHeader *header,
2905 ModestWindow *window,
2912 dialog = modest_details_dialog_new_with_header (GTK_WINDOW (window), header);
2915 gtk_widget_show_all (dialog);
2916 gtk_dialog_run (GTK_DIALOG (dialog));
2918 gtk_widget_destroy (dialog);
2922 * Show the folder details in a ModestDetailsDialog widget
2925 show_folder_details (TnyFolder *folder,
2931 dialog = modest_details_dialog_new_with_folder (window, folder);
2934 gtk_widget_show_all (dialog);
2935 gtk_dialog_run (GTK_DIALOG (dialog));
2937 gtk_widget_destroy (dialog);
2941 * Show the header details in a ModestDetailsDialog widget
2944 modest_ui_actions_on_details (GtkAction *action,
2947 TnyList * headers_list;
2951 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2954 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2957 g_object_unref (msg);
2959 headers_list = get_selected_headers (win);
2963 iter = tny_list_create_iterator (headers_list);
2965 header = TNY_HEADER (tny_iterator_get_current (iter));
2966 headers_action_show_details (header, win, NULL);
2967 g_object_unref (header);
2969 g_object_unref (iter);
2970 g_object_unref (headers_list);
2972 } else if (MODEST_IS_MAIN_WINDOW (win)) {
2973 GtkWidget *folder_view, *header_view;
2975 /* Check which widget has the focus */
2976 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2977 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2978 if (gtk_widget_is_focus (folder_view)) {
2979 TnyFolderStore *folder_store
2980 = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
2981 if (!folder_store) {
2982 g_warning ("%s: No item was selected.\n", __FUNCTION__);
2985 /* Show only when it's a folder */
2986 /* This function should not be called for account items,
2987 * because we dim the menu item for them. */
2988 if (TNY_IS_FOLDER (folder_store)) {
2989 show_folder_details (TNY_FOLDER (folder_store), GTK_WINDOW (win));
2992 g_object_unref (folder_store);
2995 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2996 MODEST_WIDGET_TYPE_HEADER_VIEW);
2997 /* Show details of each header */
2998 do_headers_action (win, headers_action_show_details, header_view);
3004 modest_ui_actions_on_toggle_show_cc (GtkToggleAction *toggle,
3005 ModestMsgEditWindow *window)
3007 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
3009 modest_msg_edit_window_show_cc (window, gtk_toggle_action_get_active (toggle));
3013 modest_ui_actions_on_toggle_show_bcc (GtkToggleAction *toggle,
3014 ModestMsgEditWindow *window)
3016 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
3018 modest_msg_edit_window_show_bcc (window, gtk_toggle_action_get_active (toggle));
3022 modest_ui_actions_toggle_folders_view (GtkAction *action,
3023 ModestMainWindow *main_window)
3027 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
3029 conf = modest_runtime_get_conf ();
3031 if (modest_main_window_get_style (main_window) == MODEST_MAIN_WINDOW_STYLE_SPLIT)
3032 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SIMPLE);
3034 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SPLIT);
3038 modest_ui_actions_on_toggle_toolbar (GtkToggleAction *toggle,
3039 ModestWindow *window)
3041 gboolean active, fullscreen = FALSE;
3042 ModestWindowMgr *mgr;
3044 active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle));
3046 /* Check if we want to toggle the toolbar vuew in fullscreen
3048 if (!strcmp (gtk_action_get_name (GTK_ACTION (toggle)),
3049 "ViewShowToolbarFullScreen")) {
3053 /* Toggle toolbar */
3054 mgr = modest_runtime_get_window_mgr ();
3055 modest_window_mgr_show_toolbars (mgr, active, fullscreen);
3059 modest_ui_actions_msg_edit_on_select_font (GtkAction *action,
3060 ModestMsgEditWindow *window)
3062 modest_msg_edit_window_select_font (window);
3066 modest_ui_actions_on_folder_display_name_changed (ModestFolderView *folder_view,
3067 const gchar *display_name,
3070 /* Do not change the application name if the widget has not
3071 the focus. This callback could be called even if the folder
3072 view has not the focus, because the handled signal could be
3073 emitted when the folder view is redrawn */
3074 if (gtk_widget_is_focus (GTK_WIDGET (folder_view))) {
3076 gtk_window_set_title (window, display_name);
3078 gtk_window_set_title (window, " ");
3083 modest_ui_actions_on_select_contacts (GtkAction *action, ModestMsgEditWindow *window)
3085 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
3086 modest_msg_edit_window_select_contacts (window);
3090 modest_ui_actions_on_check_names (GtkAction *action, ModestMsgEditWindow *window)
3092 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
3093 modest_msg_edit_window_check_names (window);
3098 create_move_to_dialog (ModestWindow *win,
3099 GtkWidget *folder_view,
3100 GtkWidget **tree_view)
3102 GtkWidget *dialog, *scroll;
3104 dialog = gtk_dialog_new_with_buttons (_("mcen_ti_moveto_folders_title"),
3106 GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR | GTK_DIALOG_DESTROY_WITH_PARENT,
3108 GTK_RESPONSE_ACCEPT,
3110 GTK_RESPONSE_REJECT,
3113 /* Create scrolled window */
3114 scroll = gtk_scrolled_window_new (NULL, NULL);
3115 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
3116 GTK_POLICY_AUTOMATIC,
3117 GTK_POLICY_AUTOMATIC);
3119 /* Create folder view */
3120 *tree_view = modest_platform_create_folder_view (NULL);
3122 /* It could happen that we're trying to move a message from a
3123 window (msg window for example) after the main window was
3124 closed, so we can not just get the model of the folder
3126 if (MODEST_IS_FOLDER_VIEW (folder_view))
3127 gtk_tree_view_set_model (GTK_TREE_VIEW (*tree_view),
3128 gtk_tree_view_get_model (GTK_TREE_VIEW (folder_view)));
3130 modest_folder_view_update_model (MODEST_FOLDER_VIEW (*tree_view),
3131 TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()));
3133 gtk_container_add (GTK_CONTAINER (scroll), *tree_view);
3135 /* Add scroll to dialog */
3136 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
3137 scroll, FALSE, FALSE, 0);
3139 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
3141 /* Select INBOX or local account */
3142 modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (*tree_view));
3148 * Returns TRUE if at least one of the headers of the list belongs to
3149 * a message that has been fully retrieved.
3152 has_retrieved_msgs (TnyList *list)
3155 gboolean found = FALSE;
3157 iter = tny_list_create_iterator (list);
3158 while (tny_iterator_is_done (iter) && !found) {
3160 TnyHeaderFlags flags;
3162 header = TNY_HEADER (tny_iterator_get_current (iter));
3163 flags = tny_header_get_flags (header);
3164 if (!(flags & TNY_HEADER_FLAG_PARTIAL))
3168 tny_iterator_next (iter);
3170 g_object_unref (iter);
3176 * Shows a confirmation dialog to the user when we're moving messages
3177 * from a remote server to the local storage. Returns the dialog
3178 * response. If it's other kind of movement the it always returns
3182 msgs_move_to_confirmation (GtkWindow *win,
3183 TnyFolder *dest_folder,
3186 gint response = GTK_RESPONSE_OK;
3188 /* If the destination is a local folder */
3189 if (modest_tny_folder_is_local_folder (dest_folder)) {
3190 TnyFolder *src_folder;
3194 /* Get source folder */
3195 iter = tny_list_create_iterator (headers);
3196 header = TNY_HEADER (tny_iterator_get_current (iter));
3197 src_folder = tny_header_get_folder (header);
3198 g_object_unref (header);
3199 g_object_unref (iter);
3201 /* if no src_folder, message may be an attahcment */
3202 if (src_folder == NULL)
3203 return GTK_RESPONSE_CANCEL;
3205 /* If the source is a remote folder */
3206 if (!modest_tny_folder_is_local_folder (src_folder)) {
3207 const gchar *message;
3209 if (has_retrieved_msgs (headers))
3210 message = ngettext ("mcen_nc_move_retrieve", "mcen_nc_move_retrieves",
3211 tny_list_get_length (headers));
3213 message = ngettext ("mcen_nc_move_header", "mcen_nc_move_headers",
3214 tny_list_get_length (headers));
3216 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
3217 (const gchar *) message);
3219 g_object_unref (src_folder);
3227 transfer_msgs_from_viewer_cb (const GObject *object, gpointer user_data)
3229 ModestMsgViewWindow *self = NULL;
3230 gboolean last, first;
3232 g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (object));
3233 self = MODEST_MSG_VIEW_WINDOW (object);
3235 last = modest_msg_view_window_last_message_selected (self);
3236 first = modest_msg_view_window_first_message_selected (self);
3238 /* No more messages to view, so close this window */
3239 /* gboolean ret_value; */
3240 /* g_signal_emit_by_name (G_OBJECT (self), "delete-event", NULL, &ret_value); */
3241 modest_ui_actions_on_close_window (NULL, MODEST_WINDOW(self));
3243 modest_msg_view_window_select_previous_message (self);
3245 modest_msg_view_window_select_next_message (self);
3249 modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op,
3252 GObject *win = modest_mail_operation_get_source (mail_op);
3253 const GError *error = NULL;
3254 const gchar *message = NULL;
3256 /* Get error message */
3257 error = modest_mail_operation_get_error (mail_op);
3258 if (error != NULL && error->message != NULL) {
3259 message = error->message;
3261 message = _("mail_in_ui_folder_move_target_error");
3264 /* Show notification dialog */
3265 modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL, message);
3266 g_object_unref (win);
3270 modest_ui_actions_send_receive_error_handler (ModestMailOperation *mail_op,
3273 GObject *win = modest_mail_operation_get_source (mail_op);
3274 const GError *error = modest_mail_operation_get_error (mail_op);
3276 g_return_if_fail (error != NULL);
3277 if (error->message != NULL)
3278 g_printerr ("modest: %s\n", error->message);
3280 g_printerr ("modest: unkonw error on send&receive operation");
3282 /* Show error message */
3283 /* if (modest_mail_operation_get_id (mail_op) == MODEST_MAIL_OPERATION_TYPE_RECEIVE) */
3284 /* modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL, */
3285 /* _CS("sfil_ib_unable_to_receive")); */
3287 /* modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL, */
3288 /* _CS("sfil_ib_unable_to_send")); */
3289 g_object_unref (win);
3293 open_msg_for_purge_cb (ModestMailOperation *mail_op,
3300 gint pending_purges = 0;
3301 gboolean some_purged = FALSE;
3302 ModestWindow *win = MODEST_WINDOW (user_data);
3304 /* If there was any error */
3305 if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg))
3308 /* Once the message has been retrieved for purging, we check if
3309 * it's all ok for purging */
3311 parts = tny_simple_list_new ();
3312 tny_mime_part_get_parts (TNY_MIME_PART (msg), parts);
3313 iter = tny_list_create_iterator (parts);
3315 while (!tny_iterator_is_done (iter)) {
3317 part = TNY_MIME_PART (tny_iterator_get_current (iter));
3318 if (tny_mime_part_is_attachment (part) || TNY_IS_MSG (part)) {
3319 if (tny_mime_part_is_purged (part))
3324 tny_iterator_next (iter);
3327 if (pending_purges>0) {
3329 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),_("mcen_nc_purge_file_text_inbox"));
3331 if (response == GTK_RESPONSE_OK) {
3332 modest_platform_information_banner (NULL, NULL, _("mcen_ib_removing_attachment"));
3333 tny_iterator_first (iter);
3334 while (!tny_iterator_is_done (iter)) {
3337 part = TNY_MIME_PART (tny_iterator_get_current (iter));
3338 if (tny_mime_part_is_attachment (part) || TNY_IS_MSG (part))
3339 tny_mime_part_set_purged (part);
3340 tny_iterator_next (iter);
3343 tny_msg_rewrite_cache (msg);
3346 modest_platform_information_banner (NULL, NULL, _("mail_ib_attachment_already_purged"));
3349 /* remove attachments */
3350 tny_iterator_first (iter);
3351 while (!tny_iterator_is_done (iter)) {
3354 part = TNY_MIME_PART (tny_iterator_get_current (iter));
3355 g_object_unref (part);
3356 tny_iterator_next (iter);
3359 g_object_unref (iter);
3360 g_object_unref (parts);
3364 modest_ui_actions_on_main_window_remove_attachments (GtkAction *action,
3365 ModestMainWindow *win)
3367 GtkWidget *header_view;
3368 TnyList *header_list;
3371 TnyHeaderFlags flags;
3372 ModestWindow *msg_view_window = NULL;
3375 g_return_if_fail (MODEST_IS_MAIN_WINDOW (win));
3377 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
3378 MODEST_WIDGET_TYPE_HEADER_VIEW);
3380 header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (header_view));
3382 if (tny_list_get_length (header_list) == 1) {
3383 iter = tny_list_create_iterator (header_list);
3384 header = TNY_HEADER (tny_iterator_get_current (iter));
3385 g_object_unref (iter);
3390 found = modest_window_mgr_find_registered_header (modest_runtime_get_window_mgr (),
3391 header, &msg_view_window);
3392 flags = tny_header_get_flags (header);
3393 if (!(flags & TNY_HEADER_FLAG_CACHED))
3396 if (msg_view_window != NULL)
3397 modest_msg_view_window_remove_attachments (MODEST_MSG_VIEW_WINDOW (msg_view_window), TRUE);
3399 /* do nothing; uid was registered before, so window is probably on it's way */
3400 g_warning ("debug: header %p has already been registered", header);
3403 ModestMailOperation *mail_op = NULL;
3404 modest_window_mgr_register_header (modest_runtime_get_window_mgr (), header);
3405 mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
3407 modest_ui_actions_get_msgs_full_error_handler,
3409 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
3410 modest_mail_operation_get_msg (mail_op, header, open_msg_for_purge_cb, win);
3412 g_object_unref (mail_op);
3415 g_object_unref (header);
3417 g_object_unref (header_list);
3421 * UI handler for the "Move to" action when invoked from the
3425 modest_ui_actions_on_main_window_move_to (GtkAction *action,
3426 ModestMainWindow *win)
3428 GtkWidget *dialog = NULL, *folder_view = NULL, *tree_view = NULL;
3429 GtkWidget *header_view = NULL;
3431 TnyFolderStore *folder_store = NULL;
3432 ModestMailOperation *mail_op = NULL;
3434 g_return_if_fail (MODEST_IS_MAIN_WINDOW (win));
3436 /* Get the folder view */
3437 folder_view = modest_main_window_get_child_widget (win,
3438 MODEST_WIDGET_TYPE_FOLDER_VIEW);
3440 TnyFolderStore *src_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
3442 /* Offer the connection dialog if necessary, if the source folder is in a networked account: */
3443 if (!modest_platform_connect_and_wait_if_network_folderstore (GTK_WINDOW (win), src_folder)) {
3445 g_object_unref (src_folder);
3451 /* Get header view */
3452 header_view = modest_main_window_get_child_widget (win,
3453 MODEST_WIDGET_TYPE_HEADER_VIEW);
3455 /* Create and run the dialog */
3456 dialog = create_move_to_dialog (MODEST_WINDOW (win), folder_view, &tree_view);
3457 modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (tree_view));
3458 result = gtk_dialog_run (GTK_DIALOG(dialog));
3459 g_object_ref (tree_view);
3461 /* We do this to save an indentation level ;-) */
3462 if (result != GTK_RESPONSE_ACCEPT)
3465 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (tree_view));
3467 if (TNY_IS_ACCOUNT (folder_store) &&
3468 !MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (folder_store))
3471 /* Offer the connection dialog if necessary: */
3472 if (!modest_platform_connect_and_wait_if_network_folderstore (GTK_WINDOW (win), folder_store)) {
3476 /* Get folder or messages to transfer */
3477 if (gtk_widget_is_focus (folder_view)) {
3479 /* Clean folder on header view before moving it */
3480 modest_header_view_clear (MODEST_HEADER_VIEW (header_view));
3482 if (TNY_IS_FOLDER (src_folder)) {
3484 modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
3486 modest_ui_actions_move_folder_error_handler,
3488 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
3490 modest_mail_operation_xfer_folder (mail_op,
3491 TNY_FOLDER (src_folder),
3494 /* Unref mail operation */
3495 g_object_unref (G_OBJECT (mail_op));
3497 g_warning ("%s: src_folder is not a TnyFolder.\n", __FUNCTION__);
3500 if (gtk_widget_is_focus (header_view)) {
3501 TnyList *headers = NULL;
3504 /* TODO: Check for connection if the headers are on a network account. */
3505 headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (header_view));
3507 /* Ask for user confirmation */
3508 response = msgs_move_to_confirmation (GTK_WINDOW (win),
3509 TNY_FOLDER (folder_store),
3512 /* Transfer messages */
3513 if (response == GTK_RESPONSE_OK) {
3515 modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
3517 modest_ui_actions_move_folder_error_handler,
3519 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
3522 modest_mail_operation_xfer_msgs (mail_op,
3524 TNY_FOLDER (folder_store),
3529 g_object_unref (G_OBJECT (mail_op));
3531 g_object_unref (headers);
3537 g_object_unref (src_folder);
3540 g_object_unref (folder_store);
3542 gtk_widget_destroy (dialog);
3547 * UI handler for the "Move to" action when invoked from the
3548 * ModestMsgViewWindow
3551 modest_ui_actions_on_msg_view_window_move_to (GtkAction *action,
3552 ModestMsgViewWindow *win)
3554 GtkWidget *dialog, *folder_view, *tree_view = NULL;
3556 ModestMainWindow *main_window = NULL;
3557 TnyHeader *header = NULL;
3558 TnyList *headers = NULL;
3560 /* Get the folder view */
3561 main_window = MODEST_MAIN_WINDOW (modest_window_mgr_get_main_window (modest_runtime_get_window_mgr ()));
3563 folder_view = modest_main_window_get_child_widget (main_window,
3564 MODEST_WIDGET_TYPE_FOLDER_VIEW);
3568 /* Create and run the dialog */
3569 dialog = create_move_to_dialog (MODEST_WINDOW (win), folder_view, &tree_view);
3570 result = gtk_dialog_run (GTK_DIALOG(dialog));
3572 if (result == GTK_RESPONSE_ACCEPT) {
3573 TnyFolderStore *folder_store;
3576 /* Create header list */
3577 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
3578 g_return_if_fail (header != NULL);
3580 /* Offer the connection dialog if necessary: */
3581 /* TODO: What's the extra g_object_ref() for? Isn't this leaking a ref? */
3582 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (g_object_ref (tree_view)));
3583 TnyFolder *header_folder = tny_header_get_folder(header);
3584 if (modest_platform_connect_and_wait_if_network_folderstore (NULL, folder_store) &&
3585 modest_platform_connect_and_wait_if_network_folderstore (NULL, TNY_FOLDER_STORE (header_folder))) {
3587 headers = tny_simple_list_new ();
3588 tny_list_prepend (headers, G_OBJECT (header));
3589 g_object_unref (header);
3591 /* Ask user for confirmation. MSG-NOT404 */
3592 response = msgs_move_to_confirmation (GTK_WINDOW (win),
3593 TNY_FOLDER (folder_store),
3596 /* Transfer current msg */
3597 if (response == GTK_RESPONSE_OK) {
3598 ModestMailOperation *mail_op;
3600 /* Create mail op */
3601 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(win));
3602 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
3605 /* Transfer messages */
3606 modest_mail_operation_xfer_msgs (mail_op,
3608 TNY_FOLDER (folder_store),
3610 transfer_msgs_from_viewer_cb,
3612 g_object_unref (G_OBJECT (mail_op));
3617 g_object_unref (header_folder);
3620 g_object_unref (headers);
3623 g_object_unref (folder_store);
3626 gtk_widget_destroy (dialog);
3630 modest_ui_actions_on_move_to (GtkAction *action,
3633 g_return_if_fail (MODEST_IS_MAIN_WINDOW (win) ||
3634 MODEST_IS_MSG_VIEW_WINDOW (win));
3636 if (MODEST_IS_MAIN_WINDOW (win))
3637 modest_ui_actions_on_main_window_move_to (action,
3638 MODEST_MAIN_WINDOW (win));
3640 modest_ui_actions_on_msg_view_window_move_to (action,
3641 MODEST_MSG_VIEW_WINDOW (win));
3645 * Calls #HeadersFunc for each header already selected in the main
3646 * window or the message currently being shown in the msg view window
3649 do_headers_action (ModestWindow *win,
3653 TnyList *headers_list;
3659 headers_list = get_selected_headers (win);
3663 /* Get the folder */
3664 iter = tny_list_create_iterator (headers_list);
3665 header = TNY_HEADER (tny_iterator_get_current (iter));
3666 folder = tny_header_get_folder (header);
3667 g_object_unref (header);
3669 /* Call the function for each header */
3670 while (!tny_iterator_is_done (iter)) {
3671 header = TNY_HEADER (tny_iterator_get_current (iter));
3672 func (header, win, user_data);
3673 g_object_unref (header);
3674 tny_iterator_next (iter);
3677 /* Trick: do a poke status in order to speed up the signaling
3679 tny_folder_poke_status (folder);
3682 g_object_unref (folder);
3683 g_object_unref (iter);
3684 g_object_unref (headers_list);
3688 modest_ui_actions_view_attachment (GtkAction *action,
3689 ModestWindow *window)
3691 if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
3692 modest_msg_view_window_view_attachment (MODEST_MSG_VIEW_WINDOW (window), NULL);
3694 /* not supported window for this action */
3695 g_return_if_reached ();
3700 modest_ui_actions_save_attachments (GtkAction *action,
3701 ModestWindow *window)
3703 if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
3704 modest_msg_view_window_save_attachments (MODEST_MSG_VIEW_WINDOW (window), NULL);
3706 /* not supported window for this action */
3707 g_return_if_reached ();
3712 modest_ui_actions_remove_attachments (GtkAction *action,
3713 ModestWindow *window)
3715 if (MODEST_IS_MAIN_WINDOW (window)) {
3716 modest_ui_actions_on_main_window_remove_attachments (action, MODEST_MAIN_WINDOW (window));
3717 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
3718 modest_msg_view_window_remove_attachments (MODEST_MSG_VIEW_WINDOW (window), FALSE);
3720 /* not supported window for this action */
3721 g_return_if_reached ();
3726 modest_ui_actions_on_settings (GtkAction *action,
3731 dialog = modest_platform_get_global_settings_dialog ();
3732 gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (win));
3733 gtk_widget_show_all (dialog);
3735 gtk_dialog_run (GTK_DIALOG (dialog));
3737 gtk_widget_destroy (dialog);
3741 modest_ui_actions_on_help (GtkAction *action,
3744 const gchar *help_id = NULL;
3746 if (MODEST_IS_MAIN_WINDOW (win)) {
3747 const gchar *action_name;
3748 action_name = gtk_action_get_name (action);
3750 if (!strcmp (action_name, "FolderViewCSMHelp") ||
3751 !strcmp (action_name, "HeaderViewCSMHelp")) {
3752 GtkWidget *folder_view;
3753 TnyFolderStore *folder_store;
3754 /* Get selected folder */
3755 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
3756 MODEST_WIDGET_TYPE_FOLDER_VIEW);
3757 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
3759 /* Switch help_id */
3760 if (TNY_IS_FOLDER (folder_store)) {
3761 switch (tny_folder_get_folder_type (TNY_FOLDER (folder_store))) {
3762 case TNY_FOLDER_TYPE_NORMAL:
3763 help_id = "applications_email_userfolder";
3765 case TNY_FOLDER_TYPE_INBOX:
3766 help_id = "applications_email_inbox";
3768 case TNY_FOLDER_TYPE_OUTBOX:
3769 help_id = "applications_email_outbox";
3771 case TNY_FOLDER_TYPE_SENT:
3772 help_id = "applications_email_sent";
3774 case TNY_FOLDER_TYPE_DRAFTS:
3775 help_id = "applications_email_drafts";
3777 case TNY_FOLDER_TYPE_ARCHIVE:
3778 help_id = "applications_email_archive";
3784 g_object_unref (folder_store);
3786 help_id = "applications_email_mainview";
3788 } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
3789 help_id = "applications_email_viewer";
3790 } else if (MODEST_IS_MSG_EDIT_WINDOW (win))
3791 help_id = "applications_email_editor";
3793 modest_platform_show_help (GTK_WINDOW (win), help_id);
3797 modest_ui_actions_on_retrieve_msg_contents (GtkAction *action,
3798 ModestWindow *window)
3800 ModestMailOperation *mail_op;
3804 headers = get_selected_headers (window);
3808 /* Create mail operation */
3809 mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
3811 modest_ui_actions_get_msgs_full_error_handler,
3813 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
3814 modest_mail_operation_get_msgs_full (mail_op, headers, NULL, NULL, NULL);
3817 g_object_unref (headers);
3818 g_object_unref (mail_op);
3822 modest_ui_actions_on_email_menu_activated (GtkAction *action,
3823 ModestWindow *window)
3825 g_return_if_fail (MODEST_IS_WINDOW (window));
3828 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3832 modest_ui_actions_on_edit_menu_activated (GtkAction *action,
3833 ModestWindow *window)
3835 g_return_if_fail (MODEST_IS_WINDOW (window));
3838 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3842 modest_ui_actions_on_view_menu_activated (GtkAction *action,
3843 ModestWindow *window)
3845 g_return_if_fail (MODEST_IS_WINDOW (window));
3848 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3852 modest_ui_actions_on_tools_menu_activated (GtkAction *action,
3853 ModestWindow *window)
3855 g_return_if_fail (MODEST_IS_WINDOW (window));
3858 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3862 modest_ui_actions_on_attachment_menu_activated (GtkAction *action,
3863 ModestWindow *window)
3865 g_return_if_fail (MODEST_IS_WINDOW (window));
3868 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3872 modest_ui_actions_on_toolbar_csm_menu_activated (GtkAction *action,
3873 ModestWindow *window)
3875 g_return_if_fail (MODEST_IS_WINDOW (window));
3878 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3882 modest_ui_actions_on_folder_view_csm_menu_activated (GtkAction *action,
3883 ModestWindow *window)
3885 g_return_if_fail (MODEST_IS_WINDOW (window));
3888 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3892 modest_ui_actions_on_header_view_csm_menu_activated (GtkAction *action,
3893 ModestWindow *window)
3895 g_return_if_fail (MODEST_IS_WINDOW (window));
3898 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3902 modest_ui_actions_check_toolbar_dimming_rules (ModestWindow *window)
3904 g_return_if_fail (MODEST_IS_WINDOW (window));
3907 modest_window_check_dimming_rules_group (window, "ModestToolbarDimmingRules");
3911 modest_ui_actions_on_search_messages (GtkAction *action, ModestWindow *window)
3913 g_return_if_fail (MODEST_IS_WINDOW (window));
3915 modest_platform_show_search_messages (GTK_WINDOW (window));
3919 modest_ui_actions_on_open_addressbook (GtkAction *action, ModestWindow *win)
3921 g_return_if_fail (MODEST_IS_WINDOW (win));
3922 modest_platform_show_addressbook (GTK_WINDOW (win));
3927 modest_ui_actions_on_toggle_find_in_page (GtkToggleAction *action,
3928 ModestWindow *window)
3930 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
3932 modest_msg_edit_window_toggle_find_toolbar (MODEST_MSG_EDIT_WINDOW (window), gtk_toggle_action_get_active (action));
3936 _on_send_receive_progress_changed (ModestMailOperation *mail_op,
3937 ModestMailOperationState *state,
3940 g_return_if_fail (MODEST_IS_MAIN_WINDOW(user_data));
3942 /* Set send/receive operation finished */
3943 if (state->status != MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS)
3944 modest_main_window_notify_send_receive_completed (MODEST_MAIN_WINDOW(user_data));