+ g_return_val_if_fail (self, FALSE);
+ return MODEST_HEADER_VIEW_GET_PRIVATE(self)->style;
+}
+
+/*
+ * This function sets a sortable model in the header view. It's just
+ * used for developing purposes, because it only does a
+ * gtk_tree_view_set_model
+ */
+static void
+modest_header_view_set_model (GtkTreeView *header_view, GtkTreeModel *model)
+{
+/* GtkTreeModel *old_model_sort = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view)); */
+/* if (old_model_sort && GTK_IS_TREE_MODEL_SORT (old_model_sort)) { */
+/* GtkTreeModel *old_model; */
+/* ModestHeaderViewPrivate *priv; */
+/* priv = MODEST_HEADER_VIEW_GET_PRIVATE (header_view); */
+/* old_model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (old_model_sort)); */
+
+/* /\* Set new model *\/ */
+/* gtk_tree_view_set_model (header_view, model); */
+/* } else */
+ gtk_tree_view_set_model (header_view, model);
+}
+
+TnyFolder*
+modest_header_view_get_folder (ModestHeaderView *self)
+{
+ ModestHeaderViewPrivate *priv;
+ priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
+
+ if (priv->folder)
+ g_object_ref (priv->folder);
+
+ return priv->folder;
+}
+
+static void
+modest_header_view_set_folder_intern (ModestHeaderView *self, TnyFolder *folder)
+{
+ TnyFolderType type;
+ TnyList *headers;
+ ModestHeaderViewPrivate *priv;
+ GList *cols, *cursor;
+ GtkTreeModel *filter_model, *sortable;
+ guint sort_colid;
+ GtkSortType sort_type;
+
+ priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
+
+ headers = TNY_LIST (tny_gtk_header_list_model_new ());
+
+ tny_gtk_header_list_model_set_folder (TNY_GTK_HEADER_LIST_MODEL(headers),
+ folder, FALSE);
+
+ /* Add IDLE observer (monitor) and another folder observer for
+ new messages (self) */
+ g_mutex_lock (priv->observers_lock);
+ if (priv->monitor) {
+ tny_folder_monitor_stop (priv->monitor);
+ g_object_unref (G_OBJECT (priv->monitor));
+ }
+ priv->monitor = TNY_FOLDER_MONITOR (tny_folder_monitor_new (folder));
+ tny_folder_monitor_add_list (priv->monitor, TNY_LIST (headers));
+ tny_folder_monitor_start (priv->monitor);
+ g_mutex_unlock (priv->observers_lock);
+
+ sortable = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL(headers));
+ g_object_unref (G_OBJECT (headers));
+
+ /* Create a tree model filter to hide and show rows for cut operations */
+ filter_model = gtk_tree_model_filter_new (sortable, NULL);
+ gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter_model),
+ filter_row,
+ self,
+ NULL);
+ g_object_unref (G_OBJECT (sortable));
+
+ /* install our special sorting functions */
+ cursor = cols = gtk_tree_view_get_columns (GTK_TREE_VIEW(self));
+
+ /* Restore sort column id */
+ if (cols) {
+ type = modest_tny_folder_guess_folder_type (folder);
+ sort_colid = modest_header_view_get_sort_column_id (self, type);
+ sort_type = modest_header_view_get_sort_type (self, type);
+ gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(sortable),
+ sort_colid,
+ sort_type);
+ gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE(sortable),
+ TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN,
+ (GtkTreeIterCompareFunc) cmp_rows,
+ cols->data, NULL);
+ gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE(sortable),
+ TNY_GTK_HEADER_LIST_MODEL_SUBJECT_COLUMN,
+ (GtkTreeIterCompareFunc) cmp_subject_rows,
+ cols->data, NULL);
+ }
+
+ /* Set new model */
+ modest_header_view_set_model (GTK_TREE_VIEW (self), filter_model);
+ g_object_unref (G_OBJECT (filter_model));
+/* modest_header_view_set_model (GTK_TREE_VIEW (self), sortable); */
+/* g_object_unref (G_OBJECT (sortable)); */
+
+ /* Free */
+ g_list_free (cols);
+}
+
+void
+modest_header_view_sort_by_column_id (ModestHeaderView *self,
+ guint sort_colid,
+ GtkSortType sort_type)
+{
+ ModestHeaderViewPrivate *priv = NULL;
+ GtkTreeModel *tree_filter, *sortable = NULL;
+ TnyFolderType type;
+
+ /* Get model and private data */
+ priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
+ tree_filter = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
+ sortable = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER(tree_filter));
+/* sortable = gtk_tree_view_get_model (GTK_TREE_VIEW (self)); */