Don't wait till the message is completely saved to show the 'Saved to drafts' banner
[modest] / src / modest-ui-actions.c
index a3f9522..9708e5c 100644 (file)
@@ -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);
 }
@@ -2191,7 +2197,18 @@ on_save_to_drafts_cb (ModestMailOperation *mail_op,
                      gpointer user_data)
 {
        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);
 
@@ -2200,9 +2217,6 @@ on_save_to_drafts_cb (ModestMailOperation *mail_op,
                return;
 
        modest_msg_edit_window_set_draft (edit_window, saved_draft);
-       info_text = g_strdup_printf (_("mail_va_saved_to_drafts"), _("mcen_me_folder_drafts"));
-       modest_platform_information_banner (NULL, NULL, info_text);
-       g_free (info_text);
 }
 
 void
@@ -2213,6 +2227,7 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
        MsgData *data;
        gchar *account_name, *from;
        ModestAccountMgr *account_mgr;
+       char *info_text;
 
        g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
        
@@ -2266,7 +2281,11 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
                                              data->priority_flags,
                                              on_save_to_drafts_cb,
                                              edit_window);
+       info_text = g_strdup_printf (_("mail_va_saved_to_drafts"), _("mcen_me_folder_drafts"));
+       modest_platform_information_banner (NULL, NULL, info_text);
+
        /* Frees */
+       g_free (info_text);
        g_free (from);
        g_free (account_name);
        g_object_unref (G_OBJECT (transport_account));
@@ -2274,6 +2293,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: */