* Partially fixes NB#85461, do not unload the folder before synchronizing it
[modest] / src / widgets / modest-folder-view.c
index 05e18a8..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;
        }
@@ -1196,6 +917,8 @@ modest_folder_view_set_account_store (TnyAccountStoreView *self, TnyAccountStore
                                  G_CALLBACK (on_account_changed), self);
 
        modest_folder_view_update_model (MODEST_FOLDER_VIEW (self), account_store);
+       priv->reselect = FALSE;
+       modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (self));
        
        g_object_unref (G_OBJECT (device));
 }
@@ -1215,6 +938,7 @@ on_account_inserted (TnyAccountStore *account_store,
 
        priv = MODEST_FOLDER_VIEW_GET_PRIVATE (user_data);
 
+
        /* If we're adding a new account, and there is no previous
           one, we need to select the visible server account */
        if (priv->style == MODEST_FOLDER_VIEW_STYLE_SHOW_ONE &&
@@ -1223,67 +947,143 @@ on_account_inserted (TnyAccountStore *account_store,
                                              G_OBJECT (user_data),
                                              MODEST_CONF_FOLDER_VIEW_KEY);
 
+       if (!GTK_IS_TREE_VIEW(user_data)) {
+               g_warning ("BUG: %s: not a valid tree view", __FUNCTION__);
+               return;
+       }
+       
        /* Get the inner model */
+       /* check, is some rare cases, we did not get the right thing here,
+        * NB#84097 */
        filter_model = gtk_tree_view_get_model (GTK_TREE_VIEW (user_data));
+       if (!GTK_IS_TREE_MODEL_FILTER(filter_model)) {
+               g_warning ("BUG: %s: not a valid filter model", __FUNCTION__);
+               return;
+       }
+
+       /* check, is some rare cases, we did not get the right thing here,
+        * NB#84097 */
        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;
+       }
 
        /* Insert the account in the model */
        tny_list_append (TNY_LIST (gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (sort_model))),
                         G_OBJECT (account));
-
+       
        /* Refilter the model */
        gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (filter_model));
 }
 
 
+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 */
        if (TNY_IS_TRANSPORT_ACCOUNT (tny_account))
                return;
 
+       if (!MODEST_IS_FOLDER_VIEW(user_data)) {
+               g_warning ("BUG: %s: not a valid folder view", __FUNCTION__);
+               return;
+       }
+
+       self = MODEST_FOLDER_VIEW (user_data);
        priv = MODEST_FOLDER_VIEW_GET_PRIVATE (user_data);
 
        /* Get the inner model */
        filter_model = gtk_tree_view_get_model (GTK_TREE_VIEW (user_data));
+       if (!GTK_IS_TREE_MODEL_FILTER(filter_model)) {
+               g_warning ("BUG: %s: not a valid filter model", __FUNCTION__);
+               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;
+       }
+
+       /* 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))),
                         G_OBJECT (tny_account));
-
+       
        /* Insert the account in the model */
        tny_list_append (TNY_LIST (gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (sort_model))),
                         G_OBJECT (tny_account));
 
        /* 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,
@@ -1293,35 +1093,27 @@ 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 */
        if (TNY_IS_TRANSPORT_ACCOUNT (account))
                return;
 
+       if (!MODEST_IS_FOLDER_VIEW(user_data)) {
+               g_warning ("BUG: %s: not a valid folder view", __FUNCTION__);
+               return;
+       }
+
        self = MODEST_FOLDER_VIEW (user_data);
        priv = MODEST_FOLDER_VIEW_GET_PRIVATE (self);
 
        /* 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
@@ -1340,7 +1132,17 @@ on_account_removed (TnyAccountStore *account_store,
 
        /* Remove the account from the model */
        filter_model = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
+       if (!GTK_IS_TREE_MODEL_FILTER(filter_model)) {
+               g_warning ("BUG: %s: not a valid filter model", __FUNCTION__);
+               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;
+       }
+       
        tny_list_remove (TNY_LIST (gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (sort_model))),
                         G_OBJECT (account));
 
@@ -1362,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);
 }
 
@@ -1663,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;
@@ -1914,70 +1720,26 @@ typedef struct _DndHelper {
        ModestFolderView *folder_view;
        gboolean delete_source;
        GtkTreePath *source_row;
-       GdkDragContext *context;
-       guint time;
 } DndHelper;
 
 static void
 dnd_helper_destroyer (DndHelper *helper)
 {
        /* Free the helper */
-       g_object_unref (helper->folder_view);
        gtk_tree_path_free (helper->source_row);
        g_slice_free (DndHelper, helper);
 }
 
 static void
-xfer_cb (ModestMailOperation *mail_op, 
-        gpointer user_data)
-{
-       gboolean success;
-       DndHelper *helper;
-
-       helper = (DndHelper *) user_data;
-
-       if (modest_mail_operation_get_status (mail_op) == 
-           MODEST_MAIL_OPERATION_STATUS_SUCCESS) {
-               success = TRUE;
-       } else {
-               success = FALSE;
-       }
-
-       /* Notify the drag source. Never call delete, the monitor will
-          do the job if needed */
-       gtk_drag_finish (helper->context, success, FALSE, helper->time);
-
-       /* Free the helper */
-       dnd_helper_destroyer (helper);
-}
-
-static void
-xfer_msgs_cb (ModestMailOperation *mail_op, 
-             gpointer user_data)
-{
-       /* Common part */
-       xfer_cb (mail_op, user_data);
-}
-
-static void
 xfer_folder_cb (ModestMailOperation *mail_op, 
                TnyFolder *new_folder,
                gpointer user_data)
 {
-       DndHelper *helper;
-       GtkWidget *folder_view;
-
-       helper = (DndHelper *) user_data;
-       folder_view = g_object_ref (helper->folder_view);
-
-       /* Common part */
-       xfer_cb (mail_op, user_data);
-
-       /* Select the folder */
-       if (new_folder)
-               modest_folder_view_select_folder (MODEST_FOLDER_VIEW (folder_view),
+       if (new_folder) {       
+               /* Select the folder */
+               modest_folder_view_select_folder (MODEST_FOLDER_VIEW (user_data), 
                                                  new_folder, FALSE);
-       g_object_unref (folder_view);
+       }
 }
 
 
@@ -1996,6 +1758,7 @@ tree_path_to_folder (GtkTreeModel *model, GtkTreePath *path)
        return folder;
 }
 
+
 /*
  * This function is used by drag_data_received_cb to manage drag and
  * drop of a header, i.e, and drag from the header view to the folder
@@ -2005,19 +1768,16 @@ static void
 drag_and_drop_from_header_view (GtkTreeModel *source_model,
                                GtkTreeModel *dest_model,
                                GtkTreePath  *dest_row,
-                               GtkSelectionData *selection_data,
-                               DndHelper    *helper)
+                               GtkSelectionData *selection_data)
 {
        TnyList *headers = NULL;
-       TnyFolder *folder = NULL;
+       TnyFolder *folder = NULL, *src_folder = NULL;
        TnyFolderType folder_type;
-       ModestMailOperation *mail_op = NULL;
        GtkTreeIter source_iter, dest_iter;
        ModestWindowMgr *mgr = NULL;
        ModestWindow *main_win = NULL;
        gchar **uris, **tmp;
-       gint response;
-
+       
        /* Build the list of headers */
        mgr = modest_runtime_get_window_mgr ();
        headers = tny_simple_list_new ();
@@ -2027,6 +1787,7 @@ drag_and_drop_from_header_view (GtkTreeModel *source_model,
        while (*tmp != NULL) {
                TnyHeader *header;
                GtkTreePath *path;
+               gboolean first = TRUE;
 
                /* Get header */
                path = gtk_tree_path_new_from_string (*tmp);
@@ -2039,6 +1800,11 @@ drag_and_drop_from_header_view (GtkTreeModel *source_model,
                if (!modest_window_mgr_find_registered_header(mgr, header, NULL))
                        tny_list_append (headers, G_OBJECT (header));
 
+               if (G_UNLIKELY (first)) {
+                       src_folder = tny_header_get_folder (header);
+                       first = FALSE;
+               }
+
                /* Free and go on */
                gtk_tree_path_free (path);
                g_object_unref (header);
@@ -2075,29 +1841,14 @@ drag_and_drop_from_header_view (GtkTreeModel *source_model,
                goto cleanup;
        }
 
-       response = modest_ui_actions_msgs_move_to_confirmation (main_win, folder, 
-                                                               TRUE, headers);
-       if (response == GTK_RESPONSE_CANCEL)
-               goto cleanup;
-
        /* Transfer messages */
-       mail_op = modest_mail_operation_new_with_error_handling ((GObject *) main_win,
-                                                                modest_ui_actions_move_folder_error_handler,
-                                                                NULL, NULL);
-
-       modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
-                                        mail_op);
-
-       modest_mail_operation_xfer_msgs (mail_op,
-                                        headers, 
-                                        folder, 
-                                        helper->delete_source, 
-                                        xfer_msgs_cb, helper);
+       modest_ui_actions_transfer_messages_helper (GTK_WINDOW (main_win), src_folder, 
+                                                   headers, folder);
        
        /* Frees */
 cleanup:
-       if (G_IS_OBJECT(mail_op))
-               g_object_unref (G_OBJECT (mail_op));
+       if (G_IS_OBJECT (src_folder))
+               g_object_unref (src_folder);
        if (G_IS_OBJECT(folder))
                g_object_unref (G_OBJECT (folder));
        if (G_IS_OBJECT(headers))
@@ -2118,8 +1869,6 @@ dnd_folder_info_destroyer (DndFolderInfo *info)
                g_object_unref (info->src_folder);
        if (info->dst_folder)
                g_object_unref (info->dst_folder);
-       if (info->folder_view)
-               g_object_unref (info->folder_view);
        g_slice_free (DndFolderInfo, info);
 }
 
@@ -2128,20 +1877,12 @@ dnd_on_connection_failed_destroyer (DndFolderInfo *info,
                                    GtkWindow *parent_window,
                                    TnyAccount *account)
 {
-       time_t dnd_time = info->helper->time;
-       GdkDragContext *context = info->helper->context;
-       
        /* Show error */
        modest_ui_actions_on_account_connection_error (parent_window, account);
 
        /* Free the helper & info */
        dnd_helper_destroyer (info->helper);
        dnd_folder_info_destroyer (info);
-       
-       /* Notify the drag source. Never call delete, the monitor will
-          do the job if needed */
-       gtk_drag_finish (context, FALSE, FALSE, dnd_time);
-       return;
 }
 
 static void
@@ -2175,12 +1916,12 @@ drag_and_drop_from_folder_view_src_folder_performer (gboolean canceled,
                                           info->dst_folder,
                                           info->helper->delete_source,
                                           xfer_folder_cb,
-                                          info->helper);
-       
-/*     modest_folder_view_select_folder (MODEST_FOLDER_VIEW(info->folder_view), */
-/*                                       TNY_FOLDER (info->dst_folder), TRUE); */
+                                          info->helper->folder_view);
 
+       /* Frees */     
        g_object_unref (G_OBJECT (mail_op));
+       dnd_helper_destroyer (info->helper);
+       dnd_folder_info_destroyer (info);
 }
 
 
@@ -2229,6 +1970,7 @@ drag_and_drop_from_folder_view (GtkTreeModel     *source_model,
        win = modest_window_mgr_get_main_window (modest_runtime_get_window_mgr(), FALSE); /* don't create */
        if (!win) {
                g_warning ("%s: BUG: no main window", __FUNCTION__);
+               dnd_helper_destroyer (helper);
                return;
        }
        
@@ -2262,9 +2004,7 @@ drag_and_drop_from_folder_view (GtkTreeModel     *source_model,
        
        /* Check if the drag is possible */
        if (forbidden || !gtk_tree_path_compare (helper->source_row, dest_row)) {
-               gtk_drag_finish (helper->context, FALSE, FALSE, helper->time);
-               gtk_tree_path_free (helper->source_row);        
-               g_slice_free (DndHelper, helper);
+               dnd_helper_destroyer (helper);
                return;
        }
 
@@ -2279,10 +2019,9 @@ 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->folder_view = g_object_ref (helper->folder_view);
        info->helper = helper;
 
        /* Connect to the destination folder and perform the copy/move */
@@ -2316,8 +2055,8 @@ on_drag_data_received (GtkWidget *widget,
        GtkTreeModel *dest_model, *source_model;
        GtkTreePath *source_row, *dest_row;
        GtkTreeViewDropPosition pos;
-       gboolean success = FALSE, delete_source = FALSE;
-       DndHelper *helper = NULL; 
+       gboolean delete_source = FALSE;
+       gboolean success = FALSE;
 
        /* Do not allow further process */
        g_signal_stop_emission_by_name (widget, "drag-data-received");
@@ -2341,10 +2080,10 @@ on_drag_data_received (GtkWidget *widget,
 
        /* Check if the get_data failed */
        if (selection_data == NULL || selection_data->length < 0)
-               gtk_drag_finish (context, success, FALSE, time);
+               goto end;
 
        /* Select the destination model */
-       dest_model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));  
+       dest_model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
 
        /* Get the path to the destination row. Can not call
           gtk_tree_view_get_drag_dest_row() because the source row
@@ -2356,15 +2095,9 @@ on_drag_data_received (GtkWidget *widget,
        if (!dest_row || 
            pos == GTK_TREE_VIEW_DROP_BEFORE || 
            pos == GTK_TREE_VIEW_DROP_AFTER)
-               gtk_drag_finish (context, success, FALSE, time);
-
-       /* Create the helper */
-       helper = g_slice_new0 (DndHelper);
-       helper->delete_source = delete_source;
-       helper->context = context;
-       helper->time = time;
-       helper->folder_view = g_object_ref (widget);
+               goto end;
 
+       success = TRUE;
        /* Drags from the header view */
        if (source_widget != widget) {
                source_model = gtk_tree_view_get_model (GTK_TREE_VIEW (source_widget));
@@ -2372,14 +2105,20 @@ on_drag_data_received (GtkWidget *widget,
                drag_and_drop_from_header_view (source_model,
                                                dest_model,
                                                dest_row,
-                                               selection_data,
-                                               helper);
+                                               selection_data);
        } else {
+               DndHelper *helper = NULL; 
+
                /* Get the source model and row */
                gtk_tree_get_row_drag_data (selection_data,
                                            &source_model,
                                            &source_row);
+
+               /* Create the helper */
+               helper = g_slice_new0 (DndHelper);
+               helper->delete_source = delete_source;
                helper->source_row = gtk_tree_path_copy (source_row);
+               helper->folder_view = MODEST_FOLDER_VIEW (widget);
 
                drag_and_drop_from_folder_view (source_model,
                                                dest_model,
@@ -2392,6 +2131,10 @@ on_drag_data_received (GtkWidget *widget,
 
        /* Frees */
        gtk_tree_path_free (dest_row);
+
+ end:
+       /* Finish the drag and drop */
+       gtk_drag_finish (context, success, FALSE, time);
 }
 
 /*
@@ -2863,7 +2606,6 @@ on_row_inserted_maybe_select_folder (GtkTreeModel *tree_model,
                priv->folder_to_select = g_object_ref (instance);
        }
        g_object_unref (instance);
-
        
        if (priv->folder_to_select) {
                
@@ -2878,8 +2620,7 @@ on_row_inserted_maybe_select_folder (GtkTreeModel *tree_model,
                        gtk_tree_selection_select_iter (sel, iter);
                        gtk_tree_view_set_cursor (GTK_TREE_VIEW(self), path, NULL, FALSE);
 
-                       gtk_tree_path_free (path);
-               
+                       gtk_tree_path_free (path);              
                }
 
                /* Disable next */