2007-06-12 Murray Cumming <murrayc@murrayc.com>
[modest] / src / widgets / modest-folder-view.c
index ca54cbf..fe8fad9 100644 (file)
 #include <tny-gtk-folder-store-tree-model.h>
 #include <tny-gtk-header-list-model.h>
 #include <tny-folder.h>
+#include <tny-folder-store-observer.h>
 #include <tny-account-store.h>
 #include <tny-account.h>
 #include <tny-folder.h>
 #include <tny-camel-folder.h>
 #include <tny-simple-list.h>
-#include <tny-merge-folder.h>
 #include <modest-tny-folder.h>
-#include <modest-tny-simple-folder-store.h>
+#include <modest-tny-local-folders-account.h>
 #include <modest-marshal.h>
 #include <modest-icon-names.h>
 #include <modest-tny-account-store.h>
-#include <modest-tny-outbox-account.h>
 #include <modest-text-utils.h>
 #include <modest-runtime.h>
 #include "modest-folder-view.h"
@@ -54,7 +53,7 @@
 #include <modest-platform.h>
 #include <modest-account-mgr-helpers.h>
 #include <modest-widget-memory.h>
-
+#include <modest-ui-actions.h>
 
 /* 'private'/'protected' functions */
 static void modest_folder_view_class_init  (ModestFolderViewClass *klass);
@@ -67,9 +66,6 @@ static void         tny_account_store_view_init (gpointer g,
 static void         modest_folder_view_set_account_store (TnyAccountStoreView *self, 
                                                          TnyAccountStore     *account_store);
 
-static gboolean     update_model           (ModestFolderView *self,
-                                           ModestTnyAccountStore *account_store);
-
 static void         on_selection_changed   (GtkTreeSelection *sel, gpointer data);
 
 static void         on_account_update      (TnyAccountStore *account_store, 
@@ -140,7 +136,6 @@ struct _ModestFolderViewPrivate {
        gulong                changed_signal;
        gulong                accounts_reloaded_signal;
        
-       GtkTreeSelection     *cur_selection;
        TnyFolderStoreQuery  *query;
        guint                 timer_expander;
 
@@ -240,8 +235,9 @@ text_cell_data  (GtkTreeViewColumn *column,  GtkCellRenderer *renderer,
        ModestFolderViewPrivate *priv;
        GObject *rendobj;
        gchar *fname = NULL;
-       gint unread, all;
-       TnyFolderType type;
+       gint unread = 0;
+       gint all = 0;
+       TnyFolderType type = TNY_FOLDER_TYPE_UNKNOWN;
        GObject *instance = NULL;
        
        g_return_if_fail (column);
@@ -274,11 +270,11 @@ text_cell_data  (GtkTreeViewColumn *column,  GtkCellRenderer *renderer,
                gint number = 0;
                
                if (modest_tny_folder_is_local_folder (TNY_FOLDER (instance))) {
-                       TnyFolderType type;
-                       type = modest_tny_folder_get_local_folder_type (TNY_FOLDER (instance));
-                       if (type != TNY_FOLDER_TYPE_UNKNOWN) {
+                       TnyFolderType folder_type
+                               = modest_tny_folder_get_local_folder_type (TNY_FOLDER (instance));
+                       if (folder_type != TNY_FOLDER_TYPE_UNKNOWN) {
                                g_free (fname);
-                               fname = g_strdup(modest_local_folder_info_get_type_display_name (type));
+                               fname = g_strdup(modest_local_folder_info_get_type_display_name (folder_type));
                        }
                }
 
@@ -299,26 +295,14 @@ text_cell_data  (GtkTreeViewColumn *column,  GtkCellRenderer *renderer,
 
        } else if (TNY_IS_ACCOUNT (instance)) {
                /* If it's a server account */
-               const gchar * account_id = tny_account_get_id (TNY_ACCOUNT (instance));
-               if (!strcmp (account_id, MODEST_ACTUAL_LOCAL_FOLDERS_ACCOUNT_ID)) {
+               if (modest_tny_account_is_virtual_local_folders (
+                               TNY_ACCOUNT (instance))) {
                        item_name = g_strdup (priv->local_account_name);
+                       item_weight = 400;
                } else {
-                       if (!strcmp (account_id, MODEST_MMC_ACCOUNT_ID)) {
-                               /* TODO: get MMC card name */
-                               item_name = g_strdup (_("MMC"));
-                       } else {
-                               item_name = g_strdup (fname);
-                       }
+                       item_name = g_strdup (fname);
+                       item_weight = 800;
                }
-
-               item_weight = 800;
-       } else if (modest_tny_folder_store_is_virtual_local_folders (
-               TNY_FOLDER_STORE(instance)))
-       {
-               /* We use ModestTnySimpleFolder store to group the outboxes and 
-                * the other local folders together: */
-               item_name = g_strdup (_("Local Folders"));
-               item_weight = 400;
        }
        
        if (!item_name)
@@ -351,10 +335,10 @@ icon_cell_data  (GtkTreeViewColumn *column,  GtkCellRenderer *renderer,
 {
        GObject *rendobj = NULL, *instance = NULL;
        GdkPixbuf *pixbuf = NULL;
-       TnyFolderType type;
+       TnyFolderType type = TNY_FOLDER_TYPE_UNKNOWN;
        gchar *fname = NULL;
        const gchar *account_id = NULL;
-       gint unread;
+       gint unread = 0;
        
        rendobj = G_OBJECT(renderer);
        gtk_tree_model_get (tree_model, iter,
@@ -379,23 +363,19 @@ icon_cell_data  (GtkTreeViewColumn *column,  GtkCellRenderer *renderer,
        switch (type) {
        case TNY_FOLDER_TYPE_ROOT:
                if (TNY_IS_ACCOUNT (instance)) {
-                       account_id = tny_account_get_id (TNY_ACCOUNT (instance));
-                       /*
-                       if (!strcmp (account_id, MODEST_ACTUAL_LOCAL_FOLDERS_ACCOUNT_ID)) {
+                       
+                       if (modest_tny_account_is_virtual_local_folders (
+                               TNY_ACCOUNT (instance))) {
                                pixbuf = modest_platform_get_icon (MODEST_FOLDER_ICON_LOCAL_FOLDERS);
-                       } else {
-                       */
+                       }
+                       else {
+                               account_id = tny_account_get_id (TNY_ACCOUNT (instance));
+                               
                                if (!strcmp (account_id, MODEST_MMC_ACCOUNT_ID))
                                        pixbuf = modest_platform_get_icon (MODEST_FOLDER_ICON_MMC);
                                else
                                        pixbuf = modest_platform_get_icon (MODEST_FOLDER_ICON_ACCOUNT);
-                       /*
                        }
-                       */
-               }
-               else if (modest_tny_folder_store_is_virtual_local_folders (
-                       TNY_FOLDER_STORE (instance))) {
-                       pixbuf = modest_platform_get_icon (MODEST_FOLDER_ICON_LOCAL_FOLDERS);
                }
                break;
        case TNY_FOLDER_TYPE_INBOX:
@@ -493,9 +473,6 @@ modest_folder_view_init (ModestFolderView *obj)
        /* Setup drag and drop */
        setup_drag_and_drop (GTK_TREE_VIEW(obj));
 
-       /* Restore conf */
-       modest_widget_memory_restore (conf, G_OBJECT (obj), MODEST_CONF_FOLDER_VIEW_KEY);
-
        /* Connect signals */
        g_signal_connect (G_OBJECT (obj), 
                          "key-press-event", 
@@ -597,10 +574,6 @@ modest_folder_view_set_account_store (TnyAccountStoreView *self, TnyAccountStore
                g_signal_connect (G_OBJECT(account_store), "accounts_reloaded",
                                  G_CALLBACK (on_accounts_reloaded), self);
        
-       if (!update_model (MODEST_FOLDER_VIEW (self),
-                          MODEST_TNY_ACCOUNT_STORE (priv->account_store)))
-               g_printerr ("modest: failed to update model\n");
-
        g_object_unref (G_OBJECT (device));
 }
 
@@ -608,8 +581,8 @@ static void
 on_account_update (TnyAccountStore *account_store, const gchar *account,
                   gpointer user_data)
 {
-       if (!update_model (MODEST_FOLDER_VIEW(user_data), 
-                          MODEST_TNY_ACCOUNT_STORE(account_store)))
+       if (!modest_folder_view_update_model (MODEST_FOLDER_VIEW(user_data), 
+                                             account_store))
                g_printerr ("modest: failed to update model for changes in '%s'",
                            account);
 }
@@ -618,8 +591,11 @@ static void
 on_accounts_reloaded   (TnyAccountStore *account_store, 
                        gpointer user_data)
 {
-       update_model (MODEST_FOLDER_VIEW (user_data), 
-                     MODEST_TNY_ACCOUNT_STORE(account_store));
+       ModestConf *conf = modest_runtime_get_conf ();
+
+       modest_widget_memory_save (conf, G_OBJECT (user_data), MODEST_CONF_FOLDER_VIEW_KEY);
+       modest_folder_view_update_model (MODEST_FOLDER_VIEW (user_data), account_store);
+       modest_widget_memory_restore (conf, G_OBJECT (user_data), MODEST_CONF_FOLDER_VIEW_KEY);
 }
 
 void
@@ -657,7 +633,7 @@ modest_folder_view_new (TnyFolderStoreQuery *query)
        priv->changed_signal = g_signal_connect (sel, "changed",
                                                 G_CALLBACK (on_selection_changed), self);
 
-       return GTK_WIDGET(self);
+       return GTK_WIDGET(self);
 }
 
 /* this feels dirty; any other way to expand all the root items? */
@@ -685,7 +661,7 @@ filter_row (GtkTreeModel *model,
            gpointer data)
 {
        gboolean retval = TRUE;
-       gint type = 0;
+       TnyFolderType type = TNY_FOLDER_TYPE_UNKNOWN;
        GObject *instance = NULL;
 
        gtk_tree_model_get (model, iter,
@@ -708,7 +684,8 @@ filter_row (GtkTreeModel *model,
                        
                        /* If it isn't a special folder, 
                         * don't show it unless it is the visible account: */
-                       if (strcmp (account_id, MODEST_MMC_ACCOUNT_ID)) { 
+                       if (!modest_tny_account_is_virtual_local_folders (acc) &&
+                               strcmp (account_id, MODEST_MMC_ACCOUNT_ID)) { 
                                /* Show only the visible account id */
                                ModestFolderViewPrivate *priv = 
                                        MODEST_FOLDER_VIEW_GET_PRIVATE (data);
@@ -725,110 +702,14 @@ filter_row (GtkTreeModel *model,
        return retval;
 }
 
-/*
-static void on_tnylist_accounts_debug_print(gpointer data,  gpointer user_data)
-{
-       TnyAccount* account = TNY_ACCOUNT(data);
-       const gchar *prefix = (const gchar*)(user_data);
-       
-       printf("%s account id=%s\n", prefix, tny_account_get_id (account));
-}
-*/
-
-static void
-add_account_folders_to_merged_folder (TnyAccount *account, TnyMergeFolder* merge_folder)
-{
-       const gchar* account_id = tny_account_get_id (account);
-       const gboolean is_actual_local_folders_account = account_id && 
-               (strcmp (account_id, MODEST_ACTUAL_LOCAL_FOLDERS_ACCOUNT_ID) == 0);
-               
-       TnyList *list_outbox_folders = tny_simple_list_new ();
-       tny_folder_store_get_folders (TNY_FOLDER_STORE (account), 
-               list_outbox_folders, NULL, NULL);
-               
-       TnyIterator*  iter =  tny_list_create_iterator (list_outbox_folders);
-       while (!tny_iterator_is_done (iter))
-       {
-               TnyFolder *folder = TNY_FOLDER (tny_iterator_get_current (iter));
-               
-               if (folder) {
-                       gboolean add = TRUE;
-                       /* TODO: Do not add outboxes that are inside local-folders/, 
-                        * because these are just left-over from earlier Modest versions 
-                        * that put the outbox there: */
-                       if (is_actual_local_folders_account) {
-                               const TnyFolderType type = modest_tny_folder_get_local_folder_type (folder);
-                               if (type == TNY_FOLDER_TYPE_OUTBOX) {
-                                       add = FALSE;
-                               }
-                       }
-                       
-                       if (add)
-                               tny_merge_folder_add_folder (merge_folder, folder);
-                               
-                       g_object_unref (folder);        
-               }
-               
-               tny_iterator_next (iter);
-       }
-       
-       g_object_unref (list_outbox_folders);
-}
-
-
-static void
-add_account_folders_to_simple_folder_store (TnyAccount *account, ModestTnySimpleFolderStore* store)
-{
-       g_return_if_fail (account);
-       g_return_if_fail (store);
-               
-       TnyList *list_outbox_folders = tny_simple_list_new ();
-       tny_folder_store_get_folders (TNY_FOLDER_STORE (account), 
-               list_outbox_folders, NULL, NULL);
-       
-       /* Special handling for the .modest/local-folders account,
-        * to avoid adding unwanted folders.
-        * We cannot prevent them from being in the TnyAccount without 
-        * changing the libtinymail-camel. */
-       const gchar* account_id = tny_account_get_id (account);
-       const gboolean is_actual_local_folders_account = account_id && 
-               (strcmp (account_id, MODEST_ACTUAL_LOCAL_FOLDERS_ACCOUNT_ID) == 0);
-       
-       TnyIterator*  iter =  tny_list_create_iterator (list_outbox_folders);
-       while (!tny_iterator_is_done (iter))
-       {
-               TnyFolder *folder = TNY_FOLDER (tny_iterator_get_current (iter));
-               
-               if (folder) {
-                       gboolean add = TRUE;
-                       /* TODO: Do not add outboxes that are inside local-folders/, 
-                        * because these are just left-over from earlier Modest versions 
-                        * that put the outbox there: */
-                       if (is_actual_local_folders_account) {
-                               const TnyFolderType type = modest_tny_folder_get_local_folder_type (folder);
-                               if (type == TNY_FOLDER_TYPE_OUTBOX) {
-                                       add = FALSE;
-                               }
-                       }
-                       
-                       if (add)
-                               modest_tny_simple_folder_store_add_folder (store, folder);
-                               
-                       g_object_unref (folder);        
-               }
-               
-               tny_iterator_next (iter);
-       }
-       
-       g_object_unref (list_outbox_folders);
-}
-
-static gboolean
-update_model (ModestFolderView *self, ModestTnyAccountStore *account_store)
+gboolean
+modest_folder_view_update_model (ModestFolderView *self,
+                                TnyAccountStore *account_store)
 {
        ModestFolderViewPrivate *priv;
-
-       GtkTreeModel     *model;
+       GtkTreeModel *model /* , *old_model */;
+       /* TnyAccount *local_account; */
+       TnyList *model_as_list;
 
        g_return_val_if_fail (account_store, FALSE);
 
@@ -838,7 +719,7 @@ update_model (ModestFolderView *self, ModestTnyAccountStore *account_store)
        g_signal_emit (G_OBJECT(self), 
                       signals[FOLDER_SELECTION_CHANGED_SIGNAL], 0,
                       NULL, TRUE);
-       
+
        /* FIXME: the local accounts are not shown when the query
           selects only the subscribed folders. */
 /*     model        = tny_gtk_folder_store_tree_model_new (TRUE, priv->query); */
@@ -846,70 +727,14 @@ update_model (ModestFolderView *self, ModestTnyAccountStore *account_store)
        
        /* Deal with the model via its TnyList Interface,
         * filling the TnyList via a get_accounts() call: */
-       TnyList *model_as_list = TNY_LIST(model);
-
-       /* Create a virtual local-folders folder store, 
-        * containing the real local folders and the (merged) various per-account 
-        * outbox folders:
-        */
-       ModestTnySimpleFolderStore *store = modest_tny_simple_folder_store_new ();
+       model_as_list = TNY_LIST(model);
 
        /* Get the accounts: */
-       TnyList *account_list = tny_simple_list_new ();
        tny_account_store_get_accounts (TNY_ACCOUNT_STORE(account_store),
-                                       account_list,
+                                       model_as_list,
                                        TNY_ACCOUNT_STORE_STORE_ACCOUNTS);
-       TnyIterator* iter =  tny_list_create_iterator (account_list);
-       
-       /* All per-account outbox folders are merged into one folders
-        * so that they appear as one outbox to the user: */
-       TnyMergeFolder *merged_outbox = TNY_MERGE_FOLDER (tny_merge_folder_new());
-       
-       while (!tny_iterator_is_done (iter))
-       {
-               GObject *cur = tny_iterator_get_current (iter);
-               TnyAccount *account = TNY_ACCOUNT (cur);
-               if (account) {
-                       /* Add both outbox account and local-folders account folders
-                        * to our one combined account:
-                        */
-                       if (MODEST_IS_TNY_OUTBOX_ACCOUNT (account)) {
-                               /* Add the folder to the merged folder.
-                                * We will add it later to the virtual local-folders store: */
-                               add_account_folders_to_merged_folder (account, merged_outbox);
-                       } else {
-                               const gchar *account_id = tny_account_get_id (account);
-                               if (account_id && !strcmp (account_id, MODEST_ACTUAL_LOCAL_FOLDERS_ACCOUNT_ID)) {
-                                       /* Add the folders to the virtual local-folders store: */
-                                       add_account_folders_to_simple_folder_store (account, store);
-                               }
-                               else {
-                                       /* Just add the account: */
-                                       tny_list_append (model_as_list, G_OBJECT (account));
-                               }
-                       }
-               }
-          
-               g_object_unref (cur);
-               tny_iterator_next (iter);
-       }
-       
-       /* Add the merged outbox folder to the virtual local-folders store: */
-       modest_tny_simple_folder_store_add_folder (store, TNY_FOLDER(merged_outbox));
-       g_object_unref (merged_outbox);
-       merged_outbox = NULL;
-       
-       /* Add the virtual local-folders store to the model: */
-       tny_list_append (model_as_list, G_OBJECT (store));
-       
-       
-       g_object_unref (account_list);
-       account_list = NULL;
-       
        g_object_unref (model_as_list);
        model_as_list = NULL;   
-               
-       /* tny_list_foreach (account_list, on_tnylist_accounts_debug_print, "update_model: "); */
                                                      
        GtkTreeModel *filter_model = NULL, *sortable = NULL;
 
@@ -935,6 +760,13 @@ update_model (ModestFolderView *self, ModestTnyAccountStore *account_store)
                                 (filter_model) ? filter_model : sortable);
        expand_root_items (self); /* expand all account folders */
        
+       g_object_unref (model);
+       
+       if (filter_model)
+               g_object_unref (filter_model);
+                       
+       g_object_unref (sortable);
+                       
        return TRUE;
 }
 
@@ -947,14 +779,12 @@ on_selection_changed (GtkTreeSelection *sel, gpointer user_data)
        GtkTreeIter             iter;
        ModestFolderView        *tree_view;
        ModestFolderViewPrivate *priv;
-       gint                    type;
 
        g_return_if_fail (sel);
        g_return_if_fail (user_data);
        
        priv = MODEST_FOLDER_VIEW_GET_PRIVATE(user_data);
-       priv->cur_selection = sel;
-       
+
        /* folder was _un_selected if true */
        if (!gtk_tree_selection_get_selected (sel, &model, &iter)) {
                if (priv->cur_folder_store)
@@ -971,7 +801,6 @@ on_selection_changed (GtkTreeSelection *sel, gpointer user_data)
        tree_view = MODEST_FOLDER_VIEW (user_data);
 
        gtk_tree_model_get (model, &iter,
-                           TNY_GTK_FOLDER_STORE_TREE_MODEL_TYPE_COLUMN, &type,
                            TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, &folder,
                            -1);
 
@@ -1017,9 +846,9 @@ get_cmp_rows_type_pos (GObject *folder)
        /* Remote accounts -> Local account -> MMC account .*/
        /* 0, 1, 2 */
        
-       if (TNY_IS_FOLDER_STORE (folder) && 
-               modest_tny_folder_store_is_virtual_local_folders (
-                       TNY_FOLDER_STORE (folder))) {
+       if (TNY_IS_ACCOUNT (folder) && 
+               modest_tny_account_is_virtual_local_folders (
+                       TNY_ACCOUNT (folder))) {
                return 1;
        } else if (TNY_IS_ACCOUNT (folder)) {
                TnyAccount *account = TNY_ACCOUNT (folder);
@@ -1046,8 +875,9 @@ cmp_rows (GtkTreeModel *tree_model, GtkTreeIter *iter1, GtkTreeIter *iter2,
          gpointer user_data)
 {
        gint cmp;
-       gchar         *name1, *name2;
-       TnyFolderType type;
+       gchar *name1 = NULL;
+       gchar *name2 = NULL;
+       TnyFolderType type = TNY_FOLDER_TYPE_UNKNOWN;
        GObject *folder1 = NULL;
        GObject *folder2 = NULL;
 
@@ -1201,43 +1031,63 @@ drag_and_drop_from_header_view (GtkTreeModel *source_model,
                                GtkTreePath  *dest_row,
                                DndHelper    *helper)
 {
-       TnyList *headers;
-       TnyHeader *header;
-       TnyFolder *folder;
-       ModestMailOperation *mail_op;
+       TnyList *headers = NULL;
+       TnyHeader *header = NULL;
+       TnyFolder *folder = NULL;
+       ModestMailOperation *mail_op = NULL;
        GtkTreeIter source_iter, dest_iter;
 
+       g_return_if_fail (GTK_IS_TREE_MODEL(source_model));
+       g_return_if_fail (GTK_IS_TREE_MODEL(dest_model));
+       g_return_if_fail (dest_row);
+       g_return_if_fail (helper);
+       
        /* Get header */
        gtk_tree_model_get_iter (source_model, &source_iter, helper->source_row);
        gtk_tree_model_get (source_model, &source_iter, 
                            TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, 
                            &header, -1);
-
+       if (!TNY_IS_HEADER(header)) {
+               g_warning ("BUG: %s could not get a valid header", __FUNCTION__);
+               goto cleanup;
+       }
+       
        /* Get Folder */
        gtk_tree_model_get_iter (dest_model, &dest_iter, dest_row);
        gtk_tree_model_get (dest_model, &dest_iter, 
                            TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, 
                            &folder, -1);
 
+       if (!TNY_IS_FOLDER(folder)) {
+               g_warning ("BUG: %s could not get a valid folder", __FUNCTION__);
+               goto cleanup;
+       }
+
        /* Transfer message */
        mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, NULL);
-
        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
                                         mail_op);
        g_signal_connect (G_OBJECT (mail_op), "progress-changed",
                          G_CALLBACK (on_progress_changed), helper);
 
-       /* FIXME: I replaced this because the API changed, but D&D
-          should be reviewed in order to allow multiple drags*/
        headers = tny_simple_list_new ();
        tny_list_append (headers, G_OBJECT (header));
-       modest_mail_operation_xfer_msgs (mail_op, headers, folder, helper->delete_source, NULL, NULL);
-
+       modest_mail_operation_xfer_msgs (mail_op, 
+                                        headers, 
+                                        folder, 
+                                        helper->delete_source, 
+                                        NULL, NULL);
+       
        /* Frees */
-       g_object_unref (G_OBJECT (mail_op));
-       g_object_unref (G_OBJECT (header));
-       g_object_unref (G_OBJECT (folder));
-       g_object_unref (headers);
+cleanup:
+       if (G_IS_OBJECT(mail_op))
+               g_object_unref (G_OBJECT (mail_op));
+       if (G_IS_OBJECT(header))
+               g_object_unref (G_OBJECT (header));
+       if (G_IS_OBJECT(folder))
+               g_object_unref (G_OBJECT (folder));
+       if (G_IS_OBJECT(headers))
+               g_object_unref (headers);
 }
 
 /*
@@ -1281,7 +1131,10 @@ drag_and_drop_from_folder_view (GtkTreeModel     *source_model,
                            &folder, -1);
 
        /* Do the mail operation */
-       mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, NULL);
+       mail_op = modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE, 
+                                                                NULL,
+                                                                modest_ui_actions_move_folder_error_handler,
+                                                                NULL);
        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), 
                                         mail_op);
        g_signal_connect (G_OBJECT (mail_op), "progress-changed",
@@ -1679,7 +1532,6 @@ modest_folder_view_set_account_id_of_visible_server_account (ModestFolderView *s
                                                             const gchar *account_id)
 {
        ModestFolderViewPrivate *priv;
-       ModestConf *conf;
        GtkTreeModel *model;
 
        g_return_if_fail (self);
@@ -1692,10 +1544,6 @@ modest_folder_view_set_account_id_of_visible_server_account (ModestFolderView *s
                g_free (priv->visible_account_id);
        priv->visible_account_id = g_strdup (account_id);
 
-       /* Save preferences */
-       conf = modest_runtime_get_conf ();
-       modest_widget_memory_save (conf, G_OBJECT (self), MODEST_CONF_FOLDER_VIEW_KEY);
-
        /* Refilter */
        model = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
        if (GTK_IS_TREE_MODEL_FILTER (model))
@@ -1713,3 +1561,77 @@ modest_folder_view_get_account_id_of_visible_server_account (ModestFolderView *s
 
        return (const gchar *) priv->visible_account_id;
 }
+
+static gboolean
+find_inbox_iter (GtkTreeModel *model, GtkTreeIter *iter, GtkTreeIter *inbox_iter)
+{
+       do {
+               GtkTreeIter child;
+               TnyFolderType type = TNY_FOLDER_TYPE_UNKNOWN;
+               gchar *name = NULL;
+
+               gtk_tree_model_get (model, iter, 
+                                       TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN, &name,
+                                   TNY_GTK_FOLDER_STORE_TREE_MODEL_TYPE_COLUMN, 
+                                   &type, -1);
+
+               /*
+               printf ("DEBUG: %s: name=%s, type=%d, TNY_FOLDER_TYPE_INBOX=%d\n", 
+                       __FUNCTION__, name, type, TNY_FOLDER_TYPE_INBOX);
+               */
+                       
+               gboolean result = FALSE;
+               if (type == TNY_FOLDER_TYPE_INBOX) {
+                       result = TRUE;
+               } else if (type == TNY_FOLDER_TYPE_NORMAL) {
+                       /* tinymail's camel implementation only provides TNY_FOLDER_TYPE_NORMAL
+                        * when getting folders from the cache, before connectin, so we do 
+                        * an extra check. We could fix this in tinymail, but it's easier 
+                        * to do here.
+                        */
+                        if (strcmp (name, "Inbox") == 0)
+                               result = TRUE;
+               }
+               
+               g_free (name);
+               
+               if (result) {
+                       *inbox_iter = *iter;
+                       return TRUE;
+               }
+
+               if (gtk_tree_model_iter_children (model, &child, iter)) {
+                       if (find_inbox_iter (model, &child, inbox_iter))
+                               return TRUE;
+               }
+
+       } while (gtk_tree_model_iter_next (model, iter));
+
+       return FALSE;
+}
+
+
+
+void 
+modest_folder_view_select_first_inbox_or_local (ModestFolderView *self)
+{
+       GtkTreeModel *model;
+       GtkTreeIter iter, inbox_iter;
+       GtkTreeSelection *sel;
+
+       model = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
+       if (!model)
+               return;
+
+       expand_root_items (self);
+       sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (self));
+
+       gtk_tree_model_get_iter_first (model, &iter);
+       if (find_inbox_iter (model, &iter, &inbox_iter)) {
+               gtk_tree_selection_select_iter (sel, &inbox_iter);
+       }
+       else {
+               gtk_tree_model_get_iter_first (model, &iter);
+               gtk_tree_selection_select_iter (sel, &iter);
+       }
+}