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 modest_ui_actions_on_about (GtkAction *action, ModestWindow *win)
135 const gchar *authors[] = {
136 "Dirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>",
139 about = gtk_about_dialog_new ();
140 gtk_about_dialog_set_name (GTK_ABOUT_DIALOG(about), PACKAGE_NAME);
141 gtk_about_dialog_set_version (GTK_ABOUT_DIALOG(about),PACKAGE_VERSION);
142 gtk_about_dialog_set_copyright (GTK_ABOUT_DIALOG(about),
143 _("Copyright (c) 2006, Nokia Corporation\n"
144 "All rights reserved."));
145 gtk_about_dialog_set_comments (GTK_ABOUT_DIALOG(about),
146 _("a modest e-mail client\n\n"
147 "design and implementation: Dirk-Jan C. Binnema\n"
148 "contributions from the fine people at KC and Ig\n"
149 "uses the tinymail email framework written by Philip van Hoof"));
150 gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG(about), authors);
151 gtk_about_dialog_set_website (GTK_ABOUT_DIALOG(about), "http://modest.garage.maemo.org");
153 gtk_dialog_run (GTK_DIALOG (about));
154 gtk_widget_destroy(about);
158 * Gets the list of currently selected messages. If the win is the
159 * main window, then it returns a newly allocated list of the headers
160 * selected in the header view. If win is the msg view window, then
161 * the value returned is a list with just a single header.
163 * The caller of this funcion must free the list.
166 get_selected_headers (ModestWindow *win)
168 if (MODEST_IS_MAIN_WINDOW(win)) {
169 GtkWidget *header_view;
171 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
172 MODEST_WIDGET_TYPE_HEADER_VIEW);
173 return modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
175 } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
176 /* for MsgViewWindows, we simply return a list with one element */
178 TnyList *list = NULL;
180 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
181 if (header != NULL) {
182 list = tny_simple_list_new ();
183 tny_list_prepend (list, G_OBJECT(header));
184 g_object_unref (G_OBJECT(header));
194 headers_action_mark_as_read (TnyHeader *header,
198 TnyHeaderFlags flags;
200 g_return_if_fail (TNY_IS_HEADER(header));
202 flags = tny_header_get_flags (header);
203 if (flags & TNY_HEADER_FLAG_SEEN) return;
204 tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN);
208 headers_action_mark_as_unread (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) {
218 tny_header_unset_flags (header, TNY_HEADER_FLAG_SEEN);
224 headers_action_delete (TnyHeader *header,
228 ModestMailOperation *mail_op = NULL;
230 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_DELETE, G_OBJECT(win));
231 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
234 /* Always delete. TODO: Move to trash still not supported */
235 modest_mail_operation_remove_msg (mail_op, header, FALSE);
236 g_object_unref (G_OBJECT (mail_op));
240 modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win)
242 TnyList *header_list = NULL;
243 TnyIterator *iter = NULL;
244 TnyHeader *header = NULL;
245 gchar *message = NULL;
249 ModestWindowMgr *mgr;
251 g_return_if_fail (MODEST_IS_WINDOW(win));
253 header_list = get_selected_headers (win);
254 if (!header_list) return;
256 /* Check if any of the headers is already opened */
257 iter = tny_list_create_iterator (header_list);
259 mgr = modest_runtime_get_window_mgr ();
260 while (!tny_iterator_is_done (iter) && !found) {
261 header = TNY_HEADER (tny_iterator_get_current (iter));
262 if (modest_window_mgr_find_window_by_header (mgr, header))
264 g_object_unref (header);
265 tny_iterator_next (iter);
267 g_object_unref (iter);
272 num = g_strdup_printf ("%d", tny_list_get_length (header_list));
273 msg = g_strdup_printf (_("mcen_nc_unable_to_delete_n_messages"), num);
275 modest_platform_run_information_dialog (GTK_WINDOW (win), (const gchar *) msg);
279 g_object_unref (header_list);
284 if (tny_list_get_length(header_list) > 1)
285 message = g_strdup(_("emev_nc_delete_messages"));
287 iter = tny_list_create_iterator (header_list);
288 header = TNY_HEADER (tny_iterator_get_current (iter));
289 desc = g_strdup_printf ("%s", tny_header_get_subject (header));
290 message = g_strdup_printf(_("emev_nc_delete_message"), desc);
291 g_object_unref (header);
292 g_object_unref (iter);
295 /* Confirmation dialog */
296 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
300 if (response == GTK_RESPONSE_OK) {
301 if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
303 g_signal_emit_by_name (G_OBJECT (win), "delete-event", NULL, &ret_value);
307 /* Remove each header */
308 do_headers_action (win, headers_action_delete, NULL);
310 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
311 gtk_widget_destroy (GTK_WIDGET(win));
318 g_object_unref (header_list);
323 modest_ui_actions_on_quit (GtkAction *action, ModestWindow *win)
325 #ifdef MODEST_PLATFORM_MAEMO
326 modest_osso_save_state();
327 #endif /* MODEST_PLATFORM_MAEMO */
333 modest_ui_actions_on_close_window (GtkAction *action, ModestWindow *win)
335 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
336 gtk_widget_destroy (GTK_WIDGET (win));
337 } else if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
339 g_signal_emit_by_name (G_OBJECT (win), "delete-event", NULL, &ret_value);
340 } else if (MODEST_IS_WINDOW (win)) {
341 gtk_widget_destroy (GTK_WIDGET (win));
343 g_return_if_reached ();
348 modest_ui_actions_on_add_to_contacts (GtkAction *action, ModestWindow *win)
350 GtkClipboard *clipboard = NULL;
351 gchar *selection = NULL;
353 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
354 selection = gtk_clipboard_wait_for_text (clipboard);
356 /* Question: why is the clipboard being used here?
357 * It doesn't really make a lot of sense. */
361 modest_address_book_add_address (selection);
367 modest_ui_actions_on_accounts (GtkAction *action, ModestWindow *win)
369 /* This is currently only implemented for Maemo,
370 * because it requires a providers preset file which is not publically available.
372 #ifdef MODEST_PLATFORM_MAEMO /* Defined in config.h */
373 gboolean accounts_exist = modest_account_mgr_has_accounts(
374 modest_runtime_get_account_mgr(), TRUE);
376 if (!accounts_exist) {
377 /* If there are no accounts yet, just show the easy-setup wizard, as per the UI spec: */
378 ModestEasysetupWizardDialog *wizard = modest_easysetup_wizard_dialog_new ();
379 gtk_window_set_transient_for (GTK_WINDOW (wizard), GTK_WINDOW (win));
380 gtk_dialog_run (GTK_DIALOG (wizard));
381 gtk_widget_destroy (GTK_WIDGET (wizard));
383 /* Show the list of accounts: */
384 GtkDialog *account_win = GTK_DIALOG(modest_account_view_window_new ());
385 gtk_window_set_transient_for (GTK_WINDOW (account_win), GTK_WINDOW(win));
386 gtk_dialog_run (account_win);
387 gtk_widget_destroy (GTK_WIDGET(account_win));
390 GtkWidget *dialog, *label;
392 /* Create the widgets */
394 dialog = gtk_dialog_new_with_buttons ("Message",
396 GTK_DIALOG_DESTROY_WITH_PARENT,
400 label = gtk_label_new ("Hello World!");
402 /* Ensure that the dialog box is destroyed when the user responds. */
404 g_signal_connect_swapped (dialog, "response",
405 G_CALLBACK (gtk_widget_destroy),
408 /* Add the label, and show everything we've added to the dialog. */
410 gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox),
412 gtk_widget_show_all (dialog);
413 #endif /* MODEST_PLATFORM_MAEMO */
417 on_smtp_servers_window_hide (GtkWindow* window, gpointer user_data)
419 ModestWindow *main_window = MODEST_WINDOW (user_data);
421 /* Save any changes. */
422 modest_connection_specific_smtp_window_save_server_accounts (
423 MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (window),
424 modest_window_get_active_account (main_window));
425 gtk_widget_destroy (GTK_WIDGET (window));
429 modest_ui_actions_on_smtp_servers (GtkAction *action, ModestWindow *win)
431 /* This is currently only implemented for Maemo,
432 * because it requires an API (libconic) to detect different connection
435 #ifdef MODEST_PLATFORM_MAEMO /* Defined in config.h */
437 /* Create the window if necessary: */
438 const gchar *active_account_name = modest_window_get_active_account (win);
440 /* TODO: Dim the menu item (not in the UI spec)? or show a warning,
441 * or show the default account?
442 * If we show the default account then the account name should be shown in
443 * the window when we show it. */
444 if (!active_account_name) {
445 g_warning ("%s: No account is active.", __FUNCTION__);
449 GtkWidget *specific_window = GTK_WIDGET (modest_connection_specific_smtp_window_new ());
450 modest_connection_specific_smtp_window_fill_with_connections (
451 MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (specific_window),
452 modest_runtime_get_account_mgr(),
453 active_account_name);
455 /* Show the window: */
456 gtk_window_set_transient_for (GTK_WINDOW (specific_window), GTK_WINDOW (win));
457 gtk_window_set_modal (GTK_WINDOW (specific_window), TRUE);
458 gtk_widget_show (specific_window);
460 /* Save changes when the window is hidden: */
461 g_signal_connect (specific_window, "hide",
462 G_CALLBACK (on_smtp_servers_window_hide), win);
463 #endif /* MODEST_PLATFORM_MAEMO */
467 modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win)
469 ModestWindow *msg_win;
471 TnyFolder *folder = NULL;
472 gchar *account_name = NULL;
473 gchar *from_str = NULL;
474 /* GError *err = NULL; */
475 TnyAccount *account = NULL;
476 ModestWindowMgr *mgr;
477 gchar *signature = NULL, *blank_and_signature = NULL;
479 account_name = g_strdup(modest_window_get_active_account (win));
481 account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
483 g_printerr ("modest: no account found\n");
487 account = modest_tny_account_store_get_server_account (modest_runtime_get_account_store(),
489 TNY_ACCOUNT_TYPE_STORE);
491 g_printerr ("modest: failed to get tnyaccount for '%s'\n", account_name);
495 from_str = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(), account_name);
497 g_printerr ("modest: failed get from string for '%s'\n", account_name);
501 if (modest_account_mgr_get_bool (modest_runtime_get_account_mgr (), account_name,
502 MODEST_ACCOUNT_USE_SIGNATURE, FALSE)) {
503 signature = modest_account_mgr_get_string (modest_runtime_get_account_mgr (), account_name,
504 MODEST_ACCOUNT_SIGNATURE, FALSE);
505 blank_and_signature = g_strconcat ("\n", signature, NULL);
508 blank_and_signature = g_strdup ("");
511 msg = modest_tny_msg_new ("", from_str, "", "", "", blank_and_signature, NULL);
513 g_printerr ("modest: failed to create new msg\n");
517 folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS);
519 g_printerr ("modest: failed to find Drafts folder\n");
523 /* tny_folder_add_msg (folder, msg, &err); */
525 /* g_printerr ("modest: error adding msg to Drafts folder: %s", */
527 /* g_error_free (err); */
531 /* Create and register edit window */
532 /* This is destroyed by TOOD. */
533 msg_win = modest_msg_edit_window_new (msg, account_name);
534 mgr = modest_runtime_get_window_mgr ();
535 modest_window_mgr_register_window (mgr, msg_win);
538 gtk_window_set_transient_for (GTK_WINDOW (msg_win),
540 gtk_widget_show_all (GTK_WIDGET (msg_win));
543 g_free (account_name);
545 g_free (blank_and_signature);
547 g_object_unref (G_OBJECT(account));
549 g_object_unref (G_OBJECT(msg));
551 g_object_unref (G_OBJECT(folder));
555 open_msg_cb (ModestMailOperation *mail_op,
560 ModestWindowMgr *mgr = NULL;
561 ModestWindow *parent_win = NULL;
562 ModestWindow *win = NULL;
563 TnyFolderType folder_type = TNY_FOLDER_TYPE_UNKNOWN;
564 gchar *account = NULL;
567 /* TODO: Show an error? (review the specs) */
571 parent_win = (ModestWindow *) modest_mail_operation_get_source (mail_op);
572 folder = tny_header_get_folder (header);
574 /* Mark header as read */
575 headers_action_mark_as_read (header, MODEST_WINDOW(parent_win), NULL);
578 account = g_strdup (modest_window_get_active_account (MODEST_WINDOW (parent_win)));
580 account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
582 /* Gets folder type (OUTBOX headers will be opened in edit window */
583 if (modest_tny_folder_is_local_folder (folder))
584 folder_type = modest_tny_folder_get_local_folder_type (folder);
586 /* If the header is in the drafts folder then open the editor,
587 else the message view window */
588 if (folder_type == TNY_FOLDER_TYPE_DRAFTS) {
589 win = modest_msg_edit_window_new (msg, account);
591 gchar *uid = modest_tny_folder_get_header_unique_id (header);
593 if (MODEST_IS_MAIN_WINDOW (parent_win)) {
594 GtkWidget *header_view;
595 GtkTreeSelection *sel;
596 GList *sel_list = NULL;
599 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(parent_win),
600 MODEST_WIDGET_TYPE_HEADER_VIEW);
602 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (header_view));
603 sel_list = gtk_tree_selection_get_selected_rows (sel, &model);
605 if (sel_list != NULL) {
606 GtkTreeRowReference *row_reference;
608 row_reference = gtk_tree_row_reference_new (model, (GtkTreePath *) sel_list->data);
609 g_list_foreach (sel_list, (GFunc) gtk_tree_path_free, NULL);
610 g_list_free (sel_list);
612 win = modest_msg_view_window_new_with_header_model (msg,
617 gtk_tree_row_reference_free (row_reference);
619 win = modest_msg_view_window_new (msg, account, (const gchar*) uid);
622 win = modest_msg_view_window_new (msg, account, (const gchar*) uid);
627 /* Register and show new window */
629 mgr = modest_runtime_get_window_mgr ();
630 modest_window_mgr_register_window (mgr, win);
631 gtk_window_set_transient_for (GTK_WINDOW (win), GTK_WINDOW (parent_win));
632 gtk_widget_show_all (GTK_WIDGET(win));
637 g_object_unref (msg);
638 g_object_unref (folder);
639 g_object_unref (header);
643 * This function is the error handler of the
644 * modest_mail_operation_get_msgs_full operation
647 modest_ui_actions_get_msgs_full_error_handler (ModestMailOperation *mail_op,
652 error = modest_mail_operation_get_error (mail_op);
653 if (error->code == MODEST_MAIL_OPERATION_ERROR_MESSAGE_SIZE_LIMIT) {
654 GObject *win = modest_mail_operation_get_source (mail_op);
656 modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL,
662 * This function is used by both modest_ui_actions_on_open and
663 * modest_ui_actions_on_header_activated. This way we always do the
664 * same when trying to open messages.
667 _modest_ui_actions_open (TnyList *headers, ModestWindow *win)
669 ModestWindowMgr *mgr;
671 ModestMailOperation *mail_op;
672 TnyList *not_opened_headers;
674 /* Look if we already have a message view for each header. If
675 true, then remove the header from the list of headers to
677 mgr = modest_runtime_get_window_mgr ();
678 iter = tny_list_create_iterator (headers);
679 not_opened_headers = tny_simple_list_new ();
680 while (!tny_iterator_is_done (iter)) {
681 ModestWindow *window;
684 header = TNY_HEADER (tny_iterator_get_current (iter));
685 window = modest_window_mgr_find_window_by_header (mgr, header);
686 /* Do not open again the message and present the
687 window to the user */
689 gtk_window_present (GTK_WINDOW (window));
691 tny_list_append (not_opened_headers, G_OBJECT (header));
693 g_object_unref (header);
694 tny_iterator_next (iter);
697 /* Open each message */
698 mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
700 modest_ui_actions_get_msgs_full_error_handler,
702 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
703 modest_mail_operation_get_msgs_full (mail_op,
709 g_object_unref (not_opened_headers);
710 g_object_unref (iter);
711 g_object_unref (mail_op);
715 modest_ui_actions_on_open (GtkAction *action, ModestWindow *win)
720 headers = get_selected_headers (win);
725 _modest_ui_actions_open (headers, win);
727 g_object_unref(headers);
732 free_reply_forward_helper (gpointer data)
734 ReplyForwardHelper *helper;
736 helper = (ReplyForwardHelper *) data;
737 g_free (helper->account_name);
738 g_slice_free (ReplyForwardHelper, helper);
742 reply_forward_cb (ModestMailOperation *mail_op,
748 ReplyForwardHelper *rf_helper;
749 ModestWindow *msg_win;
750 ModestEditType edit_type;
752 TnyAccount *account = NULL;
753 ModestWindowMgr *mgr;
754 gchar *signature = NULL;
756 g_return_if_fail (user_data != NULL);
757 rf_helper = (ReplyForwardHelper *) user_data;
759 from = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(),
760 rf_helper->account_name);
761 if (modest_account_mgr_get_bool (modest_runtime_get_account_mgr(),
762 rf_helper->account_name,
763 MODEST_ACCOUNT_USE_SIGNATURE, FALSE)) {
764 signature = modest_account_mgr_get_string (modest_runtime_get_account_mgr (),
765 rf_helper->account_name,
766 MODEST_ACCOUNT_SIGNATURE, FALSE);
769 /* Create reply mail */
770 switch (rf_helper->action) {
773 modest_tny_msg_create_reply_msg (msg, from, signature,
774 rf_helper->reply_forward_type,
775 MODEST_TNY_MSG_REPLY_MODE_SENDER);
777 case ACTION_REPLY_TO_ALL:
779 modest_tny_msg_create_reply_msg (msg, from, signature, rf_helper->reply_forward_type,
780 MODEST_TNY_MSG_REPLY_MODE_ALL);
781 edit_type = MODEST_EDIT_TYPE_REPLY;
785 modest_tny_msg_create_forward_msg (msg, from, signature, rf_helper->reply_forward_type);
786 edit_type = MODEST_EDIT_TYPE_FORWARD;
789 g_return_if_reached ();
796 g_printerr ("modest: failed to create message\n");
800 account = modest_tny_account_store_get_server_account (modest_runtime_get_account_store(),
801 rf_helper->account_name,
802 TNY_ACCOUNT_TYPE_STORE);
804 g_printerr ("modest: failed to get tnyaccount for '%s'\n", rf_helper->account_name);
808 /* Create and register the windows */
809 msg_win = modest_msg_edit_window_new (new_msg, rf_helper->account_name);
810 mgr = modest_runtime_get_window_mgr ();
811 modest_window_mgr_register_window (mgr, msg_win);
813 if (rf_helper->parent_window != NULL) {
816 parent_zoom = modest_window_get_zoom (MODEST_WINDOW (rf_helper->parent_window));
817 modest_window_set_zoom (msg_win, parent_zoom);
820 /* Show edit window */
821 gtk_widget_show_all (GTK_WIDGET (msg_win));
825 g_object_unref (G_OBJECT (new_msg));
827 g_object_unref (G_OBJECT (account));
828 g_object_unref (msg);
829 g_object_unref (header);
833 * Checks a list of headers. If any of them are not currently
834 * downloaded (CACHED) then it asks the user for permission to
837 * Returns FALSE if the user does not want to download the
838 * messages. Returns TRUE if the user allowed the download or if all
839 * of them are currently downloaded
842 download_uncached_messages (TnyList *header_list, GtkWindow *win)
845 gboolean found, retval;
847 iter = tny_list_create_iterator (header_list);
849 while (!tny_iterator_is_done (iter) && !found) {
851 TnyHeaderFlags flags;
853 header = TNY_HEADER (tny_iterator_get_current (iter));
854 flags = tny_header_get_flags (header);
855 /* TODO: is this the right flag?, it seems that some
856 headers that have been previously downloaded do not
858 found = !(flags & TNY_HEADER_FLAG_CACHED);
859 g_object_unref (header);
860 tny_iterator_next (iter);
862 g_object_unref (iter);
864 /* Ask for user permission to download the messages */
867 GtkResponseType response;
869 modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
870 _("mcen_nc_get_multi_msg_txt"));
871 if (response == GTK_RESPONSE_CANCEL)
879 * Common code for the reply and forward actions
882 reply_forward (ReplyForwardAction action, ModestWindow *win)
884 ModestMailOperation *mail_op = NULL;
885 TnyList *header_list = NULL;
886 ReplyForwardHelper *rf_helper = NULL;
887 guint reply_forward_type;
888 gboolean continue_download;
890 g_return_if_fail (MODEST_IS_WINDOW(win));
892 header_list = get_selected_headers (win);
896 /* Check that the messages have been previously downloaded */
897 continue_download = download_uncached_messages (header_list, GTK_WINDOW (win));
898 if (!continue_download) {
899 g_object_unref (header_list);
904 modest_conf_get_int (modest_runtime_get_conf (),
905 (action == ACTION_FORWARD) ? MODEST_CONF_FORWARD_TYPE : MODEST_CONF_REPLY_TYPE,
907 /* We assume that we can only select messages of the
908 same folder and that we reply all of them from the
909 same account. In fact the interface currently only
910 allows single selection */
913 rf_helper = g_slice_new0 (ReplyForwardHelper);
914 rf_helper->reply_forward_type = reply_forward_type;
915 rf_helper->action = action;
916 rf_helper->account_name = g_strdup (modest_window_get_active_account (win));
917 if ((win != NULL) && (MODEST_IS_WINDOW (win)))
918 rf_helper->parent_window = GTK_WIDGET (win);
919 if (!rf_helper->account_name)
920 rf_helper->account_name =
921 modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
923 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
926 /* Get header and message. Do not free them here, the
927 reply_forward_cb must do it */
928 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW(win));
929 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(win));
930 if (!msg || !header) {
932 g_object_unref (msg);
934 g_object_unref (header);
935 g_printerr ("modest: no message found\n");
938 reply_forward_cb (NULL, header, msg, rf_helper);
940 /* Retrieve messages */
941 mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
943 modest_ui_actions_get_msgs_full_error_handler,
945 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
946 modest_mail_operation_get_msgs_full (mail_op,
950 free_reply_forward_helper);
953 g_object_unref(mail_op);
957 g_object_unref (header_list);
961 modest_ui_actions_on_reply (GtkAction *action, ModestWindow *win)
963 g_return_if_fail (MODEST_IS_WINDOW(win));
965 reply_forward (ACTION_REPLY, win);
969 modest_ui_actions_on_forward (GtkAction *action, ModestWindow *win)
971 g_return_if_fail (MODEST_IS_WINDOW(win));
973 reply_forward (ACTION_FORWARD, win);
977 modest_ui_actions_on_reply_all (GtkAction *action, ModestWindow *win)
979 g_return_if_fail (MODEST_IS_WINDOW(win));
981 reply_forward (ACTION_REPLY_TO_ALL, win);
985 modest_ui_actions_on_next (GtkAction *action,
986 ModestWindow *window)
988 if (MODEST_IS_MAIN_WINDOW (window)) {
989 GtkWidget *header_view;
991 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
992 MODEST_WIDGET_TYPE_HEADER_VIEW);
996 modest_header_view_select_next (MODEST_HEADER_VIEW(header_view));
997 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
998 modest_msg_view_window_select_next_message (MODEST_MSG_VIEW_WINDOW (window));
1000 g_return_if_reached ();
1005 modest_ui_actions_on_prev (GtkAction *action,
1006 ModestWindow *window)
1008 g_return_if_fail (MODEST_IS_WINDOW(window));
1010 if (MODEST_IS_MAIN_WINDOW (window)) {
1011 GtkWidget *header_view;
1012 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
1013 MODEST_WIDGET_TYPE_HEADER_VIEW);
1017 modest_header_view_select_prev (MODEST_HEADER_VIEW(header_view));
1018 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
1019 modest_msg_view_window_select_previous_message (MODEST_MSG_VIEW_WINDOW (window));
1021 g_return_if_reached ();
1026 modest_ui_actions_on_sort (GtkAction *action,
1027 ModestWindow *window)
1029 g_return_if_fail (MODEST_IS_WINDOW(window));
1031 if (MODEST_IS_MAIN_WINDOW (window)) {
1032 GtkWidget *header_view;
1033 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
1034 MODEST_WIDGET_TYPE_HEADER_VIEW);
1038 /* Show sorting dialog */
1039 modest_platform_run_sort_dialog (GTK_WINDOW (window), MODEST_SORT_HEADERS);
1044 * This function performs the send & receive required actions. The
1045 * window is used to create the mail operation. Typically it should
1046 * always be the main window, but we pass it as argument in order to
1050 modest_ui_actions_do_send_receive (const gchar *account_name, ModestWindow *win)
1052 gchar *acc_name = NULL;
1053 ModestMailOperation *mail_op;
1055 /* If no account name was provided then get the current account, and if
1056 there is no current account then pick the default one: */
1057 if (!account_name) {
1058 acc_name = g_strdup (modest_window_get_active_account(win));
1060 acc_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
1062 g_printerr ("modest: cannot get default account\n");
1066 acc_name = g_strdup (account_name);
1069 /* Set send/receive operation in progress */
1070 modest_main_window_notify_send_receive_initied (MODEST_MAIN_WINDOW(win));
1072 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(win));
1073 g_signal_connect (G_OBJECT(mail_op), "progress-changed",
1074 G_CALLBACK (_on_send_receive_progress_changed),
1077 /* Send & receive. */
1078 /* TODO: The spec wants us to first do any pending deletions, before receiving. */
1079 /* Receive and then send. The operation is tagged initially as
1080 a receive operation because the account update performs a
1081 receive and then a send. The operation changes its type
1082 internally, so the progress objects will receive the proper
1083 progress information */
1084 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
1085 modest_mail_operation_update_account (mail_op, acc_name);
1086 g_object_unref (G_OBJECT (mail_op));
1093 * Refreshes all accounts. This function will be used by automatic
1097 modest_ui_actions_do_send_receive_all (ModestWindow *win)
1099 GSList *account_names, *iter;
1101 account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr(),
1104 iter = account_names;
1106 modest_ui_actions_do_send_receive ((const char*) iter->data, win);
1107 iter = g_slist_next (iter);
1110 g_slist_foreach (account_names, (GFunc) g_free, NULL);
1111 g_slist_free (account_names);
1115 * Handler of the click on Send&Receive button in the main toolbar
1118 modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win)
1120 /* Check if accounts exist */
1121 gboolean accounts_exist =
1122 modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE);
1124 /* If not, allow the user to create an account before trying to send/receive. */
1125 if (!accounts_exist)
1126 modest_ui_actions_on_accounts (NULL, win);
1128 /* Refresh the active account */
1129 modest_ui_actions_do_send_receive (NULL, win);
1134 modest_ui_actions_toggle_header_list_view (GtkAction *action, ModestMainWindow *main_window)
1137 GtkWidget *header_view;
1139 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1141 header_view = modest_main_window_get_child_widget (main_window,
1142 MODEST_WIDGET_TYPE_HEADER_VIEW);
1146 conf = modest_runtime_get_conf ();
1148 /* what is saved/restored is depending on the style; thus; we save with
1149 * old style, then update the style, and restore for this new style
1151 modest_widget_memory_save (conf, G_OBJECT(header_view), MODEST_CONF_HEADER_VIEW_KEY);
1153 if (modest_header_view_get_style
1154 (MODEST_HEADER_VIEW(header_view)) == MODEST_HEADER_VIEW_STYLE_DETAILS)
1155 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
1156 MODEST_HEADER_VIEW_STYLE_TWOLINES);
1158 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
1159 MODEST_HEADER_VIEW_STYLE_DETAILS);
1161 modest_widget_memory_restore (conf, G_OBJECT(header_view),
1162 MODEST_CONF_HEADER_VIEW_KEY);
1167 modest_ui_actions_on_header_selected (ModestHeaderView *header_view,
1169 ModestMainWindow *main_window)
1171 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1172 g_return_if_fail (MODEST_IS_HEADER_VIEW (header_view));
1174 /* If no header has been selected then exit */
1178 /* Update Main window title */
1179 if (GTK_WIDGET_HAS_FOCUS (header_view)) {
1180 const gchar *subject = tny_header_get_subject (header);
1181 if (subject && strlen(subject) > 0)
1182 gtk_window_set_title (GTK_WINDOW (main_window), subject);
1184 gtk_window_set_title (GTK_WINDOW (main_window), _("mail_va_no_subject"));
1187 /* Update toolbar dimming state */
1188 modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
1192 modest_ui_actions_on_header_activated (ModestHeaderView *header_view,
1194 ModestMainWindow *main_window)
1198 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1203 headers = tny_simple_list_new ();
1204 tny_list_prepend (headers, G_OBJECT (header));
1206 _modest_ui_actions_open (headers, MODEST_WINDOW (main_window));
1208 g_object_unref (headers);
1212 set_active_account_from_tny_account (TnyAccount *account,
1213 ModestWindow *window)
1215 const gchar *server_acc_name = tny_account_get_id (account);
1217 /* We need the TnyAccount provided by the
1218 account store because that is the one that
1219 knows the name of the Modest account */
1220 TnyAccount *modest_server_account = modest_server_account =
1221 modest_tny_account_store_get_tny_account_by (modest_runtime_get_account_store (),
1222 MODEST_TNY_ACCOUNT_STORE_QUERY_ID,
1225 const gchar *modest_acc_name =
1226 modest_tny_account_get_parent_modest_account_name_for_server_account (modest_server_account);
1227 modest_window_set_active_account (window, modest_acc_name);
1228 g_object_unref (modest_server_account);
1233 folder_refreshed_cb (const GObject *obj,
1237 ModestMainWindow *win = NULL;
1238 GtkWidget *header_view;
1240 g_return_if_fail (TNY_IS_FOLDER (folder));
1242 win = MODEST_MAIN_WINDOW (user_data);
1244 modest_main_window_get_child_widget(win, MODEST_WIDGET_TYPE_HEADER_VIEW);
1246 /* Check if folder is empty and set headers view contents style */
1247 if (tny_folder_get_all_count (folder) == 0) {
1248 modest_main_window_set_contents_style (win,
1249 MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY);
1251 /* Restore configuration. There is no need to set the
1252 contents style to headers because it was already
1253 being done in folder_selection_changed */
1254 modest_widget_memory_restore (modest_runtime_get_conf (),
1255 G_OBJECT(header_view),
1256 MODEST_CONF_HEADER_VIEW_KEY);
1261 modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
1262 TnyFolderStore *folder_store,
1264 ModestMainWindow *main_window)
1267 GtkWidget *header_view;
1269 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1271 header_view = modest_main_window_get_child_widget(main_window,
1272 MODEST_WIDGET_TYPE_HEADER_VIEW);
1276 conf = modest_runtime_get_conf ();
1278 if (TNY_IS_ACCOUNT (folder_store)) {
1279 /* Update active account */
1280 set_active_account_from_tny_account (TNY_ACCOUNT (folder_store), MODEST_WINDOW (main_window));
1281 /* Show account details */
1282 modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS);
1284 if (TNY_IS_FOLDER (folder_store) && selected) {
1286 if (!TNY_IS_MERGE_FOLDER (folder_store)) { /* TnyMergeFolder can have no get_account() implementation. */
1287 /* Update the active account */
1288 TnyAccount *account = modest_tny_folder_get_account (TNY_FOLDER (folder_store));
1289 set_active_account_from_tny_account (account, MODEST_WINDOW (main_window));
1290 g_object_unref (account);
1293 /* Set the header view, we could change it to
1294 the empty view after the refresh */
1295 modest_main_window_set_contents_style (main_window,
1296 MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS);
1298 modest_widget_memory_save (modest_runtime_get_conf(),
1299 G_OBJECT(header_view),
1300 MODEST_CONF_HEADER_VIEW_KEY);
1302 /* Set folder on header view. This function
1303 will call tny_folder_refresh_async so we
1304 pass a callback that will be called when
1305 finished. We use that callback to set the
1306 empty view if there are no messages */
1307 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view),
1308 TNY_FOLDER (folder_store),
1309 folder_refreshed_cb,
1312 /* Update the active account */
1313 modest_window_set_active_account (MODEST_WINDOW (main_window), NULL);
1314 /* Do not show folder */
1315 modest_widget_memory_save (conf, G_OBJECT (header_view), MODEST_CONF_HEADER_VIEW_KEY);
1316 modest_header_view_clear (MODEST_HEADER_VIEW(header_view));
1320 /* Update toolbar dimming state */
1321 modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
1325 modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemType type,
1332 item = (type == MODEST_ITEM_TYPE_FOLDER) ? "folder" : "message";
1334 if (g_main_depth > 0)
1335 gdk_threads_enter ();
1336 online = tny_device_is_online (modest_runtime_get_device());
1339 /* already online -- the item is simply not there... */
1340 dialog = gtk_message_dialog_new (GTK_WINDOW (win),
1342 GTK_MESSAGE_WARNING,
1344 _("The %s you selected cannot be found"),
1346 gtk_dialog_run (GTK_DIALOG(dialog));
1348 dialog = gtk_dialog_new_with_buttons (_("Connection requested"),
1352 GTK_RESPONSE_REJECT,
1354 GTK_RESPONSE_ACCEPT,
1356 txt = g_strdup_printf (_("This %s is not available in offline mode.\n"
1357 "Do you want to get online?"), item);
1358 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1359 gtk_label_new (txt), FALSE, FALSE, 0);
1360 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1363 gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300);
1364 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
1365 // modest_platform_connect_and_wait ();
1368 gtk_widget_destroy (dialog);
1369 if (g_main_depth > 0)
1370 gdk_threads_leave ();
1374 modest_ui_actions_on_msg_link_hover (ModestMsgView *msgview, const gchar* link,
1377 /* g_message ("%s %s", __FUNCTION__, link); */
1382 modest_ui_actions_on_msg_link_clicked (ModestMsgView *msgview, const gchar* link,
1385 modest_platform_activate_uri (link);
1389 modest_ui_actions_on_msg_link_contextual (ModestMsgView *msgview, const gchar* link,
1392 modest_platform_show_uri_popup (link);
1396 modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, TnyMimePart *mime_part,
1399 modest_msg_view_window_view_attachment (MODEST_MSG_VIEW_WINDOW (win), mime_part);
1403 modest_ui_actions_on_msg_recpt_activated (ModestMsgView *msgview,
1404 const gchar *address,
1407 /* g_message ("%s %s", __FUNCTION__, address); */
1411 modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edit_window)
1413 TnyTransportAccount *transport_account;
1414 ModestMailOperation *mail_operation;
1416 gchar *account_name, *from;
1417 ModestAccountMgr *account_mgr;
1419 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
1421 data = modest_msg_edit_window_get_msg_data (edit_window);
1423 account_mgr = modest_runtime_get_account_mgr();
1424 account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
1426 account_name = modest_account_mgr_get_default_account (account_mgr);
1427 if (!account_name) {
1428 g_printerr ("modest: no account found\n");
1429 modest_msg_edit_window_free_msg_data (edit_window, data);
1433 if (!strcmp (account_name, MODEST_LOCAL_FOLDERS_ACCOUNT_ID)) {
1434 account_name = g_strdup (data->account_name);
1438 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_server_account
1439 (modest_runtime_get_account_store(),
1441 TNY_ACCOUNT_TYPE_TRANSPORT));
1442 if (!transport_account) {
1443 g_printerr ("modest: no transport account found for '%s'\n", account_name);
1444 g_free (account_name);
1445 modest_msg_edit_window_free_msg_data (edit_window, data);
1448 from = modest_account_mgr_get_from_string (account_mgr, account_name);
1450 /* Create the mail operation */
1451 mail_operation = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_INFO, G_OBJECT(edit_window));
1452 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
1454 modest_mail_operation_save_to_drafts (mail_operation,
1465 data->priority_flags);
1468 g_free (account_name);
1469 g_object_unref (G_OBJECT (transport_account));
1470 g_object_unref (G_OBJECT (mail_operation));
1472 modest_msg_edit_window_free_msg_data (edit_window, data);
1474 /* Save settings and close the window */
1475 gtk_widget_destroy (GTK_WIDGET (edit_window));
1478 /* For instance, when clicking the Send toolbar button when editing a message: */
1480 modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
1482 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
1484 if (!modest_msg_edit_window_check_names (edit_window))
1487 /* FIXME: Code added just for testing. The final version will
1488 use the send queue provided by tinymail and some
1490 ModestAccountMgr *account_mgr = modest_runtime_get_account_mgr();
1491 gchar *account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
1493 account_name = modest_account_mgr_get_default_account (account_mgr);
1495 if (!account_name) {
1496 g_printerr ("modest: no account found\n");
1500 MsgData *data = modest_msg_edit_window_get_msg_data (edit_window);
1502 if (!strcmp (account_name, MODEST_LOCAL_FOLDERS_ACCOUNT_ID)) {
1503 account_name = g_strdup (data->account_name);
1506 /* Get the currently-active transport account for this modest account: */
1507 TnyTransportAccount *transport_account =
1508 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_transport_account_for_open_connection
1509 (modest_runtime_get_account_store(),
1511 if (!transport_account) {
1512 g_printerr ("modest: no transport account found for '%s'\n", account_name);
1513 g_free (account_name);
1514 modest_msg_edit_window_free_msg_data (edit_window, data);
1518 gchar *from = modest_account_mgr_get_from_string (account_mgr, account_name);
1520 /* mail content checks and dialogs */
1521 if (data->subject == NULL || data->subject[0] == '\0') {
1522 GtkResponseType response;
1523 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (edit_window),
1524 _("mcen_nc_subject_is_empty_send"));
1525 if (response == GTK_RESPONSE_CANCEL) {
1526 g_free (account_name);
1531 if (data->plain_body == NULL || data->plain_body[0] == '\0') {
1532 GtkResponseType response;
1533 gchar *note_message;
1534 gchar *note_subject = data->subject;
1535 if (note_subject == NULL || note_subject[0] == '\0')
1536 note_subject = _("mail_va_no_subject");
1537 note_message = g_strdup_printf (_("emev_ni_ui_smtp_message_null"), note_subject);
1538 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (edit_window),
1540 g_free (note_message);
1541 if (response == GTK_RESPONSE_CANCEL) {
1542 g_free (account_name);
1547 /* Create the mail operation */
1548 ModestMailOperation *mail_operation = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_SEND, G_OBJECT(edit_window));
1549 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
1551 modest_mail_operation_send_new_mail (mail_operation,
1562 data->priority_flags);
1566 g_free (account_name);
1567 g_object_unref (G_OBJECT (transport_account));
1568 g_object_unref (G_OBJECT (mail_operation));
1570 modest_msg_edit_window_free_msg_data (edit_window, data);
1572 /* Save settings and close the window: */
1573 gtk_widget_destroy (GTK_WIDGET (edit_window));
1577 modest_ui_actions_on_toggle_bold (GtkToggleAction *action,
1578 ModestMsgEditWindow *window)
1580 ModestMsgEditFormatState *format_state = NULL;
1582 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1583 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1585 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1588 format_state = modest_msg_edit_window_get_format_state (window);
1589 g_return_if_fail (format_state != NULL);
1591 format_state->bold = gtk_toggle_action_get_active (action);
1592 modest_msg_edit_window_set_format_state (window, format_state);
1593 g_free (format_state);
1598 modest_ui_actions_on_toggle_italics (GtkToggleAction *action,
1599 ModestMsgEditWindow *window)
1601 ModestMsgEditFormatState *format_state = NULL;
1603 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1604 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1606 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1609 format_state = modest_msg_edit_window_get_format_state (window);
1610 g_return_if_fail (format_state != NULL);
1612 format_state->italics = gtk_toggle_action_get_active (action);
1613 modest_msg_edit_window_set_format_state (window, format_state);
1614 g_free (format_state);
1619 modest_ui_actions_on_toggle_bullets (GtkToggleAction *action,
1620 ModestMsgEditWindow *window)
1622 ModestMsgEditFormatState *format_state = NULL;
1624 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1625 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1627 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1630 format_state = modest_msg_edit_window_get_format_state (window);
1631 g_return_if_fail (format_state != NULL);
1633 format_state->bullet = gtk_toggle_action_get_active (action);
1634 modest_msg_edit_window_set_format_state (window, format_state);
1635 g_free (format_state);
1640 modest_ui_actions_on_change_justify (GtkRadioAction *action,
1641 GtkRadioAction *selected,
1642 ModestMsgEditWindow *window)
1644 ModestMsgEditFormatState *format_state = NULL;
1645 GtkJustification value;
1647 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1649 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1652 value = gtk_radio_action_get_current_value (selected);
1654 format_state = modest_msg_edit_window_get_format_state (window);
1655 g_return_if_fail (format_state != NULL);
1657 format_state->justification = value;
1658 modest_msg_edit_window_set_format_state (window, format_state);
1659 g_free (format_state);
1663 modest_ui_actions_on_select_editor_color (GtkAction *action,
1664 ModestMsgEditWindow *window)
1666 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1667 g_return_if_fail (GTK_IS_ACTION (action));
1669 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1672 modest_msg_edit_window_select_color (window);
1676 modest_ui_actions_on_select_editor_background_color (GtkAction *action,
1677 ModestMsgEditWindow *window)
1679 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1680 g_return_if_fail (GTK_IS_ACTION (action));
1682 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1685 modest_msg_edit_window_select_background_color (window);
1689 modest_ui_actions_on_insert_image (GtkAction *action,
1690 ModestMsgEditWindow *window)
1692 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1693 g_return_if_fail (GTK_IS_ACTION (action));
1695 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1698 modest_msg_edit_window_insert_image (window);
1702 modest_ui_actions_on_attach_file (GtkAction *action,
1703 ModestMsgEditWindow *window)
1705 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1706 g_return_if_fail (GTK_IS_ACTION (action));
1708 modest_msg_edit_window_attach_file (window);
1712 modest_ui_actions_on_remove_attachments (GtkAction *action,
1713 ModestMsgEditWindow *window)
1715 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1716 g_return_if_fail (GTK_IS_ACTION (action));
1718 modest_msg_edit_window_remove_attachments (window, NULL);
1722 * Shows a dialog with an entry that asks for some text. The returned
1723 * value must be freed by the caller. The dialog window title will be
1727 ask_for_folder_name (GtkWindow *parent_window,
1730 GtkWidget *dialog, *entry;
1731 gchar *folder_name = NULL;
1733 /* Ask for folder name */
1734 dialog = gtk_dialog_new_with_buttons (_("New Folder Name"),
1738 GTK_RESPONSE_REJECT,
1740 GTK_RESPONSE_ACCEPT,
1742 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1743 gtk_label_new(title),
1746 entry = gtk_entry_new_with_max_length (40);
1747 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1751 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1753 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
1754 folder_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
1756 gtk_widget_destroy (dialog);
1762 modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_window)
1764 TnyFolderStore *parent_folder;
1765 GtkWidget *folder_view;
1767 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1769 folder_view = modest_main_window_get_child_widget (main_window,
1770 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1774 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1776 if (parent_folder) {
1777 gboolean finished = FALSE;
1779 gchar *folder_name = NULL, *suggested_name = NULL;
1781 /* Run the new folder dialog */
1783 result = modest_platform_run_new_folder_dialog (GTK_WINDOW (main_window),
1788 if (result == GTK_RESPONSE_REJECT) {
1791 ModestMailOperation *mail_op;
1792 TnyFolder *new_folder = NULL;
1794 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_INFO,
1795 G_OBJECT(main_window));
1796 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1798 new_folder = modest_mail_operation_create_folder (mail_op,
1800 (const gchar *) folder_name);
1802 g_object_unref (new_folder);
1805 g_object_unref (mail_op);
1807 g_free (folder_name);
1811 g_object_unref (parent_folder);
1816 modest_ui_actions_on_rename_folder (GtkAction *action,
1817 ModestMainWindow *main_window)
1819 TnyFolderStore *folder;
1820 GtkWidget *folder_view;
1821 GtkWidget *header_view;
1823 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1825 folder_view = modest_main_window_get_child_widget (main_window,
1826 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1830 header_view = modest_main_window_get_child_widget (main_window,
1831 MODEST_WIDGET_TYPE_HEADER_VIEW);
1836 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1838 if (folder && TNY_IS_FOLDER (folder)) {
1840 folder_name = ask_for_folder_name (GTK_WINDOW (main_window),
1841 _("Please enter a new name for the folder"));
1843 if (folder_name != NULL && strlen (folder_name) > 0) {
1844 ModestMailOperation *mail_op;
1846 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_INFO, G_OBJECT(main_window));
1847 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1850 modest_header_view_clear (MODEST_HEADER_VIEW (header_view));
1852 modest_mail_operation_rename_folder (mail_op,
1853 TNY_FOLDER (folder),
1854 (const gchar *) folder_name);
1856 g_object_unref (mail_op);
1857 g_free (folder_name);
1859 g_object_unref (folder);
1864 modest_ui_actions_delete_folder_error_handler (ModestMailOperation *mail_op,
1867 GObject *win = modest_mail_operation_get_source (mail_op);
1869 modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL,
1870 _("mail_in_ui_folder_delete_error"));
1874 delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
1876 TnyFolderStore *folder;
1877 GtkWidget *folder_view;
1881 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1883 folder_view = modest_main_window_get_child_widget (main_window,
1884 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1888 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
1890 /* Show an error if it's an account */
1891 if (!TNY_IS_FOLDER (folder)) {
1892 modest_platform_run_information_dialog (GTK_WINDOW (main_window),
1893 _("mail_in_ui_folder_delete_error"));
1898 message = g_strdup_printf (_("mcen_nc_delete_folder_text"),
1899 tny_folder_get_name (TNY_FOLDER (folder)));
1900 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (main_window),
1901 (const gchar *) message);
1904 if (response == GTK_RESPONSE_OK) {
1905 ModestMailOperation *mail_op =
1906 modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_DELETE,
1907 G_OBJECT(main_window),
1908 modest_ui_actions_delete_folder_error_handler,
1911 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1913 modest_mail_operation_remove_folder (mail_op, TNY_FOLDER (folder), move_to_trash);
1914 g_object_unref (G_OBJECT (mail_op));
1917 g_object_unref (G_OBJECT (folder));
1921 modest_ui_actions_on_delete_folder (GtkAction *action,
1922 ModestMainWindow *main_window)
1924 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1926 delete_folder (main_window, FALSE);
1930 modest_ui_actions_on_move_folder_to_trash_folder (GtkAction *action, ModestMainWindow *main_window)
1932 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1934 delete_folder (main_window, TRUE);
1938 modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
1939 const gchar* server_account_name,
1944 ModestMainWindow *main_window)
1946 g_return_if_fail(server_account_name);
1947 /* printf("DEBUG: %s: server_account_name=%s\n", __FUNCTION__, server_account_name); */
1949 /* Initalize output parameters: */
1956 #ifdef MODEST_PLATFORM_MAEMO
1957 /* Maemo uses a different (awkward) button order,
1958 * It should probably just use gtk_alternative_dialog_button_order ().
1960 GtkWidget *dialog = gtk_dialog_new_with_buttons (_("mail_ti_password_protected"),
1964 GTK_RESPONSE_ACCEPT,
1966 GTK_RESPONSE_REJECT,
1969 GtkWidget *dialog = gtk_dialog_new_with_buttons (_("mail_ti_password_protected"),
1973 GTK_RESPONSE_REJECT,
1975 GTK_RESPONSE_ACCEPT,
1977 #endif /* MODEST_PLATFORM_MAEMO */
1979 gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(main_window));
1981 gchar *server_name = modest_server_account_get_hostname (
1982 modest_runtime_get_account_mgr(), server_account_name);
1983 if (!server_name) {/* This happened once, though I don't know why. murrayc. */
1984 g_warning("%s: Could not get server name for server account '%s'", __FUNCTION__, server_account_name);
1989 /* This causes a warning because the logical ID has no %s in it,
1990 * though the translation does, but there is not much we can do about that: */
1991 gchar *txt = g_strdup_printf (_("mail_ia_password_info"), server_name);
1992 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt),
1995 g_free (server_name);
1999 gchar *initial_username = modest_server_account_get_username (
2000 modest_runtime_get_account_mgr(), server_account_name);
2002 GtkWidget *entry_username = gtk_entry_new ();
2003 if (initial_username)
2004 gtk_entry_set_text (GTK_ENTRY (entry_username), initial_username);
2005 /* Dim this if a connection has ever succeeded with this username,
2006 * as per the UI spec: */
2007 const gboolean username_known =
2008 modest_server_account_get_username_has_succeeded(
2009 modest_runtime_get_account_mgr(), server_account_name);
2010 gtk_widget_set_sensitive (entry_username, !username_known);
2012 #ifdef MODEST_PLATFORM_MAEMO
2013 /* Auto-capitalization is the default, so let's turn it off: */
2014 hildon_gtk_entry_set_input_mode (GTK_ENTRY (entry_username), HILDON_GTK_INPUT_MODE_FULL);
2016 /* Create a size group to be used by all captions.
2017 * Note that HildonCaption does not create a default size group if we do not specify one.
2018 * We use GTK_SIZE_GROUP_HORIZONTAL, so that the widths are the same. */
2019 GtkSizeGroup *sizegroup = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
2021 GtkWidget *caption = hildon_caption_new (sizegroup,
2022 _("mail_fi_username"), entry_username, NULL, HILDON_CAPTION_MANDATORY);
2023 gtk_widget_show (entry_username);
2024 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), caption,
2025 FALSE, FALSE, MODEST_MARGIN_HALF);
2026 gtk_widget_show (caption);
2028 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry_username,
2030 #endif /* MODEST_PLATFORM_MAEMO */
2033 GtkWidget *entry_password = gtk_entry_new ();
2034 gtk_entry_set_visibility (GTK_ENTRY(entry_password), FALSE);
2035 /* gtk_entry_set_invisible_char (GTK_ENTRY(entry_password), "*"); */
2037 #ifdef MODEST_PLATFORM_MAEMO
2038 /* Auto-capitalization is the default, so let's turn it off: */
2039 hildon_gtk_entry_set_input_mode (GTK_ENTRY (entry_password),
2040 HILDON_GTK_INPUT_MODE_FULL | HILDON_GTK_INPUT_MODE_INVISIBLE);
2042 caption = hildon_caption_new (sizegroup,
2043 _("mail_fi_password"), entry_password, NULL, HILDON_CAPTION_MANDATORY);
2044 gtk_widget_show (entry_password);
2045 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), caption,
2046 FALSE, FALSE, MODEST_MARGIN_HALF);
2047 gtk_widget_show (caption);
2048 g_object_unref (sizegroup);
2050 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry_password,
2052 #endif /* MODEST_PLATFORM_MAEMO */
2054 /* This is not in the Maemo UI spec:
2055 remember_pass_check = gtk_check_button_new_with_label (_("Remember password"));
2056 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check,
2060 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
2062 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
2064 *username = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry_username)));
2066 modest_server_account_set_username (
2067 modest_runtime_get_account_mgr(), server_account_name,
2070 const gboolean username_was_changed =
2071 (strcmp (*username, initial_username) != 0);
2072 if (username_was_changed) {
2073 /* To actually use a changed username,
2074 * we must reset the connection, according to pvanhoof.
2075 * This _might_ be a sensible way to do that: */
2076 TnyDevice *device = modest_runtime_get_device();
2077 tny_device_force_offline (device);
2078 tny_device_force_online (device);
2083 *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry_password)));
2085 /* We do not save the password in the configuration,
2086 * because this function is only called for passwords that should
2087 * not be remembered:
2088 modest_server_account_set_password (
2089 modest_runtime_get_account_mgr(), server_account_name,
2108 /* This is not in the Maemo UI spec:
2109 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check)))
2115 gtk_widget_destroy (dialog);
2117 /* printf ("DEBUG: %s: cancel=%d\n", __FUNCTION__, *cancel); */
2121 modest_ui_actions_on_cut (GtkAction *action,
2122 ModestWindow *window)
2124 GtkWidget *focused_widget;
2126 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
2127 if (GTK_IS_EDITABLE (focused_widget)) {
2128 gtk_editable_cut_clipboard (GTK_EDITABLE(focused_widget));
2129 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
2130 GtkTextBuffer *buffer;
2131 GtkClipboard *clipboard;
2133 clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
2134 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
2135 gtk_text_buffer_cut_clipboard (buffer, clipboard, TRUE);
2140 modest_ui_actions_on_copy (GtkAction *action,
2141 ModestWindow *window)
2143 GtkClipboard *clipboard;
2144 GtkWidget *focused_widget;
2146 clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
2147 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
2148 if (GTK_IS_LABEL (focused_widget)) {
2149 gtk_clipboard_set_text (clipboard, gtk_label_get_text (GTK_LABEL (focused_widget)), -1);
2150 } else if (GTK_IS_EDITABLE (focused_widget)) {
2151 gtk_editable_copy_clipboard (GTK_EDITABLE(focused_widget));
2152 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
2153 GtkTextBuffer *buffer;
2155 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
2156 gtk_text_buffer_copy_clipboard (buffer, clipboard);
2161 modest_ui_actions_on_undo (GtkAction *action,
2162 ModestWindow *window)
2164 if (MODEST_IS_MSG_EDIT_WINDOW (window)) {
2165 modest_msg_edit_window_undo (MODEST_MSG_EDIT_WINDOW (window));
2167 g_return_if_reached ();
2172 modest_ui_actions_on_paste (GtkAction *action,
2173 ModestWindow *window)
2175 GtkWidget *focused_widget;
2177 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
2178 if (GTK_IS_EDITABLE (focused_widget)) {
2179 gtk_editable_paste_clipboard (GTK_EDITABLE(focused_widget));
2180 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
2181 GtkTextBuffer *buffer;
2182 GtkClipboard *clipboard;
2184 clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
2185 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
2186 gtk_text_buffer_paste_clipboard (buffer, clipboard, NULL, TRUE);
2191 modest_ui_actions_on_select_all (GtkAction *action,
2192 ModestWindow *window)
2194 GtkWidget *focused_widget;
2196 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
2197 if (MODEST_IS_ATTACHMENTS_VIEW (focused_widget)) {
2198 modest_attachments_view_select_all (MODEST_ATTACHMENTS_VIEW (focused_widget));
2199 } else if (GTK_IS_LABEL (focused_widget)) {
2200 gtk_label_select_region (GTK_LABEL (focused_widget), 0, -1);
2201 } else if (GTK_IS_EDITABLE (focused_widget)) {
2202 gtk_editable_select_region (GTK_EDITABLE(focused_widget), 0, -1);
2203 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
2204 GtkTextBuffer *buffer;
2205 GtkTextIter start, end;
2207 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
2208 gtk_text_buffer_get_start_iter (buffer, &start);
2209 gtk_text_buffer_get_end_iter (buffer, &end);
2210 gtk_text_buffer_select_range (buffer, &start, &end);
2212 else if ((MODEST_IS_FOLDER_VIEW (focused_widget)) ||
2213 (MODEST_IS_HEADER_VIEW (focused_widget))) {
2215 GtkTreeSelection *selection = NULL;
2217 /* Get header view */
2218 GtkWidget *header_view = focused_widget;
2219 if (MODEST_IS_FOLDER_VIEW (focused_widget))
2220 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (window),
2221 MODEST_WIDGET_TYPE_HEADER_VIEW);
2223 /* Select all messages */
2224 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view));
2225 gtk_tree_selection_select_all (selection);
2230 modest_ui_actions_on_mark_as_read (GtkAction *action,
2231 ModestWindow *window)
2233 g_return_if_fail (MODEST_IS_WINDOW(window));
2235 /* Mark each header as read */
2236 do_headers_action (window, headers_action_mark_as_read, NULL);
2240 modest_ui_actions_on_mark_as_unread (GtkAction *action,
2241 ModestWindow *window)
2243 g_return_if_fail (MODEST_IS_WINDOW(window));
2245 /* Mark each header as read */
2246 do_headers_action (window, headers_action_mark_as_unread, NULL);
2250 modest_ui_actions_on_change_zoom (GtkRadioAction *action,
2251 GtkRadioAction *selected,
2252 ModestWindow *window)
2256 value = gtk_radio_action_get_current_value (selected);
2257 if (MODEST_IS_WINDOW (window)) {
2258 modest_window_set_zoom (MODEST_WINDOW (window), ((gdouble)value)/100);
2262 void modest_ui_actions_msg_edit_on_change_priority (GtkRadioAction *action,
2263 GtkRadioAction *selected,
2264 ModestWindow *window)
2266 TnyHeaderFlags flags;
2267 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2269 flags = gtk_radio_action_get_current_value (selected);
2270 modest_msg_edit_window_set_priority_flags (MODEST_MSG_EDIT_WINDOW (window), flags);
2273 void modest_ui_actions_msg_edit_on_change_file_format (GtkRadioAction *action,
2274 GtkRadioAction *selected,
2275 ModestWindow *window)
2279 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2281 file_format = gtk_radio_action_get_current_value (selected);
2282 modest_msg_edit_window_set_file_format (MODEST_MSG_EDIT_WINDOW (window), file_format);
2287 modest_ui_actions_on_zoom_plus (GtkAction *action,
2288 ModestWindow *window)
2290 g_return_if_fail (MODEST_IS_WINDOW (window));
2292 modest_window_zoom_plus (MODEST_WINDOW (window));
2296 modest_ui_actions_on_zoom_minus (GtkAction *action,
2297 ModestWindow *window)
2299 g_return_if_fail (MODEST_IS_WINDOW (window));
2301 modest_window_zoom_minus (MODEST_WINDOW (window));
2305 modest_ui_actions_on_toggle_fullscreen (GtkToggleAction *toggle,
2306 ModestWindow *window)
2308 ModestWindowMgr *mgr;
2309 gboolean fullscreen, active;
2310 g_return_if_fail (MODEST_IS_WINDOW (window));
2312 mgr = modest_runtime_get_window_mgr ();
2314 active = (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle)))?1:0;
2315 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
2317 if (active != fullscreen) {
2318 modest_window_mgr_set_fullscreen_mode (mgr, active);
2319 gtk_window_present (GTK_WINDOW (window));
2324 modest_ui_actions_on_change_fullscreen (GtkAction *action,
2325 ModestWindow *window)
2327 ModestWindowMgr *mgr;
2328 gboolean fullscreen;
2330 g_return_if_fail (MODEST_IS_WINDOW (window));
2332 mgr = modest_runtime_get_window_mgr ();
2333 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
2334 modest_window_mgr_set_fullscreen_mode (mgr, !fullscreen);
2336 gtk_window_present (GTK_WINDOW (window));
2340 * Used by modest_ui_actions_on_details to call do_headers_action
2343 headers_action_show_details (TnyHeader *header,
2344 ModestWindow *window,
2351 dialog = modest_details_dialog_new_with_header (GTK_WINDOW (window), header);
2354 gtk_widget_show_all (dialog);
2355 gtk_dialog_run (GTK_DIALOG (dialog));
2357 gtk_widget_destroy (dialog);
2361 * Show the folder details in a ModestDetailsDialog widget
2364 show_folder_details (TnyFolder *folder,
2370 dialog = modest_details_dialog_new_with_folder (window, folder);
2373 gtk_widget_show_all (dialog);
2374 gtk_dialog_run (GTK_DIALOG (dialog));
2376 gtk_widget_destroy (dialog);
2380 * Show the header details in a ModestDetailsDialog widget
2383 modest_ui_actions_on_details (GtkAction *action,
2386 TnyList * headers_list;
2390 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2393 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
2396 g_object_unref (msg);
2398 headers_list = get_selected_headers (win);
2402 iter = tny_list_create_iterator (headers_list);
2404 header = TNY_HEADER (tny_iterator_get_current (iter));
2405 headers_action_show_details (header, win, NULL);
2406 g_object_unref (header);
2408 g_object_unref (iter);
2409 g_object_unref (headers_list);
2411 } else if (MODEST_IS_MAIN_WINDOW (win)) {
2412 GtkWidget *folder_view, *header_view;
2414 /* Check which widget has the focus */
2415 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2416 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2417 if (gtk_widget_is_focus (folder_view)) {
2420 folder = (TnyFolder *) modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
2422 /* Show only when it's a folder */
2423 if (!folder || !TNY_IS_FOLDER (folder))
2426 show_folder_details (folder, GTK_WINDOW (win));
2429 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2430 MODEST_WIDGET_TYPE_HEADER_VIEW);
2431 /* Show details of each header */
2432 do_headers_action (win, headers_action_show_details, header_view);
2438 modest_ui_actions_on_toggle_show_cc (GtkToggleAction *toggle,
2439 ModestMsgEditWindow *window)
2441 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2443 modest_msg_edit_window_show_cc (window, gtk_toggle_action_get_active (toggle));
2447 modest_ui_actions_on_toggle_show_bcc (GtkToggleAction *toggle,
2448 ModestMsgEditWindow *window)
2450 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2452 modest_msg_edit_window_show_bcc (window, gtk_toggle_action_get_active (toggle));
2456 modest_ui_actions_toggle_folders_view (GtkAction *action,
2457 ModestMainWindow *main_window)
2461 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
2463 conf = modest_runtime_get_conf ();
2465 if (modest_main_window_get_style (main_window) == MODEST_MAIN_WINDOW_STYLE_SPLIT)
2466 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SIMPLE);
2468 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SPLIT);
2472 modest_ui_actions_on_toggle_toolbar (GtkToggleAction *toggle,
2473 ModestWindow *window)
2475 gboolean active, fullscreen = FALSE;
2476 ModestWindowMgr *mgr;
2478 active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle));
2480 /* Check if we want to toggle the toolbar vuew in fullscreen
2482 if (!strcmp (gtk_action_get_name (GTK_ACTION (toggle)),
2483 "ViewShowToolbarFullScreen")) {
2487 /* Toggle toolbar */
2488 mgr = modest_runtime_get_window_mgr ();
2489 modest_window_mgr_show_toolbars (mgr, active, fullscreen);
2493 modest_ui_actions_msg_edit_on_select_font (GtkAction *action,
2494 ModestMsgEditWindow *window)
2496 modest_msg_edit_window_select_font (window);
2500 modest_ui_actions_on_folder_display_name_changed (ModestFolderView *folder_view,
2501 const gchar *display_name,
2504 /* Do not change the application name if the widget has not
2505 the focus. This callback could be called even if the folder
2506 view has not the focus, because the handled signal could be
2507 emitted when the folder view is redrawn */
2508 if (gtk_widget_is_focus (GTK_WIDGET (folder_view))) {
2510 gtk_window_set_title (window, display_name);
2512 gtk_window_set_title (window, " ");
2517 modest_ui_actions_on_select_contacts (GtkAction *action, ModestMsgEditWindow *window)
2519 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2520 modest_msg_edit_window_select_contacts (window);
2524 modest_ui_actions_on_check_names (GtkAction *action, ModestMsgEditWindow *window)
2526 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2527 modest_msg_edit_window_check_names (window);
2532 create_move_to_dialog (ModestWindow *win,
2533 GtkWidget *folder_view,
2534 GtkWidget **tree_view)
2536 GtkWidget *dialog, *scroll;
2538 dialog = gtk_dialog_new_with_buttons (_("mcen_ti_moveto_folders_title"),
2540 GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR | GTK_DIALOG_DESTROY_WITH_PARENT,
2542 GTK_RESPONSE_ACCEPT,
2544 GTK_RESPONSE_REJECT,
2547 /* Create scrolled window */
2548 scroll = gtk_scrolled_window_new (NULL, NULL);
2549 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
2550 GTK_POLICY_AUTOMATIC,
2551 GTK_POLICY_AUTOMATIC);
2553 /* Create folder view */
2554 *tree_view = modest_folder_view_new (NULL);
2556 /* It could happen that we're trying to move a message from a
2557 window (msg window for example) after the main window was
2558 closed, so we can not just get the model of the folder
2560 if (MODEST_IS_FOLDER_VIEW (folder_view))
2561 gtk_tree_view_set_model (GTK_TREE_VIEW (*tree_view),
2562 gtk_tree_view_get_model (GTK_TREE_VIEW (folder_view)));
2564 modest_folder_view_update_model (MODEST_FOLDER_VIEW (*tree_view),
2565 TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()));
2567 gtk_container_add (GTK_CONTAINER (scroll), *tree_view);
2569 /* Add scroll to dialog */
2570 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
2571 scroll, FALSE, FALSE, 0);
2573 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
2579 * Returns TRUE if at least one of the headers of the list belongs to
2580 * a message that has been fully retrieved.
2583 has_retrieved_msgs (TnyList *list)
2586 gboolean found = FALSE;
2588 iter = tny_list_create_iterator (list);
2589 while (tny_iterator_is_done (iter) && !found) {
2591 TnyHeaderFlags flags;
2593 header = TNY_HEADER (tny_iterator_get_current (iter));
2594 flags = tny_header_get_flags (header);
2595 if (!(flags & TNY_HEADER_FLAG_PARTIAL))
2599 tny_iterator_next (iter);
2601 g_object_unref (iter);
2607 * Shows a confirmation dialog to the user when we're moving messages
2608 * from a remote server to the local storage. Returns the dialog
2609 * response. If it's other kind of movement the it always returns
2613 msgs_move_to_confirmation (GtkWindow *win,
2614 TnyFolder *dest_folder,
2617 gint response = GTK_RESPONSE_OK;
2619 /* If the destination is a local folder */
2620 if (modest_tny_folder_is_local_folder (dest_folder)) {
2621 TnyFolder *src_folder;
2625 /* Get source folder */
2626 iter = tny_list_create_iterator (headers);
2627 header = TNY_HEADER (tny_iterator_get_current (iter));
2628 src_folder = tny_header_get_folder (header);
2629 g_object_unref (header);
2630 g_object_unref (iter);
2632 /* If the source is a remote folder */
2633 if (!modest_tny_folder_is_local_folder (src_folder)) {
2634 const gchar *message;
2636 if (tny_list_get_length (headers) == 1)
2637 if (has_retrieved_msgs (headers))
2638 message = _("mcen_nc_move_retrieve");
2640 message = _("mcen_nc_move_header");
2642 if (has_retrieved_msgs (headers))
2643 message = _("mcen_nc_move_retrieves");
2645 message = _("mcen_nc_move_headers");
2647 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
2648 (const gchar *) message);
2650 g_object_unref (src_folder);
2657 tranasfer_msgs_from_viewer_cb (const GObject *object, gpointer user_data)
2659 ModestMsgViewWindow *self = NULL;
2660 gboolean found = FALSE;
2662 g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (object));
2663 self = MODEST_MSG_VIEW_WINDOW (object);
2665 found = modest_msg_view_window_select_first_message (self);
2666 g_return_if_fail (found);
2670 modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op,
2673 GObject *win = modest_mail_operation_get_source (mail_op);
2675 /* TODO: show error message */
2676 modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL,
2677 _("mail_in_ui_folder_move_target_error"));
2681 * UI handler for the "Move to" action when invoked from the
2685 modest_ui_actions_on_main_window_move_to (GtkAction *action,
2686 ModestMainWindow *win)
2688 GtkWidget *dialog = NULL, *folder_view = NULL, *tree_view = NULL;
2689 GtkWidget *header_view = NULL;
2691 TnyFolderStore *folder_store = NULL;
2692 ModestMailOperation *mail_op = NULL;
2694 g_return_if_fail (MODEST_IS_MAIN_WINDOW (win));
2696 /* Get the folder view */
2697 folder_view = modest_main_window_get_child_widget (win,
2698 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2700 /* Get header view */
2701 header_view = modest_main_window_get_child_widget (win,
2702 MODEST_WIDGET_TYPE_HEADER_VIEW);
2704 /* Create and run the dialog */
2705 dialog = create_move_to_dialog (MODEST_WINDOW (win), folder_view, &tree_view);
2706 modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (tree_view));
2707 result = gtk_dialog_run (GTK_DIALOG(dialog));
2708 g_object_ref (tree_view);
2710 /* We do this to save an indentation level ;-) */
2711 if (result != GTK_RESPONSE_ACCEPT)
2714 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (tree_view));
2716 if (TNY_IS_ACCOUNT (folder_store))
2719 /* Get folder or messages to transfer */
2720 if (gtk_widget_is_focus (folder_view)) {
2721 TnyFolderStore *src_folder;
2722 src_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
2724 /* Clean folder on header view before moving it */
2725 modest_header_view_clear (MODEST_HEADER_VIEW (header_view));
2727 if (TNY_IS_FOLDER (src_folder)) {
2729 modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
2731 modest_ui_actions_move_folder_error_handler,
2733 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
2735 modest_mail_operation_xfer_folder (mail_op,
2736 TNY_FOLDER (src_folder),
2739 /* Unref mail operation */
2740 g_object_unref (G_OBJECT (mail_op));
2744 g_object_unref (G_OBJECT (src_folder));
2746 if (gtk_widget_is_focus (header_view)) {
2750 headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (header_view));
2752 /* Ask for user confirmation */
2753 response = msgs_move_to_confirmation (GTK_WINDOW (win),
2754 TNY_FOLDER (folder_store),
2757 /* Transfer messages */
2758 if (response == GTK_RESPONSE_OK) {
2759 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(win));
2760 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
2763 modest_mail_operation_xfer_msgs (mail_op,
2765 TNY_FOLDER (folder_store),
2770 g_object_unref (G_OBJECT (mail_op));
2772 g_object_unref (headers);
2775 g_object_unref (folder_store);
2777 gtk_widget_destroy (dialog);
2782 * UI handler for the "Move to" action when invoked from the
2783 * ModestMsgViewWindow
2786 modest_ui_actions_on_msg_view_window_move_to (GtkAction *action,
2787 ModestMsgViewWindow *win)
2789 GtkWidget *dialog, *folder_view, *tree_view = NULL;
2791 ModestMainWindow *main_window;
2795 /* Get the folder view */
2796 main_window = MODEST_MAIN_WINDOW (modest_window_mgr_get_main_window (modest_runtime_get_window_mgr ()));
2798 folder_view = modest_main_window_get_child_widget (main_window,
2799 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2803 /* Create and run the dialog */
2804 dialog = create_move_to_dialog (MODEST_WINDOW (win), folder_view, &tree_view);
2805 result = gtk_dialog_run (GTK_DIALOG(dialog));
2806 g_object_ref (tree_view);
2808 if (result == GTK_RESPONSE_ACCEPT) {
2809 TnyFolderStore *folder_store;
2812 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (tree_view));
2814 /* Create header list */
2815 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
2816 headers = tny_simple_list_new ();
2817 tny_list_prepend (headers, G_OBJECT (header));
2818 g_object_unref (header);
2820 /* Ask user for confirmation. MSG-NOT404 */
2821 response = msgs_move_to_confirmation (GTK_WINDOW (win),
2822 TNY_FOLDER (folder_store),
2825 /* Transfer current msg */
2826 if (response == GTK_RESPONSE_OK) {
2827 ModestMailOperation *mail_op;
2829 /* Create mail op */
2830 mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(win));
2831 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
2834 /* Transfer messages */
2835 modest_mail_operation_xfer_msgs (mail_op,
2837 TNY_FOLDER (folder_store),
2839 tranasfer_msgs_from_viewer_cb,
2841 g_object_unref (G_OBJECT (mail_op));
2843 g_object_unref (headers);
2844 g_object_unref (folder_store);
2846 gtk_widget_destroy (dialog);
2850 modest_ui_actions_on_move_to (GtkAction *action,
2853 g_return_if_fail (MODEST_IS_MAIN_WINDOW (win) ||
2854 MODEST_IS_MSG_VIEW_WINDOW (win));
2856 if (MODEST_IS_MAIN_WINDOW (win))
2857 modest_ui_actions_on_main_window_move_to (action,
2858 MODEST_MAIN_WINDOW (win));
2860 modest_ui_actions_on_msg_view_window_move_to (action,
2861 MODEST_MSG_VIEW_WINDOW (win));
2865 * Calls #HeadersFunc for each header already selected in the main
2866 * window or the message currently being shown in the msg view window
2869 do_headers_action (ModestWindow *win,
2873 TnyList *headers_list;
2877 headers_list = get_selected_headers (win);
2881 /* Call the function for each header */
2882 iter = tny_list_create_iterator (headers_list);
2883 while (!tny_iterator_is_done (iter)) {
2886 header = TNY_HEADER (tny_iterator_get_current (iter));
2887 func (header, win, user_data);
2888 g_object_unref (header);
2889 tny_iterator_next (iter);
2891 g_object_unref (iter);
2892 g_object_unref (headers_list);
2896 modest_ui_actions_view_attachment (GtkAction *action,
2897 ModestWindow *window)
2899 if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
2900 modest_msg_view_window_view_attachment (MODEST_MSG_VIEW_WINDOW (window), NULL);
2902 /* not supported window for this action */
2903 g_return_if_reached ();
2908 modest_ui_actions_save_attachments (GtkAction *action,
2909 ModestWindow *window)
2911 if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
2912 modest_msg_view_window_save_attachments (MODEST_MSG_VIEW_WINDOW (window), NULL);
2914 /* not supported window for this action */
2915 g_return_if_reached ();
2920 modest_ui_actions_remove_attachments (GtkAction *action,
2921 ModestWindow *window)
2923 if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
2924 modest_msg_view_window_remove_attachments (MODEST_MSG_VIEW_WINDOW (window), NULL);
2926 /* not supported window for this action */
2927 g_return_if_reached ();
2932 modest_ui_actions_on_settings (GtkAction *action,
2937 dialog = modest_platform_get_global_settings_dialog ();
2938 gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (win));
2939 gtk_widget_show (dialog);
2941 gtk_dialog_run (GTK_DIALOG (dialog));
2943 gtk_widget_destroy (dialog);
2947 modest_ui_actions_on_help (GtkAction *action,
2950 const gchar *help_id = NULL;
2952 if (MODEST_IS_MAIN_WINDOW (win)) {
2953 const gchar *action_name;
2954 action_name = gtk_action_get_name (action);
2956 if (!strcmp (action_name, "FolderViewCSMHelp") ||
2957 !strcmp (action_name, "HeaderViewCSMHelp")) {
2958 GtkWidget *folder_view;
2959 TnyFolderStore *folder_store;
2960 /* Get selected folder */
2961 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2962 MODEST_WIDGET_TYPE_FOLDER_VIEW);
2963 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
2965 /* Switch help_id */
2966 if (TNY_IS_FOLDER (folder_store)) {
2967 switch (tny_folder_get_folder_type (TNY_FOLDER (folder_store))) {
2968 case TNY_FOLDER_TYPE_NORMAL:
2969 help_id = "applications_email_userfolder";
2971 case TNY_FOLDER_TYPE_INBOX:
2972 help_id = "applications_email_inbox";
2974 case TNY_FOLDER_TYPE_OUTBOX:
2975 help_id = "applications_email_outbox";
2977 case TNY_FOLDER_TYPE_SENT:
2978 help_id = "applications_email_sent";
2980 case TNY_FOLDER_TYPE_DRAFTS:
2981 help_id = "applications_email_drafts";
2983 case TNY_FOLDER_TYPE_ARCHIVE:
2984 help_id = "applications_email_archive";
2991 help_id = "applications_email_mainview";
2993 } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2994 help_id = "applications_email_viewer";
2995 } else if (MODEST_IS_MSG_EDIT_WINDOW (win))
2996 help_id = "applications_email_editor";
2998 modest_platform_show_help (GTK_WINDOW (win), help_id);
3002 modest_ui_actions_on_retrieve_msg_contents (GtkAction *action,
3003 ModestWindow *window)
3005 ModestMailOperation *mail_op;
3009 headers = get_selected_headers (window);
3013 /* Create mail operation */
3014 mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE,
3016 modest_ui_actions_get_msgs_full_error_handler,
3018 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
3019 modest_mail_operation_get_msgs_full (mail_op, headers, NULL, NULL, NULL);
3022 g_object_unref (headers);
3023 g_object_unref (mail_op);
3027 modest_ui_actions_on_email_menu_activated (GtkAction *action,
3028 ModestWindow *window)
3030 g_return_if_fail (MODEST_IS_WINDOW (window));
3033 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3037 modest_ui_actions_on_edit_menu_activated (GtkAction *action,
3038 ModestWindow *window)
3040 g_return_if_fail (MODEST_IS_WINDOW (window));
3043 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3047 modest_ui_actions_on_view_menu_activated (GtkAction *action,
3048 ModestWindow *window)
3050 g_return_if_fail (MODEST_IS_WINDOW (window));
3053 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3057 modest_ui_actions_on_tools_menu_activated (GtkAction *action,
3058 ModestWindow *window)
3060 g_return_if_fail (MODEST_IS_WINDOW (window));
3063 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3067 modest_ui_actions_on_attachment_menu_activated (GtkAction *action,
3068 ModestWindow *window)
3070 g_return_if_fail (MODEST_IS_WINDOW (window));
3073 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3077 modest_ui_actions_on_toolbar_csm_menu_activated (GtkAction *action,
3078 ModestWindow *window)
3080 g_return_if_fail (MODEST_IS_WINDOW (window));
3083 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3087 modest_ui_actions_on_folder_view_csm_menu_activated (GtkAction *action,
3088 ModestWindow *window)
3090 g_return_if_fail (MODEST_IS_WINDOW (window));
3093 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3097 modest_ui_actions_on_header_view_csm_menu_activated (GtkAction *action,
3098 ModestWindow *window)
3100 g_return_if_fail (MODEST_IS_WINDOW (window));
3103 modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");
3107 modest_ui_actions_check_toolbar_dimming_rules (ModestWindow *window)
3109 g_return_if_fail (MODEST_IS_WINDOW (window));
3112 modest_window_check_dimming_rules_group (window, "ModestToolbarDimmingRules");
3116 modest_ui_actions_on_search_messages (GtkAction *action, ModestWindow *window)
3118 g_return_if_fail (MODEST_IS_WINDOW (window));
3120 modest_platform_show_search_messages (GTK_WINDOW (window));
3124 modest_ui_actions_on_open_addressbook (GtkAction *action, ModestWindow *win)
3126 g_return_if_fail (MODEST_IS_WINDOW (win));
3127 modest_platform_show_addressbook (GTK_WINDOW (win));
3132 modest_ui_actions_on_toggle_find_in_page (GtkToggleAction *action,
3133 ModestWindow *window)
3135 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
3137 modest_msg_edit_window_toggle_find_toolbar (MODEST_MSG_EDIT_WINDOW (window), gtk_toggle_action_get_active (action));
3141 _on_send_receive_progress_changed (ModestMailOperation *mail_op,
3142 ModestMailOperationState *state,
3145 g_return_if_fail (MODEST_IS_MAIN_WINDOW(user_data));
3147 /* Set send/receive operation finished */
3148 if (state->status != MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS)
3149 modest_main_window_notify_send_receive_completed (MODEST_MAIN_WINDOW(user_data));