* Changes in the autotools stuff affecting a lot of platform dependent
[modest] / src / widgets / modest-header-view.c
index f84845e..78ec1b3 100644 (file)
@@ -110,14 +110,13 @@ static void          _clipboard_set_selected_data (ModestHeaderView *header_view
 
 static void          _clear_hidding_filter (ModestHeaderView *header_view);
 
-static void modest_header_view_notify_observers(
-               ModestHeaderView *header_view,
-               GtkTreeModel *model,
-               const gchar *tny_folder_id);
+static void          modest_header_view_notify_observers(ModestHeaderView *header_view,
+                                                        GtkTreeModel *model,
+                                                        const gchar *tny_folder_id);
 
-static gboolean modest_header_view_on_expose_event (GtkTreeView *header_view,
-                                                   GdkEventExpose *event,
-                                                   gpointer user_data);
+static gboolean      modest_header_view_on_expose_event (GtkTreeView *header_view,
+                                                        GdkEventExpose *event,
+                                                        gpointer user_data);
 
 typedef enum {
        HEADER_VIEW_NON_EMPTY,
@@ -143,6 +142,7 @@ struct _ModestHeaderViewPrivate {
        /* Filter tree model */
        gchar **hidding_ids;
        guint   n_selected;
+       GtkTreeRowReference *autoselect_reference;
 
        gint    sort_colid[2][TNY_FOLDER_TYPE_NUM];
        gint    sort_type[2][TNY_FOLDER_TYPE_NUM];
@@ -337,7 +337,7 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns, Tn
        GtkTreeModel *tree_filter, *sortable;
        GtkTreeViewColumn *column=NULL;
        GtkTreeSelection *selection = NULL;
-       GtkCellRenderer *renderer_msgtype,*renderer_header,
+       GtkCellRenderer *renderer_header,
                *renderer_attach, *renderer_compact_date_or_status;
        GtkCellRenderer *renderer_compact_header, *renderer_recpt_box, 
                *renderer_subject, *renderer_subject_box, *renderer_recpt,
@@ -351,8 +351,7 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns, Tn
        
        priv = MODEST_HEADER_VIEW_GET_PRIVATE(self); 
 
-       /* FIXME: check whether these renderers need to be freed */
-       renderer_msgtype = gtk_cell_renderer_pixbuf_new ();
+       /* TODO: check whether these renderers need to be freed */
        renderer_attach  = gtk_cell_renderer_pixbuf_new ();
        renderer_priority  = gtk_cell_renderer_pixbuf_new ();
        renderer_header  = gtk_cell_renderer_text_new ();
@@ -380,7 +379,7 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns, Tn
        g_object_set_data (G_OBJECT (renderer_recpt_box), "date-renderer", renderer_compact_date_or_status);
 
        g_object_set (G_OBJECT (renderer_subject_box), "yalign", 1.0, NULL);
-#ifdef MAEMO_PLATFORM
+#ifndef MODEST_TOOLKIT_GTK
        gtk_cell_renderer_set_fixed_size (renderer_subject_box, -1, 32);
        gtk_cell_renderer_set_fixed_size (renderer_recpt_box, -1, 32);
 #endif
@@ -405,7 +404,7 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns, Tn
        g_object_set (G_OBJECT (renderer_attach),
                      "yalign", 0.0, NULL);
 
-#ifdef MAEMO_PLATFORM
+#ifndef MODEST_TOOLKIT_GTK
        gtk_cell_renderer_set_fixed_size (renderer_attach, 32, 26);
        gtk_cell_renderer_set_fixed_size (renderer_priority, 32, 26);
        gtk_cell_renderer_set_fixed_size (renderer_compact_header, -1, 64);
@@ -434,15 +433,6 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns, Tn
                
                switch (col) {
                        
-               case MODEST_HEADER_VIEW_COLUMN_MSGTYPE:
-                       column = get_new_column (_("M"), renderer_msgtype, FALSE,
-                                                TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN,
-                                                FALSE,
-                                                (GtkTreeCellDataFunc)_modest_header_view_msgtype_cell_data,
-                                                NULL);
-                       gtk_tree_view_column_set_fixed_width (column, 45);
-                       break;
-
                case MODEST_HEADER_VIEW_COLUMN_ATTACH:
                        column = get_new_column (_("A"), renderer_attach, FALSE,
                                                 TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN,
@@ -554,7 +544,6 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns, Tn
                                                 compact_column, NULL);
        }
 
-
        return TRUE;
 }
 
@@ -570,6 +559,7 @@ modest_header_view_init (ModestHeaderView *obj)
 
        priv->monitor        = NULL;
        priv->observers_lock = g_mutex_new ();
+       priv->autoselect_reference = NULL;
 
        priv->status  = HEADER_VIEW_INIT;
        priv->status_timeout = 0;
@@ -654,6 +644,11 @@ modest_header_view_finalize (GObject *obj)
        /* Clear hidding array created by cut operation */
        _clear_hidding_filter (MODEST_HEADER_VIEW (obj));
 
+       if (priv->autoselect_reference != NULL) {
+               gtk_tree_row_reference_free (priv->autoselect_reference);
+               priv->autoselect_reference = NULL;
+       }
+
        G_OBJECT_CLASS(parent_class)->finalize (obj);
 }
 
@@ -792,7 +787,7 @@ modest_header_view_get_selected_headers (ModestHeaderView *self)
 static void
 scroll_to_selected (ModestHeaderView *self, GtkTreeIter *iter, gboolean up)
 {
-#ifdef MODEST_PLATFORM_GNOME 
+#ifdef MODEST_TOOLKIT_GTK 
 
        GtkTreePath *selected_path;
        GtkTreePath *start, *end;
@@ -817,7 +812,7 @@ scroll_to_selected (ModestHeaderView *self, GtkTreeIter *iter, gboolean up)
        gtk_tree_path_free (start);
        gtk_tree_path_free (end);
 
-#endif /* MODEST_PLATFORM_GNOME */
+#endif /* MODEST_TOOLKIT_GTK */
 }
 
 
@@ -940,21 +935,72 @@ modest_header_view_on_expose_event(GtkTreeView *header_view,
        GtkTreeSelection *sel;
        GtkTreeModel *model;
        GtkTreeIter tree_iter;
+       ModestHeaderViewPrivate *priv;
 
+       priv = MODEST_HEADER_VIEW_GET_PRIVATE(header_view);
        model = gtk_tree_view_get_model(header_view);
 
        if (!model)
                return FALSE;
 
        sel = gtk_tree_view_get_selection(header_view);
-       if(!gtk_tree_selection_count_selected_rows(sel))
+       if(!gtk_tree_selection_count_selected_rows(sel)) {
                if (gtk_tree_model_get_iter_first(model, &tree_iter)) {
+                       GtkTreePath *tree_iter_path;
                        /* Prevent the widget from getting the focus
                           when selecting the first item */
+                       tree_iter_path = gtk_tree_model_get_path (model, &tree_iter);
                        g_object_set(header_view, "can-focus", FALSE, NULL);
                        gtk_tree_selection_select_iter(sel, &tree_iter);
+                       gtk_tree_view_set_cursor (header_view, tree_iter_path, NULL, FALSE);
                        g_object_set(header_view, "can-focus", TRUE, NULL);
+                       if (priv->autoselect_reference) {
+                               gtk_tree_row_reference_free (priv->autoselect_reference);
+                       }
+                       priv->autoselect_reference = gtk_tree_row_reference_new (model, tree_iter_path);
+                       gtk_tree_path_free (tree_iter_path);
                }
+       } else {
+               if (priv->autoselect_reference != NULL) {
+                       gboolean moved_selection = FALSE;
+                       GtkTreePath * last_path;
+                       if (gtk_tree_selection_count_selected_rows (sel) != 1) {
+                               moved_selection = TRUE;
+                       } else {
+                               GList *rows;
+
+                               rows = gtk_tree_selection_get_selected_rows (sel, NULL);
+                               last_path = gtk_tree_row_reference_get_path (priv->autoselect_reference);
+                               if (gtk_tree_path_compare (last_path, (GtkTreePath *) rows->data) != 0)
+                                       moved_selection = TRUE;
+                               g_list_foreach (rows, (GFunc) gtk_tree_path_free, NULL);
+                               g_list_free (rows);
+                               gtk_tree_path_free (last_path);
+                       }
+                       if (moved_selection) {
+                               gtk_tree_row_reference_free (priv->autoselect_reference);
+                               priv->autoselect_reference = NULL;
+                       } else {
+
+                               if (gtk_tree_model_get_iter_first (model, &tree_iter)) {
+                                       GtkTreePath *current_path;
+                                       current_path = gtk_tree_model_get_path (model, &tree_iter);
+                                       last_path = gtk_tree_row_reference_get_path (priv->autoselect_reference);
+                                       if (gtk_tree_path_compare (current_path, last_path) != 0) {
+                                               g_object_set(header_view, "can-focus", FALSE, NULL);
+                                               gtk_tree_selection_unselect_all (sel);
+                                               gtk_tree_selection_select_iter(sel, &tree_iter);
+                                               gtk_tree_view_set_cursor (header_view, current_path, NULL, FALSE);
+                                               g_object_set(header_view, "can-focus", TRUE, NULL);
+                                               gtk_tree_row_reference_free (priv->autoselect_reference);
+                                               priv->autoselect_reference = gtk_tree_row_reference_new (model, current_path);
+                                       }
+                                       gtk_tree_path_free (current_path);
+                                       gtk_tree_path_free (last_path);
+                               }
+                       }
+               }
+       }
 
        return FALSE;
 }
@@ -1322,6 +1368,12 @@ modest_header_view_set_folder (ModestHeaderView *self,
                        g_object_unref (G_OBJECT (priv->monitor));
                        priv->monitor = NULL;
                }
+
+               if (priv->autoselect_reference) {
+                       gtk_tree_row_reference_free (priv->autoselect_reference);
+                       priv->autoselect_reference = NULL;
+               }
+
                gtk_tree_view_set_model (GTK_TREE_VIEW (self), NULL); 
 
                modest_header_view_notify_observers(self, NULL, NULL);
@@ -1705,33 +1757,6 @@ on_focus_in (GtkWidget     *self,
        if (selected == NULL) return FALSE;
        selected_path = (GtkTreePath *) selected->data;
 
-       /* Check if we need to scroll */
-       #if GTK_CHECK_VERSION(2, 8, 0) /* TODO: gtk_tree_view_get_visible_range() is only available in GTK+ 2.8 */
-       GtkTreePath *start_path = NULL;
-       GtkTreePath *end_path = NULL;
-       if (gtk_tree_view_get_visible_range (GTK_TREE_VIEW (self),
-                                            &start_path,
-                                            &end_path)) {
-
-               if ((gtk_tree_path_compare (start_path, selected_path) != -1) ||
-                   (gtk_tree_path_compare (end_path, selected_path) != 1)) {
-
-                       /* Scroll to first path */
-                       gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (self),
-                                                     selected_path,
-                                                     NULL,
-                                                     TRUE,
-                                                     0.5,
-                                                     0.0);
-               }
-       }
-       if (start_path)
-               gtk_tree_path_free (start_path);
-       if (end_path)
-               gtk_tree_path_free (end_path);
-
-       #endif /* GTK_CHECK_VERSION */
-
        /* Frees */     
        g_list_foreach (selected, (GFunc) gtk_tree_path_free, NULL);
        g_list_free (selected);