X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-header-view-render.c;h=1625a94d38e8d6b4ff9d4d80663cde0538d77065;hp=3a0ad9698b1f344482aca72e36518a13020ac2da;hb=51ee3dbf9a9338a7683fb2efe9daeefb316849bd;hpb=8877001a218f1dfd23a5ea9a98532144a4fffe93 diff --git a/src/widgets/modest-header-view-render.c b/src/widgets/modest-header-view-render.c index 3a0ad96..1625a94 100644 --- a/src/widgets/modest-header-view-render.c +++ b/src/widgets/modest-header-view-render.c @@ -27,33 +27,111 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include #include #include +#include +#include +#include +#include #include #include #include +#include -static gchar * -_pango_parse_string (const gchar *string) { - gchar **tmp = NULL; - gchar *parsed_string = NULL; - gchar *tmp_string = NULL; - guint i = 0; +static void +fill_list_of_caches (gpointer key, gpointer value, gpointer userdata) +{ + GSList **send_queues = (GSList **) userdata; + *send_queues = g_slist_prepend (*send_queues, value); +} - tmp = g_strsplit(string, "&", 0); - parsed_string = g_strdup(tmp[i]); - for (i = 1; tmp[i] != NULL; i++) { - tmp_string = g_strconcat (parsed_string, "&", tmp[i], NULL); - g_free(parsed_string); - parsed_string = g_strdup(tmp_string); - } +static ModestTnySendQueueStatus +get_status_of_uid (TnyHeader *header) +{ + ModestCacheMgr *cache_mgr = NULL; + GHashTable *send_queue_cache = NULL; + ModestTnyAccountStore *accounts_store = NULL; + TnyList *accounts = NULL; + TnyIterator *iter = NULL; + TnyTransportAccount *account = NULL; + GSList *send_queues = NULL, *node; + /* get_msg_status returns suspended by default, so we want to detect changes */ + ModestTnySendQueueStatus status = MODEST_TNY_SEND_QUEUE_UNKNONW; + ModestTnySendQueueStatus queue_status = MODEST_TNY_SEND_QUEUE_UNKNONW; + gchar *msg_uid = NULL; + ModestTnySendQueue *send_queue = 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); + if (send_queues == NULL) { + accounts = tny_simple_list_new (); + accounts_store = modest_runtime_get_account_store (); + tny_account_store_get_accounts (TNY_ACCOUNT_STORE(accounts_store), + accounts, + TNY_ACCOUNT_STORE_TRANSPORT_ACCOUNTS); + + iter = tny_list_create_iterator (accounts); + while (!tny_iterator_is_done (iter)) { + account = TNY_TRANSPORT_ACCOUNT(tny_iterator_get_current (iter)); + send_queue = modest_runtime_get_send_queue(TNY_TRANSPORT_ACCOUNT(account)); + g_object_unref(account); + + 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; + } + tny_iterator_next (iter); + } + g_object_unref (iter); + g_object_unref (accounts); + } + else { + for (node = send_queues; node != NULL; node = g_slist_next (node)) { + 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; + } + } + } - return parsed_string; + 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) @@ -63,6 +141,8 @@ 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: @@ -77,53 +157,19 @@ get_pixbuf_for_flag (TnyHeaderFlags flag) 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) { + case TNY_HEADER_FLAG_HIGH_PRIORITY: if (G_UNLIKELY(!high_pixbuf)) - high_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_HIGH_PRIORITY); + high_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_HIGH); return high_pixbuf; - } - else if (flags & TNY_HEADER_FLAG_LOW_PRIORITY) { + case TNY_HEADER_FLAG_LOW_PRIORITY: if (G_UNLIKELY(!low_pixbuf)) - low_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_LOW_PRIORITY); + low_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_LOW); return low_pixbuf; + default: + if (G_UNLIKELY(!unread_pixbuf)) + unread_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_UNREAD); + return unread_pixbuf; } - - - return NULL; } static void @@ -172,41 +218,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; - - gtk_tree_model_get (tree_model, iter, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, - &flags, -1); - - if (flags & TNY_HEADER_FLAG_ATTACHMENTS) { - if (flags & TNY_HEADER_FLAG_HIGH_PRIORITY) - g_object_set (G_OBJECT (renderer), "pixbuf", - get_pixbuf_for_compact_flag (flags), - NULL); - else if (flags & TNY_HEADER_FLAG_LOW_PRIORITY) - g_object_set (G_OBJECT (renderer), "pixbuf", - get_pixbuf_for_compact_flag (flags), - NULL); - else - g_object_set (G_OBJECT (renderer), "pixbuf", - get_pixbuf_for_compact_flag (flags), - NULL); - } - else { - if (flags & TNY_HEADER_FLAG_HIGH_PRIORITY) - g_object_set (G_OBJECT (renderer), "pixbuf", - get_pixbuf_for_compact_flag (flags), - NULL); - else if (flags & TNY_HEADER_FLAG_LOW_PRIORITY) - g_object_set (G_OBJECT (renderer), "pixbuf", - get_pixbuf_for_compact_flag (flags), - NULL); - } -} - -void _modest_header_view_header_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data) { @@ -225,7 +236,7 @@ _modest_header_view_date_cell_data (GtkTreeViewColumn *column, GtkCellRenderer { TnyHeaderFlags flags; guint date, date_col; - gchar *display_date = NULL, *tmp_date = NULL; + gchar *display_date = NULL; gboolean received = GPOINTER_TO_INT(user_data); if (received) @@ -237,20 +248,20 @@ _modest_header_view_date_cell_data (GtkTreeViewColumn *column, GtkCellRenderer 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); + + 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 (tmp_date); g_free (display_date); } - 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; @@ -266,11 +277,13 @@ _modest_header_view_sender_receiver_cell_data (GtkTreeViewColumn *column, GtkC TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, -1); + modest_text_utils_get_display_address (address); /* string is changed in-place */ g_object_set (G_OBJECT(renderer), "text", - modest_text_utils_get_display_address (address), + address, NULL); g_free (address); + set_common_flags (renderer, flags); } /* @@ -282,17 +295,38 @@ 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; - time_t date; - gboolean is_incoming; + 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)); + + /* Note that GtkTreeModel is a GtkTreeModelFilter. */ + + /* printf ("DEBUG: %s: tree_model gtype=%s\n", __FUNCTION__, G_OBJECT_TYPE_NAME (tree_model)); */ + + TnyHeaderFlags flags = 0; + TnyHeaderFlags prior_flags = 0; + gchar *address = NULL; + gchar *subject = NULL; + gchar *header = NULL; + time_t date = 0; + + GtkCellRenderer *recipient_cell, *date_or_status_cell, *subject_cell, + *attach_cell, *priority_cell, + *recipient_box, *subject_box = NULL; + 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...*/ + ModestHeaderViewCompactHeaderMode 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, @@ -304,28 +338,96 @@ _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, - -1); - - rendobj = G_OBJECT(renderer); - - /* 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); - - header = g_strdup_printf ("%s\n%s", - parsed_subject, - parsed_address); - g_free (address); + 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 */ + 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); + + + if (subject && strlen (subject)) { + gchar* escaped_subject = g_markup_escape_text (subject, -1); + g_object_set (G_OBJECT (subject_cell), "markup", + escaped_subject, NULL); + g_free (escaped_subject); + } else { + g_object_set (G_OBJECT (subject_cell), "markup", + _("mail_va_no_subject"), NULL); + } + g_free (subject); - g_free(parsed_subject); - g_free(parsed_address); + set_common_flags (subject_cell, flags); - g_object_set (rendobj, "markup", header, NULL); - set_common_flags (renderer, flags); - + /* FIXME: we hardcode the color to #666666; instead we should use SecondaryTextColour from the + * theme (gtkrc file) */ + modest_text_utils_get_display_address (address); /* changed in-place */ + header = g_markup_printf_escaped ("%s", + address); + g_free (address); + g_object_set (G_OBJECT (recipient_cell), + "markup", header, + NULL); g_free (header); + header = NULL; + set_common_flags (recipient_cell, flags); + + if (header_mode == MODEST_HEADER_VIEW_COMPACT_HEADER_MODE_OUTBOX) { + ModestTnySendQueueStatus status = MODEST_TNY_SEND_QUEUE_UNKNONW; + 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); + } + } + + 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); + display_date = NULL; + } 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); + tmp_date = NULL; + g_free (display_date); + display_date = NULL; + } + + if (msg_header != NULL) + g_object_unref (msg_header); + + set_common_flags (date_or_status_cell, flags); } @@ -353,21 +455,23 @@ _modest_header_view_size_cell_data (GtkTreeViewColumn *column, GtkCellRenderer 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; + TnyHeaderFlags flags, prior_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, + TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, -1); -/* size_str = modest_text_utils_get_display_size (size); */ - status_str = g_strdup(_("Wating ...")); - + 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);