* Partially fixes NB#85461, do not unload the folder before synchronizing it
[modest] / src / widgets / modest-folder-view.c
index e189605..da8e834 100644 (file)
@@ -497,14 +497,62 @@ typedef struct {
 } 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 = gdk_pixbuf_copy (modest_platform_get_icon (icon_code, MODEST_ICON_SIZE_SMALL));
+       
+       if (!*pixbuf_open)
+               *pixbuf_open = get_composite_pixbuf ("qgn_list_gene_fldr_exp",
+                                                    MODEST_ICON_SIZE_SMALL,
+                                                    *pixbuf);
+       
+       if (!*pixbuf_close)
+               *pixbuf_close = get_composite_pixbuf ("qgn_list_gene_fldr_clp",
+                                                     MODEST_ICON_SIZE_SMALL,
+                                                     *pixbuf);
+
+       retval = g_slice_new0 (ThreePixbufs);
+       if (*pixbuf)
+               retval->pixbuf = g_object_ref (*pixbuf);
+       if (*pixbuf_open)
+               retval->pixbuf_open = g_object_ref (*pixbuf_open);
+       if (*pixbuf_close)
+               retval->pixbuf_close = g_object_ref (*pixbuf_close);
+
+       return retval;
+}
+
 static ThreePixbufs*
 get_folder_icons (TnyFolderType type, GObject *instance)
 {
-       GdkPixbuf *pixbuf = NULL;
-       GdkPixbuf *pixbuf_open = NULL;
-       GdkPixbuf *pixbuf_close = NULL;
-       ThreePixbufs *retval = g_slice_new (ThreePixbufs);
-
        static GdkPixbuf *inbox_pixbuf = NULL, *outbox_pixbuf = NULL,
                *junk_pixbuf = NULL, *sent_pixbuf = NULL,
                *trash_pixbuf = NULL, *draft_pixbuf = NULL,
@@ -523,6 +571,7 @@ get_folder_icons (TnyFolderType type, GObject *instance)
                *normal_pixbuf_close = NULL, *anorm_pixbuf_close = NULL, 
                *ammc_pixbuf_close = NULL, *avirt_pixbuf_close = NULL;
 
+       ThreePixbufs *retval = NULL;
 
        /* MERGE is not needed anymore as the folder now has the correct type jschmid */
        /* We include the MERGE type here because it's used to create
@@ -540,402 +589,85 @@ get_folder_icons (TnyFolderType type, GObject *instance)
        case TNY_FOLDER_TYPE_ROOT:
                if (TNY_IS_ACCOUNT (instance)) {
                        
-                       if (modest_tny_account_is_virtual_local_folders (
-                               TNY_ACCOUNT (instance))) {
-
-                           if (!avirt_pixbuf)
-                                   avirt_pixbuf = gdk_pixbuf_copy (modest_platform_get_icon (MODEST_FOLDER_ICON_LOCAL_FOLDERS,
-                                                                                             MODEST_ICON_SIZE_SMALL));
-                           
-                           if (!avirt_pixbuf_open) {
-                                   GdkPixbuf *emblem = modest_platform_get_icon ("qgn_list_gene_fldr_exp",
-                                                                                 MODEST_ICON_SIZE_SMALL);
-                                   avirt_pixbuf_open = gdk_pixbuf_copy (avirt_pixbuf);
-                                   gdk_pixbuf_composite (emblem, avirt_pixbuf_open, 0, 0, 
-                                                         MIN (gdk_pixbuf_get_width (emblem), 
-                                                              gdk_pixbuf_get_width (avirt_pixbuf_open)),
-                                                         MIN (gdk_pixbuf_get_height (emblem), 
-                                                              gdk_pixbuf_get_height (avirt_pixbuf_open)),
-                                                         0, 0, 1, 1, GDK_INTERP_NEAREST, 255);
-                                   g_object_unref (emblem);
-                           }
-
-                           if (!avirt_pixbuf_close) {
-                                   GdkPixbuf *emblem = modest_platform_get_icon ("qgn_list_gene_fldr_clp",
-                                                                                 MODEST_ICON_SIZE_SMALL);
-                               avirt_pixbuf_close = gdk_pixbuf_copy (avirt_pixbuf);
-                               gdk_pixbuf_composite (emblem, avirt_pixbuf_close, 0, 0, 
-                                                     MIN (gdk_pixbuf_get_width (emblem), 
-                                                          gdk_pixbuf_get_width (avirt_pixbuf_close)),
-                                                     MIN (gdk_pixbuf_get_height (emblem), 
-                                                          gdk_pixbuf_get_height (avirt_pixbuf_close)),
-                                                     0, 0, 1, 1, GDK_INTERP_NEAREST, 255);
-                               g_object_unref (emblem);
-                           }
-
-
-                           pixbuf = g_object_ref (avirt_pixbuf);
-                           pixbuf_open = g_object_ref (avirt_pixbuf_open);
-                           pixbuf_close = g_object_ref (avirt_pixbuf_close);
-
-                       }
-                       else {
+                       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)) {                                 
-                                   if (!ammc_pixbuf)
-                                           ammc_pixbuf = gdk_pixbuf_copy (modest_platform_get_icon (MODEST_FOLDER_ICON_MMC,
-                                                                                                    MODEST_ICON_SIZE_SMALL));
-                                   
-                                   if (!ammc_pixbuf_open) {
-                                           GdkPixbuf *emblem = modest_platform_get_icon ("qgn_list_gene_fldr_exp",
-                                                                                         MODEST_ICON_SIZE_SMALL);
-                                       ammc_pixbuf_open = gdk_pixbuf_copy (ammc_pixbuf);
-                                       gdk_pixbuf_composite (emblem, ammc_pixbuf_open, 0, 0, 
-                                                             MIN (gdk_pixbuf_get_width (emblem), 
-                                                                  gdk_pixbuf_get_width (ammc_pixbuf_open)),
-                                                             MIN (gdk_pixbuf_get_height (emblem), 
-                                                                  gdk_pixbuf_get_height (ammc_pixbuf_open)),
-                                                             0, 0, 1, 1, GDK_INTERP_NEAREST, 255);
-                                       g_object_unref (emblem);
-                                   }
-
-                                   if (!ammc_pixbuf_close) {
-                                           GdkPixbuf *emblem = modest_platform_get_icon ("qgn_list_gene_fldr_clp",
-                                                                                         MODEST_ICON_SIZE_SMALL);
-                                       ammc_pixbuf_close = gdk_pixbuf_copy (ammc_pixbuf);
-                                       gdk_pixbuf_composite (emblem, ammc_pixbuf_close, 0, 0, 
-                                                             MIN (gdk_pixbuf_get_width (emblem), 
-                                                                  gdk_pixbuf_get_width (ammc_pixbuf_close)),
-                                                             MIN (gdk_pixbuf_get_height (emblem), 
-                                                                  gdk_pixbuf_get_height (ammc_pixbuf_close)),
-                                                             0, 0, 1, 1, GDK_INTERP_NEAREST, 255);
-                                       g_object_unref (emblem);
-                                   }
-
-
-                                   pixbuf = g_object_ref (ammc_pixbuf);
-                                   pixbuf_open = g_object_ref (ammc_pixbuf_open);
-                                   pixbuf_close = g_object_ref (ammc_pixbuf_close);
-
+                               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 {
-
-                                   if (!anorm_pixbuf)
-                                           anorm_pixbuf = gdk_pixbuf_copy (modest_platform_get_icon (MODEST_FOLDER_ICON_ACCOUNT,
-                                                                                                     MODEST_ICON_SIZE_SMALL));
-                                   if (!anorm_pixbuf_open) {
-                                           GdkPixbuf *emblem = modest_platform_get_icon ("qgn_list_gene_fldr_exp",
-                                                                                         MODEST_ICON_SIZE_SMALL);
-                                       anorm_pixbuf_open = gdk_pixbuf_copy (anorm_pixbuf);
-                                       gdk_pixbuf_composite (emblem, anorm_pixbuf_open, 0, 0, 
-                                                             MIN (gdk_pixbuf_get_width (emblem), 
-                                                                  gdk_pixbuf_get_width (anorm_pixbuf_open)),
-                                                             MIN (gdk_pixbuf_get_height (emblem), 
-                                                                  gdk_pixbuf_get_height (anorm_pixbuf_open)),
-                                                             0, 0, 1, 1, GDK_INTERP_NEAREST, 255);
-                                       g_object_unref (emblem);
-                                   }
-
-                                   if (!anorm_pixbuf_close) {
-                                           GdkPixbuf *emblem = modest_platform_get_icon ("qgn_list_gene_fldr_clp",
-                                                                                         MODEST_ICON_SIZE_SMALL);
-                                       anorm_pixbuf_close = gdk_pixbuf_copy (anorm_pixbuf);
-                                       gdk_pixbuf_composite (emblem, anorm_pixbuf_close, 0, 0, 
-                                                             MIN (gdk_pixbuf_get_width (emblem), 
-                                                                  gdk_pixbuf_get_width (anorm_pixbuf_close)),
-                                                             MIN (gdk_pixbuf_get_height (emblem), 
-                                                                  gdk_pixbuf_get_height (anorm_pixbuf_close)),
-                                                             0, 0, 1, 1, GDK_INTERP_NEAREST, 255);
-                                       g_object_unref (emblem);
-                                   }
-
-
-                                   pixbuf = g_object_ref (anorm_pixbuf);
-                                   pixbuf_open = g_object_ref (anorm_pixbuf_open);
-                                   pixbuf_close = g_object_ref (anorm_pixbuf_close);                             
-
+                                       retval = get_composite_icons (MODEST_FOLDER_ICON_ACCOUNT,
+                                                                     &anorm_pixbuf,
+                                                                     &anorm_pixbuf_open,
+                                                                     &anorm_pixbuf_close);
                                }
                        }
                }
                break;
        case TNY_FOLDER_TYPE_INBOX:
-
-           if (!inbox_pixbuf)
-                   inbox_pixbuf = gdk_pixbuf_copy (modest_platform_get_icon (MODEST_FOLDER_ICON_INBOX,
-                                                                             MODEST_ICON_SIZE_SMALL));
-
-           if (!inbox_pixbuf_open) {
-                   GdkPixbuf *emblem = modest_platform_get_icon ("qgn_list_gene_fldr_exp",
-                                                                 MODEST_ICON_SIZE_SMALL);
-                   inbox_pixbuf_open = gdk_pixbuf_copy (inbox_pixbuf);
-                   gdk_pixbuf_composite (emblem, inbox_pixbuf_open, 0, 0, 
-                                         MIN (gdk_pixbuf_get_width (emblem), 
-                                              gdk_pixbuf_get_width (inbox_pixbuf_open)),
-                                         MIN (gdk_pixbuf_get_height (emblem), 
-                                              gdk_pixbuf_get_height (inbox_pixbuf_open)),
-                                         0, 0, 1, 1, GDK_INTERP_NEAREST, 255);
-                   g_object_unref (emblem);
-           }
-           
-           if (!inbox_pixbuf_close) {
-                   GdkPixbuf *emblem = modest_platform_get_icon ("qgn_list_gene_fldr_clp",
-                                                                 MODEST_ICON_SIZE_SMALL);
-                   inbox_pixbuf_close = gdk_pixbuf_copy (inbox_pixbuf);
-                   gdk_pixbuf_composite (emblem, inbox_pixbuf_close, 0, 0, 
-                                         MIN (gdk_pixbuf_get_width (emblem), 
-                                              gdk_pixbuf_get_width (inbox_pixbuf_close)),
-                                         MIN (gdk_pixbuf_get_height (emblem), 
-                                              gdk_pixbuf_get_height (inbox_pixbuf_close)),
-                                         0, 0, 1, 1, GDK_INTERP_NEAREST, 255);
-                   g_object_unref (emblem);
-           }
-           
-
-           pixbuf = g_object_ref (inbox_pixbuf);
-           pixbuf_open = g_object_ref (inbox_pixbuf_open);
-           pixbuf_close = g_object_ref (inbox_pixbuf_close);
-           
-           break;
+               retval = get_composite_icons (MODEST_FOLDER_ICON_INBOX,
+                                             &inbox_pixbuf,
+                                             &inbox_pixbuf_open,
+                                             &inbox_pixbuf_close);
+               break;
        case TNY_FOLDER_TYPE_OUTBOX:
-               if (!outbox_pixbuf)
-                       outbox_pixbuf = gdk_pixbuf_copy (modest_platform_get_icon (MODEST_FOLDER_ICON_OUTBOX,
-                                                                                  MODEST_ICON_SIZE_SMALL));
-
-               if (!outbox_pixbuf_open) {
-                       GdkPixbuf *emblem = modest_platform_get_icon ("qgn_list_gene_fldr_exp",
-                                                                     MODEST_ICON_SIZE_SMALL);
-                       outbox_pixbuf_open = gdk_pixbuf_copy (outbox_pixbuf);
-                       gdk_pixbuf_composite (emblem, outbox_pixbuf_open, 0, 0, 
-                                             MIN (gdk_pixbuf_get_width (emblem), 
-                                                  gdk_pixbuf_get_width (outbox_pixbuf_open)),
-                                             MIN (gdk_pixbuf_get_height (emblem), 
-                                                  gdk_pixbuf_get_height (outbox_pixbuf_open)),
-                                             0, 0, 1, 1, GDK_INTERP_NEAREST, 255);
-                       g_object_unref (emblem);
-           }
-
-           if (!outbox_pixbuf_close) {
-                   GdkPixbuf *emblem = modest_platform_get_icon ("qgn_list_gene_fldr_clp",
-                                                                 MODEST_ICON_SIZE_SMALL);
-               outbox_pixbuf_close = gdk_pixbuf_copy (outbox_pixbuf);
-               gdk_pixbuf_composite (emblem, outbox_pixbuf_close, 0, 0, 
-                                     MIN (gdk_pixbuf_get_width (emblem), 
-                                          gdk_pixbuf_get_width (outbox_pixbuf_close)),
-                                     MIN (gdk_pixbuf_get_height (emblem), 
-                                          gdk_pixbuf_get_height (outbox_pixbuf_close)),
-                                     0, 0, 1, 1, GDK_INTERP_NEAREST, 255);
-               g_object_unref (emblem);
-           }
-
-
-           pixbuf = g_object_ref (outbox_pixbuf);
-           pixbuf_open = g_object_ref (outbox_pixbuf_open);
-           pixbuf_close = g_object_ref (outbox_pixbuf_close);
-
-           break;
+               retval = get_composite_icons (MODEST_FOLDER_ICON_OUTBOX,
+                                             &outbox_pixbuf,
+                                             &outbox_pixbuf_open,
+                                             &outbox_pixbuf_close);
+               break;
        case TNY_FOLDER_TYPE_JUNK:
-           if (!junk_pixbuf)
-                   junk_pixbuf = gdk_pixbuf_copy (modest_platform_get_icon (MODEST_FOLDER_ICON_JUNK,
-                                                                            MODEST_ICON_SIZE_SMALL));
-           if (!junk_pixbuf_open) {
-                   GdkPixbuf *emblem = modest_platform_get_icon ("qgn_list_gene_fldr_exp",
-                                                                 MODEST_ICON_SIZE_SMALL);
-                   junk_pixbuf_open = gdk_pixbuf_copy (junk_pixbuf);
-                   gdk_pixbuf_composite (emblem, junk_pixbuf_open, 0, 0, 
-                                         MIN (gdk_pixbuf_get_width (emblem), 
-                                              gdk_pixbuf_get_width (junk_pixbuf_open)),
-                                         MIN (gdk_pixbuf_get_height (emblem), 
-                                              gdk_pixbuf_get_height (junk_pixbuf_open)),
-                                         0, 0, 1, 1, GDK_INTERP_NEAREST, 255);
-                   g_object_unref (emblem);
-           }
-           
-           if (!junk_pixbuf_close) {
-                   GdkPixbuf *emblem = modest_platform_get_icon ("qgn_list_gene_fldr_clp",
-                                                                 MODEST_ICON_SIZE_SMALL);
-                   junk_pixbuf_close = gdk_pixbuf_copy (junk_pixbuf);
-                   gdk_pixbuf_composite (emblem, junk_pixbuf_close, 0, 0, 
-                                         MIN (gdk_pixbuf_get_width (emblem), 
-                                              gdk_pixbuf_get_width (junk_pixbuf_close)),
-                                         MIN (gdk_pixbuf_get_height (emblem), 
-                                              gdk_pixbuf_get_height (junk_pixbuf_close)),
-                                         0, 0, 1, 1, GDK_INTERP_NEAREST, 255);
-                   g_object_unref (emblem);
-           }
-           
-           
-           pixbuf = g_object_ref (junk_pixbuf);
-           pixbuf_open = g_object_ref (junk_pixbuf_open);
-           pixbuf_close = g_object_ref (junk_pixbuf_close);
-           
-           break;
-
+               retval = get_composite_icons (MODEST_FOLDER_ICON_JUNK,
+                                             &junk_pixbuf,
+                                             &junk_pixbuf_open,
+                                             &junk_pixbuf_close);          
+               break;
        case TNY_FOLDER_TYPE_SENT:
-               if (!sent_pixbuf)
-                       sent_pixbuf = gdk_pixbuf_copy (modest_platform_get_icon (MODEST_FOLDER_ICON_SENT,
-                                                                                MODEST_ICON_SIZE_SMALL));
-               
-               if (!sent_pixbuf_open) {
-                       GdkPixbuf *emblem = modest_platform_get_icon ("qgn_list_gene_fldr_exp",
-                                                                     MODEST_ICON_SIZE_SMALL);
-                       sent_pixbuf_open = gdk_pixbuf_copy (sent_pixbuf);
-                       gdk_pixbuf_composite (emblem, sent_pixbuf_open, 0, 0, 
-                                             MIN (gdk_pixbuf_get_width (emblem), 
-                                                  gdk_pixbuf_get_width (sent_pixbuf_open)),
-                                             MIN (gdk_pixbuf_get_height (emblem), 
-                                                  gdk_pixbuf_get_height (sent_pixbuf_open)),
-                                             0, 0, 1, 1, GDK_INTERP_NEAREST, 255);
-                       g_object_unref (emblem);
-               }
-               
-               if (!sent_pixbuf_close) {
-                       GdkPixbuf *emblem = modest_platform_get_icon ("qgn_list_gene_fldr_clp",
-                                                                     MODEST_ICON_SIZE_SMALL);
-                       sent_pixbuf_close = gdk_pixbuf_copy (sent_pixbuf);
-                       gdk_pixbuf_composite (emblem, sent_pixbuf_close, 0, 0, 
-                                             MIN (gdk_pixbuf_get_width (emblem), 
-                                                  gdk_pixbuf_get_width (sent_pixbuf_close)),
-                                             MIN (gdk_pixbuf_get_height (emblem), 
-                                                  gdk_pixbuf_get_height (sent_pixbuf_close)),
-                                             0, 0, 1, 1, GDK_INTERP_NEAREST, 255);
-                       g_object_unref (emblem);
-               }
-               
-
-           pixbuf = g_object_ref (sent_pixbuf);
-           pixbuf_open = g_object_ref (sent_pixbuf_open);
-           pixbuf_close = g_object_ref (sent_pixbuf_close);
-           
-           break;
-
+               retval = get_composite_icons (MODEST_FOLDER_ICON_SENT,
+                                             &sent_pixbuf,
+                                             &sent_pixbuf_open,
+                                             &sent_pixbuf_close);          
+               break;
        case TNY_FOLDER_TYPE_TRASH:
-           if (!trash_pixbuf)
-                   trash_pixbuf = gdk_pixbuf_copy (modest_platform_get_icon (MODEST_FOLDER_ICON_TRASH,
-                                                                             MODEST_ICON_SIZE_SMALL));
-           if (!trash_pixbuf_open) {
-                   GdkPixbuf *emblem = modest_platform_get_icon ("qgn_list_gene_fldr_exp",
-                                                                 MODEST_ICON_SIZE_SMALL);
-                   trash_pixbuf_open = gdk_pixbuf_copy (trash_pixbuf);
-                   gdk_pixbuf_composite (emblem, trash_pixbuf_open, 0, 0, 
-                                         MIN (gdk_pixbuf_get_width (emblem), 
-                                              gdk_pixbuf_get_width (trash_pixbuf_open)),
-                                         MIN (gdk_pixbuf_get_height (emblem), 
-                                              gdk_pixbuf_get_height (trash_pixbuf_open)),
-                                         0, 0, 1, 1, GDK_INTERP_NEAREST, 255);
-                   g_object_unref (emblem);
-           }
-           
-           if (!trash_pixbuf_close) {
-                   GdkPixbuf *emblem = modest_platform_get_icon ("qgn_list_gene_fldr_clp",
-                                                                 MODEST_ICON_SIZE_SMALL);
-                   trash_pixbuf_close = gdk_pixbuf_copy (trash_pixbuf);
-                   gdk_pixbuf_composite (emblem, trash_pixbuf_close, 0, 0, 
-                                         MIN (gdk_pixbuf_get_width (emblem), 
-                                              gdk_pixbuf_get_width (trash_pixbuf_close)),
-                                         MIN (gdk_pixbuf_get_height (emblem), 
-                                              gdk_pixbuf_get_height (trash_pixbuf_close)),
-                                         0, 0, 1, 1, GDK_INTERP_NEAREST, 255);
-                   g_object_unref (emblem);
-           }
-           
-           
-           pixbuf = g_object_ref (trash_pixbuf);
-           pixbuf_open = g_object_ref (trash_pixbuf_open);
-           pixbuf_close = g_object_ref (trash_pixbuf_close);
-
-           break;
+               retval = get_composite_icons (MODEST_FOLDER_ICON_TRASH,
+                                             &trash_pixbuf,
+                                             &trash_pixbuf_open,
+                                             &trash_pixbuf_close);         
+               break;
        case TNY_FOLDER_TYPE_DRAFTS:
-          if (!draft_pixbuf)
-                  draft_pixbuf = gdk_pixbuf_copy (modest_platform_get_icon (MODEST_FOLDER_ICON_DRAFTS,
-                                                                            MODEST_ICON_SIZE_SMALL));
-          
-           if (!draft_pixbuf_open) {
-                   GdkPixbuf *emblem = modest_platform_get_icon ("qgn_list_gene_fldr_exp",
-                                                                 MODEST_ICON_SIZE_SMALL);
-               draft_pixbuf_open = gdk_pixbuf_copy (draft_pixbuf);
-               gdk_pixbuf_composite (emblem, draft_pixbuf_open, 0, 0, 
-                                     MIN (gdk_pixbuf_get_width (emblem), 
-                                          gdk_pixbuf_get_width (draft_pixbuf_open)),
-                                     MIN (gdk_pixbuf_get_height (emblem), 
-                                          gdk_pixbuf_get_height (draft_pixbuf_open)),
-                                     0, 0, 1, 1, GDK_INTERP_NEAREST, 255);
-               g_object_unref (emblem);
-           }
-
-           if (!draft_pixbuf_close) {
-                   GdkPixbuf *emblem = modest_platform_get_icon ("qgn_list_gene_fldr_clp",
-                                                                 MODEST_ICON_SIZE_SMALL);
-               draft_pixbuf_close = gdk_pixbuf_copy (draft_pixbuf);
-               gdk_pixbuf_composite (emblem, draft_pixbuf_close, 0, 0, 
-                                     MIN (gdk_pixbuf_get_width (emblem), 
-                                          gdk_pixbuf_get_width (draft_pixbuf_close)),
-                                     MIN (gdk_pixbuf_get_height (emblem), 
-                                          gdk_pixbuf_get_height (draft_pixbuf_close)),
-                                     0, 0, 1, 1, GDK_INTERP_NEAREST, 255);
-               g_object_unref (emblem);
-           }
-
-
-           pixbuf = g_object_ref (draft_pixbuf);
-           pixbuf_open = g_object_ref (draft_pixbuf_open);
-           pixbuf_close = g_object_ref (draft_pixbuf_close);
-
-           break;      
+               retval = get_composite_icons (MODEST_FOLDER_ICON_DRAFTS,
+                                             &draft_pixbuf,
+                                             &draft_pixbuf_open,
+                                             &draft_pixbuf_close);         
+               break;  
        case TNY_FOLDER_TYPE_NORMAL:
        default:
-               if (!normal_pixbuf)
-                       normal_pixbuf = gdk_pixbuf_copy (modest_platform_get_icon (MODEST_FOLDER_ICON_NORMAL,
-                                                                                  MODEST_ICON_SIZE_SMALL));
-               
-               if (!normal_pixbuf_open) {
-                       GdkPixbuf *emblem = modest_platform_get_icon ("qgn_list_gene_fldr_exp",
-                                                                     MODEST_ICON_SIZE_SMALL);
-                       normal_pixbuf_open = gdk_pixbuf_copy (normal_pixbuf);
-                       gdk_pixbuf_composite (emblem, normal_pixbuf_open, 0, 0, 
-                                             MIN (gdk_pixbuf_get_width (emblem), 
-                                                  gdk_pixbuf_get_width (normal_pixbuf_open)),
-                                             MIN (gdk_pixbuf_get_height (emblem), 
-                                                  gdk_pixbuf_get_height (normal_pixbuf_open)),
-                                             0, 0, 1, 1, GDK_INTERP_NEAREST, 255);
-                       g_object_unref (emblem);
-               }
-               
-               if (!normal_pixbuf_close) {
-                       GdkPixbuf *emblem = modest_platform_get_icon ("qgn_list_gene_fldr_clp",
-                                                                     MODEST_ICON_SIZE_SMALL);
-                       normal_pixbuf_close = gdk_pixbuf_copy (normal_pixbuf);
-                       gdk_pixbuf_composite (emblem, normal_pixbuf_close, 0, 0, 
-                                             MIN (gdk_pixbuf_get_width (emblem), 
-                                                  gdk_pixbuf_get_width (normal_pixbuf_close)),
-                                             MIN (gdk_pixbuf_get_height (emblem), 
-                                                  gdk_pixbuf_get_height (normal_pixbuf_close)),
-                                             0, 0, 1, 1, GDK_INTERP_NEAREST, 255);
-                       g_object_unref (emblem);
-               }
-               
-               
-           pixbuf = g_object_ref (normal_pixbuf);
-           pixbuf_open = g_object_ref (normal_pixbuf_open);
-           pixbuf_close = g_object_ref (normal_pixbuf_close);
-
-           break;      
-
+               retval = get_composite_icons (MODEST_FOLDER_ICON_NORMAL,
+                                             &normal_pixbuf,
+                                             &normal_pixbuf_open,
+                                             &normal_pixbuf_close);
+               break;  
        }
 
-       retval->pixbuf = pixbuf;
-       retval->pixbuf_open = pixbuf_open;
-       retval->pixbuf_close = pixbuf_close;
-
        return retval;
 }
 
-
 static void
 free_pixbufs (ThreePixbufs *pixbufs)
 {
-       g_object_unref (pixbufs->pixbuf);
-       g_object_unref (pixbufs->pixbuf_open);
-       g_object_unref (pixbufs->pixbuf_close);
+       if (pixbufs->pixbuf)
+               g_object_unref (pixbufs->pixbuf);
+       if (pixbufs->pixbuf_open)
+               g_object_unref (pixbufs->pixbuf_open);
+       if (pixbufs->pixbuf_close)
+               g_object_unref (pixbufs->pixbuf_close);
        g_slice_free (ThreePixbufs, pixbufs);
 }
 
@@ -1111,7 +843,6 @@ modest_folder_view_finalize (GObject *obj)
                priv->query = NULL;
        }
 
-/*     modest_folder_view_disable_next_folder_selection (MODEST_FOLDER_VIEW(obj)); */
        if (priv->folder_to_select) {
                g_object_unref (G_OBJECT(priv->folder_to_select));
                priv->folder_to_select = NULL;
@@ -1131,16 +862,6 @@ modest_folder_view_finalize (GObject *obj)
        }
 
        if (priv->cur_folder_store) {
-               if (TNY_IS_FOLDER(priv->cur_folder_store)) {
-                       ModestMailOperation *mail_op;
-
-                       mail_op = modest_mail_operation_new (NULL);
-                       modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
-                                                        mail_op);
-                       modest_mail_operation_sync_folder (mail_op, TNY_FOLDER (priv->cur_folder_store), FALSE);
-                       g_object_unref (mail_op);
-               }
-
                g_object_unref (priv->cur_folder_store);
                priv->cur_folder_store = NULL;
        }
@@ -1257,14 +978,60 @@ on_account_inserted (TnyAccountStore *account_store,
 }
 
 
+static gboolean
+same_account_selected (ModestFolderView *self,
+                      TnyAccount *account)
+{
+       ModestFolderViewPrivate *priv;
+       gboolean same_account = FALSE;
+
+       priv = MODEST_FOLDER_VIEW_GET_PRIVATE (self);
+
+       if (priv->cur_folder_store) {
+               TnyAccount *selected_folder_account = NULL;
+
+               if (TNY_IS_FOLDER (priv->cur_folder_store)) {
+                       selected_folder_account = 
+                               tny_folder_get_account (TNY_FOLDER (priv->cur_folder_store));
+               } else {
+                       selected_folder_account = 
+                               TNY_ACCOUNT (g_object_ref (priv->cur_folder_store));
+               }
+
+               if (selected_folder_account == account)
+                       same_account = TRUE;
+
+               g_object_unref (selected_folder_account);
+       }
+       return same_account;
+}
+
+/**
+ *
+ * Selects the first inbox or the local account in an idle
+ */
+static gboolean
+on_idle_select_first_inbox_or_local (gpointer user_data)
+{
+       ModestFolderView *self = MODEST_FOLDER_VIEW (user_data);
+
+       gdk_threads_enter ();
+       modest_folder_view_select_first_inbox_or_local (self);
+       gdk_threads_leave ();
+
+       return FALSE;
+}
+
 static void
 on_account_changed (TnyAccountStore *account_store, 
                    TnyAccount *tny_account,
                    gpointer user_data)
 {
+       ModestFolderView *self;
        ModestFolderViewPrivate *priv;
        GtkTreeModel *sort_model, *filter_model;
        GtkTreeSelection *sel;
+       gboolean same_account;
 
        /* Ignore transport account insertions, we're not showing them
           in the folder view */
@@ -1276,7 +1043,7 @@ on_account_changed (TnyAccountStore *account_store,
                return;
        }
 
-
+       self = MODEST_FOLDER_VIEW (user_data);
        priv = MODEST_FOLDER_VIEW_GET_PRIVATE (user_data);
 
        /* Get the inner model */
@@ -1286,16 +1053,19 @@ on_account_changed (TnyAccountStore *account_store,
                return;
        }
 
-
        sort_model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (filter_model));
        if (!GTK_IS_TREE_MODEL_SORT(sort_model)) {
                g_warning ("BUG: %s: not a valid sort model", __FUNCTION__);
                return;
        }
 
-       /* Unselect the folder, clear the header list */
-       sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (user_data));
-       gtk_tree_selection_unselect_all (sel);
+       /* Invalidate the cur_folder_store only if the selected folder
+          belongs to the account that is being removed */
+       same_account = same_account_selected (self, tny_account);
+       if (same_account) {
+               sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (self));
+               gtk_tree_selection_unselect_all (sel);
+       }
 
        /* Remove the account from the model */
        tny_list_remove (TNY_LIST (gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (sort_model))),
@@ -1307,25 +1077,13 @@ on_account_changed (TnyAccountStore *account_store,
 
        /* Refilter the model */
        gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (filter_model));
-}
-
-/**
- *
- * Selects the first inbox or the local account in an idle
- */
-static gboolean
-on_idle_select_first_inbox_or_local (gpointer user_data)
-{
-       ModestFolderView *self = MODEST_FOLDER_VIEW (user_data);
-
-       gdk_threads_enter ();
-       modest_folder_view_select_first_inbox_or_local (self);
-       gdk_threads_leave ();
 
-       return FALSE;
+       /* Select the first INBOX if the currently selected folder
+          belongs to the account that is being deleted */
+       if (same_account)
+               g_idle_add (on_idle_select_first_inbox_or_local, self);
 }
 
-
 static void
 on_account_removed (TnyAccountStore *account_store, 
                    TnyAccount *account,
@@ -1335,7 +1093,7 @@ on_account_removed (TnyAccountStore *account_store,
        ModestFolderViewPrivate *priv;
        GtkTreeModel *sort_model, *filter_model;
        GtkTreeSelection *sel = NULL;
-       gboolean same_account_selected = FALSE;
+       gboolean same_account = FALSE;
 
        /* Ignore transport account removals, we're not showing them
           in the folder view */
@@ -1352,23 +1110,10 @@ on_account_removed (TnyAccountStore *account_store,
 
        /* Invalidate the cur_folder_store only if the selected folder
           belongs to the account that is being removed */
-       if (priv->cur_folder_store) {
-               TnyAccount *selected_folder_account = NULL;
-
-               if (TNY_IS_FOLDER (priv->cur_folder_store)) {
-                       selected_folder_account = 
-                               tny_folder_get_account (TNY_FOLDER (priv->cur_folder_store));
-               } else {
-                       selected_folder_account = 
-                               TNY_ACCOUNT (g_object_ref (priv->cur_folder_store));
-               }
-
-               if (selected_folder_account == account) {
-                       sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (self));
-                       gtk_tree_selection_unselect_all (sel);
-                       same_account_selected = TRUE;
-               }
-               g_object_unref (selected_folder_account);
+       same_account = same_account_selected (self, account);
+       if (same_account) {
+               sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (self));
+               gtk_tree_selection_unselect_all (sel);
        }
 
        /* Invalidate row to select only if the folder to select
@@ -1419,7 +1164,7 @@ on_account_removed (TnyAccountStore *account_store,
 
        /* Select the first INBOX if the currently selected folder
           belongs to the account that is being deleted */
-       if (same_account_selected)
+       if (same_account)
                g_idle_add (on_idle_select_first_inbox_or_local, self);
 }
 
@@ -1720,14 +1465,18 @@ on_selection_changed (GtkTreeSelection *sel, gpointer user_data)
        
        /* Current folder was unselected */
        if (priv->cur_folder_store) {
-               g_signal_emit (G_OBJECT(tree_view), signals[FOLDER_SELECTION_CHANGED_SIGNAL], 0,
-                      priv->cur_folder_store, FALSE);
-
+               /* We must do this firstly because a libtinymail-camel
+                  implementation detail. If we issue the signal
+                  before doing the sync_async, then that signal could
+                  cause (and it actually does it) a free of the
+                  summary of the folder (because the main window will
+                  clear the headers view */
                if (TNY_IS_FOLDER(priv->cur_folder_store))
                        tny_folder_sync_async (TNY_FOLDER(priv->cur_folder_store),
                                               FALSE, NULL, NULL, NULL);
 
-               /* FALSE --> don't expunge the messages */
+               g_signal_emit (G_OBJECT(tree_view), signals[FOLDER_SELECTION_CHANGED_SIGNAL], 0,
+                      priv->cur_folder_store, FALSE);
 
                g_object_unref (priv->cur_folder_store);
                priv->cur_folder_store = NULL;
@@ -1989,7 +1738,7 @@ xfer_folder_cb (ModestMailOperation *mail_op,
        if (new_folder) {       
                /* Select the folder */
                modest_folder_view_select_folder (MODEST_FOLDER_VIEW (user_data), 
-                                                 new_folder, TRUE);
+                                                 new_folder, FALSE);
        }
 }
 
@@ -2270,7 +2019,7 @@ drag_and_drop_from_folder_view (GtkTreeModel     *source_model,
                            &folder, -1);
 
        /* Create the info for the performer */
-       info = g_slice_new (DndFolderInfo);
+       info = g_slice_new0 (DndFolderInfo);
        info->src_folder = g_object_ref (folder);
        info->dst_folder = g_object_ref (dest_folder);
        info->helper = helper;