1 /* Copyright (c) 2006, Nokia Corporation
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * * Neither the name of the Nokia Corporation nor the names of its
14 * contributors may be used to endorse or promote products derived from
15 * this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
18 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 #endif /*HAVE_CONFIG_H*/
34 #include <glib/gi18n.h>
35 #include <glib/gprintf.h>
37 #include <modest-runtime.h>
38 #include <modest-tny-folder.h>
39 #include <modest-tny-msg.h>
40 #include <modest-tny-account.h>
41 #include <modest-address-book.h>
42 #include "modest-error.h"
43 #include "modest-ui-actions.h"
45 #include "modest-tny-platform-factory.h"
46 #include "modest-platform.h"
48 #ifdef MODEST_PLATFORM_MAEMO
49 #include "maemo/modest-osso-state-saving.h"
50 #endif /* MODEST_PLATFORM_MAEMO */
52 #include "widgets/modest-ui-constants.h"
53 #include <widgets/modest-main-window.h>
54 #include <widgets/modest-msg-view-window.h>
55 #include <widgets/modest-account-view-window.h>
56 #include <widgets/modest-details-dialog.h>
57 #include <widgets/modest-attachments-view.h>
58 #include "widgets/modest-folder-view.h"
59 #include "widgets/modest-global-settings-dialog.h"
60 #include "modest-connection-specific-smtp-window.h"
61 #include "modest-account-mgr-helpers.h"
62 #include "modest-mail-operation.h"
63 #include "modest-text-utils.h"
65 #ifdef MODEST_HAVE_EASYSETUP
66 #include "easysetup/modest-easysetup-wizard.h"
67 #endif /* MODEST_HAVE_EASYSETUP */
69 #include <modest-widget-memory.h>
70 #include <tny-error.h>
71 #include <tny-simple-list.h>
72 #include <tny-msg-view.h>
73 #include <tny-device.h>
74 #include <tny-merge-folder.h>
76 typedef struct _GetMsgAsyncHelper {
78 ModestMailOperation *mail_op;
85 typedef enum _ReplyForwardAction {
91 typedef struct _ReplyForwardHelper {
92 guint reply_forward_type;
93 ReplyForwardAction action;
95 GtkWidget *parent_window;
99 * The do_headers_action uses this kind of functions to perform some
100 * action to each member of a list of headers
102 typedef void (*HeadersFunc) (TnyHeader *header, ModestWindow *win, gpointer user_data);
105 do_headers_action (ModestWindow *win,
110 static void open_msg_cb (ModestMailOperation *mail_op,
115 static void reply_forward_cb (ModestMailOperation *mail_op,
120 static void reply_forward (ReplyForwardAction action, ModestWindow *win);
122 static gchar* ask_for_folder_name (GtkWindow *parent_window, const gchar *title);
125 static void _on_send_receive_progress_changed (ModestMailOperation *mail_op,
126 ModestMailOperationState *state,
132 run_account_setup_wizard (ModestWindow *win)
134 ModestEasysetupWizardDialog *wizard;
136 g_return_if_fail (MODEST_IS_WINDOW(win));
138 wizard = modest_easysetup_wizard_dialog_new ();
139 gtk_window_set_transient_for (GTK_WINDOW (wizard), GTK_WINDOW (win));
140 gtk_dialog_run (GTK_DIALOG (wizard));
141 gtk_widget_destroy (GTK_WIDGET (wizard));
146 modest_ui_actions_on_about (GtkAction *action, ModestWindow *win)
149 const gchar *authors[] = {
150 "Dirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>",
153 about = gtk_about_dialog_new ();
154 gtk_about_dialog_set_name (GTK_ABOUT_DIALOG(about), PACKAGE_NAME);
155 gtk_about_dialog_set_version (GTK_ABOUT_DIALOG(about),PACKAGE_VERSION);
156 gtk_about_dialog_set_copyright (GTK_ABOUT_DIALOG(about),
157 _("Copyright (c) 2006, Nokia Corporation\n"
158 "All rights reserved."));
159 gtk_about_dialog_set_comments (GTK_ABOUT_DIALOG(about),
160 _("a modest e-mail client\n\n"
161 "design and implementation: Dirk-Jan C. Binnema\n"
162 "contributions from the fine people at KC and Ig\n"
163 "uses the tinymail email framework written by Philip van Hoof"));
164 gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG(about), authors);
165 gtk_about_dialog_set_website (GTK_ABOUT_DIALOG(about), "http://modest.garage.maemo.org");
167 gtk_dialog_run (GTK_DIALOG (about));
168 gtk_widget_destroy(about);
172 * Gets the list of currently selected messages. If the win is the
173 * main window, then it returns a newly allocated list of the headers
174 * selected in the header view. If win is the msg view window, then
175 * the value returned is a list with just a single header.
177 * The caller of this funcion must free the list.
180 get_selected_headers (ModestWindow *win)
182 if (MODEST_IS_MAIN_WINDOW(win)) {
183 GtkWidget *header_view;
185 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
186 MODEST_WIDGET_TYPE_HEADER_VIEW);
187 return modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
189 } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
190 /* for MsgViewWindows, we simply return a list with one element */
192 TnyList *list = NULL;
194 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
195 if (header != NULL) {
196 list = tny_simple_list_new ();
197 tny_list_prepend (list, G_OBJECT(header));
198 g_object_unref (G_OBJECT(header));
208 headers_action_mark_as_read (TnyHeader *header,
212 TnyHeaderFlags flags;
214 g_return_if_fail (TNY_IS_HEADER(header));
216 flags = tny_header_get_flags (header);
217 if (flags & TNY_HEADER_FLAG_SEEN) return;
218 tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN);
222 headers_action_mark_as_unread (TnyHeader *header,
226 TnyHeaderFlags flags;
228 g_return_if_fail (TNY_IS_HEADER(header));
230 flags = tny_header_get_flags (header);
231 if (flags & TNY_HEADER_FLAG_SEEN) {
232 tny_header_unset_flags (header, TNY_HEADER_FLAG_SEEN);
238 headers_action_delete (TnyHeader *header,
242 ModestMailOperation *mail_op = NULL;
244 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_DELETE, G_OBJECT(win));
245 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
248 /* Always delete. TODO: Move to trash still not supported */
249 modest_mail_operation_remove_msg (mail_op, header, FALSE);
250 g_object_unref (G_OBJECT (mail_op));
254 modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win)
256 TnyList *header_list = NULL;
257 TnyIterator *iter = NULL;
258 TnyHeader *header = NULL;
259 gchar *message = NULL;
263 ModestWindowMgr *mgr;
265 g_return_if_fail (MODEST_IS_WINDOW(win));
267 header_list = get_selected_headers (win);
268 if (!header_list) return;
270 /* Check if any of the headers is already opened */
271 iter = tny_list_create_iterator (header_list);
273 mgr = modest_runtime_get_window_mgr ();
274 while (!tny_iterator_is_done (iter) && !found) {
275 header = TNY_HEADER (tny_iterator_get_current (iter));
276 if (modest_window_mgr_find_window_by_header (mgr, header))
278 g_object_unref (header);
279 tny_iterator_next (iter);
281 g_object_unref (iter);
286 num = g_strdup_printf ("%d", tny_list_get_length (header_list));
287 msg = g_strdup_printf (_("mcen_nc_unable_to_delete_n_messages"), num);
289 modest_platform_run_information_dialog (GTK_WINDOW (win), (const gchar *) msg);
293 g_object_unref (header_list);
298 if (tny_list_get_length(header_list) > 1)
299 message = g_strdup(_("emev_nc_delete_messages"));
301 iter = tny_list_create_iterator (header_list);
302 header = TNY_HEADER (tny_iterator_get_current (iter));
303 desc = g_strdup_printf ("%s", tny_header_get_subject (header));
304 message = g_strdup_printf(_("emev_nc_delete_message"), desc);
305 g_object_unref (header);
306 g_object_unref (iter);
309 /* Confirmation dialog */
310 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
314 if (response == GTK_RESPONSE_OK) {
315 if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
317 g_signal_emit_by_name (G_OBJECT (win), "delete-event", NULL, &ret_value);
321 /* Remove each header */
322 do_headers_action (win, headers_action_delete, NULL);
324 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
325 gtk_widget_destroy (GTK_WIDGET(win));
332 g_object_unref (header_list);
337 modest_ui_actions_on_quit (GtkAction *action, ModestWindow *win)
339 #ifdef MODEST_PLATFORM_MAEMO
340 modest_osso_save_state();
341 #endif /* MODEST_PLATFORM_MAEMO */
347 modest_ui_actions_on_close_window (GtkAction *action, ModestWindow *win)
349 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
350 gtk_widget_destroy (GTK_WIDGET (win));
351 } else if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
353 g_signal_emit_by_name (G_OBJECT (win), "delete-event", NULL, &ret_value);
354 } else if (MODEST_IS_WINDOW (win)) {
355 gtk_widget_destroy (GTK_WIDGET (win));
357 g_return_if_reached ();
362 modest_ui_actions_on_add_to_contacts (GtkAction *action, ModestWindow *win)
364 GtkClipboard *clipboard = NULL;
365 gchar *selection = NULL;
367 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
368 selection = gtk_clipboard_wait_for_text (clipboard);
370 /* Question: why is the clipboard being used here?
371 * It doesn't really make a lot of sense. */
375 modest_address_book_add_address (selection);
381 modest_ui_actions_on_accounts (GtkAction *action, ModestWindow *win)
383 /* This is currently only implemented for Maemo */
384 #ifdef MODEST_PLATFORM_MAEMO /* Defined in config.h */
385 if (!modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE)) {
386 run_account_setup_wizard (win);
389 /* Show the list of accounts: */
390 GtkDialog *account_win = GTK_DIALOG(modest_account_view_window_new ());
391 gtk_window_set_transient_for (GTK_WINDOW (account_win), GTK_WINDOW(win));
392 gtk_dialog_run (account_win);
393 gtk_widget_destroy (GTK_WIDGET(account_win));
396 GtkWidget *dialog, *label;
398 /* Create the widgets */
400 dialog = gtk_dialog_new_with_buttons ("Message",
402 GTK_DIALOG_DESTROY_WITH_PARENT,
406 label = gtk_label_new ("Hello World!");
408 /* Ensure that the dialog box is destroyed when the user responds. */
410 g_signal_connect_swapped (dialog, "response",
411 G_CALLBACK (gtk_widget_destroy),
414 /* Add the label, and show everything we've added to the dialog. */
416 gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox),
418 gtk_widget_show_all (dialog);
419 #endif /* MODEST_PLATFORM_MAEMO */
423 on_smtp_servers_window_hide (GtkWindow* window, gpointer user_data)
425 ModestWindow *main_window = MODEST_WINDOW (user_data);
427 /* Save any changes. */
428 modest_connection_specific_smtp_window_save_server_accounts (
429 MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (window),
430 modest_window_get_active_account (main_window));
431 gtk_widget_destroy (GTK_WIDGET (window));
437 modest_ui_actions_on_smtp_servers (GtkAction *action, ModestWindow *win)
439 /* This is currently only implemented for Maemo,
440 * because it requires an API (libconic) to detect different connection
443 #ifdef MODEST_PLATFORM_MAEMO /* Defined in config.h */
445 /* Create the window if necessary: */
446 const gchar *active_account_name = modest_window_get_active_account (win);
448 /* TODO: Dim the menu item (not in the UI spec)? or show a warning,
449 * or show the default account?
450 * If we show the default account then the account name should be shown in
451 * the window when we show it. */
452 if (!active_account_name) {
453 g_warning ("%s: No account is active.", __FUNCTION__);
457 GtkWidget *specific_window = GTK_WIDGET (modest_connection_specific_smtp_window_new ());
458 modest_connection_specific_smtp_window_fill_with_connections (
459 MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (specific_window),
460 modest_runtime_get_account_mgr(),
461 active_account_name);
463 /* Show the window: */
464 gtk_window_set_transient_for (GTK_WINDOW (specific_window), GTK_WINDOW (win));
465 gtk_window_set_modal (GTK_WINDOW (specific_window), TRUE);
466 gtk_widget_show (specific_window);
468 /* Save changes when the window is hidden: */
469 g_signal_connect (specific_window, "hide",
470 G_CALLBACK (on_smtp_servers_window_hide), win);
471 #endif /* MODEST_PLATFORM_MAEMO */
475 modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win)
477 ModestWindow *msg_win;
479 TnyFolder *folder = NULL;
480 gchar *account_name = NULL;
481 gchar *from_str = NULL;
482 /* GError *err = NULL; */
483 TnyAccount *account = NULL;
484 ModestWindowMgr *mgr;
485 gchar *signature = NULL, *blank_and_signature = NULL;
487 /* if there are no accounts yet, just show the wizard */
488 if (!modest_account_mgr_has_accounts (modest_runtime_get_account_mgr(), TRUE)) {
489 run_account_setup_wizard (win);
493 account_name = g_strdup(modest_window_get_active_account (win));
495 account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
497 g_printerr ("modest: no account found\n");
501 account = modest_tny_account_store_get_server_account (modest_runtime_get_account_store(),
503 TNY_ACCOUNT_TYPE_STORE);
505 g_printerr ("modest: failed to get tnyaccount for '%s'\n", account_name);
509 from_str = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(), account_name);
511 g_printerr ("modest: failed get from string for '%s'\n", account_name);
515 if (modest_account_mgr_get_bool (modest_runtime_get_account_mgr (), account_name,
516 MODEST_ACCOUNT_USE_SIGNATURE, FALSE)) {
517 signature = modest_account_mgr_get_string (modest_runtime_get_account_mgr (), account_name,
518 MODEST_ACCOUNT_SIGNATURE, FALSE);
519 blank_and_signature = g_strconcat ("\n", signature, NULL);
522 blank_and_signature = g_strdup ("");
525 msg = modest_tny_msg_new ("", from_str, "", "", "", blank_and_signature, NULL);
527 g_printerr ("modest: failed to create new msg\n");
531 folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS);
533 g_printerr ("modest: failed to find Drafts folder\n");
538 /* Create and register edit window */
539 /* This is destroyed by TOOD. */
540 msg_win = modest_msg_edit_window_new (msg, account_name);
541 mgr = modest_runtime_get_window_mgr ();
542 modest_window_mgr_register_window (mgr, msg_win);
545 gtk_window_set_transient_for (GTK_WINDOW (msg_win),
547 gtk_widget_show_all (GTK_WIDGET (msg_win));
550 g_free (account_name);
552 g_free (blank_and_signature);
554 g_object_unref (G_OBJECT(account));
556 g_object_unref (G_OBJECT(msg));
558 g_object_unref (G_OBJECT(folder));
562 open_msg_cb (ModestMailOperation *mail_op,
567 ModestWindowMgr *mgr = NULL;
568 ModestWindow *parent_win = NULL;
569 ModestWindow *win = NULL;
570 TnyFolderType folder_type = TNY_FOLDER_TYPE_UNKNOWN;
571 gchar *account = NULL;
574 /* TODO: Show an error? (review the specs) */
578 parent_win = (ModestWindow *) modest_mail_operation_get_source (mail_op);
579 folder = tny_header_get_folder (header);
581 /* Mark header as read */
582 headers_action_mark_as_read (header, MODEST_WINDOW(parent_win), NULL);
585 account = g_strdup (modest_window_get_active_account (MODEST_WINDOW (parent_win)));
587 account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
589 /* Gets folder type (OUTBOX headers will be opened in edit window */
590 if (modest_tny_folder_is_local_folder (folder))
591 folder_type = modest_tny_folder_get_local_folder_type (folder);
593 /* If the header is in the drafts folder then open the editor,
594 else the message view window */
595 if (folder_type == TNY_FOLDER_TYPE_DRAFTS) {
596 /* we cannot edit without a valid account... */
597 if (!modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE)) {
598 run_account_setup_wizard(parent_win);
601 win = modest_msg_edit_window_new (msg, account);
603 gchar *uid = modest_tny_folder_get_header_unique_id (header);
605 if (MODEST_IS_MAIN_WINDOW (parent_win)) {
606 GtkWidget *header_view;
607 GtkTreeSelection *sel;
608 GList *sel_list = NULL;
611 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(parent_win),
612 MODEST_WIDGET_TYPE_HEADER_VIEW);
614 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (header_view));
615 sel_list = gtk_tree_selection_get_selected_rows (sel, &model);
617 if (sel_list != NULL) {
618 GtkTreeRowReference *row_reference;
620 row_reference = gtk_tree_row_reference_new (model, (GtkTreePath *) sel_list->data);
621 g_list_foreach (sel_list, (GFunc) gtk_tree_path_free, NULL);
622 g_list_free (sel_list);
624 win = modest_msg_view_window_new_with_header_model (msg,
629 gtk_tree_row_reference_free (row_reference);
631 win = modest_msg_view_window_new (msg, account, (const gchar*) uid);
634 win = modest_msg_view_window_new (msg, account, (const gchar*) uid);
639 /* Register and show new window */
641 mgr = modest_runtime_get_window_mgr ();
642 modest_window_mgr_register_window (mgr, win);
643 gtk_window_set_transient_for (GTK_WINDOW (win), GTK_WINDOW (parent_win));
644 gtk_widget_show_all (GTK_WIDGET(win));
650 g_object_unref (msg);
651 g_object_unref (folder);
652 g_object_unref (header);
656 * This function is the error handler of the
657 * modest_mail_operation_get_msgs_full operation
660 modest_ui_actions_get_msgs_full_error_handler (ModestMailOperation *mail_op,
665 error = modest_mail_operation_get_error (mail_op);
666 if (error->code == MODEST_MAIL_OPERATION_ERROR_MESSAGE_SIZE_LIMIT) {
667 GObject *win = modest_mail_operation_get_source (mail_op);
669 modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL,
675 * This function is used by both modest_ui_actions_on_open and
676 * modest_ui_actions_on_header_activated. This way we always do the
677 * same when trying to open messages.
680 _modest_ui_actions_open (TnyList *headers, ModestWindow *win)
682 ModestWindowMgr *mgr;
684 ModestMailOperation *mail_op;
685 TnyList *not_opened_headers;
687 /* Look if we already have a message view for each header. If
688 true, then remove the header from the list of headers to
690 mgr = modest_runtime_get_window_mgr ();
691 iter = tny_list_create_iterator (headers);
692 not_opened_headers = tny_simple_list_new ();
693 while (!tny_iterator_is_done (iter)) {
694 ModestWindow *window;
697 header = TNY_HEADER (tny_iterator_get_current (iter));
698 window = modest_window_mgr_find_window_by_header (mgr, header);
699 /* Do not open again the message and present the
700 window to the user */
702 gtk_window_present (GTK_WINDOW (window));
704 tny_list_append (not_opened_headers, G_OBJECT (header));
706 g_object_unref (header);
707 tny_iterator_next (iter);
710 /* Open each message */
711 mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
713 modest_ui_actions_get_msgs_full_error_handler,
715 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
716 modest_mail_operation_get_msgs_full (mail_op,
722 g_object_unref (not_opened_headers);
723 g_object_unref (iter);
724 g_object_unref (mail_op);
728 modest_ui_actions_on_open (GtkAction *action, ModestWindow *win)
733 headers = get_selected_headers (win);
738 _modest_ui_actions_open (headers, win);
740 g_object_unref(headers);
745 free_reply_forward_helper (gpointer data)
747 ReplyForwardHelper *helper;
749 helper = (ReplyForwardHelper *) data;
750 g_free (helper->account_name);
751 g_slice_free (ReplyForwardHelper, helper);
755 reply_forward_cb (ModestMailOperation *mail_op,
761 ReplyForwardHelper *rf_helper;
762 ModestWindow *msg_win;
763 ModestEditType edit_type;
765 TnyAccount *account = NULL;
766 ModestWindowMgr *mgr;
767 gchar *signature = NULL;
769 g_return_if_fail (user_data != NULL);
770 rf_helper = (ReplyForwardHelper *) user_data;
772 from = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(),
773 rf_helper->account_name);
774 if (modest_account_mgr_get_bool (modest_runtime_get_account_mgr(),
775 rf_helper->account_name,
776 MODEST_ACCOUNT_USE_SIGNATURE, FALSE)) {
777 signature = modest_account_mgr_get_string (modest_runtime_get_account_mgr (),
778 rf_helper->account_name,
779 MODEST_ACCOUNT_SIGNATURE, FALSE);
782 /* Create reply mail */
783 switch (rf_helper->action) {
786 modest_tny_msg_create_reply_msg (msg, from, signature,
787 rf_helper->reply_forward_type,
788 MODEST_TNY_MSG_REPLY_MODE_SENDER);
790 case ACTION_REPLY_TO_ALL:
792 modest_tny_msg_create_reply_msg (msg, from, signature, rf_helper->reply_forward_type,
793 MODEST_TNY_MSG_REPLY_MODE_ALL);
794 edit_type = MODEST_EDIT_TYPE_REPLY;
798 modest_tny_msg_create_forward_msg (msg, from, signature, rf_helper->reply_forward_type);
799 edit_type = MODEST_EDIT_TYPE_FORWARD;
802 g_return_if_reached ();
809 g_printerr ("modest: failed to create message\n");
813 account = modest_tny_account_store_get_server_account (modest_runtime_get_account_store(),
814 rf_helper->account_name,
815 TNY_ACCOUNT_TYPE_STORE);
817 g_printerr ("modest: failed to get tnyaccount for '%s'\n", rf_helper->account_name);
821 /* Create and register the windows */
822 msg_win = modest_msg_edit_window_new (new_msg, rf_helper->account_name);
823 mgr = modest_runtime_get_window_mgr ();
824 modest_window_mgr_register_window (mgr, msg_win);
826 if (rf_helper->parent_window != NULL) {
829 parent_zoom = modest_window_get_zoom (MODEST_WINDOW (rf_helper->parent_window));
830 modest_window_set_zoom (msg_win, parent_zoom);
833 /* Show edit window */
834 gtk_widget_show_all (GTK_WIDGET (msg_win));
838 g_object_unref (G_OBJECT (new_msg));
840 g_object_unref (G_OBJECT (account));
841 g_object_unref (msg);
842 g_object_unref (header);
846 * Checks a list of headers. If any of them are not currently
847 * downloaded (CACHED) then it asks the user for permission to
850 * Returns FALSE if the user does not want to download the
851 * messages. Returns TRUE if the user allowed the download or if all
852 * of them are currently downloaded
855 download_uncached_messages (TnyList *header_list, GtkWindow *win)
858 gboolean found, retval;
860 iter = tny_list_create_iterator (header_list);
862 while (!tny_iterator_is_done (iter) && !found) {
864 TnyHeaderFlags flags;
866 header = TNY_HEADER (tny_iterator_get_current (iter));
867 flags = tny_header_get_flags (header);
868 /* TODO: is this the right flag?, it seems that some
869 headers that have been previously downloaded do not
871 found = !(flags & TNY_HEADER_FLAG_CACHED);
872 g_object_unref (header);
873 tny_iterator_next (iter);
875 g_object_unref (iter);
877 /* Ask for user permission to download the messages */
880 GtkResponseType response;
882 modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
883 _("mcen_nc_get_multi_msg_txt"));
884 if (response == GTK_RESPONSE_CANCEL)
892 * Common code for the reply and forward actions
895 reply_forward (ReplyForwardAction action, ModestWindow *win)
897 ModestMailOperation *mail_op = NULL;
898 TnyList *header_list = NULL;
899 ReplyForwardHelper *rf_helper = NULL;
900 guint reply_forward_type;
901 gboolean continue_download;
903 g_return_if_fail (MODEST_IS_WINDOW(win));
905 /* we need an account when editing */
906 if (!modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE)) {
907 run_account_setup_wizard (win);
911 header_list = get_selected_headers (win);
915 /* Check that the messages have been previously downloaded */
916 continue_download = download_uncached_messages (header_list, GTK_WINDOW (win));
917 if (!continue_download) {
918 g_object_unref (header_list);
923 modest_conf_get_int (modest_runtime_get_conf (),
924 (action == ACTION_FORWARD) ? MODEST_CONF_FORWARD_TYPE : MODEST_CONF_REPLY_TYPE,
926 /* We assume that we can only select messages of the
927 same folder and that we reply all of them from the
928 same account. In fact the interface currently only
929 allows single selection */
932 rf_helper = g_slice_new0 (ReplyForwardHelper);
933 rf_helper->reply_forward_type = reply_forward_type;
934 rf_helper->action = action;
935 rf_helper->account_name = g_strdup (modest_window_get_active_account (win));
936 if ((win != NULL) && (MODEST_IS_WINDOW (win)))
937 rf_helper->parent_window = GTK_WIDGET (win);
938 if (!rf_helper->account_name)
939 rf_helper->account_name =
940 modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
942 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
945 /* Get header and message. Do not free them here, the
946 reply_forward_cb must do it */
947 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW(win));
948 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(win));
949 if (!msg || !header) {
951 g_object_unref (msg);
953 g_object_unref (header);
954 g_printerr ("modest: no message found\n");
957 reply_forward_cb (NULL, header, msg, rf_helper);
959 /* Retrieve messages */
960 mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
962 modest_ui_actions_get_msgs_full_error_handler,
964 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
965 modest_mail_operation_get_msgs_full (mail_op,
969 free_reply_forward_helper);
972 g_object_unref(mail_op);
976 g_object_unref (header_list);
980 modest_ui_actions_on_reply (GtkAction *action, ModestWindow *win)
982 g_return_if_fail (MODEST_IS_WINDOW(win));
984 reply_forward (ACTION_REPLY, win);
988 modest_ui_actions_on_forward (GtkAction *action, ModestWindow *win)
990 g_return_if_fail (MODEST_IS_WINDOW(win));
992 reply_forward (ACTION_FORWARD, win);
996 modest_ui_actions_on_reply_all (GtkAction *action, ModestWindow *win)
998 g_return_if_fail (MODEST_IS_WINDOW(win));
1000 reply_forward (ACTION_REPLY_TO_ALL, win);
1004 modest_ui_actions_on_next (GtkAction *action,
1005 ModestWindow *window)
1007 if (MODEST_IS_MAIN_WINDOW (window)) {
1008 GtkWidget *header_view;
1010 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
1011 MODEST_WIDGET_TYPE_HEADER_VIEW);
1015 modest_header_view_select_next (MODEST_HEADER_VIEW(header_view));
1016 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
1017 modest_msg_view_window_select_next_message (MODEST_MSG_VIEW_WINDOW (window));
1019 g_return_if_reached ();
1024 modest_ui_actions_on_prev (GtkAction *action,
1025 ModestWindow *window)
1027 g_return_if_fail (MODEST_IS_WINDOW(window));
1029 if (MODEST_IS_MAIN_WINDOW (window)) {
1030 GtkWidget *header_view;
1031 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
1032 MODEST_WIDGET_TYPE_HEADER_VIEW);
1036 modest_header_view_select_prev (MODEST_HEADER_VIEW(header_view));
1037 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
1038 modest_msg_view_window_select_previous_message (MODEST_MSG_VIEW_WINDOW (window));
1040 g_return_if_reached ();
1045 modest_ui_actions_on_sort (GtkAction *action,
1046 ModestWindow *window)
1048 g_return_if_fail (MODEST_IS_WINDOW(window));
1050 if (MODEST_IS_MAIN_WINDOW (window)) {
1051 GtkWidget *header_view;
1052 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
1053 MODEST_WIDGET_TYPE_HEADER_VIEW);
1057 /* Show sorting dialog */
1058 modest_platform_run_sort_dialog (GTK_WINDOW (window), MODEST_SORT_HEADERS);
1063 * This function performs the send & receive required actions. The
1064 * window is used to create the mail operation. Typically it should
1065 * always be the main window, but we pass it as argument in order to
1069 modest_ui_actions_do_send_receive (const gchar *account_name, ModestWindow *win)
1071 gchar *acc_name = NULL;
1072 ModestMailOperation *mail_op;
1074 /* If no account name was provided then get the current account, and if
1075 there is no current account then pick the default one: */
1076 if (!account_name) {
1077 acc_name = g_strdup (modest_window_get_active_account(win));
1079 acc_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
1081 g_printerr ("modest: cannot get default account\n");
1085 acc_name = g_strdup (account_name);
1088 /* Set send/receive operation in progress */
1089 modest_main_window_notify_send_receive_initied (MODEST_MAIN_WINDOW(win));
1091 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(win));
1092 g_signal_connect (G_OBJECT(mail_op), "progress-changed",
1093 G_CALLBACK (_on_send_receive_progress_changed),
1096 /* Send & receive. */
1097 /* TODO: The spec wants us to first do any pending deletions, before receiving. */
1098 /* Receive and then send. The operation is tagged initially as
1099 a receive operation because the account update performs a
1100 receive and then a send. The operation changes its type
1101 internally, so the progress objects will receive the proper
1102 progress information */
1103 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
1104 modest_mail_operation_update_account (mail_op, acc_name);
1105 g_object_unref (G_OBJECT (mail_op));
1112 * Refreshes all accounts. This function will be used by automatic
1116 modest_ui_actions_do_send_receive_all (ModestWindow *win)
1118 GSList *account_names, *iter;
1120 account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr(),
1123 iter = account_names;
1125 modest_ui_actions_do_send_receive ((const char*) iter->data, win);
1126 iter = g_slist_next (iter);
1129 g_slist_foreach (account_names, (GFunc) g_free, NULL);
1130 g_slist_free (account_names);
1134 * Handler of the click on Send&Receive button in the main toolbar
1137 modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win)
1139 /* Check if accounts exist */
1140 gboolean accounts_exist =
1141 modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE);
1143 /* If not, allow the user to create an account before trying to send/receive. */
1144 if (!accounts_exist)
1145 modest_ui_actions_on_accounts (NULL, win);
1147 /* Refresh the active account */
1148 modest_ui_actions_do_send_receive (NULL, win);
1153 modest_ui_actions_toggle_header_list_view (GtkAction *action, ModestMainWindow *main_window)
1156 GtkWidget *header_view;
1158 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1160 header_view = modest_main_window_get_child_widget (main_window,
1161 MODEST_WIDGET_TYPE_HEADER_VIEW);
1165 conf = modest_runtime_get_conf ();
1167 /* what is saved/restored is depending on the style; thus; we save with
1168 * old style, then update the style, and restore for this new style
1170 modest_widget_memory_save (conf, G_OBJECT(header_view), MODEST_CONF_HEADER_VIEW_KEY);
1172 if (modest_header_view_get_style
1173 (MODEST_HEADER_VIEW(header_view)) == MODEST_HEADER_VIEW_STYLE_DETAILS)
1174 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
1175 MODEST_HEADER_VIEW_STYLE_TWOLINES);
1177 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
1178 MODEST_HEADER_VIEW_STYLE_DETAILS);
1180 modest_widget_memory_restore (conf, G_OBJECT(header_view),
1181 MODEST_CONF_HEADER_VIEW_KEY);
1186 modest_ui_actions_on_header_selected (ModestHeaderView *header_view,
1188 ModestMainWindow *main_window)
1190 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1191 g_return_if_fail (MODEST_IS_HEADER_VIEW (header_view));
1193 /* If no header has been selected then exit */
1197 /* Update Main window title */
1198 if (GTK_WIDGET_HAS_FOCUS (header_view)) {
1199 const gchar *subject = tny_header_get_subject (header);
1200 if (subject && strlen(subject) > 0)
1201 gtk_window_set_title (GTK_WINDOW (main_window), subject);
1203 gtk_window_set_title (GTK_WINDOW (main_window), _("mail_va_no_subject"));
1206 /* Update toolbar dimming state */
1207 modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
1211 modest_ui_actions_on_header_activated (ModestHeaderView *header_view,
1213 ModestMainWindow *main_window)
1217 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1222 headers = tny_simple_list_new ();
1223 tny_list_prepend (headers, G_OBJECT (header));
1225 _modest_ui_actions_open (headers, MODEST_WINDOW (main_window));
1227 g_object_unref (headers);
1231 set_active_account_from_tny_account (TnyAccount *account,
1232 ModestWindow *window)
1234 const gchar *server_acc_name = tny_account_get_id (account);
1236 /* We need the TnyAccount provided by the
1237 account store because that is the one that
1238 knows the name of the Modest account */
1239 TnyAccount *modest_server_account = modest_server_account =
1240 modest_tny_account_store_get_tny_account_by (modest_runtime_get_account_store (),
1241 MODEST_TNY_ACCOUNT_STORE_QUERY_ID,
1244 const gchar *modest_acc_name =
1245 modest_tny_account_get_parent_modest_account_name_for_server_account (modest_server_account);
1246 modest_window_set_active_account (window, modest_acc_name);
1247 g_object_unref (modest_server_account);
1252 folder_refreshed_cb (const GObject *obj,
1256 ModestMainWindow *win = NULL;
1257 GtkWidget *header_view;
1259 g_return_if_fail (TNY_IS_FOLDER (folder));
1261 win = MODEST_MAIN_WINDOW (user_data);
1263 modest_main_window_get_child_widget(win, MODEST_WIDGET_TYPE_HEADER_VIEW);
1265 /* Check if folder is empty and set headers view contents style */
1266 if (tny_folder_get_all_count (folder) == 0) {
1267 modest_main_window_set_contents_style (win,
1268 MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY);
1270 /* Restore configuration. There is no need to set the
1271 contents style to headers because it was already
1272 being done in folder_selection_changed */
1273 modest_widget_memory_restore (modest_runtime_get_conf (),
1274 G_OBJECT(header_view),
1275 MODEST_CONF_HEADER_VIEW_KEY);
1280 modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
1281 TnyFolderStore *folder_store,
1283 ModestMainWindow *main_window)
1286 GtkWidget *header_view;
1288 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1290 header_view = modest_main_window_get_child_widget(main_window,
1291 MODEST_WIDGET_TYPE_HEADER_VIEW);
1295 conf = modest_runtime_get_conf ();
1297 if (TNY_IS_ACCOUNT (folder_store)) {
1298 /* Update active account */
1299 set_active_account_from_tny_account (TNY_ACCOUNT (folder_store), MODEST_WINDOW (main_window));
1300 /* Show account details */
1301 modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS);
1303 if (TNY_IS_FOLDER (folder_store) && selected) {
1305 if (!TNY_IS_MERGE_FOLDER (folder_store)) { /* TnyMergeFolder can have no get_account() implementation. */
1306 /* Update the active account */
1307 TnyAccount *account = modest_tny_folder_get_account (TNY_FOLDER (folder_store));
1308 set_active_account_from_tny_account (account, MODEST_WINDOW (main_window));
1309 g_object_unref (account);
1312 /* Set the header view, we could change it to
1313 the empty view after the refresh */
1314 modest_main_window_set_contents_style (main_window,
1315 MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS);
1317 modest_widget_memory_save (modest_runtime_get_conf(),
1318 G_OBJECT(header_view),
1319 MODEST_CONF_HEADER_VIEW_KEY);
1321 /* Set folder on header view. This function
1322 will call tny_folder_refresh_async so we
1323 pass a callback that will be called when
1324 finished. We use that callback to set the
1325 empty view if there are no messages */
1326 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view),
1327 TNY_FOLDER (folder_store),
1328 folder_refreshed_cb,
1331 /* Update the active account */
1332 modest_window_set_active_account (MODEST_WINDOW (main_window), NULL);
1333 /* Do not show folder */
1334 modest_widget_memory_save (conf, G_OBJECT (header_view), MODEST_CONF_HEADER_VIEW_KEY);
1335 modest_header_view_clear (MODEST_HEADER_VIEW(header_view));
1339 /* Update toolbar dimming state */
1340 modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
1344 modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemType type,
1351 item = (type == MODEST_ITEM_TYPE_FOLDER) ? "folder" : "message";
1353 if (g_main_depth > 0)
1354 gdk_threads_enter ();
1355 online = tny_device_is_online (modest_runtime_get_device());
1358 /* already online -- the item is simply not there... */
1359 dialog = gtk_message_dialog_new (GTK_WINDOW (win),
1361 GTK_MESSAGE_WARNING,
1363 _("The %s you selected cannot be found"),
1365 gtk_dialog_run (GTK_DIALOG(dialog));
1367 dialog = gtk_dialog_new_with_buttons (_("Connection requested"),
1371 GTK_RESPONSE_REJECT,
1373 GTK_RESPONSE_ACCEPT,
1375 txt = g_strdup_printf (_("This %s is not available in offline mode.\n"
1376 "Do you want to get online?"), item);
1377 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1378 gtk_label_new (txt), FALSE, FALSE, 0);
1379 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1382 gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300);
1383 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
1384 // modest_platform_connect_and_wait ();
1387 gtk_widget_destroy (dialog);
1388 if (g_main_depth > 0)
1389 gdk_threads_leave ();
1393 modest_ui_actions_on_msg_link_hover (ModestMsgView *msgview, const gchar* link,
1396 /* g_message ("%s %s", __FUNCTION__, link); */
1401 modest_ui_actions_on_msg_link_clicked (ModestMsgView *msgview, const gchar* link,
1404 modest_platform_activate_uri (link);
1408 modest_ui_actions_on_msg_link_contextual (ModestMsgView *msgview, const gchar* link,
1411 modest_platform_show_uri_popup (link);
1415 modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, TnyMimePart *mime_part,
1418 modest_msg_view_window_view_attachment (MODEST_MSG_VIEW_WINDOW (win), mime_part);
1422 modest_ui_actions_on_msg_recpt_activated (ModestMsgView *msgview,
1423 const gchar *address,
1426 /* g_message ("%s %s", __FUNCTION__, address); */
1430 modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edit_window)
1432 TnyTransportAccount *transport_account;
1433 ModestMailOperation *mail_operation;
1435 gchar *account_name, *from;
1436 ModestAccountMgr *account_mgr;
1438 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
1440 data = modest_msg_edit_window_get_msg_data (edit_window);
1442 account_mgr = modest_runtime_get_account_mgr();
1443 account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
1445 account_name = modest_account_mgr_get_default_account (account_mgr);
1446 if (!account_name) {
1447 g_printerr ("modest: no account found\n");
1448 modest_msg_edit_window_free_msg_data (edit_window, data);
1452 if (!strcmp (account_name, MODEST_LOCAL_FOLDERS_ACCOUNT_ID)) {
1453 account_name = g_strdup (data->account_name);
1457 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_server_account
1458 (modest_runtime_get_account_store(),
1460 TNY_ACCOUNT_TYPE_TRANSPORT));
1461 if (!transport_account) {
1462 g_printerr ("modest: no transport account found for '%s'\n", account_name);
1463 g_free (account_name);
1464 modest_msg_edit_window_free_msg_data (edit_window, data);
1467 from = modest_account_mgr_get_from_string (account_mgr, account_name);
1469 /* Create the mail operation */
1470 mail_operation = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_INFO, G_OBJECT(edit_window));
1471 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
1473 modest_mail_operation_save_to_drafts (mail_operation,
1484 data->priority_flags);
1487 g_free (account_name);
1488 g_object_unref (G_OBJECT (transport_account));
1489 g_object_unref (G_OBJECT (mail_operation));
1491 modest_msg_edit_window_free_msg_data (edit_window, data);
1493 /* Save settings and close the window */
1494 gtk_widget_destroy (GTK_WIDGET (edit_window));
1497 /* For instance, when clicking the Send toolbar button when editing a message: */
1499 modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
1501 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
1503 if (!modest_msg_edit_window_check_names (edit_window))
1506 /* FIXME: Code added just for testing. The final version will
1507 use the send queue provided by tinymail and some
1509 ModestAccountMgr *account_mgr = modest_runtime_get_account_mgr();
1510 gchar *account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
1512 account_name = modest_account_mgr_get_default_account (account_mgr);
1514 if (!account_name) {
1515 g_printerr ("modest: no account found\n");
1519 MsgData *data = modest_msg_edit_window_get_msg_data (edit_window);
1521 if (!strcmp (account_name, MODEST_LOCAL_FOLDERS_ACCOUNT_ID)) {
1522 account_name = g_strdup (data->account_name);
1525 /* Get the currently-active transport account for this modest account: */
1526 TnyTransportAccount *transport_account =
1527 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_transport_account_for_open_connection
1528 (modest_runtime_get_account_store(),
1530 if (!transport_account) {
1531 g_printerr ("modest: no transport account found for '%s'\n", account_name);
1532 g_free (account_name);
1533 modest_msg_edit_window_free_msg_data (edit_window, data);
1537 gchar *from = modest_account_mgr_get_from_string (account_mgr, account_name);
1539 /* mail content checks and dialogs */
1540 if (data->subject == NULL || data->subject[0] == '\0') {
1541 GtkResponseType response;
1542 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (edit_window),
1543 _("mcen_nc_subject_is_empty_send"));
1544 if (response == GTK_RESPONSE_CANCEL) {
1545 g_free (account_name);
1550 if (data->plain_body == NULL || data->plain_body[0] == '\0') {
1551 GtkResponseType response;
1552 gchar *note_message;
1553 gchar *note_subject = data->subject;
1554 if (note_subject == NULL || note_subject[0] == '\0')
1555 note_subject = _("mail_va_no_subject");
1556 note_message = g_strdup_printf (_("emev_ni_ui_smtp_message_null"), note_subject);
1557 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (edit_window),
1559 g_free (note_message);
1560 if (response == GTK_RESPONSE_CANCEL) {
1561 g_free (account_name);
1566 /* Create the mail operation */
1567 ModestMailOperation *mail_operation = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_SEND, G_OBJECT(edit_window));
1568 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
1570 modest_mail_operation_send_new_mail (mail_operation,
1581 data->priority_flags);
1585 g_free (account_name);
1586 g_object_unref (G_OBJECT (transport_account));
1587 g_object_unref (G_OBJECT (mail_operation));
1589 modest_msg_edit_window_free_msg_data (edit_window, data);
1591 /* Save settings and close the window: */
1592 gtk_widget_destroy (GTK_WIDGET (edit_window));
1596 modest_ui_actions_on_toggle_bold (GtkToggleAction *action,
1597 ModestMsgEditWindow *window)
1599 ModestMsgEditFormatState *format_state = NULL;
1601 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1602 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1604 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1607 format_state = modest_msg_edit_window_get_format_state (window);
1608 g_return_if_fail (format_state != NULL);
1610 format_state->bold = gtk_toggle_action_get_active (action);
1611 modest_msg_edit_window_set_format_state (window, format_state);
1612 g_free (format_state);
1617 modest_ui_actions_on_toggle_italics (GtkToggleAction *action,
1618 ModestMsgEditWindow *window)
1620 ModestMsgEditFormatState *format_state = NULL;
1622 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1623 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1625 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1628 format_state = modest_msg_edit_window_get_format_state (window);
1629 g_return_if_fail (format_state != NULL);
1631 format_state->italics = gtk_toggle_action_get_active (action);
1632 modest_msg_edit_window_set_format_state (window, format_state);
1633 g_free (format_state);
1638 modest_ui_actions_on_toggle_bullets (GtkToggleAction *action,
1639 ModestMsgEditWindow *window)
1641 ModestMsgEditFormatState *format_state = NULL;
1643 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1644 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1646 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1649 format_state = modest_msg_edit_window_get_format_state (window);
1650 g_return_if_fail (format_state != NULL);
1652 format_state->bullet = gtk_toggle_action_get_active (action);
1653 modest_msg_edit_window_set_format_state (window, format_state);
1654 g_free (format_state);
1659 modest_ui_actions_on_change_justify (GtkRadioAction *action,
1660 GtkRadioAction *selected,
1661 ModestMsgEditWindow *window)
1663 ModestMsgEditFormatState *format_state = NULL;
1664 GtkJustification value;
1666 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1668 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1671 value = gtk_radio_action_get_current_value (selected);
1673 format_state = modest_msg_edit_window_get_format_state (window);
1674 g_return_if_fail (format_state != NULL);
1676 format_state->justification = value;
1677 modest_msg_edit_window_set_format_state (window, format_state);
1678 g_free (format_state);
1682 modest_ui_actions_on_select_editor_color (GtkAction *action,
1683 ModestMsgEditWindow *window)
1685 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1686 g_return_if_fail (GTK_IS_ACTION (action));
1688 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1691 modest_msg_edit_window_select_color (window);
1695 modest_ui_actions_on_select_editor_background_color (GtkAction *action,
1696 ModestMsgEditWindow *window)
1698 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1699 g_return_if_fail (GTK_IS_ACTION (action));
1701 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1704 modest_msg_edit_window_select_background_color (window);
1708 modest_ui_actions_on_insert_image (GtkAction *action,
1709 ModestMsgEditWindow *window)
1711 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1712 g_return_if_fail (GTK_IS_ACTION (action));
1714 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1717 modest_msg_edit_window_insert_image (window);
1721 modest_ui_actions_on_attach_file (GtkAction *action,
1722 ModestMsgEditWindow *window)
1724 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1725 g_return_if_fail (GTK_IS_ACTION (action));
1727 modest_msg_edit_window_attach_file (window);
1731 modest_ui_actions_on_remove_attachments (GtkAction *action,
1732 ModestMsgEditWindow *window)
1734 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1735 g_return_if_fail (GTK_IS_ACTION (action));
1737 modest_msg_edit_window_remove_attachments (window, NULL);
1741 * Shows a dialog with an entry that asks for some text. The returned
1742 * value must be freed by the caller. The dialog window title will be
1746 ask_for_folder_name (GtkWindow *parent_window,
1749 GtkWidget *dialog, *entry;
1750 gchar *folder_name = NULL;
1752 /* Ask for folder name */
1753 dialog = gtk_dialog_new_with_buttons (_("New Folder Name"),
1757 GTK_RESPONSE_REJECT,
1759 GTK_RESPONSE_ACCEPT,
1761 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1762 gtk_label_new(title),
1765 entry = gtk_entry_new_with_max_length (40);
1766 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1770 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1772 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
1773 folder_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
1775 gtk_widget_destroy (dialog);
1781 modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_window)
1783 TnyFolderStore *parent_folder;
1784 GtkWidget *folder_view;
1786 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1788 folder_view = modest_main_window_get_child_widget (main_window,
1789 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1793 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1795 if (parent_folder) {
1796 gboolean finished = FALSE;
1798 gchar *folder_name = NULL, *suggested_name = NULL;
1800 /* Run the new folder dialog */
1802 result = modest_platform_run_new_folder_dialog (GTK_WINDOW (main_window),
1807 if (result == GTK_RESPONSE_REJECT) {
1810 ModestMailOperation *mail_op;
1811 TnyFolder *new_folder = NULL;
1813 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_INFO,
1814 G_OBJECT(main_window));
1815 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1817 new_folder = modest_mail_operation_create_folder (mail_op,
1819 (const gchar *) folder_name);
1821 g_object_unref (new_folder);
1824 g_object_unref (mail_op);
1826 g_free (folder_name);
1830 g_object_unref (parent_folder);
1835 modest_ui_actions_on_rename_folder (GtkAction *action,
1836 ModestMainWindow *main_window)
1838 TnyFolderStore *folder;
1839 GtkWidget *folder_view;
1840 GtkWidget *header_view;
1842 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1844 folder_view = modest_main_window_get_child_widget (main_window,
1845 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1849 header_view = modest_main_window_get_child_widget (main_window,
1850 MODEST_WIDGET_TYPE_HEADER_VIEW);
1855 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1857 if (folder && TNY_IS_FOLDER (folder)) {
1859 folder_name = ask_for_folder_name (GTK_WINDOW (main_window),
1860 _("Please enter a new name for the folder"));
1862 if (folder_name != NULL && strlen (folder_name) > 0) {
1863 ModestMailOperation *mail_op;
1865 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_INFO, G_OBJECT(main_window));
1866 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1869 modest_header_view_clear (MODEST_HEADER_VIEW (header_view));
1871 modest_mail_operation_rename_folder (mail_op,
1872 TNY_FOLDER (folder),
1873 (const gchar *) folder_name);
1875 g_object_unref (mail_op);
1876 g_free (folder_name);
1878 g_object_unref (folder);
1883 modest_ui_actions_delete_folder_error_handler (ModestMailOperation *mail_op,
1886 GObject *win = modest_mail_operation_get_source (mail_op);
1888 modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL,
1889 _("mail_in_ui_folder_delete_error"));
1893 delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
1895 TnyFolderStore *folder;
1896 GtkWidget *folder_view;
1900 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1902 folder_view = modest_main_window_get_child_widget (main_window,
1903 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1907 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
1909 /* Show an error if it's an account */
1910 if (!TNY_IS_FOLDER (folder)) {
1911 modest_platform_run_information_dialog (GTK_WINDOW (main_window),
1912 _("mail_in_ui_folder_delete_error"));
1917 message = g_strdup_printf (_("mcen_nc_delete_folder_text"),
1918 tny_folder_get_name (TNY_FOLDER (folder)));
1919 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (main_window),
1920 (const gchar *) message);
1923 if (response == GTK_RESPONSE_OK) {
1924 ModestMailOperation *mail_op =
1925 modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_DELETE,
1926 G_OBJECT(main_window),
1927 modest_ui_actions_delete_folder_error_handler,
1930 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1932 modest_mail_operation_remove_folder (mail_op, TNY_FOLDER (folder), move_to_trash);
1933 g_object_unref (G_OBJECT (mail_op));
1936 g_object_unref (G_OBJECT (folder));
1940 modest_ui_actions_on_delete_folder (GtkAction *action,
1941 ModestMainWindow *main_window)
1943 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1945 delete_folder (main_window, FALSE);
1949 modest_ui_actions_on_move_folder_to_trash_folder (GtkAction *action, ModestMainWindow *main_window)
1951 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1953 delete_folder (main_window, TRUE);
1957 modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
1958 const gchar* server_account_name,
1963 ModestMainWindow *main_window)
1965 g_return_if_fail(server_account_name);
1966 /* printf("DEBUG: %s: server_account_name=%s\n", __FUNCTION__, server_account_name); */
1968 /* Initalize output parameters: */
1975 #ifdef MODEST_PLATFORM_MAEMO
1976 /* Maemo uses a different (awkward) button order,
1977 * It should probably just use gtk_alternative_dialog_button_order ().
1979 GtkWidget *dialog = gtk_dialog_new_with_buttons (_("mail_ti_password_protected"),
1983 GTK_RESPONSE_ACCEPT,
1985 GTK_RESPONSE_REJECT,
1988 GtkWidget *dialog = gtk_dialog_new_with_buttons (_("mail_ti_password_protected"),
1992 GTK_RESPONSE_REJECT,
1994 GTK_RESPONSE_ACCEPT,
1996 #endif /* MODEST_PLATFORM_MAEMO */
1998 gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(main_window));
2000 gchar *server_name = modest_server_account_get_hostname (
2001 modest_runtime_get_account_mgr(), server_account_name);
2002 if (!server_name) {/* This happened once, though I don't know why. murrayc. */
2003 g_warning("%s: Could not get server name for server account '%s'", __FUNCTION__, server_account_name);
2008 /* This causes a warning because the logical ID has no %s in it,
2009 * though the translation does, but there is not much we can do about that: */
2010 gchar *txt = g_strdup_printf (_("mail_ia_password_info"), server_name);
2011 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt),
2014 g_free (server_name);
2018 gchar *initial_username = modest_server_account_get_username (
2019 modest_runtime_get_account_mgr(), server_account_name);
2021 GtkWidget *entry_username = gtk_entry_new ();
2022 if (initial_username)
2023 gtk_entry_set_text (GTK_ENTRY (entry_username), initial_username);
2024 /* Dim this if a connection has ever succeeded with this username,
2025 * as per the UI spec: */
2026 const gboolean username_known =
2027 modest_server_account_get_username_has_succeeded(
2028 modest_runtime_get_account_mgr(), server_account_name);
2029 gtk_widget_set_sensitive (entry_username, !username_known);
2031 #ifdef MODEST_PLATFORM_MAEMO
2032 /* Auto-capitalization is the default, so let's turn it off: */
2033 hildon_gtk_entry_set_input_mode (GTK_ENTRY (entry_username), HILDON_GTK_INPUT_MODE_FULL);
2035 /* Create a size group to be used by all captions.
2036 * Note that HildonCaption does not create a default size group if we do not specify one.
2037 * We use GTK_SIZE_GROUP_HORIZONTAL, so that the widths are the same. */
2038 GtkSizeGroup *sizegroup = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
2040 GtkWidget *caption = hildon_caption_new (sizegroup,
2041 _("mail_fi_username"), entry_username, NULL, HILDON_CAPTION_MANDATORY);
2042 gtk_widget_show (entry_username);
2043 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), caption,
2044 FALSE, FALSE, MODEST_MARGIN_HALF);
2045 gtk_widget_show (caption);
2047 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry_username,
2049 #endif /* MODEST_PLATFORM_MAEMO */
2052 GtkWidget *entry_password = gtk_entry_new ();
2053 gtk_entry_set_visibility (GTK_ENTRY(entry_password), FALSE);
2054 /* gtk_entry_set_invisible_char (GTK_ENTRY(entry_password), "*"); */
2056 #ifdef MODEST_PLATFORM_MAEMO
2057 /* Auto-capitalization is the default, so let's turn it off: */
2058 hildon_gtk_entry_set_input_mode (GTK_ENTRY (entry_password),
2059 HILDON_GTK_INPUT_MODE_FULL | HILDON_GTK_INPUT_MODE_INVISIBLE);
2061 caption = hildon_caption_new (sizegroup,
2062 _("mail_fi_password"), entry_password, NULL, HILDON_CAPTION_MANDATORY);
2063 gtk_widget_show (entry_password);
2064 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), caption,
2065 FALSE, FALSE, MODEST_MARGIN_HALF);
2066 gtk_widget_show (caption);
2067 g_object_unref (sizegroup);
2069 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry_password,
2071 #endif /* MODEST_PLATFORM_MAEMO */
2073 /* This is not in the Maemo UI spec:
2074 remember_pass_check = gtk_check_button_new_with_label (_("Remember password"));
2075 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check,
2079 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
2081 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
2083 *username = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry_username)));
2085 modest_server_account_set_username (
2086 modest_runtime_get_account_mgr(), server_account_name,
2089 const gboolean username_was_changed =
2090 (strcmp (*username, initial_username) != 0);
2091 if (username_was_changed) {
2092 /* To actually use a changed username,
2093 * we must reset the connection, according to pvanhoof.
2094 * This _might_ be a sensible way to do that: */
2095 TnyDevice *device = modest_runtime_get_device();
2096 tny_device_force_offline (device);
2097 tny_device_force_online (device);
2102 *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry_password)));
2104 /* We do not save the password in the configuration,
2105 * because this function is only called for passwords that should
2106 * not be remembered:
2107 modest_server_account_set_password (
2108 modest_runtime_get_account_mgr(), server_account_name,
2127 /* This is not in the Maemo UI spec:
2128 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check)))
2134 gtk_widget_destroy (dialog);
2136 /* printf ("DEBUG: %s: cancel=%d\n", __FUNCTION__, *cancel); */
2140 modest_ui_actions_on_cut (GtkAction *action,
2141 ModestWindow *window)
2143 GtkWidget *focused_widget;
2145 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
2146 if (GTK_IS_EDITABLE (focused_widget)) {
2147 gtk_editable_cut_clipboard (GTK_EDITABLE(focused_widget));
2148 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
2149 GtkTextBuffer *buffer;
2150 GtkClipboard *clipboard;
2152 clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
2153 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
2154 gtk_text_buffer_cut_clipboard (buffer, clipboard, TRUE);
2159 modest_ui_actions_on_copy (GtkAction *action,
2160 ModestWindow *window)
2162 GtkClipboard *clipboard;
2163 GtkWidget *focused_widget;
2165 clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
2166 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
2167 if (GTK_IS_LABEL (focused_widget)) {
2168 gtk_clipboard_set_text (clipboard, gtk_label_get_text (GTK_LABEL (focused_widget)), -1);
2169 } else if (GTK_IS_EDITABLE (focused_widget)) {
2170 gtk_editable_copy_clipboard (GTK_EDITABLE(focused_widget));
2171 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
2172 GtkTextBuffer *buffer;
2174 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
2175 gtk_text_buffer_copy_clipboard (buffer, clipboard);
2180 modest_ui_actions_on_undo (GtkAction *action,
2181 ModestWindow *window)
2183 if (MODEST_IS_MSG_EDIT_WINDOW (window)) {
2184 modest_msg_edit_window_undo (MODEST_MSG_EDIT_WINDOW (window));
2186 g_return_if_reached ();
2191 modest_ui_actions_on_paste (GtkAction *action,
2192 ModestWindow *window)
2194 GtkWidget *focused_widget;
2196 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
2197 if (GTK_IS_EDITABLE (focused_widget)) {
2198 gtk_editable_paste_clipboard (GTK_EDITABLE(focused_widget));
2199 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
2200 GtkTextBuffer *buffer;
2201 GtkClipboard *clipboard;
2203 clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
2204 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
2205 gtk_text_buffer_paste_clipboard (buffer, clipboard, NULL, TRUE);
2210 modest_ui_actions_on_select_all (GtkAction *action,
2211 ModestWindow *window)
2213 GtkWidget *focused_widget;
2215 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
2216 if (MODEST_IS_ATTACHMENTS_VIEW (focused_widget)) {
2217 modest_attachments_view_select_all (MODEST_ATTACHMENTS_VIEW (focused_widget));
2218 } else if (GTK_IS_LABEL (focused_widget)) {
2219 gtk_label_select_region (GTK_LABEL (focused_widget), 0, -1);
2220 } else if (GTK_IS_EDITABLE (focused_widget)) {
2221 gtk_editable_select_region (GTK_EDITABLE(focused_widget), 0, -1);
2222 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
2223 GtkTextBuffer *buffer;
2224 GtkTextIter start, end;
2226 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
2227 gtk_text_buffer_get_start_iter (buffer, &start);
2228 gtk_text_buffer_get_end_iter (buffer, &end);
2229 gtk_text_buffer_select_range (buffer, &start, &end);
2231 else if ((MODEST_IS_FOLDER_VIEW (focused_widget)) ||
2232 (MODEST_IS_HEADER_VIEW (focused_widget))) {
2234 GtkTreeSelection *selection = NULL;
2236 /* Get header view */
2237 GtkWidget *header_view = focused_widget;
2238 if (MODEST_IS_FOLDER_VIEW (focused_widget))
2239 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (window),
2240 MODEST_WIDGET_TYPE_HEADER_VIEW);
2242 /* Select all messages */
2243 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view));
2244 gtk_tree_selection_select_all (selection);
2249 modest_ui_actions_on_mark_as_read (GtkAction *action,
2250 ModestWindow *window)
2252 g_return_if_fail (MODEST_IS_WINDOW(window));
2254 /* Mark each header as read */
2255 do_headers_action (window, headers_action_mark_as_read, NULL);
2259 modest_ui_actions_on_mark_as_unread (GtkAction *action,
2260 ModestWindow *window)
2262 g_return_if_fail (MODEST_IS_WINDOW(window));
2264 /* Mark each header as read */
2265 do_headers_action (window, headers_action_mark_as_unread, NULL);
2269 modest_ui_actions_on_change_zoom (GtkRadioAction *action,
2270 GtkRadioAction *selected,
2271 ModestWindow *window)
2275 value = gtk_radio_action_get_current_value (selected);
2276 if (MODEST_IS_WINDOW (window)) {
2277 modest_window_set_zoom (MODEST_WINDOW (window), ((gdouble)value)/100);
2281 void modest_ui_actions_msg_edit_on_change_priority (GtkRadioAction *action,
2282 GtkRadioAction *selected,
2283 ModestWindow *window)
2285 TnyHeaderFlags flags;
2286 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2288 flags = gtk_radio_action_get_current_value (selected);
2289 modest_msg_edit_window_set_priority_flags (MODEST_MSG_EDIT_WINDOW (window), flags);
2292 void modest_ui_actions_msg_edit_on_change_file_format (GtkRadioAction *action,
2293 GtkRadioAction *selected,
2294 ModestWindow *window)
2298 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2300 file_format = gtk_radio_action_get_current_value (selected);
2301 modest_msg_edit_window_set_file_format (MODEST_MSG_EDIT_WINDOW (window), file_format);
2306 modest_ui_actions_on_zoom_plus (GtkAction *action,
2307 ModestWindow *window)
2309 g_return_if_fail (MODEST_IS_WINDOW (window));
2311 modest_window_zoom_plus (MODEST_WINDOW (window));
2315 modest_ui_actions_on_zoom_minus (GtkAction *action,
2316 ModestWindow *window)
2318 g_return_if_fail (MODEST_IS_WINDOW (window));
2320 modest_window_zoom_minus (MODEST_WINDOW (window));
2324 modest_ui_actions_on_toggle_fullscreen (GtkToggleAction *toggle,
2325 ModestWindow *window)
2327 ModestWindowMgr *mgr;
2328 gboolean fullscreen, active;
2329 g_return_if_fail (MODEST_IS_WINDOW (window));
2331 mgr = modest_runtime_get_window_mgr ();
2333 active = (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle)))?1:0;
2334 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
2336 if (active != fullscreen) {
2337 modest_window_mgr_set_fullscreen_mode (mgr, active);
2338 gtk_window_present (GTK_WINDOW (window));
2343 modest_ui_actions_on_change_fullscreen (GtkAction *action,
2344 ModestWindow *window)
2346 ModestWindowMgr *mgr;
2347 gboolean fullscreen;
2349 g_return_if_fail (MODEST_IS_WINDOW (window));
2351 mgr = modest_runtime_get_window_mgr ();
2352 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
2353 modest_window_mgr_set_fullscreen_mode (mgr, !fullscreen);
2355 gtk_window_present (GTK_WINDOW (window));
2359 * Used by modest_ui_actions_on_details to call do_headers_action
2362 headers_action_show_details (TnyHeader *header,
2363 ModestWindow *window,
2370 dialog = modest_details_dialog_new_with_header (GTK_WINDOW (window), header);
2373 gtk_widget_show_all (dialog);
2374 gtk_dialog_run (GTK_DIALOG (dialog));
2376 gtk_widget_destroy (dialog);
2380 * Show the folder details in a ModestDetailsDialog widget
2383 show_folder_details (TnyFolder *folder,
2389 dialog = modest_details_dialog_new_with_folder (window, folder);
2392 gtk_widget_show_all (dialog);
2393 gtk_dialog_run (GTK_DIALOG (dialog));
2395 gtk_widget_destroy (dialog);
2399 * Show the header details in a ModestDetailsDialog widget
2402 modest_ui_actions_on_details (GtkAction *action,
2405 TnyList * headers_list;
2409 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2412 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2415 g_object_unref (msg);
2417 headers_list = get_selected_headers (win);
2421 iter = tny_list_create_iterator (headers_list);
2423 header = TNY_HEADER (tny_iterator_get_current (iter));
2424 headers_action_show_details (header, win, NULL);
2425 g_object_unref (header);
2427 g_object_unref (iter);
2428 g_object_unref (headers_list);
2430 } else if (MODEST_IS_MAIN_WINDOW (win)) {
2431 GtkWidget *folder_view, *header_view;
2433 /* Check which widget has the focus */
2434 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2435 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2436 if (gtk_widget_is_focus (folder_view)) {
2439 folder = (TnyFolder *) modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
2441 /* Show only when it's a folder */
2442 if (!folder || !TNY_IS_FOLDER (folder))
2445 show_folder_details (folder, GTK_WINDOW (win));
2448 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2449 MODEST_WIDGET_TYPE_HEADER_VIEW);
2450 /* Show details of each header */
2451 do_headers_action (win, headers_action_show_details, header_view);
2457 modest_ui_actions_on_toggle_show_cc (GtkToggleAction *toggle,
2458 ModestMsgEditWindow *window)
2460 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2462 modest_msg_edit_window_show_cc (window, gtk_toggle_action_get_active (toggle));
2466 modest_ui_actions_on_toggle_show_bcc (GtkToggleAction *toggle,
2467 ModestMsgEditWindow *window)
2469 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2471 modest_msg_edit_window_show_bcc (window, gtk_toggle_action_get_active (toggle));
2475 modest_ui_actions_toggle_folders_view (GtkAction *action,
2476 ModestMainWindow *main_window)
2480 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
2482 conf = modest_runtime_get_conf ();
2484 if (modest_main_window_get_style (main_window) == MODEST_MAIN_WINDOW_STYLE_SPLIT)
2485 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SIMPLE);
2487 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SPLIT);
2491 modest_ui_actions_on_toggle_toolbar (GtkToggleAction *toggle,
2492 ModestWindow *window)
2494 gboolean active, fullscreen = FALSE;
2495 ModestWindowMgr *mgr;
2497 active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle));
2499 /* Check if we want to toggle the toolbar vuew in fullscreen
2501 if (!strcmp (gtk_action_get_name (GTK_ACTION (toggle)),
2502 "ViewShowToolbarFullScreen")) {
2506 /* Toggle toolbar */
2507 mgr = modest_runtime_get_window_mgr ();
2508 modest_window_mgr_show_toolbars (mgr, active, fullscreen);
2512 modest_ui_actions_msg_edit_on_select_font (GtkAction *action,
2513 ModestMsgEditWindow *window)
2515 modest_msg_edit_window_select_font (window);
2519 modest_ui_actions_on_folder_display_name_changed (ModestFolderView *folder_view,
2520 const gchar *display_name,
2523 /* Do not change the application name if the widget has not
2524 the focus. This callback could be called even if the folder
2525 view has not the focus, because the handled signal could be
2526 emitted when the folder view is redrawn */
2527 if (gtk_widget_is_focus (GTK_WIDGET (folder_view))) {
2529 gtk_window_set_title (window, display_name);
2531 gtk_window_set_title (window, " ");
2536 modest_ui_actions_on_select_contacts (GtkAction *action, ModestMsgEditWindow *window)
2538 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2539 modest_msg_edit_window_select_contacts (window);
2543 modest_ui_actions_on_check_names (GtkAction *action, ModestMsgEditWindow *window)
2545 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2546 modest_msg_edit_window_check_names (window);
2551 create_move_to_dialog (ModestWindow *win,
2552 GtkWidget *folder_view,
2553 GtkWidget **tree_view)
2555 GtkWidget *dialog, *scroll;
2557 dialog = gtk_dialog_new_with_buttons (_("mcen_ti_moveto_folders_title"),
2559 GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR | GTK_DIALOG_DESTROY_WITH_PARENT,
2561 GTK_RESPONSE_ACCEPT,
2563 GTK_RESPONSE_REJECT,
2566 /* Create scrolled window */
2567 scroll = gtk_scrolled_window_new (NULL, NULL);
2568 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
2569 GTK_POLICY_AUTOMATIC,
2570 GTK_POLICY_AUTOMATIC);
2572 /* Create folder view */
2573 *tree_view = modest_folder_view_new (NULL);
2575 /* It could happen that we're trying to move a message from a
2576 window (msg window for example) after the main window was
2577 closed, so we can not just get the model of the folder
2579 if (MODEST_IS_FOLDER_VIEW (folder_view))
2580 gtk_tree_view_set_model (GTK_TREE_VIEW (*tree_view),
2581 gtk_tree_view_get_model (GTK_TREE_VIEW (folder_view)));
2583 modest_folder_view_update_model (MODEST_FOLDER_VIEW (*tree_view),
2584 TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()));
2586 gtk_container_add (GTK_CONTAINER (scroll), *tree_view);
2588 /* Add scroll to dialog */
2589 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
2590 scroll, FALSE, FALSE, 0);
2592 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
2598 * Returns TRUE if at least one of the headers of the list belongs to
2599 * a message that has been fully retrieved.
2602 has_retrieved_msgs (TnyList *list)
2605 gboolean found = FALSE;
2607 iter = tny_list_create_iterator (list);
2608 while (tny_iterator_is_done (iter) && !found) {
2610 TnyHeaderFlags flags;
2612 header = TNY_HEADER (tny_iterator_get_current (iter));
2613 flags = tny_header_get_flags (header);
2614 if (!(flags & TNY_HEADER_FLAG_PARTIAL))
2618 tny_iterator_next (iter);
2620 g_object_unref (iter);
2626 * Shows a confirmation dialog to the user when we're moving messages
2627 * from a remote server to the local storage. Returns the dialog
2628 * response. If it's other kind of movement the it always returns
2632 msgs_move_to_confirmation (GtkWindow *win,
2633 TnyFolder *dest_folder,
2636 gint response = GTK_RESPONSE_OK;
2638 /* If the destination is a local folder */
2639 if (modest_tny_folder_is_local_folder (dest_folder)) {
2640 TnyFolder *src_folder;
2644 /* Get source folder */
2645 iter = tny_list_create_iterator (headers);
2646 header = TNY_HEADER (tny_iterator_get_current (iter));
2647 src_folder = tny_header_get_folder (header);
2648 g_object_unref (header);
2649 g_object_unref (iter);
2651 /* If the source is a remote folder */
2652 if (!modest_tny_folder_is_local_folder (src_folder)) {
2653 const gchar *message;
2655 if (tny_list_get_length (headers) == 1)
2656 if (has_retrieved_msgs (headers))
2657 message = _("mcen_nc_move_retrieve");
2659 message = _("mcen_nc_move_header");
2661 if (has_retrieved_msgs (headers))
2662 message = _("mcen_nc_move_retrieves");
2664 message = _("mcen_nc_move_headers");
2666 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
2667 (const gchar *) message);
2669 g_object_unref (src_folder);
2676 tranasfer_msgs_from_viewer_cb (const GObject *object, gpointer user_data)
2678 ModestMsgViewWindow *self = NULL;
2679 gboolean found = FALSE;
2681 g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (object));
2682 self = MODEST_MSG_VIEW_WINDOW (object);
2684 found = modest_msg_view_window_select_first_message (self);
2685 g_return_if_fail (found);
2689 modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op,
2692 GObject *win = modest_mail_operation_get_source (mail_op);
2694 /* TODO: show error message */
2695 modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL,
2696 _("mail_in_ui_folder_move_target_error"));
2700 * UI handler for the "Move to" action when invoked from the
2704 modest_ui_actions_on_main_window_move_to (GtkAction *action,
2705 ModestMainWindow *win)
2707 GtkWidget *dialog = NULL, *folder_view = NULL, *tree_view = NULL;
2708 GtkWidget *header_view = NULL;
2710 TnyFolderStore *folder_store = NULL;
2711 ModestMailOperation *mail_op = NULL;
2713 g_return_if_fail (MODEST_IS_MAIN_WINDOW (win));
2715 /* Get the folder view */
2716 folder_view = modest_main_window_get_child_widget (win,
2717 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2719 /* Get header view */
2720 header_view = modest_main_window_get_child_widget (win,
2721 MODEST_WIDGET_TYPE_HEADER_VIEW);
2723 /* Create and run the dialog */
2724 dialog = create_move_to_dialog (MODEST_WINDOW (win), folder_view, &tree_view);
2725 modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (tree_view));
2726 result = gtk_dialog_run (GTK_DIALOG(dialog));
2727 g_object_ref (tree_view);
2729 /* We do this to save an indentation level ;-) */
2730 if (result != GTK_RESPONSE_ACCEPT)
2733 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (tree_view));
2735 if (TNY_IS_ACCOUNT (folder_store))
2738 /* Get folder or messages to transfer */
2739 if (gtk_widget_is_focus (folder_view)) {
2740 TnyFolderStore *src_folder;
2741 src_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
2743 /* Clean folder on header view before moving it */
2744 modest_header_view_clear (MODEST_HEADER_VIEW (header_view));
2746 if (TNY_IS_FOLDER (src_folder)) {
2748 modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
2750 modest_ui_actions_move_folder_error_handler,
2752 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
2754 modest_mail_operation_xfer_folder (mail_op,
2755 TNY_FOLDER (src_folder),
2758 /* Unref mail operation */
2759 g_object_unref (G_OBJECT (mail_op));
2763 g_object_unref (G_OBJECT (src_folder));
2765 if (gtk_widget_is_focus (header_view)) {
2769 headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (header_view));
2771 /* Ask for user confirmation */
2772 response = msgs_move_to_confirmation (GTK_WINDOW (win),
2773 TNY_FOLDER (folder_store),
2776 /* Transfer messages */
2777 if (response == GTK_RESPONSE_OK) {
2778 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(win));
2779 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
2782 modest_mail_operation_xfer_msgs (mail_op,
2784 TNY_FOLDER (folder_store),
2789 g_object_unref (G_OBJECT (mail_op));
2791 g_object_unref (headers);
2794 g_object_unref (folder_store);
2796 gtk_widget_destroy (dialog);
2801 * UI handler for the "Move to" action when invoked from the
2802 * ModestMsgViewWindow
2805 modest_ui_actions_on_msg_view_window_move_to (GtkAction *action,
2806 ModestMsgViewWindow *win)
2808 GtkWidget *dialog, *folder_view, *tree_view = NULL;
2810 ModestMainWindow *main_window;
2814 /* Get the folder view */
2815 main_window = MODEST_MAIN_WINDOW (modest_window_mgr_get_main_window (modest_runtime_get_window_mgr ()));
2817 folder_view = modest_main_window_get_child_widget (main_window,
2818 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2822 /* Create and run the dialog */
2823 dialog = create_move_to_dialog (MODEST_WINDOW (win), folder_view, &tree_view);
2824 result = gtk_dialog_run (GTK_DIALOG(dialog));
2825 g_object_ref (tree_view);
2827 if (result == GTK_RESPONSE_ACCEPT) {
2828 TnyFolderStore *folder_store;
2831 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (tree_view));
2833 /* Create header list */
2834 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
2835 headers = tny_simple_list_new ();
2836 tny_list_prepend (headers, G_OBJECT (header));
2837 g_object_unref (header);
2839 /* Ask user for confirmation. MSG-NOT404 */
2840 response = msgs_move_to_confirmation (GTK_WINDOW (win),
2841 TNY_FOLDER (folder_store),
2844 /* Transfer current msg */
2845 if (response == GTK_RESPONSE_OK) {
2846 ModestMailOperation *mail_op;
2848 /* Create mail op */
2849 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(win));
2850 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
2853 /* Transfer messages */
2854 modest_mail_operation_xfer_msgs (mail_op,
2856 TNY_FOLDER (folder_store),
2858 tranasfer_msgs_from_viewer_cb,
2860 g_object_unref (G_OBJECT (mail_op));
2862 g_object_unref (headers);
2863 g_object_unref (folder_store);
2865 gtk_widget_destroy (dialog);
2869 modest_ui_actions_on_move_to (GtkAction *action,
2872 g_return_if_fail (MODEST_IS_MAIN_WINDOW (win) ||
2873 MODEST_IS_MSG_VIEW_WINDOW (win));
2875 if (MODEST_IS_MAIN_WINDOW (win))
2876 modest_ui_actions_on_main_window_move_to (action,
2877 MODEST_MAIN_WINDOW (win));
2879 modest_ui_actions_on_msg_view_window_move_to (action,
2880 MODEST_MSG_VIEW_WINDOW (win));
2884 * Calls #HeadersFunc for each header already selected in the main
2885 * window or the message currently being shown in the msg view window
2888 do_headers_action (ModestWindow *win,
2892 TnyList *headers_list;
2896 headers_list = get_selected_headers (win);
2900 /* Call the function for each header */
2901 iter = tny_list_create_iterator (headers_list);
2902 while (!tny_iterator_is_done (iter)) {
2905 header = TNY_HEADER (tny_iterator_get_current (iter));
2906 func (header, win, user_data);
2907 g_object_unref (header);
2908 tny_iterator_next (iter);
2910 g_object_unref (iter);
2911 g_object_unref (headers_list);
2915 modest_ui_actions_view_attachment (GtkAction *action,
2916 ModestWindow *window)
2918 if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
2919 modest_msg_view_window_view_attachment (MODEST_MSG_VIEW_WINDOW (window), NULL);
2921 /* not supported window for this action */
2922 g_return_if_reached ();
2927 modest_ui_actions_save_attachments (GtkAction *action,
2928 ModestWindow *window)
2930 if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
2931 modest_msg_view_window_save_attachments (MODEST_MSG_VIEW_WINDOW (window), NULL);
2933 /* not supported window for this action */
2934 g_return_if_reached ();
2939 modest_ui_actions_remove_attachments (GtkAction *action,
2940 ModestWindow *window)
2942 if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
2943 modest_msg_view_window_remove_attachments (MODEST_MSG_VIEW_WINDOW (window), NULL);
2945 /* not supported window for this action */
2946 g_return_if_reached ();
2951 modest_ui_actions_on_settings (GtkAction *action,
2956 dialog = modest_platform_get_global_settings_dialog ();
2957 gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (win));
2958 gtk_widget_show (dialog);
2960 gtk_dialog_run (GTK_DIALOG (dialog));
2962 gtk_widget_destroy (dialog);
2966 modest_ui_actions_on_help (GtkAction *action,
2969 const gchar *help_id = NULL;
2971 if (MODEST_IS_MAIN_WINDOW (win)) {
2972 const gchar *action_name;
2973 action_name = gtk_action_get_name (action);
2975 if (!strcmp (action_name, "FolderViewCSMHelp") ||
2976 !strcmp (action_name, "HeaderViewCSMHelp")) {
2977 GtkWidget *folder_view;
2978 TnyFolderStore *folder_store;
2979 /* Get selected folder */
2980 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2981 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2982 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
2984 /* Switch help_id */
2985 if (TNY_IS_FOLDER (folder_store)) {
2986 switch (tny_folder_get_folder_type (TNY_FOLDER (folder_store))) {
2987 case TNY_FOLDER_TYPE_NORMAL:
2988 help_id = "applications_email_userfolder";
2990 case TNY_FOLDER_TYPE_INBOX:
2991 help_id = "applications_email_inbox";
2993 case TNY_FOLDER_TYPE_OUTBOX:
2994 help_id = "applications_email_outbox";
2996 case TNY_FOLDER_TYPE_SENT:
2997 help_id = "applications_email_sent";
2999 case TNY_FOLDER_TYPE_DRAFTS:
3000 help_id = "applications_email_drafts";
3002 case TNY_FOLDER_TYPE_ARCHIVE:
3003 help_id = "applications_email_archive";
3010 help_id = "applications_email_mainview";
3012 } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
3013 help_id = "applications_email_viewer";
3014 } else if (MODEST_IS_MSG_EDIT_WINDOW (win))
3015 help_id = "applications_email_editor";
3017 modest_platform_show_help (GTK_WINDOW (win), help_id);
3021 modest_ui_actions_on_retrieve_msg_contents (GtkAction *action,
3022 ModestWindow *window)
3024 ModestMailOperation *mail_op;
3028 headers = get_selected_headers (window);
3032 /* Create mail operation */
3033 mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
3035 modest_ui_actions_get_msgs_full_error_handler,
3037 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
3038 modest_mail_operation_get_msgs_full (mail_op, headers, NULL, NULL, NULL);
3041 g_object_unref (headers);
3042 g_object_unref (mail_op);
3046 modest_ui_actions_on_email_menu_activated (GtkAction *action,
3047 ModestWindow *window)
3049 g_return_if_fail (MODEST_IS_WINDOW (window));
3052 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3056 modest_ui_actions_on_edit_menu_activated (GtkAction *action,
3057 ModestWindow *window)
3059 g_return_if_fail (MODEST_IS_WINDOW (window));
3062 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3066 modest_ui_actions_on_view_menu_activated (GtkAction *action,
3067 ModestWindow *window)
3069 g_return_if_fail (MODEST_IS_WINDOW (window));
3072 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3076 modest_ui_actions_on_tools_menu_activated (GtkAction *action,
3077 ModestWindow *window)
3079 g_return_if_fail (MODEST_IS_WINDOW (window));
3082 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3086 modest_ui_actions_on_attachment_menu_activated (GtkAction *action,
3087 ModestWindow *window)
3089 g_return_if_fail (MODEST_IS_WINDOW (window));
3092 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3096 modest_ui_actions_on_toolbar_csm_menu_activated (GtkAction *action,
3097 ModestWindow *window)
3099 g_return_if_fail (MODEST_IS_WINDOW (window));
3102 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3106 modest_ui_actions_on_folder_view_csm_menu_activated (GtkAction *action,
3107 ModestWindow *window)
3109 g_return_if_fail (MODEST_IS_WINDOW (window));
3112 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3116 modest_ui_actions_on_header_view_csm_menu_activated (GtkAction *action,
3117 ModestWindow *window)
3119 g_return_if_fail (MODEST_IS_WINDOW (window));
3122 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3126 modest_ui_actions_check_toolbar_dimming_rules (ModestWindow *window)
3128 g_return_if_fail (MODEST_IS_WINDOW (window));
3131 modest_window_check_dimming_rules_group (window, "ModestToolbarDimmingRules");
3135 modest_ui_actions_on_search_messages (GtkAction *action, ModestWindow *window)
3137 g_return_if_fail (MODEST_IS_WINDOW (window));
3139 modest_platform_show_search_messages (GTK_WINDOW (window));
3143 modest_ui_actions_on_open_addressbook (GtkAction *action, ModestWindow *win)
3145 g_return_if_fail (MODEST_IS_WINDOW (win));
3146 modest_platform_show_addressbook (GTK_WINDOW (win));
3151 modest_ui_actions_on_toggle_find_in_page (GtkToggleAction *action,
3152 ModestWindow *window)
3154 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
3156 modest_msg_edit_window_toggle_find_toolbar (MODEST_MSG_EDIT_WINDOW (window), gtk_toggle_action_get_active (action));
3160 _on_send_receive_progress_changed (ModestMailOperation *mail_op,
3161 ModestMailOperationState *state,
3164 g_return_if_fail (MODEST_IS_MAIN_WINDOW(user_data));
3166 /* Set send/receive operation finished */
3167 if (state->status != MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS)
3168 modest_main_window_notify_send_receive_completed (MODEST_MAIN_WINDOW(user_data));