Modified webpage: now tinymail repository is in gitorious.
[modest] / src / widgets / modest-folder-view.c
index 8c3f8a4..21aa231 100644 (file)
@@ -63,6 +63,9 @@
 #include "modest-ui-constants.h"
 #include "widgets/modest-window.h"
 #include <modest-account-protocol.h>
+#ifdef MODEST_TOOLKIT_HILDON2
+#include <hildon/hildon.h>
+#endif
 
 /* Folder view drag types */
 const GtkTargetEntry folder_view_drag_types[] =
@@ -122,10 +125,6 @@ static gboolean     filter_row             (GtkTreeModel *model,
                                            GtkTreeIter *iter,
                                            gpointer data);
 
-static gboolean     on_key_pressed         (GtkWidget *self,
-                                           GdkEventKey *event,
-                                           gpointer user_data);
-
 static void         on_configuration_key_changed  (ModestConf* conf,
                                                   const gchar *key,
                                                   ModestConfEvent event,
@@ -185,6 +184,9 @@ struct _ModestFolderViewPrivate {
        gchar **hidding_ids;
        guint n_selected;
        ModestFolderViewFilter filter;
+#ifdef MODEST_TOOLKIT_HILDON2
+       GtkWidget *live_search;
+#endif
 
        TnyFolderStoreQuery  *query;
        gboolean              do_refresh;
@@ -518,6 +520,7 @@ format_compact_style (gchar **item_name,
        TnyFolder *folder;
        gboolean is_special;
        TnyFolderType folder_type;
+       gboolean l_use_markup;
 
        if (!TNY_IS_FOLDER (instance))
                return;
@@ -574,10 +577,58 @@ format_compact_style (gchar **item_name,
                g_object_unref (account);
 
                *item_name = g_string_free (buffer, FALSE);
-               *use_markup = FALSE;
+               l_use_markup = FALSE;
        } else {
-               *use_markup = FALSE;
+               l_use_markup = FALSE;
        }
+       if (use_markup)
+               *use_markup = l_use_markup;
+}
+
+static void
+replace_special_folder_prefix (gchar **item_name)
+{
+       const gchar *separator;
+       gchar *prefix;
+
+       if (item_name == NULL || *item_name == NULL || **item_name == '\0')
+               return;
+       separator = g_strstr_len (*item_name, -1, MODEST_FOLDER_PATH_SEPARATOR);
+       if (separator == NULL)
+               return;
+
+       prefix = g_strndup (*item_name, separator - *item_name);
+       g_strstrip (prefix);
+
+       if (prefix && *prefix != '\0') {
+               TnyFolderType folder_type;
+               gchar *new_name;
+               gchar *downcase;
+
+               downcase = g_utf8_strdown (prefix, -1);
+               g_free (prefix);
+               prefix = downcase;
+
+               if (strcmp (downcase, "inbox") == 0) {
+                       folder_type = TNY_FOLDER_TYPE_INBOX;
+                       new_name = g_strconcat (_("mcen_me_folder_inbox"), separator, NULL);
+                       g_free (*item_name);
+                       *item_name = new_name;
+               } else {
+                       folder_type = modest_local_folder_info_get_type (prefix);
+                       switch (folder_type) {
+                       case TNY_FOLDER_TYPE_INBOX:
+                       case TNY_FOLDER_TYPE_ARCHIVE:
+                               new_name = g_strconcat (modest_local_folder_info_get_type_display_name (folder_type), separator, NULL);
+                               g_free (*item_name);
+                               *item_name = new_name;
+                               break;
+                       default:
+                               break;
+                       }
+               }
+       }
+       g_free (prefix);
 }
 
 static void
@@ -704,6 +755,8 @@ text_cell_data  (GtkTreeViewColumn *column,
                format_compact_style (&item_name, instance, priv->mailbox,
                                      item_weight == 800, 
                                      multiaccount, &use_markup);
+       } else {
+               replace_special_folder_prefix (&item_name);
        }
 
        if (item_name && item_weight) {
@@ -1215,6 +1268,7 @@ add_columns (GtkWidget *treeview)
        gtk_tree_view_column_set_fixed_width (column, TRUE);
        gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW(treeview), FALSE);
        gtk_tree_view_set_enable_search (GTK_TREE_VIEW(treeview), FALSE);
+       gtk_tree_view_set_rules_hint ((GtkTreeView *) treeview, TRUE);
 
        /* Add column */
        gtk_tree_view_append_column (GTK_TREE_VIEW(treeview),column);
@@ -1240,6 +1294,9 @@ modest_folder_view_init (ModestFolderView *obj)
        priv->outbox_deleted_handler = 0;
        priv->reexpand = TRUE;
        priv->signal_handlers = 0;
+#ifdef MODEST_TOOLKIT_HILDON2
+       priv->live_search = NULL;
+#endif
 
        /* Initialize the local account name */
        conf = modest_runtime_get_conf();
@@ -1258,11 +1315,6 @@ modest_folder_view_init (ModestFolderView *obj)
        /* Build treeview */
        add_columns (GTK_WIDGET (obj));
 
-       /* Connect signals */
-       g_signal_connect (G_OBJECT (obj),
-                         "key-press-event",
-                         G_CALLBACK (on_key_pressed), NULL);
-
        priv->display_name_changed_signal =
                g_signal_connect (modest_runtime_get_account_mgr (),
                                  "display_name_changed",
@@ -1759,6 +1811,9 @@ modest_folder_view_new_full (TnyFolderStoreQuery *query, gboolean do_refresh)
 
        g_signal_connect (self, "expose-event", G_CALLBACK (modest_folder_view_on_map), NULL);
 
+       /* Hide headers by default */
+       gtk_tree_view_set_headers_visible ((GtkTreeView *)self, FALSE);
+
        return GTK_WIDGET(self);
 }
 
@@ -2067,31 +2122,31 @@ filter_row (GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
        /* apply special filters */
        if (retval && (priv->filter & MODEST_FOLDER_VIEW_FILTER_HIDE_ACCOUNTS)) {
                if (TNY_IS_ACCOUNT (instance))
-                       return FALSE;
+                       retval = FALSE;
        }
 
        if (retval && (priv->filter & MODEST_FOLDER_VIEW_FILTER_HIDE_FOLDERS)) {
                if (TNY_IS_FOLDER (instance))
-                       return FALSE;
+                       retval = 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;
+                               retval = FALSE;
                } else if (TNY_IS_FOLDER (instance)) {
                        if (modest_tny_folder_is_local_folder (TNY_FOLDER (instance)))
-                               return FALSE;
+                               retval = 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;
+                               retval = FALSE;
                } else if (TNY_IS_FOLDER (instance)) {
                        if (modest_tny_folder_is_memory_card_folder (TNY_FOLDER (instance)))
-                               return FALSE;
+                               retval = FALSE;
                }
        }
 
@@ -2099,12 +2154,12 @@ filter_row (GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
                /* 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;
+                       retval = FALSE;
                } else {
                        const gchar *folder_name;
                        folder_name = tny_folder_get_name (TNY_FOLDER (instance));
                        if (!folder_name || strchr (folder_name, '@') == NULL)
-                               return FALSE;
+                               retval = FALSE;
                }
                
        }
@@ -2183,6 +2238,50 @@ filter_row (GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
                }
        }
 
+#ifdef MODEST_TOOLKIT_HILDON2
+       if (retval && (priv->live_search)) {
+               const gchar *needle;
+               needle = hildon_live_search_get_text (HILDON_LIVE_SEARCH (priv->live_search));
+               if (needle && needle[0] != '\0') {
+                       gchar *haystack;
+                       gboolean is_local;
+                       
+                       haystack = g_strdup (fname);
+                       if (type != TNY_FOLDER_TYPE_ROOT) {
+                               is_local = modest_tny_folder_is_local_folder (TNY_FOLDER (instance)) ||
+                                       modest_tny_folder_is_memory_card_folder (TNY_FOLDER (instance));
+                               if (is_local) {
+                                       TnyFolderType type = TNY_FOLDER_TYPE_UNKNOWN;
+                                       type = modest_tny_folder_get_local_or_mmc_folder_type (TNY_FOLDER (instance));
+                                       if (type != TNY_FOLDER_TYPE_UNKNOWN) {
+                                               g_free (haystack);
+                                               haystack = g_strdup (modest_local_folder_info_get_type_display_name (type));
+                                       }
+                               } else {
+                               }
+                       } else {
+                               if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (instance))) {
+                                       g_free (haystack);
+                                       haystack = g_strdup (priv->local_account_name);
+                               } else if (modest_tny_account_is_memory_card_account (TNY_ACCOUNT (instance))) {
+                                       g_free (haystack);
+                                       haystack = g_strdup (tny_account_get_name (TNY_ACCOUNT (instance)));
+                               }
+                       }
+
+                       if (type == TNY_FOLDER_TYPE_INBOX &&
+                           g_str_has_suffix (haystack, "Inbox")) {
+                               g_free (haystack);
+                               haystack = g_strdup (_("mcen_me_folder_inbox"));
+                       }
+                       format_compact_style (&haystack, instance, priv->mailbox, FALSE, 
+                                     priv->style == MODEST_FOLDER_VIEW_STYLE_SHOW_ALL, NULL);
+                       retval = modest_text_utils_live_search_find (haystack, needle);
+                       g_free (haystack);
+               }
+       }
+#endif
+
        /* Free */
        g_object_unref (instance);
         g_free (fname);
@@ -2740,42 +2839,6 @@ cmp_rows (GtkTreeModel *tree_model, GtkTreeIter *iter1, GtkTreeIter *iter2,
 
 
 /*
- * This function manages the navigation through the folders using the
- * keyboard or the hardware keys in the device
- */
-static gboolean
-on_key_pressed (GtkWidget *self,
-               GdkEventKey *event,
-               gpointer user_data)
-{
-       GtkTreeSelection *selection;
-       GtkTreeIter iter;
-       GtkTreeModel *model;
-       gboolean retval = FALSE;
-
-       /* Up and Down are automatically managed by the treeview */
-       if (event->keyval == GDK_Return) {
-               /* Expand/Collapse the selected row */
-               selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (self));
-               if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
-                       GtkTreePath *path;
-
-                       path = gtk_tree_model_get_path (model, &iter);
-
-                       if (gtk_tree_view_row_expanded (GTK_TREE_VIEW (self), path))
-                               gtk_tree_view_collapse_row (GTK_TREE_VIEW (self), path);
-                       else
-                               gtk_tree_view_expand_row (GTK_TREE_VIEW (self), path, FALSE);
-                       gtk_tree_path_free (path);
-               }
-               /* No further processing */
-               retval = TRUE;
-       }
-
-       return retval;
-}
-
-/*
  * We listen to the changes in the local folder account name key,
  * because we want to show the right name in the view. The local
  * folder account name corresponds to the device name in the Maemo
@@ -2884,36 +2947,6 @@ 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;
-
-               gtk_tree_model_get (model, iter,
-                                   TYPE_COLUMN,
-                                   &type, -1);
-
-               gboolean result = FALSE;
-               if (type == TNY_FOLDER_TYPE_INBOX) {
-                       result = TRUE;
-               }
-               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;
-}
-
 /* recursive */
 static gboolean
 find_folder_iter (GtkTreeModel *model, GtkTreeIter *iter, GtkTreeIter *folder_iter,
@@ -3248,7 +3281,7 @@ update_style (ModestFolderView *self)
        attr_list = pango_attr_list_new ();
 
        if (!gtk_style_lookup_color (gtk_widget_get_style (GTK_WIDGET (self)), "SecondaryTextColor", &style_color)) {
-               gdk_color_parse ("grey", &style_color);
+               gdk_color_parse (MODEST_SECONDARY_COLOR, &style_color);
        }
        attr = pango_attr_foreground_new (style_color.red, style_color.green, style_color.blue);
        pango_attr_list_insert (attr_list, attr);
@@ -3412,7 +3445,9 @@ modest_folder_view_get_activity (ModestFolderView *self)
 
        g_return_val_if_fail (MODEST_IS_FOLDER_VIEW (self), FALSE);
        priv = MODEST_FOLDER_VIEW_GET_PRIVATE (self);
-       g_return_val_if_fail (get_inner_models (self, NULL, NULL, &inner_model), FALSE);
+
+       if (!get_inner_models (self, NULL, NULL, &inner_model))
+               return FALSE;
 
        if (TNY_IS_GTK_FOLDER_LIST_STORE (inner_model)) {
                return tny_gtk_folder_list_store_get_activity (TNY_GTK_FOLDER_LIST_STORE (inner_model));
@@ -3453,3 +3488,31 @@ modest_folder_view_get_model_tny_list (ModestFolderView *self)
        return ret_value;
 
 }
+
+#ifdef MODEST_TOOLKIT_HILDON2
+static gboolean
+on_live_search_refilter (HildonLiveSearch *livesearch,
+                        ModestFolderView *self)
+{
+       GtkTreeModel *filter_model;
+
+       if (get_inner_models (self, &filter_model, NULL, NULL))
+               gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (filter_model));
+
+       return TRUE;
+}
+
+GtkWidget *
+modest_folder_view_setup_live_search (ModestFolderView *self)
+{
+       ModestFolderViewPrivate *priv;
+
+       g_return_val_if_fail (MODEST_IS_FOLDER_VIEW (self), NULL);
+       priv = MODEST_FOLDER_VIEW_GET_PRIVATE (self);
+       priv->live_search = hildon_live_search_new ();
+
+       g_signal_connect (G_OBJECT (priv->live_search), "refilter", G_CALLBACK (on_live_search_refilter), self);
+
+       return priv->live_search;
+}
+#endif