GMutex *lock;
ModestHeaderViewStyle style;
gulong sig1;
- ModestHeaderViewState state;
};
#define MODEST_HEADER_VIEW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT);
}
-
-
-
-
-
-
static GtkTreeViewColumn*
get_new_column (const gchar *name, GtkCellRenderer *renderer,
gboolean resizable, gint sort_col_id, gboolean show_as_text,
gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
gtk_tree_view_column_set_resizable (column, resizable);
- if (resizable) {
- gtk_tree_view_column_set_min_width (column, 100);
- //gtk_tree_view_column_set_expand (column, TRUE);
- }
+ if (resizable)
+ gtk_tree_view_column_set_expand (column, TRUE);
if (show_as_text)
gtk_tree_view_column_add_attribute (column, renderer, "text",
{
GList *columns, *cursor;
- gtk_tree_view_set_model (GTK_TREE_VIEW(obj), NULL);
-
columns = gtk_tree_view_get_columns (GTK_TREE_VIEW(obj));
for (cursor = columns; cursor; cursor = cursor->next)
static gboolean
set_empty (ModestHeaderView *self)
{
+ GList *columns = NULL;
ModestHeaderViewPrivate *priv;
- GtkTreeViewColumn *column;
- GtkListStore *store;
- GtkTreeIter iter;
- GtkCellRenderer* renderer;
-
- priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
- remove_all_columns (self);
-
- store = gtk_list_store_new (1, G_TYPE_STRING);
- gtk_list_store_append (store, &iter);
- gtk_list_store_set (store, &iter, 0, _("(No items in this folder)"), -1);
-
- renderer = gtk_cell_renderer_text_new ();
- g_object_set (G_OBJECT(renderer), "weight", 800, NULL);
-
- column = gtk_tree_view_column_new_with_attributes ("", renderer, "text", 0, NULL);
+ priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
- gtk_tree_view_column_set_resizable (column, FALSE);
- gtk_tree_view_column_set_alignment (column, 0.5);
- gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
- gtk_tree_view_append_column (GTK_TREE_VIEW(self), column);
-
- gtk_tree_view_set_model(GTK_TREE_VIEW(self), GTK_TREE_MODEL(store));
- g_object_unref (store);
+ columns = g_list_append (columns,GINT_TO_POINTER(0));
+ modest_header_view_set_columns (self, columns);
+ g_list_free (columns);
- priv->state = MODEST_HEADER_VIEW_STATE_IS_EMPTY;
return TRUE;
}
-static void
-set_state (ModestHeaderView *self, ModestHeaderViewState state)
-{
- ModestHeaderViewState oldstate =
- MODEST_HEADER_VIEW_GET_PRIVATE(self)->state;
-
- return; /* FIXME: this is recursing */
-
- if (oldstate != state) {
- if ((oldstate & MODEST_HEADER_VIEW_STATE_IS_EMPTY) !=
- (state & MODEST_HEADER_VIEW_STATE_IS_EMPTY)) {
- //set_empty (self);
- }
-
- MODEST_HEADER_VIEW_GET_PRIVATE(self)->state = state;
- /* FIXME: emit signal if the state changed*/
- }
-
- g_warning ("state:\n"
- "is empty: %s\n"
- "has cursor: %s\n"
- "at last item: %s\n"
- "at first item: %s\n"
- "has selection: %s\n"
- "has multi selection: %s\n",
- state & MODEST_HEADER_VIEW_STATE_IS_EMPTY ? "yes" : "no",
- state & MODEST_HEADER_VIEW_STATE_HAS_CURSOR ? "yes" : "no",
- state & MODEST_HEADER_VIEW_STATE_AT_LAST_ITEM ? "yes" : "no",
- state & MODEST_HEADER_VIEW_STATE_AT_FIRST_ITEM ? "yes" : "no",
- state & MODEST_HEADER_VIEW_STATE_HAS_SELECTION ? "yes" : "no",
- state & MODEST_HEADER_VIEW_STATE_HAS_MULTIPLE_SELECTION ? "yes" : "no");
-}
-
-
-static void
-update_state (ModestHeaderView *self)
-{
- GtkTreePath *path;
- GtkTreeSelection *sel;
- ModestHeaderViewState state = 0;
- ModestHeaderViewPrivate *priv;
-
- priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
-
- if (!priv->folder || tny_folder_get_all_count(priv->folder) == 0)
- state = MODEST_HEADER_VIEW_STATE_IS_EMPTY;
- else {
- gtk_tree_view_get_cursor (GTK_TREE_VIEW(self), &path, NULL);
- if (path) {
- GtkTreePath *path2;
-
- state |= MODEST_HEADER_VIEW_STATE_HAS_CURSOR;
- path2= gtk_tree_path_copy (path);
-
- gtk_tree_path_next (path);
- if (gtk_tree_path_compare (path, path2) != 0)
- state |= MODEST_HEADER_VIEW_STATE_AT_LAST_ITEM;
-
- if (!gtk_tree_path_prev (path2))
- state |= MODEST_HEADER_VIEW_STATE_AT_FIRST_ITEM;
-
- gtk_tree_path_free (path);
- gtk_tree_path_free (path2);
- }
-
- sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(self));
- if (sel) {
- state |= MODEST_HEADER_VIEW_STATE_HAS_SELECTION;
- if (gtk_tree_selection_count_selected_rows (sel) > 1)
- state |= MODEST_HEADER_VIEW_STATE_HAS_MULTIPLE_SELECTION;
- }
- }
-
- set_state (self, state);
-}
-
-
-ModestHeaderViewState
-modest_header_view_get_state (ModestHeaderView *self)
-{
- g_return_val_if_fail (MODEST_IS_HEADER_VIEW (self), TRUE);
- update_state (self);
-
- return MODEST_HEADER_VIEW_GET_PRIVATE(self)->state;
-}
-
-
gboolean
modest_header_view_set_columns (ModestHeaderView *self, const GList *columns)
{
GtkTreeViewColumn *column=NULL;
- GtkCellRenderer *renderer_msgtype,
- *renderer_header,
+ GtkCellRenderer *renderer_msgtype,*renderer_header,
*renderer_attach;
-
ModestHeaderViewPrivate *priv;
const GList *cursor;
case MODEST_HEADER_VIEW_COLUMN_SIZE:
column = get_new_column (_("Size"), renderer_header, TRUE,
TNY_GTK_HEADER_LIST_MODEL_MESSAGE_SIZE_COLUMN,
- TRUE,
+ FALSE,
(GtkTreeCellDataFunc)_modest_header_view_size_cell_data,
NULL);
break;
+
default:
g_return_val_if_reached(FALSE);
}
/* we need this ptr when sorting the rows */
g_object_set_data (G_OBJECT(column), MODEST_HEADER_VIEW_PTR,
self);
-
gtk_tree_view_append_column (GTK_TREE_VIEW(self), column);
}
return TRUE;
}
-
-
static void
modest_header_view_init (ModestHeaderView *obj)
{
gtk_tree_selection_select_iter (sel, &iter);
}
}
-
GList*
modest_header_view_get_columns (ModestHeaderView *self)
{
return gtk_tree_view_get_columns (GTK_TREE_VIEW(self));
}
+
gboolean
modest_header_view_set_style (ModestHeaderView *self,
ModestHeaderViewStyle style)
{
+ ModestHeaderViewPrivate *priv;
+ gboolean show_col_headers = FALSE;
+ ModestHeaderViewStyle old_style;
+
g_return_val_if_fail (self, FALSE);
+ g_return_val_if_fail (style >= 0 && MODEST_HEADER_VIEW_STYLE_NUM,
+ FALSE);
- MODEST_HEADER_VIEW_GET_PRIVATE(self)->style = style;
+ priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
+ if (priv->style == style)
+ return TRUE; /* nothing to do */
- gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(self),
- style & MODEST_HEADER_VIEW_STYLE_SHOW_HEADERS);
- gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW(self),
- style & MODEST_HEADER_VIEW_STYLE_SHOW_HEADERS);
+ switch (style) {
+ case MODEST_HEADER_VIEW_STYLE_DETAILS:
+ show_col_headers = TRUE;
+ break;
+ case MODEST_HEADER_VIEW_STYLE_TWOLINES:
+ break;
+ case MODEST_HEADER_VIEW_STYLE_EMPTY:
+ set_empty (self);
+ break;
+ default:
+ g_return_val_if_reached (FALSE);
+ }
+ gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(self), show_col_headers);
+ gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW(self), show_col_headers);
+
+ old_style = priv->style;
+ priv->style = style;
- gtk_tree_view_columns_autosize (GTK_TREE_VIEW(self));
- gtk_tree_view_set_rules_hint (GTK_TREE_VIEW(self),
- TRUE); /* alternating row colors */
-
return TRUE;
}
modest_header_view_get_style (ModestHeaderView *self)
{
g_return_val_if_fail (self, FALSE);
-
return MODEST_HEADER_VIEW_GET_PRIVATE(self)->style;
}
priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
priv->folder = folder;
- update_state (self);
- if (!folder || priv->state & MODEST_HEADER_VIEW_STATE_IS_EMPTY)
- gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(self), FALSE);
- else { /* it's a new one or a refresh */
+ if (!folder) {
+ gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(self), FALSE);
+ set_empty (self);
+ } else { /* it's a new one or a refresh */
GList *cols, *cursor;
if (priv->headers)
cursor->data, NULL);
cursor = g_list_next(cursor);
}
- g_list_free (cols);
-
+ g_list_free (cols);
gtk_tree_view_set_model (GTK_TREE_VIEW (self), sortable);
- modest_header_view_set_style (self, priv->style);
}
}
priv->folder = folder;
- if (!folder) {/* when there is no folder */
- gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(self), FALSE);
- gtk_tree_view_set_model (GTK_TREE_VIEW (self), NULL);
- } else { /* it's a new one or a refresh */
+ if (folder)
tny_folder_refresh_async (folder,
on_refresh_folder,
on_refresh_folder_status_update,
self);
- }
/* no message selected */
g_signal_emit (G_OBJECT(self), signals[HEADER_SELECTED_SIGNAL], 0,
NULL);
self = MODEST_HEADER_VIEW (user_data);
priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
-
- /* if the folder is empty, nothing to do */
- if (priv->state & MODEST_HEADER_VIEW_STATE_IS_EMPTY)
- return;
-
- update_state (self);
if (!gtk_tree_selection_get_selected (sel, &model, &iter))
return; /* msg was _un_selected */
*/
MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_IN, /* incoming mail */
MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_OUT, /* outgoing mail */
-
+
MODEST_HEADER_VIEW_COLUMN_NUM
} ModestHeaderViewColumn;
* to make a small-device specific display
*/
typedef enum _ModestHeaderViewStyle {
- MODEST_HEADER_VIEW_STYLE_SHOW_HEADERS = 0x01,
- MODEST_HEADER_VIEW_STYLE_NORMAL = 0x02,
+ MODEST_HEADER_VIEW_STYLE_DETAILS, /* many columns, single line, col headers visible */
+ MODEST_HEADER_VIEW_STYLE_TWOLINES, /* two-line headers, col headers invisible */
+ MODEST_HEADER_VIEW_STYLE_EMPTY, /* empty view (for empty folders) */
+
+ MODEST_HEADER_VIEW_STYLE_NUM
} ModestHeaderViewStyle;
typedef enum _ModestItemType {
} ModestItemType;
-typedef enum _ModestHeaderViewState {
- MODEST_HEADER_VIEW_STATE_IS_EMPTY = 0x01,
- MODEST_HEADER_VIEW_STATE_HAS_CURSOR = 0x02,
- MODEST_HEADER_VIEW_STATE_HAS_SELECTION = 0x04,
- MODEST_HEADER_VIEW_STATE_HAS_MULTIPLE_SELECTION = 0x08,
- MODEST_HEADER_VIEW_STATE_AT_FIRST_ITEM = 0x0f,
- MODEST_HEADER_VIEW_STATE_AT_LAST_ITEM = 0x10
-} ModestHeaderViewState;
-
struct _ModestHeaderViewClass {
GtkTreeViewClass parent_class;
* You must free the list with g_list_free
*/
GList* modest_header_view_get_columns (ModestHeaderView *self);
-
-
-
-/**
- * modest_header_view_get_state
- * @self: a ModestHeaderView instance
- *
- * get the state for this header view; see the ModestHeaderViewState enum
- * for possible values.
- *
- * Returns: the state for this header view
- */
-ModestHeaderViewState modest_header_view_get_state (ModestHeaderView *self);
-
/**
*/
ModestHeaderViewStyle modest_header_view_get_style (ModestHeaderView *self);
-
-
/**
* modest_header_view_get_selected_headers:
* @self: a ModestHeaderView instance
**/
void modest_header_view_select_next (ModestHeaderView *self);
+
+
+/* PROTECTED method. It's useful when we want to force a given
+ selection to reload a msg. For example if we have selected a header
+ in offline mode, when Modest become online, we want to reload the
+ message automatically without an user click over the header */
+void
+_modest_header_view_change_selection (GtkTreeSelection *selection,
+ gpointer user_data);
+
G_END_DECLS