X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-header-view.c;h=c3fe40927299b5354ea13b2e566af9cc95d16e4a;hb=fd54149b68b3777ce63ebf25346bbc485cd84ec8;hp=d4de7419bbf15a797ecc0ec3ce9e36df13ce5e6d;hpb=207bb3e8b4f1de56e7e51ba5279d8332381c38d5;p=modest diff --git a/src/widgets/modest-header-view.c b/src/widgets/modest-header-view.c index d4de741..c3fe409 100644 --- a/src/widgets/modest-header-view.c +++ b/src/widgets/modest-header-view.c @@ -33,10 +33,11 @@ #include #include +#include + #include #include #include -#include static void modest_header_view_class_init (ModestHeaderViewClass *klass); static void modest_header_view_init (ModestHeaderView *obj); @@ -44,14 +45,8 @@ static void modest_header_view_finalize (GObject *obj); static void on_selection_changed (GtkTreeSelection *sel, gpointer user_data); -#define MODEST_HEADER_VIEW_PTR "modest-header-view" - -enum { - HEADER_SELECTED_SIGNAL, - ITEM_NOT_FOUND_SIGNAL, - STATUS_UPDATE_SIGNAL, - LAST_SIGNAL -}; +static gint cmp_rows (GtkTreeModel *tree_model, GtkTreeIter *iter1, GtkTreeIter *iter2, + gpointer user_data); typedef struct _ModestHeaderViewPrivate ModestHeaderViewPrivate; @@ -60,14 +55,23 @@ struct _ModestHeaderViewPrivate { TnyList *headers; GMutex *lock; ModestHeaderViewStyle style; - gulong sig1; - ModestHeaderViewState state; }; #define MODEST_HEADER_VIEW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ MODEST_TYPE_HEADER_VIEW, \ ModestHeaderViewPrivate)) + + +#define MODEST_HEADER_VIEW_PTR "modest-header-view" + +enum { + HEADER_SELECTED_SIGNAL, + ITEM_NOT_FOUND_SIGNAL, + STATUS_UPDATE_SIGNAL, + LAST_SIGNAL +}; + /* globals */ static GObjectClass *parent_class = NULL; @@ -137,144 +141,6 @@ modest_header_view_class_init (ModestHeaderViewClass *klass) G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT); } -static void -msgtype_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, - GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data) -{ - TnyHeaderFlags flags; - GdkPixbuf *pixbuf = NULL; - - gtk_tree_model_get (tree_model, iter, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, - &flags, -1); - - if (flags & TNY_HEADER_FLAG_DELETED) - pixbuf = modest_icon_factory_get_icon (MODEST_HEADER_ICON_DELETED); - else if (flags & TNY_HEADER_FLAG_SEEN) - pixbuf = modest_icon_factory_get_icon (MODEST_HEADER_ICON_READ); - else - pixbuf = modest_icon_factory_get_icon (MODEST_HEADER_ICON_UNREAD); - - g_object_set (G_OBJECT (renderer), "pixbuf", pixbuf, NULL); -} - -static void -attach_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, - GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data) -{ - TnyHeaderFlags flags; - GdkPixbuf *pixbuf = NULL; - - gtk_tree_model_get (tree_model, iter, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, - &flags, -1); - - if (flags & TNY_HEADER_FLAG_ATTACHMENTS) - pixbuf = modest_icon_factory_get_small_icon (MODEST_HEADER_ICON_ATTACH); - - g_object_set (G_OBJECT (renderer), "pixbuf", pixbuf, NULL); -} - - -static void -header_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, - GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data) -{ - TnyHeaderFlags flags; - - gtk_tree_model_get (tree_model, iter, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, - &flags, -1); - - g_object_set (G_OBJECT(renderer), - "weight", (flags & TNY_HEADER_FLAG_SEEN) ? 400: 800, - "style", (flags & TNY_HEADER_FLAG_DELETED) ? - PANGO_STYLE_ITALIC : PANGO_STYLE_NORMAL, - NULL); -} - - -static void -sender_receiver_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, - GtkTreeModel *tree_model, GtkTreeIter *iter, gboolean is_sender) -{ - TnyHeaderFlags flags; - gchar *address; - gint sender_receiver_col; - - if (is_sender) - sender_receiver_col = TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN; - else - sender_receiver_col = TNY_GTK_HEADER_LIST_MODEL_TO_COLUMN; - - gtk_tree_model_get (tree_model, iter, - sender_receiver_col, &address, - TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, - -1); - - g_object_set (G_OBJECT(renderer), - "text", - modest_text_utils_get_display_address (address), - "weight", - (flags & TNY_HEADER_FLAG_SEEN) ? 400 : 800, - "style", - (flags & TNY_HEADER_FLAG_DELETED)?PANGO_STYLE_ITALIC:PANGO_STYLE_NORMAL, - NULL); - - g_free (address); -} -/* - * this for both incoming and outgoing mail, depending on the the user_data - * parameter. in the incoming case, show 'From' and 'Received date', in the - * outgoing case, show 'To' and 'Sent date' - */ -static void -compact_header_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, - GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data) -{ - GObject *rendobj; - TnyHeaderFlags flags; - gchar *address, *subject; - gchar *header; - time_t date; - gboolean is_incoming; - - is_incoming = GPOINTER_TO_INT(user_data); /* GPOINTER_TO_BOOLEAN is not available - * in older versions of glib...*/ - - if (is_incoming) - gtk_tree_model_get (tree_model, iter, - TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, - TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN, &address, - TNY_GTK_HEADER_LIST_MODEL_SUBJECT_COLUMN, &subject, - TNY_GTK_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN, &date, - -1); - else - gtk_tree_model_get (tree_model, iter, - TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, - TNY_GTK_HEADER_LIST_MODEL_TO_COLUMN, &address, - TNY_GTK_HEADER_LIST_MODEL_SUBJECT_COLUMN, &subject, - TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &date, - -1); - - rendobj = G_OBJECT(renderer); - - header = g_strdup_printf ("%s %s\n%s", - modest_text_utils_get_display_address (address), - modest_text_utils_get_display_date (date), - subject); - - g_object_set (G_OBJECT(renderer), - "text", header, - "weight", (flags & TNY_HEADER_FLAG_SEEN) ? 400: 800, - "style", (flags & TNY_HEADER_FLAG_DELETED) ? - PANGO_STYLE_ITALIC : PANGO_STYLE_NORMAL, - NULL); - - g_free (header); - g_free (address); - g_free (subject); -} - - - static GtkTreeViewColumn* get_new_column (const gchar *name, GtkCellRenderer *renderer, gboolean resizable, gint sort_col_id, gboolean show_as_text, @@ -286,8 +152,8 @@ get_new_column (const gchar *name, GtkCellRenderer *renderer, 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); + if (resizable) + gtk_tree_view_column_set_expand (column, TRUE); if (show_as_text) gtk_tree_view_column_add_attribute (column, renderer, "text", @@ -297,7 +163,7 @@ get_new_column (const gchar *name, GtkCellRenderer *renderer, gtk_tree_view_column_set_sort_indicator (column, FALSE); gtk_tree_view_column_set_reorderable (column, TRUE); - + if (cell_data_func) gtk_tree_view_column_set_cell_data_func(column, renderer, cell_data_func, user_data, NULL); @@ -312,8 +178,6 @@ remove_all_columns (ModestHeaderView *obj) { 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) @@ -324,115 +188,13 @@ remove_all_columns (ModestHeaderView *obj) -static gboolean -set_empty (ModestHeaderView *self) -{ - ModestHeaderViewPrivate *priv; - GtkTreeViewColumn *column; - GtkListStore *store; - GtkTreeIter iter; - - 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); - gtk_tree_view_set_model(GTK_TREE_VIEW(self), GTK_TREE_MODEL(store)); - g_object_unref (store); - - column = gtk_tree_view_column_new_with_attributes ("", gtk_cell_renderer_text_new(), - "markup", 0, NULL); - gtk_tree_view_column_set_resizable (column, FALSE); - gtk_tree_view_column_set_alignment (column, 0.5); - - gtk_tree_view_append_column (GTK_TREE_VIEW(self), column); - priv->state = MODEST_HEADER_VIEW_STATE_IS_EMPTY; - - return TRUE; -} - - - -ModestHeaderViewState -modest_header_view_get_state (ModestHeaderView *self) -{ - g_return_val_if_fail (MODEST_IS_HEADER_VIEW (self), TRUE); - - return MODEST_HEADER_VIEW_GET_PRIVATE(self)->state; -} - - -static void -set_state (ModestHeaderView *self, ModestHeaderViewState state) -{ - ModestHeaderViewState oldstate = - MODEST_HEADER_VIEW_GET_PRIVATE(self)->state; - - 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*/ - } -} - - -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); -} - - - gboolean modest_header_view_set_columns (ModestHeaderView *self, const GList *columns) { + GtkTreeModel *sortable; GtkTreeViewColumn *column=NULL; - GtkCellRenderer *renderer_msgtype, - *renderer_header, + GtkCellRenderer *renderer_msgtype,*renderer_header, *renderer_attach; - ModestHeaderViewPrivate *priv; const GList *cursor; @@ -441,9 +203,14 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns) /* FIXME: check whether these renderers need to be freed */ renderer_msgtype = gtk_cell_renderer_pixbuf_new (); renderer_attach = gtk_cell_renderer_pixbuf_new (); - renderer_header = gtk_cell_renderer_text_new (); + renderer_header = gtk_cell_renderer_text_new (); remove_all_columns (self); + + if (priv->headers) + sortable = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL(priv->headers)); + else + sortable = NULL; for (cursor = columns; cursor; cursor = g_list_next(cursor)) { ModestHeaderViewColumn col = @@ -459,51 +226,51 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns) case MODEST_HEADER_VIEW_COLUMN_MSGTYPE: column = get_new_column (_("M"), renderer_msgtype, FALSE, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, - FALSE, (GtkTreeCellDataFunc)msgtype_cell_data, + FALSE, + (GtkTreeCellDataFunc)_modest_header_view_msgtype_cell_data, NULL); - gtk_tree_view_column_set_fixed_width (column, 32); + 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, - FALSE, (GtkTreeCellDataFunc)attach_cell_data, - NULL); - gtk_tree_view_column_set_fixed_width (column, 32); - break; - - case MODEST_HEADER_VIEW_COLUMN_RECEIVED_DATE: - column = get_new_column (_("Received"), renderer_header, TRUE, - TNY_GTK_HEADER_LIST_MODEL_DATE_RECEIVED_COLUMN, - TRUE, (GtkTreeCellDataFunc)header_cell_data, + FALSE, + (GtkTreeCellDataFunc)_modest_header_view_attach_cell_data, NULL); + gtk_tree_view_column_set_fixed_width (column, 45); break; + case MODEST_HEADER_VIEW_COLUMN_FROM: column = get_new_column (_("From"), renderer_header, TRUE, TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN, - TRUE, (GtkTreeCellDataFunc)sender_receiver_cell_data, + TRUE, + (GtkTreeCellDataFunc)_modest_header_view_sender_receiver_cell_data, GINT_TO_POINTER(TRUE)); break; case MODEST_HEADER_VIEW_COLUMN_TO: column = get_new_column (_("To"), renderer_header, TRUE, TNY_GTK_HEADER_LIST_MODEL_TO_COLUMN, - TRUE, (GtkTreeCellDataFunc)sender_receiver_cell_data, + TRUE, + (GtkTreeCellDataFunc)_modest_header_view_sender_receiver_cell_data, GINT_TO_POINTER(FALSE)); break; case MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_IN: column = get_new_column (_("Header"), renderer_header, TRUE, TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN, - TRUE, (GtkTreeCellDataFunc)compact_header_cell_data, + TRUE, + (GtkTreeCellDataFunc)_modest_header_view_compact_header_cell_data, GINT_TO_POINTER(TRUE)); break; case MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_OUT: - column = get_new_column (_("Header"), renderer_header, TRUE, + column = get_new_column (_("Header"), renderer_header, TRUE, TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN, - TRUE, (GtkTreeCellDataFunc)compact_header_cell_data, + TRUE, + (GtkTreeCellDataFunc)_modest_header_view_compact_header_cell_data, GINT_TO_POINTER(FALSE)); break; @@ -511,22 +278,44 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns) case MODEST_HEADER_VIEW_COLUMN_SUBJECT: column = get_new_column (_("Subject"), renderer_header, TRUE, TNY_GTK_HEADER_LIST_MODEL_SUBJECT_COLUMN, - TRUE, (GtkTreeCellDataFunc)header_cell_data, + TRUE, + (GtkTreeCellDataFunc)_modest_header_view_header_cell_data, NULL); break; + case MODEST_HEADER_VIEW_COLUMN_RECEIVED_DATE: + 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_header, TRUE, - TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_COLUMN, - TRUE, (GtkTreeCellDataFunc)header_cell_data, - NULL); + 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_SIZE: + column = get_new_column (_("Size"), renderer_header, TRUE, + TNY_GTK_HEADER_LIST_MODEL_MESSAGE_SIZE_COLUMN, + FALSE, + (GtkTreeCellDataFunc)_modest_header_view_size_cell_data, + NULL); break; default: - g_assert_not_reached (); + g_return_val_if_reached(FALSE); } + if (sortable) + gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE(sortable), + col, (GtkTreeIterCompareFunc)cmp_rows, + column, NULL); + /* we keep the column id around */ g_object_set_data (G_OBJECT(column), MODEST_HEADER_VIEW_COLUMN, GINT_TO_POINTER(col)); @@ -534,23 +323,20 @@ modest_header_view_set_columns (ModestHeaderView *self, const GList *columns) /* we need this ptr when sorting the rows */ g_object_set_data (G_OBJECT(column), MODEST_HEADER_VIEW_PTR, self); - - gtk_tree_view_column_set_visible (column, TRUE); gtk_tree_view_append_column (GTK_TREE_VIEW(self), column); } return TRUE; } - - static void modest_header_view_init (ModestHeaderView *obj) { ModestHeaderViewPrivate *priv; + priv = MODEST_HEADER_VIEW_GET_PRIVATE(obj); priv->lock = g_mutex_new (); - priv->sig1 = 0; + } static void @@ -567,12 +353,7 @@ modest_header_view_finalize (GObject *obj) g_object_unref (G_OBJECT(priv->headers)); sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(self)); - - if (sel && priv->sig1 != 0) { - g_signal_handler_disconnect (G_OBJECT(sel), priv->sig1); - priv->sig1 = 0; - } - + if (priv->lock) { g_mutex_free (priv->lock); priv->lock = NULL; @@ -583,42 +364,42 @@ modest_header_view_finalize (GObject *obj) G_OBJECT_CLASS(parent_class)->finalize (obj); } - + + GtkWidget* -modest_header_view_new (TnyFolder *folder, const GList *columns, - ModestHeaderViewStyle style) +modest_header_view_new (TnyFolder *folder, ModestHeaderViewStyle style) { GObject *obj; GtkTreeSelection *sel; ModestHeaderView *self; ModestHeaderViewPrivate *priv; + g_return_val_if_fail (style >= 0 && style < MODEST_HEADER_VIEW_STYLE_NUM, + NULL); + obj = G_OBJECT(g_object_new(MODEST_TYPE_HEADER_VIEW, NULL)); self = MODEST_HEADER_VIEW(obj); priv = MODEST_HEADER_VIEW_GET_PRIVATE(self); - + modest_header_view_set_style (self, style); - modest_header_view_set_columns (self, columns); if (!modest_header_view_set_folder (self, NULL)) { - g_warning ("could not set the folder"); + g_printerr ("modest: could not set the folder\n"); g_object_unref (obj); return NULL; } - - - /* all cols */ - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(obj), TRUE); - gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW(obj), TRUE); + gtk_tree_view_columns_autosize (GTK_TREE_VIEW(obj)); + gtk_tree_view_set_fixed_height_mode (GTK_TREE_VIEW(obj),TRUE); + gtk_tree_view_set_enable_search (GTK_TREE_VIEW(obj), TRUE); gtk_tree_view_set_rules_hint (GTK_TREE_VIEW(obj), TRUE); /* alternating row colors */ - sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(self)); - priv->sig1 = g_signal_connect (sel, "changed", - G_CALLBACK(on_selection_changed), self); + g_signal_connect (sel, "changed", + G_CALLBACK(on_selection_changed), self); + return GTK_WIDGET(self); } @@ -680,7 +461,6 @@ modest_header_view_select_next (ModestHeaderView *self) gtk_tree_selection_select_iter (sel, &iter); } } - GList* modest_header_view_get_columns (ModestHeaderView *self) { @@ -689,22 +469,44 @@ modest_header_view_get_columns (ModestHeaderView *self) } gboolean +modest_header_view_is_empty (ModestHeaderView *self) +{ + g_return_val_if_fail (self, FALSE); + return FALSE; /* FIXME */ +} + + +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 */ + + switch (style) { + case MODEST_HEADER_VIEW_STYLE_DETAILS: + show_col_headers = TRUE; + break; + case MODEST_HEADER_VIEW_STYLE_TWOLINES: + 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); - 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); + 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; } @@ -713,138 +515,10 @@ ModestHeaderViewStyle modest_header_view_get_style (ModestHeaderView *self) { g_return_val_if_fail (self, FALSE); - return MODEST_HEADER_VIEW_GET_PRIVATE(self)->style; } -static gint -cmp_rows (GtkTreeModel *tree_model, GtkTreeIter *iter1, GtkTreeIter *iter2, - gpointer user_data) -{ - gint col_id; - gint t1, t2; - gint val1, val2; - gchar *s1, *s2; - gint cmp; - - static int counter = 0; - col_id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(user_data), MODEST_HEADER_VIEW_COLUMN)); - - if (!(++counter % 100)) { - GObject *header_view = g_object_get_data(G_OBJECT(user_data), - MODEST_HEADER_VIEW_PTR); - g_signal_emit (header_view, - signals[STATUS_UPDATE_SIGNAL], - 0, _("Sorting..."), 0, 0); - } - - switch (col_id) { - - /* first one, we decide based on the time */ - case MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_IN: - case MODEST_HEADER_VIEW_COLUMN_RECEIVED_DATE: - gtk_tree_model_get (tree_model, iter1, - TNY_GTK_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN, - &t1,-1); - gtk_tree_model_get (tree_model, iter2, - TNY_GTK_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN, - &t2,-1); - return t1 - t2; - - case MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_OUT: - case MODEST_HEADER_VIEW_COLUMN_SENT_DATE: - gtk_tree_model_get (tree_model, iter1, - TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, - &t1,-1); - gtk_tree_model_get (tree_model, iter2, - TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, - &t2,-1); - return t1 - t2; - - - /* next ones, we try the search criteria first, if they're the same, then we use 'sent date' */ - case MODEST_HEADER_VIEW_COLUMN_SUBJECT: { - - gtk_tree_model_get (tree_model, iter1, - TNY_GTK_HEADER_LIST_MODEL_SUBJECT_COLUMN, &s1, - TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t1, - -1); - gtk_tree_model_get (tree_model, iter2, - TNY_GTK_HEADER_LIST_MODEL_SUBJECT_COLUMN, &s2, - TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t2, - -1); - - /* the prefix ('Re:', 'Fwd:' etc.) we ignore */ - cmp = modest_text_utils_utf8_strcmp (s1 + modest_text_utils_get_subject_prefix_len(s1), - s2 + modest_text_utils_get_subject_prefix_len(s2), - TRUE); - - g_free (s1); - g_free (s2); - - return cmp ? cmp : t1 - t2; - } - - case MODEST_HEADER_VIEW_COLUMN_FROM: - - gtk_tree_model_get (tree_model, iter1, - TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN, &s1, - TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t1, - -1); - gtk_tree_model_get (tree_model, iter2, - TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN, &s2, - TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t2, - -1); - cmp = modest_text_utils_utf8_strcmp (s1, s2, TRUE); - g_free (s1); - g_free (s2); - - return cmp ? cmp : t1 - t2; - - case MODEST_HEADER_VIEW_COLUMN_TO: - - gtk_tree_model_get (tree_model, iter1, - TNY_GTK_HEADER_LIST_MODEL_TO_COLUMN, &s1, - TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t1, - -1); - gtk_tree_model_get (tree_model, iter2, - TNY_GTK_HEADER_LIST_MODEL_TO_COLUMN, &s2, - TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t2, - -1); - cmp = modest_text_utils_utf8_strcmp (s1, s2, TRUE); - g_free (s1); - g_free (s2); - - return cmp ? cmp : t1 - t2; - - case MODEST_HEADER_VIEW_COLUMN_ATTACH: - - gtk_tree_model_get (tree_model, iter1, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &val1, - TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t1, -1); - gtk_tree_model_get (tree_model, iter2, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &val2, - TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t2, -1); - - cmp = (val1 & TNY_HEADER_FLAG_ATTACHMENTS) - - (val2 & TNY_HEADER_FLAG_ATTACHMENTS); - - return cmp ? cmp : t1 - t2; - - case MODEST_HEADER_VIEW_COLUMN_MSGTYPE: - gtk_tree_model_get (tree_model, iter1, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &val1, - TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t1,-1); - gtk_tree_model_get (tree_model, iter2, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &val2, - TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t2,-1); - cmp = (val1 & TNY_HEADER_FLAG_SEEN) - (val2 & TNY_HEADER_FLAG_SEEN); - - return cmp ? cmp : t1 - t2; - - default: - return &iter1 - &iter2; /* oughhhh */ - } -} - - static void on_refresh_folder (TnyFolder *folder, gboolean cancelled, GError **err, gpointer user_data) @@ -861,13 +535,10 @@ on_refresh_folder (TnyFolder *folder, gboolean cancelled, GError **err, 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) { /* it's a new one or a refresh */ GList *cols, *cursor; - + if (priv->headers) g_object_unref (priv->headers); @@ -897,11 +568,8 @@ on_refresh_folder (TnyFolder *folder, gboolean cancelled, GError **err, 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); - gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW(self),TRUE); - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(self), TRUE); } } @@ -916,6 +584,11 @@ on_refresh_folder_status_update (TnyFolder *folder, const gchar *msg, self = MODEST_HEADER_VIEW(user_data); priv = MODEST_HEADER_VIEW_GET_PRIVATE(self); + /* FIXME: this is a hack ==> tinymail gives us this when + * it has nothing better to do */ + if (num == 1 && total == 100) + return; + g_signal_emit (G_OBJECT(self), signals[STATUS_UPDATE_SIGNAL], 0, msg, num, total); } @@ -938,17 +611,13 @@ modest_header_view_set_folder (ModestHeaderView *self, TnyFolder *folder) priv = MODEST_HEADER_VIEW_GET_PRIVATE(self); 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); @@ -969,12 +638,8 @@ on_selection_changed (GtkTreeSelection *sel, gpointer user_data) 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; - if (!gtk_tree_selection_get_selected (sel, &model, &iter)) + if (!gtk_tree_selection_get_selected (sel, &model, &iter)) return; /* msg was _un_selected */ gtk_tree_model_get (model, &iter, @@ -1001,3 +666,130 @@ _modest_header_view_change_selection (GtkTreeSelection *selection, on_selection_changed (selection, user_data); } + + +static gint +cmp_rows (GtkTreeModel *tree_model, GtkTreeIter *iter1, GtkTreeIter *iter2, + gpointer user_data) +{ + gint col_id; + gint t1, t2; + gint val1, val2; + gchar *s1, *s2; + gint cmp; + + static int counter = 0; + col_id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(user_data), MODEST_HEADER_VIEW_COLUMN)); + + if (!(++counter % 100)) { + GObject *header_view = g_object_get_data(G_OBJECT(user_data), + MODEST_HEADER_VIEW_PTR); + g_signal_emit (header_view, + signals[STATUS_UPDATE_SIGNAL], + 0, _("Sorting..."), 0, 0); + } + switch (col_id) { + + /* first one, we decide based on the time */ + case MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_IN: + case MODEST_HEADER_VIEW_COLUMN_RECEIVED_DATE: + + gtk_tree_model_get (tree_model, iter1, + TNY_GTK_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN, + &t1,-1); + gtk_tree_model_get (tree_model, iter2, + TNY_GTK_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN, + &t2,-1); + return t1 - t2; + + case MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER_OUT: + case MODEST_HEADER_VIEW_COLUMN_SENT_DATE: + gtk_tree_model_get (tree_model, iter1, + TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, + &t1,-1); + gtk_tree_model_get (tree_model, iter2, + TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, + &t2,-1); + return t1 - t2; + + + /* next ones, we try the search criteria first, if they're the same, then we use 'sent date' */ + /* FIXME: what about received-date? */ + case MODEST_HEADER_VIEW_COLUMN_SUBJECT: { + + gtk_tree_model_get (tree_model, iter1, + TNY_GTK_HEADER_LIST_MODEL_SUBJECT_COLUMN, &s1, + TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t1, + -1); + gtk_tree_model_get (tree_model, iter2, + TNY_GTK_HEADER_LIST_MODEL_SUBJECT_COLUMN, &s2, + TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t2, + -1); + + /* the prefix ('Re:', 'Fwd:' etc.) we ignore */ + cmp = modest_text_utils_utf8_strcmp (s1 + modest_text_utils_get_subject_prefix_len(s1), + s2 + modest_text_utils_get_subject_prefix_len(s2), + TRUE); + g_free (s1); + g_free (s2); + + return cmp ? cmp : t1 - t2; + } + + case MODEST_HEADER_VIEW_COLUMN_FROM: + + gtk_tree_model_get (tree_model, iter1, + TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN, &s1, + TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t1, + -1); + gtk_tree_model_get (tree_model, iter2, + TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN, &s2, + TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t2, + -1); + cmp = modest_text_utils_utf8_strcmp (s1, s2, TRUE); + g_free (s1); + g_free (s2); + + return cmp ? cmp : t1 - t2; + + case MODEST_HEADER_VIEW_COLUMN_TO: + + gtk_tree_model_get (tree_model, iter1, + TNY_GTK_HEADER_LIST_MODEL_TO_COLUMN, &s1, + TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t1, + -1); + gtk_tree_model_get (tree_model, iter2, + TNY_GTK_HEADER_LIST_MODEL_TO_COLUMN, &s2, + TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t2, + -1); + cmp = modest_text_utils_utf8_strcmp (s1, s2, TRUE); + g_free (s1); + g_free (s2); + + return cmp ? cmp : t1 - t2; + + case MODEST_HEADER_VIEW_COLUMN_ATTACH: + + gtk_tree_model_get (tree_model, iter1, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &val1, + TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t1, -1); + gtk_tree_model_get (tree_model, iter2, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &val2, + TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t2, -1); + + cmp = (val1 & TNY_HEADER_FLAG_ATTACHMENTS) - + (val2 & TNY_HEADER_FLAG_ATTACHMENTS); + + return cmp ? cmp : t1 - t2; + + case MODEST_HEADER_VIEW_COLUMN_MSGTYPE: + gtk_tree_model_get (tree_model, iter1, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &val1, + TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t1,-1); + gtk_tree_model_get (tree_model, iter2, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &val2, + TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &t2,-1); + cmp = (val1 & TNY_HEADER_FLAG_SEEN) - (val2 & TNY_HEADER_FLAG_SEEN); + + return cmp ? cmp : t1 - t2; + + default: + return &iter1 - &iter2; /* oughhhh */ + } +}