+msgtype_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer,
+ GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data)
+{
+ TnyMsgHeaderFlags flags;
+ GdkPixbuf *pixbuf = NULL;
+
+ gtk_tree_model_get (tree_model, iter, TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN,
+ &flags, -1);
+
+ if (flags & TNY_MSG_HEADER_FLAG_DELETED)
+ pixbuf = modest_icon_factory_get_icon (MODEST_HEADER_ICON_DELETED);
+ else if (flags & TNY_MSG_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)
+{
+ TnyMsgHeaderFlags flags;
+ GdkPixbuf *pixbuf = NULL;
+
+ gtk_tree_model_get (tree_model, iter, TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN,
+ &flags, -1);
+
+ if (flags & TNY_MSG_HEADER_FLAG_ATTACHMENTS)
+ pixbuf = modest_icon_factory_get_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)
+{
+ 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)