* Migrated Modest to the new send queue API
[modest] / src / modest-ui-actions.c
index 8d9161f..110a26f 100644 (file)
@@ -163,6 +163,9 @@ 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
  */
@@ -395,7 +398,8 @@ modest_ui_actions_refresh_message_window_after_delete (ModestMsgViewWindow* win)
        if (modest_msg_view_window_last_message_selected (win) &&
                modest_msg_view_window_first_message_selected (win)) {
                modest_ui_actions_on_close_window (NULL, MODEST_WINDOW (win));
-       } else if (!modest_msg_view_window_select_next_message (win)) {
+       } else if (!modest_msg_view_window_select_next_message (win) &&
+                  !modest_msg_view_window_select_previous_message (win)) {
                gboolean ret_value;
                g_signal_emit_by_name (G_OBJECT (win), "delete-event", NULL, &ret_value);       
        }
@@ -743,8 +747,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;
@@ -787,11 +790,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:
@@ -816,6 +814,26 @@ modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win)
        modest_ui_actions_compose_msg(win, NULL, NULL, NULL, NULL, NULL, NULL);
 }
 
+void
+modest_ui_actions_on_new_msg_or_folder (GtkAction *action, ModestWindow *win)
+{
+       g_return_if_fail (MODEST_IS_WINDOW (win));
+
+       /* Check first if the folder view has the focus */
+       if (MODEST_IS_MAIN_WINDOW (win)) {
+               GtkWidget *w;
+               w = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
+                                                        MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
+               if (gtk_widget_is_focus (w)) {
+                       modest_ui_actions_on_new_folder (action, MODEST_MAIN_WINDOW(win));
+                       return;
+               }
+       }
+
+       modest_ui_actions_on_new_msg (action, win);
+}
+
+
 gboolean 
 modest_ui_actions_msg_retrieval_check (ModestMailOperation *mail_op,
                                       TnyHeader *header,
@@ -1003,16 +1021,10 @@ modest_ui_actions_get_msgs_full_error_handler (ModestMailOperation *mail_op,
 {
        const GError *error;
        GObject *win = NULL;
-       const gchar *err_msg;
+       const gchar *err_msg = (const gchar *) user_data;
 
        win = modest_mail_operation_get_source (mail_op);
        error = modest_mail_operation_get_error (mail_op);
-       /* 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;
 
        /* Show error */
        modest_platform_run_information_dialog ((GtkWindow *) win, err_msg);
@@ -1042,6 +1054,16 @@ get_account_from_header_list (TnyList *headers)
        return account;
 }
 
+static void 
+foreach_unregister_headers (gpointer data,
+                           gpointer user_data)
+{
+       ModestWindowMgr *mgr = (ModestWindowMgr *) user_data;
+       TnyHeader *header = TNY_HEADER (data);
+
+       modest_window_mgr_unregister_header (mgr, header);
+}
+
 static void
 open_msgs_performer(gboolean canceled, 
                    GError *err,
@@ -1060,7 +1082,9 @@ open_msgs_performer(gboolean canceled,
 
        status = tny_account_get_connection_status (account);
        if (err || canceled) {
-               /* TODO: Show an error ? */
+               /* Unregister the already registered headers */
+               tny_list_foreach (not_opened_headers, foreach_unregister_headers, 
+                                 modest_runtime_get_window_mgr ());
                goto clean;
        }
 
@@ -1224,7 +1248,7 @@ open_msgs_from_headers (TnyList *headers, ModestWindow *win)
 
        /* Connect to the account and perform */
        if (uncached_msgs > 0) {
-               modest_platform_connect_and_perform ((GtkWindow *) win, g_object_ref (account), 
+               modest_platform_connect_and_perform ((GtkWindow *) win, TRUE, g_object_ref (account), 
                                                     open_msgs_performer, g_object_ref (not_opened_headers));
        } else {
                /* Call directly the performer, do not need to connect */
@@ -1640,17 +1664,21 @@ 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 (TNY_IS_LIST(new_headers) && (tny_list_get_length (new_headers)) > 0)
+               modest_platform_on_new_headers_received (new_headers, 
+                                                        show_visual_notifications);
+
 }
 
 gboolean
@@ -1695,7 +1723,6 @@ do_send_receive_performer (gboolean canceled,
        info = (SendReceiveInfo *) user_data;
 
        if (err || canceled) {
-
                goto clean;
        }
 
@@ -1739,6 +1766,7 @@ do_send_receive_performer (gboolean canceled,
  */
 void
 modest_ui_actions_do_send_receive (const gchar *account_name, 
+                                  gboolean force_connection,
                                   ModestWindow *win)
 {
        gchar *acc_name = NULL;
@@ -1770,7 +1798,8 @@ modest_ui_actions_do_send_receive (const gchar *account_name,
                                                                     TNY_ACCOUNT_TYPE_STORE);
 
        /* Invoke the connect and perform */
-       modest_platform_connect_and_perform ((win) ? GTK_WINDOW (win) : NULL, info->account, 
+       modest_platform_connect_and_perform ((win) ? GTK_WINDOW (win) : NULL, 
+                                            force_connection, info->account, 
                                             do_send_receive_performer, info);
 }
 
@@ -1801,9 +1830,12 @@ modest_ui_actions_do_cancel_send (const gchar *account_name,
                             MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND,
                             "modest: could not find send queue for account\n");
        } else {
-               /* Keeep messages in outbox folder */
-               tny_send_queue_cancel (send_queue, FALSE, &error);
-       }       
+               /* Cancel the current send */
+               tny_account_cancel (TNY_ACCOUNT (transport_account));
+
+               /* Suspend all pending messages */
+               tny_send_queue_cancel (send_queue, TNY_SEND_QUEUE_CANCEL_ACTION_SUSPEND, &error);
+       }
 
  frees:
        if (transport_account != NULL) 
@@ -1849,7 +1881,8 @@ modest_ui_actions_cancel_send (GtkAction *action,  ModestWindow *win)
  * updates
  */
 void
-modest_ui_actions_do_send_receive_all (ModestWindow *win)
+modest_ui_actions_do_send_receive_all (ModestWindow *win, 
+                                      gboolean force_connection)
 {
        GSList *account_names, *iter;
 
@@ -1858,7 +1891,7 @@ modest_ui_actions_do_send_receive_all (ModestWindow *win)
 
        iter = account_names;
        while (iter) {                  
-               modest_ui_actions_do_send_receive ((const char*) iter->data, win);
+               modest_ui_actions_do_send_receive ((const char*) iter->data, force_connection, win);
                iter = g_slist_next (iter);
        }
 
@@ -1899,8 +1932,8 @@ modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win)
                        g_object_unref (folder_store);
        }       
        
-       /* Refresh the active account */
-       modest_ui_actions_do_send_receive (NULL, win);
+       /* Refresh the active account. Force the connection if needed */
+       modest_ui_actions_do_send_receive (NULL, TRUE, win);
 }
 
 
@@ -2036,8 +2069,6 @@ folder_refreshed_cb (ModestMailOperation *mail_op,
 {
        ModestMainWindow *win = NULL;
        GtkWidget *header_view;
-       gboolean folder_empty = FALSE;
-       gboolean all_marked_as_deleted = FALSE;
 
        g_return_if_fail (TNY_IS_FOLDER (folder));
 
@@ -2052,14 +2083,12 @@ folder_refreshed_cb (ModestMailOperation *mail_op,
                if (current_folder != NULL && folder != current_folder) {
                        g_object_unref (current_folder);
                        return;
-               }
-               g_object_unref (current_folder);
+               } else if (current_folder)
+                       g_object_unref (current_folder);
        }
 
        /* Check if folder is empty and set headers view contents style */
-       folder_empty = (tny_folder_get_all_count (folder) == 0);
-       all_marked_as_deleted = modest_header_view_is_empty (MODEST_HEADER_VIEW(header_view));
-       if (folder_empty || all_marked_as_deleted)
+       if (tny_folder_get_all_count (folder) == 0)
                modest_main_window_set_contents_style (win,
                                                       MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY);
 }
@@ -2244,11 +2273,16 @@ 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)
-               return;
-
-       modest_msg_edit_window_set_draft (edit_window, saved_draft);
+       /* 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"));
+       } else {
+               modest_msg_edit_window_set_draft (edit_window, saved_draft);
+       }
+       g_object_unref(edit_window);
 }
 
 void
@@ -2295,7 +2329,7 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
        from = modest_account_mgr_get_from_string (account_mgr, account_name);
 
        /* Create the mail operation */         
-       mail_operation = modest_mail_operation_new (G_OBJECT(edit_window));
+       mail_operation = modest_mail_operation_new (NULL);
        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
 
        modest_mail_operation_save_to_drafts (mail_operation,
@@ -2312,7 +2346,7 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
                                              data->images,
                                              data->priority_flags,
                                              on_save_to_drafts_cb,
-                                             edit_window);
+                                             g_object_ref(edit_window));
        info_text = g_strdup_printf (_("mail_va_saved_to_drafts"), _("mcen_me_folder_drafts"));
        modest_platform_information_banner (NULL, NULL, info_text);
 
@@ -2383,7 +2417,7 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
        ModestAccountMgr *account_mgr = modest_runtime_get_account_mgr();
        gchar *account_name = g_strdup (data->account_name);
        if (!account_name)
-               g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
+               account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
 
        if (!account_name) 
                account_name = modest_account_mgr_get_default_account (account_mgr);
@@ -2391,8 +2425,9 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
        if (!account_name) {
                modest_msg_edit_window_free_msg_data (edit_window, data);
                /* Run account setup wizard */
-               if (!modest_ui_actions_run_account_setup_wizard (MODEST_WINDOW(edit_window)))
+               if (!modest_ui_actions_run_account_setup_wizard (MODEST_WINDOW(edit_window))) {
                        return;
+               }
        }
        
        /* Get the currently-active transport account for this modest account: */
@@ -2403,6 +2438,7 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
        }
        
        if (!transport_account) {
+               modest_msg_edit_window_free_msg_data (edit_window, data);
                /* Run account setup wizard */
                if (!modest_ui_actions_run_account_setup_wizard(MODEST_WINDOW(edit_window)))
                        return;
@@ -2411,7 +2447,7 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
        gchar *from = modest_account_mgr_get_from_string (account_mgr, account_name);
 
        /* Create the mail operation */
-       ModestMailOperation *mail_operation = modest_mail_operation_new (G_OBJECT(edit_window));
+       ModestMailOperation *mail_operation = modest_mail_operation_new (NULL);
        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
 
        modest_mail_operation_send_new_mail (mail_operation,
@@ -2597,22 +2633,28 @@ do_create_folder_cb (ModestMailOperation *mail_op,
                     gpointer user_data)
 {
        gchar *suggested_name = (gchar *) user_data;
-       GtkWindow *main_window = (GtkWindow *) modest_mail_operation_get_source (mail_op);
+       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 (main_window), NULL,
+               modest_platform_information_banner (GTK_WIDGET (source_win), NULL,
                                                    _("mail_in_ui_folder_create_error"));
 
                /* Try again */
-               do_create_folder (main_window, parent_folder, (const gchar *) suggested_name);
+               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;
 
-               folder_view = 
-                       modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (main_window),
-                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_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);
@@ -2620,7 +2662,7 @@ do_create_folder_cb (ModestMailOperation *mail_op,
        }
        /* Free. Note that the first time it'll be NULL so noop */
        g_free (suggested_name);
-       g_object_unref (main_window);
+       g_object_unref (source_win);
 }
 
 static void
@@ -2652,6 +2694,25 @@ do_create_folder (GtkWindow *parent_window,
        }
 }
 
+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
 modest_ui_actions_create_folder(GtkWidget *parent_window,
@@ -2662,11 +2723,12 @@ modest_ui_actions_create_folder(GtkWidget *parent_window,
        parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
        
        if (parent_folder) {
-       
-               /* Run the new folder dialog */
-               do_create_folder (GTK_WINDOW (parent_window), parent_folder, 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), 
+                                                              TRUE,
+                                                              parent_folder,
+                                                              create_folder_performer, 
+                                                              parent_folder);
        }
 }
 
@@ -2717,8 +2779,21 @@ typedef struct {
 } RenameFolderInfo;
 
 static void
-on_rename_folder_cb (gboolean canceled, GError *err, GtkWindow *parent_window, 
-               TnyAccount *account, gpointer user_data)
+on_rename_folder_cb (ModestMailOperation *mail_op, 
+                    TnyFolder *new_folder,
+                    gpointer user_data)
+{
+       /* Select now */
+       modest_folder_view_select_folder (MODEST_FOLDER_VIEW (user_data),
+                                         new_folder, FALSE);
+}
+
+static void
+on_rename_folder_performer (gboolean canceled, 
+                           GError *err, 
+                           GtkWindow *parent_window, 
+                           TnyAccount *account, 
+                           gpointer user_data)
 {
        ModestMailOperation *mail_op = NULL;
        GtkTreeSelection *sel = NULL;
@@ -2743,20 +2818,12 @@ on_rename_folder_cb (gboolean canceled, GError *err, GtkWindow *parent_window,
                sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_view));
                gtk_tree_selection_unselect_all (sel);
 
-               /* Select *after* the changes */
-               modest_folder_view_select_folder (MODEST_FOLDER_VIEW(folder_view),
-                               TNY_FOLDER(data->folder), TRUE);
-
                /* Actually rename the folder */
                modest_mail_operation_rename_folder (mail_op,
-                               TNY_FOLDER (data->folder),
-                               (const gchar *) (data->new_name));
-               
-               /* TODO folder view filter refilter */
-               /* 
-               GtkTreeModel *tree_model = gtk_tree_view_get_model (GTK_TREE_VIEW (folder_view));
-               if (GTK_IS_TREE_MODEL_FILTER (tree_model))
-                       gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (tree_model)); */
+                                                    TNY_FOLDER (data->folder),
+                                                    (const gchar *) (data->new_name),
+                                                    on_rename_folder_cb,
+                                                    folder_view);
        }
 
        g_object_unref (mail_op);
@@ -2810,8 +2877,8 @@ modest_ui_actions_on_rename_folder (GtkAction *action,
                        RenameFolderInfo *rename_folder_data = g_new0 (RenameFolderInfo, 1);
                        rename_folder_data->folder = folder;
                        rename_folder_data->new_name = folder_name;
-                       modest_platform_connect_if_remote_and_perform (GTK_WINDOW(main_window), 
-                                       folder, on_rename_folder_cb, rename_folder_data);
+                       modest_platform_connect_if_remote_and_perform (GTK_WINDOW(main_window), TRUE,
+                                       folder, on_rename_folder_performer, rename_folder_data);
                }
        }
        g_object_unref (folder);
@@ -2913,9 +2980,11 @@ delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
                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);
+               TnyAccount *account = tny_folder_get_account (TNY_FOLDER (folder));
+               modest_platform_connect_if_remote_and_perform (GTK_WINDOW (main_window), 
+                                                              TRUE,
+                                                              TNY_FOLDER_STORE (account), 
+                                                              on_delete_folder_cb, info);
                g_object_unref (account);
        }
        g_object_unref (G_OBJECT (folder));
@@ -3285,7 +3354,17 @@ modest_ui_actions_on_redo (GtkAction *action,
 
 
 static void
-destroy_information_note (ModestMailOperation *mail_op, gpointer user_data)
+destroy_information_note (ModestMailOperation *mail_op, 
+                         gpointer user_data)
+{
+       /* destroy information note */
+       gtk_widget_destroy (GTK_WIDGET(user_data));
+}
+
+static void
+destroy_folder_information_note (ModestMailOperation *mail_op, 
+                                TnyFolder *new_folder,
+                                gpointer user_data)
 {
        /* destroy information note */
        gtk_widget_destroy (GTK_WIDGET(user_data));
@@ -3430,7 +3509,7 @@ modest_ui_actions_on_paste (GtkAction *action,
                                                           src_folder,
                                                           folder_store,
                                                           delete,
-                                                          destroy_information_note,
+                                                          destroy_folder_information_note,
                                                           inf_note);
                }
 
@@ -3772,18 +3851,27 @@ 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 (display_name == NULL)
+               display_name = " ";
+
+       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. */
-       if (display_name)
-               gtk_window_set_title (window, display_name);
-       else
-               gtk_window_set_title (window, " ");
+       gtk_window_set_title (window, display_name);
+
 }
 
 void
@@ -3855,10 +3943,15 @@ on_move_to_dialog_folder_selection_changed (ModestFolderView* self,
 
                if ((gpointer) local_account != (gpointer) folder_store &&
                    (gpointer) mmc_account != (gpointer) folder_store) {
+                       const char *proto_name = tny_account_get_proto (TNY_ACCOUNT (folder_store));
+                       ModestTransportStoreProtocol proto = MODEST_PROTOCOL_STORE_MAILDIR;
+                       if (proto_name != NULL) {
+                               proto = modest_protocol_info_get_transport_store_protocol (proto_name);
+                       }
                        is_local_account = FALSE;
                        /* New button should be dimmed on remote
-                          account root */
-                       new_sensitive = FALSE;
+                          POP account root */
+                       new_sensitive = (proto != MODEST_PROTOCOL_STORE_POP);
                }
                g_object_unref (local_account);
        }
@@ -3937,6 +4030,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,
@@ -4025,9 +4128,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 */
@@ -4137,10 +4247,9 @@ modest_ui_actions_msgs_move_to_confirmation (ModestWindow *win,
        return response;
 }
 
-
-
 static void
-move_to_cb (ModestMailOperation *mail_op, gpointer user_data)
+move_to_cb (ModestMailOperation *mail_op, 
+           gpointer user_data)
 {
        MoveToHelper *helper = (MoveToHelper *) user_data;
 
@@ -4153,10 +4262,14 @@ move_to_cb (ModestMailOperation *mail_op, gpointer user_data)
                if (MODEST_IS_MSG_VIEW_WINDOW (object)) {
                        ModestMsgViewWindow *self = MODEST_MSG_VIEW_WINDOW (object);
 
-                       if (!modest_msg_view_window_select_next_message (self))
-                               if (!modest_msg_view_window_select_previous_message (self))
-                                       /* No more messages to view, so close this window */
-                                       modest_ui_actions_on_close_window (NULL, MODEST_WINDOW(self));
+                       if (modest_msg_view_window_last_message_selected (self) &&
+                           modest_msg_view_window_first_message_selected (self)) {
+                               modest_ui_actions_on_close_window (NULL, MODEST_WINDOW (self));
+                       } else if (!modest_msg_view_window_select_next_message (self) &&
+                                  !modest_msg_view_window_select_previous_message (self)) {
+                               /* No more messages to view, so close this window */
+                               modest_ui_actions_on_close_window (NULL, MODEST_WINDOW(self));
+                       }
                } else if (MODEST_IS_MAIN_WINDOW (object) && helper->reference != NULL) {
                        GtkWidget *header_view;
                        GtkTreePath *path;
@@ -4179,6 +4292,21 @@ move_to_cb (ModestMailOperation *mail_op, gpointer user_data)
        g_free (helper);
 }
 
+static void
+folder_move_to_cb (ModestMailOperation *mail_op, 
+                  TnyFolder *new_folder,
+                  gpointer user_data)
+{
+       move_to_cb (mail_op, user_data);
+}
+
+static void
+msgs_move_to_cb (ModestMailOperation *mail_op, 
+                gpointer user_data)
+{
+       move_to_cb (mail_op, user_data);
+}
+
 void
 modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op, 
                                             gpointer user_data)
@@ -4381,8 +4509,8 @@ modest_ui_actions_on_main_window_remove_attachments (GtkAction *action,
  */
 static void
 xfer_messages_from_move_to_cb  (gboolean canceled, GError *err,
-               GtkWindow *parent_window, 
-               TnyAccount *account, gpointer user_data)
+                               GtkWindow *parent_window, 
+                               TnyAccount *account, gpointer user_data)
 {
        TnyFolderStore *dst_folder = TNY_FOLDER_STORE (user_data);
        ModestWindow *win = MODEST_WINDOW (parent_window);
@@ -4395,13 +4523,6 @@ xfer_messages_from_move_to_cb  (gboolean canceled, GError *err,
                g_object_unref (dst_folder);
                return;
        }
-       
-       if (!TNY_IS_FOLDER (dst_folder)) {
-               modest_platform_information_banner (GTK_WIDGET (win),
-                                                   NULL,
-                                                   _CS("ckdg_ib_unable_to_move_to_current_location"));
-               return;
-       }
 
        dst_account = tny_folder_get_account (TNY_FOLDER (dst_folder));
        proto_str = tny_account_get_proto (dst_account);
@@ -4457,7 +4578,7 @@ xfer_messages_from_move_to_cb  (gboolean canceled, GError *err,
                                         headers,
                                         TNY_FOLDER (dst_folder),
                                         TRUE,
-                                        move_to_cb,
+                                        msgs_move_to_cb,
                                         helper);
 
        g_object_unref (G_OBJECT (mail_op));
@@ -4466,6 +4587,36 @@ xfer_messages_from_move_to_cb  (gboolean canceled, GError *err,
 }
 
 typedef struct {
+       TnyAccount *dst_account;
+       ModestConnectedPerformer callback;
+       gpointer data;
+} DoubleConnectionInfo;
+
+static void
+src_account_connect_performer (gboolean canceled, 
+                              GError *err,
+                              GtkWindow *parent_window, 
+                              TnyAccount *src_account, 
+                              gpointer user_data)
+{
+       DoubleConnectionInfo *info = (DoubleConnectionInfo *) user_data;
+
+       if (canceled || err) {
+               /* If there was any error call the user callback */
+               info->callback (canceled, err, parent_window, src_account, info->data);
+       } else {
+               /* Connect the destination account */
+               modest_platform_connect_if_remote_and_perform (parent_window, TRUE, 
+                                                              TNY_FOLDER_STORE (info->dst_account),
+                                                              info->callback, info->data);
+       }
+
+       /* Free the info object */
+       g_object_unref (info->dst_account);
+       g_slice_free (DoubleConnectionInfo, info);
+}
+
+typedef struct {
        TnyFolder *src_folder;
        TnyFolderStore *dst_folder;
        gboolean delete_original;
@@ -4523,11 +4674,13 @@ on_move_folder_cb (gboolean canceled, GError *err, GtkWindow *parent_window,
                        TNY_FOLDER (info->src_folder),
                        info->dst_folder,
                        info->delete_original, 
-                       move_to_cb, 
+                       folder_move_to_cb, 
                        helper);
-       
-       modest_folder_view_select_folder (MODEST_FOLDER_VIEW(info->folder_view),
-                       TNY_FOLDER (info->dst_folder), TRUE);
+
+       if (modest_mail_operation_get_status (mail_op) == MODEST_MAIL_OPERATION_STATUS_SUCCESS) {       
+               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));
@@ -4564,8 +4717,8 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action,
 
                /* 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;
+                   !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;
@@ -4585,30 +4738,53 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action,
                        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), 
+                       modest_platform_connect_if_remote_and_perform(GTK_WINDOW (win), TRUE,
                                    TNY_FOLDER_STORE (dst_folder), on_move_folder_cb, info);
                }
        } else if (gtk_widget_is_focus (GTK_WIDGET(header_view))) {
                gboolean do_xfer = TRUE;
+
+               /* Show an error when trying to move msgs to an account */      
+               if (!TNY_IS_FOLDER (dst_folder)) {
+                       modest_platform_information_banner (GTK_WIDGET (win),
+                                                           NULL,
+                                                           _CS("ckdg_ib_unable_to_move_to_current_location"));
+                       goto free;
+               }
+
                /* 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))
+                               GtkResponseType response;
+
+                               response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
+                                                                                   ngettext("mcen_nc_get_msg",
+                                                                                            "mcen_nc_get_msgs",
+                                                                                            num_headers));
+                               if (response == GTK_RESPONSE_CANCEL)
                                        do_xfer = FALSE;
+                               
                                g_object_unref (account);
                        }
                        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);
+                       DoubleConnectionInfo *info = g_slice_new (DoubleConnectionInfo);
+                       info->callback = xfer_messages_from_move_to_cb;
+                       info->dst_account = tny_folder_get_account (TNY_FOLDER (dst_folder));
+                       info->data = g_object_ref (dst_folder);
+
+                       modest_platform_connect_if_remote_and_perform(GTK_WINDOW (win), TRUE,
+                                                                     TNY_FOLDER_STORE (src_folder), 
+                                                                     src_account_connect_performer, 
+                                                                     info);
                }
        }
 
+ free:
        if (src_folder)
                g_object_unref (src_folder);
 }
@@ -4648,7 +4824,7 @@ modest_ui_actions_on_msg_view_window_move_to (GtkAction *action,
 
        if (do_xfer) {
                g_object_ref (dst_folder);
-               modest_platform_connect_if_remote_and_perform(GTK_WINDOW (win), 
+               modest_platform_connect_if_remote_and_perform(GTK_WINDOW (win), TRUE,
                                TNY_FOLDER_STORE (dst_folder), xfer_messages_from_move_to_cb, dst_folder);
         }
        g_object_unref (account);
@@ -4837,7 +5013,6 @@ retrieve_msg_contents_performer (gboolean canceled,
        TnyList *headers = TNY_LIST (user_data);
 
        if (err || canceled) {
-               /* Show an error ? */
                goto out;
        }
 
@@ -4880,7 +5055,7 @@ modest_ui_actions_on_retrieve_msg_contents (GtkAction *action,
        g_object_unref (iter);
 
        /* Connect and perform the message retrieval */
-       modest_platform_connect_and_perform ((GtkWindow *) window, 
+       modest_platform_connect_and_perform ((GtkWindow *) window, TRUE,
                                             g_object_ref (account), 
                                             retrieve_msg_contents_performer, 
                                             g_object_ref (headers));
@@ -4891,13 +5066,31 @@ modest_ui_actions_on_retrieve_msg_contents (GtkAction *action,
 }
 
 void
+modest_ui_actions_check_toolbar_dimming_rules (ModestWindow *window)
+{
+       g_return_if_fail (MODEST_IS_WINDOW (window));
+
+       /* Update dimmed */
+       modest_window_check_dimming_rules_group (window, MODEST_DIMMING_RULES_TOOLBAR);
+}
+
+void
+modest_ui_actions_check_menu_dimming_rules (ModestWindow *window)
+{
+       g_return_if_fail (MODEST_IS_WINDOW (window));
+
+       /* Update dimmed */
+       modest_window_check_dimming_rules_group (window, MODEST_DIMMING_RULES_MENU);
+}
+
+void
 modest_ui_actions_on_email_menu_activated (GtkAction *action,
                                          ModestWindow *window)
 {
        g_return_if_fail (MODEST_IS_WINDOW (window));
        
-       /* Update dimmed */     
-       modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");     
+       /* Update dimmed */
+       modest_ui_actions_check_menu_dimming_rules (window);
 }
 
 void
@@ -4906,8 +5099,8 @@ modest_ui_actions_on_edit_menu_activated (GtkAction *action,
 {
        g_return_if_fail (MODEST_IS_WINDOW (window));
 
-       /* Update dimmed */     
-       modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");     
+       /* Update dimmed */
+       modest_ui_actions_check_menu_dimming_rules (window);
 }
 
 void
@@ -4916,8 +5109,8 @@ modest_ui_actions_on_view_menu_activated (GtkAction *action,
 {
        g_return_if_fail (MODEST_IS_WINDOW (window));
 
-       /* Update dimmed */     
-       modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");     
+       /* Update dimmed */
+       modest_ui_actions_check_menu_dimming_rules (window);
 }
 
 void
@@ -4926,8 +5119,8 @@ modest_ui_actions_on_format_menu_activated (GtkAction *action,
 {
        g_return_if_fail (MODEST_IS_WINDOW (window));
 
-       /* Update dimmed */     
-       modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");     
+       /* Update dimmed */
+       modest_ui_actions_check_menu_dimming_rules (window);
 }
 
 void
@@ -4936,8 +5129,8 @@ modest_ui_actions_on_tools_menu_activated (GtkAction *action,
 {
        g_return_if_fail (MODEST_IS_WINDOW (window));
 
-       /* Update dimmed */     
-       modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");     
+       /* Update dimmed */
+       modest_ui_actions_check_menu_dimming_rules (window);
 }
 
 void
@@ -4946,8 +5139,8 @@ modest_ui_actions_on_attachment_menu_activated (GtkAction *action,
 {
        g_return_if_fail (MODEST_IS_WINDOW (window));
 
-       /* Update dimmed */     
-       modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");     
+       /* Update dimmed */
+       modest_ui_actions_check_menu_dimming_rules (window);
 }
 
 void
@@ -4956,8 +5149,8 @@ modest_ui_actions_on_toolbar_csm_menu_activated (GtkAction *action,
 {
        g_return_if_fail (MODEST_IS_WINDOW (window));
 
-       /* Update dimmed */     
-       modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");     
+       /* Update dimmed */
+       modest_ui_actions_check_menu_dimming_rules (window);
 }
 
 void
@@ -4966,8 +5159,8 @@ modest_ui_actions_on_folder_view_csm_menu_activated (GtkAction *action,
 {
        g_return_if_fail (MODEST_IS_WINDOW (window));
 
-       /* Update dimmed */     
-       modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");     
+       /* Update dimmed */
+       modest_ui_actions_check_menu_dimming_rules (window);
 }
 
 void
@@ -4976,17 +5169,8 @@ modest_ui_actions_on_header_view_csm_menu_activated (GtkAction *action,
 {
        g_return_if_fail (MODEST_IS_WINDOW (window));
 
-       /* Update dimmed */     
-       modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");     
-}
-
-void
-modest_ui_actions_check_toolbar_dimming_rules (ModestWindow *window)
-{
-       g_return_if_fail (MODEST_IS_WINDOW (window));
-
-       /* Update dimmed */     
-       modest_window_check_dimming_rules_group (window, "ModestToolbarDimmingRules");  
+       /* Update dimmed */
+       modest_ui_actions_check_menu_dimming_rules (window);
 }
 
 void
@@ -5080,7 +5264,7 @@ modest_ui_actions_on_send_queue_error_happened (TnySendQueue *self,
        gchar *message = NULL;
 
        /* Don't show anything if the user cancelled something */
-       if (err->code == TNY_TRANSPORT_ACCOUNT_ERROR_SEND_USER_CANCEL)
+       if (err->code == TNY_SYSTEM_ERROR_CANCEL)
                return;
 
        /* Get the server name: */
@@ -5097,20 +5281,20 @@ modest_ui_actions_on_send_queue_error_happened (TnySendQueue *self,
 
        /* Show the appropriate message text for the GError: */
        switch (err->code) {
-       case TNY_TRANSPORT_ACCOUNT_ERROR_SEND_HOST_LOOKUP_FAILED:
+       case TNY_SERVICE_ERROR_CONNECT:
                message = g_strdup_printf (_("emev_ib_ui_smtp_server_invalid"), server_name);
                break;
-       case TNY_TRANSPORT_ACCOUNT_ERROR_SEND_SERVICE_UNAVAILABLE:
-               message = g_strdup_printf (_("emev_ib_ui_smtp_server_invalid"), server_name);
-               break;
-       case TNY_TRANSPORT_ACCOUNT_ERROR_SEND_AUTHENTICATION_NOT_SUPPORTED:
+       case TNY_SERVICE_ERROR_AUTHENTICATE:
                message = g_strdup_printf (_("emev_ni_ui_smtp_authentication_fail_error"), server_name);
                break;
-       case TNY_TRANSPORT_ACCOUNT_ERROR_SEND:
+       case TNY_SERVICE_ERROR_SEND:
                message = g_strdup (_("emev_ib_ui_smtp_send_error"));
                break;
        default:
-               g_return_if_reached ();
+               g_warning ("%s: unexpected 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
@@ -5162,6 +5346,10 @@ modest_ui_actions_on_send_queue_status_changed (ModestTnySendQueue *send_queue,
 #else
        gtk_widget_queue_draw (header_view);
 #endif         
+
+       /* Rerun dimming rules, because the message could become deletable for example */
+       modest_window_check_dimming_rules_group (MODEST_WINDOW (main_window), 
+                                                MODEST_DIMMING_RULES_TOOLBAR);
        
        /* Free */
  frees: