static GtkTreePath * get_selected_row (GtkTreeView *self, GtkTreeModel **model);
+static gboolean on_focus_in (GtkWidget *sef,
+ GdkEventFocus *event,
+ gpointer user_data);
typedef struct _ModestHeaderViewPrivate ModestHeaderViewPrivate;
struct _ModestHeaderViewPrivate {
TnyFolderMonitor *monitor;
GMutex *monitor_lock;
+ gint sort_colid[2][TNY_FOLDER_TYPE_NUM];
};
#define MODEST_HEADER_VIEW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
}
gboolean
-modest_header_view_set_columns (ModestHeaderView *self, const GList *columns)
+modest_header_view_set_columns (ModestHeaderView *self, const GList *columns, TnyFolderType type)
{
GtkTreeModel *sortable;
GtkTreeViewColumn *column=NULL;
renderer_comptact_flag = gtk_cell_renderer_pixbuf_new ();
renderer_compact_date = gtk_cell_renderer_text_new ();
+ g_object_set(G_OBJECT(renderer_header),
+ "ellipsize", PANGO_ELLIPSIZE_END,
+ NULL);
g_object_set(G_OBJECT(renderer_compact_date),
"xalign", 1.0,
NULL);
break;
case MODEST_HEADER_VIEW_COLUMN_RECEIVED_DATE:
- column = get_new_column (_("Received"), renderer_compact_date, TRUE,
+ column = get_new_column (_("Received"), renderer_header, TRUE,
TNY_GTK_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN,
TRUE,
(GtkTreeCellDataFunc)_modest_header_view_date_cell_data,
GINT_TO_POINTER(TRUE));
break;
- case MODEST_HEADER_VIEW_COLUMN_SENT_DATE:
- column = get_new_column (_("Sent"), renderer_compact_date, TRUE,
+ case MODEST_HEADER_VIEW_COLUMN_SENT_DATE:
+ column = get_new_column (_("Sent"), renderer_header, TRUE,
TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN,
TRUE,
(GtkTreeCellDataFunc)_modest_header_view_date_cell_data,
GINT_TO_POINTER(FALSE));
break;
+ case MODEST_HEADER_VIEW_COLUMN_COMPACT_RECEIVED_DATE:
+ column = get_new_column (_("Received"), renderer_compact_date, FALSE,
+ TNY_GTK_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN,
+ TRUE,
+ (GtkTreeCellDataFunc)_modest_header_view_compact_date_cell_data,
+ GINT_TO_POINTER(TRUE));
+ gtk_tree_view_column_set_fixed_width (column, 130);
+ break;
+
+ case MODEST_HEADER_VIEW_COLUMN_COMPACT_SENT_DATE:
+ column = get_new_column (_("Sent"), renderer_compact_date, FALSE,
+ TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN,
+ TRUE,
+ (GtkTreeCellDataFunc)_modest_header_view_compact_date_cell_data,
+ GINT_TO_POINTER(FALSE));
+ gtk_tree_view_column_set_fixed_width (column, 130);
+ break;
case MODEST_HEADER_VIEW_COLUMN_SIZE:
column = get_new_column (_("Size"), renderer_header, TRUE,
TNY_GTK_HEADER_LIST_MODEL_MESSAGE_SIZE_COLUMN,
g_return_val_if_reached(FALSE);
}
- if (sortable)
+ if (sortable)
gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE(sortable),
col, (GtkTreeIterCompareFunc)cmp_rows,
column, NULL);
self);
gtk_tree_view_append_column (GTK_TREE_VIEW(self), column);
}
-
+
+
return TRUE;
}
modest_header_view_init (ModestHeaderView *obj)
{
ModestHeaderViewPrivate *priv;
+ guint i, j;
priv = MODEST_HEADER_VIEW_GET_PRIVATE(obj);
priv->monitor = NULL;
priv->monitor_lock = g_mutex_new ();
-
+ for (j=0; j < 2; j++)
+ for (i=0; i < TNY_FOLDER_TYPE_NUM; i++)
+ priv->sort_colid[j][i] = -1;
setup_drag_and_drop (GTK_TREE_VIEW (obj));
}
g_signal_connect (self, "button-press-event",
G_CALLBACK(on_header_clicked), NULL);
+
+ g_signal_connect (self, "focus-in-event",
+ G_CALLBACK(on_focus_in), NULL);
return GTK_WIDGET(self);
}
}
void
+modest_header_view_set_sort_column_id (ModestHeaderView *self, guint sort_colid, TnyFolderType type)
+{
+ ModestHeaderViewPrivate *priv;
+ ModestHeaderViewStyle style;
+
+ style = modest_header_view_get_style (self);
+ priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
+
+ priv->sort_colid[style][type] = sort_colid;
+}
+
+gint
+modest_header_view_get_sort_column_id (ModestHeaderView *self, TnyFolderType type)
+{
+ ModestHeaderViewPrivate *priv;
+ ModestHeaderViewStyle style;
+
+ style = modest_header_view_get_style (self);
+ priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
+
+ return priv->sort_colid[style][type];
+}
+
+void
modest_header_view_set_folder (ModestHeaderView *self, TnyFolder *folder)
{
ModestHeaderViewPrivate *priv;
gint t1, t2;
gint val1, val2;
gchar *s1, *s2;
- gint cmp;
-
+ gint cmp;
static int counter = 0;
+
+ g_return_val_if_fail (G_IS_OBJECT(user_data), 0);
col_id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(user_data), MODEST_HEADER_VIEW_COLUMN));
if (!(++counter % 100)) {
/* first one, we decide based on the time */
case MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_IN:
+ case MODEST_HEADER_VIEW_COLUMN_COMPACT_RECEIVED_DATE:
case MODEST_HEADER_VIEW_COLUMN_RECEIVED_DATE:
gtk_tree_model_get (tree_model, iter1,
return t1 - t2;
case MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_OUT:
+ case MODEST_HEADER_VIEW_COLUMN_COMPACT_SENT_DATE:
case MODEST_HEADER_VIEW_COLUMN_SENT_DATE:
gtk_tree_model_get (tree_model, iter1,
TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN,
return path;
}
+
+/*
+ * This function moves the tree view scroll to the current selected
+ * row when the widget grabs the focus
+ */
+static gboolean
+on_focus_in (GtkWidget *self,
+ GdkEventFocus *event,
+ gpointer user_data)
+{
+ GtkTreeSelection *selection;
+ GtkTreeModel *model;
+ GList *selected = NULL;
+ GtkTreePath *selected_path = NULL;
+
+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
+ if (!model)
+ return FALSE;
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (self));
+ /* If none selected yet, pick the first one */
+ if (gtk_tree_selection_count_selected_rows (selection) == 0) {
+ GtkTreeIter iter;
+ GtkTreePath *path;
+
+ /* Return if the model is empty */
+ if (!gtk_tree_model_get_iter_first (model, &iter))
+ return FALSE;
+
+ path = gtk_tree_model_get_path (model, &iter);
+ gtk_tree_selection_select_path (selection, path);
+ gtk_tree_path_free (path);
+ }
+
+ /* Need to get the all the rows because is selection multiple */
+ selected = gtk_tree_selection_get_selected_rows (selection, &model);
+ 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);
+ }
+ }
+ #endif /* GTK_CHECK_VERSION */
+
+ /* Frees */
+ g_list_foreach (selected, (GFunc) gtk_tree_path_free, NULL);
+ g_list_free (selected);
+
+ return FALSE;
+}