* src/modest-marshal.list:
[modest] / src / widgets / modest-header-view.c
index 72da5b9..1b52c1e 100644 (file)
@@ -143,6 +143,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];
@@ -380,8 +381,10 @@ 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 MODEST_PLATFORM_MAEMO
        gtk_cell_renderer_set_fixed_size (renderer_subject_box, -1, 32);
        gtk_cell_renderer_set_fixed_size (renderer_recpt_box, -1, 32);
+#endif
        g_object_set (G_OBJECT (renderer_recpt_box), "yalign", 0.0, NULL);
        g_object_set(G_OBJECT(renderer_header),
                     "ellipsize", PANGO_ELLIPSIZE_END,
@@ -403,9 +406,15 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns, Tn
        g_object_set (G_OBJECT (renderer_attach),
                      "yalign", 0.0, NULL);
 
+#ifdef MODEST_PLATFORM_MAEMO
        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);
+#else
+       gtk_cell_renderer_set_fixed_size (renderer_attach, 16, 16);
+       gtk_cell_renderer_set_fixed_size (renderer_priority, 16, 16);
+       /* gtk_cell_renderer_set_fixed_size (renderer_compact_header, -1, 64); */
+#endif
        
        remove_all_columns (self);
 
@@ -562,6 +571,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;
@@ -646,6 +656,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);
 }
 
@@ -932,21 +947,71 @@ 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);
+                       }
+                       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;
 }
@@ -981,6 +1046,9 @@ set_folder_intern_get_headers_async_cb (TnyFolder *folder,
        self = MODEST_HEADER_VIEW (user_data);
        priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
 
+       if (cancelled || err)
+               return;
+
        /* Add IDLE observer (monitor) and another folder observer for
           new messages (self) */
        g_mutex_lock (priv->observers_lock);
@@ -1225,11 +1293,11 @@ refresh_folder_error_handler (ModestMailOperation *mail_op,
 void
 modest_header_view_set_folder (ModestHeaderView *self, 
                               TnyFolder *folder,
+                              gboolean refresh,
                               RefreshAsyncUserCallback callback,
                               gpointer user_data)
 {
        ModestHeaderViewPrivate *priv;
-       SetFolderHelper *info;
        ModestWindow *main_win;
        
        g_return_if_fail (self);
@@ -1257,8 +1325,9 @@ modest_header_view_set_folder (ModestHeaderView *self,
        }
 
        if (folder) {
-               ModestMailOperation *mail_op = NULL;
                GtkTreeSelection *selection;
+               SetFolderHelper *info;
+               ModestMailOperation *mail_op = NULL;
 
                /* Set folder in the model */
                modest_header_view_set_folder_intern (self, folder);
@@ -1279,7 +1348,7 @@ modest_header_view_set_folder (ModestHeaderView *self,
                               0, TRUE, NULL);
 
                /* create the helper */
-               info = g_malloc0 (sizeof(SetFolderHelper));
+               info = g_malloc0 (sizeof (SetFolderHelper));
                info->header_view = g_object_ref (self);
                info->cb = callback;
                info->user_data = user_data;
@@ -1288,15 +1357,18 @@ modest_header_view_set_folder (ModestHeaderView *self,
                mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT(main_win),
                                                                         refresh_folder_error_handler,
                                                                         NULL, NULL);
-               modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
-                                                mail_op);
-
-               /* Refresh the folder asynchronously */
-               modest_mail_operation_refresh_folder (mail_op,
-                                                     folder,
-                                                     folder_refreshed_cb,
-                                                     info);
-
+               if (refresh) {                  
+                       modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
+                                                        mail_op);
+                       
+                       /* Refresh the folder asynchronously */
+                       modest_mail_operation_refresh_folder (mail_op,
+                                                             folder,
+                                                             folder_refreshed_cb,
+                                                             info);
+               } else {
+                       folder_refreshed_cb (mail_op, folder, info);
+               }
                /* Free */
                g_object_unref (mail_op);
        } else {
@@ -1803,7 +1875,7 @@ on_button_press_event(GtkWidget * self, GdkEventButton * event, gpointer userdat
        /* If it's already opened then do not let the button-press
           event go on because it'll perform a message open because
           we're clicking on to an already selected header */
-       return (already_opened) ? TRUE : FALSE;
+       return FALSE;
 }
 
 static void
@@ -1890,7 +1962,7 @@ modest_header_view_clear (ModestHeaderView *self)
 {
        g_return_if_fail (self && MODEST_IS_HEADER_VIEW(self));
        
-       modest_header_view_set_folder (self, NULL, NULL, NULL);
+       modest_header_view_set_folder (self, NULL, FALSE, NULL, NULL);
 }
 
 void