* Migrated both the Folder and Message details dialog to Fremantle UI, now they...
[modest] / src / modest-ui-actions.c
index 1c20731..9f8395a 100644 (file)
@@ -41,7 +41,6 @@
 #include <modest-address-book.h>
 #include "modest-error.h"
 #include "modest-ui-actions.h"
-#include "modest-protocol-info.h"
 #include "modest-tny-platform-factory.h"
 #include "modest-platform.h"
 #include "modest-debug.h"
 
 #ifdef MODEST_PLATFORM_MAEMO
 #include "maemo/modest-osso-state-saving.h"
+#endif /* MODEST_PLATFORM_MAEMO */
+#ifndef MODEST_TOOLKIT_GTK
 #include "maemo/modest-hildon-includes.h"
 #include "maemo/modest-connection-specific-smtp-window.h"
-#endif /* MODEST_PLATFORM_MAEMO */
+#endif /* !MODEST_TOOLKIT_GTK */
 #include <modest-utils.h>
 
 #include "widgets/modest-ui-constants.h"
 #include "modest-text-utils.h"
 
 #ifdef MODEST_HAVE_EASYSETUP
+#ifdef MODEST_TOOLKIT_HILDON2
+#include "modest-easysetup-wizard-dialog.h"
+#else
 #include "easysetup/modest-easysetup-wizard-dialog.h"
+#endif
 #endif /* MODEST_HAVE_EASYSETUP */
 
 #include <modest-widget-memory.h>
 
 #include <gtkhtml/gtkhtml.h>
 
+#define MIN_FREE_SPACE 5 * 1024 * 1024
+#define MOVE_FOLDER_OK_BUTTON "ok-button"
+#define MOVE_FOLDER_NEW_BUTTON "new-button"
+
 typedef struct _GetMsgAsyncHelper {    
        ModestWindow *window;
        ModestMailOperation *mail_op;
@@ -155,7 +164,7 @@ static gboolean connect_to_get_msg (ModestWindow *win,
                                    gint num_of_uncached_msgs,
                                    TnyAccount *account);
 
-static gboolean remote_folder_is_pop (TnyFolderStore *folder);
+static gboolean remote_folder_has_leave_on_server (TnyFolderStore *folder);
 
 static void     do_create_folder (GtkWindow *window, 
                                  TnyFolderStore *parent_folder, 
@@ -169,18 +178,19 @@ static TnyAccount *get_account_from_folder_store (TnyFolderStore *folder_store);
  * This function checks whether a TnyFolderStore is a pop account
  */
 static gboolean
-remote_folder_is_pop (TnyFolderStore *folder)
+remote_folder_has_leave_on_server (TnyFolderStore *folder)
 {
-        const gchar *proto = NULL;
-        TnyAccount *account = NULL;
+        TnyAccount *account;
+       gboolean result;
 
         g_return_val_if_fail (TNY_IS_FOLDER_STORE (folder), FALSE);
        
        account = get_account_from_folder_store (folder);
-        proto = tny_account_get_proto (account);
+       result = (modest_protocol_registry_protocol_type_has_leave_on_server (modest_runtime_get_protocol_registry (),
+                                                                             modest_tny_account_get_protocol_type (account)));
         g_object_unref (account);
 
-        return (modest_protocol_info_get_transport_store_protocol (proto) == MODEST_PROTOCOL_STORE_POP);
+       return result;
 }
 
 /* FIXME: this should be merged with the similar code in modest-account-view-window */
@@ -191,22 +201,12 @@ gboolean
 modest_ui_actions_run_account_setup_wizard (ModestWindow *win)
 {
        gboolean result = FALSE;        
-       GtkWindow *dialog, *wizard;
+       GtkWindow *wizard;
        gint dialog_response;
 
-       /* Show the easy-setup wizard: */       
-       dialog = modest_window_mgr_get_modal (modest_runtime_get_window_mgr());
-       if (dialog) {
-               /* old wizard is active already; 
-                */
-               gtk_window_present (GTK_WINDOW(dialog));
-               return FALSE;
-       }
-       
-
        /* there is no such wizard yet */       
        wizard = GTK_WINDOW (modest_platform_get_account_settings_wizard ());
-       modest_window_mgr_set_modal (modest_runtime_get_window_mgr(), wizard);
+       modest_window_mgr_set_modal (modest_runtime_get_window_mgr(), GTK_WINDOW (wizard), (GtkWindow *) win);
 
        /* always present a main window in the background 
         * we do it here, so we cannot end up with two wizards (as this
@@ -215,10 +215,19 @@ modest_ui_actions_run_account_setup_wizard (ModestWindow *win)
                win = modest_window_mgr_get_main_window (modest_runtime_get_window_mgr(),
                                                         TRUE);  /* create if not existent */
        
-       /* make sure the mainwindow is visible */
        gtk_window_set_transient_for (GTK_WINDOW (wizard), GTK_WINDOW (win));
-       gtk_widget_show_all (GTK_WIDGET(win));
-       gtk_window_present (GTK_WINDOW(win));
+
+       /* make sure the mainwindow is visible. We need to present the
+          wizard again to give it the focus back. show_all are needed
+          in order to get the widgets properly drawn (MainWindow main
+          paned won't be in its right position and the dialog will be
+          missplaced */
+#ifndef MODEST_TOOLKIT_HILDON2
+       gtk_widget_show_all (GTK_WIDGET (win));
+       gtk_widget_show_all (GTK_WIDGET (wizard));
+       gtk_window_present (GTK_WINDOW (win));
+       gtk_window_present (GTK_WINDOW (wizard));
+#endif
        
        dialog_response = gtk_dialog_run (GTK_DIALOG (wizard));
        gtk_widget_destroy (GTK_WIDGET (wizard));
@@ -512,7 +521,6 @@ modest_ui_actions_on_delete_message (GtkAction *action, ModestWindow *win)
 
                        /* Select next or previous row */
                        if (gtk_tree_row_reference_valid (next_row_reference)) {
-/*                             next_path = gtk_tree_row_reference_get_path (row_reference); */
                                gtk_tree_selection_select_path (sel, next_path);
                        }
                        else if (gtk_tree_row_reference_valid (prev_row_reference)) {                           
@@ -531,8 +539,10 @@ modest_ui_actions_on_delete_message (GtkAction *action, ModestWindow *win)
                }
                
                /* Update toolbar dimming state */
-               if (main_window)
+               if (main_window) {
+                       modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (main_window));
                        modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
+               }
 
                /* Free */
                g_list_foreach (sel_list, (GFunc) gtk_tree_path_free, NULL);
@@ -651,7 +661,7 @@ modest_ui_actions_on_accounts (GtkAction *action,
                GtkWindow *account_win = GTK_WINDOW (modest_account_view_window_new ());
                
                /* The accounts dialog must be modal */
-               modest_window_mgr_set_modal (modest_runtime_get_window_mgr (), account_win);
+               modest_window_mgr_set_modal (modest_runtime_get_window_mgr (), GTK_WINDOW (account_win), (GtkWindow *) win);
                modest_utils_show_dialog_and_forget (GTK_WINDOW (win), GTK_DIALOG (account_win)); 
        }
 }
@@ -663,7 +673,7 @@ modest_ui_actions_on_smtp_servers (GtkAction *action, ModestWindow *win)
         * because it requires an API (libconic) to detect different connection 
         * possiblities.
         */
-#ifdef MODEST_PLATFORM_MAEMO /* Defined in config.h */
+#ifndef MODEST_TOOLKIT_GTK /* Defined in config.h */
        
        /* Create the window if necessary: */
        GtkWidget *specific_window = GTK_WIDGET (modest_connection_specific_smtp_window_new ());
@@ -673,9 +683,9 @@ modest_ui_actions_on_smtp_servers (GtkAction *action, ModestWindow *win)
 
        /* Show the window: */
        modest_window_mgr_set_modal (modest_runtime_get_window_mgr (), 
-                                    GTK_WINDOW (specific_window));
+                                    GTK_WINDOW (specific_window), (GtkWindow *) win);
        gtk_widget_show (specific_window);
-#endif /* MODEST_PLATFORM_MAEMO */
+#endif /* !MODEST_TOOLKIT_GTK */
 }
 
 void
@@ -705,7 +715,12 @@ modest_ui_actions_compose_msg(ModestWindow *win,
        if (attachments && modest_platform_check_memory_low (win, TRUE))
                goto cleanup;
 
-       account_name = modest_account_mgr_get_default_account(mgr);
+#ifdef MODEST_TOOLKIT_HILDON2
+       account_name = g_strdup (modest_window_get_active_account(win));
+#endif
+       if (!account_name) {
+               account_name = modest_account_mgr_get_default_account(mgr);
+       }
        if (!account_name) {
                g_printerr ("modest: no account found\n");
                goto cleanup;
@@ -728,9 +743,9 @@ modest_ui_actions_compose_msg(ModestWindow *win,
 
        signature = modest_account_mgr_get_signature (mgr, account_name, &use_signature);
        if (body_str != NULL) {
-               body = use_signature ? g_strconcat(body_str, "\n", signature, NULL) : g_strdup(body_str);
+               body = use_signature ? g_strconcat(body_str, "\n--\n", signature, NULL) : g_strdup(body_str);
        } else {
-               body = use_signature ? g_strconcat("\n", signature, NULL) : g_strdup("");
+               body = use_signature ? g_strconcat("\n--\n", signature, NULL) : g_strdup("");
        }
 
        msg = modest_tny_msg_new (to_str, from_str, cc_str, bcc_str, subject_str, body, NULL, NULL, NULL);
@@ -744,11 +759,18 @@ modest_ui_actions_compose_msg(ModestWindow *win,
        total_size = 0;
        allowed_size = MODEST_MAX_ATTACHMENT_SIZE;
        msg_win = modest_msg_edit_window_new (msg, account_name, FALSE);
+
+       if (!modest_window_mgr_register_window (modest_runtime_get_window_mgr(), msg_win, NULL)) {
+               gtk_widget_destroy (GTK_WIDGET (msg_win));
+               goto cleanup;
+       }
+       modest_msg_edit_window_set_modified (MODEST_MSG_EDIT_WINDOW (msg_win), set_as_modified);
+       gtk_widget_show_all (GTK_WIDGET (msg_win));
+
        while (attachments) {
                total_size +=
-                       modest_msg_edit_window_attach_file_one(
-                               (ModestMsgEditWindow *)msg_win,
-                               attachments->data, allowed_size);
+                       modest_msg_edit_window_attach_file_one((ModestMsgEditWindow *)msg_win,
+                                                              attachments->data, allowed_size);
 
                if (total_size > allowed_size) {
                        g_warning ("%s: total size: %u",
@@ -759,10 +781,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);
-       modest_msg_edit_window_set_modified (MODEST_MSG_EDIT_WINDOW (msg_win), set_as_modified);
-
-       gtk_widget_show_all (GTK_WIDGET (msg_win));
 
 cleanup:
        g_free (from_str);
@@ -773,8 +791,6 @@ cleanup:
                g_object_unref (G_OBJECT(account));
        if (folder)
                g_object_unref (G_OBJECT(folder));
-       if (msg_win)
-               g_object_unref (G_OBJECT(msg_win));
        if (msg)
                g_object_unref (G_OBJECT(msg));
 }
@@ -814,6 +830,17 @@ modest_ui_actions_msg_retrieval_check (ModestMailOperation *mail_op,
                        g_object_unref (source);
                }
 
+               if (error && ((error->code == TNY_SERVICE_ERROR_NO_SUCH_MESSAGE) ||
+                             error->code == TNY_SERVICE_ERROR_MESSAGE_NOT_AVAILABLE)) {
+                       gchar *subject, *msg;
+                       subject = tny_header_dup_subject (header);
+                       msg = g_strdup_printf (_("emev_ni_ui_imap_message_not_available_in_server"),
+                                              subject);
+                       modest_platform_run_information_dialog (NULL, msg, FALSE);
+                       g_free (msg);
+                       g_free (subject);
+               }
+
                /* Remove the header from the preregistered uids */
                modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (),  
                                                     header);
@@ -927,45 +954,28 @@ open_msg_cb (ModestMailOperation *mail_op,
        
        if (open_in_editor) {
                ModestAccountMgr *mgr = modest_runtime_get_account_mgr ();
-               gchar *from_header = NULL;
+               gchar *from_header = NULL, *acc_name;
 
                from_header = tny_header_dup_from (header);
 
                /* we cannot edit without a valid account... */
                if (!modest_account_mgr_has_accounts(mgr, TRUE)) {
                        if (!modest_ui_actions_run_account_setup_wizard(parent_win)) {
-                               modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (), 
+                               modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (),
                                                                     header);
                                g_free (from_header);
                                goto cleanup;
                        }
                }
-               
-               if (from_header) {
-                       GSList *accounts = modest_account_mgr_account_names (mgr, TRUE);
-                       GSList *node = NULL;
-
-                       for (node = accounts; node != NULL; node = g_slist_next (node)) {
-                               gchar *from = modest_account_mgr_get_from_string (mgr, node->data);
-                               
-                               if (from && (strcmp (from_header, from) == 0)) {
-                                       g_free (account);
-                                       account = g_strdup (node->data);
-                                       g_free (from);
-                                       break;
-                               }
-                               g_free (from);
-                       }
 
-                       g_free (from_header);
-                       g_slist_foreach (accounts, (GFunc) g_free, NULL);
-                       g_slist_free (accounts);
+               acc_name = modest_utils_get_account_name_from_recipient (from_header);
+               g_free (from_header);
+               if (acc_name) {
+                       g_free (account);
+                       account = acc_name;
                }
 
                win = modest_msg_edit_window_new (msg, account, TRUE);
-
-
-
        } else {
                gchar *uid = modest_tny_folder_get_header_unique_id (header);
                
@@ -985,8 +995,10 @@ open_msg_cb (ModestMailOperation *mail_op,
        /* Register and show new window */
        if (win != NULL) {
                mgr = modest_runtime_get_window_mgr ();
-               modest_window_mgr_register_window (mgr, win);
-               g_object_unref (win);
+               if (!modest_window_mgr_register_window (mgr, win, NULL)) {
+                       gtk_widget_destroy (GTK_WIDGET (win));
+                       goto cleanup;
+               }
                gtk_widget_show_all (GTK_WIDGET(win));
        }
 
@@ -1005,15 +1017,56 @@ cleanup:
 static gboolean
 is_memory_full_error (GError *error)
 {
-       if (error->code == TNY_SYSTEM_ERROR_MEMORY ||
-           error->code == TNY_IO_ERROR_WRITE ||
-           error->code == TNY_IO_ERROR_READ) {
+       gboolean enough_free_space = TRUE;
+       GnomeVFSURI *cache_dir_uri;
+       const gchar *cache_dir;
+       GnomeVFSFileSize free_space;
+
+       cache_dir = tny_account_store_get_cache_dir (TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()));
+       cache_dir_uri = gnome_vfs_uri_new (cache_dir);
+       if (gnome_vfs_get_volume_free_space (cache_dir_uri, &free_space) == GNOME_VFS_OK) {
+               if (free_space < MIN_FREE_SPACE)
+                       enough_free_space = FALSE;
+       }
+       gnome_vfs_uri_unref (cache_dir_uri);
+
+       if ((error->code == TNY_SYSTEM_ERROR_MEMORY ||
+            /* When asking for a mail and no space left on device
+               tinymail returns this error */
+            error->code == TNY_SERVICE_ERROR_MESSAGE_NOT_AVAILABLE ||
+            /* When the folder summary could not be read or
+               written */
+            error->code == TNY_IO_ERROR_WRITE ||
+            error->code == TNY_IO_ERROR_READ) && 
+           !enough_free_space) {
                return TRUE;
        } else {
                return FALSE;
        }
 }
 
+static gboolean
+check_memory_full_error (GtkWidget *parent_window, GError *err)
+{
+       if (err == NULL)
+               return FALSE;
+
+       if (is_memory_full_error (err))
+               modest_platform_information_banner (parent_window,
+                                                   NULL, dgettext("ke-recv",
+                                                                  "cerm_device_memory_full"));
+       else if (err->code == TNY_SYSTEM_ERROR_MEMORY)
+               /* If the account was created in memory full
+                  conditions then tinymail won't be able to
+                  connect so it'll return this error code */                           
+               modest_platform_information_banner (parent_window,
+                                                   NULL, _("emev_ui_imap_inbox_select_error"));
+       else
+               return FALSE;
+
+       return TRUE;
+}
+
 void
 modest_ui_actions_disk_operations_error_handler (ModestMailOperation *mail_op,
                                                 gpointer user_data)
@@ -1033,7 +1086,11 @@ modest_ui_actions_disk_operations_error_handler (ModestMailOperation *mail_op,
                        modest_platform_information_banner ((GtkWidget *) win,
                                                            NULL, dgettext("ke-recv",
                                                                           "cerm_device_memory_full"));
-               } else if (error->code == MODEST_MAIL_OPERATION_ERROR_FILE_IO) {
+               } else if (error->code == TNY_SYSTEM_ERROR_MEMORY) {
+                       modest_platform_information_banner ((GtkWidget *) win,
+                                                           NULL, _("emev_ui_imap_inbox_select_error"));
+               } else if (error->domain == MODEST_MAIL_OPERATION_ERROR &&
+                          error->code == MODEST_MAIL_OPERATION_ERROR_FILE_IO) {
                        modest_platform_information_banner ((GtkWidget *) win,
                                                            NULL, dgettext ("hildon-common-strings", "sfil_ni_unable_to_open_file_not_found"));
                } else if (user_data) {
@@ -1130,9 +1187,8 @@ open_msgs_performer(gboolean canceled,
                    gpointer user_data)
 {
        ModestMailOperation *mail_op = NULL;
-       const gchar *proto_name;
        gchar *error_msg;
-       ModestTransportStoreProtocol proto;
+       ModestProtocolType proto;
        TnyList *not_opened_headers;
        TnyConnectionStatus status;
        gboolean show_open_draft = FALSE;
@@ -1150,36 +1206,43 @@ open_msgs_performer(gboolean canceled,
                open_msgs_helper_destroyer (helper);
 
                /* In memory full conditions we could get this error here */
-               if (err && is_memory_full_error (err)) {
-                       modest_platform_information_banner ((GtkWidget *) parent_window,
-                                                           NULL, dgettext("ke-recv",
-                                                                          "cerm_device_memory_full"));
-               }
+               check_memory_full_error ((GtkWidget *) parent_window, err);
+
                goto clean;
        }
 
        /* 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;
+       proto = modest_tny_account_get_protocol_type (account);
+       if (proto == MODEST_PROTOCOL_REGISTRY_TYPE_INVALID) {
+               proto = MODEST_PROTOCOLS_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));
-                       gchar *subject = tny_header_dup_subject (header);
-                       error_msg = g_strdup_printf (_("emev_ni_ui_imap_message_not_available_in_server"),
-                                                    subject);
-                       g_free (subject);
-                       g_object_unref (header);
-                       g_object_unref (iter);
-               } else {
+               ModestProtocol *protocol;
+               ModestProtocolRegistry *protocol_registry;
+               TnyIterator *iter;
+               TnyHeader *header;
+               gchar *subject;
+
+               protocol_registry = modest_runtime_get_protocol_registry ();
+               iter = tny_list_create_iterator (not_opened_headers);
+               header = TNY_HEADER (tny_iterator_get_current (iter));
+               subject = tny_header_dup_subject (header);
+
+               protocol = modest_protocol_registry_get_protocol_by_type (protocol_registry, proto);
+               error_msg = modest_protocol_get_translation (protocol, MODEST_PROTOCOL_TRANSLATION_MSG_NOT_AVAILABLE, subject);
+               g_free (subject);
+               g_object_unref (header);
+               g_object_unref (iter);
+               
+               if (error_msg == NULL) {
+                       error_msg = g_strdup (_("mail_ni_ui_folder_get_msg_folder_error"));
+               }
+
+               if (modest_protocol_registry_protocol_type_has_tag (protocol_registry,
+                                                                   proto,
+                                                                   MODEST_PROTOCOL_REGISTRY_LOCAL_STORE_PROTOCOLS)) { 
                        TnyHeader *header;
                        TnyFolder *folder;
                        TnyIterator *iter;
@@ -1193,7 +1256,6 @@ open_msgs_performer(gboolean canceled,
                        g_object_unref (folder);
                        g_object_unref (header);
                        g_object_unref (iter);
-                       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"));
@@ -1300,7 +1362,9 @@ open_msgs_from_headers (TnyList *headers, ModestWindow *win)
                   window to the user */
                if (found) {
                        if (window) {
+#ifndef MODEST_TOOLKIT_HILDON2
                                gtk_window_present (GTK_WINDOW (window));
+#endif
                        } else {
                                /* the header has been registered already, we don't do
                                 * anything but wait for the window to come up*/
@@ -1509,6 +1573,8 @@ reply_forward_cb (ModestMailOperation *mail_op,
                edit_type = MODEST_EDIT_TYPE_FORWARD;
                break;
        default:
+               modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (),
+                                                    header);
                g_return_if_reached ();
                return;
        }
@@ -1532,7 +1598,7 @@ reply_forward_cb (ModestMailOperation *mail_op,
        /* Create and register the windows */
        msg_win = modest_msg_edit_window_new (new_msg, rf_helper->account_name, FALSE);
        mgr = modest_runtime_get_window_mgr ();
-       modest_window_mgr_register_window (mgr, msg_win);
+       modest_window_mgr_register_window (mgr, msg_win, (ModestWindow *) rf_helper->parent_window);
 
        if (rf_helper->parent_window != NULL) {
                gdouble parent_zoom;
@@ -1545,8 +1611,11 @@ reply_forward_cb (ModestMailOperation *mail_op,
        gtk_widget_show_all (GTK_WIDGET (msg_win));
 
 cleanup:
-       if (msg_win)
-               g_object_unref (msg_win);
+       /* We always unregister the header because the message is
+          forwarded or replied so the original one is no longer
+          opened */
+       modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (),
+                                            header);
        if (new_msg)
                g_object_unref (G_OBJECT (new_msg));
        if (account)
@@ -1625,6 +1694,7 @@ reply_forward_performer (gboolean canceled,
        }
 
        /* Retrieve the message */
+       modest_window_mgr_register_header (modest_runtime_get_window_mgr (), rf_helper->header, NULL);
        mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT (parent_window),
                                                                 modest_ui_actions_disk_operations_error_handler,
                                                                 NULL, NULL);
@@ -1695,7 +1765,10 @@ reply_forward (ReplyForwardAction action, ModestWindow *win)
                header_list = get_selected_headers (win);
                if (!header_list)
                        return;
-               if (tny_list_get_length (header_list) == 0) {
+               /* Check that only one message is selected for replying */
+               if (tny_list_get_length (header_list) != 1) {
+                       modest_platform_information_banner ((win) ? GTK_WIDGET (win) : NULL,
+                                                           NULL, _("mcen_ib_select_one_message"));
                        g_object_unref (header_list);
                        return;
                }
@@ -1854,7 +1927,7 @@ modest_ui_actions_on_sort (GtkAction *action,
                }
 
                /* Show sorting dialog */
-               modest_platform_run_sort_dialog (GTK_WINDOW (window), MODEST_SORT_HEADERS);     
+               modest_utils_run_sort_dialog (GTK_WINDOW (window), MODEST_SORT_HEADERS);        
        }
 }
 
@@ -1926,11 +1999,8 @@ do_send_receive_performer (gboolean canceled,
 
        if (err || canceled) {
                /* In memory full conditions we could get this error here */
-               if (err && is_memory_full_error (err)) {
-                       modest_platform_information_banner ((GtkWidget *) parent_window,
-                                                           NULL, dgettext("ke-recv",
-                                                                          "cerm_device_memory_full"));
-               }
+               check_memory_full_error ((GtkWidget *) parent_window, err);
+
                if (info->mail_op) {
                        modest_mail_operation_queue_remove (modest_runtime_get_mail_operation_queue (),
                                                            info->mail_op);
@@ -2210,8 +2280,10 @@ modest_ui_actions_on_header_selected (ModestHeaderView *header_view,
                        GtkWidget *folder_view = 
                                modest_main_window_get_child_widget (main_window,
                                                                     MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
-                       if (folder != NULL) 
+                       if (folder != NULL) {
                                modest_folder_view_select_folder (MODEST_FOLDER_VIEW (folder_view), folder, FALSE);
+                               g_object_unref (folder);
+                       }
                        gtk_widget_grab_focus (GTK_WIDGET (folder_view));
                        return;
                }
@@ -2302,7 +2374,7 @@ folder_refreshed_cb (ModestMailOperation *mail_op,
                     gpointer user_data)
 {
        ModestMainWindow *win = NULL;
-       GtkWidget *header_view;
+       GtkWidget *folder_view;
        const GError *error;
 
        g_return_if_fail (TNY_IS_FOLDER (folder));
@@ -2319,18 +2391,19 @@ folder_refreshed_cb (ModestMailOperation *mail_op,
                return;
        }
 
-       header_view = 
-               modest_main_window_get_child_widget(win, MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
+       folder_view = 
+               modest_main_window_get_child_widget(win, MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
 
-       if (header_view) {
-               TnyFolder *current_folder;
+       if (folder_view) {
+               TnyFolderStore *current_folder;
 
-               current_folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
-               if (current_folder != NULL && folder != current_folder) {
-                       g_object_unref (current_folder);
-                       return;
-               } else if (current_folder)
+               current_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
+               if (current_folder) {
+                       gboolean different = ((TnyFolderStore *) folder != current_folder);
                        g_object_unref (current_folder);
+                       if (different)
+                               return;
+               }
        }
 
        /* Check if folder is empty and set headers view contents style */
@@ -2369,7 +2442,6 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
                if (TNY_IS_FOLDER (folder_store) && selected) {
                        TnyAccount *account;
                        const gchar *account_name = NULL;
-                       gboolean refresh;
 
                        /* Update the active account */
                        account = modest_tny_folder_get_account (TNY_FOLDER (folder_store));
@@ -2387,8 +2459,6 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
                        modest_main_window_set_contents_style (main_window, 
                                                               MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS);
 
-                       refresh = !modest_account_mgr_account_is_busy (modest_runtime_get_account_mgr (), account_name);
-
                        /* Set folder on header view. This function
                           will call tny_folder_refresh_async so we
                           pass a callback that will be called when
@@ -2396,7 +2466,7 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
                           empty view if there are no messages */
                        modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view),
                                                       TNY_FOLDER (folder_store),
-                                                      refresh,
+                                                      TRUE,
                                                       folder_refreshed_cb,
                                                       main_window);
                        
@@ -2414,7 +2484,7 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
                           already being done by the sort
                           dialog. Remove it when the GNOME version
                           has the same behaviour */
-#ifdef MODEST_PLATFORM_GNOME
+#ifdef MODEST_TOOLKIT_GTK
                        if (modest_main_window_get_contents_style (main_window) ==
                            MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS)
                                modest_widget_memory_save (conf, G_OBJECT (header_view), 
@@ -2547,37 +2617,31 @@ on_save_to_drafts_cb (ModestMailOperation *mail_op,
        g_object_unref(edit_window);
 }
 
-gboolean
-modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edit_window)
+static gboolean
+enough_space_for_message (ModestMsgEditWindow *edit_window,
+                         MsgData *data)
 {
-       TnyTransportAccount *transport_account;
-       ModestMailOperation *mail_operation;
-       MsgData *data;
-       gchar *account_name, *from;
-       ModestAccountMgr *account_mgr;
-/*     char *info_text; */
-       gboolean had_error = FALSE;
+       TnyAccountStore *acc_store;
        guint64 available_disk, expected_size;
        gint parts_count;
        guint64 parts_size;
-       ModestMainWindow *win;
-
-       g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window), FALSE);
-       
-       data = modest_msg_edit_window_get_msg_data (edit_window);
 
        /* Check size */
-       available_disk = modest_folder_available_space (NULL);
+       acc_store = TNY_ACCOUNT_STORE (modest_runtime_get_account_store());
+       available_disk = modest_utils_get_available_space (NULL);
        modest_msg_edit_window_get_parts_size (edit_window, &parts_count, &parts_size);
        expected_size = modest_tny_msg_estimate_size (data->plain_body,
-                                                data->html_body,
-                                                parts_count,
-                                                parts_size);
+                                                     data->html_body,
+                                                     parts_count,
+                                                     parts_size);
 
-       if ((available_disk != -1) && expected_size > available_disk) {
-               modest_msg_edit_window_free_msg_data (edit_window, data);
+       /* Double check: memory full condition or message too big */
+       if (available_disk < MIN_FREE_SPACE || 
+           expected_size > available_disk) {
 
-               modest_platform_information_banner (NULL, NULL, dgettext("ke-recv", "cerm_device_memory_full"));
+               modest_platform_information_banner (NULL, NULL, 
+                                                   dgettext("ke-recv", 
+                                                            "cerm_device_memory_full"));
                return FALSE;
        }
 
@@ -2587,13 +2651,9 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
         * MODEST_MAX_LOW_MEMORY_MESSAGE_SIZE (see modest-defs.h) this
         * should still allow for sending anything critical...
         */
-       if (expected_size > MODEST_MAX_LOW_MEMORY_MESSAGE_SIZE) {
-
-               if (modest_platform_check_memory_low (MODEST_WINDOW(edit_window), TRUE)) {
-                       modest_msg_edit_window_free_msg_data (edit_window, data);
-                       return FALSE;
-               }
-       }
+       if ((expected_size > MODEST_MAX_LOW_MEMORY_MESSAGE_SIZE) &&
+           modest_platform_check_memory_low (MODEST_WINDOW(edit_window), TRUE))
+               return FALSE;
 
        /*
         * djcb: we also make sure that the attachments are smaller than the max size
@@ -2606,6 +2666,29 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
                        GTK_WINDOW(edit_window),
                        dgettext("ke-recv","memr_ib_operation_disabled"),
                        TRUE);
+               return FALSE;
+       }
+
+       return TRUE;
+}
+
+gboolean
+modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edit_window)
+{
+       TnyTransportAccount *transport_account;
+       ModestMailOperation *mail_operation;
+       MsgData *data;
+       gchar *account_name, *from;
+       ModestAccountMgr *account_mgr;
+       gboolean had_error = FALSE;
+       ModestMainWindow *win = NULL;
+
+       g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window), FALSE);
+       
+       data = modest_msg_edit_window_get_msg_data (edit_window);
+
+       /* Check size */
+       if (!enough_space_for_message (edit_window, data)) {
                modest_msg_edit_window_free_msg_data (edit_window, data);
                return FALSE;
        }
@@ -2628,7 +2711,7 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
 
        transport_account =
                TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_server_account
-                                     (modest_runtime_get_account_store(),
+                                     (modest_runtime_get_account_store (),
                                       account_name,
                                       TNY_ACCOUNT_TYPE_TRANSPORT));
        if (!transport_account) {
@@ -2660,6 +2743,14 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
                                              on_save_to_drafts_cb,
                                              g_object_ref(edit_window));
 
+#ifdef MODEST_TOOLKIT_HILDON2
+       /* In hildon2 we always show the information banner on saving to drafts.
+        * It will be a system information banner in this case.
+        */
+       gchar *text = g_strdup_printf (_("mail_va_saved_to_drafts"), _("mcen_me_folder_drafts"));
+       modest_platform_information_banner (NULL, NULL, text);
+       g_free (text);
+#else
        /* Use the main window as the parent of the banner, if the
           main window does not exist it won't be shown, if the parent
           window exists then it's properly shown. We don't use the
@@ -2672,6 +2763,7 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
                modest_platform_information_banner (GTK_WIDGET (win), NULL, text);
                g_free (text);
        }
+#endif
        modest_msg_edit_window_set_modified (edit_window, FALSE);
 
        /* Frees */
@@ -2726,62 +2818,27 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
 {
        TnyTransportAccount *transport_account = NULL;
        gboolean had_error = FALSE;
-       guint64 available_disk, expected_size;
-       gint parts_count;
-       guint64 parts_size;
+       MsgData *data;
+       ModestAccountMgr *account_mgr;
+       gchar *account_name;
+       gchar *from;
+       ModestMailOperation *mail_operation;
 
        g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window), TRUE);
 
        if (!modest_msg_edit_window_check_names (edit_window, TRUE))
                return TRUE;
        
-       MsgData *data = modest_msg_edit_window_get_msg_data (edit_window);
+       data = modest_msg_edit_window_get_msg_data (edit_window);
 
        /* Check size */
-       available_disk = modest_folder_available_space (NULL);
-       modest_msg_edit_window_get_parts_size (edit_window, &parts_count, &parts_size);
-       expected_size = modest_tny_msg_estimate_size (data->plain_body,
-                                                data->html_body,
-                                                parts_count,
-                                                parts_size);
-
-       if ((available_disk != -1) && expected_size > available_disk) {
-               modest_msg_edit_window_free_msg_data (edit_window, data);
-
-               modest_platform_information_banner (NULL, NULL, dgettext("ke-recv", "cerm_device_memory_full"));
-               return FALSE;
-       }
-
-       
-       /*
-        * djcb: if we're in low-memory state, we only allow for sending messages
-        * smaller than MODEST_MAX_LOW_MEMORY_MESSAGE_SIZE (see modest-defs.h)
-        * this should still allow for sending anything critical... 
-        */
-       if (expected_size > MODEST_MAX_LOW_MEMORY_MESSAGE_SIZE) {
-               if (modest_platform_check_memory_low (MODEST_WINDOW(edit_window), TRUE)) {
-                       modest_msg_edit_window_free_msg_data (edit_window, data);
-                       return FALSE;
-               }
-       }
-
-       /*
-        * djcb: we also make sure that the attachments are smaller than the max size
-        * this is for the case where we'd try to forward a message with attachments 
-        * bigger than our max allowed size, or sending an message from drafts which
-        * somehow got past our checks when attaching.
-        */
-       if (expected_size > MODEST_MAX_ATTACHMENT_SIZE) {
-               modest_platform_run_information_dialog (
-                       GTK_WINDOW(edit_window),
-                       dgettext("ke-recv","memr_ib_operation_disabled"),
-                       TRUE);
+       if (!enough_space_for_message (edit_window, data)) {
                modest_msg_edit_window_free_msg_data (edit_window, data);
                return FALSE;
        }
 
-       ModestAccountMgr *account_mgr = modest_runtime_get_account_mgr();
-       gchar *account_name = g_strdup (data->account_name);
+       account_mgr = modest_runtime_get_account_mgr();
+       account_name = g_strdup (data->account_name);
        if (!account_name)
                account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
 
@@ -2798,9 +2855,10 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
        
        /* Get the currently-active transport account for this modest account: */
        if (strcmp (account_name, MODEST_LOCAL_FOLDERS_ACCOUNT_ID) != 0) {
-               transport_account = TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_server_account
-                                                         (modest_runtime_get_account_store(),
-                                                          account_name, TNY_ACCOUNT_TYPE_TRANSPORT));
+               transport_account = 
+                       TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_server_account
+                                             (modest_runtime_get_account_store (), 
+                                              account_name, TNY_ACCOUNT_TYPE_TRANSPORT));
        }
        
        if (!transport_account) {
@@ -2810,17 +2868,17 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
                        return TRUE;
        }
        
-       gchar *from = modest_account_mgr_get_from_string (account_mgr, account_name);
 
        /* Create the mail operation */
-       ModestMailOperation *mail_operation = modest_mail_operation_new_with_error_handling (NULL, modest_ui_actions_disk_operations_error_handler, NULL, NULL);
+       from = modest_account_mgr_get_from_string (account_mgr, account_name);
+       mail_operation = modest_mail_operation_new_with_error_handling (NULL, modest_ui_actions_disk_operations_error_handler, NULL, NULL);
        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
 
        modest_mail_operation_send_new_mail (mail_operation,
                                             transport_account,
                                             data->draft_msg,
                                             from,
-                                            data->to, 
+                                            data->to,
                                             data->cc, 
                                             data->bcc,
                                             data->subject, 
@@ -2836,7 +2894,8 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
 
        if (modest_mail_operation_get_error (mail_operation) != NULL) {
                const GError *error = modest_mail_operation_get_error (mail_operation);
-               if (error->code == MODEST_MAIL_OPERATION_ERROR_INSTANCE_CREATION_FAILED) {
+               if (error->domain == MODEST_MAIL_OPERATION_ERROR &&
+                   error->code == MODEST_MAIL_OPERATION_ERROR_INSTANCE_CREATION_FAILED) {
                        g_warning ("%s failed: %s\n", __FUNCTION__, (modest_mail_operation_get_error (mail_operation))->message);
                        modest_platform_information_banner (NULL, NULL, _CS("sfil_ni_not_enough_memory"));
                        had_error = TRUE;
@@ -3013,6 +3072,38 @@ modest_ui_actions_on_remove_attachments (GtkAction *action,
        modest_msg_edit_window_remove_attachments (window, NULL);
 }
 
+
+#ifndef MODEST_TOOLKIT_GTK
+typedef struct {
+       guint handler;
+       gchar *name;
+       GtkWindow *win;
+       TnyFolderStore *folder;
+} CreateFolderHelper;
+
+static gboolean
+show_create_folder_in_timeout (gpointer data)
+{
+       CreateFolderHelper *helper = (CreateFolderHelper *) data;
+
+       /* Remove the timeout ASAP, we can not wait until the dialog
+          is shown because it could take a lot of time and so the
+          timeout could be called twice or more times */
+       g_source_remove (helper->handler);
+
+       gdk_threads_enter ();
+       do_create_folder (helper->win, helper->folder, helper->name);
+       gdk_threads_leave ();
+
+       g_object_unref (helper->win);
+       g_object_unref (helper->folder);
+       g_free (helper->name);
+       g_slice_free (CreateFolderHelper, helper);
+
+       return FALSE;
+}
+#endif
+
 static void
 do_create_folder_cb (ModestMailOperation *mail_op,
                     TnyFolderStore *parent_folder, 
@@ -3037,7 +3128,21 @@ do_create_folder_cb (ModestMailOperation *mail_op,
                /* Try again. Do *NOT* show any error because the mail
                   operations system will do it for us because we
                   created the mail_op with new_with_error_handler */
+#ifndef MODEST_TOOLKIT_GTK
+               CreateFolderHelper *helper;
+               helper = g_slice_new0 (CreateFolderHelper);
+               helper->name = g_strdup (suggested_name);
+               helper->folder = g_object_ref (parent_folder);
+               helper->win = g_object_ref (source_win);
+
+               /* Ugly but neccesary stuff. The problem is that the
+                  dialog when is shown calls a function that destroys
+                  all the temporary windows, so the banner is
+                  destroyed */
+               helper->handler = g_timeout_add (2000, show_create_folder_in_timeout, helper);
+#else
                do_create_folder (source_win, parent_folder, (const gchar *) suggested_name);
+#endif
        } else {
                /* the 'source_win' is either the ModestMainWindow, or the 'Move to folder'-dialog
                 * FIXME: any other? */         
@@ -3103,11 +3208,7 @@ create_folder_performer (gboolean canceled,
 
        if (canceled || err) {
                /* In memory full conditions we could get this error here */
-               if (err && is_memory_full_error (err)) {
-                       modest_platform_information_banner ((GtkWidget *) parent_window,
-                                                           NULL, dgettext("ke-recv",
-                                                                          "cerm_device_memory_full"));
-               }
+               check_memory_full_error ((GtkWidget *) parent_window, err);
                goto frees;
        }
 
@@ -3163,16 +3264,15 @@ modest_ui_actions_rename_folder_error_handler (ModestMailOperation *mail_op,
        if (!error)
                g_return_if_reached ();
 
-       switch (error->code) {
-       case MODEST_MAIL_OPERATION_ERROR_FOLDER_EXISTS:
+       if (error->domain == MODEST_MAIL_OPERATION_ERROR &&
+           error->code == MODEST_MAIL_OPERATION_ERROR_FOLDER_EXISTS) {
                message = _CS("ckdg_ib_folder_already_exists");
-               break;
-       case TNY_SERVICE_ERROR_STATE:
+       } else if (error->domain == TNY_ERROR_DOMAIN &&
+                  error->code == TNY_SERVICE_ERROR_STATE) {
                /* This means that the folder is already in use (a
                   message is opened for example */
                message = _("emev_ni_internal_error");
-               break;
-       default:
+       } else {
                message = _("emev_ib_ui_imap_unable_to_rename");
        }
 
@@ -3222,11 +3322,7 @@ on_rename_folder_performer (gboolean canceled,
 
        if (canceled || err) {
                /* In memory full conditions we could get this error here */
-               if (err && is_memory_full_error (err)) {
-                       modest_platform_information_banner ((GtkWidget *) parent_window,
-                                                           NULL, dgettext("ke-recv",
-                                                                          "cerm_device_memory_full"));
-               }
+               check_memory_full_error ((GtkWidget *) parent_window, err);
        } else if (MODEST_IS_MAIN_WINDOW(parent_window)) {
 
                folder_view = modest_main_window_get_child_widget (
@@ -3243,7 +3339,7 @@ on_rename_folder_performer (gboolean canceled,
 
                /* Clear the headers view */
                sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_view));
-               gtk_tree_selection_unselect_all (sel);
+               gtk_tree_selection_unselect_all (sel);
 
                /* Actually rename the folder */
                modest_mail_operation_rename_folder (mail_op,
@@ -3251,6 +3347,7 @@ on_rename_folder_performer (gboolean canceled,
                                                     (const gchar *) (data->new_name),
                                                     on_rename_folder_cb,
                                                     folder_view);
+               g_object_unref (data->folder);
                g_object_unref (mail_op);
        }
 
@@ -3302,7 +3399,7 @@ modest_ui_actions_on_rename_folder (GtkAction *action,
                        do_rename = FALSE;
                } else {
                        RenameFolderInfo *rename_folder_data = g_new0 (RenameFolderInfo, 1);
-                       rename_folder_data->folder = folder;
+                       rename_folder_data->folder = g_object_ref (folder);
                        rename_folder_data->new_name = folder_name;
                        modest_platform_connect_if_remote_and_perform (GTK_WINDOW(main_window), TRUE,
                                        folder, on_rename_folder_performer, rename_folder_data);
@@ -3482,7 +3579,7 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
        if (remember)
                *remember = TRUE;
                
-#ifdef MODEST_PLATFORM_MAEMO
+#ifndef MODEST_TOOLKIT_GTK
        /* Maemo uses a different (awkward) button order,
         * It should probably just use gtk_alternative_dialog_button_order ().
         */
@@ -3503,9 +3600,9 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
                                              GTK_STOCK_OK,
                                              GTK_RESPONSE_ACCEPT,
                                              NULL);
-#endif /* MODEST_PLATFORM_MAEMO */
+#endif /* !MODEST_TOOLKIT_GTK */
 
-       modest_window_mgr_set_modal (modest_runtime_get_window_mgr(), GTK_WINDOW (dialog));
+       modest_window_mgr_set_modal (modest_runtime_get_window_mgr(), GTK_WINDOW (dialog), NULL);
        
        gchar *server_name = modest_account_mgr_get_server_account_hostname (
                modest_runtime_get_account_mgr(), server_account_name);
@@ -3544,7 +3641,7 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
         */
        gtk_widget_set_sensitive (entry_username, FALSE);
 
-#ifdef MODEST_PLATFORM_MAEMO
+#ifndef MODEST_TOOLKIT_GTK
        /* Auto-capitalization is the default, so let's turn it off: */
        hildon_gtk_entry_set_input_mode (GTK_ENTRY (entry_username), HILDON_GTK_INPUT_MODE_FULL);
        
@@ -3562,14 +3659,14 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
 #else 
        gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry_username,
                            TRUE, FALSE, 0);
-#endif /* MODEST_PLATFORM_MAEMO */     
+#endif /* !MODEST_TOOLKIT_GTK */       
                            
        /* password: */
        GtkWidget *entry_password = gtk_entry_new ();
        gtk_entry_set_visibility (GTK_ENTRY(entry_password), FALSE);
        /* gtk_entry_set_invisible_char (GTK_ENTRY(entry_password), "*"); */
        
-#ifdef MODEST_PLATFORM_MAEMO
+#ifndef MODEST_TOOLKIT_GTK
        /* Auto-capitalization is the default, so let's turn it off: */
        hildon_gtk_entry_set_input_mode (GTK_ENTRY (entry_password), 
                HILDON_GTK_INPUT_MODE_FULL | HILDON_GTK_INPUT_MODE_INVISIBLE);
@@ -3584,7 +3681,7 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
 #else 
        gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry_password,
                            TRUE, FALSE, 0);
-#endif /* MODEST_PLATFORM_MAEMO */     
+#endif /* !MODEST_TOOLKIT_GTK */       
 
        if (initial_username != NULL)
                gtk_widget_grab_focus (GTK_WIDGET (entry_password));
@@ -3746,9 +3843,16 @@ modest_ui_actions_on_copy (GtkAction *action,
                gtk_clipboard_set_can_store (clipboard, NULL, 0);
                gtk_clipboard_store (clipboard);
        } else if (GTK_IS_HTML (focused_widget)) {
-               gtk_html_copy (GTK_HTML (focused_widget));
-               gtk_clipboard_set_can_store (clipboard, NULL, 0);
-               gtk_clipboard_store (clipboard);
+               const gchar *sel;
+               int len = -1;
+               sel = gtk_html_get_selection_html (GTK_HTML (focused_widget), &len);
+               if ((sel == NULL) || (sel[0] == '\0')) {
+                       copied = FALSE;
+               } else {
+                       gtk_html_copy (GTK_HTML (focused_widget));
+                       gtk_clipboard_set_can_store (clipboard, NULL, 0);
+                       gtk_clipboard_store (clipboard);
+               }
        } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
                GtkTextBuffer *buffer;
                buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
@@ -4038,9 +4142,9 @@ modest_ui_actions_on_select_all (GtkAction *action,
                /* Set focuse on header view */
                gtk_widget_grab_focus (header_view);
 
-
                /* Enable window dimming management */
                modest_window_enable_dimming (MODEST_WINDOW(window));
+               modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (window));
                modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
        }
 
@@ -4138,7 +4242,9 @@ modest_ui_actions_on_toggle_fullscreen    (GtkToggleAction *toggle,
 
        if (active != fullscreen) {
                modest_window_mgr_set_fullscreen_mode (mgr, active);
+#ifndef MODEST_TOOLKIT_HILDON2
                gtk_window_present (GTK_WINDOW (window));
+#endif
        }
 }
 
@@ -4155,7 +4261,9 @@ modest_ui_actions_on_change_fullscreen (GtkAction *action,
        fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
        modest_window_mgr_set_fullscreen_mode (mgr, !fullscreen);
 
+#ifndef MODEST_TOOLKIT_HILDON2
        gtk_window_present (GTK_WINDOW (window));
+#endif
 }
 
 /* 
@@ -4167,37 +4275,7 @@ headers_action_show_details (TnyHeader *header,
                             gpointer user_data)
 
 {
-       GtkWidget *dialog;
-       
-       /* Create dialog */
-       dialog = modest_details_dialog_new_with_header (GTK_WINDOW (window), header);
-
-       /* Run dialog */
-       gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
-       gtk_widget_show_all (dialog);
-       gtk_dialog_run (GTK_DIALOG (dialog));
-
-       gtk_widget_destroy (dialog);
-}
-
-/*
- * Show the folder details in a ModestDetailsDialog widget
- */
-static void
-show_folder_details (TnyFolder *folder, 
-                    GtkWindow *window)
-{
-       GtkWidget *dialog;
-       
-       /* Create dialog */
-       dialog = modest_details_dialog_new_with_folder (window, folder);
-
-       /* Run dialog */
-       gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
-       gtk_widget_show_all (dialog);
-       gtk_dialog_run (GTK_DIALOG (dialog));
-
-       gtk_widget_destroy (dialog);
+       modest_platform_run_header_details_dialog (GTK_WINDOW (window), header);
 }
 
 /*
@@ -4251,7 +4329,8 @@ modest_ui_actions_on_details (GtkAction *action,
                        /* This function should not be called for account items, 
                         * because we dim the menu item for them. */
                        if (TNY_IS_FOLDER (folder_store)) {
-                               show_folder_details (TNY_FOLDER (folder_store), GTK_WINDOW (win));
+                               modest_platform_run_folder_details_dialog (GTK_WINDOW (win), 
+                                                                          TNY_FOLDER (folder_store));
                        }
 
                        g_object_unref (folder_store);
@@ -4383,7 +4462,6 @@ on_move_to_dialog_folder_selection_changed (ModestFolderView* self,
 {
        GtkWidget *dialog = NULL;
        GtkWidget *ok_button = NULL, *new_button = NULL;
-       GList *children = NULL;
        gboolean ok_sensitive = TRUE, new_sensitive = TRUE;
        gboolean moving_folder = FALSE;
        gboolean is_local_account = TRUE;
@@ -4400,10 +4478,8 @@ on_move_to_dialog_folder_selection_changed (ModestFolderView* self,
        if (!dialog)
                return;
 
-       children = gtk_container_get_children (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area));
-       ok_button = GTK_WIDGET (children->next->next->data);
-       new_button = GTK_WIDGET (children->next->data);
-       g_list_free (children);
+       ok_button = g_object_get_data (G_OBJECT (dialog), MOVE_FOLDER_OK_BUTTON);
+       new_button = g_object_get_data (G_OBJECT (dialog), MOVE_FOLDER_NEW_BUTTON);
 
        /* check if folder_store is an remote account */
        if (TNY_IS_ACCOUNT (folder_store)) {
@@ -4417,18 +4493,23 @@ 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);
+                       ModestProtocolType proto;
+                       proto = modest_tny_account_get_protocol_type (TNY_ACCOUNT (folder_store));
+                       if (proto == MODEST_PROTOCOL_REGISTRY_TYPE_INVALID) {
+                               proto = MODEST_PROTOCOLS_STORE_MAILDIR;
                        }
                        is_local_account = FALSE;
                        /* New button should be dimmed on remote
                           POP account root */
-                       new_sensitive = (proto != MODEST_PROTOCOL_STORE_POP);
+                       new_sensitive = (modest_protocol_registry_protocol_type_has_tag (modest_runtime_get_protocol_registry (),
+                                                                                        proto,
+                                                                                        MODEST_PROTOCOL_REGISTRY_STORE_HAS_FOLDERS));
                }
                g_object_unref (local_account);
-               g_object_unref (mmc_account);
+
+               /* It could not exist */
+               if (mmc_account)
+                       g_object_unref (mmc_account);
        }
 
        /* Check the target folder rules */
@@ -4532,19 +4613,36 @@ create_move_to_dialog (GtkWindow *win,
                       GtkWidget **tree_view)
 {
        GtkWidget *dialog, *scroll;
-       GtkWidget *new_button;
+       GtkWidget *new_button, *ok_button;
 
        dialog = gtk_dialog_new_with_buttons (_("mcen_ti_moveto_folders_title"),
                                              GTK_WINDOW (win),
                                              GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR | GTK_DIALOG_DESTROY_WITH_PARENT,
                                              NULL);
 
-       gtk_dialog_add_button (GTK_DIALOG (dialog), _("mcen_bd_dialog_ok"), GTK_RESPONSE_ACCEPT);
+#ifndef MODEST_TOOLKIT_GTK
+       ok_button = gtk_dialog_add_button (GTK_DIALOG (dialog), _("mcen_bd_dialog_ok"), GTK_RESPONSE_ACCEPT);
        /* We do this manually so GTK+ does not associate a response ID for
         * the button. */
        new_button = gtk_button_new_from_stock (_("mcen_bd_new"));
        gtk_box_pack_end (GTK_BOX (GTK_DIALOG (dialog)->action_area), new_button, FALSE, FALSE, 0);
+       gtk_widget_show (new_button);
+#ifndef MODEST_TOOLKIT_HILDON2
        gtk_dialog_add_button (GTK_DIALOG (dialog), _("mcen_bd_dialog_cancel"), GTK_RESPONSE_REJECT);
+#endif
+#else
+       /* We do this manually so GTK+ does not associate a response ID for
+        * the button. */
+       new_button = gtk_button_new_with_label (_("mcen_ti_new_folder"));
+       gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), new_button, FALSE, FALSE, 0);
+       gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (GTK_DIALOG (dialog)->action_area), new_button, TRUE);
+       gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
+       ok_button = gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT);
+       gtk_container_set_border_width (GTK_CONTAINER (dialog), 12);
+       gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 24);
+#endif
+       g_object_set_data (G_OBJECT (dialog), MOVE_FOLDER_OK_BUTTON, ok_button);
+       g_object_set_data (G_OBJECT (dialog), MOVE_FOLDER_NEW_BUTTON, new_button);
 
        /* Create scrolled window */
        scroll = gtk_scrolled_window_new (NULL, NULL);
@@ -4552,6 +4650,10 @@ create_move_to_dialog (GtkWindow *win,
                                         GTK_POLICY_AUTOMATIC,
                                         GTK_POLICY_AUTOMATIC);
 
+#ifdef MODEST_TOOLKIT_GTK
+       gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll), GTK_SHADOW_IN);
+#endif
+
        /* Create folder view */
        *tree_view = modest_platform_create_folder_view (NULL);
 
@@ -4631,7 +4733,11 @@ create_move_to_dialog (GtkWindow *win,
                            scroll, TRUE, TRUE, 0);
 
        gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
+#ifndef MODEST_TOOLKIT_GTK
        gtk_window_set_default_size (GTK_WINDOW (dialog), 300, 300);
+#else
+       gtk_window_set_default_size (GTK_WINDOW (dialog), 600, 400);
+#endif
 
        return dialog;
 }
@@ -5014,7 +5120,7 @@ modest_ui_actions_xfer_messages_check (GtkWindow *parent_window,
                /* The transfer is possible and the user wants to */
                *do_xfer = TRUE;
 
-               if (remote_folder_is_pop (src_folder) && delete_originals) {
+               if (remote_folder_has_leave_on_server (src_folder) && delete_originals) {
                        const gchar *account_name;
                        gboolean leave_on_server;
                        
@@ -5074,23 +5180,15 @@ xfer_messages_performer  (gboolean canceled,
 {
        ModestWindow *win = MODEST_WINDOW (parent_window);
        TnyAccount *dst_account = NULL;
-       const gchar *proto_str = NULL;
-       gboolean dst_is_pop = FALSE;
+       gboolean dst_forbids_message_add = FALSE;
        XferMsgsHelper *helper;
        MoveToHelper *movehelper;
        ModestMailOperation *mail_op;
 
        helper = (XferMsgsHelper *) user_data;
 
-       if (canceled)
-               goto end;
-
-       if (err) {
-               if (is_memory_full_error (err)) {
-                       modest_platform_information_banner ((GtkWidget *) parent_window,
-                                                           NULL, dgettext("ke-recv",
-                                                                          "cerm_device_memory_full"));
-               } else {
+       if (canceled || err) {
+               if (!check_memory_full_error ((GtkWidget *) parent_window, err)) {
                        /* Show the proper error message */
                        modest_ui_actions_on_account_connection_error (parent_window, account);
                }
@@ -5098,16 +5196,14 @@ xfer_messages_performer  (gboolean canceled,
        }
 
        dst_account = tny_folder_get_account (TNY_FOLDER (helper->dst_folder));
-       proto_str = tny_account_get_proto (dst_account);
 
        /* tinymail will return NULL for local folders it seems */
-       dst_is_pop = proto_str &&
-               (modest_protocol_info_get_transport_store_protocol (proto_str) == 
-                MODEST_PROTOCOL_STORE_POP);
-
+       dst_forbids_message_add = modest_protocol_registry_protocol_type_has_tag (modest_runtime_get_protocol_registry (),
+                                                                                 modest_tny_account_get_protocol_type (dst_account),
+                                                                                 MODEST_PROTOCOL_REGISTRY_STORE_FORBID_MESSAGE_ADD);
        g_object_unref (dst_account);
 
-       if (dst_is_pop) {
+       if (dst_forbids_message_add) {
                modest_platform_information_banner (GTK_WIDGET (win),
                                                    NULL,
                                                    ngettext("mail_in_ui_folder_move_target_error",
@@ -5312,6 +5408,10 @@ modest_ui_actions_transfer_messages_helper (GtkWindow *win,
        gboolean need_connection = TRUE;
        gboolean do_xfer = TRUE;
        XferMsgsHelper *helper;
+
+       g_return_if_fail (TNY_IS_FOLDER (src_folder));
+       g_return_if_fail (TNY_IS_FOLDER (dst_folder));
+       g_return_if_fail (TNY_IS_LIST (headers));
        
        modest_ui_actions_xfer_messages_check (win, TNY_FOLDER_STORE (src_folder), 
                                               headers, TNY_FOLDER (dst_folder),
@@ -5370,6 +5470,7 @@ modest_ui_actions_on_msg_view_window_move_to (GtkAction *action,
                                                    TNY_FOLDER (dst_folder));
 
        /* Frees */
+       g_object_unref (src_folder);
        g_object_unref (header);
        g_object_unref (headers);
 }
@@ -5404,7 +5505,7 @@ modest_ui_actions_on_move_to (GtkAction *action,
        /* Create and run the dialog */
        dialog = create_move_to_dialog (GTK_WINDOW (win), folder_view, &tree_view);
        modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (tree_view));
-       gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
+       modest_window_mgr_set_modal (modest_runtime_get_window_mgr (), GTK_WINDOW (dialog), (GtkWindow *) win);
        result = gtk_dialog_run (GTK_DIALOG(dialog));
        g_object_ref (tree_view);
        gtk_widget_destroy (dialog);
@@ -5598,11 +5699,7 @@ retrieve_msg_contents_performer (gboolean canceled,
        TnyList *headers = TNY_LIST (user_data);
 
        if (err || canceled) {
-               if (err && is_memory_full_error (err)) {
-                       modest_platform_information_banner ((GtkWidget *) parent_window,
-                                                           NULL, dgettext("ke-recv",
-                                                                          "cerm_device_memory_full"));
-               }
+               check_memory_full_error ((GtkWidget *) parent_window, err);
                goto out;
        }
 
@@ -5945,7 +6042,8 @@ modest_ui_actions_on_send_queue_status_changed (ModestTnySendQueue *send_queue,
 
                tree_column = gtk_tree_view_get_column (GTK_TREE_VIEW (header_view), 
                                                        TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN);
-               gtk_tree_view_column_queue_resize (tree_column);
+               if (tree_column)
+                       gtk_tree_view_column_queue_resize (tree_column);
        }
 #else
        gtk_widget_queue_draw (header_view);
@@ -5954,6 +6052,8 @@ modest_ui_actions_on_send_queue_status_changed (ModestTnySendQueue *send_queue,
        /* 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);
+       modest_window_check_dimming_rules_group (MODEST_WINDOW (main_window), 
+                                                MODEST_DIMMING_RULES_MENU);
        
        /* Free */
  frees:
@@ -5965,31 +6065,18 @@ void
 modest_ui_actions_on_account_connection_error (GtkWindow *parent_window,
                                               TnyAccount *account)
 {
-       ModestTransportStoreProtocol proto;
-       const gchar *proto_name;
+       ModestProtocolType protocol_type;
+       ModestProtocol *protocol;
        gchar *error_note = NULL;
        
-       proto_name = tny_account_get_proto (account);
-       proto = modest_protocol_info_get_transport_store_protocol (proto_name);
-       
-       switch (proto) {
-       case MODEST_PROTOCOL_STORE_POP:
-               error_note = g_strdup_printf (_("emev_ni_ui_pop3_msg_connect_error"), 
-                                             tny_account_get_hostname (account));
-               break;
-       case MODEST_PROTOCOL_STORE_IMAP:
-               error_note = g_strdup_printf (_("emev_ni_ui_imap_connect_server_error"), 
-                                             tny_account_get_hostname (account));
-               break;
-       case MODEST_PROTOCOL_STORE_MAILDIR:
-       case MODEST_PROTOCOL_STORE_MBOX:
-               error_note = g_strdup (_("emev_nc_mailbox_notavailable"));
-               break;
-       default:
-               g_warning ("%s: This should not be reached", __FUNCTION__);
-       }
+       protocol_type = modest_tny_account_get_protocol_type (account);
+       protocol = modest_protocol_registry_get_protocol_by_type (modest_runtime_get_protocol_registry (),
+                                                                 protocol_type);
 
-       if (error_note) {
+       error_note = modest_protocol_get_translation (protocol, MODEST_PROTOCOL_TRANSLATION_ACCOUNT_CONNECTION_ERROR, tny_account_get_hostname (account));
+       if (error_note == NULL) {
+               g_warning ("%s: This should not be reached", __FUNCTION__);
+       } else {
                modest_platform_run_information_dialog (parent_window, error_note, FALSE);
                g_free (error_note);
        }
@@ -5999,9 +6086,11 @@ gchar *
 modest_ui_actions_get_msg_already_deleted_error_msg (ModestWindow *win)
 {
        gchar *msg = NULL;
+       gchar *subject;
        TnyFolderStore *folder = NULL;
        TnyAccount *account = NULL;
-       ModestTransportStoreProtocol proto;
+       ModestProtocolType proto;
+       ModestProtocol *protocol;
        TnyHeader *header = NULL;
 
        if (MODEST_IS_MAIN_WINDOW (win)) {
@@ -6028,16 +6117,14 @@ modest_ui_actions_get_msg_already_deleted_error_msg (ModestWindow *win)
 
        /* Get the account type */
        account = tny_folder_get_account (TNY_FOLDER (folder));
-       proto = modest_protocol_info_get_transport_store_protocol (tny_account_get_proto (account));
-       if (proto == MODEST_PROTOCOL_STORE_POP) {
-               msg = g_strdup (_("emev_ni_ui_pop3_msg_recv_error"));
-       } else if (proto == MODEST_PROTOCOL_STORE_IMAP) {
-               gchar *subject;
-               subject = tny_header_dup_subject (header);
-               msg = g_strdup_printf (_("emev_ni_ui_imap_message_not_available_in_server"), 
-                                      subject);
-               g_free (subject);
-       } else {
+       proto = modest_tny_account_get_protocol_type (account);
+       protocol = modest_protocol_registry_get_protocol_by_type (modest_runtime_get_protocol_registry (),
+                                                                 proto);
+
+       subject = tny_header_dup_subject (header);
+       msg = modest_protocol_get_translation (protocol, MODEST_PROTOCOL_TRANSLATION_MSG_NOT_AVAILABLE, subject);
+       g_free (subject);
+       if (msg == NULL) {
                msg = g_strdup_printf (_("mail_ni_ui_folder_get_msg_folder_error"));
        }