+
+static void
+header_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer,
+ GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data)
+{
+ TnyMsgHeaderFlags flags;
+
+ gtk_tree_model_get (tree_model, iter, TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN,
+ &flags, -1);
+
+ g_object_set (G_OBJECT(renderer),
+ "weight", (flags & TNY_MSG_HEADER_FLAG_SEEN) ? 400: 800,
+ "style", (flags & TNY_MSG_HEADER_FLAG_DELETED) ?
+ PANGO_STYLE_ITALIC : PANGO_STYLE_NORMAL,
+ NULL);
+}
+
+
+
+/* try to make a shorter display address; changes it arg in-place */
+static gchar*
+display_address (gchar *address)
+{
+ gchar *cursor;
+
+ if (!address)
+ return;
+
+ /* simplistic --> remove <email@address> from display name */
+ cursor = g_strstr_len (address, strlen(address), "<");
+ if (cursor)
+ cursor[0]='\0';
+
+ /* simplistic --> remove (bla bla) from display name */
+ cursor = g_strstr_len (address, strlen(address), "(");
+ if (cursor)
+ cursor[0]='\0';
+
+ return address;
+}
+
+
+
+static void
+sender_receiver_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer,
+ GtkTreeModel *tree_model, GtkTreeIter *iter, gboolean is_sender)
+{
+ TnyMsgHeaderFlags flags;
+ gchar *address;
+ gint sender_receiver_col;
+
+ if (is_sender)
+ sender_receiver_col = TNY_MSG_HEADER_LIST_MODEL_FROM_COLUMN;
+ else
+ sender_receiver_col = TNY_MSG_HEADER_LIST_MODEL_TO_COLUMN;
+
+ gtk_tree_model_get (tree_model, iter,
+ sender_receiver_col, &address,
+ TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags,
+ -1);
+
+ g_object_set (G_OBJECT(renderer),
+ "text",
+ display_address (address),
+ "weight",
+ (flags & TNY_MSG_HEADER_FLAG_SEEN) ? 400 : 800,
+ "style",
+ (flags & TNY_MSG_HEADER_FLAG_DELETED)?PANGO_STYLE_ITALIC:PANGO_STYLE_NORMAL,
+ NULL);
+
+ g_free (address);
+}
+
+
+/* not reentrant/thread-safe */
+const gchar*
+display_date (time_t date)
+{
+ struct tm date_tm, now_tm;
+ time_t now;
+
+ const gint buf_size = 64;
+ static gchar date_buf[64]; /* buf_size is not ... */
+ static gchar now_buf[64]; /* ...const enough... */
+
+ now = time (NULL);
+
+ localtime_r(&now, &now_tm);
+ localtime_r(&date, &date_tm);
+
+ /* get today's date */
+ strftime (date_buf, buf_size, "%x", &date_tm);
+ strftime (now_buf, buf_size, "%x", &now_tm); /* today */
+
+ /* if this is today, get the time instead of the date */
+ if (strcmp (date_buf, now_buf) == 0)
+ strftime (date_buf, buf_size, _("%X"), &date_tm);
+
+ return date_buf;
+}
+
+
+static void
+compact_header_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer,
+ GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data)
+{
+ GObject *rendobj;
+ TnyMsgHeaderFlags flags;
+ gchar *from, *subject;
+ gchar *header;
+ time_t date;
+
+ gtk_tree_model_get (tree_model, iter,
+ TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags,
+ TNY_MSG_HEADER_LIST_MODEL_FROM_COLUMN, &from,
+ TNY_MSG_HEADER_LIST_MODEL_SUBJECT_COLUMN, &subject,
+ TNY_MSG_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN, &date,
+ -1);
+ rendobj = G_OBJECT(renderer);
+
+ header = g_strdup_printf ("%s %s\n%s",
+ display_address (from),
+ display_date(date),
+ subject);
+
+ g_object_set (G_OBJECT(renderer),
+ "text", header,
+ "weight", (flags & TNY_MSG_HEADER_FLAG_SEEN) ? 400: 800,
+ "style", (flags & TNY_MSG_HEADER_FLAG_DELETED) ?
+ PANGO_STYLE_ITALIC : PANGO_STYLE_NORMAL,
+ NULL);
+ g_free (header);
+ g_free (from);
+ g_free (subject);
+}
+
+
+static GtkTreeViewColumn*
+get_new_column (const gchar *name, GtkCellRenderer *renderer,
+ gboolean resizable, gint sort_col_id, gboolean show_as_text,
+ GtkTreeCellDataFunc cell_data_func, gpointer user_data)
+{
+ GtkTreeViewColumn *column;
+
+ column = gtk_tree_view_column_new_with_attributes(name, renderer, NULL);
+ gtk_tree_view_column_set_resizable (column, resizable);
+
+ if (show_as_text)
+ gtk_tree_view_column_add_attribute (column, renderer, "text",
+ sort_col_id);
+ if (sort_col_id >= 0)
+ gtk_tree_view_column_set_sort_column_id (column, sort_col_id);
+
+ 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);
+
+/* g_signal_connect (G_OBJECT (column), "clicked", */
+/* G_CALLBACK (column_clicked), obj); */
+
+ return column;
+}
+
+
+
+
+static void
+remove_all_columns (ModestTnyHeaderTreeView *obj)
+{
+ GList *columns, *cursor;
+
+ columns = gtk_tree_view_get_columns (GTK_TREE_VIEW(obj));
+
+ for (cursor = columns; cursor; cursor = cursor->next)
+ gtk_tree_view_remove_column (GTK_TREE_VIEW(obj),
+ GTK_TREE_VIEW_COLUMN(cursor->data));
+ g_list_free (columns);
+}
+
+
+
+
+static void
+init_columns (ModestTnyHeaderTreeView *obj)
+{
+ GtkTreeViewColumn *column=NULL;
+ GtkCellRenderer *renderer_msgtype,
+ *renderer_header,
+ *renderer_attach;
+
+ ModestTnyHeaderTreeViewPrivate *priv;
+ GSList *cursor;
+
+ priv = MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(obj);
+
+ renderer_msgtype = gtk_cell_renderer_pixbuf_new ();
+ renderer_attach = gtk_cell_renderer_pixbuf_new ();
+ renderer_header = gtk_cell_renderer_text_new ();
+
+ remove_all_columns (obj);
+
+ for (cursor = priv->columns; cursor; cursor = cursor->next) {
+ ModestTnyHeaderTreeViewColumn col =
+ (ModestTnyHeaderTreeViewColumn) GPOINTER_TO_INT(cursor->data);
+
+ switch (col) {
+
+ case MODEST_TNY_HEADER_TREE_VIEW_COLUMN_MSGTYPE:
+
+ column = get_new_column (_("M"), renderer_msgtype, FALSE,
+ TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN,
+ FALSE, (GtkTreeCellDataFunc)msgtype_cell_data,
+ NULL);
+ break;
+
+ case MODEST_TNY_HEADER_TREE_VIEW_COLUMN_ATTACH:
+
+ column = get_new_column (_("A"), renderer_attach, FALSE,
+ TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN,
+ FALSE, (GtkTreeCellDataFunc)attach_cell_data,
+ NULL);
+ break;
+
+ case MODEST_TNY_HEADER_TREE_VIEW_COLUMN_RECEIVED_DATE:
+ column = get_new_column (_("Received"), renderer_header, TRUE,
+ TNY_MSG_HEADER_LIST_MODEL_DATE_RECEIVED_COLUMN,
+ TRUE, (GtkTreeCellDataFunc)header_cell_data,
+ NULL);
+ break;
+
+ case MODEST_TNY_HEADER_TREE_VIEW_COLUMN_FROM:
+ column = get_new_column (_("From"), renderer_header, TRUE,
+ TNY_MSG_HEADER_LIST_MODEL_FROM_COLUMN,
+ TRUE, (GtkTreeCellDataFunc)sender_receiver_cell_data,
+ GINT_TO_POINTER(TRUE));
+ break;
+
+ case MODEST_TNY_HEADER_TREE_VIEW_COLUMN_TO:
+ column = get_new_column (_("To"), renderer_header, TRUE,
+ TNY_MSG_HEADER_LIST_MODEL_TO_COLUMN,
+ TRUE, (GtkTreeCellDataFunc)sender_receiver_cell_data,
+ GINT_TO_POINTER(FALSE));
+ break;
+
+ case MODEST_TNY_HEADER_TREE_VIEW_COLUMN_COMPACT_HEADER:
+ column = get_new_column (_("Header"), renderer_header, TRUE,
+ TNY_MSG_HEADER_LIST_MODEL_FROM_COLUMN,
+ TRUE, (GtkTreeCellDataFunc)compact_header_cell_data,
+ NULL);
+ break;
+
+ case MODEST_TNY_HEADER_TREE_VIEW_COLUMN_SUBJECT:
+ column = get_new_column (_("Subject"), renderer_header, TRUE,
+ TNY_MSG_HEADER_LIST_MODEL_SUBJECT_COLUMN,
+ TRUE, (GtkTreeCellDataFunc)header_cell_data,
+ NULL);
+ break;
+
+
+ case MODEST_TNY_HEADER_TREE_VIEW_COLUMN_SENT_DATE:
+ column = get_new_column (_("Sent"), renderer_header, TRUE,
+ TNY_MSG_HEADER_LIST_MODEL_DATE_SENT_COLUMN,
+ TRUE, (GtkTreeCellDataFunc)header_cell_data,
+ NULL);
+ break;
+ }
+ gtk_tree_view_append_column (GTK_TREE_VIEW(obj), column);
+ }
+}
+
+
+
+
+