* fix the fallout of the configuration changes - builds again now
[modest] / src / widgets / modest-folder-view.c
index 887d99f..2434fcc 100644 (file)
@@ -161,6 +161,8 @@ struct _ModestFolderViewPrivate {
        gchar                *local_account_name;
        gchar                *visible_account_id;
        ModestFolderViewStyle style;
+
+       gboolean              reselect; /* we use this to force a reselection of the INBOX */
 };
 #define MODEST_FOLDER_VIEW_GET_PRIVATE(o)                      \
        (G_TYPE_INSTANCE_GET_PRIVATE((o),                       \
@@ -316,7 +318,7 @@ text_cell_data  (GtkTreeViewColumn *column,  GtkCellRenderer *renderer,
                if (modest_tny_account_is_virtual_local_folders (
                                TNY_ACCOUNT (instance))) {
                        item_name = g_strdup (priv->local_account_name);
-                       item_weight = 400;
+                       item_weight = 800;
                } else {
                        item_name = g_strdup (fname);
                        item_weight = 800;
@@ -493,6 +495,7 @@ modest_folder_view_init (ModestFolderView *obj)
        priv->clipboard = modest_runtime_get_email_clipboard ();
        priv->hidding_ids = NULL;
        priv->n_selected = 0;
+       priv->reselect = FALSE;
 
        /* Build treeview */
        add_columns (GTK_WIDGET (obj));
@@ -569,6 +572,11 @@ modest_folder_view_finalize (GObject *obj)
                priv->conf_key_signal = 0;
        }
 
+       if (priv->cur_folder_store) {
+               g_object_unref (priv->cur_folder_store);
+               priv->cur_folder_store = NULL;
+       }
+
        /* Clear hidding array created by cut operation */
        _clear_hidding_filter (MODEST_FOLDER_VIEW (obj));
 
@@ -620,6 +628,9 @@ modest_folder_view_set_account_store (TnyAccountStoreView *self, TnyAccountStore
                g_signal_connect (G_OBJECT(account_store), "accounts_reloaded",
                                  G_CALLBACK (on_accounts_reloaded), self);
 
+       g_signal_connect (G_OBJECT(account_store), "connecting_finished",
+                               G_CALLBACK (on_accounts_reloaded), self);
+
        on_accounts_reloaded (account_store, (gpointer ) self);
        
        g_object_unref (G_OBJECT (device));
@@ -685,6 +696,24 @@ modest_folder_view_set_title (ModestFolderView *self, const gchar *title)
                                           title != NULL);
 }
 
+static gboolean
+modest_folder_view_on_map (ModestFolderView *self, 
+                          GdkEventExpose *event,
+                          gpointer data)
+{
+       ModestFolderViewPrivate *priv;
+
+       priv = MODEST_FOLDER_VIEW_GET_PRIVATE (self);
+
+       /* This won't happen often */
+       if (G_UNLIKELY (priv->reselect)) {
+               /* Select the first inbox or the local account if not found */
+               modest_folder_view_select_first_inbox_or_local (self);
+               priv->reselect = FALSE;
+       }
+       return FALSE;
+}
+
 GtkWidget*
 modest_folder_view_new (TnyFolderStoreQuery *query)
 {
@@ -702,6 +731,8 @@ modest_folder_view_new (TnyFolderStoreQuery *query)
        priv->changed_signal = g_signal_connect (sel, "changed",
                                                 G_CALLBACK (on_selection_changed), self);
 
+       g_signal_connect (self, "expose-event", G_CALLBACK (modest_folder_view_on_map), NULL);
+
        return GTK_WIDGET(self);
 }
 
@@ -754,7 +785,8 @@ filter_row (GtkTreeModel *model,
                return FALSE;
 
        if (type == TNY_FOLDER_TYPE_ROOT) {
-               /* TNY_FOLDER_TYPE_ROOT means that the instance is an account instead of a folder. */
+               /* TNY_FOLDER_TYPE_ROOT means that the instance is an
+                  account instead of a folder. */
                if (TNY_IS_ACCOUNT (instance)) {
                        TnyAccount *acc = TNY_ACCOUNT (instance);
                        const gchar *account_id = tny_account_get_id (acc);
@@ -857,18 +889,16 @@ modest_folder_view_update_model (ModestFolderView *self,
        gtk_tree_view_set_model (GTK_TREE_VIEW(self), filter_model);
 /*     gtk_tree_view_set_model (GTK_TREE_VIEW(self),  */
 /*                              (filter_model) ? filter_model : sortable); */
-       expand_root_items (self); /* expand all account folders */
-       
+
        g_object_unref (model);
-       
        g_object_unref (filter_model);
 /*     if (filter_model) */
 /*             g_object_unref (filter_model); */
                        
        g_object_unref (sortable);
 
-       /* Select the first inbox or the local account if not found */
-       modest_folder_view_select_first_inbox_or_local (self);
+       /* Force a reselection of the INBOX next time the widget is shown */
+       priv->reselect = TRUE;
                        
        return TRUE;
 }
@@ -888,27 +918,21 @@ on_selection_changed (GtkTreeSelection *sel, gpointer user_data)
        
        priv = MODEST_FOLDER_VIEW_GET_PRIVATE(user_data);
 
-       /* folder was _un_selected if true */
-       if (!gtk_tree_selection_get_selected (sel, &model, &iter)) {
-               if (priv->cur_folder_store)
-                       g_object_unref (priv->cur_folder_store);
-               priv->cur_folder_store = NULL;
-
-               /* Notify the display name observers */
-               g_signal_emit (G_OBJECT(user_data),
-                              signals[FOLDER_DISPLAY_NAME_CHANGED_SIGNAL], 0,
-                              NULL);
+       if(!gtk_tree_selection_get_selected (sel, &model, &iter))
                return;
-       }
 
-       tree_view = MODEST_FOLDER_VIEW (user_data);
+       /* Notify the display name observers */
+       g_signal_emit (G_OBJECT(user_data),
+                      signals[FOLDER_DISPLAY_NAME_CHANGED_SIGNAL], 0,
+                      NULL);
 
+       tree_view = MODEST_FOLDER_VIEW (user_data);
        gtk_tree_model_get (model, &iter,
                            TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, &folder,
                            -1);
 
        /* If the folder is the same do not notify */
-       if (priv->cur_folder_store == folder) {
+       if (priv->cur_folder_store == folder && folder) {
                g_object_unref (folder);
                return;
        }
@@ -918,6 +942,7 @@ on_selection_changed (GtkTreeSelection *sel, gpointer user_data)
                g_signal_emit (G_OBJECT(tree_view), signals[FOLDER_SELECTION_CHANGED_SIGNAL], 0,
                               priv->cur_folder_store, FALSE);
                g_object_unref (priv->cur_folder_store);
+               priv->cur_folder_store = NULL;
        }
 
        /* New current references */
@@ -926,7 +951,7 @@ on_selection_changed (GtkTreeSelection *sel, gpointer user_data)
        /* New folder has been selected */
        g_signal_emit (G_OBJECT(tree_view),
                       signals[FOLDER_SELECTION_CHANGED_SIGNAL],
-                      0, folder, TRUE);
+                      0, priv->cur_folder_store, TRUE);
 }
 
 TnyFolderStore *
@@ -967,6 +992,27 @@ get_cmp_rows_type_pos (GObject *folder)
        }
 }
 
+static gint
+get_cmp_subfolder_type_pos (TnyFolderType t)
+{
+       /* Outbox, Drafts, Sent, User */
+       /* 0, 1, 2, 3 */
+
+       switch (t) {
+       case TNY_FOLDER_TYPE_OUTBOX:
+               return 0;
+               break;
+       case TNY_FOLDER_TYPE_DRAFTS:
+               return 1;
+               break;
+       case TNY_FOLDER_TYPE_SENT:
+               return 2;
+               break;
+       default:
+               return 3;
+       }
+}
+
 /*
  * This function orders the mail accounts according to these rules:
  * 1st - remote accounts
@@ -981,6 +1027,7 @@ cmp_rows (GtkTreeModel *tree_model, GtkTreeIter *iter1, GtkTreeIter *iter2,
        gchar *name1 = NULL;
        gchar *name2 = NULL;
        TnyFolderType type = TNY_FOLDER_TYPE_UNKNOWN;
+       TnyFolderType type2 = TNY_FOLDER_TYPE_UNKNOWN;
        GObject *folder1 = NULL;
        GObject *folder2 = NULL;
 
@@ -991,6 +1038,7 @@ cmp_rows (GtkTreeModel *tree_model, GtkTreeIter *iter1, GtkTreeIter *iter2,
                            -1);
        gtk_tree_model_get (tree_model, iter2,
                            TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN, &name2,
+                           TNY_GTK_FOLDER_STORE_TREE_MODEL_TYPE_COLUMN, &type2,
                            TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, &folder2,
                            -1);
 
@@ -1031,7 +1079,30 @@ cmp_rows (GtkTreeModel *tree_model, GtkTreeIter *iter1, GtkTreeIter *iter2,
                                cmp = modest_text_utils_utf8_strcmp (name1, name2, TRUE);
                }
        } else {
-               cmp = modest_text_utils_utf8_strcmp (name1, name2, TRUE);
+               GtkTreeIter parent;
+               gboolean has_parent;
+               gint cmp1 = 0, cmp2 = 0;
+               /* get the parent to know if it's a local folder */
+               has_parent = gtk_tree_model_iter_parent (tree_model, &parent, iter1);
+               if (has_parent) {
+                       GObject *parent_folder;
+                       TnyFolderType parent_type = TNY_FOLDER_TYPE_UNKNOWN;
+                       gtk_tree_model_get (tree_model, &parent, 
+                                           TNY_GTK_FOLDER_STORE_TREE_MODEL_TYPE_COLUMN, &parent_type,
+                                           TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, &parent_folder,
+                                           -1);
+                       if ((parent_type == TNY_FOLDER_TYPE_ROOT) &&
+                           TNY_IS_ACCOUNT (parent_folder) &&
+                           modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) {
+                               cmp1 = get_cmp_subfolder_type_pos (modest_tny_folder_get_local_folder_type (TNY_FOLDER (folder1)));
+                               cmp2 = get_cmp_subfolder_type_pos (modest_tny_folder_get_local_folder_type (TNY_FOLDER (folder2)));
+                       }
+                       g_object_unref (parent_folder);
+               }
+               if (cmp1 == cmp2)
+                       cmp = modest_text_utils_utf8_strcmp (name1, name2, TRUE);
+               else 
+                       cmp = (cmp1 - cmp2);
        }
        
        if (folder1)
@@ -1681,7 +1752,7 @@ find_inbox_iter (GtkTreeModel *model, GtkTreeIter *iter, GtkTreeIter *inbox_iter
                gchar *name = NULL;
 
                gtk_tree_model_get (model, iter, 
-                                       TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN, &name,
+                                   TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN, &name,
                                    TNY_GTK_FOLDER_STORE_TREE_MODEL_TYPE_COLUMN, 
                                    &type, -1);
 
@@ -1727,9 +1798,9 @@ modest_folder_view_select_first_inbox_or_local (ModestFolderView *self)
        GtkTreeIter iter, inbox_iter;
        GtkTreeSelection *sel;
 
-       /* Do not set it if the folder view was not painted */
-       if (!GTK_WIDGET_MAPPED (self))
-               return; 
+/*     /\* Do not set it if the folder view was not painted *\/ */
+/*     if (!GTK_WIDGET_MAPPED (self)) */
+/*             return; */
 
        model = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
        if (!model)