X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-header-view-render.c;h=b3a83f7ee848af29e1fb60e0ecbaf2974b6b9d3c;hp=fa07fa306520d9fd0628d02110f70158dbdddb39;hb=b93b64adaaf2947f8b35889981af6ad96b18fd31;hpb=85341f5ce0127bf590c1f83762ac14dc7ca070d3 diff --git a/src/widgets/modest-header-view-render.c b/src/widgets/modest-header-view-render.c index fa07fa3..b3a83f7 100644 --- a/src/widgets/modest-header-view-render.c +++ b/src/widgets/modest-header-view-render.c @@ -27,13 +27,161 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - #include #include #include -#include #include +#include #include +#include + + +static gchar * +_pango_replace_string (const gchar *string, + const gchar *in, + const gchar *out) +{ + gchar **tmp = NULL; + gchar *new_string = NULL; + gchar *tmp_string = NULL; + guint i = 0; + + /* Split data */ + if (string == NULL) return g_strdup(""); + tmp = g_strsplit(string, in, 0); + if (tmp[0] == NULL) return g_strdup(string); + + /* Replace and concat data*/ + new_string = g_strdup(tmp[0]); + for (i = 1; tmp[i] != NULL; i++) { + tmp_string = g_strconcat (new_string, out, tmp[i], NULL); + g_free(new_string); + new_string = g_strdup(tmp_string); + g_free(tmp_string); + } + + /* Free */ + g_strfreev(tmp); + + return new_string; +} + +static gchar * +_pango_parse_string (const gchar *string) +{ + gchar *parsed_string = NULL; + gchar *tmp = NULL; + + if (string == NULL) return g_strdup(""); + parsed_string = g_strdup(string); + + /* Check for '&' special character */ + tmp = g_strdup(parsed_string); + g_free(parsed_string); + parsed_string = _pango_replace_string (tmp, "&", "&"); + g_free(tmp); + + /* Check for '<' special character */ + tmp = g_strdup(parsed_string); + g_free(parsed_string); + parsed_string = _pango_replace_string (tmp, "<", "<"); + g_free(tmp); + + /* Check for '>' special character */ + tmp = g_strdup(parsed_string); + g_free(parsed_string); + parsed_string = _pango_replace_string (tmp, ">", ">"); + g_free(tmp); + + /* Check for ''' special character */ + tmp = g_strdup(parsed_string); + g_free(parsed_string); + parsed_string = _pango_replace_string (tmp, "'", "'"); + g_free(tmp); + + return parsed_string; +} + + +static GdkPixbuf* +get_pixbuf_for_flag (TnyHeaderFlags flag) +{ + /* optimization */ + static GdkPixbuf *deleted_pixbuf = NULL; + static GdkPixbuf *seen_pixbuf = NULL; + static GdkPixbuf *unread_pixbuf = NULL; + static GdkPixbuf *attachments_pixbuf = NULL; + + switch (flag) { + case TNY_HEADER_FLAG_DELETED: + if (G_UNLIKELY(!deleted_pixbuf)) + deleted_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_DELETED); + return deleted_pixbuf; + case TNY_HEADER_FLAG_SEEN: + if (G_UNLIKELY(!seen_pixbuf)) + seen_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_READ); + return seen_pixbuf; + case TNY_HEADER_FLAG_ATTACHMENTS: + if (G_UNLIKELY(!attachments_pixbuf)) + attachments_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_ATTACH); + return attachments_pixbuf; + default: + if (G_UNLIKELY(!unread_pixbuf)) + unread_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_UNREAD); + return unread_pixbuf; + } +} + +static GdkPixbuf* +get_pixbuf_for_compact_flag (TnyHeaderFlags flags) +{ + /* optimization */ + static GdkPixbuf *high_attachments_pixbuf = NULL; + static GdkPixbuf *normal_attachments_pixbuf = NULL; + static GdkPixbuf *low_attachments_pixbuf = NULL; + static GdkPixbuf *high_pixbuf = NULL; + static GdkPixbuf *low_pixbuf = NULL; + + if (flags & TNY_HEADER_FLAG_ATTACHMENTS) { + if (flags & TNY_HEADER_FLAG_HIGH_PRIORITY) { + if (G_UNLIKELY(!high_attachments_pixbuf)) + high_attachments_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_ATTACH_HIGH_PRIORITY); + return high_attachments_pixbuf; + } + else if (flags & TNY_HEADER_FLAG_LOW_PRIORITY) { + if (G_UNLIKELY(!low_attachments_pixbuf)) + low_attachments_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_ATTACH_LOW_PRIORITY); + return low_attachments_pixbuf; + } + else { + if (G_UNLIKELY(!normal_attachments_pixbuf)) + normal_attachments_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_ATTACH_NORM_PRIORITY); + return normal_attachments_pixbuf; + } + } + else if (flags & TNY_HEADER_FLAG_HIGH_PRIORITY) { + if (G_UNLIKELY(!high_pixbuf)) + high_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_HIGH_PRIORITY); + return high_pixbuf; + } + else if (flags & TNY_HEADER_FLAG_LOW_PRIORITY) { + if (G_UNLIKELY(!low_pixbuf)) + low_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_LOW_PRIORITY); + return low_pixbuf; + } + + + return NULL; +} + +static void +set_common_flags (GtkCellRenderer *renderer, TnyHeaderFlags flags) +{ + g_object_set (G_OBJECT(renderer), + "weight", (flags & TNY_HEADER_FLAG_SEEN) ? PANGO_WEIGHT_NORMAL: PANGO_WEIGHT_ULTRABOLD, + "strikethrough", (flags & TNY_HEADER_FLAG_DELETED) ? TRUE:FALSE, + NULL); +} void @@ -41,19 +189,19 @@ _modest_header_view_msgtype_cell_data (GtkTreeViewColumn *column, GtkCellRendere 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); + g_object_set (G_OBJECT (renderer), "pixbuf", + get_pixbuf_for_flag (TNY_HEADER_FLAG_DELETED), NULL); 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); + g_object_set (G_OBJECT (renderer), "pixbuf", + get_pixbuf_for_flag (TNY_HEADER_FLAG_SEEN), NULL); + else + g_object_set (G_OBJECT (renderer), "pixbuf", + get_pixbuf_for_flag (0), NULL); /* ughh, FIXME */ } void @@ -61,17 +209,31 @@ _modest_header_view_attach_cell_data (GtkTreeViewColumn *column, GtkCellRenderer 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); + g_object_set (G_OBJECT (renderer), "pixbuf", + get_pixbuf_for_flag (TNY_HEADER_FLAG_ATTACHMENTS), + NULL); } +void +_modest_header_view_compact_flag_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); + + pixbuf = get_pixbuf_for_compact_flag (flags); + if (pixbuf != NULL) + g_object_set (G_OBJECT (renderer), "pixbuf", pixbuf, NULL); + +} void _modest_header_view_header_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, @@ -81,50 +243,65 @@ _modest_header_view_header_cell_data (GtkTreeViewColumn *column, GtkCellRender 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, - "strikethrough", (flags & TNY_HEADER_FLAG_DELETED) ? TRUE:FALSE, - NULL); + set_common_flags (renderer, flags); } void -_modest_header_view_size_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, - GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data) +_modest_header_view_date_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, + GtkTreeModel *tree_model, GtkTreeIter *iter, + gpointer user_data) { TnyHeaderFlags flags; - guint size; - gchar *size_str; - const gchar* unit; - + guint date, date_col; + gchar *display_date = NULL; + gboolean received = GPOINTER_TO_INT(user_data); + + if (received) + date_col = TNY_GTK_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN; + else + date_col = TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN; + gtk_tree_model_get (tree_model, iter, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, - TNY_GTK_HEADER_LIST_MODEL_MESSAGE_SIZE_COLUMN, &size, + date_col, &date, -1); - if (size < 1024*1024) { - unit = _("Kb"); - size /= 1024; - } else if (size < 1024*1024*1024) { - unit = _("Mb"); - size /= (1024*1024); - } else { - unit = _("Gb"); - size /= (1024*1024*1024); - } + display_date = modest_text_utils_get_display_date (date); + g_object_set (G_OBJECT(renderer), "text", display_date, NULL); - size_str = g_strdup_printf ("%d %s", size, unit); - - 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, - "text", size_str, - NULL); - g_free (size_str); + set_common_flags (renderer, flags); + g_free (display_date); } +void +_modest_header_view_compact_date_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, + GtkTreeModel *tree_model, GtkTreeIter *iter, + gpointer user_data) +{ + TnyHeaderFlags flags; + guint date, date_col; + gchar *display_date = NULL, *tmp_date = NULL; + gboolean received = GPOINTER_TO_INT(user_data); + + if (received) + date_col = TNY_GTK_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN; + else + date_col = TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN; + + gtk_tree_model_get (tree_model, iter, + TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, + date_col, &date, + -1); + + tmp_date = modest_text_utils_get_display_date (date); + display_date = g_strdup_printf ("\n%s", tmp_date); + g_object_set (G_OBJECT(renderer), "markup", display_date, NULL); + + set_common_flags (renderer, flags); + g_free (tmp_date); + g_free (display_date); +} void _modest_header_view_sender_receiver_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, @@ -147,13 +324,9 @@ _modest_header_view_sender_receiver_cell_data (GtkTreeViewColumn *column, GtkC 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); + g_free (address); + set_common_flags (renderer, flags); } /* * this for both incoming and outgoing mail, depending on the the user_data @@ -162,12 +335,12 @@ _modest_header_view_sender_receiver_cell_data (GtkTreeViewColumn *column, GtkC */ void _modest_header_view_compact_header_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, - GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data) + GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data) { GObject *rendobj; TnyHeaderFlags flags; - gchar *address, *subject; - gchar *header; + gchar *address, *subject, *header, *display_address; + gchar *parsed_address, *parsed_subject; time_t date; gboolean is_incoming; @@ -189,21 +362,74 @@ _modest_header_view_compact_header_cell_data (GtkTreeViewColumn *column, GtkCe TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &date, -1); - rendobj = G_OBJECT(renderer); + 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); + /* deal with empty subjects */ + if (!subject) + subject = g_strdup (_("mail_va_no_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); + /* Escape special characteres to allow pango makup`*/ + display_address = modest_text_utils_get_display_address (address); + parsed_address = _pango_parse_string (display_address); + parsed_subject = _pango_parse_string (subject); - g_free (header); + header = g_strdup_printf ("%s\n%s", + parsed_subject, + parsed_address); g_free (address); g_free (subject); + g_free(parsed_subject); + g_free(parsed_address); + + g_object_set (rendobj, "markup", header, NULL); + set_common_flags (renderer, flags); + + g_free (header); } + + +void +_modest_header_view_size_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, + GtkTreeModel *tree_model, GtkTreeIter *iter, + gpointer user_data) +{ + TnyHeaderFlags flags; + guint size; + gchar *size_str; + + gtk_tree_model_get (tree_model, iter, + TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, + TNY_GTK_HEADER_LIST_MODEL_MESSAGE_SIZE_COLUMN, &size, + -1); + + size_str = modest_text_utils_get_display_size (size); + + g_object_set (G_OBJECT(renderer), "text", size_str, NULL); + set_common_flags (renderer, flags); + + g_free (size_str); + } + +void +_modest_header_view_status_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, + GtkTreeModel *tree_model, GtkTreeIter *iter, + gpointer user_data) +{ + TnyHeaderFlags flags; + guint status; + gchar *status_str; + + gtk_tree_model_get (tree_model, iter, + TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, + TNY_GTK_HEADER_LIST_MODEL_MESSAGE_SIZE_COLUMN, &status, + -1); + +/* size_str = modest_text_utils_get_display_size (size); */ + status_str = g_strdup(_("mcen_li_outbox_waiting")); + + g_object_set (G_OBJECT(renderer), "text", status_str, NULL); + set_common_flags (renderer, flags); + + g_free (status_str); + } +