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-defs.h>
39 #include <modest-tny-folder.h>
40 #include <modest-tny-msg.h>
41 #include <modest-tny-account.h>
42 #include <modest-address-book.h>
43 #include "modest-error.h"
44 #include "modest-ui-actions.h"
45 #include "modest-tny-platform-factory.h"
46 #include "modest-platform.h"
47 #include "modest-debug.h"
48 #include <tny-mime-part.h>
49 #include <tny-error.h>
50 #include <tny-camel-folder.h>
51 #include <tny-camel-imap-folder.h>
52 #include <tny-camel-pop-folder.h>
53 #ifdef MODEST_TOOLKIT_HILDON2
54 #include <modest-accounts-window.h>
55 #include <hildon/hildon-pannable-area.h>
56 #include <hildon/hildon-gtk.h>
57 #include <modest-header-window.h>
58 #include <modest-folder-window.h>
59 #include <modest-maemo-utils.h>
62 #ifdef MODEST_PLATFORM_MAEMO
63 #include "maemo/modest-osso-state-saving.h"
64 #endif /* MODEST_PLATFORM_MAEMO */
65 #ifndef MODEST_TOOLKIT_GTK
66 #include "maemo/modest-hildon-includes.h"
67 #include "maemo/modest-connection-specific-smtp-window.h"
68 #endif /* !MODEST_TOOLKIT_GTK */
69 #include <modest-utils.h>
71 #include "widgets/modest-ui-constants.h"
72 #include <widgets/modest-main-window.h>
73 #include <widgets/modest-msg-view-window.h>
74 #include <widgets/modest-account-view-window.h>
75 #include <widgets/modest-details-dialog.h>
76 #include <widgets/modest-attachments-view.h>
77 #include "widgets/modest-folder-view.h"
78 #include "widgets/modest-global-settings-dialog.h"
79 #include "modest-account-mgr-helpers.h"
80 #include "modest-mail-operation.h"
81 #include "modest-text-utils.h"
82 #include <modest-widget-memory.h>
83 #include <tny-error.h>
84 #include <tny-simple-list.h>
85 #include <tny-msg-view.h>
86 #include <tny-device.h>
87 #include <tny-merge-folder.h>
89 #include <gtkhtml/gtkhtml.h>
91 #define MIN_FREE_SPACE 5 * 1024 * 1024
92 #define MODEST_MOVE_TO_DIALOG_FOLDER_VIEW "move-to-dialog-folder-view"
94 typedef struct _GetMsgAsyncHelper {
96 ModestMailOperation *mail_op;
103 typedef enum _ReplyForwardAction {
107 } ReplyForwardAction;
109 typedef struct _ReplyForwardHelper {
110 guint reply_forward_type;
111 ReplyForwardAction action;
114 GtkWidget *parent_window;
116 } ReplyForwardHelper;
118 typedef struct _MoveToHelper {
119 GtkTreeRowReference *reference;
123 typedef struct _PasteAsAttachmentHelper {
124 ModestMsgEditWindow *window;
126 } PasteAsAttachmentHelper;
134 * The do_headers_action uses this kind of functions to perform some
135 * action to each member of a list of headers
137 typedef void (*HeadersFunc) (TnyHeader *header, ModestWindow *win, gpointer user_data);
139 static void do_headers_action (ModestWindow *win,
143 static void open_msg_cb (ModestMailOperation *mail_op,
150 static void reply_forward_cb (ModestMailOperation *mail_op,
157 static void reply_forward (ReplyForwardAction action, ModestWindow *win);
159 static void folder_refreshed_cb (ModestMailOperation *mail_op,
163 static void on_send_receive_finished (ModestMailOperation *mail_op,
166 static gint header_list_count_uncached_msgs (TnyList *header_list);
168 static gboolean connect_to_get_msg (ModestWindow *win,
169 gint num_of_uncached_msgs,
170 TnyAccount *account);
172 static gboolean remote_folder_has_leave_on_server (TnyFolderStore *folder);
174 static void do_create_folder (GtkWindow *window,
175 TnyFolderStore *parent_folder,
176 const gchar *suggested_name);
178 static TnyAccount *get_account_from_folder_store (TnyFolderStore *folder_store);
180 static void modest_ui_actions_on_main_window_move_to (GtkAction *action,
181 GtkWidget *folder_view,
182 TnyFolderStore *dst_folder,
183 ModestMainWindow *win);
184 #ifdef MODEST_TOOLKIT_HILDON2
185 static void modest_ui_actions_on_folder_window_move_to (GtkWidget *folder_view,
186 TnyFolderStore *dst_folder,
191 static void modest_ui_actions_on_window_move_to (GtkAction *action,
192 TnyList *list_to_move,
193 TnyFolderStore *dst_folder,
197 * This function checks whether a TnyFolderStore is a pop account
200 remote_folder_has_leave_on_server (TnyFolderStore *folder)
205 g_return_val_if_fail (TNY_IS_FOLDER_STORE (folder), FALSE);
207 account = get_account_from_folder_store (folder);
208 result = (modest_protocol_registry_protocol_type_has_leave_on_server (modest_runtime_get_protocol_registry (),
209 modest_tny_account_get_protocol_type (account)));
210 g_object_unref (account);
215 /* FIXME: this should be merged with the similar code in modest-account-view-window */
216 /* Show the account creation wizard dialog.
217 * returns: TRUE if an account was created. FALSE if the user cancelled.
220 modest_ui_actions_run_account_setup_wizard (ModestWindow *win)
222 gboolean result = FALSE;
224 gint dialog_response;
226 /* there is no such wizard yet */
227 wizard = GTK_WINDOW (modest_platform_get_account_settings_wizard ());
228 modest_window_mgr_set_modal (modest_runtime_get_window_mgr(), GTK_WINDOW (wizard), (GtkWindow *) win);
230 #ifndef MODEST_TOOLKIT_HILDON2
231 /* always present a main window in the background
232 * we do it here, so we cannot end up with two wizards (as this
233 * function might be called in modest_window_mgr_get_main_window as well */
235 win = modest_window_mgr_get_main_window (modest_runtime_get_window_mgr(),
236 TRUE); /* create if not existent */
240 ModestWindowMgr *mgr;
242 mgr = modest_runtime_get_window_mgr ();
244 window_list = modest_window_mgr_get_window_list (mgr);
245 if (window_list == NULL) {
246 win = MODEST_WINDOW (modest_accounts_window_new ());
247 if (modest_window_mgr_register_window (mgr, win, NULL)) {
248 gtk_widget_show_all (GTK_WIDGET (win));
250 gtk_widget_destroy (GTK_WIDGET (win));
255 g_list_free (window_list);
261 gtk_window_set_transient_for (GTK_WINDOW (wizard), GTK_WINDOW (win));
263 /* make sure the mainwindow is visible. We need to present the
264 wizard again to give it the focus back. show_all are needed
265 in order to get the widgets properly drawn (MainWindow main
266 paned won't be in its right position and the dialog will be
268 #ifndef MODEST_TOOLKIT_HILDON2
269 gtk_widget_show_all (GTK_WIDGET (win));
270 gtk_widget_show_all (GTK_WIDGET (wizard));
271 gtk_window_present (GTK_WINDOW (win));
272 gtk_window_present (GTK_WINDOW (wizard));
275 dialog_response = gtk_dialog_run (GTK_DIALOG (wizard));
276 gtk_widget_destroy (GTK_WIDGET (wizard));
277 if (gtk_events_pending ())
278 gtk_main_iteration ();
280 if (dialog_response == GTK_RESPONSE_CANCEL) {
283 /* Check whether an account was created: */
284 result = modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE);
291 modest_ui_actions_on_about (GtkAction *action, ModestWindow *win)
294 const gchar *authors[] = {
295 "Dirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>",
298 about = gtk_about_dialog_new ();
299 gtk_about_dialog_set_name (GTK_ABOUT_DIALOG(about), PACKAGE_NAME);
300 gtk_about_dialog_set_version (GTK_ABOUT_DIALOG(about),PACKAGE_VERSION);
301 gtk_about_dialog_set_copyright (GTK_ABOUT_DIALOG(about),
302 _("Copyright (c) 2006, Nokia Corporation\n"
303 "All rights reserved."));
304 gtk_about_dialog_set_comments (GTK_ABOUT_DIALOG(about),
305 _("a modest e-mail client\n\n"
306 "design and implementation: Dirk-Jan C. Binnema\n"
307 "contributions from the fine people at KC and Ig\n"
308 "uses the tinymail email framework written by Philip van Hoof"));
309 gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG(about), authors);
310 gtk_about_dialog_set_website (GTK_ABOUT_DIALOG(about), "http://modest.garage.maemo.org");
311 gtk_window_set_transient_for (GTK_WINDOW (about), GTK_WINDOW (win));
312 gtk_window_set_modal (GTK_WINDOW (about), TRUE);
314 gtk_dialog_run (GTK_DIALOG (about));
315 gtk_widget_destroy(about);
319 * Gets the list of currently selected messages. If the win is the
320 * main window, then it returns a newly allocated list of the headers
321 * selected in the header view. If win is the msg view window, then
322 * the value returned is a list with just a single header.
324 * The caller of this funcion must free the list.
327 get_selected_headers (ModestWindow *win)
329 if (MODEST_IS_MAIN_WINDOW(win)) {
330 GtkWidget *header_view;
332 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
333 MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
334 return modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
336 } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
337 /* for MsgViewWindows, we simply return a list with one element */
339 TnyList *list = NULL;
341 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
342 if (header != NULL) {
343 list = tny_simple_list_new ();
344 tny_list_prepend (list, G_OBJECT(header));
345 g_object_unref (G_OBJECT(header));
350 #ifdef MODEST_TOOLKIT_HILDON2
351 } else if (MODEST_IS_HEADER_WINDOW (win)) {
352 GtkWidget *header_view;
354 header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (win)));
355 return modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
361 static GtkTreeRowReference *
362 get_next_after_selected_headers (ModestHeaderView *header_view)
364 GtkTreeSelection *sel;
365 GList *selected_rows, *node;
367 GtkTreeRowReference *result;
370 model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
371 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (header_view));
372 selected_rows = gtk_tree_selection_get_selected_rows (sel, NULL);
374 if (selected_rows == NULL)
377 node = g_list_last (selected_rows);
378 path = gtk_tree_path_copy ((GtkTreePath *) node->data);
379 gtk_tree_path_next (path);
381 result = gtk_tree_row_reference_new (model, path);
383 gtk_tree_path_free (path);
384 g_list_foreach (selected_rows, (GFunc) gtk_tree_path_free, NULL);
385 g_list_free (selected_rows);
391 headers_action_mark_as_read (TnyHeader *header,
395 TnyHeaderFlags flags;
397 g_return_if_fail (TNY_IS_HEADER(header));
399 flags = tny_header_get_flags (header);
400 if (flags & TNY_HEADER_FLAG_SEEN) return;
401 tny_header_set_flag (header, TNY_HEADER_FLAG_SEEN);
405 headers_action_mark_as_unread (TnyHeader *header,
409 TnyHeaderFlags flags;
411 g_return_if_fail (TNY_IS_HEADER(header));
413 flags = tny_header_get_flags (header);
414 if (flags & TNY_HEADER_FLAG_SEEN) {
415 tny_header_unset_flag (header, TNY_HEADER_FLAG_SEEN);
419 /** After deleing a message that is currently visible in a window,
420 * show the next message from the list, or close the window if there are no more messages.
423 modest_ui_actions_refresh_message_window_after_delete (ModestMsgViewWindow* win)
425 /* Close msg view window or select next */
426 if (!modest_msg_view_window_select_next_message (win) &&
427 !modest_msg_view_window_select_previous_message (win)) {
429 g_signal_emit_by_name (G_OBJECT (win), "delete-event", NULL, &ret_value);
435 modest_ui_actions_on_delete_message (GtkAction *action, ModestWindow *win)
437 modest_ui_actions_on_edit_mode_delete_message (win);
441 modest_ui_actions_on_edit_mode_delete_message (ModestWindow *win)
443 TnyList *header_list = NULL;
444 TnyIterator *iter = NULL;
445 TnyHeader *header = NULL;
446 gchar *message = NULL;
449 ModestWindowMgr *mgr;
450 GtkWidget *header_view = NULL;
451 gboolean retval = TRUE;
453 g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
455 /* Check first if the header view has the focus */
456 if (MODEST_IS_MAIN_WINDOW (win)) {
458 modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
459 MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
460 if (!gtk_widget_is_focus (header_view))
464 /* Get the headers, either from the header view (if win is the main window),
465 * or from the message view window: */
466 header_list = get_selected_headers (win);
467 if (!header_list) return FALSE;
469 /* Check if any of the headers are already opened, or in the process of being opened */
470 if (MODEST_IS_MAIN_WINDOW (win)) {
471 gint opened_headers = 0;
473 iter = tny_list_create_iterator (header_list);
474 mgr = modest_runtime_get_window_mgr ();
475 while (!tny_iterator_is_done (iter)) {
476 header = TNY_HEADER (tny_iterator_get_current (iter));
478 if (modest_window_mgr_find_registered_header (mgr, header, NULL))
480 g_object_unref (header);
482 tny_iterator_next (iter);
484 g_object_unref (iter);
486 if (opened_headers > 0) {
489 msg = g_strdup_printf (_("mcen_nc_unable_to_delete_n_messages"),
492 modest_platform_run_information_dialog (GTK_WINDOW (win), (const gchar *) msg, FALSE);
495 g_object_unref (header_list);
501 if (tny_list_get_length(header_list) == 1) {
502 iter = tny_list_create_iterator (header_list);
503 header = TNY_HEADER (tny_iterator_get_current (iter));
506 subject = tny_header_dup_subject (header);
508 subject = g_strdup (_("mail_va_no_subject"));
509 desc = g_strdup_printf ("%s", subject);
511 g_object_unref (header);
514 g_object_unref (iter);
516 message = g_strdup_printf(ngettext("emev_nc_delete_message", "emev_nc_delete_messages",
517 tny_list_get_length(header_list)), desc);
519 /* Confirmation dialog */
520 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
524 if (response == GTK_RESPONSE_OK) {
525 ModestWindow *main_window = NULL;
526 ModestWindowMgr *mgr = NULL;
527 GtkTreeModel *model = NULL;
528 GtkTreeSelection *sel = NULL;
529 GList *sel_list = NULL, *tmp = NULL;
530 GtkTreeRowReference *next_row_reference = NULL;
531 GtkTreeRowReference *prev_row_reference = NULL;
532 GtkTreePath *next_path = NULL;
533 GtkTreePath *prev_path = NULL;
534 ModestMailOperation *mail_op = NULL;
536 /* Find last selected row */
537 if (MODEST_IS_MAIN_WINDOW (win)) {
538 model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
539 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (header_view));
540 sel_list = gtk_tree_selection_get_selected_rows (sel, &model);
541 for (tmp=sel_list; tmp; tmp=tmp->next) {
542 if (tmp->next == NULL) {
543 prev_path = gtk_tree_path_copy((GtkTreePath *) tmp->data);
544 next_path = gtk_tree_path_copy((GtkTreePath *) tmp->data);
546 gtk_tree_path_prev (prev_path);
547 gtk_tree_path_next (next_path);
549 prev_row_reference = gtk_tree_row_reference_new (model, prev_path);
550 next_row_reference = gtk_tree_row_reference_new (model, next_path);
555 /* Disable window dimming management */
556 modest_window_disable_dimming (MODEST_WINDOW(win));
558 /* Remove each header. If it's a view window header_view == NULL */
559 mail_op = modest_mail_operation_new ((GObject *) win);
560 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
562 modest_mail_operation_remove_msgs (mail_op, header_list, FALSE);
563 g_object_unref (mail_op);
565 /* Enable window dimming management */
567 gtk_tree_selection_unselect_all (sel);
569 modest_window_enable_dimming (MODEST_WINDOW(win));
571 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
572 modest_ui_actions_refresh_message_window_after_delete (MODEST_MSG_VIEW_WINDOW (win));
574 /* Get main window */
575 mgr = modest_runtime_get_window_mgr ();
576 main_window = modest_window_mgr_get_main_window (mgr, FALSE); /* don't create */
577 } else if (MODEST_IS_MAIN_WINDOW (win)) {
578 /* Move cursor to next row */
581 /* Select next or previous row */
582 if (gtk_tree_row_reference_valid (next_row_reference)) {
583 gtk_tree_selection_select_path (sel, next_path);
585 else if (gtk_tree_row_reference_valid (prev_row_reference)) {
586 gtk_tree_selection_select_path (sel, prev_path);
590 if (gtk_tree_row_reference_valid (next_row_reference))
591 gtk_tree_row_reference_free (next_row_reference);
592 if (next_path != NULL)
593 gtk_tree_path_free (next_path);
594 if (gtk_tree_row_reference_valid (prev_row_reference))
595 gtk_tree_row_reference_free (prev_row_reference);
596 if (prev_path != NULL)
597 gtk_tree_path_free (prev_path);
600 /* Update toolbar dimming state */
602 modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (main_window));
603 modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
607 g_list_foreach (sel_list, (GFunc) gtk_tree_path_free, NULL);
608 g_list_free (sel_list);
617 g_object_unref (header_list);
625 /* delete either message or folder, based on where we are */
627 modest_ui_actions_on_delete_message_or_folder (GtkAction *action, ModestWindow *win)
629 g_return_if_fail (MODEST_IS_WINDOW(win));
631 /* Check first if the header view has the focus */
632 if (MODEST_IS_MAIN_WINDOW (win)) {
634 w = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
635 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
636 if (gtk_widget_is_focus (w)) {
637 modest_ui_actions_on_delete_folder (action, MODEST_WINDOW(win));
641 modest_ui_actions_on_delete_message (action, win);
645 modest_ui_actions_on_quit (GtkAction *action, ModestWindow *win)
647 ModestWindowMgr *mgr = NULL;
649 #ifdef MODEST_PLATFORM_MAEMO
650 modest_osso_save_state();
651 #endif /* MODEST_PLATFORM_MAEMO */
653 g_debug ("closing down, clearing %d item(s) from operation queue",
654 modest_mail_operation_queue_num_elements
655 (modest_runtime_get_mail_operation_queue()));
657 /* cancel all outstanding operations */
658 modest_mail_operation_queue_cancel_all
659 (modest_runtime_get_mail_operation_queue());
661 g_debug ("queue has been cleared");
664 /* Check if there are opened editing windows */
665 mgr = modest_runtime_get_window_mgr ();
666 modest_window_mgr_close_all_windows (mgr);
668 /* note: when modest-tny-account-store is finalized,
669 it will automatically set all network connections
672 /* gtk_main_quit (); */
676 modest_ui_actions_on_close_window (GtkAction *action, ModestWindow *win)
680 g_signal_emit_by_name (G_OBJECT (win), "delete-event", NULL, &ret_value);
682 /* if (MODEST_IS_MSG_VIEW_WINDOW (win)) { */
683 /* gtk_widget_destroy (GTK_WIDGET (win)); */
684 /* } else if (MODEST_IS_MSG_EDIT_WINDOW (win)) { */
685 /* gboolean ret_value; */
686 /* g_signal_emit_by_name (G_OBJECT (win), "delete-event", NULL, &ret_value); */
687 /* } else if (MODEST_IS_WINDOW (win)) { */
688 /* gtk_widget_destroy (GTK_WIDGET (win)); */
690 /* g_return_if_reached (); */
695 modest_ui_actions_add_to_contacts (GtkAction *action, ModestWindow *win)
697 g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win));
699 modest_msg_view_window_add_to_contacts (MODEST_MSG_VIEW_WINDOW (win));
703 modest_ui_actions_on_add_to_contacts (GtkAction *action, ModestWindow *win)
705 GtkClipboard *clipboard = NULL;
706 gchar *selection = NULL;
708 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
709 selection = gtk_clipboard_wait_for_text (clipboard);
711 /* Question: why is the clipboard being used here?
712 * It doesn't really make a lot of sense. */
716 modest_address_book_add_address (selection);
722 modest_ui_actions_on_new_account (GtkAction *action,
723 ModestWindow *window)
725 if (!modest_ui_actions_run_account_setup_wizard (window)) {
726 g_debug ("%s: wizard was already running", __FUNCTION__);
731 modest_ui_actions_on_accounts (GtkAction *action,
734 /* This is currently only implemented for Maemo */
735 if (!modest_account_mgr_has_accounts (modest_runtime_get_account_mgr(), TRUE)) {
736 if (!modest_ui_actions_run_account_setup_wizard (win))
737 g_debug ("%s: wizard was already running", __FUNCTION__);
741 /* Show the list of accounts */
742 GtkWindow *account_win = GTK_WINDOW (modest_account_view_window_new ());
744 /* The accounts dialog must be modal */
745 modest_window_mgr_set_modal (modest_runtime_get_window_mgr (), GTK_WINDOW (account_win), (GtkWindow *) win);
746 modest_utils_show_dialog_and_forget (GTK_WINDOW (win), GTK_DIALOG (account_win));
751 modest_ui_actions_on_smtp_servers (GtkAction *action, ModestWindow *win)
753 /* This is currently only implemented for Maemo,
754 * because it requires an API (libconic) to detect different connection
757 #ifndef MODEST_TOOLKIT_GTK /* Defined in config.h */
759 /* Create the window if necessary: */
760 GtkWidget *specific_window = GTK_WIDGET (modest_connection_specific_smtp_window_new ());
761 modest_connection_specific_smtp_window_fill_with_connections (
762 MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (specific_window),
763 modest_runtime_get_account_mgr());
765 /* Show the window: */
766 modest_window_mgr_set_modal (modest_runtime_get_window_mgr (),
767 GTK_WINDOW (specific_window), (GtkWindow *) win);
768 gtk_widget_show (specific_window);
769 #endif /* !MODEST_TOOLKIT_GTK */
773 count_part_size (const gchar *part)
775 GnomeVFSURI *vfs_uri;
776 gchar *escaped_filename;
778 GnomeVFSFileInfo *info;
781 /* Estimation of attachment size if we cannot get it from file info */
784 vfs_uri = gnome_vfs_uri_new (part);
786 escaped_filename = g_path_get_basename (gnome_vfs_uri_get_path (vfs_uri));
787 filename = gnome_vfs_unescape_string_for_display (escaped_filename);
788 g_free (escaped_filename);
789 gnome_vfs_uri_unref (vfs_uri);
791 info = gnome_vfs_file_info_new ();
793 if (gnome_vfs_get_file_info (part,
795 GNOME_VFS_FILE_INFO_GET_MIME_TYPE)
797 if (info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_SIZE) {
802 gnome_vfs_file_info_unref (info);
808 count_parts_size (GSList *parts)
813 for (node = parts; node != NULL; node = g_slist_next (node)) {
814 result += count_part_size ((const gchar *) node->data);
821 modest_ui_actions_compose_msg(ModestWindow *win,
824 const gchar *bcc_str,
825 const gchar *subject_str,
826 const gchar *body_str,
828 gboolean set_as_modified)
830 gchar *account_name = NULL;
831 const gchar *mailbox;
833 TnyAccount *account = NULL;
834 TnyFolder *folder = NULL;
835 gchar *from_str = NULL, *signature = NULL, *body = NULL;
836 gchar *recipient = NULL;
837 gboolean use_signature = FALSE;
838 ModestWindow *msg_win = NULL;
839 ModestAccountMgr *mgr = modest_runtime_get_account_mgr();
840 ModestTnyAccountStore *store = modest_runtime_get_account_store();
841 GnomeVFSFileSize total_size, allowed_size;
842 guint64 available_disk, expected_size, parts_size;
845 /* we check for low-mem */
846 if (modest_platform_check_memory_low (win, TRUE))
849 available_disk = modest_utils_get_available_space (NULL);
850 parts_count = g_slist_length (attachments);
851 parts_size = count_parts_size (attachments);
852 expected_size = modest_tny_msg_estimate_size (body, NULL, parts_count, parts_size);
854 /* Double check: memory full condition or message too big */
855 if (available_disk < MIN_FREE_SPACE ||
856 expected_size > available_disk) {
857 gchar *msg = g_strdup_printf (_KR("cerm_device_memory_full"), "");
858 modest_platform_system_banner (NULL, NULL, msg);
864 if (expected_size > MODEST_MAX_ATTACHMENT_SIZE) {
865 modest_platform_run_information_dialog (
867 _KR("memr_ib_operation_disabled"),
873 #ifdef MODEST_TOOLKIT_HILDON2
875 account_name = g_strdup (modest_window_get_active_account(win));
878 account_name = modest_account_mgr_get_default_account(mgr);
881 g_printerr ("modest: no account found\n");
886 mailbox = modest_window_get_active_mailbox (win);
889 account = modest_tny_account_store_get_server_account (store, account_name, TNY_ACCOUNT_TYPE_STORE);
891 g_printerr ("modest: failed to get tnyaccount for '%s'\n", account_name);
894 folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS);
896 g_printerr ("modest: failed to find Drafts folder\n");
899 from_str = modest_account_mgr_get_from_string (mgr, account_name, mailbox);
901 g_printerr ("modest: failed get from string for '%s'\n", account_name);
905 recipient = modest_text_utils_get_email_address (from_str);
906 signature = modest_account_mgr_get_signature_from_recipient (mgr, recipient, &use_signature);
908 if (body_str != NULL) {
909 body = use_signature ? g_strconcat(body_str, "\n--\n", signature, NULL) : g_strdup(body_str);
911 body = use_signature ? g_strconcat("\n--\n", signature, NULL) : g_strdup("");
914 msg = modest_tny_msg_new (to_str, from_str, cc_str, bcc_str, subject_str, NULL, NULL, body, NULL, NULL, NULL);
916 g_printerr ("modest: failed to create new msg\n");
920 /* Create and register edit window */
921 /* This is destroyed by TODO. */
923 allowed_size = MODEST_MAX_ATTACHMENT_SIZE;
924 msg_win = modest_msg_edit_window_new (msg, account_name, mailbox, FALSE);
926 if (!modest_window_mgr_register_window (modest_runtime_get_window_mgr(), msg_win, win)) {
927 gtk_widget_destroy (GTK_WIDGET (msg_win));
930 modest_msg_edit_window_set_modified (MODEST_MSG_EDIT_WINDOW (msg_win), set_as_modified);
931 gtk_widget_show_all (GTK_WIDGET (msg_win));
933 while (attachments) {
934 GnomeVFSFileSize att_size;
936 modest_msg_edit_window_attach_file_one((ModestMsgEditWindow *)msg_win,
937 attachments->data, allowed_size);
938 total_size += att_size;
940 if (att_size > allowed_size) {
941 g_debug ("%s: total size: %u",
942 __FUNCTION__, (unsigned int)total_size);
945 allowed_size -= att_size;
947 attachments = g_slist_next(attachments);
954 g_free (account_name);
956 g_object_unref (G_OBJECT(account));
958 g_object_unref (G_OBJECT(folder));
960 g_object_unref (G_OBJECT(msg));
964 modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win)
966 /* if there are no accounts yet, just show the wizard */
967 if (!modest_account_mgr_has_accounts (modest_runtime_get_account_mgr(), TRUE))
968 if (!modest_ui_actions_run_account_setup_wizard (win))
971 modest_ui_actions_compose_msg(win, NULL, NULL, NULL, NULL, NULL, NULL, FALSE);
976 modest_ui_actions_msg_retrieval_check (ModestMailOperation *mail_op,
980 ModestMailOperationStatus status;
982 /* If there is no message or the operation was not successful */
983 status = modest_mail_operation_get_status (mail_op);
984 if (!msg || status != MODEST_MAIL_OPERATION_STATUS_SUCCESS) {
987 /* If it's a memory low issue, then show a banner */
988 error = modest_mail_operation_get_error (mail_op);
989 if (error && error->domain == MODEST_MAIL_OPERATION_ERROR &&
990 error->code == MODEST_MAIL_OPERATION_ERROR_LOW_MEMORY) {
991 GObject *source = modest_mail_operation_get_source (mail_op);
992 modest_platform_run_information_dialog (GTK_IS_WINDOW (source) ? GTK_WINDOW (source) : NULL,
993 _KR("memr_ib_operation_disabled"),
995 g_object_unref (source);
998 if (error && ((error->code == TNY_SERVICE_ERROR_NO_SUCH_MESSAGE) ||
999 error->code == TNY_SERVICE_ERROR_MESSAGE_NOT_AVAILABLE)) {
1000 gchar *subject, *msg, *format = NULL;
1001 TnyAccount *account;
1002 subject = tny_header_dup_subject (header);
1004 subject = g_strdup (_("mail_va_no_subject"));
1006 account = modest_mail_operation_get_account (mail_op);
1008 ModestProtocol *protocol;
1009 ModestProtocolType proto;
1010 proto = modest_tny_account_get_protocol_type (account);
1011 protocol = modest_protocol_registry_get_protocol_by_type (modest_runtime_get_protocol_registry (), proto);
1013 format = modest_protocol_get_translation (protocol, MODEST_PROTOCOL_TRANSLATION_MSG_NOT_AVAILABLE, subject);
1014 g_object_unref (account);
1018 format = g_strdup (_("emev_ni_ui_imap_message_not_available_in_server"));
1020 msg = g_strdup_printf (format, subject);
1021 modest_platform_run_information_dialog (NULL, msg, FALSE);
1027 /* Remove the header from the preregistered uids */
1028 modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (),
1041 } OpenMsgBannerInfo;
1044 GtkTreeModel *model;
1046 OpenMsgBannerInfo *banner_info;
1047 GtkTreeRowReference *rowref;
1051 open_msg_banner_idle (gpointer userdata)
1053 OpenMsgBannerInfo *banner_info = (OpenMsgBannerInfo *) userdata;
1055 gdk_threads_enter ();
1056 banner_info->idle_handler = 0;
1057 banner_info->banner = modest_platform_animation_banner (NULL, NULL, banner_info->message);
1058 if (banner_info->banner)
1059 g_object_ref (banner_info->banner);
1061 gdk_threads_leave ();
1067 get_header_view_from_window (ModestWindow *window)
1069 GtkWidget *header_view;
1071 if (MODEST_IS_MAIN_WINDOW (window)) {
1072 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (window),
1073 MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
1074 #ifdef MODEST_TOOLKIT_HILDON2
1075 } else if (MODEST_IS_HEADER_WINDOW (window)){
1076 header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (window)));
1086 get_info_from_header (TnyHeader *header, gboolean *is_draft, gboolean *can_open)
1089 gchar *account = NULL;
1090 TnyFolderType folder_type = TNY_FOLDER_TYPE_UNKNOWN;
1095 folder = tny_header_get_folder (header);
1096 /* Gets folder type (OUTBOX headers will be opened in edit window */
1097 if (modest_tny_folder_is_local_folder (folder)) {
1098 folder_type = modest_tny_folder_get_local_or_mmc_folder_type (folder);
1099 if (folder_type == TNY_FOLDER_TYPE_INVALID)
1100 g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__);
1103 if (folder_type == TNY_FOLDER_TYPE_OUTBOX) {
1104 TnyTransportAccount *traccount = NULL;
1105 ModestTnyAccountStore *accstore = modest_runtime_get_account_store();
1106 traccount = modest_tny_account_store_get_transport_account_from_outbox_header(accstore, header);
1108 ModestTnySendQueue *send_queue = NULL;
1109 ModestTnySendQueueStatus status;
1111 account = g_strdup(modest_tny_account_get_parent_modest_account_name_for_server_account(
1112 TNY_ACCOUNT(traccount)));
1113 send_queue = modest_runtime_get_send_queue(traccount, TRUE);
1114 if (TNY_IS_SEND_QUEUE (send_queue)) {
1115 msg_id = modest_tny_send_queue_get_msg_id (header);
1116 status = modest_tny_send_queue_get_msg_status(send_queue, msg_id);
1118 /* Only open messages in outbox with the editor if they are in Failed state */
1119 if (status == MODEST_TNY_SEND_QUEUE_FAILED) {
1122 #ifdef MODEST_TOOLKIT_HILDON2
1124 /* In Fremantle we can not
1125 open any message from
1126 outbox which is not in
1132 g_object_unref(traccount);
1134 g_warning("Cannot get transport account for message in outbox!!");
1136 } else if (folder_type == TNY_FOLDER_TYPE_DRAFTS) {
1137 *is_draft = TRUE; /* Open in editor if the message is in the Drafts folder */
1141 TnyAccount *acc = tny_folder_get_account (folder);
1144 g_strdup (modest_tny_account_get_parent_modest_account_name_for_server_account (acc));
1145 g_object_unref (acc);
1149 g_object_unref (folder);
1155 open_msg_cb (ModestMailOperation *mail_op,
1162 ModestWindowMgr *mgr = NULL;
1163 ModestWindow *parent_win = NULL;
1164 ModestWindow *win = NULL;
1165 gchar *account = NULL;
1166 gboolean open_in_editor = FALSE;
1168 OpenMsgHelper *helper = (OpenMsgHelper *) user_data;
1170 /* Do nothing if there was any problem with the mail
1171 operation. The error will be shown by the error_handler of
1172 the mail operation */
1173 if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg))
1176 parent_win = (ModestWindow *) modest_mail_operation_get_source (mail_op);
1178 /* Mark header as read */
1179 headers_action_mark_as_read (header, MODEST_WINDOW(parent_win), NULL);
1181 account = get_info_from_header (header, &open_in_editor, &can_open);
1185 account = g_strdup (modest_window_get_active_account (MODEST_WINDOW (parent_win)));
1187 account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
1189 if (open_in_editor) {
1190 ModestAccountMgr *mgr = modest_runtime_get_account_mgr ();
1191 gchar *from_header = NULL, *acc_name;
1192 gchar *mailbox = NULL;
1194 from_header = tny_header_dup_from (header);
1196 /* we cannot edit without a valid account... */
1197 if (!modest_account_mgr_has_accounts(mgr, TRUE)) {
1198 if (!modest_ui_actions_run_account_setup_wizard(parent_win)) {
1199 modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (),
1201 g_free (from_header);
1206 acc_name = modest_utils_get_account_name_from_recipient (from_header, &mailbox);
1207 g_free (from_header);
1213 win = modest_msg_edit_window_new (msg, account, mailbox, TRUE);
1217 gchar *uid = modest_tny_folder_get_header_unique_id (header);
1218 const gchar *mailbox = NULL;
1220 if (parent_win && MODEST_IS_WINDOW (parent_win))
1221 mailbox = modest_window_get_active_mailbox (MODEST_WINDOW (parent_win));
1223 if (helper->rowref && helper->model) {
1224 win = modest_msg_view_window_new_with_header_model (msg, account, mailbox, (const gchar*) uid,
1225 helper->model, helper->rowref);
1227 win = modest_msg_view_window_new_for_attachment (msg, account, mailbox, (const gchar*) uid);
1232 /* Register and show new window */
1234 mgr = modest_runtime_get_window_mgr ();
1235 if (!modest_window_mgr_register_window (mgr, win, NULL)) {
1236 gtk_widget_destroy (GTK_WIDGET (win));
1239 gtk_widget_show_all (GTK_WIDGET(win));
1242 /* Update toolbar dimming state */
1243 if (MODEST_IS_MAIN_WINDOW (parent_win)) {
1244 modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (parent_win));
1250 g_object_unref (parent_win);
1254 is_memory_full_error (GError *error, ModestMailOperation *mail_op, gboolean *is_mmc)
1256 gboolean enough_free_space = TRUE;
1257 GnomeVFSURI *cache_dir_uri;
1258 const gchar *cache_dir = NULL;
1259 GnomeVFSFileSize free_space;
1260 TnyAccountStore *acc_store;
1262 acc_store = TNY_ACCOUNT_STORE (modest_runtime_get_account_store ());
1267 /* Cache dir is different in case we're using an external storage (like MMC account) */
1269 TnyAccount *account = modest_mail_operation_get_account (mail_op);
1271 if (modest_tny_account_is_memory_card_account (account)) {
1274 cache_dir = g_getenv (MODEST_MMC1_VOLUMEPATH_ENV);
1276 g_object_unref (account);
1280 /* Get the default local cache dir */
1282 cache_dir = tny_account_store_get_cache_dir (acc_store);
1284 cache_dir_uri = gnome_vfs_uri_new (cache_dir);
1285 if (cache_dir_uri) {
1286 if (gnome_vfs_get_volume_free_space (cache_dir_uri, &free_space) == GNOME_VFS_OK) {
1287 if (free_space < MIN_FREE_SPACE)
1288 enough_free_space = FALSE;
1290 gnome_vfs_uri_unref (cache_dir_uri);
1293 if ((error->code == TNY_SYSTEM_ERROR_MEMORY ||
1294 /* When asking for a mail and no space left on device
1295 tinymail returns this error */
1296 error->code == TNY_SERVICE_ERROR_MESSAGE_NOT_AVAILABLE ||
1297 /* When the folder summary could not be read or
1299 error->code == TNY_IO_ERROR_WRITE ||
1300 error->code == TNY_IO_ERROR_READ) &&
1301 !enough_free_space) {
1308 /* Shows an error if we're in memory full conditions. The #alternate
1309 parametter contains the error that will be shown if the memory full
1310 conditions happen in the mmc external storage */
1312 check_memory_full_error (GtkWidget *parent_window, GError *err, const gchar *alternate)
1319 if (is_memory_full_error (err, NULL, &is_mcc)) {
1320 if (is_mcc && alternate) {
1321 modest_platform_information_banner (parent_window, NULL, alternate);
1323 gchar *msg = g_strdup_printf (_KR("cerm_device_memory_full"), "");
1324 modest_platform_information_banner (parent_window, NULL, msg);
1327 } else if (err->code == TNY_SYSTEM_ERROR_MEMORY)
1328 /* If the account was created in memory full
1329 conditions then tinymail won't be able to
1330 connect so it'll return this error code */
1331 modest_platform_information_banner (parent_window,
1332 NULL, _("emev_ui_imap_inbox_select_error"));
1340 modest_ui_actions_disk_operations_error_handler (ModestMailOperation *mail_op,
1343 const GError *error;
1344 GObject *win = NULL;
1345 ModestMailOperationStatus status;
1347 win = modest_mail_operation_get_source (mail_op);
1348 error = modest_mail_operation_get_error (mail_op);
1349 status = modest_mail_operation_get_status (mail_op);
1351 /* If the mail op has been cancelled then it's not an error:
1352 don't show any message */
1353 if (status != MODEST_MAIL_OPERATION_STATUS_CANCELED) {
1354 if (is_memory_full_error ((GError *) error, mail_op, NULL)) {
1355 gchar *msg = g_strdup_printf (_KR("cerm_device_memory_full"), "");
1356 modest_platform_information_banner ((GtkWidget *) win, NULL, msg);
1358 } else if (error->code == TNY_SYSTEM_ERROR_MEMORY) {
1359 modest_platform_information_banner ((GtkWidget *) win,
1360 NULL, _("emev_ui_imap_inbox_select_error"));
1361 } else if (error->domain == MODEST_MAIL_OPERATION_ERROR &&
1362 error->code == MODEST_MAIL_OPERATION_ERROR_FILE_IO) {
1363 modest_platform_information_banner ((GtkWidget *) win,
1364 NULL, _CS ("sfil_ni_unable_to_open_file_not_found"));
1365 } else if (user_data) {
1366 modest_platform_information_banner ((GtkWidget *) win,
1372 g_object_unref (win);
1376 * Returns the account a list of headers belongs to. It returns a
1377 * *new* reference so don't forget to unref it
1380 get_account_from_header_list (TnyList *headers)
1382 TnyAccount *account = NULL;
1384 if (tny_list_get_length (headers) > 0) {
1385 TnyIterator *iter = tny_list_create_iterator (headers);
1386 TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter));
1387 TnyFolder *folder = tny_header_get_folder (header);
1390 g_object_unref (header);
1392 while (!tny_iterator_is_done (iter)) {
1393 header = TNY_HEADER (tny_iterator_get_current (iter));
1394 folder = tny_header_get_folder (header);
1397 g_object_unref (header);
1399 tny_iterator_next (iter);
1404 account = tny_folder_get_account (folder);
1405 g_object_unref (folder);
1409 g_object_unref (header);
1411 g_object_unref (iter);
1417 get_account_from_header (TnyHeader *header)
1419 TnyAccount *account = NULL;
1422 folder = tny_header_get_folder (header);
1425 account = tny_folder_get_account (folder);
1426 g_object_unref (folder);
1432 open_msg_helper_destroyer (gpointer user_data)
1434 OpenMsgHelper *helper = (OpenMsgHelper *) user_data;
1436 if (helper->banner_info) {
1437 g_free (helper->banner_info->message);
1438 if (helper->banner_info->idle_handler > 0) {
1439 g_source_remove (helper->banner_info->idle_handler);
1440 helper->banner_info->idle_handler = 0;
1442 if (helper->banner_info->banner != NULL) {
1443 gtk_widget_destroy (helper->banner_info->banner);
1444 g_object_unref (helper->banner_info->banner);
1445 helper->banner_info->banner = NULL;
1447 g_slice_free (OpenMsgBannerInfo, helper->banner_info);
1448 helper->banner_info = NULL;
1450 g_object_unref (helper->model);
1451 g_object_unref (helper->header);
1452 gtk_tree_row_reference_free (helper->rowref);
1453 g_slice_free (OpenMsgHelper, helper);
1457 open_msg_performer(gboolean canceled,
1459 GtkWindow *parent_window,
1460 TnyAccount *account,
1463 ModestMailOperation *mail_op = NULL;
1464 gchar *error_msg = NULL;
1465 ModestProtocolType proto;
1466 TnyConnectionStatus status;
1467 OpenMsgHelper *helper = NULL;
1468 ModestProtocol *protocol;
1469 ModestProtocolRegistry *protocol_registry;
1472 helper = (OpenMsgHelper *) user_data;
1474 status = tny_account_get_connection_status (account);
1475 if (err || canceled) {
1476 modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (), helper->header);
1477 /* Free the helper */
1478 open_msg_helper_destroyer (helper);
1480 /* In memory full conditions we could get this error here */
1481 check_memory_full_error ((GtkWidget *) parent_window, err, NULL);
1486 /* Get the error message depending on the protocol */
1487 proto = modest_tny_account_get_protocol_type (account);
1488 if (proto == MODEST_PROTOCOL_REGISTRY_TYPE_INVALID) {
1489 proto = MODEST_PROTOCOLS_STORE_MAILDIR;
1492 protocol_registry = modest_runtime_get_protocol_registry ();
1493 subject = tny_header_dup_subject (helper->header);
1495 protocol = modest_protocol_registry_get_protocol_by_type (protocol_registry, proto);
1496 error_msg = modest_protocol_get_translation (protocol, MODEST_PROTOCOL_TRANSLATION_MSG_NOT_AVAILABLE, subject);
1500 if (error_msg == NULL) {
1501 error_msg = g_strdup (_("mail_ni_ui_folder_get_msg_folder_error"));
1504 #ifndef MODEST_TOOLKIT_HILDON2
1505 gboolean show_open_draft = FALSE;
1506 if (modest_protocol_registry_protocol_type_has_tag (protocol_registry,
1508 MODEST_PROTOCOL_REGISTRY_LOCAL_STORE_PROTOCOLS)) {
1510 TnyFolderType folder_type;
1512 folder = tny_header_get_folder (helper->header);
1513 folder_type = modest_tny_folder_get_local_or_mmc_folder_type (folder);
1514 show_open_draft = (folder_type == TNY_FOLDER_TYPE_DRAFTS);
1515 g_object_unref (folder);
1519 #ifdef MODEST_TOOLKIT_HILDON2
1522 gchar *account_name = get_info_from_header (helper->header, &is_draft, &can_open);
1525 modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (), helper->header);
1526 g_free (account_name);
1527 open_msg_helper_destroyer (helper);
1532 ModestWindow *window;
1533 GtkWidget *header_view;
1536 header_view = get_header_view_from_window (MODEST_WINDOW (parent_window));
1537 uid = modest_tny_folder_get_header_unique_id (helper->header);
1539 const gchar *mailbox = NULL;
1540 mailbox = modest_window_get_active_mailbox (MODEST_WINDOW (parent_window));
1541 window = modest_msg_view_window_new_from_header_view
1542 (MODEST_HEADER_VIEW (header_view), account_name, mailbox, uid, helper->rowref);
1543 if (window != NULL) {
1544 if (!modest_window_mgr_register_window (modest_runtime_get_window_mgr (),
1546 gtk_widget_destroy (GTK_WIDGET (window));
1548 gtk_widget_show_all (GTK_WIDGET(window));
1552 g_free (account_name);
1554 open_msg_helper_destroyer (helper);
1557 g_free (account_name);
1559 /* Create the mail operation */
1561 modest_mail_operation_new_with_error_handling ((GObject *) parent_window,
1562 modest_ui_actions_disk_operations_error_handler,
1563 g_strdup (error_msg), g_free);
1564 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1568 #ifndef MODEST_TOOLKIT_HILDON2
1569 if (show_open_draft) {
1570 helper->banner_info = g_slice_new (OpenMsgBannerInfo);
1571 helper->banner_info->message = g_strdup (_("mail_ib_opening_draft_message"));
1572 helper->banner_info->banner = NULL;
1573 helper->banner_info->idle_handler = g_timeout_add (500, open_msg_banner_idle,
1574 helper->banner_info);
1580 headers = TNY_LIST (tny_simple_list_new ());
1581 tny_list_prepend (headers, G_OBJECT (helper->header));
1582 modest_mail_operation_get_msgs_full (mail_op,
1586 open_msg_helper_destroyer);
1587 g_object_unref (headers);
1594 g_object_unref (mail_op);
1595 g_object_unref (account);
1599 * This function is used by both modest_ui_actions_on_open and
1600 * modest_ui_actions_on_header_activated. This way we always do the
1601 * same when trying to open messages.
1604 open_msg_from_header (TnyHeader *header, GtkTreeRowReference *rowref, ModestWindow *win)
1606 ModestWindowMgr *mgr = NULL;
1607 TnyAccount *account;
1608 gboolean cached = FALSE;
1610 GtkWidget *header_view = NULL;
1611 OpenMsgHelper *helper;
1612 ModestWindow *window;
1614 g_return_if_fail (header != NULL && rowref != NULL);
1616 mgr = modest_runtime_get_window_mgr ();
1619 header_view = get_header_view_from_window (MODEST_WINDOW (win));
1620 if (header_view == NULL)
1623 /* Get the account */
1624 account = get_account_from_header (header);
1629 found = modest_window_mgr_find_registered_header (mgr, header, &window);
1631 /* Do not open again the message and present the
1632 window to the user */
1635 #ifndef MODEST_TOOLKIT_HILDON2
1636 gtk_window_present (GTK_WINDOW (window));
1639 /* the header has been registered already, we don't do
1640 * anything but wait for the window to come up*/
1641 g_debug ("header %p already registered, waiting for window", header);
1646 /* Open each message */
1647 cached = tny_header_get_flags (header) & TNY_HEADER_FLAG_CACHED;
1649 /* Allways download if we are online. */
1650 if (!tny_device_is_online (modest_runtime_get_device ())) {
1653 /* If ask for user permission to download the messages */
1654 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
1655 _("mcen_nc_get_msg"));
1657 /* End if the user does not want to continue */
1658 if (response == GTK_RESPONSE_CANCEL) {
1664 /* We register the window for opening */
1665 modest_window_mgr_register_header (mgr, header, NULL);
1667 /* Create the helper. We need to get a reference to the model
1668 here because it could change while the message is readed
1669 (the user could switch between folders) */
1670 helper = g_slice_new (OpenMsgHelper);
1671 helper->model = g_object_ref (gtk_tree_view_get_model (GTK_TREE_VIEW (header_view)));
1672 helper->header = g_object_ref (header);
1673 helper->rowref = gtk_tree_row_reference_copy (rowref);
1674 helper->banner_info = NULL;
1676 /* Connect to the account and perform */
1678 modest_platform_connect_and_perform ((GtkWindow *) win, TRUE, g_object_ref (account),
1679 open_msg_performer, helper);
1681 /* Call directly the performer, do not need to connect */
1682 open_msg_performer (FALSE, NULL, (GtkWindow *) win,
1683 g_object_ref (account), helper);
1688 g_object_unref (account);
1692 modest_ui_actions_on_open (GtkAction *action, ModestWindow *win)
1699 /* we check for low-mem; in that case, show a warning, and don't allow
1702 if (modest_platform_check_memory_low (MODEST_WINDOW(win), TRUE))
1706 headers = get_selected_headers (win);
1710 headers_count = tny_list_get_length (headers);
1711 if (headers_count != 1) {
1712 if (headers_count > 1) {
1713 /* Don't allow activation if there are more than one message selected */
1714 modest_platform_information_banner (NULL, NULL, _("mcen_ib_select_one_message"));
1717 g_object_unref (headers);
1721 iter = tny_list_create_iterator (headers);
1722 header = TNY_HEADER (tny_iterator_get_current (iter));
1723 g_object_unref (iter);
1727 open_msg_from_header (header, NULL, win);
1728 g_object_unref (header);
1731 g_object_unref(headers);
1735 rf_helper_window_closed (gpointer data,
1738 ReplyForwardHelper *helper = (ReplyForwardHelper *) data;
1740 helper->parent_window = NULL;
1743 static ReplyForwardHelper*
1744 create_reply_forward_helper (ReplyForwardAction action,
1746 guint reply_forward_type,
1749 ReplyForwardHelper *rf_helper = NULL;
1750 const gchar *active_acc = modest_window_get_active_account (win);
1751 const gchar *active_mailbox = modest_window_get_active_mailbox (win);
1753 rf_helper = g_slice_new0 (ReplyForwardHelper);
1754 rf_helper->reply_forward_type = reply_forward_type;
1755 rf_helper->action = action;
1756 rf_helper->parent_window = (MODEST_IS_WINDOW (win)) ? GTK_WIDGET (win) : NULL;
1757 rf_helper->header = (header) ? g_object_ref (header) : NULL;
1758 rf_helper->account_name = (active_acc) ?
1759 g_strdup (active_acc) :
1760 modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
1761 rf_helper->mailbox = g_strdup (active_mailbox);
1763 /* Note that window could be destroyed just AFTER calling
1764 register_window so we must ensure that this pointer does
1765 not hold invalid references */
1766 if (rf_helper->parent_window)
1767 g_object_weak_ref (G_OBJECT (rf_helper->parent_window),
1768 rf_helper_window_closed, rf_helper);
1774 free_reply_forward_helper (gpointer data)
1776 ReplyForwardHelper *helper;
1778 helper = (ReplyForwardHelper *) data;
1779 g_free (helper->account_name);
1780 g_free (helper->mailbox);
1782 g_object_unref (helper->header);
1783 if (helper->parent_window)
1784 g_object_weak_unref (G_OBJECT (helper->parent_window),
1785 rf_helper_window_closed, helper);
1786 g_slice_free (ReplyForwardHelper, helper);
1790 reply_forward_cb (ModestMailOperation *mail_op,
1797 TnyMsg *new_msg = NULL;
1798 ReplyForwardHelper *rf_helper;
1799 ModestWindow *msg_win = NULL;
1800 ModestEditType edit_type;
1802 TnyAccount *account = NULL;
1803 ModestWindowMgr *mgr = NULL;
1804 gchar *signature = NULL;
1805 gboolean use_signature;
1808 /* If there was any error. The mail operation could be NULL,
1809 this means that we already have the message downloaded and
1810 that we didn't do a mail operation to retrieve it */
1811 rf_helper = (ReplyForwardHelper *) user_data;
1812 if (mail_op && !modest_ui_actions_msg_retrieval_check (mail_op, header, msg))
1815 from = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(),
1816 rf_helper->account_name, rf_helper->mailbox);
1817 recipient = modest_text_utils_get_email_address (from);
1818 signature = modest_account_mgr_get_signature_from_recipient (modest_runtime_get_account_mgr(),
1823 /* Create reply mail */
1824 switch (rf_helper->action) {
1827 modest_tny_msg_create_reply_msg (msg, header, from,
1828 (use_signature) ? signature : NULL,
1829 rf_helper->reply_forward_type,
1830 MODEST_TNY_MSG_REPLY_MODE_SENDER);
1832 case ACTION_REPLY_TO_ALL:
1834 modest_tny_msg_create_reply_msg (msg, header, from,
1835 (use_signature) ? signature : NULL,
1836 rf_helper->reply_forward_type,
1837 MODEST_TNY_MSG_REPLY_MODE_ALL);
1838 edit_type = MODEST_EDIT_TYPE_REPLY;
1840 case ACTION_FORWARD:
1842 modest_tny_msg_create_forward_msg (msg, from, (use_signature) ? signature : NULL,
1843 rf_helper->reply_forward_type);
1844 edit_type = MODEST_EDIT_TYPE_FORWARD;
1847 modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (),
1849 g_return_if_reached ();
1857 g_warning ("%s: failed to create message\n", __FUNCTION__);
1861 account = modest_tny_account_store_get_server_account (modest_runtime_get_account_store(),
1862 rf_helper->account_name,
1863 TNY_ACCOUNT_TYPE_STORE);
1865 g_warning ("%s: failed to get tnyaccount for '%s'\n", __FUNCTION__, rf_helper->account_name);
1869 /* Create and register the windows */
1870 msg_win = modest_msg_edit_window_new (new_msg, rf_helper->account_name, rf_helper->mailbox, FALSE);
1871 mgr = modest_runtime_get_window_mgr ();
1872 modest_window_mgr_register_window (mgr, msg_win, (ModestWindow *) rf_helper->parent_window);
1874 /* Note that register_window could have deleted the account */
1875 if (MODEST_IS_WINDOW (rf_helper->parent_window)) {
1876 gdouble parent_zoom;
1878 parent_zoom = modest_window_get_zoom (MODEST_WINDOW (rf_helper->parent_window));
1879 modest_window_set_zoom (msg_win, parent_zoom);
1882 /* Show edit window */
1883 gtk_widget_show_all (GTK_WIDGET (msg_win));
1886 /* We always unregister the header because the message is
1887 forwarded or replied so the original one is no longer
1889 modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (),
1892 g_object_unref (G_OBJECT (new_msg));
1894 g_object_unref (G_OBJECT (account));
1895 free_reply_forward_helper (rf_helper);
1898 /* Checks a list of headers. If any of them are not currently
1899 * downloaded (CACHED) then returns TRUE else returns FALSE.
1902 header_list_count_uncached_msgs (TnyList *header_list)
1905 gint uncached_messages = 0;
1907 iter = tny_list_create_iterator (header_list);
1908 while (!tny_iterator_is_done (iter)) {
1911 header = TNY_HEADER (tny_iterator_get_current (iter));
1913 if (!(tny_header_get_flags (header) & TNY_HEADER_FLAG_CACHED))
1914 uncached_messages ++;
1915 g_object_unref (header);
1918 tny_iterator_next (iter);
1920 g_object_unref (iter);
1922 return uncached_messages;
1925 /* Returns FALSE if the user does not want to download the
1926 * messages. Returns TRUE if the user allowed the download.
1929 connect_to_get_msg (ModestWindow *win,
1930 gint num_of_uncached_msgs,
1931 TnyAccount *account)
1933 GtkResponseType response;
1935 /* Allways download if we are online. */
1936 if (tny_device_is_online (modest_runtime_get_device ()))
1939 /* If offline, then ask for user permission to download the messages */
1940 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
1941 ngettext("mcen_nc_get_msg",
1943 num_of_uncached_msgs));
1945 if (response == GTK_RESPONSE_CANCEL)
1948 return modest_platform_connect_and_wait((GtkWindow *) win, account);
1952 reply_forward_performer (gboolean canceled,
1954 GtkWindow *parent_window,
1955 TnyAccount *account,
1958 ReplyForwardHelper *rf_helper = NULL;
1959 ModestMailOperation *mail_op;
1961 rf_helper = (ReplyForwardHelper *) user_data;
1963 if (canceled || err) {
1964 free_reply_forward_helper (rf_helper);
1968 /* Retrieve the message */
1969 modest_window_mgr_register_header (modest_runtime_get_window_mgr (), rf_helper->header, NULL);
1970 mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT (parent_window),
1971 modest_ui_actions_disk_operations_error_handler,
1973 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
1974 modest_mail_operation_get_msg (mail_op, rf_helper->header, TRUE, reply_forward_cb, rf_helper);
1977 g_object_unref(mail_op);
1981 * Common code for the reply and forward actions
1984 reply_forward (ReplyForwardAction action, ModestWindow *win)
1986 ReplyForwardHelper *rf_helper = NULL;
1987 guint reply_forward_type;
1989 g_return_if_fail (MODEST_IS_WINDOW(win));
1991 /* we check for low-mem; in that case, show a warning, and don't allow
1992 * reply/forward (because it could potentially require a lot of memory */
1993 if (modest_platform_check_memory_low (MODEST_WINDOW(win), TRUE))
1997 /* we need an account when editing */
1998 if (!modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE)) {
1999 if (!modest_ui_actions_run_account_setup_wizard (win))
2003 reply_forward_type =
2004 modest_conf_get_int (modest_runtime_get_conf (),
2005 (action == ACTION_FORWARD) ?
2006 MODEST_CONF_FORWARD_TYPE :
2007 MODEST_CONF_REPLY_TYPE,
2010 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
2012 TnyHeader *header = NULL;
2013 /* Get header and message. Do not free them here, the
2014 reply_forward_cb must do it */
2015 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW(win));
2016 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
2018 if (msg && header) {
2020 rf_helper = create_reply_forward_helper (action, win,
2021 reply_forward_type, header);
2022 reply_forward_cb (NULL, header, FALSE, msg, NULL, rf_helper);
2024 g_warning("%s: no message or header found in viewer\n", __FUNCTION__);
2028 g_object_unref (msg);
2030 g_object_unref (header);
2032 TnyHeader *header = NULL;
2034 gboolean do_retrieve = TRUE;
2035 TnyList *header_list = NULL;
2037 header_list = get_selected_headers (win);
2040 /* Check that only one message is selected for replying */
2041 if (tny_list_get_length (header_list) != 1) {
2042 modest_platform_information_banner ((win) ? GTK_WIDGET (win) : NULL,
2043 NULL, _("mcen_ib_select_one_message"));
2044 g_object_unref (header_list);
2048 /* Only reply/forward to one message */
2049 iter = tny_list_create_iterator (header_list);
2050 header = TNY_HEADER (tny_iterator_get_current (iter));
2051 g_object_unref (iter);
2053 /* Retrieve messages */
2054 do_retrieve = (action == ACTION_FORWARD) ||
2055 (reply_forward_type != MODEST_TNY_MSG_REPLY_TYPE_CITE);
2058 TnyAccount *account = NULL;
2059 TnyFolder *folder = NULL;
2060 gdouble download = TRUE;
2061 guint uncached_msgs = 0;
2063 folder = tny_header_get_folder (header);
2065 goto do_retrieve_frees;
2066 account = tny_folder_get_account (folder);
2068 goto do_retrieve_frees;
2070 uncached_msgs = header_list_count_uncached_msgs (header_list);
2072 if (uncached_msgs > 0) {
2073 /* Allways download if we are online. */
2074 if (!tny_device_is_online (modest_runtime_get_device ())) {
2077 /* If ask for user permission to download the messages */
2078 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
2079 ngettext("mcen_nc_get_msg",
2083 /* End if the user does not want to continue */
2084 if (response == GTK_RESPONSE_CANCEL)
2091 rf_helper = create_reply_forward_helper (action, win,
2092 reply_forward_type, header);
2093 if (uncached_msgs > 0) {
2094 modest_platform_connect_and_perform (GTK_WINDOW (win),
2096 reply_forward_performer,
2099 reply_forward_performer (FALSE, NULL, GTK_WINDOW (win),
2100 account, rf_helper);
2105 g_object_unref (account);
2107 g_object_unref (folder);
2109 reply_forward_cb (NULL, header, FALSE, NULL, NULL, rf_helper);
2112 g_object_unref (header_list);
2113 g_object_unref (header);
2118 modest_ui_actions_on_reply (GtkAction *action, ModestWindow *win)
2120 g_return_if_fail (MODEST_IS_WINDOW(win));
2122 reply_forward (ACTION_REPLY, win);
2126 modest_ui_actions_on_forward (GtkAction *action, ModestWindow *win)
2128 g_return_if_fail (MODEST_IS_WINDOW(win));
2130 reply_forward (ACTION_FORWARD, win);
2134 modest_ui_actions_on_reply_all (GtkAction *action, ModestWindow *win)
2136 g_return_if_fail (MODEST_IS_WINDOW(win));
2138 reply_forward (ACTION_REPLY_TO_ALL, win);
2142 modest_ui_actions_on_next (GtkAction *action,
2143 ModestWindow *window)
2145 if (MODEST_IS_MAIN_WINDOW (window)) {
2146 GtkWidget *header_view;
2148 header_view = modest_main_window_get_child_widget (
2149 MODEST_MAIN_WINDOW(window),
2150 MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
2154 modest_header_view_select_next (
2155 MODEST_HEADER_VIEW(header_view));
2156 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
2157 modest_msg_view_window_select_next_message (
2158 MODEST_MSG_VIEW_WINDOW (window));
2160 g_return_if_reached ();
2165 modest_ui_actions_on_prev (GtkAction *action,
2166 ModestWindow *window)
2168 g_return_if_fail (MODEST_IS_WINDOW(window));
2170 if (MODEST_IS_MAIN_WINDOW (window)) {
2171 GtkWidget *header_view;
2172 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
2173 MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
2177 modest_header_view_select_prev (MODEST_HEADER_VIEW(header_view));
2178 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
2179 modest_msg_view_window_select_previous_message (MODEST_MSG_VIEW_WINDOW (window));
2181 g_return_if_reached ();
2186 modest_ui_actions_on_sort (GtkAction *action,
2187 ModestWindow *window)
2189 GtkWidget *header_view = NULL;
2191 g_return_if_fail (MODEST_IS_WINDOW(window));
2193 if (MODEST_IS_MAIN_WINDOW (window)) {
2194 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
2195 MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
2196 #ifdef MODEST_TOOLKIT_HILDON2
2197 } else if (MODEST_IS_HEADER_WINDOW (window)) {
2198 header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (window)));
2203 modest_platform_information_banner (NULL, NULL, _CS("ckdg_ib_nothing_to_sort"));
2208 /* Show sorting dialog */
2209 modest_utils_run_sort_dialog (GTK_WINDOW (window), MODEST_SORT_HEADERS);
2213 new_messages_arrived (ModestMailOperation *self,
2214 TnyList *new_headers,
2218 gboolean show_visual_notifications;
2220 source = modest_mail_operation_get_source (self);
2221 show_visual_notifications = (source) ? FALSE : TRUE;
2223 g_object_unref (source);
2225 /* Notify new messages have been downloaded. If the
2226 send&receive was invoked by the user then do not show any
2227 visual notification, only play a sound and activate the LED
2228 (for the Maemo version) */
2229 if (TNY_IS_LIST(new_headers) && (tny_list_get_length (new_headers)) > 0) {
2231 /* We only notify about really new messages (not seen) we get */
2232 TnyList *actually_new_list;
2233 TnyIterator *iterator;
2234 actually_new_list = TNY_LIST (tny_simple_list_new ());
2235 for (iterator = tny_list_create_iterator (new_headers);
2236 !tny_iterator_is_done (iterator);
2237 tny_iterator_next (iterator)) {
2239 TnyHeaderFlags flags;
2240 header = TNY_HEADER (tny_iterator_get_current (iterator));
2241 flags = tny_header_get_flags (header);
2243 if (!(flags & TNY_HEADER_FLAG_SEEN)) {
2244 tny_list_append (actually_new_list, G_OBJECT (header));
2246 g_object_unref (header);
2248 g_object_unref (iterator);
2250 if (tny_list_get_length (actually_new_list) > 0) {
2251 GList *new_headers_list = NULL;
2253 new_headers_list = modest_utils_create_notification_list_from_header_list (actually_new_list);
2255 /* Send notifications */
2256 if (new_headers_list) {
2257 modest_platform_on_new_headers_received (new_headers_list,
2258 show_visual_notifications);
2260 modest_utils_free_notification_list (new_headers_list);
2263 g_object_unref (actually_new_list);
2269 retrieve_all_messages_cb (GObject *source,
2271 guint retrieve_limit)
2277 window = GTK_WINDOW (source);
2278 msg = g_strdup_printf (_("mail_nc_msg_count_limit_exceeded"),
2279 num_msgs, retrieve_limit);
2281 /* Ask the user if they want to retrieve all the messages */
2283 modest_platform_run_confirmation_dialog_with_buttons (window, msg,
2284 _("mcen_bd_get_all"),
2285 _("mcen_bd_newest_only"));
2286 /* Free and return */
2288 return (response == GTK_RESPONSE_ACCEPT) ? TRUE : FALSE;
2292 TnyAccount *account;
2294 gchar *account_name;
2295 gboolean poke_status;
2296 gboolean interactive;
2297 ModestMailOperation *mail_op;
2301 do_send_receive_performer (gboolean canceled,
2303 GtkWindow *parent_window,
2304 TnyAccount *account,
2307 SendReceiveInfo *info;
2309 info = (SendReceiveInfo *) user_data;
2311 if (err || canceled) {
2312 /* In memory full conditions we could get this error here */
2313 check_memory_full_error ((GtkWidget *) parent_window, err, NULL);
2315 if (info->mail_op) {
2316 modest_mail_operation_queue_remove (modest_runtime_get_mail_operation_queue (),
2322 /* Set send/receive operation in progress */
2323 if (info->win && MODEST_IS_MAIN_WINDOW (info->win)) {
2324 modest_main_window_notify_send_receive_initied (MODEST_MAIN_WINDOW (info->win));
2327 if (info->win && MODEST_IS_MAIN_WINDOW (info->win))
2328 g_signal_connect (G_OBJECT (info->mail_op), "operation-finished",
2329 G_CALLBACK (on_send_receive_finished),
2332 /* Send & receive. */
2333 modest_mail_operation_update_account (info->mail_op, info->account_name, info->poke_status, info->interactive,
2334 (info->win) ? retrieve_all_messages_cb : NULL,
2335 new_messages_arrived, info->win);
2340 g_object_unref (G_OBJECT (info->mail_op));
2341 if (info->account_name)
2342 g_free (info->account_name);
2344 g_object_unref (info->win);
2346 g_object_unref (info->account);
2347 g_slice_free (SendReceiveInfo, info);
2351 * This function performs the send & receive required actions. The
2352 * window is used to create the mail operation. Typically it should
2353 * always be the main window, but we pass it as argument in order to
2357 modest_ui_actions_do_send_receive (const gchar *account_name,
2358 gboolean force_connection,
2359 gboolean poke_status,
2360 gboolean interactive,
2363 gchar *acc_name = NULL;
2364 SendReceiveInfo *info;
2365 ModestTnyAccountStore *acc_store;
2366 TnyAccount *account;
2368 /* If no account name was provided then get the current account, and if
2369 there is no current account then pick the default one: */
2370 if (!account_name) {
2372 acc_name = g_strdup (modest_window_get_active_account (win));
2374 acc_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
2376 g_printerr ("modest: cannot get default account\n");
2380 acc_name = g_strdup (account_name);
2383 acc_store = modest_runtime_get_account_store ();
2384 account = modest_tny_account_store_get_server_account (acc_store, acc_name, TNY_ACCOUNT_TYPE_STORE);
2386 /* Do not automatically refresh accounts that are flagged as
2387 NO_AUTO_UPDATE. This could be useful for accounts that
2388 handle their own update times */
2390 ModestProtocolType proto = modest_tny_account_get_protocol_type (account);
2391 if (proto != MODEST_PROTOCOL_REGISTRY_TYPE_INVALID) {
2392 const gchar *tag = MODEST_PROTOCOL_REGISTRY_NO_AUTO_UPDATE_PROTOCOLS;
2393 ModestProtocolRegistry *registry = modest_runtime_get_protocol_registry ();
2395 if (modest_protocol_registry_protocol_type_has_tag (registry, proto, tag)) {
2396 g_debug ("%s no auto update allowed for account %s", __FUNCTION__, account_name);
2397 g_object_unref (account);
2404 /* Create the info for the connect and perform */
2405 info = g_slice_new (SendReceiveInfo);
2406 info->account_name = acc_name;
2407 info->win = (win) ? g_object_ref (win) : NULL;
2408 info->poke_status = poke_status;
2409 info->interactive = interactive;
2410 info->account = account;
2411 /* We need to create the operation here, because otherwise it
2412 could happen that the queue emits the queue-empty signal
2413 while we're trying to connect the account */
2414 info->mail_op = modest_mail_operation_new_with_error_handling ((info->win) ? G_OBJECT (info->win) : NULL,
2415 modest_ui_actions_disk_operations_error_handler,
2417 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), info->mail_op);
2419 /* Invoke the connect and perform */
2420 modest_platform_connect_and_perform ((win) ? GTK_WINDOW (win) : NULL,
2421 force_connection, info->account,
2422 do_send_receive_performer, info);
2427 modest_ui_actions_do_cancel_send (const gchar *account_name,
2430 TnyTransportAccount *transport_account;
2431 TnySendQueue *send_queue = NULL;
2432 GError *error = NULL;
2434 /* Get transport account */
2436 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_server_account
2437 (modest_runtime_get_account_store(),
2439 TNY_ACCOUNT_TYPE_TRANSPORT));
2440 if (!transport_account) {
2441 g_printerr ("modest: no transport account found for '%s'\n", account_name);
2446 send_queue = TNY_SEND_QUEUE (modest_runtime_get_send_queue (transport_account, TRUE));
2447 if (!TNY_IS_SEND_QUEUE(send_queue)) {
2448 g_set_error (&error, MODEST_MAIL_OPERATION_ERROR,
2449 MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND,
2450 "modest: could not find send queue for account\n");
2452 /* Cancel the current send */
2453 tny_account_cancel (TNY_ACCOUNT (transport_account));
2455 /* Suspend all pending messages */
2456 tny_send_queue_cancel (send_queue, TNY_SEND_QUEUE_CANCEL_ACTION_SUSPEND, &error);
2460 if (transport_account != NULL)
2461 g_object_unref (G_OBJECT (transport_account));
2465 modest_ui_actions_cancel_send_all (ModestWindow *win)
2467 GSList *account_names, *iter;
2469 account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr(),
2472 iter = account_names;
2474 modest_ui_actions_do_cancel_send ((const char*) iter->data, win);
2475 iter = g_slist_next (iter);
2478 modest_account_mgr_free_account_names (account_names);
2479 account_names = NULL;
2483 modest_ui_actions_cancel_send (GtkAction *action, ModestWindow *win)
2486 /* Check if accounts exist */
2487 gboolean accounts_exist =
2488 modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE);
2490 /* If not, allow the user to create an account before trying to send/receive. */
2491 if (!accounts_exist)
2492 modest_ui_actions_on_accounts (NULL, win);
2494 /* Cancel all sending operaitons */
2495 modest_ui_actions_cancel_send_all (win);
2499 * Refreshes all accounts. This function will be used by automatic
2503 modest_ui_actions_do_send_receive_all (ModestWindow *win,
2504 gboolean force_connection,
2505 gboolean poke_status,
2506 gboolean interactive)
2508 GSList *account_names, *iter;
2510 account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr(),
2513 iter = account_names;
2515 modest_ui_actions_do_send_receive ((const char*) iter->data,
2517 poke_status, interactive, win);
2518 iter = g_slist_next (iter);
2521 modest_account_mgr_free_account_names (account_names);
2522 account_names = NULL;
2526 * Handler of the click on Send&Receive button in the main toolbar
2529 modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win)
2531 /* Check if accounts exist */
2532 gboolean accounts_exist;
2535 modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE);
2537 /* If not, allow the user to create an account before trying to send/receive. */
2538 if (!accounts_exist)
2539 modest_ui_actions_on_accounts (NULL, win);
2541 /* Refresh the current folder. The if is always TRUE it's just an extra check */
2542 if (MODEST_IS_MAIN_WINDOW (win)) {
2543 GtkWidget *folder_view;
2544 TnyFolderStore *folder_store;
2547 modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
2548 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2552 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
2555 g_object_unref (folder_store);
2556 /* Refresh the active account. Force the connection if needed
2557 and poke the status of all folders */
2558 modest_ui_actions_do_send_receive (NULL, TRUE, TRUE, TRUE, win);
2559 #ifdef MODEST_TOOLKIT_HILDON2
2560 } else if (MODEST_IS_ACCOUNTS_WINDOW (win)) {
2561 modest_ui_actions_do_send_receive_all (win, TRUE, TRUE, TRUE);
2564 const gchar *active_account;
2565 active_account = modest_window_get_active_account (MODEST_WINDOW (win));
2567 modest_ui_actions_do_send_receive (active_account, TRUE, TRUE, TRUE, win);
2574 modest_ui_actions_toggle_header_list_view (GtkAction *action, ModestMainWindow *main_window)
2577 GtkWidget *header_view;
2579 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
2581 header_view = modest_main_window_get_child_widget (main_window,
2582 MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
2586 conf = modest_runtime_get_conf ();
2588 /* what is saved/restored is depending on the style; thus; we save with
2589 * old style, then update the style, and restore for this new style
2591 modest_widget_memory_save (conf, G_OBJECT(header_view), MODEST_CONF_HEADER_VIEW_KEY);
2593 if (modest_header_view_get_style
2594 (MODEST_HEADER_VIEW(header_view)) == MODEST_HEADER_VIEW_STYLE_DETAILS)
2595 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
2596 MODEST_HEADER_VIEW_STYLE_TWOLINES);
2598 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
2599 MODEST_HEADER_VIEW_STYLE_DETAILS);
2601 modest_widget_memory_restore (conf, G_OBJECT(header_view),
2602 MODEST_CONF_HEADER_VIEW_KEY);
2607 modest_ui_actions_on_header_selected (ModestHeaderView *header_view,
2609 ModestMainWindow *main_window)
2611 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
2612 g_return_if_fail (MODEST_IS_HEADER_VIEW (header_view));
2614 /* in the case the folder is empty, show the empty folder message and focus
2616 if (!header && gtk_widget_is_focus (GTK_WIDGET (header_view))) {
2617 if (modest_header_view_is_empty (header_view)) {
2618 TnyFolder *folder = modest_header_view_get_folder (header_view);
2619 GtkWidget *folder_view =
2620 modest_main_window_get_child_widget (main_window,
2621 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2622 if (folder != NULL) {
2623 modest_folder_view_select_folder (MODEST_FOLDER_VIEW (folder_view), folder, FALSE);
2624 g_object_unref (folder);
2626 gtk_widget_grab_focus (GTK_WIDGET (folder_view));
2630 /* If no header has been selected then exit */
2635 if (!gtk_widget_is_focus (GTK_WIDGET(header_view)))
2636 gtk_widget_grab_focus (GTK_WIDGET(header_view));
2638 /* Update toolbar dimming state */
2639 modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (main_window));
2640 modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
2644 modest_ui_actions_on_header_activated (ModestHeaderView *header_view,
2647 ModestWindow *window)
2649 GtkWidget *open_widget;
2650 GtkTreeRowReference *rowref;
2652 g_return_if_fail (MODEST_IS_WINDOW(window));
2653 g_return_if_fail (MODEST_IS_HEADER_VIEW (header_view));
2654 g_return_if_fail (TNY_IS_HEADER (header));
2656 if (modest_header_view_count_selected_headers (header_view) > 1) {
2657 /* Don't allow activation if there are more than one message selected */
2658 modest_platform_information_banner (NULL, NULL, _("mcen_ib_select_one_message"));
2662 /* we check for low-mem; in that case, show a warning, and don't allow
2663 * activating headers
2665 if (modest_platform_check_memory_low (MODEST_WINDOW(window), TRUE))
2668 if (MODEST_IS_MAIN_WINDOW (window)) {
2669 modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (window));
2670 open_widget = modest_window_get_action_widget (MODEST_WINDOW (window), "/MenuBar/EmailMenu/EmailOpenMenu");
2671 if (!GTK_WIDGET_IS_SENSITIVE (open_widget))
2675 rowref = gtk_tree_row_reference_new (gtk_tree_view_get_model (GTK_TREE_VIEW (header_view)), path);
2676 open_msg_from_header (header, rowref, MODEST_WINDOW (window));
2677 gtk_tree_row_reference_free (rowref);
2681 set_active_account_from_tny_account (TnyAccount *account,
2682 ModestWindow *window)
2684 const gchar *server_acc_name = tny_account_get_id (account);
2686 /* We need the TnyAccount provided by the
2687 account store because that is the one that
2688 knows the name of the Modest account */
2689 TnyAccount *modest_server_account =
2690 modest_tny_account_store_get_tny_account_by (modest_runtime_get_account_store (),
2691 MODEST_TNY_ACCOUNT_STORE_QUERY_ID,
2693 if (!modest_server_account) {
2694 g_warning ("%s: could not get tny account\n", __FUNCTION__);
2698 /* Update active account, but only if it's not a pseudo-account */
2699 if ((!modest_tny_account_is_virtual_local_folders(modest_server_account)) &&
2700 (!modest_tny_account_is_memory_card_account(modest_server_account))) {
2701 const gchar *modest_acc_name =
2702 modest_tny_account_get_parent_modest_account_name_for_server_account (modest_server_account);
2703 if (modest_acc_name)
2704 modest_window_set_active_account (window, modest_acc_name);
2707 g_object_unref (modest_server_account);
2712 folder_refreshed_cb (ModestMailOperation *mail_op,
2716 ModestMainWindow *win = NULL;
2717 GtkWidget *folder_view, *header_view;
2718 const GError *error;
2720 g_return_if_fail (TNY_IS_FOLDER (folder));
2722 win = MODEST_MAIN_WINDOW (user_data);
2724 /* Check if the operation failed due to memory low conditions */
2725 error = modest_mail_operation_get_error (mail_op);
2726 if (error && error->domain == MODEST_MAIL_OPERATION_ERROR &&
2727 error->code == MODEST_MAIL_OPERATION_ERROR_LOW_MEMORY) {
2728 modest_platform_run_information_dialog (GTK_WINDOW (win),
2729 _KR("memr_ib_operation_disabled"),
2735 modest_main_window_get_child_widget(win, MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
2737 modest_main_window_get_child_widget(win, MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
2740 TnyFolderStore *current_folder;
2742 current_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
2743 if (current_folder) {
2744 gboolean different = ((TnyFolderStore *) folder != current_folder);
2745 g_object_unref (current_folder);
2751 /* Check if folder is empty and set headers view contents style */
2752 if ((tny_folder_get_all_count (folder) == 0) ||
2753 modest_header_view_is_empty (MODEST_HEADER_VIEW (header_view)))
2754 modest_main_window_set_contents_style (win,
2755 MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY);
2759 modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
2760 TnyFolderStore *folder_store,
2762 ModestMainWindow *main_window)
2764 GtkWidget *header_view;
2766 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
2768 header_view = modest_main_window_get_child_widget(main_window,
2769 MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
2774 if (TNY_IS_ACCOUNT (folder_store)) {
2776 set_active_account_from_tny_account (TNY_ACCOUNT (folder_store), MODEST_WINDOW (main_window));
2778 /* Show account details */
2779 modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS);
2782 if (TNY_IS_FOLDER (folder_store) && selected) {
2783 TnyAccount *account;
2785 /* Update the active account */
2786 account = modest_tny_folder_get_account (TNY_FOLDER (folder_store));
2788 set_active_account_from_tny_account (account, MODEST_WINDOW (main_window));
2789 g_object_unref (account);
2793 /* Set the header style by default, it could
2794 be changed later by the refresh callback to
2796 modest_main_window_set_contents_style (main_window,
2797 MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS);
2799 /* Set folder on header view. This function
2800 will call tny_folder_refresh_async so we
2801 pass a callback that will be called when
2802 finished. We use that callback to set the
2803 empty view if there are no messages */
2804 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view),
2805 TNY_FOLDER (folder_store),
2807 MODEST_WINDOW (main_window),
2808 folder_refreshed_cb,
2811 /* Restore configuration. We need to do this
2812 *after* the set_folder because the widget
2813 memory asks the header view about its
2815 modest_widget_memory_restore (modest_runtime_get_conf (),
2816 G_OBJECT(header_view),
2817 MODEST_CONF_HEADER_VIEW_KEY);
2819 /* No need to save the header view
2820 configuration for Maemo because it only
2821 saves the sorting stuff and that it's
2822 already being done by the sort
2823 dialog. Remove it when the GNOME version
2824 has the same behaviour */
2825 #ifdef MODEST_TOOLKIT_GTK
2826 if (modest_main_window_get_contents_style (main_window) ==
2827 MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS)
2828 modest_widget_memory_save (modest_runtime_get_conf (),
2829 G_OBJECT (header_view),
2830 MODEST_CONF_HEADER_VIEW_KEY);
2832 modest_header_view_clear (MODEST_HEADER_VIEW(header_view));
2836 /* Update dimming state */
2837 modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (main_window));
2838 modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
2842 modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemType type,
2849 item = (type == MODEST_ITEM_TYPE_FOLDER) ? "folder" : "message";
2851 online = tny_device_is_online (modest_runtime_get_device());
2854 /* already online -- the item is simply not there... */
2855 dialog = gtk_message_dialog_new (GTK_WINDOW (win),
2857 GTK_MESSAGE_WARNING,
2859 _("The %s you selected cannot be found"),
2861 gtk_dialog_add_button (GTK_DIALOG (dialog),_("mcen_bd_dialog_ok"), GTK_RESPONSE_ACCEPT);
2862 gtk_dialog_run (GTK_DIALOG(dialog));
2864 dialog = gtk_dialog_new_with_buttons (_("Connection requested"),
2867 _("mcen_bd_dialog_cancel"),
2868 GTK_RESPONSE_REJECT,
2869 _("mcen_bd_dialog_ok"),
2870 GTK_RESPONSE_ACCEPT,
2872 txt = g_strdup_printf (_("This %s is not available in offline mode.\n"
2873 "Do you want to get online?"), item);
2874 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
2875 gtk_label_new (txt), FALSE, FALSE, 0);
2876 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
2879 gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300);
2880 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
2881 /* TODO: Comment about why is this commented out: */
2882 /* modest_platform_connect_and_wait (); */
2885 gtk_widget_destroy (dialog);
2889 modest_ui_actions_on_msg_link_hover (ModestMsgView *msgview, const gchar* link,
2892 /* g_debug ("%s %s", __FUNCTION__, link); */
2897 modest_ui_actions_on_msg_link_clicked (ModestMsgView *msgview, const gchar* link,
2900 modest_platform_activate_uri (link);
2904 modest_ui_actions_on_msg_link_contextual (ModestMsgView *msgview, const gchar* link,
2907 modest_platform_show_uri_popup (link);
2911 modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, TnyMimePart *mime_part,
2914 /* we check for low-mem; in that case, show a warning, and don't allow
2915 * viewing attachments
2917 if (modest_platform_check_memory_low (MODEST_WINDOW(win), TRUE))
2920 modest_msg_view_window_view_attachment (MODEST_MSG_VIEW_WINDOW (win), mime_part);
2924 modest_ui_actions_on_msg_recpt_activated (ModestMsgView *msgview,
2925 const gchar *address,
2928 /* g_debug ("%s %s", __FUNCTION__, address); */
2932 on_save_to_drafts_cb (ModestMailOperation *mail_op,
2933 TnyMsg *saved_draft,
2936 ModestMsgEditWindow *edit_window;
2938 /* TODO: in hildon 2 we have to dim and undim the header views while we're saving */
2939 #ifndef MODEST_TOOLKIT_HILDON2
2940 ModestMainWindow *win;
2942 /* FIXME. Make the header view sensitive again. This is a
2943 * temporary hack. See modest_ui_actions_on_save_to_drafts()
2945 win = MODEST_MAIN_WINDOW(modest_window_mgr_get_main_window(
2946 modest_runtime_get_window_mgr(), FALSE));
2948 GtkWidget *hdrview = modest_main_window_get_child_widget(
2949 win, MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
2950 if (hdrview) gtk_widget_set_sensitive(hdrview, TRUE);
2954 edit_window = MODEST_MSG_EDIT_WINDOW (user_data);
2956 /* Set draft is there was no error */
2957 if (!modest_mail_operation_get_error (mail_op))
2958 modest_msg_edit_window_set_draft (edit_window, saved_draft);
2960 g_object_unref(edit_window);
2964 enough_space_for_message (ModestMsgEditWindow *edit_window,
2967 guint64 available_disk, expected_size;
2972 available_disk = modest_utils_get_available_space (NULL);
2973 modest_msg_edit_window_get_parts_size (edit_window, &parts_count, &parts_size);
2974 expected_size = modest_tny_msg_estimate_size (data->plain_body,
2979 /* Double check: memory full condition or message too big */
2980 if (available_disk < MIN_FREE_SPACE ||
2981 expected_size > available_disk) {
2982 gchar *msg = g_strdup_printf (_KR("cerm_device_memory_full"), "");
2983 modest_platform_information_banner (NULL, NULL, msg);
2990 * djcb: if we're in low-memory state, we only allow for
2991 * saving messages smaller than
2992 * MODEST_MAX_LOW_MEMORY_MESSAGE_SIZE (see modest-defs.h) this
2993 * should still allow for sending anything critical...
2995 if ((expected_size > MODEST_MAX_LOW_MEMORY_MESSAGE_SIZE) &&
2996 modest_platform_check_memory_low (MODEST_WINDOW(edit_window), TRUE))
3000 * djcb: we also make sure that the attachments are smaller than the max size
3001 * this is for the case where we'd try to forward a message with attachments
3002 * bigger than our max allowed size, or sending an message from drafts which
3003 * somehow got past our checks when attaching.
3005 if (expected_size > MODEST_MAX_ATTACHMENT_SIZE) {
3006 modest_platform_run_information_dialog (
3007 GTK_WINDOW(edit_window),
3008 _KR("memr_ib_operation_disabled"),
3017 modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edit_window)
3019 TnyTransportAccount *transport_account;
3020 ModestMailOperation *mail_operation;
3022 gchar *account_name;
3023 ModestAccountMgr *account_mgr;
3024 gboolean had_error = FALSE;
3025 ModestMainWindow *win = NULL;
3027 g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window), FALSE);
3029 data = modest_msg_edit_window_get_msg_data (edit_window);
3032 if (!enough_space_for_message (edit_window, data)) {
3033 modest_msg_edit_window_free_msg_data (edit_window, data);
3037 account_name = g_strdup (data->account_name);
3038 account_mgr = modest_runtime_get_account_mgr();
3040 account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
3042 account_name = modest_account_mgr_get_default_account (account_mgr);
3043 if (!account_name) {
3044 g_printerr ("modest: no account found\n");
3045 modest_msg_edit_window_free_msg_data (edit_window, data);
3049 if (!strcmp (account_name, MODEST_LOCAL_FOLDERS_ACCOUNT_ID)) {
3050 account_name = g_strdup (data->account_name);
3054 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_server_account
3055 (modest_runtime_get_account_store (),
3057 TNY_ACCOUNT_TYPE_TRANSPORT));
3058 if (!transport_account) {
3059 g_printerr ("modest: no transport account found for '%s'\n", account_name);
3060 g_free (account_name);
3061 modest_msg_edit_window_free_msg_data (edit_window, data);
3065 /* Create the mail operation */
3066 mail_operation = modest_mail_operation_new_with_error_handling (NULL, modest_ui_actions_disk_operations_error_handler,
3068 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
3070 modest_mail_operation_save_to_drafts (mail_operation,
3082 data->priority_flags,
3085 on_save_to_drafts_cb,
3086 g_object_ref(edit_window));
3088 #ifdef MODEST_TOOLKIT_HILDON2
3089 /* In hildon2 we always show the information banner on saving to drafts.
3090 * It will be a system information banner in this case.
3092 gchar *text = g_strdup_printf (_("mail_va_saved_to_drafts"), _("mcen_me_folder_drafts"));
3093 modest_platform_information_banner (NULL, NULL, text);
3096 /* Use the main window as the parent of the banner, if the
3097 main window does not exist it won't be shown, if the parent
3098 window exists then it's properly shown. We don't use the
3099 editor window because it could be closed (save to drafts
3100 could happen after closing the window */
3101 win = (ModestMainWindow *)
3102 modest_window_mgr_get_main_window( modest_runtime_get_window_mgr(), FALSE);
3104 gchar *text = g_strdup_printf (_("mail_va_saved_to_drafts"), _("mcen_me_folder_drafts"));
3105 modest_platform_information_banner (GTK_WIDGET (win), NULL, text);
3109 modest_msg_edit_window_set_modified (edit_window, FALSE);
3112 g_free (account_name);
3113 g_object_unref (G_OBJECT (transport_account));
3114 g_object_unref (G_OBJECT (mail_operation));
3116 modest_msg_edit_window_free_msg_data (edit_window, data);
3119 * If the drafts folder is selected then make the header view
3120 * insensitive while the message is being saved to drafts
3121 * (it'll be sensitive again in on_save_to_drafts_cb()). This
3122 * is not very clean but it avoids letting the drafts folder
3123 * in an inconsistent state: the user could edit the message
3124 * being saved and undesirable things would happen.
3125 * In the average case the user won't notice anything at
3126 * all. In the worst case (the user is editing a really big
3127 * file from Drafts) the header view will be insensitive
3128 * during the saving process (10 or 20 seconds, depending on
3129 * the message). Anyway this is just a quick workaround: once
3130 * we find a better solution it should be removed
3131 * See NB#65125 (commend #18) for details.
3133 if (!had_error && win != NULL) {
3134 ModestFolderView *view = MODEST_FOLDER_VIEW(modest_main_window_get_child_widget(
3135 win, MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW));
3137 TnyFolder *folder = TNY_FOLDER(modest_folder_view_get_selected(view));
3139 if (modest_tny_folder_is_local_folder(folder)) {
3140 TnyFolderType folder_type;
3141 folder_type = modest_tny_folder_get_local_or_mmc_folder_type(folder);
3142 if (folder_type == TNY_FOLDER_TYPE_DRAFTS) {
3143 GtkWidget *hdrview = modest_main_window_get_child_widget(
3144 win, MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
3145 if (hdrview) gtk_widget_set_sensitive(hdrview, FALSE);
3149 if (folder != NULL) g_object_unref(folder);
3156 /* For instance, when clicking the Send toolbar button when editing a message: */
3158 modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
3160 TnyTransportAccount *transport_account = NULL;
3161 gboolean had_error = FALSE;
3163 ModestAccountMgr *account_mgr;
3164 gchar *account_name;
3165 ModestMailOperation *mail_operation;
3168 g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window), TRUE);
3170 if (!modest_msg_edit_window_check_names (edit_window, TRUE))
3173 data = modest_msg_edit_window_get_msg_data (edit_window);
3175 if (data->subject == NULL || data->subject[0] == '\0') {
3176 /* Empty subject -> no send */
3177 modest_msg_edit_window_free_msg_data (edit_window, data);
3181 recipients = g_strconcat (data->to?data->to:"",
3182 data->cc?data->cc:"",
3183 data->bcc?data->bcc:"",
3185 if (recipients == NULL || recipients[0] == '\0') {
3186 /* Empty subject -> no send */
3187 g_free (recipients);
3188 modest_msg_edit_window_free_msg_data (edit_window, data);
3191 g_free (recipients);
3194 if (!enough_space_for_message (edit_window, data)) {
3195 modest_msg_edit_window_free_msg_data (edit_window, data);
3199 account_mgr = modest_runtime_get_account_mgr();
3200 account_name = g_strdup (data->account_name);
3202 account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
3205 account_name = modest_account_mgr_get_default_account (account_mgr);
3207 if (!account_name) {
3208 modest_msg_edit_window_free_msg_data (edit_window, data);
3209 /* Run account setup wizard */
3210 if (!modest_ui_actions_run_account_setup_wizard (MODEST_WINDOW(edit_window))) {
3215 /* Get the currently-active transport account for this modest account: */
3216 if (strcmp (account_name, MODEST_LOCAL_FOLDERS_ACCOUNT_ID) != 0) {
3218 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_server_account
3219 (modest_runtime_get_account_store (),
3220 account_name, TNY_ACCOUNT_TYPE_TRANSPORT));
3223 if (!transport_account) {
3224 modest_msg_edit_window_free_msg_data (edit_window, data);
3225 /* Run account setup wizard */
3226 if (!modest_ui_actions_run_account_setup_wizard(MODEST_WINDOW(edit_window)))
3231 /* Create the mail operation */
3232 mail_operation = modest_mail_operation_new_with_error_handling (NULL, modest_ui_actions_disk_operations_error_handler, NULL, NULL);
3233 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
3235 modest_mail_operation_send_new_mail (mail_operation,
3249 data->priority_flags);
3251 if (modest_mail_operation_get_status (mail_operation) == MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS)
3252 modest_platform_information_banner (NULL, NULL, _("mcen_ib_outbox_waiting_to_be_sent"));
3254 if (modest_mail_operation_get_error (mail_operation) != NULL) {
3255 const GError *error = modest_mail_operation_get_error (mail_operation);
3256 if (error->domain == MODEST_MAIL_OPERATION_ERROR &&
3257 error->code == MODEST_MAIL_OPERATION_ERROR_INSTANCE_CREATION_FAILED) {
3258 g_warning ("%s failed: %s\n", __FUNCTION__, (modest_mail_operation_get_error (mail_operation))->message);
3259 modest_platform_information_banner (NULL, NULL, _CS("sfil_ni_not_enough_memory"));
3265 g_free (account_name);
3266 g_object_unref (G_OBJECT (transport_account));
3267 g_object_unref (G_OBJECT (mail_operation));
3269 modest_msg_edit_window_free_msg_data (edit_window, data);
3272 modest_msg_edit_window_set_sent (edit_window, TRUE);
3274 /* Save settings and close the window: */
3275 modest_ui_actions_on_close_window (NULL, MODEST_WINDOW (edit_window));
3282 modest_ui_actions_on_toggle_bold (GtkToggleAction *action,
3283 ModestMsgEditWindow *window)
3285 ModestMsgEditFormatState *format_state = NULL;
3287 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
3288 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
3290 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
3293 format_state = modest_msg_edit_window_get_format_state (window);
3294 g_return_if_fail (format_state != NULL);
3296 format_state->bold = gtk_toggle_action_get_active (action);
3297 modest_msg_edit_window_set_format_state (window, format_state);
3298 g_free (format_state);
3303 modest_ui_actions_on_toggle_italics (GtkToggleAction *action,
3304 ModestMsgEditWindow *window)
3306 ModestMsgEditFormatState *format_state = NULL;
3308 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
3309 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
3311 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
3314 format_state = modest_msg_edit_window_get_format_state (window);
3315 g_return_if_fail (format_state != NULL);
3317 format_state->italics = gtk_toggle_action_get_active (action);
3318 modest_msg_edit_window_set_format_state (window, format_state);
3319 g_free (format_state);
3324 modest_ui_actions_on_toggle_bullets (GtkToggleAction *action,
3325 ModestMsgEditWindow *window)
3327 ModestMsgEditFormatState *format_state = NULL;
3329 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
3330 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
3332 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
3335 format_state = modest_msg_edit_window_get_format_state (window);
3336 g_return_if_fail (format_state != NULL);
3338 format_state->bullet = gtk_toggle_action_get_active (action);
3339 modest_msg_edit_window_set_format_state (window, format_state);
3340 g_free (format_state);
3345 modest_ui_actions_on_change_justify (GtkRadioAction *action,
3346 GtkRadioAction *selected,
3347 ModestMsgEditWindow *window)
3349 ModestMsgEditFormatState *format_state = NULL;
3350 GtkJustification value;
3352 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
3354 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
3357 value = gtk_radio_action_get_current_value (selected);
3359 format_state = modest_msg_edit_window_get_format_state (window);
3360 g_return_if_fail (format_state != NULL);
3362 format_state->justification = value;
3363 modest_msg_edit_window_set_format_state (window, format_state);
3364 g_free (format_state);
3368 modest_ui_actions_on_select_editor_color (GtkAction *action,
3369 ModestMsgEditWindow *window)
3371 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
3372 g_return_if_fail (GTK_IS_ACTION (action));
3374 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
3377 modest_msg_edit_window_select_color (window);
3381 modest_ui_actions_on_select_editor_background_color (GtkAction *action,
3382 ModestMsgEditWindow *window)
3384 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
3385 g_return_if_fail (GTK_IS_ACTION (action));
3387 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
3390 modest_msg_edit_window_select_background_color (window);
3394 modest_ui_actions_on_insert_image (GObject *object,
3395 ModestMsgEditWindow *window)
3397 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
3400 if (modest_platform_check_memory_low (MODEST_WINDOW(window), TRUE))
3403 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
3406 modest_msg_edit_window_insert_image (window);
3410 modest_ui_actions_on_attach_file (GtkAction *action,
3411 ModestMsgEditWindow *window)
3413 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
3414 g_return_if_fail (GTK_IS_ACTION (action));
3416 if (modest_platform_check_memory_low (MODEST_WINDOW(window), TRUE))
3419 modest_msg_edit_window_offer_attach_file (window);
3423 modest_ui_actions_on_remove_attachments (GtkAction *action,
3424 ModestMsgEditWindow *window)
3426 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
3428 modest_msg_edit_window_remove_attachments (window, NULL);
3432 do_create_folder_cb (ModestMailOperation *mail_op,
3433 TnyFolderStore *parent_folder,
3434 TnyFolder *new_folder,
3437 gchar *suggested_name = (gchar *) user_data;
3438 GtkWindow *source_win = (GtkWindow *) modest_mail_operation_get_source (mail_op);
3439 const GError *error;
3441 error = modest_mail_operation_get_error (mail_op);
3444 /* Show an error. If there was some problem writing to
3445 disk, show it, otherwise show the generic folder
3446 create error. We do it here and not in an error
3447 handler because the call to do_create_folder will
3448 stop the main loop in a gtk_dialog_run and then,
3449 the message won't be shown until that dialog is
3451 if (!check_memory_full_error ((GtkWidget *) source_win, (GError *) error,
3452 _("mail_in_ui_folder_create_error_memory"))) {
3453 /* Show an error and try again if there is no
3454 full memory condition */
3455 modest_platform_information_banner ((GtkWidget *) source_win, NULL,
3456 _("mail_in_ui_folder_create_error"));
3457 do_create_folder (source_win, parent_folder, (const gchar *) suggested_name);
3460 /* the 'source_win' is either the ModestMainWindow, or the 'Move to folder'-dialog
3461 * FIXME: any other? */
3462 GtkWidget *folder_view;
3464 if (MODEST_IS_MAIN_WINDOW(source_win))
3466 modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (source_win),
3467 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
3469 folder_view = GTK_WIDGET(g_object_get_data (G_OBJECT (source_win),
3470 MODEST_MOVE_TO_DIALOG_FOLDER_VIEW));
3472 /* Select the newly created folder. It could happen
3473 that the widget is no longer there (i.e. the window
3474 has been destroyed, so we need to check this */
3476 modest_folder_view_select_folder (MODEST_FOLDER_VIEW (folder_view),
3478 g_object_unref (new_folder);
3480 /* Free. Note that the first time it'll be NULL so noop */
3481 g_free (suggested_name);
3482 g_object_unref (source_win);
3487 TnyFolderStore *parent;
3488 } CreateFolderConnect;
3491 do_create_folder_performer (gboolean canceled,
3493 GtkWindow *parent_window,
3494 TnyAccount *account,
3497 CreateFolderConnect *helper = (CreateFolderConnect *) user_data;
3498 ModestMailOperation *mail_op;
3500 if (canceled || err) {
3501 /* In memory full conditions we could get this error here */
3502 check_memory_full_error ((GtkWidget *) parent_window, err,
3503 _("mail_in_ui_folder_create_error_memory"));
3505 /* This happens if we have selected the outbox folder
3507 if (err->code == TNY_SERVICE_ERROR_UNKNOWN &&
3508 TNY_IS_MERGE_FOLDER (helper->parent)) {
3509 /* Show an error and retry */
3510 modest_platform_information_banner ((GtkWidget *) parent_window,
3512 _("mail_in_ui_folder_create_error"));
3514 do_create_folder (parent_window, helper->parent, helper->folder_name);
3520 mail_op = modest_mail_operation_new ((GObject *) parent_window);
3521 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
3523 modest_mail_operation_create_folder (mail_op,
3525 (const gchar *) helper->folder_name,
3526 do_create_folder_cb,
3527 g_strdup (helper->folder_name));
3528 g_object_unref (mail_op);
3532 g_object_unref (helper->parent);
3533 if (helper->folder_name)
3534 g_free (helper->folder_name);
3535 g_slice_free (CreateFolderConnect, helper);
3540 do_create_folder (GtkWindow *parent_window,
3541 TnyFolderStore *suggested_parent,
3542 const gchar *suggested_name)
3545 gchar *folder_name = NULL;
3546 TnyFolderStore *parent_folder = NULL;
3548 result = modest_platform_run_new_folder_dialog (GTK_WINDOW (parent_window),
3550 (gchar *) suggested_name,
3554 if (result == GTK_RESPONSE_ACCEPT && parent_folder) {
3555 CreateFolderConnect *helper = (CreateFolderConnect *) g_slice_new0 (CreateFolderConnect);
3556 helper->folder_name = g_strdup (folder_name);
3557 helper->parent = g_object_ref (parent_folder);
3559 modest_platform_connect_if_remote_and_perform (GTK_WINDOW (parent_window),
3562 do_create_folder_performer,
3567 g_free (folder_name);
3569 g_object_unref (parent_folder);
3573 modest_ui_actions_create_folder(GtkWidget *parent_window,
3574 GtkWidget *folder_view,
3575 TnyFolderStore *parent_folder)
3577 if (!parent_folder) {
3578 #ifdef MODEST_TOOLKIT_HILDON2
3579 ModestTnyAccountStore *acc_store;
3581 acc_store = modest_runtime_get_account_store ();
3583 parent_folder = (TnyFolderStore *)
3584 modest_tny_account_store_get_local_folders_account (acc_store);
3586 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
3590 if (parent_folder) {
3591 do_create_folder (GTK_WINDOW (parent_window), parent_folder, NULL);
3592 g_object_unref (parent_folder);
3597 modest_ui_actions_on_new_folder (GtkAction *action, ModestWindow *window)
3600 g_return_if_fail (MODEST_IS_WINDOW(window));
3602 if (MODEST_IS_MAIN_WINDOW (window)) {
3603 GtkWidget *folder_view;
3605 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (window),
3606 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
3610 modest_ui_actions_create_folder (GTK_WIDGET (window), folder_view, NULL);
3611 #ifdef MODEST_TOOLKIT_HILDON2
3612 } else if (MODEST_IS_FOLDER_WINDOW (window)) {
3613 GtkWidget *folder_view;
3615 folder_view = GTK_WIDGET (modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (window)));
3616 modest_ui_actions_create_folder (GTK_WIDGET (window), folder_view, NULL);
3619 g_assert_not_reached ();
3624 modest_ui_actions_rename_folder_error_handler (ModestMailOperation *mail_op,
3627 const GError *error = NULL;
3628 gchar *message = NULL;
3631 /* Get error message */
3632 error = modest_mail_operation_get_error (mail_op);
3634 g_return_if_reached ();
3636 mem_full = is_memory_full_error ((GError *) error, mail_op, NULL);
3638 message = g_strdup_printf (_KR("cerm_device_memory_full"), "");
3639 } else if (error->domain == MODEST_MAIL_OPERATION_ERROR &&
3640 error->code == MODEST_MAIL_OPERATION_ERROR_FOLDER_EXISTS) {
3641 message = _CS("ckdg_ib_folder_already_exists");
3642 } else if (error->domain == TNY_ERROR_DOMAIN &&
3643 error->code == TNY_SERVICE_ERROR_STATE) {
3644 /* This means that the folder is already in use (a
3645 message is opened for example */
3646 message = _("emev_ni_internal_error");
3648 message = _CS("ckdg_ib_unable_to_rename");
3651 /* We don't set a parent for the dialog because the dialog
3652 will be destroyed so the banner won't appear */
3653 modest_platform_information_banner (NULL, NULL, message);
3660 TnyFolderStore *folder;
3665 on_rename_folder_cb (ModestMailOperation *mail_op,
3666 TnyFolder *new_folder,
3669 ModestFolderView *folder_view;
3671 /* If the window was closed when renaming a folder, or if
3672 * it's not a main window this will happen */
3673 if (!MODEST_IS_FOLDER_VIEW (user_data))
3676 folder_view = MODEST_FOLDER_VIEW (user_data);
3677 /* Note that if the rename fails new_folder will be NULL */
3679 modest_folder_view_select_folder (folder_view, new_folder, FALSE);
3681 modest_folder_view_select_first_inbox_or_local (folder_view);
3683 gtk_widget_grab_focus (GTK_WIDGET (folder_view));
3687 on_rename_folder_performer (gboolean canceled,
3689 GtkWindow *parent_window,
3690 TnyAccount *account,
3693 ModestMailOperation *mail_op = NULL;
3694 GtkTreeSelection *sel = NULL;
3695 GtkWidget *folder_view = NULL;
3696 RenameFolderInfo *data = (RenameFolderInfo*)user_data;
3698 if (canceled || err) {
3699 /* In memory full conditions we could get this error here */
3700 check_memory_full_error ((GtkWidget *) parent_window, err, NULL);
3704 modest_mail_operation_new_with_error_handling (G_OBJECT(parent_window),
3705 modest_ui_actions_rename_folder_error_handler,
3706 parent_window, NULL);
3708 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
3711 if (MODEST_IS_MAIN_WINDOW(parent_window)) {
3713 folder_view = modest_main_window_get_child_widget (
3714 MODEST_MAIN_WINDOW (parent_window),
3715 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
3717 #ifdef MODEST_TOOLKIT_HILDON2
3718 else if (MODEST_IS_FOLDER_WINDOW (parent_window)) {
3719 ModestFolderWindow *folder_window = (ModestFolderWindow *) parent_window;
3720 folder_view = GTK_WIDGET (modest_folder_window_get_folder_view (folder_window));
3724 /* Clear the folders view */
3725 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_view));
3726 gtk_tree_selection_unselect_all (sel);
3728 /* Actually rename the folder */
3729 modest_mail_operation_rename_folder (mail_op,
3730 TNY_FOLDER (data->folder),
3731 (const gchar *) (data->new_name),
3732 on_rename_folder_cb,
3734 g_object_unref (mail_op);
3737 g_object_unref (data->folder);
3738 g_free (data->new_name);
3743 modest_ui_actions_on_rename_folder (GtkAction *action,
3744 ModestWindow *window)
3746 modest_ui_actions_on_edit_mode_rename_folder (window);
3750 modest_ui_actions_on_edit_mode_rename_folder (ModestWindow *window)
3752 TnyFolderStore *folder;
3753 GtkWidget *folder_view;
3754 gboolean do_rename = TRUE;
3756 g_return_val_if_fail (MODEST_IS_WINDOW(window), FALSE);
3758 if (MODEST_IS_MAIN_WINDOW (window)) {
3759 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (window),
3760 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
3764 #ifdef MODEST_TOOLKIT_HILDON2
3765 } else if (MODEST_IS_FOLDER_WINDOW (window)) {
3766 folder_view = GTK_WIDGET (modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (window)));
3772 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
3777 if (TNY_IS_FOLDER (folder)) {
3778 gchar *folder_name = NULL;
3780 const gchar *current_name;
3781 TnyFolderStore *parent;
3783 current_name = tny_folder_get_name (TNY_FOLDER (folder));
3784 parent = tny_folder_get_folder_store (TNY_FOLDER (folder));
3785 response = modest_platform_run_rename_folder_dialog (GTK_WINDOW (window),
3786 parent, current_name,
3788 g_object_unref (parent);
3790 if (response != GTK_RESPONSE_ACCEPT || strlen (folder_name) == 0) {
3793 RenameFolderInfo *rename_folder_data = g_new0 (RenameFolderInfo, 1);
3794 rename_folder_data->folder = g_object_ref (folder);
3795 rename_folder_data->new_name = folder_name;
3796 modest_platform_connect_if_remote_and_perform (GTK_WINDOW(window), TRUE,
3797 folder, on_rename_folder_performer, rename_folder_data);
3800 g_object_unref (folder);
3805 modest_ui_actions_delete_folder_error_handler (ModestMailOperation *mail_op,
3808 GObject *win = modest_mail_operation_get_source (mail_op);
3810 modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL,
3811 _("mail_in_ui_folder_delete_error"),
3813 g_object_unref (win);
3817 TnyFolderStore *folder;
3818 gboolean move_to_trash;
3822 on_delete_folder_cb (gboolean canceled,
3824 GtkWindow *parent_window,
3825 TnyAccount *account,
3828 DeleteFolderInfo *info = (DeleteFolderInfo*) user_data;
3829 GtkWidget *folder_view;
3830 ModestMailOperation *mail_op;
3831 GtkTreeSelection *sel;
3833 if (!MODEST_IS_WINDOW(parent_window) || canceled || (err!=NULL)) {
3834 g_object_unref (G_OBJECT (info->folder));
3839 if (MODEST_IS_MAIN_WINDOW (parent_window)) {
3840 folder_view = modest_main_window_get_child_widget (
3841 MODEST_MAIN_WINDOW (parent_window),
3842 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
3843 #ifdef MODEST_TOOLKIT_HILDON2
3844 } else if (MODEST_IS_FOLDER_WINDOW (parent_window)) {
3845 folder_view = GTK_WIDGET (modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (parent_window)));
3848 g_object_unref (G_OBJECT (info->folder));
3853 /* Unselect the folder before deleting it to free the headers */
3854 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_view));
3855 gtk_tree_selection_unselect_all (sel);
3857 /* Create the mail operation */
3859 modest_mail_operation_new_with_error_handling (G_OBJECT(parent_window),
3860 modest_ui_actions_delete_folder_error_handler,
3863 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
3865 modest_mail_operation_remove_folder (mail_op, TNY_FOLDER (info->folder), info->move_to_trash);
3867 modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (folder_view));
3869 g_object_unref (G_OBJECT (mail_op));
3870 g_object_unref (G_OBJECT (info->folder));
3875 delete_folder (ModestWindow *window, gboolean move_to_trash)
3877 TnyFolderStore *folder;
3878 GtkWidget *folder_view;
3882 g_return_val_if_fail (MODEST_IS_WINDOW(window), FALSE);
3884 if (MODEST_IS_MAIN_WINDOW (window)) {
3886 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (window),
3887 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
3888 #ifdef MODEST_TOOLKIT_HILDON2
3889 } else if (MODEST_IS_FOLDER_WINDOW (window)) {
3890 folder_view = GTK_WIDGET (modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (window)));
3898 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
3903 /* Show an error if it's an account */
3904 if (!TNY_IS_FOLDER (folder)) {
3905 modest_platform_run_information_dialog (GTK_WINDOW (window),
3906 _("mail_in_ui_folder_delete_error"),
3908 g_object_unref (G_OBJECT (folder));
3913 message = g_strdup_printf (_("mcen_nc_delete_folder_text"),
3914 tny_folder_get_name (TNY_FOLDER (folder)));
3915 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (window),
3916 (const gchar *) message);
3919 if (response == GTK_RESPONSE_OK) {
3920 DeleteFolderInfo *info;
3921 info = g_new0(DeleteFolderInfo, 1);
3922 info->folder = folder;
3923 info->move_to_trash = move_to_trash;
3924 g_object_ref (G_OBJECT (info->folder));
3925 TnyAccount *account = tny_folder_get_account (TNY_FOLDER (folder));
3926 modest_platform_connect_if_remote_and_perform (GTK_WINDOW (window),
3928 TNY_FOLDER_STORE (account),
3929 on_delete_folder_cb, info);
3930 g_object_unref (account);
3935 g_object_unref (G_OBJECT (folder));
3939 modest_ui_actions_on_delete_folder (GtkAction *action,
3940 ModestWindow *window)
3942 modest_ui_actions_on_edit_mode_delete_folder (window);
3946 modest_ui_actions_on_edit_mode_delete_folder (ModestWindow *window)
3948 g_return_val_if_fail (MODEST_IS_WINDOW(window), TRUE);
3950 return delete_folder (window, FALSE);
3954 modest_ui_actions_on_move_folder_to_trash_folder (GtkAction *action, ModestMainWindow *main_window)
3956 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
3958 delete_folder (MODEST_WINDOW (main_window), TRUE);
3962 typedef struct _PasswordDialogFields {
3963 GtkWidget *username;
3964 GtkWidget *password;
3966 } PasswordDialogFields;
3969 password_dialog_check_field (GtkEditable *editable,
3970 PasswordDialogFields *fields)
3973 gboolean any_value_empty = FALSE;
3975 #ifdef MODEST_TOOLKIT_HILDON2
3976 value = hildon_entry_get_text (HILDON_ENTRY (fields->username));
3978 value = gtk_entry_get_text (GTK_ENTRY (fields->username));
3980 if ((value == NULL) || value[0] == '\0') {
3981 any_value_empty = TRUE;
3983 #ifdef MODEST_TOOLKIT_HILDON2
3984 value = hildon_entry_get_text (HILDON_ENTRY (fields->password));
3986 value = gtk_entry_get_text (GTK_ENTRY (fields->password));
3988 if ((value == NULL) || value[0] == '\0') {
3989 any_value_empty = TRUE;
3991 gtk_dialog_set_response_sensitive (GTK_DIALOG (fields->dialog), GTK_RESPONSE_ACCEPT, !any_value_empty);
3995 modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
3996 const gchar* server_account_name,
4001 ModestMainWindow *main_window)
4003 g_return_if_fail(server_account_name);
4004 gboolean completed = FALSE;
4005 PasswordDialogFields *fields = NULL;
4007 /* Initalize output parameters: */
4014 #ifndef MODEST_TOOLKIT_GTK
4015 /* Maemo uses a different (awkward) button order,
4016 * It should probably just use gtk_alternative_dialog_button_order ().
4018 #ifdef MODEST_TOOLKIT_HILDON2
4020 gtk_dialog_new_with_buttons (_("mail_ti_password_protected"),
4023 _HL("wdgt_bd_done"),
4024 GTK_RESPONSE_ACCEPT,
4026 gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox),
4027 HILDON_MARGIN_DOUBLE);
4030 gtk_dialog_new_with_buttons (_("mail_ti_password_protected"),
4033 _("mcen_bd_dialog_ok"),
4034 GTK_RESPONSE_ACCEPT,
4035 _("mcen_bd_dialog_cancel"),
4036 GTK_RESPONSE_REJECT,
4038 #endif /* MODEST_TOOLKIT_HILDON2 */
4041 gtk_dialog_new_with_buttons (_("mail_ti_password_protected"),
4045 GTK_RESPONSE_REJECT,
4047 GTK_RESPONSE_ACCEPT,
4049 #endif /* MODEST_TOOLKIT_GTK */
4051 modest_window_mgr_set_modal (modest_runtime_get_window_mgr(), GTK_WINDOW (dialog), NULL);
4053 gchar *server_name = modest_account_mgr_get_server_account_hostname (
4054 modest_runtime_get_account_mgr(), server_account_name);
4055 if (!server_name) {/* This happened once, though I don't know why. murrayc. */
4056 g_warning("%s: Could not get server name for server account '%s'", __FUNCTION__, server_account_name);
4059 gtk_widget_destroy (dialog);
4063 gchar *txt = g_strdup_printf (_("mail_ia_password_info"), server_name);
4064 GtkWidget *label = gtk_label_new (txt);
4065 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
4067 g_free (server_name);
4068 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), label,
4073 gchar *initial_username = modest_account_mgr_get_server_account_username (
4074 modest_runtime_get_account_mgr(), server_account_name);
4076 #ifdef MODEST_TOOLKIT_HILDON2
4077 GtkWidget *entry_username = hildon_entry_new (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH);
4078 if (initial_username)
4079 hildon_entry_set_text (HILDON_ENTRY (entry_username), initial_username);
4081 GtkWidget *entry_username = gtk_entry_new ();
4082 if (initial_username)
4083 gtk_entry_set_text (GTK_ENTRY (entry_username), initial_username);
4085 /* Dim this if a connection has ever succeeded with this username,
4086 * as per the UI spec: */
4087 /* const gboolean username_known = */
4088 /* modest_account_mgr_get_server_account_username_has_succeeded( */
4089 /* modest_runtime_get_account_mgr(), server_account_name); */
4090 /* gtk_widget_set_sensitive (entry_username, !username_known); */
4092 /* We drop the username sensitive code and disallow changing it here
4093 * as tinymail does not support really changing the username in the callback
4095 gtk_widget_set_sensitive (entry_username, FALSE);
4097 #ifndef MODEST_TOOLKIT_GTK
4098 /* Auto-capitalization is the default, so let's turn it off: */
4099 hildon_gtk_entry_set_input_mode (GTK_ENTRY (entry_username), HILDON_GTK_INPUT_MODE_FULL);
4101 /* Create a size group to be used by all captions.
4102 * Note that HildonCaption does not create a default size group if we do not specify one.
4103 * We use GTK_SIZE_GROUP_HORIZONTAL, so that the widths are the same. */
4104 GtkSizeGroup *sizegroup = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
4106 #ifdef MODEST_TOOLKIT_HILDON2
4107 GtkWidget *caption = modest_maemo_utils_create_captioned (sizegroup, NULL,
4108 _("mail_fi_username"), FALSE,
4111 GtkWidget *caption = hildon_caption_new (sizegroup,
4112 _("mail_fi_username"), entry_username, NULL, HILDON_CAPTION_MANDATORY);
4114 gtk_widget_show (entry_username);
4115 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), caption,
4116 FALSE, FALSE, MODEST_MARGIN_HALF);
4117 gtk_widget_show (caption);
4119 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry_username,
4121 #endif /* !MODEST_TOOLKIT_GTK */
4124 #ifdef MODEST_TOOLKIT_HILDON2
4125 GtkWidget *entry_password = hildon_entry_new (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH);
4127 GtkWidget *entry_password = gtk_entry_new ();
4129 gtk_entry_set_visibility (GTK_ENTRY(entry_password), FALSE);
4130 /* gtk_entry_set_invisible_char (GTK_ENTRY(entry_password), "*"); */
4132 #ifndef MODEST_TOOLKIT_GTK
4133 /* Auto-capitalization is the default, so let's turn it off: */
4134 hildon_gtk_entry_set_input_mode (GTK_ENTRY (entry_password),
4135 HILDON_GTK_INPUT_MODE_FULL | HILDON_GTK_INPUT_MODE_INVISIBLE);
4137 #ifdef MODEST_TOOLKIT_HILDON2
4138 caption = modest_maemo_utils_create_captioned (sizegroup, NULL,
4139 _("mail_fi_password"), FALSE,
4142 caption = hildon_caption_new (sizegroup,
4143 _("mail_fi_password"), entry_password, NULL, HILDON_CAPTION_MANDATORY);
4145 gtk_widget_show (entry_password);
4146 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), caption,
4147 FALSE, FALSE, MODEST_MARGIN_HALF);
4148 gtk_widget_show (caption);
4149 g_object_unref (sizegroup);
4151 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry_password,
4153 #endif /* !MODEST_TOOLKIT_GTK */
4155 if (initial_username != NULL)
4156 gtk_widget_grab_focus (GTK_WIDGET (entry_password));
4158 /* This is not in the Maemo UI spec:
4159 remember_pass_check = gtk_check_button_new_with_label (_("Remember password"));
4160 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check,
4164 fields = g_slice_new0 (PasswordDialogFields);
4165 fields->username = entry_username;
4166 fields->password = entry_password;
4167 fields->dialog = dialog;
4169 g_signal_connect (entry_username, "changed", G_CALLBACK (password_dialog_check_field), fields);
4170 g_signal_connect (entry_password, "changed", G_CALLBACK (password_dialog_check_field), fields);
4171 password_dialog_check_field (NULL, fields);
4173 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
4175 while (!completed) {
4177 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
4179 #ifdef MODEST_TOOLKIT_HILDON2
4180 *username = g_strdup (hildon_entry_get_text (HILDON_ENTRY(entry_username)));
4182 *username = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry_username)));
4185 /* Note that an empty field becomes the "" string */
4186 if (*username && strlen (*username) > 0) {
4187 modest_account_mgr_set_server_account_username (modest_runtime_get_account_mgr(),
4188 server_account_name,
4192 const gboolean username_was_changed =
4193 (strcmp (*username, initial_username) != 0);
4194 if (username_was_changed) {
4195 g_warning ("%s: tinymail does not yet support changing the "
4196 "username in the get_password() callback.\n", __FUNCTION__);
4202 modest_platform_information_banner (GTK_WIDGET (dialog), NULL,
4203 _("mcen_ib_username_pw_incorrect"));
4209 #ifdef MODEST_TOOLKIT_HILDON2
4210 *password = g_strdup (hildon_entry_get_text (HILDON_ENTRY(entry_password)));
4212 *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry_password)));
4215 /* We do not save the password in the configuration,
4216 * because this function is only called for passwords that should
4217 * not be remembered:
4218 modest_server_account_set_password (
4219 modest_runtime_get_account_mgr(), server_account_name,
4226 #ifndef MODEST_TOOLKIT_HILDON2
4227 /* Set parent to NULL or the banner will disappear with its parent dialog */
4228 modest_platform_information_banner(NULL, NULL, _("mail_ib_login_cancelled"));
4240 /* This is not in the Maemo UI spec:
4241 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check)))
4247 g_free (initial_username);
4248 gtk_widget_destroy (dialog);
4249 g_slice_free (PasswordDialogFields, fields);
4251 /* printf ("DEBUG: %s: cancel=%d\n", __FUNCTION__, *cancel); */
4255 modest_ui_actions_on_cut (GtkAction *action,
4256 ModestWindow *window)
4258 GtkWidget *focused_widget;
4259 GtkClipboard *clipboard;
4261 clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
4262 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
4263 if (GTK_IS_EDITABLE (focused_widget)) {
4264 gtk_editable_cut_clipboard (GTK_EDITABLE(focused_widget));
4265 gtk_clipboard_set_can_store (clipboard, NULL, 0);
4266 gtk_clipboard_store (clipboard);
4267 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
4268 GtkTextBuffer *buffer;
4270 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
4271 if (modest_text_utils_buffer_selection_is_valid (buffer)) {
4272 gtk_text_buffer_cut_clipboard (buffer, clipboard, TRUE);
4273 gtk_clipboard_set_can_store (clipboard, NULL, 0);
4274 gtk_clipboard_store (clipboard);
4276 } else if (MODEST_IS_HEADER_VIEW (focused_widget)) {
4277 TnyList *header_list = modest_header_view_get_selected_headers (
4278 MODEST_HEADER_VIEW (focused_widget));
4279 gboolean continue_download = FALSE;
4280 gint num_of_unc_msgs;
4282 num_of_unc_msgs = header_list_count_uncached_msgs(header_list);
4284 if (num_of_unc_msgs) {
4285 TnyAccount *account = get_account_from_header_list (header_list);
4287 continue_download = connect_to_get_msg (window, num_of_unc_msgs, account);
4288 g_object_unref (account);
4292 if (num_of_unc_msgs == 0 || continue_download) {
4293 /* modest_platform_information_banner (
4294 NULL, NULL, _CS("mcen_ib_getting_items"));*/
4295 modest_header_view_cut_selection (
4296 MODEST_HEADER_VIEW (focused_widget));
4299 g_object_unref (header_list);
4300 } else if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
4301 modest_folder_view_cut_selection (MODEST_FOLDER_VIEW (focused_widget));
4306 modest_ui_actions_on_copy (GtkAction *action,
4307 ModestWindow *window)
4309 GtkClipboard *clipboard;
4310 GtkWidget *focused_widget;
4311 gboolean copied = TRUE;
4313 clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
4314 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
4316 if (GTK_IS_LABEL (focused_widget)) {
4318 selection = modest_text_utils_label_get_selection (GTK_LABEL (focused_widget));
4319 gtk_clipboard_set_text (clipboard, selection, -1);
4321 gtk_clipboard_set_can_store (clipboard, NULL, 0);
4322 gtk_clipboard_store (clipboard);
4323 } else if (GTK_IS_EDITABLE (focused_widget)) {
4324 gtk_editable_copy_clipboard (GTK_EDITABLE(focused_widget));
4325 gtk_clipboard_set_can_store (clipboard, NULL, 0);
4326 gtk_clipboard_store (clipboard);
4327 } else if (GTK_IS_HTML (focused_widget)) {
4330 sel = gtk_html_get_selection_html (GTK_HTML (focused_widget), &len);
4331 if ((sel == NULL) || (sel[0] == '\0')) {
4334 gtk_html_copy (GTK_HTML (focused_widget));
4335 gtk_clipboard_set_can_store (clipboard, NULL, 0);
4336 gtk_clipboard_store (clipboard);
4338 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
4339 GtkTextBuffer *buffer;
4340 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
4341 if (modest_text_utils_buffer_selection_is_valid (buffer)) {
4342 gtk_text_buffer_copy_clipboard (buffer, clipboard);
4343 gtk_clipboard_set_can_store (clipboard, NULL, 0);
4344 gtk_clipboard_store (clipboard);
4346 } else if (MODEST_IS_HEADER_VIEW (focused_widget)) {
4347 TnyList *header_list = modest_header_view_get_selected_headers (
4348 MODEST_HEADER_VIEW (focused_widget));
4349 gboolean continue_download = FALSE;
4350 gint num_of_unc_msgs;
4352 num_of_unc_msgs = header_list_count_uncached_msgs(header_list);
4354 if (num_of_unc_msgs) {
4355 TnyAccount *account = get_account_from_header_list (header_list);
4357 continue_download = connect_to_get_msg (window, num_of_unc_msgs, account);
4358 g_object_unref (account);
4362 if (num_of_unc_msgs == 0 || continue_download) {
4363 modest_platform_information_banner (
4364 NULL, NULL, _CS("mcen_ib_getting_items"));
4365 modest_header_view_copy_selection (
4366 MODEST_HEADER_VIEW (focused_widget));
4370 g_object_unref (header_list);
4372 } else if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
4373 modest_folder_view_copy_selection (MODEST_FOLDER_VIEW (focused_widget));
4376 /* Show information banner if there was a copy to clipboard */
4378 modest_platform_information_banner (
4379 NULL, NULL, _CS("ecoc_ib_edwin_copied"));
4383 modest_ui_actions_on_undo (GtkAction *action,
4384 ModestWindow *window)
4386 ModestEmailClipboard *clipboard = NULL;
4388 if (MODEST_IS_MSG_EDIT_WINDOW (window)) {
4389 modest_msg_edit_window_undo (MODEST_MSG_EDIT_WINDOW (window));
4390 } else if (MODEST_IS_MAIN_WINDOW (window)) {
4391 /* Clear clipboard source */
4392 clipboard = modest_runtime_get_email_clipboard ();
4393 modest_email_clipboard_clear (clipboard);
4396 g_return_if_reached ();
4401 modest_ui_actions_on_redo (GtkAction *action,
4402 ModestWindow *window)
4404 if (MODEST_IS_MSG_EDIT_WINDOW (window)) {
4405 modest_msg_edit_window_redo (MODEST_MSG_EDIT_WINDOW (window));
4408 g_return_if_reached ();
4414 destroy_information_note (ModestMailOperation *mail_op,
4417 /* destroy information note */
4418 gtk_widget_destroy (GTK_WIDGET(user_data));
4422 destroy_folder_information_note (ModestMailOperation *mail_op,
4423 TnyFolder *new_folder,
4426 /* destroy information note */
4427 gtk_widget_destroy (GTK_WIDGET(user_data));
4432 paste_as_attachment_free (gpointer data)
4434 PasteAsAttachmentHelper *helper = (PasteAsAttachmentHelper *) data;
4436 if (helper->banner) {
4437 gtk_widget_destroy (helper->banner);
4438 g_object_unref (helper->banner);
4444 paste_msg_as_attachment_cb (ModestMailOperation *mail_op,
4449 PasteAsAttachmentHelper *helper = (PasteAsAttachmentHelper *) userdata;
4450 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (helper->window));
4455 modest_msg_edit_window_add_part (MODEST_MSG_EDIT_WINDOW (helper->window), TNY_MIME_PART (msg));
4460 modest_ui_actions_on_paste (GtkAction *action,
4461 ModestWindow *window)
4463 GtkWidget *focused_widget = NULL;
4464 GtkWidget *inf_note = NULL;
4465 ModestMailOperation *mail_op = NULL;
4467 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
4468 if (GTK_IS_EDITABLE (focused_widget)) {
4469 gtk_editable_paste_clipboard (GTK_EDITABLE(focused_widget));
4470 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
4471 ModestEmailClipboard *e_clipboard = NULL;
4472 e_clipboard = modest_runtime_get_email_clipboard ();
4473 if (modest_email_clipboard_cleared (e_clipboard)) {
4474 GtkTextBuffer *buffer;
4475 GtkClipboard *clipboard;
4477 clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
4478 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
4479 gtk_text_buffer_paste_clipboard (buffer, clipboard, NULL, TRUE);
4480 } else if (MODEST_IS_MSG_EDIT_WINDOW (window)) {
4481 ModestMailOperation *mail_op;
4482 TnyFolder *src_folder = NULL;
4483 TnyList *data = NULL;
4485 PasteAsAttachmentHelper *helper = g_new0 (PasteAsAttachmentHelper, 1);
4486 helper->window = MODEST_MSG_EDIT_WINDOW (window);
4487 helper->banner = modest_platform_animation_banner (GTK_WIDGET (window), NULL,
4488 _CS("ckct_nw_pasting"));
4489 modest_email_clipboard_get_data (e_clipboard, &src_folder, &data, &delete);
4490 mail_op = modest_mail_operation_new (G_OBJECT (window));
4491 if (helper->banner != NULL) {
4492 g_object_ref (G_OBJECT (helper->banner));
4493 gtk_widget_show (GTK_WIDGET (helper->banner));
4497 modest_mail_operation_get_msgs_full (mail_op,
4499 (GetMsgAsyncUserCallback) paste_msg_as_attachment_cb,
4501 paste_as_attachment_free);
4505 g_object_unref (data);
4507 g_object_unref (src_folder);
4510 } else if (MODEST_IS_FOLDER_VIEW (focused_widget)) {
4511 ModestEmailClipboard *clipboard = NULL;
4512 TnyFolder *src_folder = NULL;
4513 TnyFolderStore *folder_store = NULL;
4514 TnyList *data = NULL;
4515 gboolean delete = FALSE;
4517 /* Check clipboard source */
4518 clipboard = modest_runtime_get_email_clipboard ();
4519 if (modest_email_clipboard_cleared (clipboard))
4522 /* Get elements to paste */
4523 modest_email_clipboard_get_data (clipboard, &src_folder, &data, &delete);
4525 /* Create a new mail operation */
4526 mail_op = modest_mail_operation_new (G_OBJECT(window));
4528 /* Get destination folder */
4529 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (focused_widget));
4531 /* transfer messages */
4535 /* Ask for user confirmation */
4537 modest_ui_actions_msgs_move_to_confirmation (window,
4538 TNY_FOLDER (folder_store),
4542 if (response == GTK_RESPONSE_OK) {
4543 /* Launch notification */
4544 inf_note = modest_platform_animation_banner (GTK_WIDGET (window), NULL,
4545 _CS("ckct_nw_pasting"));
4546 if (inf_note != NULL) {
4547 gtk_window_set_modal (GTK_WINDOW(inf_note), FALSE);
4548 gtk_widget_show (GTK_WIDGET(inf_note));
4551 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
4552 modest_mail_operation_xfer_msgs (mail_op,
4554 TNY_FOLDER (folder_store),
4556 destroy_information_note,
4559 g_object_unref (mail_op);
4562 } else if (src_folder != NULL) {
4563 /* Launch notification */
4564 inf_note = modest_platform_animation_banner (GTK_WIDGET (window), NULL,
4565 _CS("ckct_nw_pasting"));
4566 if (inf_note != NULL) {
4567 gtk_window_set_modal (GTK_WINDOW(inf_note), FALSE);
4568 gtk_widget_show (GTK_WIDGET(inf_note));
4571 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
4572 modest_mail_operation_xfer_folder (mail_op,
4576 destroy_folder_information_note,
4582 g_object_unref (data);
4583 if (src_folder != NULL)
4584 g_object_unref (src_folder);
4585 if (folder_store != NULL)
4586 g_object_unref (folder_store);
4592 modest_ui_actions_on_select_all (GtkAction *action,
4593 ModestWindow *window)
4595 GtkWidget *focused_widget;
4597 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
4598 if (MODEST_IS_ATTACHMENTS_VIEW (focused_widget)) {
4599 modest_attachments_view_select_all (MODEST_ATTACHMENTS_VIEW (focused_widget));
4600 } else if (GTK_IS_LABEL (focused_widget)) {
4601 gtk_label_select_region (GTK_LABEL (focused_widget), 0, -1);
4602 } else if (GTK_IS_EDITABLE (focused_widget)) {
4603 gtk_editable_select_region (GTK_EDITABLE(focused_widget), 0, -1);
4604 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
4605 GtkTextBuffer *buffer;
4606 GtkTextIter start, end;
4608 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
4609 gtk_text_buffer_get_start_iter (buffer, &start);
4610 gtk_text_buffer_get_end_iter (buffer, &end);
4611 gtk_text_buffer_select_range (buffer, &start, &end);
4612 } else if (GTK_IS_HTML (focused_widget)) {
4613 gtk_html_select_all (GTK_HTML (focused_widget));
4614 } else if (MODEST_IS_MAIN_WINDOW (window)) {
4615 GtkWidget *header_view = focused_widget;
4616 GtkTreeSelection *selection = NULL;
4618 if (!(MODEST_IS_HEADER_VIEW (focused_widget))) {
4619 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (window),
4620 MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
4623 /* Disable window dimming management */
4624 modest_window_disable_dimming (MODEST_WINDOW(window));
4626 /* Select all messages */
4627 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(header_view));
4628 gtk_tree_selection_select_all (selection);
4630 /* Set focuse on header view */
4631 gtk_widget_grab_focus (header_view);
4633 /* Enable window dimming management */
4634 modest_window_enable_dimming (MODEST_WINDOW(window));
4635 modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (window));
4636 modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
4642 modest_ui_actions_on_mark_as_read (GtkAction *action,
4643 ModestWindow *window)
4645 g_return_if_fail (MODEST_IS_WINDOW(window));
4647 /* Mark each header as read */
4648 do_headers_action (window, headers_action_mark_as_read, NULL);
4652 modest_ui_actions_on_mark_as_unread (GtkAction *action,
4653 ModestWindow *window)
4655 g_return_if_fail (MODEST_IS_WINDOW(window));
4657 /* Mark each header as read */
4658 do_headers_action (window, headers_action_mark_as_unread, NULL);
4662 modest_ui_actions_on_change_zoom (GtkRadioAction *action,
4663 GtkRadioAction *selected,
4664 ModestWindow *window)
4668 value = gtk_radio_action_get_current_value (selected);
4669 if (MODEST_IS_WINDOW (window)) {
4670 modest_window_set_zoom (MODEST_WINDOW (window), ((gdouble)value)/100);
4675 modest_ui_actions_msg_edit_on_change_priority (GtkRadioAction *action,
4676 GtkRadioAction *selected,
4677 ModestWindow *window)
4679 TnyHeaderFlags flags;
4680 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
4682 flags = gtk_radio_action_get_current_value (selected);
4683 modest_msg_edit_window_set_priority_flags (MODEST_MSG_EDIT_WINDOW (window), flags);
4687 modest_ui_actions_msg_edit_on_change_file_format (GtkRadioAction *action,
4688 GtkRadioAction *selected,
4689 ModestWindow *window)
4693 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
4695 file_format = gtk_radio_action_get_current_value (selected);
4696 modest_msg_edit_window_set_file_format (MODEST_MSG_EDIT_WINDOW (window), file_format);
4701 modest_ui_actions_on_zoom_plus (GtkAction *action,
4702 ModestWindow *window)
4704 g_return_if_fail (MODEST_IS_WINDOW (window));
4706 modest_window_zoom_plus (MODEST_WINDOW (window));
4710 modest_ui_actions_on_zoom_minus (GtkAction *action,
4711 ModestWindow *window)
4713 g_return_if_fail (MODEST_IS_WINDOW (window));
4715 modest_window_zoom_minus (MODEST_WINDOW (window));
4719 modest_ui_actions_on_toggle_fullscreen (GtkToggleAction *toggle,
4720 ModestWindow *window)
4722 ModestWindowMgr *mgr;
4723 gboolean fullscreen, active;
4724 g_return_if_fail (MODEST_IS_WINDOW (window));
4726 mgr = modest_runtime_get_window_mgr ();
4728 active = (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle)))?1:0;
4729 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
4731 if (active != fullscreen) {
4732 modest_window_mgr_set_fullscreen_mode (mgr, active);
4733 #ifndef MODEST_TOOLKIT_HILDON2
4734 gtk_window_present (GTK_WINDOW (window));
4740 modest_ui_actions_on_change_fullscreen (GtkAction *action,
4741 ModestWindow *window)
4743 ModestWindowMgr *mgr;
4744 gboolean fullscreen;
4746 g_return_if_fail (MODEST_IS_WINDOW (window));
4748 mgr = modest_runtime_get_window_mgr ();
4749 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
4750 modest_window_mgr_set_fullscreen_mode (mgr, !fullscreen);
4752 #ifndef MODEST_TOOLKIT_HILDON2
4753 gtk_window_present (GTK_WINDOW (window));
4758 * Used by modest_ui_actions_on_details to call do_headers_action
4761 headers_action_show_details (TnyHeader *header,
4762 ModestWindow *window,
4766 gboolean async_retrieval;
4769 if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
4770 async_retrieval = TRUE;
4771 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (window));
4773 async_retrieval = FALSE;
4775 modest_platform_run_header_details_dialog (GTK_WINDOW (window), header, async_retrieval, msg);
4777 g_object_unref (msg);
4781 * Show the header details in a ModestDetailsDialog widget
4784 modest_ui_actions_on_details (GtkAction *action,
4787 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
4791 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
4795 header = tny_msg_get_header (msg);
4797 headers_action_show_details (header, win, NULL);
4798 g_object_unref (header);
4800 g_object_unref (msg);
4802 } else if (MODEST_IS_MAIN_WINDOW (win)) {
4803 GtkWidget *folder_view, *header_view;
4805 /* Check which widget has the focus */
4806 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
4807 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
4808 if (gtk_widget_is_focus (folder_view)) {
4809 TnyFolderStore *folder_store
4810 = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
4811 if (!folder_store) {
4812 g_warning ("%s: No item was selected.\n", __FUNCTION__);
4815 /* Show only when it's a folder */
4816 /* This function should not be called for account items,
4817 * because we dim the menu item for them. */
4818 if (TNY_IS_FOLDER (folder_store)) {
4819 modest_platform_run_folder_details_dialog (GTK_WINDOW (win),
4820 TNY_FOLDER (folder_store));
4823 g_object_unref (folder_store);
4826 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
4827 MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
4828 /* Show details of each header */
4829 do_headers_action (win, headers_action_show_details, header_view);
4831 #ifdef MODEST_TOOLKIT_HILDON2
4832 } else if (MODEST_IS_HEADER_WINDOW (win)) {
4834 GtkWidget *header_view;
4836 header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (win)));
4837 folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
4839 modest_platform_run_folder_details_dialog (GTK_WINDOW (win),
4841 g_object_unref (folder);
4848 modest_ui_actions_on_toggle_show_cc (GtkToggleAction *toggle,
4849 ModestMsgEditWindow *window)
4851 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
4853 modest_msg_edit_window_show_cc (window, gtk_toggle_action_get_active (toggle));
4857 modest_ui_actions_on_toggle_show_bcc (GtkToggleAction *toggle,
4858 ModestMsgEditWindow *window)
4860 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
4862 modest_msg_edit_window_show_bcc (window, gtk_toggle_action_get_active (toggle));
4866 modest_ui_actions_toggle_folders_view (GtkAction *action,
4867 ModestMainWindow *main_window)
4869 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
4871 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)))
4872 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SPLIT);
4874 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SIMPLE);
4878 modest_ui_actions_on_toggle_toolbar (GtkToggleAction *toggle,
4879 ModestWindow *window)
4881 gboolean active, fullscreen = FALSE;
4882 ModestWindowMgr *mgr;
4884 active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle));
4886 /* Check if we want to toggle the toolbar view in fullscreen
4888 if (!strcmp (gtk_action_get_name (GTK_ACTION (toggle)),
4889 "ViewShowToolbarFullScreen")) {
4893 /* Toggle toolbar */
4894 mgr = modest_runtime_get_window_mgr ();
4895 modest_window_mgr_show_toolbars (mgr, G_TYPE_FROM_INSTANCE (window), active, fullscreen);
4899 modest_ui_actions_msg_edit_on_select_font (GtkAction *action,
4900 ModestMsgEditWindow *window)
4902 modest_msg_edit_window_select_font (window);
4907 modest_ui_actions_on_folder_display_name_changed (ModestFolderView *folder_view,
4908 const gchar *display_name,
4911 /* don't update the display name if it was already set;
4912 * updating the display name apparently is expensive */
4913 const gchar* old_name = gtk_window_get_title (window);
4915 if (display_name == NULL)
4918 if (old_name && display_name && strcmp (old_name, display_name) == 0)
4919 return; /* don't do anything */
4921 /* This is usually used to change the title of the main window, which
4922 * is the one that holds the folder view. Note that this change can
4923 * happen even when the widget doesn't have the focus. */
4924 gtk_window_set_title (window, display_name);
4929 modest_ui_actions_on_select_contacts (GtkAction *action, ModestMsgEditWindow *window)
4931 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
4932 modest_msg_edit_window_select_contacts (window);
4936 modest_ui_actions_on_check_names (GtkAction *action, ModestMsgEditWindow *window)
4938 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
4939 modest_msg_edit_window_check_names (window, FALSE);
4942 #ifndef MODEST_TOOLKIT_HILDON2
4944 * This function is used to track changes in the selection of the
4945 * folder view that is inside the "move to" dialog to enable/disable
4946 * the OK button because we do not want the user to select a disallowed
4947 * destination for a folder.
4948 * The user also not desired to be able to use NEW button on items where
4949 * folder creation is not possibel.
4952 on_move_to_dialog_folder_selection_changed (ModestFolderView* self,
4953 TnyFolderStore *folder_store,
4957 GtkWidget *dialog = NULL;
4958 gboolean ok_sensitive = TRUE, new_sensitive = TRUE;
4959 gboolean moving_folder = FALSE;
4960 gboolean is_local_account = TRUE;
4961 GtkWidget *folder_view = NULL;
4962 ModestTnyFolderRules rules;
4964 g_return_if_fail (MODEST_IS_FOLDER_VIEW(self));
4969 dialog = gtk_widget_get_ancestor (GTK_WIDGET (self), GTK_TYPE_DIALOG);
4973 /* check if folder_store is an remote account */
4974 if (TNY_IS_ACCOUNT (folder_store)) {
4975 TnyAccount *local_account = NULL;
4976 TnyAccount *mmc_account = NULL;
4977 ModestTnyAccountStore *account_store = NULL;
4979 account_store = modest_runtime_get_account_store ();
4980 local_account = modest_tny_account_store_get_local_folders_account (account_store);
4981 mmc_account = modest_tny_account_store_get_mmc_folders_account (account_store);
4983 if ((gpointer) local_account != (gpointer) folder_store &&
4984 (gpointer) mmc_account != (gpointer) folder_store) {
4985 ModestProtocolType proto;
4986 proto = modest_tny_account_get_protocol_type (TNY_ACCOUNT (folder_store));
4987 if (proto == MODEST_PROTOCOL_REGISTRY_TYPE_INVALID) {
4988 proto = MODEST_PROTOCOLS_STORE_MAILDIR;
4990 is_local_account = FALSE;
4991 /* New button should be dimmed on remote
4993 new_sensitive = (modest_protocol_registry_protocol_type_has_tag (modest_runtime_get_protocol_registry (),
4995 MODEST_PROTOCOL_REGISTRY_STORE_HAS_FOLDERS));
4997 g_object_unref (local_account);
4999 /* It could not exist */
5001 g_object_unref (mmc_account);
5004 /* Check the target folder rules */
5005 if (TNY_IS_FOLDER (folder_store)) {
5006 rules = modest_tny_folder_get_rules (TNY_FOLDER (folder_store));
5007 if (rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE) {
5008 ok_sensitive = FALSE;
5009 new_sensitive = FALSE;
5014 /* Check if we're moving a folder */
5015 if (MODEST_IS_MAIN_WINDOW (user_data)) {
5016 /* Get the widgets */
5017 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (user_data),
5018 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
5019 if (gtk_widget_is_focus (folder_view))
5020 moving_folder = TRUE;
5023 if (moving_folder) {
5024 TnyFolderStore *moved_folder = NULL, *parent = NULL;
5026 /* Get the folder to move */
5027 moved_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
5029 /* Check that we're not moving to the same folder */
5030 if (TNY_IS_FOLDER (moved_folder)) {
5031 parent = tny_folder_get_folder_store (TNY_FOLDER (moved_folder));
5032 if (parent == folder_store)
5033 ok_sensitive = FALSE;
5034 g_object_unref (parent);
5037 if (ok_sensitive && TNY_IS_ACCOUNT (folder_store)) {
5038 /* Do not allow to move to an account unless it's the
5039 local folders account */
5040 if (!is_local_account)
5041 ok_sensitive = FALSE;
5044 if (ok_sensitive && (moved_folder == folder_store)) {
5045 /* Do not allow to move to itself */
5046 ok_sensitive = FALSE;
5048 g_object_unref (moved_folder);
5050 TnyFolder *src_folder = NULL;
5052 /* Moving a message */
5053 if (MODEST_IS_MSG_VIEW_WINDOW (user_data)) {
5055 TnyHeader *header = NULL;
5056 header = modest_msg_view_window_get_header
5057 (MODEST_MSG_VIEW_WINDOW (user_data));
5058 if (!TNY_IS_HEADER(header))
5059 g_warning ("%s: could not get source header", __FUNCTION__);
5061 src_folder = tny_header_get_folder (header);
5064 g_object_unref (header);
5067 TNY_FOLDER (modest_folder_view_get_selected
5068 (MODEST_FOLDER_VIEW (folder_view)));
5071 if (TNY_IS_FOLDER(src_folder)) {
5072 /* Do not allow to move the msg to the same folder */
5073 /* Do not allow to move the msg to an account */
5074 if ((gpointer) src_folder == (gpointer) folder_store ||
5075 TNY_IS_ACCOUNT (folder_store))
5076 ok_sensitive = FALSE;
5077 g_object_unref (src_folder);
5079 g_warning ("%s: could not get source folder", __FUNCTION__);
5083 /* Set sensitivity of the OK and NEW button */
5084 gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, ok_sensitive);
5085 gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), MODEST_GTK_RESPONSE_NEW_FOLDER, new_sensitive);
5090 on_move_to_dialog_response (GtkDialog *dialog,
5094 GtkWidget *parent_win;
5095 MoveToInfo *helper = NULL;
5096 ModestFolderView *folder_view;
5097 gboolean unset_edit_mode = FALSE;
5099 helper = (MoveToInfo *) user_data;
5101 parent_win = (GtkWidget *) helper->win;
5102 folder_view = MODEST_FOLDER_VIEW (g_object_get_data (G_OBJECT (dialog),
5103 MODEST_MOVE_TO_DIALOG_FOLDER_VIEW));
5106 TnyFolderStore *dst_folder;
5107 TnyFolderStore *selected;
5109 case MODEST_GTK_RESPONSE_NEW_FOLDER:
5110 selected = modest_folder_view_get_selected (folder_view);
5111 modest_ui_actions_create_folder (GTK_WIDGET (dialog), GTK_WIDGET (folder_view), selected);
5112 g_object_unref (selected);
5114 case GTK_RESPONSE_NONE:
5115 case GTK_RESPONSE_CANCEL:
5116 case GTK_RESPONSE_DELETE_EVENT:
5118 case GTK_RESPONSE_OK:
5119 dst_folder = modest_folder_view_get_selected (folder_view);
5121 if (MODEST_IS_MAIN_WINDOW (parent_win)) {
5122 /* Clean list to move used for filtering */
5123 modest_folder_view_set_list_to_move (folder_view, NULL);
5125 modest_ui_actions_on_main_window_move_to (NULL,
5126 GTK_WIDGET (folder_view),
5128 MODEST_MAIN_WINDOW (parent_win));
5129 #ifdef MODEST_TOOLKIT_HILDON2
5130 } else if (MODEST_IS_FOLDER_WINDOW (parent_win)) {
5131 /* Clean list to move used for filtering */
5132 modest_folder_view_set_list_to_move (folder_view, NULL);
5134 modest_ui_actions_on_folder_window_move_to (GTK_WIDGET (folder_view),
5137 GTK_WINDOW (parent_win));
5140 /* if the user selected a root folder
5141 (account) then do not perform any action */
5142 if (TNY_IS_ACCOUNT (dst_folder)) {
5143 g_signal_stop_emission_by_name (dialog, "response");
5147 /* Clean list to move used for filtering */
5148 modest_folder_view_set_list_to_move (folder_view, NULL);
5150 /* Moving from headers window in edit mode */
5151 modest_ui_actions_on_window_move_to (NULL, helper->list,
5153 MODEST_WINDOW (parent_win));
5157 g_object_unref (dst_folder);
5159 unset_edit_mode = TRUE;
5162 g_warning ("%s unexpected response id %d", __FUNCTION__, response);
5165 /* Free the helper and exit */
5167 g_object_unref (helper->list);
5168 if (unset_edit_mode) {
5169 #ifdef MODEST_TOOLKIT_HILDON2
5170 modest_hildon2_window_unset_edit_mode (MODEST_HILDON2_WINDOW (helper->win));
5173 g_slice_free (MoveToInfo, helper);
5174 gtk_widget_destroy (GTK_WIDGET (dialog));
5178 create_move_to_dialog (GtkWindow *win,
5179 GtkWidget *folder_view,
5180 TnyList *list_to_move)
5182 GtkWidget *dialog, *tree_view = NULL;
5184 dialog = modest_platform_create_move_to_dialog (win, &tree_view);
5186 #ifndef MODEST_TOOLKIT_HILDON2
5187 /* Track changes in the selection to
5188 * disable the OK button whenever "Move to" is not possible
5189 * disbale NEW button whenever New is not possible */
5190 g_signal_connect (tree_view,
5191 "folder_selection_changed",
5192 G_CALLBACK (on_move_to_dialog_folder_selection_changed),
5196 /* It could happen that we're trying to move a message from a
5197 window (msg window for example) after the main window was
5198 closed, so we can not just get the model of the folder
5200 if (MODEST_IS_FOLDER_VIEW (folder_view)) {
5201 const gchar *visible_id = NULL;
5203 modest_folder_view_set_style (MODEST_FOLDER_VIEW (tree_view),
5204 MODEST_FOLDER_VIEW_STYLE_SHOW_ALL);
5205 modest_folder_view_copy_model (MODEST_FOLDER_VIEW(folder_view),
5206 MODEST_FOLDER_VIEW(tree_view));
5209 modest_folder_view_get_account_id_of_visible_server_account (MODEST_FOLDER_VIEW(folder_view));
5211 /* Show the same account than the one that is shown in the main window */
5212 modest_folder_view_set_account_id_of_visible_server_account (MODEST_FOLDER_VIEW(tree_view),
5215 const gchar *active_account_name = NULL;
5216 ModestAccountMgr *mgr = NULL;
5217 ModestAccountSettings *settings = NULL;
5218 ModestServerAccountSettings *store_settings = NULL;
5220 modest_folder_view_set_style (MODEST_FOLDER_VIEW (tree_view),
5221 MODEST_FOLDER_VIEW_STYLE_SHOW_ALL);
5222 modest_folder_view_update_model (MODEST_FOLDER_VIEW (tree_view),
5223 TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()));
5225 active_account_name = modest_window_get_active_account (MODEST_WINDOW (win));
5226 mgr = modest_runtime_get_account_mgr ();
5227 settings = modest_account_mgr_load_account_settings (mgr, active_account_name);
5230 const gchar *store_account_name;
5231 store_settings = modest_account_settings_get_store_settings (settings);
5232 store_account_name = modest_server_account_settings_get_account_name (store_settings);
5234 modest_folder_view_set_account_id_of_visible_server_account (MODEST_FOLDER_VIEW (tree_view),
5235 store_account_name);
5236 g_object_unref (store_settings);
5237 g_object_unref (settings);
5241 /* we keep a pointer to the embedded folder view, so we can
5242 * retrieve it with get_folder_view_from_move_to_dialog (see
5243 * above) later (needed for focus handling)
5245 g_object_set_data (G_OBJECT(dialog), MODEST_MOVE_TO_DIALOG_FOLDER_VIEW, tree_view);
5247 /* Hide special folders */
5248 #ifndef MODEST_TOOLKIT_HILDON2
5249 modest_folder_view_show_non_move_folders (MODEST_FOLDER_VIEW (tree_view), FALSE);
5252 modest_folder_view_set_list_to_move (MODEST_FOLDER_VIEW (tree_view), list_to_move);
5253 #ifndef MODEST_TOOLKIT_HILDON2
5254 modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (tree_view));
5257 gtk_widget_show (GTK_WIDGET (tree_view));
5263 * Shows a confirmation dialog to the user when we're moving messages
5264 * from a remote server to the local storage. Returns the dialog
5265 * response. If it's other kind of movement then it always returns
5268 * This one is used by the next functions:
5269 * modest_ui_actions_on_paste - commented out
5270 * drag_and_drop_from_header_view (for d&d in modest_folder_view.c)
5273 modest_ui_actions_msgs_move_to_confirmation (ModestWindow *win,
5274 TnyFolder *dest_folder,
5278 gint response = GTK_RESPONSE_OK;
5279 TnyAccount *account = NULL;
5280 TnyFolder *src_folder = NULL;
5281 TnyIterator *iter = NULL;
5282 TnyHeader *header = NULL;
5284 /* return with OK if the destination is a remote folder */
5285 if (modest_tny_folder_is_remote_folder (dest_folder))
5286 return GTK_RESPONSE_OK;
5288 /* Get source folder */
5289 iter = tny_list_create_iterator (headers);
5290 header = TNY_HEADER (tny_iterator_get_current (iter));
5292 src_folder = tny_header_get_folder (header);
5293 g_object_unref (header);
5295 g_object_unref (iter);
5297 /* if no src_folder, message may be an attahcment */
5298 if (src_folder == NULL)
5299 return GTK_RESPONSE_CANCEL;
5301 /* If the source is a local or MMC folder */
5302 if (!modest_tny_folder_is_remote_folder (src_folder)) {
5303 g_object_unref (src_folder);
5304 return GTK_RESPONSE_OK;
5307 /* Get the account */
5308 account = tny_folder_get_account (src_folder);
5310 /* now if offline we ask the user */
5311 if(connect_to_get_msg (win, tny_list_get_length (headers), account))
5312 response = GTK_RESPONSE_OK;
5314 response = GTK_RESPONSE_CANCEL;
5317 g_object_unref (src_folder);
5318 g_object_unref (account);
5324 move_to_helper_destroyer (gpointer user_data)
5326 MoveToHelper *helper = (MoveToHelper *) user_data;
5328 /* Close the "Pasting" information banner */
5329 if (helper->banner) {
5330 gtk_widget_destroy (GTK_WIDGET (helper->banner));
5331 g_object_unref (helper->banner);
5333 if (gtk_tree_row_reference_valid (helper->reference)) {
5334 gtk_tree_row_reference_free (helper->reference);
5335 helper->reference = NULL;
5341 move_to_cb (ModestMailOperation *mail_op,
5344 MoveToHelper *helper = (MoveToHelper *) user_data;
5345 GObject *object = modest_mail_operation_get_source (mail_op);
5347 /* Note that the operation could have failed, in that case do
5349 if (modest_mail_operation_get_status (mail_op) !=
5350 MODEST_MAIL_OPERATION_STATUS_SUCCESS)
5353 if (MODEST_IS_MSG_VIEW_WINDOW (object)) {
5354 ModestMsgViewWindow *self = MODEST_MSG_VIEW_WINDOW (object);
5356 if (!modest_msg_view_window_select_next_message (self) &&
5357 !modest_msg_view_window_select_previous_message (self)) {
5358 /* No more messages to view, so close this window */
5359 modest_ui_actions_on_close_window (NULL, MODEST_WINDOW(self));
5361 } else if (MODEST_IS_MAIN_WINDOW (object) &&
5362 gtk_tree_row_reference_valid (helper->reference)) {
5363 GtkWidget *header_view;
5365 GtkTreeSelection *sel;
5367 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(object),
5368 MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
5369 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (header_view));
5370 path = gtk_tree_row_reference_get_path (helper->reference);
5371 /* We need to unselect the previous one
5372 because we could be copying instead of
5374 gtk_tree_selection_unselect_all (sel);
5375 gtk_tree_selection_select_path (sel, path);
5376 gtk_tree_path_free (path);
5378 g_object_unref (object);
5381 /* Destroy the helper */
5382 move_to_helper_destroyer (helper);
5386 folder_move_to_cb (ModestMailOperation *mail_op,
5387 TnyFolder *new_folder,
5390 GtkWidget *folder_view;
5393 object = modest_mail_operation_get_source (mail_op);
5394 if (MODEST_IS_MAIN_WINDOW (object)) {
5395 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(object),
5396 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
5397 g_object_ref (folder_view);
5398 g_object_unref (object);
5399 move_to_cb (mail_op, user_data);
5400 modest_folder_view_select_folder (MODEST_FOLDER_VIEW (folder_view), new_folder, FALSE);
5401 g_object_unref (folder_view);
5403 move_to_cb (mail_op, user_data);
5408 msgs_move_to_cb (ModestMailOperation *mail_op,
5411 move_to_cb (mail_op, user_data);
5415 modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op,
5418 GObject *win = NULL;
5420 #ifndef MODEST_TOOLKIT_HILDON2
5421 ModestWindow *main_window = NULL;
5423 /* Disable next automatic folder selection */
5424 main_window = modest_window_mgr_get_main_window (modest_runtime_get_window_mgr (),
5425 FALSE); /* don't create */
5427 GtkWidget *folder_view = NULL;
5429 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (main_window),
5430 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
5431 modest_folder_view_disable_next_folder_selection (MODEST_FOLDER_VIEW(folder_view));
5433 if (user_data && TNY_IS_FOLDER (user_data)) {
5434 modest_folder_view_select_folder (MODEST_FOLDER_VIEW (folder_view),
5435 TNY_FOLDER (user_data), FALSE);
5439 /* Show notification dialog only if the main window exists */
5440 win = modest_mail_operation_get_source (mail_op);
5441 modest_platform_run_information_dialog ((GtkWindow *) win,
5442 _("mail_in_ui_folder_move_target_error"),
5445 g_object_unref (win);
5449 open_msg_for_purge_cb (ModestMailOperation *mail_op,
5458 gint pending_purges = 0;
5459 gboolean some_purged = FALSE;
5460 ModestWindow *win = MODEST_WINDOW (user_data);
5461 ModestWindowMgr *mgr = modest_runtime_get_window_mgr ();
5463 /* If there was any error */
5464 if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg)) {
5465 modest_window_mgr_unregister_header (mgr, header);
5469 /* Once the message has been retrieved for purging, we check if
5470 * it's all ok for purging */
5472 parts = tny_simple_list_new ();
5473 tny_mime_part_get_parts (TNY_MIME_PART (msg), parts);
5474 iter = tny_list_create_iterator (parts);
5476 while (!tny_iterator_is_done (iter)) {
5478 part = TNY_MIME_PART (tny_iterator_get_current (iter));
5479 if (part && (tny_mime_part_is_attachment (part) || TNY_IS_MSG (part))) {
5480 if (tny_mime_part_is_purged (part))
5487 g_object_unref (part);
5489 tny_iterator_next (iter);
5491 g_object_unref (iter);
5494 if (pending_purges>0) {
5496 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),_("mcen_nc_purge_file_text_inbox"));
5498 if (response == GTK_RESPONSE_OK) {
5501 modest_platform_animation_banner (GTK_WIDGET (win), NULL, _("mcen_me_inbox_remove_attachments"));
5502 iter = tny_list_create_iterator (parts);
5503 while (!tny_iterator_is_done (iter)) {
5506 part = TNY_MIME_PART (tny_iterator_get_current (iter));
5507 if (part && (tny_mime_part_is_attachment (part) || TNY_IS_MSG (part)))
5508 tny_mime_part_set_purged (part);
5511 g_object_unref (part);
5513 tny_iterator_next (iter);
5515 g_object_unref (iter);
5517 tny_msg_rewrite_cache (msg);
5519 gtk_widget_destroy (info);
5523 modest_window_mgr_unregister_header (mgr, header);
5525 g_object_unref (parts);
5529 modest_ui_actions_on_main_window_remove_attachments (GtkAction *action,
5530 ModestMainWindow *win)
5532 GtkWidget *header_view;
5533 TnyList *header_list;
5535 TnyHeaderFlags flags;
5536 ModestWindow *msg_view_window = NULL;
5539 g_return_if_fail (MODEST_IS_MAIN_WINDOW (win));
5541 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
5542 MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
5544 header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (header_view));
5546 g_warning ("%s: no header selected", __FUNCTION__);
5550 if (tny_list_get_length (header_list) == 1) {
5551 TnyIterator *iter = tny_list_create_iterator (header_list);
5552 header = TNY_HEADER (tny_iterator_get_current (iter));
5553 g_object_unref (iter);
5557 if (!header || !TNY_IS_HEADER(header)) {
5558 g_warning ("%s: header is not valid", __FUNCTION__);
5562 found = modest_window_mgr_find_registered_header (modest_runtime_get_window_mgr (),
5563 header, &msg_view_window);
5564 flags = tny_header_get_flags (header);
5565 if (!(flags & TNY_HEADER_FLAG_CACHED))
5568 if (msg_view_window != NULL)
5569 modest_msg_view_window_remove_attachments (MODEST_MSG_VIEW_WINDOW (msg_view_window), TRUE);
5571 /* do nothing; uid was registered before, so window is probably on it's way */
5572 g_debug ("header %p has already been registered", header);
5575 ModestMailOperation *mail_op = NULL;
5576 modest_window_mgr_register_header (modest_runtime_get_window_mgr (), header, NULL);
5577 mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT (win),
5578 modest_ui_actions_disk_operations_error_handler,
5580 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
5581 modest_mail_operation_get_msg (mail_op, header, FALSE, open_msg_for_purge_cb, win);
5583 g_object_unref (mail_op);
5586 g_object_unref (header);
5588 g_object_unref (header_list);
5592 * Checks if we need a connection to do the transfer and if the user
5593 * wants to connect to complete it
5596 modest_ui_actions_xfer_messages_check (GtkWindow *parent_window,
5597 TnyFolderStore *src_folder,
5599 TnyFolder *dst_folder,
5600 gboolean delete_originals,
5601 gboolean *need_connection,
5604 TnyAccount *src_account;
5605 gint uncached_msgs = 0;
5607 /* We don't need any further check if
5609 * 1- the source folder is local OR
5610 * 2- the device is already online
5612 if (!modest_tny_folder_store_is_remote (src_folder) ||
5613 tny_device_is_online (modest_runtime_get_device())) {
5614 *need_connection = FALSE;
5619 /* We must ask for a connection when
5621 * - the message(s) is not already cached OR
5622 * - the message(s) is cached but the leave_on_server setting
5623 * is FALSE (because we need to sync the source folder to
5624 * delete the message from the server (for IMAP we could do it
5625 * offline, it'll take place the next time we get a
5628 uncached_msgs = header_list_count_uncached_msgs (headers);
5629 src_account = get_account_from_folder_store (src_folder);
5630 if (uncached_msgs > 0) {
5634 *need_connection = TRUE;
5635 num_headers = tny_list_get_length (headers);
5636 msg = ngettext ("mcen_nc_get_msg", "mcen_nc_get_msgs", num_headers);
5638 if (modest_platform_run_confirmation_dialog (parent_window, msg) ==
5639 GTK_RESPONSE_CANCEL) {
5645 /* The transfer is possible and the user wants to */
5648 if (remote_folder_has_leave_on_server (src_folder) && delete_originals) {
5649 const gchar *account_name;
5650 gboolean leave_on_server;
5652 account_name = modest_tny_account_get_parent_modest_account_name_for_server_account (src_account);
5653 leave_on_server = modest_account_mgr_get_leave_on_server (modest_runtime_get_account_mgr (),
5656 if (leave_on_server == TRUE) {
5657 *need_connection = FALSE;
5659 *need_connection = TRUE;
5662 *need_connection = FALSE;
5667 g_object_unref (src_account);
5671 xfer_messages_error_handler (ModestMailOperation *mail_op,
5675 const GError *error;
5677 win = modest_mail_operation_get_source (mail_op);
5678 error = modest_mail_operation_get_error (mail_op);
5680 if (error && is_memory_full_error ((GError *) error, mail_op, NULL)) {
5681 gchar *msg = g_strdup_printf (_KR("cerm_device_memory_full"), "");
5682 modest_platform_information_banner ((GtkWidget *) win, NULL, msg);
5685 modest_platform_run_information_dialog ((GtkWindow *) win,
5686 _("mail_in_ui_folder_move_target_error"),
5690 g_object_unref (win);
5694 TnyFolderStore *dst_folder;
5699 * Utility function that transfer messages from both the main window
5700 * and the msg view window when using the "Move to" dialog
5703 xfer_messages_performer (gboolean canceled,
5705 GtkWindow *parent_window,
5706 TnyAccount *account,
5709 ModestWindow *win = MODEST_WINDOW (parent_window);
5710 TnyAccount *dst_account = NULL;
5711 gboolean dst_forbids_message_add = FALSE;
5712 XferMsgsHelper *helper;
5713 MoveToHelper *movehelper;
5714 ModestMailOperation *mail_op;
5716 helper = (XferMsgsHelper *) user_data;
5718 if (canceled || err) {
5719 if (!check_memory_full_error ((GtkWidget *) parent_window, err, NULL)) {
5720 /* Show the proper error message */
5721 modest_ui_actions_on_account_connection_error (parent_window, account);
5726 dst_account = tny_folder_get_account (TNY_FOLDER (helper->dst_folder));
5728 /* tinymail will return NULL for local folders it seems */
5729 dst_forbids_message_add = modest_protocol_registry_protocol_type_has_tag (modest_runtime_get_protocol_registry (),
5730 modest_tny_account_get_protocol_type (dst_account),
5731 MODEST_PROTOCOL_REGISTRY_STORE_FORBID_MESSAGE_ADD);
5732 g_object_unref (dst_account);
5734 if (dst_forbids_message_add) {
5735 modest_platform_information_banner (GTK_WIDGET (win),
5737 ngettext("mail_in_ui_folder_move_target_error",
5738 "mail_in_ui_folder_move_targets_error",
5739 tny_list_get_length (helper->headers)));
5743 movehelper = g_new0 (MoveToHelper, 1);
5745 #ifndef MODEST_TOOLKIT_HILDON2
5746 movehelper->banner = modest_platform_animation_banner (GTK_WIDGET (win), NULL,
5747 _CS("ckct_nw_pasting"));
5748 if (movehelper->banner != NULL) {
5749 g_object_ref (movehelper->banner);
5750 gtk_widget_show (GTK_WIDGET (movehelper->banner));
5754 if (MODEST_IS_MAIN_WINDOW (win)) {
5755 GtkWidget *header_view =
5756 modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
5757 MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
5758 movehelper->reference = get_next_after_selected_headers (MODEST_HEADER_VIEW (header_view));
5761 /* Perform the mail operation */
5762 mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT(win),
5763 xfer_messages_error_handler,
5765 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
5768 modest_mail_operation_xfer_msgs (mail_op,
5770 TNY_FOLDER (helper->dst_folder),
5775 g_object_unref (G_OBJECT (mail_op));
5777 g_object_unref (helper->dst_folder);
5778 g_object_unref (helper->headers);
5779 g_slice_free (XferMsgsHelper, helper);
5783 TnyFolder *src_folder;
5784 TnyFolderStore *dst_folder;
5785 gboolean delete_original;
5786 GtkWidget *folder_view;
5790 on_move_folder_cb (gboolean canceled, GError *err, GtkWindow *parent_window,
5791 TnyAccount *account, gpointer user_data)
5793 MoveFolderInfo *info = (MoveFolderInfo*)user_data;
5794 GtkTreeSelection *sel;
5795 ModestMailOperation *mail_op = NULL;
5797 if (canceled || err || !MODEST_IS_WINDOW (parent_window)) {
5798 g_object_unref (G_OBJECT (info->src_folder));
5799 g_object_unref (G_OBJECT (info->dst_folder));
5804 MoveToHelper *helper = g_new0 (MoveToHelper, 1);
5805 #ifndef MODEST_TOOLKIT_HILDON2
5806 helper->banner = modest_platform_animation_banner (GTK_WIDGET (parent_window), NULL,
5807 _CS("ckct_nw_pasting"));
5808 if (helper->banner != NULL) {
5809 g_object_ref (helper->banner);
5810 gtk_widget_show (GTK_WIDGET(helper->banner));
5813 /* Clean folder on header view before moving it */
5814 sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (info->folder_view));
5815 gtk_tree_selection_unselect_all (sel);
5817 /* Let gtk events run. We need that the folder
5818 view frees its reference to the source
5819 folder *before* issuing the mail operation
5820 so we need the signal handler of selection
5821 changed to happen before the mail
5823 while (gtk_events_pending ())
5824 gtk_main_iteration (); */
5827 modest_mail_operation_new_with_error_handling (G_OBJECT(parent_window),
5828 modest_ui_actions_move_folder_error_handler,
5829 info->src_folder, NULL);
5830 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
5833 /* Select *after* the changes */
5834 /* TODO: this function hangs UI after transfer */
5835 /* modest_folder_view_select_folder (MODEST_FOLDER_VIEW(folder_view), */
5836 /* TNY_FOLDER (src_folder), TRUE); */
5838 if (MODEST_IS_MAIN_WINDOW (parent_window)) {
5839 modest_folder_view_select_folder (MODEST_FOLDER_VIEW(info->folder_view),
5840 TNY_FOLDER (info->dst_folder), TRUE);
5842 modest_mail_operation_xfer_folder (mail_op,
5843 TNY_FOLDER (info->src_folder),
5845 info->delete_original,
5848 g_object_unref (G_OBJECT (info->src_folder));
5850 /* if (modest_mail_operation_get_status (mail_op) == MODEST_MAIL_OPERATION_STATUS_SUCCESS) { */
5853 /* Unref mail operation */
5854 g_object_unref (G_OBJECT (mail_op));
5855 g_object_unref (G_OBJECT (info->dst_folder));
5860 get_account_from_folder_store (TnyFolderStore *folder_store)
5862 if (TNY_IS_ACCOUNT (folder_store))
5863 return g_object_ref (folder_store);
5865 return tny_folder_get_account (TNY_FOLDER (folder_store));
5869 * UI handler for the "Move to" action when invoked from the
5873 modest_ui_actions_on_main_window_move_to (GtkAction *action,
5874 GtkWidget *folder_view,
5875 TnyFolderStore *dst_folder,
5876 ModestMainWindow *win)
5878 ModestHeaderView *header_view = NULL;
5879 TnyFolderStore *src_folder = NULL;
5881 g_return_if_fail (MODEST_IS_MAIN_WINDOW (win));
5883 /* Get the source folder */
5884 src_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
5886 /* Get header view */
5887 header_view = (ModestHeaderView *)
5888 modest_main_window_get_child_widget (win, MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
5890 /* Get folder or messages to transfer */
5891 if (gtk_widget_is_focus (folder_view)) {
5892 gboolean do_xfer = TRUE;
5894 /* Allow only to transfer folders to the local root folder */
5895 if (TNY_IS_ACCOUNT (dst_folder) &&
5896 !MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (dst_folder) &&
5897 !modest_tny_account_is_memory_card_account (TNY_ACCOUNT (dst_folder))) {
5899 } else if (!TNY_IS_FOLDER (src_folder)) {
5900 g_warning ("%s: src_folder is not a TnyFolder.\n", __FUNCTION__);
5905 MoveFolderInfo *info = g_new0 (MoveFolderInfo, 1);
5906 DoubleConnectionInfo *connect_info = g_slice_new (DoubleConnectionInfo);
5908 info->src_folder = g_object_ref (src_folder);
5909 info->dst_folder = g_object_ref (dst_folder);
5910 info->delete_original = TRUE;
5911 info->folder_view = folder_view;
5913 connect_info->callback = on_move_folder_cb;
5914 connect_info->dst_account = get_account_from_folder_store (TNY_FOLDER_STORE (dst_folder));
5915 connect_info->data = info;
5917 modest_platform_double_connect_and_perform(GTK_WINDOW (win), TRUE,
5918 TNY_FOLDER_STORE (src_folder),
5921 } else if (gtk_widget_is_focus (GTK_WIDGET(header_view))) {
5924 headers = modest_header_view_get_selected_headers(header_view);
5926 /* Transfer the messages */
5927 modest_ui_actions_transfer_messages_helper (GTK_WINDOW (win), TNY_FOLDER (src_folder),
5928 headers, TNY_FOLDER (dst_folder));
5930 g_object_unref (headers);
5934 g_object_unref (src_folder);
5937 #ifdef MODEST_TOOLKIT_HILDON2
5939 * UI handler for the "Move to" action when invoked from the
5940 * ModestFolderWindow
5943 modest_ui_actions_on_folder_window_move_to (GtkWidget *folder_view,
5944 TnyFolderStore *dst_folder,
5948 TnyFolderStore *src_folder = NULL;
5949 TnyIterator *iterator;
5951 if (tny_list_get_length (selection) != 1)
5954 iterator = tny_list_create_iterator (selection);
5955 src_folder = TNY_FOLDER_STORE (tny_iterator_get_current (iterator));
5956 g_object_unref (iterator);
5959 gboolean do_xfer = TRUE;
5961 /* Allow only to transfer folders to the local root folder */
5962 if (TNY_IS_ACCOUNT (dst_folder) &&
5963 !MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (dst_folder) &&
5964 !modest_tny_account_is_memory_card_account (TNY_ACCOUNT (dst_folder))) {
5967 modest_platform_run_information_dialog (win,
5968 _("mail_in_ui_folder_move_target_error"),
5970 } else if (!TNY_IS_FOLDER (src_folder)) {
5971 g_warning ("%s: src_folder is not a TnyFolder.\n", __FUNCTION__);
5976 MoveFolderInfo *info = g_new0 (MoveFolderInfo, 1);
5977 DoubleConnectionInfo *connect_info = g_slice_new (DoubleConnectionInfo);
5979 info->src_folder = g_object_ref (src_folder);
5980 info->dst_folder = g_object_ref (dst_folder);
5981 info->delete_original = TRUE;
5982 info->folder_view = folder_view;
5984 connect_info->callback = on_move_folder_cb;
5985 connect_info->dst_account = get_account_from_folder_store (TNY_FOLDER_STORE (dst_folder));
5986 connect_info->data = info;
5988 modest_platform_double_connect_and_perform(GTK_WINDOW (win), TRUE,
5989 TNY_FOLDER_STORE (src_folder),
5994 g_object_unref (src_folder);
6000 modest_ui_actions_transfer_messages_helper (GtkWindow *win,
6001 TnyFolder *src_folder,
6003 TnyFolder *dst_folder)
6005 gboolean need_connection = TRUE;
6006 gboolean do_xfer = TRUE;
6007 XferMsgsHelper *helper;
6009 g_return_if_fail (TNY_IS_FOLDER (src_folder));
6010 g_return_if_fail (TNY_IS_FOLDER (dst_folder));
6011 g_return_if_fail (TNY_IS_LIST (headers));
6013 modest_ui_actions_xfer_messages_check (win, TNY_FOLDER_STORE (src_folder),
6014 headers, TNY_FOLDER (dst_folder),
6015 TRUE, &need_connection,
6018 /* If we don't want to transfer just return */
6022 /* Create the helper */
6023 helper = g_slice_new (XferMsgsHelper);
6024 helper->dst_folder = g_object_ref (dst_folder);
6025 helper->headers = g_object_ref (headers);
6027 if (need_connection) {
6028 DoubleConnectionInfo *connect_info = g_slice_new (DoubleConnectionInfo);
6029 connect_info->callback = xfer_messages_performer;
6030 connect_info->dst_account = tny_folder_get_account (TNY_FOLDER (dst_folder));
6031 connect_info->data = helper;
6033 modest_platform_double_connect_and_perform(GTK_WINDOW (win), TRUE,
6034 TNY_FOLDER_STORE (src_folder),
6037 TnyAccount *src_account = get_account_from_folder_store (TNY_FOLDER_STORE (src_folder));
6038 xfer_messages_performer (FALSE, NULL, GTK_WINDOW (win),
6039 src_account, helper);
6040 g_object_unref (src_account);
6045 * UI handler for the "Move to" action when invoked from the
6046 * ModestMsgViewWindow
6049 modest_ui_actions_on_window_move_to (GtkAction *action,
6051 TnyFolderStore *dst_folder,
6054 TnyFolder *src_folder = NULL;
6056 g_return_if_fail (TNY_IS_FOLDER (dst_folder));
6059 TnyHeader *header = NULL;
6062 iter = tny_list_create_iterator (headers);
6063 header = (TnyHeader *) tny_iterator_get_current (iter);
6064 src_folder = tny_header_get_folder (header);
6066 /* Transfer the messages */
6067 modest_ui_actions_transfer_messages_helper (GTK_WINDOW (win), src_folder,
6069 TNY_FOLDER (dst_folder));
6072 g_object_unref (header);
6073 g_object_unref (iter);
6074 g_object_unref (src_folder);
6079 modest_ui_actions_on_move_to (GtkAction *action,
6082 modest_ui_actions_on_edit_mode_move_to (win);
6086 modest_ui_actions_on_edit_mode_move_to (ModestWindow *win)
6088 GtkWidget *dialog = NULL;
6089 MoveToInfo *helper = NULL;
6090 TnyList *list_to_move;
6092 g_return_val_if_fail (MODEST_IS_WINDOW (win), FALSE);
6094 #ifndef MODEST_TOOLKIT_HILDON2
6095 /* Get the main window if exists */
6096 ModestMainWindow *main_window;
6097 if (MODEST_IS_MAIN_WINDOW (win))
6098 main_window = MODEST_MAIN_WINDOW (win);
6101 MODEST_MAIN_WINDOW (modest_window_mgr_get_main_window (modest_runtime_get_window_mgr (),
6102 FALSE)); /* don't create */
6105 list_to_move = modest_platform_get_list_to_move (MODEST_WINDOW (win));
6110 if (tny_list_get_length (list_to_move) < 1) {
6111 g_object_unref (list_to_move);
6115 /* Create and run the dialog */
6116 dialog = create_move_to_dialog (GTK_WINDOW (win), NULL, list_to_move);
6117 modest_window_mgr_set_modal (modest_runtime_get_window_mgr (),
6118 GTK_WINDOW (dialog),
6122 helper = g_slice_new0 (MoveToInfo);
6123 helper->list = list_to_move;
6126 /* Listen to response signal */
6127 g_signal_connect (dialog, "response", G_CALLBACK (on_move_to_dialog_response), helper);
6129 /* Show the dialog */
6130 gtk_widget_show (dialog);
6136 * Calls #HeadersFunc for each header already selected in the main
6137 * window or the message currently being shown in the msg view window
6140 do_headers_action (ModestWindow *win,
6144 TnyList *headers_list = NULL;
6145 TnyIterator *iter = NULL;
6146 TnyHeader *header = NULL;
6147 TnyFolder *folder = NULL;
6150 headers_list = get_selected_headers (win);
6154 /* Get the folder */
6155 iter = tny_list_create_iterator (headers_list);
6156 header = TNY_HEADER (tny_iterator_get_current (iter));
6158 folder = tny_header_get_folder (header);
6159 g_object_unref (header);
6162 /* Call the function for each header */
6163 while (!tny_iterator_is_done (iter)) {
6164 header = TNY_HEADER (tny_iterator_get_current (iter));
6165 func (header, win, user_data);
6166 g_object_unref (header);
6167 tny_iterator_next (iter);
6170 /* Trick: do a poke status in order to speed up the signaling
6173 tny_folder_poke_status (folder);
6174 g_object_unref (folder);
6178 g_object_unref (iter);
6179 g_object_unref (headers_list);
6183 modest_ui_actions_view_attachment (GtkAction *action,
6184 ModestWindow *window)
6186 if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
6187 modest_msg_view_window_view_attachment (MODEST_MSG_VIEW_WINDOW (window), NULL);
6189 /* not supported window for this action */
6190 g_return_if_reached ();
6195 modest_ui_actions_save_attachments (GtkAction *action,
6196 ModestWindow *window)
6198 if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
6200 if (modest_platform_check_memory_low (MODEST_WINDOW(window), TRUE))
6203 modest_msg_view_window_save_attachments (MODEST_MSG_VIEW_WINDOW (window), NULL);
6205 /* not supported window for this action */
6206 g_return_if_reached ();
6211 modest_ui_actions_remove_attachments (GtkAction *action,
6212 ModestWindow *window)
6214 if (MODEST_IS_MAIN_WINDOW (window)) {
6215 modest_ui_actions_on_main_window_remove_attachments (action, MODEST_MAIN_WINDOW (window));
6216 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
6217 modest_msg_view_window_remove_attachments (MODEST_MSG_VIEW_WINDOW (window), FALSE);
6219 /* not supported window for this action */
6220 g_return_if_reached ();
6225 modest_ui_actions_on_settings (GtkAction *action,
6230 dialog = modest_platform_get_global_settings_dialog ();
6231 gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (win));
6232 gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
6233 gtk_widget_show_all (dialog);
6235 gtk_dialog_run (GTK_DIALOG (dialog));
6237 gtk_widget_destroy (dialog);
6241 modest_ui_actions_on_help (GtkAction *action,
6244 /* Help app is not available at all in fremantle */
6245 #ifndef MODEST_TOOLKIT_HILDON2
6246 const gchar *help_id;
6248 g_return_if_fail (win && GTK_IS_WINDOW(win));
6250 help_id = modest_window_mgr_get_help_id (modest_runtime_get_window_mgr(), win);
6253 modest_platform_show_help (GTK_WINDOW (win), help_id);
6258 modest_ui_actions_on_csm_help (GtkAction *action,
6261 /* Help app is not available at all in fremantle */
6262 #ifndef MODEST_TOOLKIT_HILDON2
6264 const gchar* help_id = NULL;
6265 GtkWidget *folder_view;
6266 TnyFolderStore *folder_store;
6268 g_return_if_fail (win && MODEST_IS_MAIN_WINDOW (win));
6270 /* Get selected folder */
6271 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
6272 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
6273 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
6275 /* Switch help_id */
6276 if (folder_store && TNY_IS_FOLDER (folder_store))
6277 help_id = modest_tny_folder_get_help_id (TNY_FOLDER (folder_store));
6280 g_object_unref (folder_store);
6283 modest_platform_show_help (GTK_WINDOW (win), help_id);
6285 modest_ui_actions_on_help (action, win);
6290 retrieve_contents_cb (ModestMailOperation *mail_op,
6297 /* We only need this callback to show an error in case of
6298 memory low condition */
6299 if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg)) {
6300 g_debug ("%s: message failed to retrieve. Memory low?", __FUNCTION__);
6305 retrieve_msg_contents_performer (gboolean canceled,
6307 GtkWindow *parent_window,
6308 TnyAccount *account,
6311 ModestMailOperation *mail_op;
6312 TnyList *headers = TNY_LIST (user_data);
6314 if (err || canceled) {
6315 check_memory_full_error ((GtkWidget *) parent_window, err, NULL);
6319 /* Create mail operation */
6320 mail_op = modest_mail_operation_new_with_error_handling ((GObject *) parent_window,
6321 modest_ui_actions_disk_operations_error_handler,
6323 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
6324 modest_mail_operation_get_msgs_full (mail_op, headers, retrieve_contents_cb, NULL, NULL);
6327 g_object_unref (mail_op);
6329 g_object_unref (headers);
6330 g_object_unref (account);
6334 modest_ui_actions_on_retrieve_msg_contents (GtkAction *action,
6335 ModestWindow *window)
6337 TnyList *headers = NULL;
6338 TnyAccount *account = NULL;
6339 TnyIterator *iter = NULL;
6340 TnyHeader *header = NULL;
6341 TnyFolder *folder = NULL;
6344 headers = get_selected_headers (window);
6348 /* Pick the account */
6349 iter = tny_list_create_iterator (headers);
6350 header = TNY_HEADER (tny_iterator_get_current (iter));
6351 folder = tny_header_get_folder (header);
6352 account = tny_folder_get_account (folder);
6353 g_object_unref (folder);
6354 g_object_unref (header);
6355 g_object_unref (iter);
6357 /* Connect and perform the message retrieval */
6358 modest_platform_connect_and_perform ((GtkWindow *) window, TRUE,
6359 g_object_ref (account),
6360 retrieve_msg_contents_performer,
6361 g_object_ref (headers));
6364 g_object_unref (account);
6365 g_object_unref (headers);
6369 modest_ui_actions_check_toolbar_dimming_rules (ModestWindow *window)
6371 g_return_if_fail (MODEST_IS_WINDOW (window));
6374 modest_window_check_dimming_rules_group (window, MODEST_DIMMING_RULES_TOOLBAR);
6378 modest_ui_actions_check_menu_dimming_rules (ModestWindow *window)
6380 g_return_if_fail (MODEST_IS_WINDOW (window));
6383 modest_window_check_dimming_rules_group (window, MODEST_DIMMING_RULES_MENU);
6387 modest_ui_actions_on_email_menu_activated (GtkAction *action,
6388 ModestWindow *window)
6390 g_return_if_fail (MODEST_IS_WINDOW (window));
6393 modest_ui_actions_check_menu_dimming_rules (window);
6397 modest_ui_actions_on_edit_menu_activated (GtkAction *action,
6398 ModestWindow *window)
6400 g_return_if_fail (MODEST_IS_WINDOW (window));
6403 modest_ui_actions_check_menu_dimming_rules (window);
6407 modest_ui_actions_on_view_menu_activated (GtkAction *action,
6408 ModestWindow *window)
6410 g_return_if_fail (MODEST_IS_WINDOW (window));
6413 modest_ui_actions_check_menu_dimming_rules (window);
6417 modest_ui_actions_on_format_menu_activated (GtkAction *action,
6418 ModestWindow *window)
6420 g_return_if_fail (MODEST_IS_WINDOW (window));
6423 modest_ui_actions_check_menu_dimming_rules (window);
6427 modest_ui_actions_on_tools_menu_activated (GtkAction *action,
6428 ModestWindow *window)
6430 g_return_if_fail (MODEST_IS_WINDOW (window));
6433 modest_ui_actions_check_menu_dimming_rules (window);
6437 modest_ui_actions_on_attachment_menu_activated (GtkAction *action,
6438 ModestWindow *window)
6440 g_return_if_fail (MODEST_IS_WINDOW (window));
6443 modest_ui_actions_check_menu_dimming_rules (window);
6447 modest_ui_actions_on_toolbar_csm_menu_activated (GtkAction *action,
6448 ModestWindow *window)
6450 g_return_if_fail (MODEST_IS_WINDOW (window));
6453 modest_ui_actions_check_menu_dimming_rules (window);
6457 modest_ui_actions_on_folder_view_csm_menu_activated (GtkAction *action,
6458 ModestWindow *window)
6460 g_return_if_fail (MODEST_IS_WINDOW (window));
6463 modest_ui_actions_check_menu_dimming_rules (window);
6467 modest_ui_actions_on_header_view_csm_menu_activated (GtkAction *action,
6468 ModestWindow *window)
6470 g_return_if_fail (MODEST_IS_WINDOW (window));
6473 modest_ui_actions_check_menu_dimming_rules (window);
6477 modest_ui_actions_on_search_messages (GtkAction *action, ModestWindow *window)
6479 g_return_if_fail (MODEST_IS_WINDOW (window));
6481 /* we check for low-mem; in that case, show a warning, and don't allow
6484 if (modest_platform_check_memory_low (window, TRUE))
6487 modest_platform_show_search_messages (GTK_WINDOW (window));
6491 modest_ui_actions_on_open_addressbook (GtkAction *action, ModestWindow *win)
6493 g_return_if_fail (MODEST_IS_WINDOW (win));
6496 /* we check for low-mem; in that case, show a warning, and don't allow
6497 * for the addressbook
6499 if (modest_platform_check_memory_low (win, TRUE))
6503 modest_platform_show_addressbook (GTK_WINDOW (win));
6508 modest_ui_actions_on_toggle_find_in_page (GtkAction *action,
6509 ModestWindow *window)
6512 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
6514 if (GTK_IS_TOGGLE_ACTION (action))
6515 active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
6519 modest_msg_edit_window_toggle_find_toolbar (MODEST_MSG_EDIT_WINDOW (window),
6524 on_send_receive_finished (ModestMailOperation *mail_op,
6527 GtkWidget *header_view, *folder_view;
6528 TnyFolderStore *folder_store;
6529 ModestMainWindow *main_win = MODEST_MAIN_WINDOW (user_data);
6531 /* Set send/receive operation finished */
6532 modest_main_window_notify_send_receive_completed (main_win);
6534 /* Don't refresh the current folder if there were any errors */
6535 if (modest_mail_operation_get_status (mail_op) !=
6536 MODEST_MAIL_OPERATION_STATUS_SUCCESS)
6539 /* Refresh the current folder if we're viewing a window. We do
6540 this because the user won't be able to see the new mails in
6541 the selected folder after a Send&Receive because it only
6542 performs a poke_status, i.e, only the number of read/unread
6543 messages is updated, but the new headers are not
6545 folder_view = modest_main_window_get_child_widget (main_win,
6546 MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
6550 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
6552 /* Do not need to refresh INBOX again because the
6553 update_account does it always automatically */
6554 if (folder_store && TNY_IS_FOLDER (folder_store) &&
6555 tny_folder_get_folder_type (TNY_FOLDER (folder_store)) != TNY_FOLDER_TYPE_INBOX) {
6556 ModestMailOperation *refresh_op;
6558 header_view = modest_main_window_get_child_widget (main_win,
6559 MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
6561 /* We do not need to set the contents style
6562 because it hasn't changed. We also do not
6563 need to save the widget status. Just force
6565 refresh_op = modest_mail_operation_new (G_OBJECT (main_win));
6566 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), refresh_op);
6567 modest_mail_operation_refresh_folder (refresh_op, TNY_FOLDER (folder_store),
6568 folder_refreshed_cb, main_win);
6569 g_object_unref (refresh_op);
6573 g_object_unref (folder_store);
6578 modest_ui_actions_on_send_queue_error_happened (TnySendQueue *self,
6584 const gchar* server_name = NULL;
6585 TnyTransportAccount *transport;
6586 gchar *message = NULL;
6587 ModestProtocol *protocol;
6589 /* Don't show anything if the user cancelled something or the
6590 * send receive request is not interactive. Authentication
6591 * errors are managed by the account store so no need to show
6592 * a dialog here again */
6593 if (err->code == TNY_SYSTEM_ERROR_CANCEL ||
6594 err->code == TNY_SERVICE_ERROR_AUTHENTICATE ||
6595 !modest_tny_send_queue_get_requested_send_receive (MODEST_TNY_SEND_QUEUE (self)))
6599 /* Get the server name. Note that we could be using a
6600 connection specific transport account */
6601 transport = (TnyTransportAccount *)
6602 tny_camel_send_queue_get_transport_account (TNY_CAMEL_SEND_QUEUE (self));
6604 ModestTnyAccountStore *acc_store;
6605 const gchar *acc_name;
6606 TnyTransportAccount *conn_specific;
6608 acc_store = modest_runtime_get_account_store();
6609 acc_name = modest_tny_account_get_parent_modest_account_name_for_server_account (TNY_ACCOUNT (transport));
6610 conn_specific = (TnyTransportAccount *)
6611 modest_tny_account_store_get_transport_account_for_open_connection (acc_store, acc_name);
6612 if (conn_specific) {
6613 server_name = tny_account_get_hostname (TNY_ACCOUNT (conn_specific));
6614 g_object_unref (conn_specific);
6616 server_name = tny_account_get_hostname (TNY_ACCOUNT (transport));
6618 g_object_unref (transport);
6622 protocol = modest_protocol_registry_get_protocol_by_name (modest_runtime_get_protocol_registry (),
6623 MODEST_PROTOCOL_REGISTRY_TRANSPORT_STORE_PROTOCOLS,
6624 tny_account_get_proto (TNY_ACCOUNT (transport)));
6626 g_warning ("%s: Account with no proto", __FUNCTION__);
6630 /* Show the appropriate message text for the GError: */
6631 switch (err->code) {
6632 case TNY_SERVICE_ERROR_CONNECT:
6633 message = modest_protocol_get_translation (protocol,
6634 MODEST_PROTOCOL_TRANSLATION_ACCOUNT_CONNECTION_ERROR,
6637 case TNY_SERVICE_ERROR_SEND:
6638 message = g_strdup (_CS("sfil_ib_unable_to_send"));
6640 case TNY_SERVICE_ERROR_UNAVAILABLE:
6641 message = modest_protocol_get_translation (protocol,
6642 MODEST_PROTOCOL_TRANSLATION_CONNECT_ERROR,
6646 g_warning ("%s: unexpected ERROR %d",
6647 __FUNCTION__, err->code);
6648 message = g_strdup (_CS("sfil_ib_unable_to_send"));
6652 modest_platform_run_information_dialog (NULL, message, FALSE);
6657 modest_ui_actions_on_send_queue_status_changed (ModestTnySendQueue *send_queue,
6662 ModestWindow *top_window = NULL;
6663 ModestWindowMgr *mgr = NULL;
6664 GtkWidget *header_view = NULL;
6665 TnyFolder *selected_folder = NULL;
6666 TnyFolderType folder_type;
6668 mgr = modest_runtime_get_window_mgr ();
6669 top_window = modest_window_mgr_get_current_top (mgr);
6674 #ifndef MODEST_TOOLKIT_HILDON2
6675 if (MODEST_IS_MAIN_WINDOW (top_window)) {
6676 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (top_window),
6677 MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
6680 if (MODEST_IS_HEADER_WINDOW (top_window)) {
6681 header_view = (GtkWidget *)
6682 modest_header_window_get_header_view (MODEST_HEADER_WINDOW (top_window));
6686 /* Get selected folder */
6688 selected_folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
6689 if (!selected_folder)
6692 /* gtk_tree_view_column_queue_resize is only available in GTK+ 2.8 */
6693 #if GTK_CHECK_VERSION(2, 8, 0)
6694 folder_type = modest_tny_folder_guess_folder_type (selected_folder);
6695 if (folder_type == TNY_FOLDER_TYPE_OUTBOX) {
6696 GtkTreeViewColumn *tree_column;
6698 tree_column = gtk_tree_view_get_column (GTK_TREE_VIEW (header_view),
6699 TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN);
6701 gtk_tree_view_column_queue_resize (tree_column);
6703 #else /* #if GTK_CHECK_VERSION(2, 8, 0) */
6704 gtk_widget_queue_draw (header_view);
6707 #ifndef MODEST_TOOLKIT_HILDON2
6708 /* Rerun dimming rules, because the message could become deletable for example */
6709 modest_window_check_dimming_rules_group (MODEST_WINDOW (top_window),
6710 MODEST_DIMMING_RULES_TOOLBAR);
6711 modest_window_check_dimming_rules_group (MODEST_WINDOW (top_window),
6712 MODEST_DIMMING_RULES_MENU);
6716 g_object_unref (selected_folder);
6720 modest_ui_actions_on_account_connection_error (GtkWindow *parent_window,
6721 TnyAccount *account)
6723 ModestProtocolType protocol_type;
6724 ModestProtocol *protocol;
6725 gchar *error_note = NULL;
6727 protocol_type = modest_tny_account_get_protocol_type (account);
6728 protocol = modest_protocol_registry_get_protocol_by_type (modest_runtime_get_protocol_registry (),
6731 error_note = modest_protocol_get_translation (protocol, MODEST_PROTOCOL_TRANSLATION_ACCOUNT_CONNECTION_ERROR, tny_account_get_hostname (account));
6732 if (error_note == NULL) {
6733 g_warning ("%s: This should not be reached", __FUNCTION__);
6735 modest_platform_run_information_dialog (parent_window, error_note, FALSE);
6736 g_free (error_note);
6741 modest_ui_actions_get_msg_already_deleted_error_msg (ModestWindow *win)
6745 TnyFolderStore *folder = NULL;
6746 TnyAccount *account = NULL;
6747 ModestProtocolType proto;
6748 ModestProtocol *protocol;
6749 TnyHeader *header = NULL;
6751 if (MODEST_IS_MAIN_WINDOW (win)) {
6752 GtkWidget *header_view;
6753 TnyList* headers = NULL;
6755 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
6756 MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
6757 headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (header_view));
6758 if (!headers || tny_list_get_length (headers) == 0) {
6760 g_object_unref (headers);
6763 iter = tny_list_create_iterator (headers);
6764 header = TNY_HEADER (tny_iterator_get_current (iter));
6765 folder = TNY_FOLDER_STORE (tny_header_get_folder (header));
6766 g_object_unref (iter);
6767 g_object_unref (headers);
6768 #ifdef MODEST_TOOLKIT_HILDON2
6769 } else if (MODEST_IS_HEADER_WINDOW (win)) {
6770 GtkWidget *header_view;
6771 TnyList* headers = NULL;
6773 header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (win)));
6774 headers = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (header_view));
6775 if (!headers || tny_list_get_length (headers) == 0) {
6777 g_object_unref (headers);
6780 iter = tny_list_create_iterator (headers);
6781 header = TNY_HEADER (tny_iterator_get_current (iter));
6783 folder = TNY_FOLDER_STORE (tny_header_get_folder (header));
6785 g_warning ("List should contain headers");
6787 g_object_unref (iter);
6788 g_object_unref (headers);
6790 } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
6791 header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
6793 folder = TNY_FOLDER_STORE (tny_header_get_folder (header));
6796 if (!header || !folder)
6799 /* Get the account type */
6800 account = tny_folder_get_account (TNY_FOLDER (folder));
6801 proto = modest_tny_account_get_protocol_type (account);
6802 protocol = modest_protocol_registry_get_protocol_by_type (modest_runtime_get_protocol_registry (),
6805 subject = tny_header_dup_subject (header);
6806 msg = modest_protocol_get_translation (protocol, MODEST_PROTOCOL_TRANSLATION_MSG_NOT_AVAILABLE, subject);
6810 msg = g_strdup_printf (_("mail_ni_ui_folder_get_msg_folder_error"));
6816 g_object_unref (account);
6818 g_object_unref (folder);
6820 g_object_unref (header);
6826 modest_ui_actions_on_delete_account (GtkWindow *parent_window,
6827 const gchar *account_name,
6828 const gchar *account_title)
6830 ModestAccountMgr *account_mgr;
6833 ModestProtocol *protocol;
6834 gboolean removed = FALSE;
6836 g_return_val_if_fail (account_name, FALSE);
6837 g_return_val_if_fail (account_title, FALSE);
6839 account_mgr = modest_runtime_get_account_mgr();
6841 /* The warning text depends on the account type: */
6842 protocol = modest_protocol_registry_get_protocol_by_type (modest_runtime_get_protocol_registry (),
6843 modest_account_mgr_get_store_protocol (account_mgr,
6845 txt = modest_protocol_get_translation (protocol,
6846 MODEST_PROTOCOL_TRANSLATION_DELETE_MAILBOX,
6849 txt = g_strdup_printf (_("emev_nc_delete_mailbox"), account_title);
6851 response = modest_platform_run_confirmation_dialog (parent_window, txt);
6855 if (response == GTK_RESPONSE_OK) {
6856 /* Remove account. If it succeeds then it also removes
6857 the account from the ModestAccountView: */
6858 gboolean is_default = FALSE;
6859 gchar *default_account_name = modest_account_mgr_get_default_account (account_mgr);
6860 if (default_account_name && (strcmp (default_account_name, account_name) == 0))
6862 g_free (default_account_name);
6864 removed = modest_account_mgr_remove_account (account_mgr, account_name);
6866 g_warning ("%s: modest_account_mgr_remove_account() failed.\n", __FUNCTION__);
6872 on_fetch_images_performer (gboolean canceled,
6874 GtkWindow *parent_window,
6875 TnyAccount *account,
6878 if (err || canceled) {
6879 /* Show an unable to retrieve images ??? */
6883 /* Note that the user could have closed the window while connecting */
6884 if (GTK_WIDGET_VISIBLE (parent_window))
6885 modest_msg_view_window_fetch_images ((ModestMsgViewWindow *) parent_window);
6886 g_object_unref ((GObject *) user_data);
6890 modest_ui_actions_on_fetch_images (GtkAction *action,
6891 ModestWindow *window)
6893 g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window));
6895 modest_platform_connect_and_perform ((GtkWindow *) window, TRUE,
6897 on_fetch_images_performer,
6898 g_object_ref (window));
6902 modest_ui_actions_on_reload_message (const gchar *msg_id)
6904 ModestWindow *window = NULL;
6906 g_return_if_fail (msg_id && msg_id[0] != '\0');
6907 if (!modest_window_mgr_find_registered_message_uid (modest_runtime_get_window_mgr (),
6913 if (window == NULL || !MODEST_IS_MSG_VIEW_WINDOW (window))
6916 modest_msg_view_window_reload (MODEST_MSG_VIEW_WINDOW (window));