* Fixes NB#78843, menus and CSM are working again after opening an editor window
[modest] / src / modest-ui-actions.c
index 34a0d7b..83cd10a 100644 (file)
@@ -159,6 +159,12 @@ static gboolean remote_folder_is_pop (const TnyFolderStore *folder);
 static gboolean msgs_already_deleted_from_server ( TnyList *headers,
                                                    const TnyFolderStore *src_folder);
 
+static void     do_create_folder (GtkWindow *window, 
+                                 TnyFolderStore *parent_folder, 
+                                 const gchar *suggested_name);
+
+static GtkWidget* get_folder_view_from_move_to_dialog (GtkWidget *move_to_dialog);
+
 
 /*
  * This function checks whether a TnyFolderStore is a pop account
@@ -740,8 +746,7 @@ modest_ui_actions_compose_msg(ModestWindow *win,
        ModestAccountMgr *mgr = modest_runtime_get_account_mgr();
        ModestTnyAccountStore *store = modest_runtime_get_account_store();
 
-       if (win) account_name = g_strdup (modest_window_get_active_account (win));
-       if (!account_name) account_name = modest_account_mgr_get_default_account(mgr);
+       account_name = modest_account_mgr_get_default_account(mgr);
        if (!account_name) {
                g_printerr ("modest: no account found\n");
                goto cleanup;
@@ -784,11 +789,6 @@ modest_ui_actions_compose_msg(ModestWindow *win,
                attachments = g_slist_next(attachments);
        }
        modest_window_mgr_register_window (modest_runtime_get_window_mgr(), msg_win);
-
-       if (win) {
-               gtk_window_set_transient_for (GTK_WINDOW (msg_win),
-                                             GTK_WINDOW (win));
-       }
        gtk_widget_show_all (GTK_WIDGET (msg_win));
 
 cleanup:
@@ -936,7 +936,8 @@ open_msg_cb (ModestMailOperation *mail_op,
 
 
                /* Show banner */
-               modest_platform_information_banner (NULL, NULL, _("mail_ib_opening_draft_message"));
+               modest_platform_information_banner_with_timeout
+                       (NULL, NULL, _("mail_ib_opening_draft_message"), 1200);
 
        } else {
                gchar *uid = modest_tny_folder_get_header_unique_id (header);
@@ -1055,10 +1056,7 @@ open_msgs_performer(gboolean canceled,
        not_opened_headers = TNY_LIST (user_data);
 
        status = tny_account_get_connection_status (account);
-       if (err || canceled || 
-           (modest_tny_folder_store_is_remote (TNY_FOLDER_STORE (account)) &&
-                                               status != TNY_CONNECTION_STATUS_CONNECTED)) {
-               /* TODO: Show an error ? */
+       if (err || canceled) {
                goto clean;
        }
 
@@ -1638,17 +1636,44 @@ new_messages_arrived (ModestMailOperation *self,
                      gpointer user_data)
 {
        GObject *source;
+       gboolean show_visual_notifications;
 
        source = modest_mail_operation_get_source (self);
-
-       /* Notify new messages have been downloaded. Do not notify if
-          the send&receive was invoked by the user, i.e, if the mail
-          operation has a source (the main window) */
-       if ((new_headers != NULL) && (tny_list_get_length (new_headers) > 0) && !source)
-               modest_platform_on_new_headers_received (new_headers);
-
+       show_visual_notifications = (source) ? FALSE : TRUE;
        if (source)
                g_object_unref (source);
+
+       /* Notify new messages have been downloaded. If the
+          send&receive was invoked by the user then do not show any
+          visual notification, only play a sound and activate the LED
+          (for the Maemo version) */
+       if ((new_headers != NULL) && (tny_list_get_length (new_headers) > 0))
+               modest_platform_on_new_headers_received (new_headers, 
+                                                        show_visual_notifications);
+
+}
+
+gboolean
+retrieve_all_messages_cb (GObject *source,
+                         guint num_msgs,
+                         guint retrieve_limit)
+{
+       GtkWindow *window;
+       gchar *msg;
+       gint response;
+
+       window = GTK_WINDOW (source);
+       msg = g_strdup_printf (_("mail_nc_msg_count_limit_exceeded"), 
+                              num_msgs, retrieve_limit);
+
+       /* Ask the user if they want to retrieve all the messages */
+       response = 
+               modest_platform_run_confirmation_dialog_with_buttons (window, msg,
+                                                                     _("mcen_bd_get_all"),
+                                                                     _("mcen_bd_newest_only"));
+       /* Free and return */
+       g_free (msg);
+       return (response == GTK_RESPONSE_ACCEPT) ? TRUE : FALSE;
 }
 
 typedef struct {
@@ -1670,7 +1695,6 @@ do_send_receive_performer (gboolean canceled,
        info = (SendReceiveInfo *) user_data;
 
        if (err || canceled) {
-
                goto clean;
        }
 
@@ -1679,7 +1703,7 @@ do_send_receive_performer (gboolean canceled,
                modest_main_window_notify_send_receive_initied (MODEST_MAIN_WINDOW (info->win));
        }
        
-       mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT (info->win),
+       mail_op = modest_mail_operation_new_with_error_handling ((info->win) ? G_OBJECT (info->win) : NULL,
                                                                 modest_ui_actions_send_receive_error_handler,
                                                                 NULL, NULL);
 
@@ -1691,6 +1715,7 @@ do_send_receive_performer (gboolean canceled,
        /* Send & receive. */
        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
        modest_mail_operation_update_account (mail_op, info->account_name, (info->win) ? FALSE : TRUE,
+                                             (info->win) ? retrieve_all_messages_cb : NULL, 
                                              new_messages_arrived, info->win);
        g_object_unref (G_OBJECT (mail_op));
        
@@ -1858,7 +1883,7 @@ modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win)
        
        /* Refresh the current folder. The if is always TRUE it's just an extra check */
        if (MODEST_IS_MAIN_WINDOW (win)) {
-               GtkWidget *header_view, *folder_view;
+               GtkWidget *folder_view;
                TnyFolderStore *folder_store;
 
                folder_view = 
@@ -1869,23 +1894,6 @@ modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win)
                
                folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
        
-               /* No need to refresh the INBOX the send_receive will do it for us */
-               if (folder_store && TNY_IS_FOLDER (folder_store) && 
-                   tny_folder_get_folder_type (TNY_FOLDER (folder_store)) != TNY_FOLDER_TYPE_INBOX) {
-                       header_view = 
-                               modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
-                                                                    MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
-                
-                       /* We do not need to set the contents style
-                          because it hasn't changed. We also do not
-                          need to save the widget status. Just force
-                           a refresh */
-                       modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view),
-                                                      TNY_FOLDER (folder_store),
-                                                      folder_refreshed_cb,
-                                                      MODEST_MAIN_WINDOW (win));
-               }
-       
                if (folder_store)
                        g_object_unref (folder_store);
        }       
@@ -1970,7 +1978,7 @@ modest_ui_actions_on_header_activated (ModestHeaderView *header_view,
        TnyList *headers;
 
        g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
-       
+
        if (!header)
                return;
 
@@ -2235,9 +2243,14 @@ on_save_to_drafts_cb (ModestMailOperation *mail_op,
 
        edit_window = MODEST_MSG_EDIT_WINDOW (user_data);
 
-       /* If there was any error do nothing */
-       if (modest_mail_operation_get_error (mail_op) != NULL)
+       /* It might not be a good idea to do nothing if there was an error,
+        * so let's at least show a generic error banner. */
+       /* TODO error while saving attachment, show "Saving draft failed" banner */
+       if (modest_mail_operation_get_error (mail_op) != NULL) {
+               g_warning ("%s failed: %s\n", __FUNCTION__, (modest_mail_operation_get_error (mail_op))->message);
+               modest_platform_information_banner (NULL, NULL, _("mail_ib_file_operation_failed"));
                return;
+       }
 
        modest_msg_edit_window_set_draft (edit_window, saved_draft);
 }
@@ -2582,16 +2595,91 @@ modest_ui_actions_on_remove_attachments (GtkAction *action,
 }
 
 static void
-modest_ui_actions_new_folder_error_handler (ModestMailOperation *mail_op,
-                                            gpointer user_data)
+do_create_folder_cb (ModestMailOperation *mail_op,
+                    TnyFolderStore *parent_folder, 
+                    TnyFolder *new_folder,
+                    gpointer user_data)
 {
-       ModestMainWindow *window = MODEST_MAIN_WINDOW (user_data);
-       const GError *error = modest_mail_operation_get_error (mail_op);
-
-       if(error) {
-               modest_platform_information_banner (GTK_WIDGET (window), NULL,
+       gchar *suggested_name = (gchar *) user_data;
+       GtkWindow *source_win = (GtkWindow *) modest_mail_operation_get_source (mail_op);
+               
+       if (modest_mail_operation_get_error (mail_op)) {
+               /* Show an error */
+               modest_platform_information_banner (GTK_WIDGET (source_win), NULL,
                                                    _("mail_in_ui_folder_create_error"));
+
+               /* Try again */
+               do_create_folder (source_win, parent_folder, (const gchar *) suggested_name);
+       } else {
+               /* the 'source_win' is either the ModestMainWindow, or the 'Move to folder'-dialog
+                * FIXME: any other? */         
+               GtkWidget *folder_view;
+
+               if (MODEST_IS_MAIN_WINDOW(source_win)) 
+                       folder_view = 
+                               modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (source_win),
+                                                                    MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
+               else
+                       folder_view =
+                               get_folder_view_from_move_to_dialog (GTK_WIDGET(source_win));
+               
+               /* Select the newly created folder */
+               modest_folder_view_select_folder (MODEST_FOLDER_VIEW (folder_view),
+                                                 new_folder, FALSE);
+               g_object_unref (new_folder);
+       }
+       /* Free. Note that the first time it'll be NULL so noop */
+       g_free (suggested_name);
+       g_object_unref (source_win);
+}
+
+static void
+do_create_folder (GtkWindow *parent_window, 
+                 TnyFolderStore *parent_folder, 
+                 const gchar *suggested_name)
+{
+       gint result;
+       gchar *folder_name = NULL;
+
+       result = modest_platform_run_new_folder_dialog (GTK_WINDOW (parent_window),
+                                                       parent_folder,
+                                                       (gchar *) suggested_name,
+                                                       &folder_name);
+       
+       if (result == GTK_RESPONSE_ACCEPT) {
+               ModestMailOperation *mail_op;
+               
+               mail_op  = modest_mail_operation_new (G_OBJECT(parent_window));
+                       
+               modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), 
+                                                mail_op);
+               modest_mail_operation_create_folder (mail_op,
+                                                    parent_folder,
+                                                    (const gchar *) folder_name,
+                                                    do_create_folder_cb,
+                                                    folder_name);
+               g_object_unref (mail_op);
+       }
+}
+
+static void
+create_folder_performer (gboolean canceled, 
+                        GError *err,
+                        GtkWindow *parent_window, 
+                        TnyAccount *account, 
+                        gpointer user_data)
+{
+       TnyFolderStore *parent_folder = TNY_FOLDER_STORE (user_data);
+
+       if (canceled || err) {
+               goto frees;
        }
+
+       /* Run the new folder dialog */
+       do_create_folder (GTK_WINDOW (parent_window), parent_folder, NULL);
+
+ frees:
+       g_object_unref (parent_folder);
 }
 
 static void
@@ -2603,65 +2691,11 @@ modest_ui_actions_create_folder(GtkWidget *parent_window,
        parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
        
        if (parent_folder) {
-               gboolean finished = FALSE;
-               gint result;
-               gchar *folder_name = NULL, *suggested_name = NULL;
-               const gchar *proto_str = NULL;
-               TnyAccount *account;
-
-               if (TNY_IS_ACCOUNT (parent_folder))
-                       account = g_object_ref (parent_folder);
-               else
-                       account = tny_folder_get_account (TNY_FOLDER (parent_folder));
-               proto_str = tny_account_get_proto (TNY_ACCOUNT (account));
-
-               if (proto_str && modest_protocol_info_get_transport_store_protocol (proto_str) ==
-                   MODEST_PROTOCOL_STORE_POP) {
-                       finished = TRUE;
-                       modest_platform_information_banner (NULL, NULL, _("mail_in_ui_folder_create_error"));
-               }
-               g_object_unref (account);
-
-               /* Run the new folder dialog */
-               while (!finished) {
-                       result = modest_platform_run_new_folder_dialog (GTK_WINDOW (parent_window),
-                                                                       parent_folder,
-                                                                       suggested_name,
-                                                                       &folder_name);
-
-                       g_free (suggested_name);
-                       suggested_name = NULL;
-
-                       if (result == GTK_RESPONSE_ACCEPT) {
-                               ModestMailOperation *mail_op;
-                               TnyFolder *new_folder = NULL;
-
-                               mail_op  = modest_mail_operation_new_with_error_handling (G_OBJECT(parent_window),
-                                                                                         modest_ui_actions_new_folder_error_handler,
-                                                                                         parent_window, NULL);
-
-                               modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), 
-                                                                mail_op);
-                               new_folder = modest_mail_operation_create_folder (mail_op,
-                                                                                 parent_folder,
-                                                                                 (const gchar *) folder_name);
-                               if (new_folder) {
-                                       modest_folder_view_select_folder (MODEST_FOLDER_VIEW(folder_view), 
-                                                                         new_folder, TRUE);
-
-                                       g_object_unref (new_folder);
-                                       finished = TRUE;
-                               }
-                               g_object_unref (mail_op);
-                       } else {
-                               finished = TRUE;
-                       }
-
-                       suggested_name = folder_name;
-                       folder_name = NULL;
-               }
-
-               g_object_unref (parent_folder);
+               /* The parent folder will be freed in the callback */
+               modest_platform_connect_if_remote_and_perform (GTK_WINDOW (parent_window), 
+                                                              parent_folder,
+                                                              create_folder_performer, 
+                                                              parent_folder);
        }
 }
 
@@ -2720,7 +2754,7 @@ on_rename_folder_cb (gboolean canceled, GError *err, GtkWindow *parent_window,
        GtkWidget *folder_view = NULL;
        RenameFolderInfo *data = (RenameFolderInfo*)user_data;
 
-       if (MODEST_IS_MAIN_WINDOW(parent_window)) {
+       if (!canceled && (err == NULL) && MODEST_IS_MAIN_WINDOW(parent_window)) {
 
                folder_view = modest_main_window_get_child_widget (
                                MODEST_MAIN_WINDOW (parent_window),
@@ -2823,21 +2857,67 @@ modest_ui_actions_delete_folder_error_handler (ModestMailOperation *mail_op,
        g_object_unref (win);
 }
 
-static gboolean
-delete_folder (ModestMainWindow *main_window, gboolean move_to_trash) 
+typedef struct {
+       TnyFolderStore *folder;
+       gboolean move_to_trash;
+} DeleteFolderInfo;
+
+static void
+on_delete_folder_cb (gboolean canceled, 
+                 GError *err,
+                 GtkWindow *parent_window, 
+                 TnyAccount *account, 
+                 gpointer user_data)
+{
+       DeleteFolderInfo *info = (DeleteFolderInfo*) user_data;
+       GtkWidget *folder_view;
+       ModestMailOperation *mail_op;
+       GtkTreeSelection *sel;
+       
+       if (!MODEST_IS_MAIN_WINDOW(parent_window) || canceled || (err!=NULL)) {
+               g_object_unref (G_OBJECT (info->folder));
+               g_free (info);
+       }
+       
+       folder_view = modest_main_window_get_child_widget (
+                       MODEST_MAIN_WINDOW (parent_window),
+                       MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
+
+       /* Unselect the folder before deleting it to free the headers */
+       sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_view));
+       gtk_tree_selection_unselect_all (sel);
+
+       /* Create the mail operation */
+       mail_op =
+               modest_mail_operation_new_with_error_handling (G_OBJECT(parent_window),
+                               modest_ui_actions_delete_folder_error_handler,
+                               NULL, NULL);
+
+       modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
+                       mail_op);
+       modest_mail_operation_remove_folder (mail_op, TNY_FOLDER (info->folder), info->move_to_trash);
+       
+       modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (folder_view));
+
+       g_object_unref (G_OBJECT (mail_op));
+       g_object_unref (G_OBJECT (info->folder));
+       g_free (info);
+}
+
+static void
+delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
 {
        TnyFolderStore *folder;
        GtkWidget *folder_view;
        gint response;
        gchar *message;
-        gboolean do_delete = TRUE;
-
-       g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (main_window), FALSE);
+       
+       g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
 
        folder_view = modest_main_window_get_child_widget (main_window,
                                                           MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
        if (!folder_view)
-               return FALSE;
+               return;
 
        folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
 
@@ -2846,7 +2926,7 @@ delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
                modest_platform_run_information_dialog (GTK_WINDOW (main_window),
                                                        _("mail_in_ui_folder_delete_error"));
                g_object_unref (G_OBJECT (folder));
-               return FALSE;
+               return;
        }
 
        /* Ask the user */      
@@ -2856,38 +2936,18 @@ delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
                                                            (const gchar *) message);
        g_free (message);
 
-        if (response != GTK_RESPONSE_OK) {
-                do_delete = FALSE;
-        } else if (modest_tny_folder_store_is_remote(folder) &&
-                   !tny_device_is_online (modest_runtime_get_device())) {
-                TnyAccount *account = tny_folder_get_account(TNY_FOLDER(folder));
-                do_delete = modest_platform_connect_and_wait(GTK_WINDOW(main_window), account);
-                g_object_unref(account);
-        }
-
-       if (do_delete) {
-               ModestMailOperation *mail_op;
-               GtkTreeSelection *sel;
-
-               /* Unselect the folder before deleting it to free the headers */
-               sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_view));
-               gtk_tree_selection_unselect_all (sel);
-
-               /* Create the mail operation */
-               mail_op =
-                       modest_mail_operation_new_with_error_handling (G_OBJECT(main_window),
-                                                                      modest_ui_actions_delete_folder_error_handler,
-                                                                      NULL, NULL);
-
-               modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
-                                                mail_op);
-               modest_mail_operation_remove_folder (mail_op, TNY_FOLDER (folder), move_to_trash);
-               g_object_unref (G_OBJECT (mail_op));
+       if (response == GTK_RESPONSE_OK) {
+               DeleteFolderInfo *info;
+               info = g_new0(DeleteFolderInfo, 1);
+               info->folder = folder;
+               info->move_to_trash = move_to_trash;
+               g_object_ref (G_OBJECT (info->folder));
+               TnyAccount *account = tny_folder_get_account(TNY_FOLDER(folder));
+               modest_platform_connect_and_perform (GTK_WINDOW (main_window), 
+                               account, on_delete_folder_cb, info);
+               g_object_unref (account);
        }
-
        g_object_unref (G_OBJECT (folder));
-
-       return do_delete;
 }
 
 void 
@@ -2895,14 +2955,8 @@ modest_ui_actions_on_delete_folder (GtkAction *action,
                                     ModestMainWindow *main_window)
 {
        g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
-
-       if (delete_folder (main_window, FALSE)) {
-               GtkWidget *folder_view;
-
-               folder_view = modest_main_window_get_child_widget (main_window,
-                                                                  MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
-               modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (folder_view));
-       }
+       
+       delete_folder (main_window, FALSE);
 }
 
 void 
@@ -3747,11 +3801,19 @@ modest_ui_actions_msg_edit_on_select_font (GtkAction *action,
        modest_msg_edit_window_select_font (window);
 }
 
+
 void
 modest_ui_actions_on_folder_display_name_changed (ModestFolderView *folder_view,
                                                  const gchar *display_name,
                                                  GtkWindow *window)
 {
+       /* don't update the display name if it was already set;
+        * updating the display name apparently is expensive */
+       const gchar* old_name = gtk_window_get_title (window);
+
+       if (old_name && display_name && strcmp (old_name, display_name) == 0)
+               return; /* don't do anything */
+
        /* 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. */
@@ -3759,6 +3821,7 @@ modest_ui_actions_on_folder_display_name_changed (ModestFolderView *folder_view,
                gtk_window_set_title (window, display_name);
        else
                gtk_window_set_title (window, " ");
+
 }
 
 void
@@ -3912,6 +3975,16 @@ on_move_to_dialog_folder_selection_changed (ModestFolderView* self,
        gtk_widget_set_sensitive (new_button, new_sensitive);
 }
 
+
+#define MODEST_MOVE_TO_DIALOG_FOLDER_VIEW "move-to-dialog-folder-view"
+
+static GtkWidget*
+get_folder_view_from_move_to_dialog (GtkWidget *move_to_dialog)
+{
+       return GTK_WIDGET(g_object_get_data (G_OBJECT(move_to_dialog),
+                                            MODEST_MOVE_TO_DIALOG_FOLDER_VIEW));
+}
+
 static GtkWidget*
 create_move_to_dialog (GtkWindow *win,
                       GtkWidget *folder_view,
@@ -4000,9 +4073,16 @@ create_move_to_dialog (GtkWindow *win,
                }
        }
 
+       /* we keep a pointer to the embedded folder view, so we can retrieve it with
+        *   get_folder_view_from_move_to_dialog 
+        * (see above) later (needed for focus handling) 
+        */
+       g_object_set_data (G_OBJECT(dialog), MODEST_MOVE_TO_DIALOG_FOLDER_VIEW, *tree_view);
+
+       
        /* Hide special folders */
        modest_folder_view_show_non_move_folders (MODEST_FOLDER_VIEW (*tree_view), FALSE);
-       
+
        gtk_container_add (GTK_CONTAINER (scroll), *tree_view);
 
        /* Add scroll to dialog */
@@ -4160,16 +4240,6 @@ modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op,
 {
        ModestWindow *main_window = NULL;
        GObject *win = NULL;
-       const GError *error = NULL;
-       const gchar *message = NULL;
-       
-       /* Get error message */
-       error = modest_mail_operation_get_error (mail_op);
-       if (error != NULL && error->message != NULL) {
-               message = error->message;
-       } else {
-               message = _("mail_in_ui_folder_move_target_error");
-       }
        
        /* Disable next automatic folder selection */
        main_window = modest_window_mgr_get_main_window (modest_runtime_get_window_mgr (),
@@ -4189,7 +4259,7 @@ modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op,
 
        /* Show notification dialog */
        win = modest_mail_operation_get_source (mail_op);
-       modest_platform_run_information_dialog ((GtkWindow *) win, message);
+       modest_platform_run_information_dialog ((GtkWindow *) win, _("mail_in_ui_folder_move_target_error"));
        if (win)
                g_object_unref (win);
 }
@@ -4365,14 +4435,22 @@ modest_ui_actions_on_main_window_remove_attachments (GtkAction *action,
  * and the msg view window when using the "Move to" dialog
  */
 static void
-modest_ui_actions_xfer_messages_from_move_to (TnyFolderStore *dst_folder,
-                                             ModestWindow *win)
+xfer_messages_from_move_to_cb  (gboolean canceled, GError *err,
+               GtkWindow *parent_window, 
+               TnyAccount *account, gpointer user_data)
 {
+       TnyFolderStore *dst_folder = TNY_FOLDER_STORE (user_data);
+       ModestWindow *win = MODEST_WINDOW (parent_window);
        TnyList *headers = NULL;
        TnyAccount *dst_account = NULL;
        const gchar *proto_str = NULL;
        gboolean dst_is_pop = FALSE;
 
+       if (canceled || err) {
+               g_object_unref (dst_folder);
+               return;
+       }
+       
        if (!TNY_IS_FOLDER (dst_folder)) {
                modest_platform_information_banner (GTK_WIDGET (win),
                                                    NULL,
@@ -4439,6 +4517,78 @@ modest_ui_actions_xfer_messages_from_move_to (TnyFolderStore *dst_folder,
 
        g_object_unref (G_OBJECT (mail_op));
        g_object_unref (headers);
+       g_object_unref (dst_folder);
+}
+
+typedef struct {
+       TnyFolder *src_folder;
+       TnyFolderStore *dst_folder;
+       gboolean delete_original;
+       GtkWidget *folder_view;
+} MoveFolderInfo;
+
+static void
+on_move_folder_cb (gboolean canceled, GError *err, GtkWindow *parent_window, 
+               TnyAccount *account, gpointer user_data)
+{
+       MoveFolderInfo *info = (MoveFolderInfo*)user_data;
+       GtkTreeSelection *sel;
+       ModestMailOperation *mail_op = NULL;
+       
+       if (canceled || err || !MODEST_IS_MAIN_WINDOW (parent_window)) {
+               g_object_unref (G_OBJECT (info->src_folder));
+               g_object_unref (G_OBJECT (info->dst_folder));
+               g_free (info);
+               return;
+       }
+       
+       MoveToHelper *helper = g_new0 (MoveToHelper, 1);
+       helper->banner = modest_platform_animation_banner (GTK_WIDGET (parent_window), NULL,
+                       _CS("ckct_nw_pasting"));
+       if (helper->banner != NULL)  {
+               gtk_window_set_modal (GTK_WINDOW(helper->banner), FALSE);
+               gtk_widget_show (GTK_WIDGET(helper->banner));
+       }
+       /* Clean folder on header view before moving it */
+       sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (info->folder_view));
+       gtk_tree_selection_unselect_all (sel);
+
+       /* Let gtk events run. We need that the folder
+          view frees its reference to the source
+          folder *before* issuing the mail operation
+          so we need the signal handler of selection
+          changed to happen before the mail
+          operation 
+       while (gtk_events_pending ())
+               gtk_main_iteration ();   */
+
+       mail_op =
+               modest_mail_operation_new_with_error_handling (G_OBJECT(parent_window),
+                               modest_ui_actions_move_folder_error_handler,
+                               info->src_folder, NULL);
+       modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
+                       mail_op);
+
+       /* Select *after* the changes */
+       /* TODO: this function hangs UI after transfer */ 
+       /*                      modest_folder_view_select_folder (MODEST_FOLDER_VIEW(folder_view), */
+       /*                                                        TNY_FOLDER (src_folder), TRUE); */
+
+       modest_mail_operation_xfer_folder (mail_op,
+                       TNY_FOLDER (info->src_folder),
+                       info->dst_folder,
+                       info->delete_original, 
+                       move_to_cb, 
+                       helper);
+       
+       modest_folder_view_select_folder (MODEST_FOLDER_VIEW(info->folder_view),
+                       TNY_FOLDER (info->dst_folder), TRUE);
+       
+       /* Unref mail operation */
+       g_object_unref (G_OBJECT (mail_op));
+       g_object_unref (G_OBJECT (info->src_folder));
+       g_object_unref (G_OBJECT (info->dst_folder));
+       g_free (user_data);
 }
 
 /*
@@ -4452,9 +4602,8 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action,
                                          ModestMainWindow *win)
 {
        ModestHeaderView *header_view = NULL;
-       ModestMailOperation *mail_op = NULL;
        TnyFolderStore *src_folder;
-        gboolean online = (tny_device_is_online (modest_runtime_get_device()));
+       gboolean online = (tny_device_is_online (modest_runtime_get_device()));
 
        g_return_if_fail (MODEST_IS_MAIN_WINDOW (win));
 
@@ -4466,86 +4615,57 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action,
 
        /* Get folder or messages to transfer */
        if (gtk_widget_is_focus (folder_view)) {
-               GtkTreeSelection *sel;
-                gboolean do_xfer = TRUE;
+               gboolean do_xfer = TRUE;
 
                /* Allow only to transfer folders to the local root folder */
                if (TNY_IS_ACCOUNT (dst_folder) && 
-                   !MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (dst_folder)) {
-                       do_xfer = FALSE;
-                } else if (!TNY_IS_FOLDER (src_folder)) {
+                               !MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (dst_folder)) {
+                                       do_xfer = FALSE;
+               } else if (!TNY_IS_FOLDER (src_folder)) {
                        g_warning ("%s: src_folder is not a TnyFolder.\n", __FUNCTION__);
-                        do_xfer = FALSE;
-                } else if (!online && modest_tny_folder_store_is_remote(src_folder)) {
-                        guint num_headers = tny_folder_get_all_count(TNY_FOLDER (src_folder));
+                       do_xfer = FALSE;
+               } /* else if (!online && modest_tny_folder_store_is_remote(src_folder)) {
+                       guint num_headers = tny_folder_get_all_count(TNY_FOLDER (src_folder));
                        TnyAccount *account = tny_folder_get_account (TNY_FOLDER (src_folder));
-                        if (!connect_to_get_msg(MODEST_WINDOW (win), num_headers, account))
-                                do_xfer = FALSE;
+                       if (!connect_to_get_msg(MODEST_WINDOW (win), num_headers, account))
+                               do_xfer = FALSE;
                        g_object_unref (account);
-                }
-
-                if (do_xfer) {
-                        MoveToHelper *helper = g_new0 (MoveToHelper, 1);
-                        helper->banner = modest_platform_animation_banner (GTK_WIDGET (win), NULL,
-                                                                          _CS("ckct_nw_pasting"));
-                        if (helper->banner != NULL)  {
-                                gtk_window_set_modal (GTK_WINDOW(helper->banner), FALSE);
-                                gtk_widget_show (GTK_WIDGET(helper->banner));
-                        }
-                        /* Clean folder on header view before moving it */
-                        sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_view));
-                        gtk_tree_selection_unselect_all (sel);
-
-                       /* Let gtk events run. We need that the folder
-                          view frees its reference to the source
-                          folder *before* issuing the mail operation
-                          so we need the signal handler of selection
-                          changed to happen before the mail
-                          operation */
-                       while (gtk_events_pending ())
-                               gtk_main_iteration ();
-
-                        mail_op =
-                          modest_mail_operation_new_with_error_handling (G_OBJECT(win),
-                                                                         modest_ui_actions_move_folder_error_handler,
-                                                                         src_folder, NULL);
-                        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
-                                                         mail_op);
-
-                       /* Select *after* the changes */
-                       /* TODO: this function hangs UI after transfer */ 
-/*                     modest_folder_view_select_folder (MODEST_FOLDER_VIEW(folder_view), */
-/*                                                       TNY_FOLDER (src_folder), TRUE); */
-                       
-                        modest_mail_operation_xfer_folder (mail_op,
-                                                           TNY_FOLDER (src_folder),
-                                                           dst_folder,
-                                                           TRUE, 
-                                                          move_to_cb, 
-                                                          helper);
-                        /* Unref mail operation */
-                        g_object_unref (G_OBJECT (mail_op));
-                }
+               }*/
+
+               if (do_xfer) {
+                       MoveFolderInfo *info = g_new0 (MoveFolderInfo, 1);
+                       info->src_folder = TNY_FOLDER (src_folder);
+                       info->dst_folder = dst_folder;
+                       info->delete_original = TRUE;
+                       info->folder_view = folder_view;
+                       g_object_ref (G_OBJECT (info->src_folder));
+                       g_object_ref (G_OBJECT (info->dst_folder));
+                       modest_platform_connect_if_remote_and_perform(GTK_WINDOW (win), 
+                                   TNY_FOLDER_STORE (dst_folder), on_move_folder_cb, info);
+               }
        } else if (gtk_widget_is_focus (GTK_WIDGET(header_view))) {
-                gboolean do_xfer = TRUE;
-                /* Ask for confirmation if the source folder is remote and we're not connected */
-                if (!online && modest_tny_folder_store_is_remote(src_folder)) {
-                        TnyList *headers = modest_header_view_get_selected_headers(header_view);
-                        if (!msgs_already_deleted_from_server(headers, src_folder)) {
-                                guint num_headers = tny_list_get_length(headers);
+               gboolean do_xfer = TRUE;
+               /* Ask for confirmation if the source folder is remote and we're not connected */
+               if (!online && modest_tny_folder_store_is_remote(src_folder)) {
+                       TnyList *headers = modest_header_view_get_selected_headers(header_view);
+                       if (!msgs_already_deleted_from_server(headers, src_folder)) {
+                               guint num_headers = tny_list_get_length(headers);
                                TnyAccount *account = get_account_from_header_list (headers);
-                                if (!connect_to_get_msg(MODEST_WINDOW (win), num_headers, account))
-                                        do_xfer = FALSE;
+                               if (!connect_to_get_msg(MODEST_WINDOW (win), num_headers, account))
+                                       do_xfer = FALSE;
                                g_object_unref (account);
-                        }
-                        g_object_unref(headers);
-                }
-                if (do_xfer) /* Transfer messages */
-                        modest_ui_actions_xfer_messages_from_move_to (dst_folder, MODEST_WINDOW (win));
+                       }
+                       g_object_unref(headers);
+               }
+               if (do_xfer) /* Transfer messages */ {
+                       g_object_ref (dst_folder);
+                       modest_platform_connect_if_remote_and_perform(GTK_WINDOW (win), 
+                                       TNY_FOLDER_STORE (dst_folder), xfer_messages_from_move_to_cb, dst_folder);
+               }
        }
 
-    if (src_folder)
-       g_object_unref (src_folder);
+       if (src_folder)
+               g_object_unref (src_folder);
 }
 
 
@@ -4582,7 +4702,9 @@ modest_ui_actions_on_msg_view_window_move_to (GtkAction *action,
        }
 
        if (do_xfer) {
-               modest_ui_actions_xfer_messages_from_move_to (dst_folder, MODEST_WINDOW (win));
+               g_object_ref (dst_folder);
+               modest_platform_connect_if_remote_and_perform(GTK_WINDOW (win), 
+                               TNY_FOLDER_STORE (dst_folder), xfer_messages_from_move_to_cb, dst_folder);
         }
        g_object_unref (account);
        g_object_unref (src_folder);
@@ -4627,17 +4749,17 @@ modest_ui_actions_on_move_to (GtkAction *action,
                return;
 
        dst_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (tree_view));
-        /* Do window specific stuff */
-        if (MODEST_IS_MAIN_WINDOW (win)) {
-                modest_ui_actions_on_main_window_move_to (action,
-                                                          folder_view,
-                                                          dst_folder,
-                                                          MODEST_MAIN_WINDOW (win));
-        } else {
-                modest_ui_actions_on_msg_view_window_move_to (action,
-                                                              dst_folder,
-                                                              MODEST_MSG_VIEW_WINDOW (win));
-        }
+       /* Do window specific stuff */
+       if (MODEST_IS_MAIN_WINDOW (win)) {
+               modest_ui_actions_on_main_window_move_to (action,
+                               folder_view,
+                               dst_folder,
+                               MODEST_MAIN_WINDOW (win));
+       } else {
+               modest_ui_actions_on_msg_view_window_move_to (action,
+                               dst_folder,
+                               MODEST_MSG_VIEW_WINDOW (win));
+       }
 
        if (dst_folder)
                g_object_unref (dst_folder);
@@ -4770,7 +4892,6 @@ retrieve_msg_contents_performer (gboolean canceled,
        TnyList *headers = TNY_LIST (user_data);
 
        if (err || canceled) {
-               /* Show an error ? */
                goto out;
        }
 
@@ -4980,6 +5101,7 @@ on_send_receive_finished (ModestMailOperation  *mail_op,
           update_account does it always automatically */
        if (folder_store && TNY_IS_FOLDER (folder_store) && 
            tny_folder_get_folder_type (TNY_FOLDER (folder_store)) != TNY_FOLDER_TYPE_INBOX) {
+               ModestMailOperation *refresh_op;
 
                header_view = modest_main_window_get_child_widget (main_win,
                                                                   MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
@@ -4988,10 +5110,11 @@ on_send_receive_finished (ModestMailOperation  *mail_op,
                   because it hasn't changed. We also do not
                   need to save the widget status. Just force
                   a refresh */
-               modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view),
-                                              TNY_FOLDER (folder_store),
-                                              folder_refreshed_cb,
-                                              main_win);
+               refresh_op = modest_mail_operation_new (G_OBJECT (main_win));
+               modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), refresh_op);
+               modest_mail_operation_refresh_folder (refresh_op, TNY_FOLDER (folder_store),
+                                                     folder_refreshed_cb, main_win);
+               g_object_unref (refresh_op);
        }
        
        if (folder_store)
@@ -5041,7 +5164,10 @@ modest_ui_actions_on_send_queue_error_happened (TnySendQueue *self,
                message = g_strdup (_("emev_ib_ui_smtp_send_error"));
                break;
        default:
-               g_return_if_reached ();
+               g_warning ("%s: unexpected TNY_TRANSPORT_ACCOUNT_ERROR %d",
+                          __FUNCTION__, err->code);
+               message = g_strdup (_("emev_ib_ui_smtp_send_error"));
+               break;  
        }
        
        /* TODO if the username or the password where not defined we