Disable some unused code in Fremantle
[modest] / src / widgets / modest-folder-view.c
index 9887b35..9124187 100644 (file)
@@ -44,6 +44,7 @@
 #include <tny-camel-folder.h>
 #include <tny-simple-list.h>
 #include <tny-camel-account.h>
+#include <modest-defs.h>
 #include <modest-tny-account.h>
 #include <modest-tny-folder.h>
 #include <modest-tny-local-folders-account.h>
@@ -200,6 +201,7 @@ enum {
        FOLDER_SELECTION_CHANGED_SIGNAL,
        FOLDER_DISPLAY_NAME_CHANGED_SIGNAL,
        FOLDER_ACTIVATED_SIGNAL,
+       VISIBLE_ACCOUNT_CHANGED_SIGNAL,
        LAST_SIGNAL
 };
 
@@ -230,6 +232,7 @@ struct _ModestFolderViewPrivate {
 
        gchar                *local_account_name;
        gchar                *visible_account_id;
+       gchar                *mailbox;
        ModestFolderViewStyle style;
        ModestFolderViewCellStyle cell_style;
 
@@ -338,6 +341,19 @@ modest_folder_view_class_init (ModestFolderViewClass *klass)
                              g_cclosure_marshal_VOID__POINTER,
                              G_TYPE_NONE, 1, G_TYPE_POINTER);
 
+       /*
+        * Emitted whenever the visible account changes
+        */
+       signals[VISIBLE_ACCOUNT_CHANGED_SIGNAL] =
+               g_signal_new ("visible-account-changed",
+                             G_TYPE_FROM_CLASS (gobject_class),
+                             G_SIGNAL_RUN_FIRST,
+                             G_STRUCT_OFFSET (ModestFolderViewClass,
+                                              visible_account_changed),
+                             NULL, NULL,
+                             g_cclosure_marshal_VOID__STRING,
+                             G_TYPE_NONE, 1, G_TYPE_STRING);
+
        treeview_class->select_cursor_parent = NULL;
 
 #ifdef MODEST_TOOLKIT_HILDON2
@@ -359,7 +375,7 @@ get_inner_models (ModestFolderView *self,
 
        f_model = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
        if (!GTK_IS_TREE_MODEL_FILTER(f_model)) {
-               g_warning ("BUG: %s: not a valid filter model", __FUNCTION__);
+               g_debug ("%s: emtpy model or not filter model", __FUNCTION__);
                return FALSE;
        }
 
@@ -503,6 +519,7 @@ convert_parent_folders_to_dots (gchar **item_name)
 static void
 format_compact_style (gchar **item_name,
                      GObject *instance,
+                     const gchar *mailbox,
                      gboolean bold,
                      gboolean multiaccount,
                      gboolean *use_markup)
@@ -519,6 +536,22 @@ format_compact_style (gchar **item_name,
        folder_type = tny_folder_get_folder_type (folder);
        is_special = (get_cmp_pos (folder_type, folder)!= 4);
 
+       if (mailbox) {
+               /* Remove mailbox prefix if any */
+               gchar *prefix = g_strconcat (mailbox, MODEST_FOLDER_PATH_SEPARATOR, NULL);
+               if (g_str_has_prefix (*item_name, prefix)) {
+                       gchar *new_item_name;
+
+                       new_item_name = g_strdup (*item_name + strlen (prefix));
+                       if (!g_ascii_strcasecmp (new_item_name, "Inbox")) {
+                               g_free (new_item_name);
+                               new_item_name = g_strdup (_("mcen_me_folder_inbox"));
+                       }
+                       g_free (*item_name);
+                       *item_name = new_item_name;
+               }
+       }
+
        if (!is_special || multiaccount) {
                TnyAccount *account = tny_folder_get_account (folder);
                const gchar *folder_name;
@@ -664,7 +697,7 @@ text_cell_data  (GtkTreeViewColumn *column,
 
                multiaccount = (priv->style == MODEST_FOLDER_VIEW_STYLE_SHOW_ALL);
                /* Convert item_name to markup */
-               format_compact_style (&item_name, instance, 
+               format_compact_style (&item_name, instance, priv->mailbox,
                                      item_weight == 800, 
                                      multiaccount, &use_markup);
        }
@@ -1079,6 +1112,7 @@ add_columns (GtkWidget *treeview)
 #ifdef MODEST_TOOLKIT_HILDON2
                      "ellipsize", PANGO_ELLIPSIZE_MIDDLE,
                      "ypad", MODEST_MARGIN_DEFAULT,
+                     "xpad", MODEST_MARGIN_DEFAULT,
 #else
                      "ellipsize", PANGO_ELLIPSIZE_END,
 #endif
@@ -1134,6 +1168,7 @@ modest_folder_view_init (ModestFolderView *obj)
        priv->style          = MODEST_FOLDER_VIEW_STYLE_SHOW_ALL;
        priv->cur_folder_store   = NULL;
        priv->visible_account_id = NULL;
+       priv->mailbox = NULL;
        priv->folder_to_select = NULL;
        priv->outbox_deleted_handler = 0;
        priv->reexpand = TRUE;
@@ -1251,6 +1286,7 @@ modest_folder_view_finalize (GObject *obj)
 
        g_free (priv->local_account_name);
        g_free (priv->visible_account_id);
+       g_free (priv->mailbox);
 
        if (priv->conf_key_signal) {
                g_signal_handler_disconnect (modest_runtime_get_conf (),
@@ -1562,6 +1598,7 @@ on_account_removed (TnyAccountStore *account_store,
 
                /* Clear the current visible account_id */
                modest_folder_view_set_account_id_of_visible_server_account (self, NULL);
+               modest_folder_view_set_mailbox (self, NULL);
 
                /* Call the restore method, this will set the new visible account */
                modest_widget_memory_restore (modest_runtime_get_conf(), G_OBJECT(self),
@@ -1698,10 +1735,85 @@ is_parent_of (TnyFolder *a, TnyFolder *b)
        return retval;
 }
 
+typedef struct _ForeachFolderInfo {
+       gchar *needle;
+       gboolean found;
+} ForeachFolderInfo;
+
+static gboolean 
+foreach_folder_with_id (GtkTreeModel *model,
+                       GtkTreePath *path,
+                       GtkTreeIter *iter,
+                       gpointer data)
+{
+       ForeachFolderInfo *info;
+       GObject *instance;
+
+       info = (ForeachFolderInfo *) data;
+       gtk_tree_model_get (model, iter,
+                           INSTANCE_COLUMN, &instance,
+                           -1);
+
+       if (TNY_IS_FOLDER (instance)) {
+               const gchar *id;
+               gchar *collate;
+               id = tny_folder_get_id (TNY_FOLDER (instance));
+               if (id) {
+                       collate = g_utf8_collate_key (id, -1);
+                       info->found = !strcmp (info->needle, collate);
+                       g_free (collate);
+               }
+       }
+
+       if (instance)
+               g_object_unref (instance);
+
+       return info->found;
+       
+}
+
+
 static gboolean
-has_child_with_name_of (TnyFolder *a, TnyFolder *b)
+has_folder_with_id (ModestFolderView *self, const gchar *id)
 {
-       return FALSE;
+       GtkTreeModel *model;
+       ForeachFolderInfo info = {NULL, FALSE};
+
+       model = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
+       info.needle = g_utf8_collate_key (id, -1);
+       
+       gtk_tree_model_foreach (model, foreach_folder_with_id, &info);
+       g_free (info.needle);
+
+       return info.found;
+}
+
+static gboolean
+has_child_with_name_of (ModestFolderView *self, TnyFolder *a, TnyFolder *b)
+{
+       const gchar *a_id;
+       gboolean retval = FALSE;
+
+       a_id = tny_folder_get_id (a);
+       if (a_id) {
+               const gchar *b_id;
+               b_id = tny_folder_get_id (b);
+               
+               if (b_id) {
+                       const gchar *last_bar;
+                       gchar *string_to_match;
+                       last_bar = g_strrstr (b_id, "/");
+                       if (last_bar)
+                               last_bar++;
+                       else
+                               last_bar = b_id;
+                       string_to_match = g_strconcat (a_id, "/", last_bar, NULL);
+                       retval = has_folder_with_id (self, string_to_match);
+                       g_free (string_to_match);
+               }
+       }
+
+       return retval;
 }
 
 static gboolean
@@ -1724,11 +1836,12 @@ check_move_to_this_folder_valid (ModestFolderView *self, TnyFolder *folder)
                } else if (TNY_IS_FOLDER (instance)) {
                        retval = !is_parent_of (TNY_FOLDER (instance), folder);
                        if (retval) {
-                               retval = !has_child_with_name_of (folder, TNY_FOLDER (instance));
+                               retval = !has_child_with_name_of (self, folder, TNY_FOLDER (instance));
                        }
                }
                g_object_unref (instance);
        }
+       g_object_unref (iterator);
 
        return retval;
 }
@@ -1751,11 +1864,13 @@ filter_row (GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
        gboolean found = FALSE;
        gboolean cleared = FALSE;
        ModestTnyFolderRules rules = 0;
+       gchar *fname;
 
        g_return_val_if_fail (MODEST_IS_FOLDER_VIEW (data), FALSE);
        priv = MODEST_FOLDER_VIEW_GET_PRIVATE (data);
 
        gtk_tree_model_get (model, iter,
+                           NAME_COLUMN, &fname,
                            TYPE_COLUMN, &type,
                            INSTANCE_COLUMN, &instance,
                            -1);
@@ -1764,8 +1879,10 @@ filter_row (GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
           happen when the model is being modified while it's being
           drawn. This could occur for example when moving folders
           using drag&drop */
-       if (!instance)
+       if (!instance) {
+               g_free (fname);
                return FALSE;
+       }
 
        if (TNY_IS_ACCOUNT (instance)) {
                TnyAccount *acc = TNY_ACCOUNT (instance);
@@ -1805,8 +1922,17 @@ filter_row (GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
                                            strcmp (account_id, MODEST_MMC_ACCOUNT_ID)) {
                                                /* Show only the visible account id */
                                                if (priv->visible_account_id) {
-                                                       if (strcmp (account_id, priv->visible_account_id))
-                                                               retval = FALSE;
+                                                 if (strcmp (account_id, priv->visible_account_id)) {
+                                                         retval = FALSE;
+                                                 } else if (priv->mailbox) {
+                                                         /* Filter mailboxes */
+                                                         if (!g_str_has_prefix (fname, priv->mailbox)) {
+                                                                 retval = FALSE;
+                                                         } else if (!strcmp (fname, priv->mailbox)) {
+                                                                 /* Hide mailbox parent */
+                                                                 retval = FALSE;
+                                                         }
+                                                 }
                                                }
                                        }
                                                g_object_unref (account);
@@ -1830,7 +1956,7 @@ filter_row (GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
 
        /* If this is a move to dialog, hide Sent, Outbox and Drafts
        folder as no message can be move there according to UI specs */
-       if (!priv->show_non_move) {
+       if (retval && !priv->show_non_move) {
                if (priv->list_to_move && 
                    tny_list_get_length (priv->list_to_move) > 0 &&
                    TNY_IS_FOLDER (instance)) {
@@ -1867,6 +1993,45 @@ filter_row (GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
                        return FALSE;
        }
 
+       if (retval && (priv->filter & MODEST_FOLDER_VIEW_FILTER_HIDE_FOLDERS)) {
+               if (TNY_IS_FOLDER (instance))
+                       return FALSE;
+       }
+
+       if (retval && (priv->filter & MODEST_FOLDER_VIEW_FILTER_HIDE_LOCAL_FOLDERS)) {
+               if (TNY_IS_ACCOUNT (instance)) {
+                       if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (instance)))
+                               return FALSE;
+               } else if (TNY_IS_FOLDER (instance)) {
+                       if (modest_tny_folder_is_local_folder (TNY_FOLDER (instance)))
+                               return FALSE;
+               }
+       }
+
+       if (retval && (priv->filter & MODEST_FOLDER_VIEW_FILTER_HIDE_MCC_FOLDERS)) {
+               if (TNY_IS_ACCOUNT (instance)) {
+                       if (modest_tny_account_is_memory_card_account (TNY_ACCOUNT (instance)))
+                               return FALSE;
+               } else if (TNY_IS_FOLDER (instance)) {
+                       if (modest_tny_folder_is_memory_card_folder (TNY_FOLDER (instance)))
+                               return FALSE;
+               }
+       }
+
+       if (retval && (priv->filter & MODEST_FOLDER_VIEW_FILTER_SHOW_ONLY_MAILBOXES)) {
+               /* A mailbox is a fake folder with an @ in the middle of the name */
+               if (!TNY_IS_FOLDER (instance) ||
+                   !(tny_folder_get_caps (TNY_FOLDER (instance)) & TNY_FOLDER_CAPS_NOSELECT)) {
+                       return FALSE;
+               } else {
+                       const gchar *folder_name;
+                       folder_name = tny_folder_get_name (TNY_FOLDER (instance));
+                       if (!folder_name || strchr (folder_name, '@') == NULL)
+                               return FALSE;
+               }
+               
+       }
+
        if (retval && (priv->filter & MODEST_FOLDER_VIEW_FILTER_CAN_HAVE_FOLDERS)) {
                if (TNY_IS_FOLDER (instance)) {
                        /* Check folder rules */
@@ -1943,6 +2108,7 @@ filter_row (GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
 
        /* Free */
        g_object_unref (instance);
+        g_free (fname);
 
        return retval;
 }
@@ -3196,6 +3362,11 @@ modest_folder_view_set_account_id_of_visible_server_account (ModestFolderView *s
        /* Save settings to gconf */
        modest_widget_memory_save (modest_runtime_get_conf (), G_OBJECT(self),
                                   MODEST_CONF_FOLDER_VIEW_KEY);
+
+       /* Notify observers */
+       g_signal_emit (G_OBJECT(self),
+                      signals[VISIBLE_ACCOUNT_CHANGED_SIGNAL], 0,
+                      account_id);
 }
 
 const gchar *
@@ -3246,6 +3417,7 @@ find_inbox_iter (GtkTreeModel *model, GtkTreeIter *iter, GtkTreeIter *inbox_iter
 void
 modest_folder_view_select_first_inbox_or_local (ModestFolderView *self)
 {
+#ifndef MODEST_TOOLKIT_HILDON2
        GtkTreeModel *model;
        GtkTreeIter iter, inbox_iter;
        GtkTreeSelection *sel;
@@ -3277,6 +3449,7 @@ modest_folder_view_select_first_inbox_or_local (ModestFolderView *self)
 
        /* set focus */
        gtk_widget_grab_focus (GTK_WIDGET(self));
+#endif
 }
 
 
@@ -3754,3 +3927,33 @@ modest_folder_view_set_list_to_move (ModestFolderView *self,
 
        priv->list_to_move = list;
 }
+
+void
+modest_folder_view_set_mailbox (ModestFolderView *self, const gchar *mailbox)
+{
+       ModestFolderViewPrivate *priv;
+
+       g_return_if_fail (MODEST_IS_FOLDER_VIEW (self));
+       priv = MODEST_FOLDER_VIEW_GET_PRIVATE (self);
+
+       if (priv->mailbox)
+               g_free (priv->mailbox);
+
+       priv->mailbox = g_strdup (mailbox);
+
+       /* Notify observers */
+       g_signal_emit (G_OBJECT(self),
+                      signals[VISIBLE_ACCOUNT_CHANGED_SIGNAL], 0,
+                      priv->visible_account_id);
+}
+
+const gchar *
+modest_folder_view_get_mailbox (ModestFolderView *self)
+{
+       ModestFolderViewPrivate *priv;
+
+       g_return_val_if_fail (MODEST_IS_FOLDER_VIEW (self), NULL);
+       priv = MODEST_FOLDER_VIEW_GET_PRIVATE (self);
+
+       return (const gchar *) priv->mailbox;
+}