X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-header-view-render.c;h=a7a242ac0242024d42a59aa84aaeaef922a97afb;hb=c9fa4fd68338531cc81b16d0f512a85c8209a646;hp=b1c1daa88bc94a8d55cd9c988b636fbf6b1c8d15;hpb=c3c7de8afda2eb9cdb514fb517c6f188c8054e06;p=modest diff --git a/src/widgets/modest-header-view-render.c b/src/widgets/modest-header-view-render.c index b1c1daa..a7a242a 100644 --- a/src/widgets/modest-header-view-render.c +++ b/src/widgets/modest-header-view-render.c @@ -27,83 +27,49 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include +#include #include #include +#include +#include +#include +#include #include #include #include +#include -#if 0 -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; -} +#ifdef MODEST_TOOLKIT_HILDON2 +#define SMALL_ICON_SIZE MODEST_ICON_SIZE_SMALL +#else +#define SMALL_ICON_SIZE MODEST_ICON_SIZE_SMALL +#endif -static gchar * -_pango_parse_string (const gchar *string) +static const gchar * +get_status_string (ModestTnySendQueueStatus status) { - 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; + switch (status) { + case MODEST_TNY_SEND_QUEUE_WAITING: + return _("mcen_li_outbox_waiting"); + break; + case MODEST_TNY_SEND_QUEUE_SENDING: + return _("mcen_li_outbox_sending"); + break; + case MODEST_TNY_SEND_QUEUE_SUSPENDED: + return _("mcen_li_outbox_suspended"); + break; + case MODEST_TNY_SEND_QUEUE_FAILED: + return _("mcen_li_outbox_failed"); + break; + default: + return ""; + break; + } } -#endif - static GdkPixbuf* get_pixbuf_for_flag (TnyHeaderFlags flag) { @@ -112,73 +78,45 @@ get_pixbuf_for_flag (TnyHeaderFlags flag) static GdkPixbuf *seen_pixbuf = NULL; static GdkPixbuf *unread_pixbuf = NULL; static GdkPixbuf *attachments_pixbuf = NULL; + static GdkPixbuf *high_pixbuf = NULL; + static GdkPixbuf *low_pixbuf = NULL; switch (flag) { case TNY_HEADER_FLAG_DELETED: if (G_UNLIKELY(!deleted_pixbuf)) - deleted_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_DELETED); + deleted_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_DELETED, + SMALL_ICON_SIZE); return deleted_pixbuf; case TNY_HEADER_FLAG_SEEN: if (G_UNLIKELY(!seen_pixbuf)) - seen_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_READ); + seen_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_READ, + SMALL_ICON_SIZE); return seen_pixbuf; case TNY_HEADER_FLAG_ATTACHMENTS: if (G_UNLIKELY(!attachments_pixbuf)) - attachments_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_ATTACH); + attachments_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_ATTACH, + SMALL_ICON_SIZE); return attachments_pixbuf; + case TNY_HEADER_FLAG_HIGH_PRIORITY: + if (G_UNLIKELY(!high_pixbuf)) + high_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_HIGH, + SMALL_ICON_SIZE); + return high_pixbuf; + case TNY_HEADER_FLAG_LOW_PRIORITY: + if (G_UNLIKELY(!low_pixbuf)) + low_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_LOW, + SMALL_ICON_SIZE); + return low_pixbuf; + case TNY_HEADER_FLAG_NORMAL_PRIORITY: + return NULL; default: if (G_UNLIKELY(!unread_pixbuf)) - unread_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_UNREAD); + unread_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_UNREAD, + SMALL_ICON_SIZE); 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; - TnyHeaderFlags prior; - - prior = flags & TNY_HEADER_FLAG_HIGH_PRIORITY; - switch (prior) { - case TNY_HEADER_FLAG_HIGH_PRIORITY: - if (flags & TNY_HEADER_FLAG_ATTACHMENTS) { - 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 (G_UNLIKELY(!high_pixbuf)) - high_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_HIGH_PRIORITY); - return high_pixbuf; - } - break; - case TNY_HEADER_FLAG_LOW_PRIORITY: - if (flags & TNY_HEADER_FLAG_ATTACHMENTS) { - 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(!low_pixbuf)) - low_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_LOW_PRIORITY); - return low_pixbuf; - } - break; - default: - if (flags & TNY_HEADER_FLAG_ATTACHMENTS) { - if (G_UNLIKELY(!normal_attachments_pixbuf)) - normal_attachments_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_ATTACH_NORM_PRIORITY); - return normal_attachments_pixbuf; - } - } - - return NULL; -} - static void set_common_flags (GtkCellRenderer *renderer, TnyHeaderFlags flags) { @@ -188,25 +126,46 @@ set_common_flags (GtkCellRenderer *renderer, TnyHeaderFlags flags) NULL); } - -void -_modest_header_view_msgtype_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, - GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data) +static void +set_cell_text (GtkCellRenderer *renderer, + const gchar *text, + TnyHeaderFlags flags) { - TnyHeaderFlags flags; - - gtk_tree_model_get (tree_model, iter, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, - &flags, -1); + gboolean strikethrough; + gboolean bold_is_active_color; + GdkColor *color = NULL; + PangoWeight weight; + + bold_is_active_color = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (renderer), BOLD_IS_ACTIVE_COLOR)); + if (bold_is_active_color) { + color = g_object_get_data (G_OBJECT (renderer), ACTIVE_COLOR); + } - if (flags & TNY_HEADER_FLAG_DELETED) - g_object_set (G_OBJECT (renderer), "pixbuf", - get_pixbuf_for_flag (TNY_HEADER_FLAG_DELETED), NULL); - else if (flags & TNY_HEADER_FLAG_SEEN) - 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 */ +#ifdef MODEST_TOOLKIT_HILDON2 + weight = PANGO_WEIGHT_NORMAL; +#else + weight = (bold_is_active_color || (flags & TNY_HEADER_FLAG_SEEN)) ? PANGO_WEIGHT_NORMAL: PANGO_WEIGHT_ULTRABOLD; +#endif + strikethrough = (flags & TNY_HEADER_FLAG_DELETED) ? TRUE:FALSE; + g_object_freeze_notify (G_OBJECT (renderer)); + g_object_set (G_OBJECT (renderer), + "text", text, + "weight", weight, + "strikethrough", (flags &TNY_HEADER_FLAG_DELETED) ? TRUE : FALSE, + NULL); + if (bold_is_active_color && color) { + if (flags & TNY_HEADER_FLAG_SEEN) { + g_object_set (G_OBJECT (renderer), + "foreground-set", FALSE, + NULL); + } else { + g_object_set (G_OBJECT (renderer), + "foreground-gdk", color, + "foreground-set", TRUE, + NULL); + } + } + g_object_thaw_notify (G_OBJECT (renderer)); } void @@ -225,22 +184,6 @@ _modest_header_view_attach_cell_data (GtkTreeViewColumn *column, GtkCellRenderer } 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, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data) { @@ -259,7 +202,6 @@ _modest_header_view_date_cell_data (GtkTreeViewColumn *column, GtkCellRenderer { TnyHeaderFlags flags; guint date, date_col; - gchar *display_date = NULL; gboolean received = GPOINTER_TO_INT(user_data); if (received) @@ -272,45 +214,24 @@ _modest_header_view_date_cell_data (GtkTreeViewColumn *column, GtkCellRenderer date_col, &date, -1); - display_date = modest_text_utils_get_display_date (date); - g_object_set (G_OBJECT(renderer), "text", display_date, NULL); - - 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); +#if GTK_CHECK_VERSION (2, 12, 0) + ModestHeaderView *header_view; + header_view = MODEST_HEADER_VIEW (gtk_tree_view_column_get_tree_view (column)); + set_cell_text (renderer, + _modest_header_view_get_display_date (header_view, date), + flags); +#else + set_cell_text (renderer, modest_text_utils_get_display_date (date), + flags); +#endif } void -_modest_header_view_sender_receiver_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, - GtkTreeModel *tree_model, GtkTreeIter *iter, gboolean is_sender) +_modest_header_view_sender_receiver_cell_data (GtkTreeViewColumn *column, + GtkCellRenderer *renderer, + GtkTreeModel *tree_model, + GtkTreeIter *iter, + gboolean is_sender) { TnyHeaderFlags flags; gchar *address; @@ -320,18 +241,17 @@ _modest_header_view_sender_receiver_cell_data (GtkTreeViewColumn *column, GtkC 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), - NULL); + + modest_text_utils_get_display_address (address); /* string is changed in-place */ + + set_cell_text (renderer, (address && address[0] != '\0')?address:_("mail_va_no_to"), + flags); g_free (address); - set_common_flags (renderer, flags); } /* * this for both incoming and outgoing mail, depending on the the user_data @@ -342,56 +262,115 @@ void _modest_header_view_compact_header_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data) { - GObject *rendobj; - TnyHeaderFlags flags; - gchar *address, *subject, *header, *display_address; - gchar *parsed_address, *parsed_subject; + TnyHeaderFlags flags = 0; + gchar *recipients = NULL, *addresses; + gchar *subject = NULL; time_t date; - gboolean is_incoming; + GtkCellRenderer *recipient_cell, *date_or_status_cell, *subject_cell, + *attach_cell, *priority_cell, + *recipient_box, *subject_box = NULL; + TnyHeader *msg_header = NULL; + TnyHeaderFlags prio = 0; + +#ifdef MAEMO_CHANGES +#ifdef HAVE_GTK_TREE_VIEW_COLUMN_GET_CELL_DATA_HINT + GtkTreeCellDataHint hint; +#endif +#endif + + g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (column)); + g_return_if_fail (GTK_IS_CELL_RENDERER (renderer)); + g_return_if_fail (GTK_IS_TREE_MODEL (tree_model)); - is_incoming = GPOINTER_TO_INT(user_data); /* GPOINTER_TO_BOOLEAN is not available - * in older versions of glib...*/ +#ifdef MAEMO_CHANGES +#ifdef HAVE_GTK_TREE_VIEW_COLUMN_GET_CELL_DATA_HINT + hint = gtk_tree_view_column_get_cell_data_hint (GTK_TREE_VIEW_COLUMN (column)); - if (is_incoming) + if (hint != GTK_TREE_CELL_DATA_HINT_ALL) + return; +#endif +#endif + + recipient_box = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (renderer), "recpt-box-renderer")); + subject_box = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (renderer), "subject-box-renderer")); + priority_cell = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (subject_box), "priority-renderer")); + subject_cell = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (subject_box), "subject-renderer")); + attach_cell = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (recipient_box), "attach-renderer")); + recipient_cell = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (recipient_box), "recipient-renderer")); + date_or_status_cell = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (recipient_box), "date-renderer")); + + ModestHeaderViewCompactHeaderMode header_mode = GPOINTER_TO_INT (user_data); + + if (header_mode == MODEST_HEADER_VIEW_COMPACT_HEADER_MODE_IN) 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_FROM_COLUMN, &recipients, TNY_GTK_HEADER_LIST_MODEL_SUBJECT_COLUMN, &subject, - TNY_GTK_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN, &date, + TNY_GTK_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN, &date, + TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &msg_header, -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_TO_COLUMN, &recipients, TNY_GTK_HEADER_LIST_MODEL_SUBJECT_COLUMN, &subject, - TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &date, - -1); - - rendobj = G_OBJECT(renderer); + TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &date, + TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &msg_header, + -1); + /* flags */ + /* FIXME: we might gain something by doing all the g_object_set's at once */ + if (flags & TNY_HEADER_FLAG_ATTACHMENTS) + g_object_set (G_OBJECT (attach_cell), "pixbuf", + get_pixbuf_for_flag (TNY_HEADER_FLAG_ATTACHMENTS), + NULL); + else + g_object_set (G_OBJECT (attach_cell), "pixbuf", + NULL, NULL); - /* deal with empty subjects */ - if (!subject) - subject = g_strdup (_("mail_va_no_subject")); - - /* Escape special characteres to allow pango makup`*/ - display_address = modest_text_utils_get_display_address (address); - parsed_address = modest_text_utils_convert_to_pango (display_address); - //_pango_parse_string (display_address); - parsed_subject = modest_text_utils_convert_to_pango (subject); - //_pango_parse_string (subject); - - header = g_strdup_printf ("%s\n%s", - parsed_subject, - parsed_address); - g_free (address); + if (msg_header) + prio = tny_header_get_priority (msg_header); + g_object_set (G_OBJECT (priority_cell), "pixbuf", + get_pixbuf_for_flag (prio), + NULL); + + set_cell_text (subject_cell, (subject && subject[0] != 0)?subject:_("mail_va_no_subject"), + flags); 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); + /* Show the list of senders/recipients */ + addresses = modest_text_utils_get_display_addresses ((const gchar *) recipients); + set_cell_text (recipient_cell, (addresses) ? addresses : _("mail_va_no_to"), flags); + g_free (addresses); + g_free (recipients); + + /* Show status (outbox folder) or sent date */ + if (header_mode == MODEST_HEADER_VIEW_COMPACT_HEADER_MODE_OUTBOX) { + ModestTnySendQueueStatus status = MODEST_TNY_SEND_QUEUE_UNKNOWN; + const gchar *status_str = ""; + if (msg_header != NULL) { + status = modest_tny_all_send_queues_get_msg_status (msg_header); + if (status == MODEST_TNY_SEND_QUEUE_SUSPENDED) { + tny_header_set_flag (msg_header, TNY_HEADER_FLAG_SUSPENDED); + } + } + + status_str = get_status_string (status); + set_cell_text (date_or_status_cell, status_str, flags); + } else { +#if GTK_CHECK_VERSION (2, 12, 0) + ModestHeaderView *header_view; + header_view = MODEST_HEADER_VIEW (gtk_tree_view_column_get_tree_view (column)); + set_cell_text (date_or_status_cell, + date ? _modest_header_view_get_display_date (header_view, date) : "", + flags); +#else + set_cell_text (date_or_status_cell, + date ? modest_text_utils_get_display_date (date) : "", + flags); +#endif + } + if (msg_header != NULL) + g_object_unref (msg_header); } @@ -411,31 +390,30 @@ _modest_header_view_size_cell_data (GtkTreeViewColumn *column, GtkCellRenderer size_str = modest_text_utils_get_display_size (size); - g_object_set (G_OBJECT(renderer), "text", size_str, NULL); - set_common_flags (renderer, flags); + set_cell_text (renderer, size_str, flags); g_free (size_str); } void _modest_header_view_status_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, - GtkTreeModel *tree_model, GtkTreeIter *iter, - gpointer user_data) + GtkTreeModel *tree_model, GtkTreeIter *iter, + gpointer user_data) { TnyHeaderFlags flags; - guint status; + //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, + TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, -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); + + if (flags & TNY_HEADER_FLAG_SUSPENDED) + status_str = g_strdup(_("mcen_li_outbox_suspended")); + else + status_str = g_strdup(_("mcen_li_outbox_waiting")); + + set_cell_text (renderer, status_str, flags); g_free (status_str); }