X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-header-view-render.c;h=e8dfe27cc7a7f2662e2e2b3c07e642c56b08d51f;hb=fb20b9c67740dddfb1cd235692173e0495260bf3;hp=9ac7d1a4fd2bb627ea932eb3177ce275e9da2efc;hpb=1bcaa975bf187f8164245547b94c511f4f19dc25;p=modest diff --git a/src/widgets/modest-header-view-render.c b/src/widgets/modest-header-view-render.c index 9ac7d1a..e8dfe27 100644 --- a/src/widgets/modest-header-view-render.c +++ b/src/widgets/modest-header-view-render.c @@ -27,61 +27,127 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - #include #include #include -#include #include +#include +#include +#include +#include #include +#include +#include -/* - * optimization - */ +void +fill_list_of_caches (gpointer key, gpointer value, gpointer userdata) +{ + GSList **send_queues = (GSList **) userdata; + *send_queues = g_slist_prepend (*send_queues, value); +} + +static ModestTnySendQueueStatus +get_status_of_uid (TnyHeader *header) +{ + ModestCacheMgr *cache_mgr; + GHashTable *send_queue_cache; + GSList *send_queues = NULL, *node; + /* get_msg_status returns suspended by default, so we want to detect changes */ + ModestTnySendQueueStatus status = MODEST_TNY_SEND_QUEUE_SUSPENDED; + ModestTnySendQueueStatus queue_status = MODEST_TNY_SEND_QUEUE_SUSPENDED; + gchar *msg_uid = NULL; + + msg_uid = modest_tny_send_queue_get_msg_id (header); + cache_mgr = modest_runtime_get_cache_mgr (); + send_queue_cache = modest_cache_mgr_get_cache (cache_mgr, + MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE); + + g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues); + + for (node = send_queues; node != NULL; node = g_slist_next (node)) { + ModestTnySendQueue *send_queue = MODEST_TNY_SEND_QUEUE (node->data); + + queue_status = modest_tny_send_queue_get_msg_status (send_queue, msg_uid); + if (queue_status != MODEST_TNY_SEND_QUEUE_UNKNONW) { + status = queue_status; + break; + } + } + + g_free(msg_uid); + g_slist_free (send_queues); + return status; +} + +static const gchar * +get_status_string (ModestTnySendQueueStatus status) +{ + 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; + } +} + 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; + static GdkPixbuf *deleted_pixbuf = NULL; + 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_icon_factory_get_icon (MODEST_HEADER_ICON_DELETED); + 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_icon_factory_get_icon (MODEST_HEADER_ICON_READ); + 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_icon_factory_get_icon (MODEST_HEADER_ICON_ATTACH); + attachments_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_ATTACH); return attachments_pixbuf; + case TNY_HEADER_FLAG_HIGH_PRIORITY: + if (G_UNLIKELY(!high_pixbuf)) + high_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_HIGH); + return high_pixbuf; + case TNY_HEADER_FLAG_LOW_PRIORITY: + if (G_UNLIKELY(!low_pixbuf)) + low_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_LOW); + return low_pixbuf; default: if (G_UNLIKELY(!unread_pixbuf)) - unread_pixbuf = modest_icon_factory_get_icon (MODEST_HEADER_ICON_UNREAD); + unread_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_UNREAD); return unread_pixbuf; } } - -static const gchar* -get_display_date (time_t date) +static void +set_common_flags (GtkCellRenderer *renderer, TnyHeaderFlags flags) { - static guint cached_date = 0; - static const gchar* cached_date_str = NULL; - - /* optimization; if the date didn't changed, just reuse the old date str*/ - if (cached_date == date) - return cached_date_str; - else { - cached_date = date; - return cached_date_str = modest_text_utils_get_display_date (date); - } + 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); } @@ -128,11 +194,7 @@ _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); } @@ -143,6 +205,7 @@ _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) @@ -154,15 +217,13 @@ _modest_header_view_date_cell_data (GtkTreeViewColumn *column, GtkCellRenderer TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, date_col, &date, -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, - "text", get_display_date (date), - NULL); -} + 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_sender_receiver_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, @@ -185,13 +246,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 @@ -202,16 +259,27 @@ void _modest_header_view_compact_header_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data) { - GObject *rendobj; - TnyHeaderFlags flags; + TnyHeaderFlags flags, prior_flags; gchar *address, *subject, *header; time_t date; - gboolean is_incoming; + ModestHeaderViewCompactHeaderMode header_mode; + GtkCellRenderer *recipient_cell, *date_or_status_cell, *subject_cell, + *attach_cell, *priority_cell, + *recipient_box, *subject_box; + TnyHeader *msg_header = NULL; + gchar *display_date = NULL, *tmp_date = NULL; + + 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")); - is_incoming = GPOINTER_TO_INT(user_data); /* GPOINTER_TO_BOOLEAN is not available - * in older versions of glib...*/ + header_mode = GPOINTER_TO_INT (user_data); - if (is_incoming) + 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, @@ -223,24 +291,82 @@ _modest_header_view_compact_header_cell_data (GtkTreeViewColumn *column, GtkCe 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, + TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &date, + TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &msg_header, -1); - - rendobj = G_OBJECT(renderer); - header = g_strdup_printf ("%s %s\n%s", - modest_text_utils_get_display_address (address), - get_display_date (date), - subject); - g_free (address); + + /* flags */ + prior_flags = flags & TNY_HEADER_FLAG_PRIORITY; + 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); + if (flags & TNY_HEADER_FLAG_PRIORITY) + g_object_set (G_OBJECT (priority_cell), "pixbuf", + get_pixbuf_for_flag (prior_flags), +/* get_pixbuf_for_flag (flags & TNY_HEADER_FLAG_PRIORITY), */ + NULL); + else + g_object_set (G_OBJECT (priority_cell), "pixbuf", + NULL, NULL); + header = g_markup_printf_escaped ("%s", (subject && strlen (subject)) ? subject : _("mail_va_no_subject")); g_free (subject); + g_object_set (G_OBJECT (subject_cell), "markup", header, NULL); + g_free (header); + set_common_flags (subject_cell, flags); + + + /* fixme: we hardcode the color to #666666; instead we should use SecundaryTextColour from the + * theme (gtkrc file) */ - 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); + header = g_markup_printf_escaped ("%s", modest_text_utils_get_display_address (address)); + g_free (address); + g_object_set (G_OBJECT (recipient_cell), + "markup", header, + NULL); g_free (header); + set_common_flags (recipient_cell, flags); + + if (header_mode == MODEST_HEADER_VIEW_COMPACT_HEADER_MODE_OUTBOX) { + ModestTnySendQueueStatus status = MODEST_TNY_SEND_QUEUE_WAITING; + const gchar *status_str = ""; + if (msg_header != NULL) { + status = get_status_of_uid (msg_header); + if (status == MODEST_TNY_SEND_QUEUE_SUSPENDED) { + tny_header_unset_flags (msg_header, TNY_HEADER_FLAG_PRIORITY); + tny_header_set_flags (msg_header, TNY_HEADER_FLAG_SUSPENDED_PRIORITY); + } +/* if (prior_flags == TNY_HEADER_FLAG_SUSPENDED_PRIORITY) */ +/* status = MODEST_TNY_SEND_QUEUE_SUSPENDED; */ + } + status_str = get_status_string (status); + display_date = g_strdup_printf("%s", status_str); + g_object_set (G_OBJECT (date_or_status_cell), + "markup", display_date, + NULL); + g_free (display_date); + } else { + /* in some rare cases, mail might have no Date: field. it case, + * don't show the date, instead of bogus 1/1/1970 + */ + if (date) + tmp_date = modest_text_utils_get_display_date (date); + else + tmp_date = g_strdup (""); + + display_date = g_strdup_printf ("%s", tmp_date); + g_object_set (G_OBJECT (date_or_status_cell), + "markup", display_date, + NULL); + g_free (tmp_date); + g_free (display_date); + } + if (msg_header != NULL) + g_object_unref (msg_header); + set_common_flags (date_or_status_cell, flags); } @@ -252,7 +378,6 @@ _modest_header_view_size_cell_data (GtkTreeViewColumn *column, GtkCellRenderer TnyHeaderFlags flags; guint size; gchar *size_str; - const gchar* unit; gtk_tree_model_get (tree_model, iter, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, @@ -261,12 +386,34 @@ _modest_header_view_size_cell_data (GtkTreeViewColumn *column, GtkCellRenderer size_str = modest_text_utils_get_display_size (size); - 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); + 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, prior_flags; + //guint status; + gchar *status_str; + + gtk_tree_model_get (tree_model, iter, + TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, + -1); + + prior_flags = flags & TNY_HEADER_FLAG_PRIORITY; + if (prior_flags == TNY_HEADER_FLAG_SUSPENDED_PRIORITY) + status_str = g_strdup(_("mcen_li_outbox_suspended")); + else + 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); } +