+
+ if ((priv->cell_style == MODEST_FOLDER_VIEW_CELL_STYLE_COMPACT) && (number > 0)) {
+ item_name =
+ g_strdup_printf (ngettext ((drafts) ? "mcen_ti_message" : "mcen_va_new_message",
+ (drafts) ? "mcen_ti_messages" : "mcen_va_new_messages",
+ number), number);
+ }
+ }
+
+ if (!item_name)
+ item_name = g_strdup ("");
+
+ if (item_name) {
+ /* Set the name in the treeview cell: */
+ g_object_set (rendobj,"text", item_name, NULL);
+
+ g_free (item_name);
+
+ }
+
+ end:
+ if (instance)
+ g_object_unref (G_OBJECT (instance));
+}
+
+
+typedef struct {
+ GdkPixbuf *pixbuf;
+ GdkPixbuf *pixbuf_open;
+ GdkPixbuf *pixbuf_close;
+} ThreePixbufs;
+
+
+static inline GdkPixbuf *
+get_composite_pixbuf (const gchar *icon_name,
+ const gint size,
+ GdkPixbuf *base_pixbuf)
+{
+ GdkPixbuf *emblem, *retval = NULL;
+
+ emblem = modest_platform_get_icon (icon_name, size);
+ if (emblem) {
+ retval = gdk_pixbuf_copy (base_pixbuf);
+ gdk_pixbuf_composite (emblem, retval, 0, 0,
+ MIN (gdk_pixbuf_get_width (emblem),
+ gdk_pixbuf_get_width (retval)),
+ MIN (gdk_pixbuf_get_height (emblem),
+ gdk_pixbuf_get_height (retval)),
+ 0, 0, 1, 1, GDK_INTERP_NEAREST, 255);
+ g_object_unref (emblem);
+ }
+ return retval;
+}
+
+static inline ThreePixbufs *
+get_composite_icons (const gchar *icon_code,
+ GdkPixbuf **pixbuf,
+ GdkPixbuf **pixbuf_open,
+ GdkPixbuf **pixbuf_close)
+{
+ ThreePixbufs *retval;
+
+ if (pixbuf && !*pixbuf) {
+ GdkPixbuf *icon;
+ icon = modest_platform_get_icon (icon_code, FOLDER_ICON_SIZE);
+ if (icon) {
+ *pixbuf = gdk_pixbuf_copy (icon);
+ } else {
+ *pixbuf = NULL;
+ }
+ }
+
+ if (pixbuf_open && !*pixbuf_open && pixbuf && *pixbuf)
+ *pixbuf_open = get_composite_pixbuf ("qgn_list_gene_fldr_exp",
+ FOLDER_ICON_SIZE,
+ *pixbuf);
+
+ if (pixbuf_close && !*pixbuf_close && pixbuf && *pixbuf)
+ *pixbuf_close = get_composite_pixbuf ("qgn_list_gene_fldr_clp",
+ FOLDER_ICON_SIZE,
+ *pixbuf);
+
+ retval = g_slice_new0 (ThreePixbufs);
+ if (pixbuf && *pixbuf)
+ retval->pixbuf = g_object_ref (*pixbuf);
+ else
+ retval->pixbuf = NULL;
+ if (pixbuf_open && *pixbuf_open)
+ retval->pixbuf_open = g_object_ref (*pixbuf_open);
+ else
+ retval->pixbuf_open = NULL;
+ if (pixbuf_close && *pixbuf_close)
+ retval->pixbuf_close = g_object_ref (*pixbuf_close);
+ else
+ retval->pixbuf_close = NULL;
+
+ return retval;
+}
+
+static inline ThreePixbufs *
+get_account_protocol_pixbufs (ModestFolderView *folder_view,
+ ModestProtocolType protocol_type,
+ GObject *object)
+{
+ ModestProtocol *protocol;
+ const GdkPixbuf *pixbuf = NULL;
+ ModestFolderViewPrivate *priv;
+
+ priv = MODEST_FOLDER_VIEW_GET_PRIVATE (folder_view);
+
+ protocol = modest_protocol_registry_get_protocol_by_type (modest_runtime_get_protocol_registry (),
+ protocol_type);
+
+ if (MODEST_IS_ACCOUNT_PROTOCOL (protocol)) {
+ pixbuf = modest_account_protocol_get_icon (MODEST_ACCOUNT_PROTOCOL (protocol),
+ priv->filter & MODEST_FOLDER_VIEW_FILTER_SHOW_ONLY_MAILBOXES?
+ MODEST_ACCOUNT_PROTOCOL_ICON_MAILBOX:
+ MODEST_ACCOUNT_PROTOCOL_ICON_FOLDER,
+ object, FOLDER_ICON_SIZE);
+ }
+
+ if (pixbuf) {
+ ThreePixbufs *retval;
+ retval = g_slice_new0 (ThreePixbufs);
+ retval->pixbuf = g_object_ref ((GObject *) pixbuf);
+ retval->pixbuf_open = g_object_ref ((GObject *) pixbuf);
+ retval->pixbuf_close = g_object_ref ((GObject *) pixbuf);
+ return retval;
+ } else {
+ return NULL;
+ }
+}
+
+static inline ThreePixbufs*
+get_folder_icons (ModestFolderView *folder_view, TnyFolderType type, GObject *instance)
+{
+ TnyAccount *account = NULL;
+ static GdkPixbuf *inbox_pixbuf = NULL, *outbox_pixbuf = NULL,
+ *junk_pixbuf = NULL, *sent_pixbuf = NULL,
+ *trash_pixbuf = NULL, *draft_pixbuf = NULL,
+ *normal_pixbuf = NULL, *anorm_pixbuf = NULL, *mmc_pixbuf = NULL,
+ *ammc_pixbuf = NULL, *avirt_pixbuf = NULL;
+
+ static GdkPixbuf *inbox_pixbuf_open = NULL, *outbox_pixbuf_open = NULL,
+ *junk_pixbuf_open = NULL, *sent_pixbuf_open = NULL,
+ *trash_pixbuf_open = NULL, *draft_pixbuf_open = NULL,
+ *normal_pixbuf_open = NULL, *anorm_pixbuf_open = NULL, *mmc_pixbuf_open = NULL,
+ *ammc_pixbuf_open = NULL, *avirt_pixbuf_open = NULL;
+
+ static GdkPixbuf *inbox_pixbuf_close = NULL, *outbox_pixbuf_close = NULL,
+ *junk_pixbuf_close = NULL, *sent_pixbuf_close = NULL,
+ *trash_pixbuf_close = NULL, *draft_pixbuf_close = NULL,
+ *normal_pixbuf_close = NULL, *anorm_pixbuf_close = NULL, *mmc_pixbuf_close = NULL,
+ *ammc_pixbuf_close = NULL, *avirt_pixbuf_close = NULL;
+
+ ThreePixbufs *retval = NULL;
+
+ if (TNY_IS_ACCOUNT (instance)) {
+ account = g_object_ref (instance);
+ } else if (TNY_IS_FOLDER (instance) && !TNY_IS_MERGE_FOLDER (instance)) {
+ account = tny_folder_get_account (TNY_FOLDER (instance));
+ }
+
+ if (account) {
+ ModestProtocolType account_store_protocol;
+
+ account_store_protocol = modest_tny_account_get_protocol_type (account);
+ retval = get_account_protocol_pixbufs (folder_view, account_store_protocol, instance);
+ g_object_unref (account);
+ }
+
+ if (retval)
+ return retval;
+
+ /* Sometimes an special folder is reported by the server as
+ NORMAL, like some versions of Dovecot */
+ if (type == TNY_FOLDER_TYPE_NORMAL ||
+ type == TNY_FOLDER_TYPE_UNKNOWN) {
+ type = modest_tny_folder_guess_folder_type (TNY_FOLDER (instance));
+ }
+
+ /* It's not enough with check the folder type. We need to
+ ensure that we're not giving a special folder icon to a
+ normal folder with the same name than a special folder */
+ if (TNY_IS_FOLDER (instance) &&
+ get_cmp_pos (type, TNY_FOLDER (instance)) == 4)
+ type = TNY_FOLDER_TYPE_NORMAL;
+
+ /* Remote folders should not be treated as special folders */
+ if (TNY_IS_FOLDER_STORE (instance) &&
+ !TNY_IS_ACCOUNT (instance) &&
+ type != TNY_FOLDER_TYPE_INBOX &&
+ modest_tny_folder_store_is_remote (TNY_FOLDER_STORE (instance))) {
+ return get_composite_icons (MODEST_FOLDER_ICON_REMOTE_FOLDER,
+ &anorm_pixbuf,
+ &anorm_pixbuf_open,
+ &anorm_pixbuf_close);
+ }
+
+ switch (type) {
+
+ case TNY_FOLDER_TYPE_INVALID:
+ g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__);
+ break;
+
+ case TNY_FOLDER_TYPE_ROOT:
+ if (TNY_IS_ACCOUNT (instance)) {
+
+ if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (instance))) {
+ retval = get_composite_icons (MODEST_FOLDER_ICON_LOCAL_FOLDERS,
+ &avirt_pixbuf,
+ &avirt_pixbuf_open,
+ &avirt_pixbuf_close);
+ } else {
+ const gchar *account_id = tny_account_get_id (TNY_ACCOUNT (instance));
+
+ if (!strcmp (account_id, MODEST_MMC_ACCOUNT_ID)) {
+ retval = get_composite_icons (MODEST_FOLDER_ICON_MMC,
+ &ammc_pixbuf,
+ &ammc_pixbuf_open,
+ &ammc_pixbuf_close);
+ } else {
+ retval = get_composite_icons (MODEST_FOLDER_ICON_ACCOUNT,
+ &anorm_pixbuf,
+ &anorm_pixbuf_open,
+ &anorm_pixbuf_close);
+ }
+ }
+ }
+ break;
+ case TNY_FOLDER_TYPE_INBOX:
+ retval = get_composite_icons (MODEST_FOLDER_ICON_INBOX,
+ &inbox_pixbuf,
+ &inbox_pixbuf_open,
+ &inbox_pixbuf_close);
+ break;
+ case TNY_FOLDER_TYPE_OUTBOX:
+ retval = get_composite_icons (MODEST_FOLDER_ICON_OUTBOX,
+ &outbox_pixbuf,
+ &outbox_pixbuf_open,
+ &outbox_pixbuf_close);
+ break;
+ case TNY_FOLDER_TYPE_JUNK:
+ retval = get_composite_icons (MODEST_FOLDER_ICON_JUNK,
+ &junk_pixbuf,
+ &junk_pixbuf_open,
+ &junk_pixbuf_close);
+ break;
+ case TNY_FOLDER_TYPE_SENT:
+ retval = get_composite_icons (MODEST_FOLDER_ICON_SENT,
+ &sent_pixbuf,
+ &sent_pixbuf_open,
+ &sent_pixbuf_close);
+ break;
+ case TNY_FOLDER_TYPE_TRASH:
+ retval = get_composite_icons (MODEST_FOLDER_ICON_TRASH,
+ &trash_pixbuf,
+ &trash_pixbuf_open,
+ &trash_pixbuf_close);
+ break;
+ case TNY_FOLDER_TYPE_DRAFTS:
+ retval = get_composite_icons (MODEST_FOLDER_ICON_DRAFTS,
+ &draft_pixbuf,
+ &draft_pixbuf_open,
+ &draft_pixbuf_close);
+ break;
+ case TNY_FOLDER_TYPE_ARCHIVE:
+ retval = get_composite_icons (MODEST_FOLDER_ICON_MMC_FOLDER,
+ &mmc_pixbuf,
+ &mmc_pixbuf_open,
+ &mmc_pixbuf_close);
+ break;
+ case TNY_FOLDER_TYPE_NORMAL:
+ default:
+ /* Memory card folders could have an special icon */
+ if (modest_tny_folder_is_memory_card_folder (TNY_FOLDER (instance))) {
+ retval = get_composite_icons (MODEST_FOLDER_ICON_MMC_FOLDER,
+ &mmc_pixbuf,
+ &mmc_pixbuf_open,
+ &mmc_pixbuf_close);
+ } else {
+ retval = get_composite_icons (MODEST_FOLDER_ICON_NORMAL,
+ &normal_pixbuf,
+ &normal_pixbuf_open,
+ &normal_pixbuf_close);