X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-ui-actions.c;h=8ba9fe95f7ff2cc1def4c7da55cd94d4c7506a54;hp=9ebd9c6da35d54adce60208a4b5e8ce3dc90a3cd;hb=c4adce3e18a59f68e79bd970b79a64b2069de574;hpb=a8bb6c4cbb9237511e6c313a8c627e5d3fa08650 diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index 9ebd9c6..8ba9fe9 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -1018,37 +1018,25 @@ cleanup: g_object_unref (folder); } - -static void -open_msg_error_handler (ModestMailOperation *mail_op, - gpointer user_data) -{ - /* Show the message error */ - GObject *win = modest_mail_operation_get_source (mail_op); - - modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL, - (gchar *) user_data); - if (win) - g_object_unref (win); -} - void modest_ui_actions_get_msgs_full_error_handler (ModestMailOperation *mail_op, gpointer user_data) { const GError *error; - GObject *win = modest_mail_operation_get_source (mail_op); + GObject *win = NULL; + const gchar *err_msg; + win = modest_mail_operation_get_source (mail_op); error = modest_mail_operation_get_error (mail_op); - if (error->code == MODEST_MAIL_OPERATION_ERROR_MESSAGE_SIZE_LIMIT) { + /* Select error message */ + if (error->code == MODEST_MAIL_OPERATION_ERROR_MESSAGE_SIZE_LIMIT) + err_msg = _("emev_ni_ui_imap_msg_size_exceed_error"); + else + err_msg = (const gchar *) user_data; - modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL, - error->message); - } else { - modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL, - _("mail_ni_ui_folder_get_msg_folder_error")); - } + /* Show error */ + modest_platform_run_information_dialog ((GtkWindow *) win, err_msg); if (win) g_object_unref (win); @@ -1075,20 +1063,81 @@ get_account_from_header_list (TnyList *headers) return account; } +static void +open_msgs_performer(gboolean canceled, + GError *err, + GtkWindow *parent_window, + TnyAccount *account, + gpointer user_data) +{ + ModestMailOperation *mail_op; + const gchar *proto_name; + gchar *error_msg; + ModestTransportStoreProtocol proto; + TnyList *not_opened_headers; + + not_opened_headers = TNY_LIST (user_data); + + /* Get the error message depending on the protocol */ + proto_name = tny_account_get_proto (account); + if (proto_name != NULL) { + proto = modest_protocol_info_get_transport_store_protocol (proto_name); + } else { + proto = MODEST_PROTOCOL_STORE_MAILDIR; + } + + /* Create the error messages */ + if (tny_list_get_length (not_opened_headers) == 1) { + if (proto == MODEST_PROTOCOL_STORE_POP) { + error_msg = g_strdup (_("emev_ni_ui_pop3_msg_recv_error")); + } else if (proto == MODEST_PROTOCOL_STORE_IMAP) { + TnyIterator *iter = tny_list_create_iterator (not_opened_headers); + TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter)); + error_msg = g_strdup_printf (_("emev_ni_ui_imap_message_not_available_in_server"), + tny_header_get_subject (header)); + g_object_unref (header); + g_object_unref (iter); + } else { + error_msg = g_strdup (_("mail_ni_ui_folder_get_msg_folder_error")); + } + } else { + error_msg = g_strdup (_("mail_ni_ui_folder_get_msg_folder_error")); + } + + /* Create the mail operation */ + mail_op = + modest_mail_operation_new_with_error_handling ((GObject *) parent_window, + modest_ui_actions_get_msgs_full_error_handler, + error_msg, g_free); + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), + mail_op); + + modest_mail_operation_get_msgs_full (mail_op, + not_opened_headers, + open_msg_cb, + NULL, + NULL); + + /* Frees */ + g_object_unref (mail_op); + g_object_unref (not_opened_headers); + g_object_unref (account); +} + /* * This function is used by both modest_ui_actions_on_open and * modest_ui_actions_on_header_activated. This way we always do the * same when trying to open messages. */ static void -_modest_ui_actions_open (TnyList *headers, ModestWindow *win) +open_msgs_from_headers (TnyList *headers, ModestWindow *win) { ModestWindowMgr *mgr = NULL; TnyIterator *iter = NULL, *iter_not_opened = NULL; - ModestMailOperation *mail_op = NULL; TnyList *not_opened_headers = NULL; TnyHeaderFlags flags = 0; TnyAccount *account; + gint uncached_msgs = 0; g_return_if_fail (headers != NULL); @@ -1152,26 +1201,24 @@ _modest_ui_actions_open (TnyList *headers, ModestWindow *win) * than later in a thread: */ if (tny_list_get_length (not_opened_headers) > 0) { - TnyIterator *iter; - gboolean found = FALSE; - - iter = tny_list_create_iterator (not_opened_headers); - while (!tny_iterator_is_done (iter) && !found) { - TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter)); - if (!(tny_header_get_flags (header) & TNY_HEADER_FLAG_CACHED)) - found = TRUE; - else - tny_iterator_next (iter); - - g_object_unref (header); + uncached_msgs = header_list_count_uncached_msgs (not_opened_headers); + + if (uncached_msgs > 0) { + /* Allways download if we are online. */ + if (!tny_device_is_online (modest_runtime_get_device ())) { + gint response; + + /* If ask for user permission to download the messages */ + response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win), + ngettext("mcen_nc_get_msg", + "mcen_nc_get_msgs", + uncached_msgs)); + + /* End if the user does not want to continue */ + if (response == GTK_RESPONSE_CANCEL) + goto cleanup; + } } - g_object_unref (iter); - - /* Ask the user if there are any uncached messages */ - if (found && !connect_to_get_msg (win, - header_list_count_uncached_msgs (not_opened_headers), - account)) - goto cleanup; } /* Register the headers before actually creating the windows: */ @@ -1181,62 +1228,21 @@ _modest_ui_actions_open (TnyList *headers, ModestWindow *win) if (header) { modest_window_mgr_register_header (mgr, header, NULL); g_object_unref (header); - } + } tny_iterator_next (iter_not_opened); } g_object_unref (iter_not_opened); iter_not_opened = NULL; - /* Create the mail operation */ - if (tny_list_get_length (not_opened_headers) > 1) { - mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT (win), - modest_ui_actions_get_msgs_full_error_handler, - NULL, NULL); - modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); - - modest_mail_operation_get_msgs_full (mail_op, - not_opened_headers, - open_msg_cb, - NULL, - NULL); + /* Connect to the account and perform */ + if (uncached_msgs > 0) { + modest_platform_connect_and_perform ((GtkWindow *) win, g_object_ref (account), + open_msgs_performer, g_object_ref (not_opened_headers)); } else { - TnyIterator *iter = tny_list_create_iterator (not_opened_headers); - TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter)); - const gchar *proto_name; - gchar *error_msg; - ModestTransportStoreProtocol proto; - - /* Get the error message depending on the protocol */ - proto_name = tny_account_get_proto (account); - if (proto_name != NULL) { - proto = modest_protocol_info_get_transport_store_protocol (proto_name); - } else { - proto = MODEST_PROTOCOL_STORE_MAILDIR; - } - - if (proto == MODEST_PROTOCOL_STORE_POP) { - error_msg = g_strdup (_("emev_ni_ui_pop3_msg_recv_error")); - } else if (proto == MODEST_PROTOCOL_STORE_IMAP) { - error_msg = g_strdup_printf (_("emev_ni_ui_imap_message_not_available_in_server"), - tny_header_get_subject (header)); - } else { - error_msg = g_strdup (_("mail_ni_ui_folder_get_msg_folder_error")); - } - - /* Create and call the mail operation */ - mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT (win), - open_msg_error_handler, - error_msg, - g_free); - modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); - - modest_mail_operation_get_msg (mail_op, header, open_msg_cb, NULL); - - g_object_unref (header); - g_object_unref (iter); + /* Call directly the performer, do not need to connect */ + open_msgs_performer (FALSE, NULL, (GtkWindow *) win, g_object_ref (account), + g_object_ref (not_opened_headers)); } - g_object_unref (mail_op); - cleanup: /* Clean */ if (account) @@ -1256,7 +1262,7 @@ modest_ui_actions_on_open (GtkAction *action, ModestWindow *win) return; /* Open them */ - _modest_ui_actions_open (headers, win); + open_msgs_from_headers (headers, win); g_object_unref(headers); } @@ -1955,7 +1961,7 @@ modest_ui_actions_on_header_activated (ModestHeaderView *header_view, /* tny_list_prepend (headers, G_OBJECT (header)); */ headers = modest_header_view_get_selected_headers (header_view); - _modest_ui_actions_open (headers, MODEST_WINDOW (main_window)); + open_msgs_from_headers (headers, MODEST_WINDOW (main_window)); g_object_unref (headers); } @@ -2192,6 +2198,18 @@ on_save_to_drafts_cb (ModestMailOperation *mail_op, { ModestMsgEditWindow *edit_window; char *info_text; + ModestMainWindow *win; + + /* FIXME. Make the header view sensitive again. This is a + * temporary hack. See modest_ui_actions_on_save_to_drafts() + * for details */ + win = MODEST_MAIN_WINDOW(modest_window_mgr_get_main_window( + modest_runtime_get_window_mgr(), FALSE)); + if (win != NULL) { + GtkWidget *hdrview = modest_main_window_get_child_widget( + win, MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW); + if (hdrview) gtk_widget_set_sensitive(hdrview, TRUE); + } edit_window = MODEST_MSG_EDIT_WINDOW (user_data); @@ -2274,6 +2292,43 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi modest_msg_edit_window_free_msg_data (edit_window, data); modest_msg_edit_window_reset_modified (edit_window); + + /* ** FIXME ** + * If the drafts folder is selected then make the header view + * insensitive while the message is being saved to drafts + * (it'll be sensitive again in on_save_to_drafts_cb()). This + * is not very clean but it avoids letting the drafts folder + * in an inconsistent state: the user could edit the message + * being saved and undesirable things would happen. + * In the average case the user won't notice anything at + * all. In the worst case (the user is editing a really big + * file from Drafts) the header view will be insensitive + * during the saving process (10 or 20 seconds, depending on + * the message). Anyway this is just a quick workaround: once + * we find a better solution it should be removed + * See NB#65125 (commend #18) for details. + */ + ModestMainWindow *win = MODEST_MAIN_WINDOW(modest_window_mgr_get_main_window( + modest_runtime_get_window_mgr(), FALSE)); + if (win != NULL) { + ModestFolderView *view = MODEST_FOLDER_VIEW(modest_main_window_get_child_widget( + win, MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW)); + if (view != NULL) { + TnyFolder *folder = TNY_FOLDER(modest_folder_view_get_selected(view)); + if (folder) { + if (modest_tny_folder_is_local_folder(folder)) { + TnyFolderType folder_type; + folder_type = modest_tny_folder_get_local_or_mmc_folder_type(folder); + if (folder_type == TNY_FOLDER_TYPE_DRAFTS) { + GtkWidget *hdrview = modest_main_window_get_child_widget( + win, MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW); + if (hdrview) gtk_widget_set_sensitive(hdrview, FALSE); + } + } + } + if (folder != NULL) g_object_unref(folder); + } + } } /* For instance, when clicking the Send toolbar button when editing a message: */ @@ -3648,16 +3703,13 @@ modest_ui_actions_on_folder_display_name_changed (ModestFolderView *folder_view, const gchar *display_name, GtkWindow *window) { - /* Do not change the application name if the widget has not - the focus. This callback could be called even if the folder - view has not the focus, because the handled signal could be - emitted when the folder view is redrawn */ - if (gtk_widget_is_focus (GTK_WIDGET (folder_view))) { - if (display_name) - gtk_window_set_title (window, display_name); - else - gtk_window_set_title (window, " "); - } + /* This is usually used to change the title of the main window, which + * is the one that holds the folder view. Note that this change can + * happen even when the widget doesn't have the focus. */ + if (display_name) + gtk_window_set_title (window, display_name); + else + gtk_window_set_title (window, " "); } void @@ -4179,8 +4231,9 @@ open_msg_for_purge_cb (ModestMailOperation *mail_op, tny_msg_rewrite_cache (msg); } - } else { - modest_platform_information_banner (NULL, NULL, _("mail_ib_attachment_already_purged")); + /* } else { */ + /* This string no longer exists, refer to NB#75415 for more info */ + /* modest_platform_information_banner (NULL, NULL, _("mail_ib_attachment_already_purged")); */ } g_object_unref (iter);