* make modest_text_utils_get_display_date return a ptr to
[modest] / src / maemo / modest-main-window.c
index 5dbb687..999b4d3 100644 (file)
@@ -84,8 +84,8 @@ static void modest_main_window_init        (ModestMainWindow *obj);
 static void modest_main_window_finalize    (GObject *obj);
 
 static gboolean modest_main_window_window_state_event (GtkWidget *widget, 
-                                                          GdkEventWindowState *event, 
-                                                          gpointer userdata);
+                                                      GdkEventWindowState *event, 
+                                                      gpointer userdata);
 
 static void connect_signals (ModestMainWindow *self);
 
@@ -96,6 +96,8 @@ static void restore_settings (ModestMainWindow *self,
 
 static void save_state (ModestWindow *self);
 
+static void update_menus (ModestMainWindow* self);
+
 static void modest_main_window_show_toolbar   (ModestWindow *window,
                                               gboolean show_toolbar);
 
@@ -109,9 +111,18 @@ static void on_queue_changed   (ModestMailOperationQueue *queue,
 
 static gboolean on_zoom_minus_plus_not_implemented (ModestWindow *window);
 
-static void account_number_changed            (TnyAccountStore *account_store, 
-                                              const gchar *account_name,
-                                              gpointer user_data);
+static void
+on_account_inserted (TnyAccountStore *accoust_store,
+                     TnyAccount *account,
+                     gpointer user_data);
+
+static void
+on_account_removed (TnyAccountStore *accoust_store,
+                    TnyAccount *account,
+                    gpointer user_data);
+
+static void on_default_account_changed (ModestAccountMgr* mgr,
+                                       gpointer user_data);
 
 static gboolean on_inner_widgets_key_pressed  (GtkWidget *widget,
                                               GdkEventKey *event,
@@ -128,8 +139,8 @@ static void set_toolbar_mode                  (ModestMainWindow *self,
 
 static gboolean set_toolbar_transfer_mode     (ModestMainWindow *self); 
 
-static void on_show_account_action_activated      (GtkAction *action,
-                                                  gpointer user_data);
+static void on_show_account_action_toggled      (GtkToggleAction *action,
+                                                gpointer user_data);
 
 static void on_refresh_account_action_activated   (GtkAction *action,
                                                   gpointer user_data);
@@ -137,41 +148,36 @@ static void on_refresh_account_action_activated   (GtkAction *action,
 static void on_send_receive_csm_activated         (GtkMenuItem *item,
                                                   gpointer user_data);
 
-static void
-_on_msg_count_changed (ModestHeaderView *header_view,
-                      TnyFolder *folder,
-                      TnyFolderChange *change,
-                      ModestMainWindow *main_window);
+static void on_msg_count_changed (ModestHeaderView *header_view,
+                                 TnyFolder *folder,
+                                 TnyFolderChange *change,
+                                 ModestMainWindow *main_window);
 
-static void
-modest_main_window_cleanup_queue_error_signals (ModestMainWindow *self);
+static void modest_main_window_cleanup_queue_error_signals (ModestMainWindow *self);
 
 
 static GtkWidget * create_empty_view (void);
 
-static gboolean
-on_folder_view_focus_in (GtkWidget *widget,
-                        GdkEventFocus *event,
-                        gpointer userdata);
-static gboolean
-on_header_view_focus_in (GtkWidget *widget,
-                        GdkEventFocus *event,
-                        gpointer userdata);
-static void 
-modest_main_window_on_folder_selection_changed (ModestFolderView *folder_view,
-                                               TnyFolderStore *folder_store, 
-                                               gboolean selected,
-                                               ModestMainWindow *main_window);
+static gboolean  on_folder_view_focus_in (GtkWidget *widget,
+                                         GdkEventFocus *event,
+                                         gpointer userdata);
+
+static gboolean  on_header_view_focus_in (GtkWidget *widget,
+                                         GdkEventFocus *event,
+                                         gpointer userdata);
+
+static void      modest_main_window_on_folder_selection_changed (ModestFolderView *folder_view,
+                                                                TnyFolderStore *folder_store, 
+                                                                gboolean selected,
+                                                                ModestMainWindow *main_window);
                                                
-static void
-set_at_least_one_account_visible(ModestMainWindow *self);
+static void set_at_least_one_account_visible(ModestMainWindow *self);
 
-/* list my signals */
-enum {
-       /* MY_SIGNAL_1, */
-       /* MY_SIGNAL_2, */
-       LAST_SIGNAL
-};
+static void on_updating_msg_list (ModestHeaderView *header_view,
+                                 gboolean starting,
+                                 gpointer user_data);
+
+static gboolean restore_paned_timeout_handler (gpointer *data);
 
 typedef struct _ModestMainWindowPrivate ModestMainWindowPrivate;
 struct _ModestMainWindowPrivate {
@@ -194,6 +200,7 @@ struct _ModestMainWindowPrivate {
 
        /* Merge ids used to add/remove accounts to the ViewMenu*/
        GByteArray *merge_ids;
+       GtkActionGroup *view_additions_group;
 
        /* On-demand widgets */
        GtkWidget *accounts_popup;
@@ -212,12 +219,15 @@ struct _ModestMainWindowPrivate {
        ModestMainWindowContentsStyle contents_style;
 
        guint progress_bar_timeout;
+       guint restore_paned_timeout;
 
        /* Signal handler UIDs */
        GList *queue_err_signals;
        GSList *sighandlers;
-       
-       ModestConfNotificationId notification_id;
+
+       /* "Updating" banner for header view */
+       GtkWidget *updating_banner;
+       guint updating_banner_timeout;
 };
 #define MODEST_MAIN_WINDOW_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
                                                 MODEST_TYPE_MAIN_WINDOW, \
@@ -340,7 +350,10 @@ modest_main_window_init (ModestMainWindow *obj)
        priv->optimized_view  = FALSE;
        priv->send_receive_in_progress  = FALSE;
        priv->progress_bar_timeout = 0;
+       priv->restore_paned_timeout = 0;
        priv->sighandlers = NULL;
+       priv->updating_banner = NULL;
+       priv->updating_banner_timeout = 0;
 }
 
 static void
@@ -350,12 +363,6 @@ modest_main_window_finalize (GObject *obj)
 
        priv = MODEST_MAIN_WINDOW_GET_PRIVATE(obj);
 
-       if (priv->notification_id) {
-               modest_conf_forget_namespace (modest_runtime_get_conf (),
-                                             MODEST_CONF_NAMESPACE,
-                                             priv->notification_id);
-       }
-       
        /* Sanity check: shouldn't be needed, the window mgr should
           call this function before */
        modest_main_window_disconnect_signals (MODEST_WINDOW (obj));
@@ -371,26 +378,36 @@ modest_main_window_finalize (GObject *obj)
                priv->progress_bar_timeout = 0;
        }
 
+       if (priv->updating_banner_timeout > 0) {
+               g_source_remove (priv->updating_banner_timeout);
+               priv->updating_banner_timeout = 0;
+       }
+
+       if (priv->restore_paned_timeout > 0) {
+               g_source_remove (priv->restore_paned_timeout);
+               priv->restore_paned_timeout = 0;
+       }
+
        G_OBJECT_CLASS(parent_class)->finalize (obj);
 }
 
 GtkWidget*
 modest_main_window_get_child_widget (ModestMainWindow *self,
-                                    ModestWidgetType widget_type)
+                                    ModestMainWindowWidgetType widget_type)
 {
        ModestMainWindowPrivate *priv;
        GtkWidget *widget;
        
        g_return_val_if_fail (self, NULL);
-       g_return_val_if_fail (widget_type >= 0 && widget_type < MODEST_WIDGET_TYPE_NUM,
+       g_return_val_if_fail (widget_type >= 0 && widget_type < MODEST_MAIN_WINDOW_WIDGET_TYPE_NUM,
                              NULL);
        
        priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
 
        switch (widget_type) {
-       case MODEST_WIDGET_TYPE_HEADER_VIEW:
+       case MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW:
                widget = (GtkWidget*)priv->header_view; break;
-       case MODEST_WIDGET_TYPE_FOLDER_VIEW:
+       case MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW:
                widget = (GtkWidget*)priv->folder_view; break;
        default:
                return NULL;
@@ -399,6 +416,21 @@ modest_main_window_get_child_widget (ModestMainWindow *self,
        return widget ? GTK_WIDGET(widget) : NULL;
 }
 
+static gboolean 
+restore_paned_timeout_handler (gpointer *data)
+{
+       ModestMainWindow *main_window = MODEST_MAIN_WINDOW (data);
+       ModestMainWindowPrivate *priv = MODEST_MAIN_WINDOW_GET_PRIVATE (main_window);
+       ModestConf *conf;
+
+       if (GTK_WIDGET_VISIBLE (main_window)) {
+               conf = modest_runtime_get_conf ();
+               modest_widget_memory_restore (conf, G_OBJECT(priv->main_paned),
+                                             MODEST_CONF_MAIN_PANED_KEY);
+       }
+       return FALSE;
+}
+
 
 static void
 restore_settings (ModestMainWindow *self, gboolean do_folder_view_too)
@@ -423,6 +455,8 @@ restore_settings (ModestMainWindow *self, gboolean do_folder_view_too)
        modest_widget_memory_restore (conf, G_OBJECT(priv->main_paned),
                                      MODEST_CONF_MAIN_PANED_KEY);
 
+       g_timeout_add (500, (GSourceFunc) restore_paned_timeout_handler, self);
+
        /* We need to force a redraw here in order to get the right
           position of the horizontal paned separator */
        gtk_widget_show (GTK_WIDGET (self));
@@ -449,284 +483,466 @@ save_state (ModestWindow *window)
                                   MODEST_CONF_FOLDER_VIEW_KEY);
 }
 
-static void
-wrap_in_scrolled_window (GtkWidget *win, GtkWidget *widget)
+static gint
+compare_display_names (ModestAccountData *a,
+                      ModestAccountData *b)
 {
-       if (!gtk_widget_set_scroll_adjustments (widget, NULL, NULL))
-               gtk_scrolled_window_add_with_viewport
-                       (GTK_SCROLLED_WINDOW(win), widget);
-       else
-               gtk_container_add (GTK_CONTAINER(win),
-                                  widget);
+       return strcmp (a->display_name, b->display_name);
 }
 
+static void
+update_menus (ModestMainWindow* self)
+{      
+       GSList *account_names, *iter, *accounts;
+       ModestMainWindowPrivate *priv;
+       ModestWindowPrivate *parent_priv;
+       ModestAccountMgr *mgr;
+       gint i, num_accounts;
+       GList *groups;
+       gchar *default_account;
+       GtkWidget *send_receive_button, *item;
+       GtkAction *send_receive_all = NULL;
+       GSList *radio_group;
 
-/* static gboolean */
-/* on_delete_event (GtkWidget *widget, GdkEvent  *event, ModestMainWindow *self) */
-/* { */
-/*     modest_window_save_state (MODEST_WINDOW(self)); */
-/*     return FALSE; */
-/* } */
-
-/* static void */
-/* on_sendqueue_error_happened (TnySendQueue *self, TnyHeader *header, TnyMsg *msg, GError *err, ModestMainWindow *user_data) */
-/* { */
-/*     if (err) { */
-/*             printf ("DEBUG: %s: err->code=%d, err->message=%s\n", __FUNCTION__, err->code, err->message); */
+       priv = MODEST_MAIN_WINDOW_GET_PRIVATE (self);
+       parent_priv = MODEST_WINDOW_GET_PRIVATE (self);
 
-/*             if (err->code == TNY_ACCOUNT_ERROR_TRY_CONNECT_USER_CANCEL) */
-/*                     /\* Don't show waste the user's time by showing him a dialog telling him */
-/*                      * that he has just cancelled something: *\/ */
-/*                     return; */
-/*     } */
+       /* Get enabled account IDs */
+       mgr = modest_runtime_get_account_mgr ();
+       account_names = modest_account_mgr_account_names (mgr, TRUE);
+       iter = account_names;
+       accounts = NULL;
 
-/*     /\* Get the server name: *\/ */
-/*     const gchar* server_name = NULL; */
-       
-/*     TnyCamelTransportAccount* server_account = tny_camel_send_queue_get_transport_account ( */
-/*             TNY_CAMEL_SEND_QUEUE (self)); */
-/*     if (server_account) { */
-/*             server_name = tny_account_get_hostname (TNY_ACCOUNT (server_account)); */
-                       
-/*             g_object_unref (server_account); */
-/*             server_account = NULL; */
-/*     } */
-       
-/*     if (!server_name) */
-/*             server_name = _("Unknown Server");       */
-
-/*     /\* Show the appropriate message text for the GError: *\/ */
-/*     gchar *message = NULL; */
-/*     if (err) { */
-/*             switch (err->code) { */
-/*                     case TNY_TRANSPORT_ACCOUNT_ERROR_SEND_HOST_LOOKUP_FAILED: */
-/*                             message = g_strdup_printf (_("emev_ib_ui_smtp_server_invalid"), server_name); */
-/*                             break; */
-/*                     case TNY_TRANSPORT_ACCOUNT_ERROR_SEND_SERVICE_UNAVAILABLE: */
-/*                             message = g_strdup_printf (_("emev_ib_ui_smtp_server_invalid"), server_name); */
-/*                             break; */
-/*                     case TNY_TRANSPORT_ACCOUNT_ERROR_SEND_AUTHENTICATION_NOT_SUPPORTED: */
-/*                             /\* TODO: This logical ID seems more suitable for a wrong username or password than for a  */
-/*                              * wrong authentication method. The user is unlikely to guess at the real cause. */
-/*                              *\/ */
-/*                             message = g_strdup_printf (_("eemev_ni_ui_smtp_authentication_fail_error"), server_name); */
-/*                             break; */
-/*                     case TNY_TRANSPORT_ACCOUNT_ERROR_SEND: */
-/*                             /\* TODO: Tinymail is still sending this sometimes when it should  */
-/*                              * send TNY_ACCOUNT_ERROR_TRY_CONNECT_USER_CANCEL. *\/ */
-/*                     default: */
-/*                             message = g_strdup (_("emev_ib_ui_smtp_send_error")); */
-/*                             break; */
-/*             } */
-/*     } else { */
-/*             message = g_strdup (_("emev_ib_ui_smtp_send_error")); */
-/*     } */
-       
-/*     modest_maemo_show_information_note_and_forget (GTK_WINDOW (user_data), message); */
-/*     g_free (message); */
-       
-/*     /\* TODO: Offer to remove the message, to avoid messages in future? *\/ */
-/*     /\* */
-/*     TnyFolder *outbox = tny_send_queue_get_outbox (queue); */
-/*     tny_folder_remove_msg (outbox, header, NULL); */
-/*     tny_folder_sync (outbox, TRUE, NULL); */
-/*     g_object_unref (outbox); */
-/*     *\/ */
-/* } */
+       while (iter) {
+               ModestAccountData *account_data = 
+                       modest_account_mgr_get_account_data (mgr, (gchar*) iter->data);
+               accounts = g_slist_prepend (accounts, account_data);
 
-typedef struct {
-       TnySendQueue *queue;
-       guint signal;
-} QueueErrorSignal;
+               iter = iter->next;
+       }
+       modest_account_mgr_free_account_names (account_names);
+       account_names = NULL;
 
-static void
-modest_main_window_cleanup_queue_error_signals (ModestMainWindow *self)
-{
-       ModestMainWindowPrivate *priv = MODEST_MAIN_WINDOW_GET_PRIVATE (self);
+       /* Order the list of accounts by its display name */
+       accounts = g_slist_sort (accounts, (GCompareFunc) compare_display_names);
+       num_accounts = g_slist_length (accounts);
 
-       GList *oerrsignals = priv->queue_err_signals;
-       while (oerrsignals) {
-               QueueErrorSignal *esignal = (QueueErrorSignal *) oerrsignals->data;
-               g_signal_handler_disconnect (esignal->queue, esignal->signal);
-               g_slice_free (QueueErrorSignal, esignal);
-               oerrsignals = g_list_next (oerrsignals);
-       }
-       g_list_free (priv->queue_err_signals);
-       priv->queue_err_signals = NULL;
-}
+       send_receive_all = gtk_ui_manager_get_action (parent_priv->ui_manager, 
+                                                     "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsSendReceiveAllMenu");
+       gtk_action_set_visible (send_receive_all, num_accounts > 1);
 
-/* static void */
-/* on_account_store_connecting_finished (TnyAccountStore *store, ModestMainWindow *self) */
-/* { */
-/*     ModestMainWindowPrivate *priv = MODEST_MAIN_WINDOW_GET_PRIVATE (self); */
+       /* Delete old send&receive popup items. We can not just do a
+          menu_detach because it does not work well with
+          tap_and_hold */
+       if (priv->accounts_popup)
+               gtk_container_foreach (GTK_CONTAINER (priv->accounts_popup), 
+                                      (GtkCallback) gtk_widget_destroy, NULL);
 
-/*     /\* When going online, do the equivalent of pressing the send/receive button,  */
-/*      * as per the specification: */
-/*      * (without the check for >0 accounts, though that is not specified): *\/ */
+       /* Delete old entries in the View menu. Do not free groups, it
+          belongs to Gtk+ */
+       groups = gtk_ui_manager_get_action_groups (parent_priv->ui_manager);
+       while (groups) {
+               if (!strcmp (MODEST_MAIN_WINDOW_ACTION_GROUP_ADDITIONS,
+                            gtk_action_group_get_name (GTK_ACTION_GROUP (groups->data)))) {
+                       gtk_ui_manager_remove_action_group (parent_priv->ui_manager, 
+                                                           GTK_ACTION_GROUP (groups->data));
+                       groups = NULL;
+                       /* Remove uis */
+                       if (priv->merge_ids) {
+                               for (i = 0; i < priv->merge_ids->len; i++)
+                                       gtk_ui_manager_remove_ui (parent_priv->ui_manager, priv->merge_ids->data[i]);
+                               g_byte_array_free (priv->merge_ids, TRUE);
+                       }
+                       /* We need to call this in order to ensure
+                          that the new actions are added in the right
+                          order (alphabetical) */
+                       gtk_ui_manager_ensure_update (parent_priv->ui_manager);
+               } else 
+                       groups = g_list_next (groups);
+       }
+       priv->merge_ids = g_byte_array_sized_new (num_accounts);
 
-/*     TnyDevice *device = tny_account_store_get_device (store); */
+       /* Get send receive button */
+       send_receive_button = gtk_ui_manager_get_widget (parent_priv->ui_manager,
+                                                         "/ToolBar/ToolbarSendReceive");
 
-/*     /\* modest_folder_view_update_model (MODEST_FOLDER_VIEW (priv->folder_view), store); *\/ */
-       
-/*     /\* Check that we are really online. */
-/*      * This signal should not be emitted when we are not connected,  */
-/*      * but it seems to happen sometimes: *\/ */
-/*      if (!tny_device_is_online (device)) */
-/*             return; */
-               
-/*     const gchar *iap_id = tny_maemo_conic_device_get_current_iap_id (TNY_MAEMO_CONIC_DEVICE (device)); */
-/*     printf ("DEBUG: %s: connection id=%s\n", __FUNCTION__, iap_id); */
-       
-/*     /\* Stop the existing send queues: *\/ */
-/*     modest_runtime_remove_all_send_queues (); */
-       
-/*     /\* Create the send queues again, using the appropriate transport accounts  */
-/*      * for this new connection. */
-/*      * This could be the first time that they are created if this is the first  */
-/*      * connection. *\/ */
-/*     /\* TODO: Does this really destroy the TnySendQueues and their threads */
-/*      * We do not want 2 TnySendQueues to exist with the same underlying  */
-/*      * outbox directory. *\/ */
-
-/*     modest_main_window_cleanup_queue_error_signals (self); */
-
-/*     GSList *account_names = modest_account_mgr_account_names ( */
-/*             modest_runtime_get_account_mgr(),  */
-/*             TRUE /\* enabled accounts only *\/); */
-/*     GSList *iter = account_names; */
-/*     while (iter) { */
-/*             const gchar *account_name = (const gchar*)(iter->data); */
-/*                     if (account_name) { */
-/*                     TnyTransportAccount *account = TNY_TRANSPORT_ACCOUNT ( */
-/*                             modest_tny_account_store_get_transport_account_for_open_connection */
-/*                                              (modest_runtime_get_account_store(), account_name)); */
-/*                     if (account) { */
-/*                             /\* Q: Is this the first location where the send-queues are requested? *\/ */
-/*                             QueueErrorSignal *esignal = g_slice_new (QueueErrorSignal); */
-/*                             printf ("debug: %s:\n  Transport account for %s: %s\n", __FUNCTION__, account_name,  */
-/*                                     tny_account_get_id(TNY_ACCOUNT(account))); */
-/*                             esignal->queue = TNY_SEND_QUEUE (modest_runtime_get_send_queue (account)); */
-/*                             esignal->signal = g_signal_connect (G_OBJECT (esignal->queue), "error-happened", */
-/*                                     G_CALLBACK (on_sendqueue_error_happened), self); */
-/*                             priv->queue_err_signals = g_list_prepend (priv->queue_err_signals, esignal); */
-/*                     } */
-/*             } */
-               
-/*             iter = g_slist_next (iter); */
-/*     } */
+       /* Create the menu */
+       if (num_accounts > 1) {
+               if (!priv->accounts_popup)
+                       priv->accounts_popup = gtk_menu_new ();
+               item = gtk_menu_item_new_with_label (_("mcen_me_toolbar_sendreceive_all"));
+               gtk_menu_shell_append (GTK_MENU_SHELL (priv->accounts_popup), GTK_WIDGET (item));
+               g_signal_connect (G_OBJECT (item), 
+                                 "activate", 
+                                 G_CALLBACK (on_send_receive_csm_activated),
+                                 NULL);
+               item = gtk_separator_menu_item_new ();
+               gtk_menu_shell_prepend (GTK_MENU_SHELL (priv->accounts_popup), GTK_WIDGET (item));
+       }
 
-/*     modest_account_mgr_free_account_names (account_names); */
-/*     account_names = NULL; */
-       
-/*     modest_ui_actions_do_send_receive (NULL, MODEST_WINDOW (self)); */
-/* } */
+       /* Create a new action group */
+       default_account = modest_account_mgr_get_default_account (mgr);
+       priv->view_additions_group = gtk_action_group_new (MODEST_MAIN_WINDOW_ACTION_GROUP_ADDITIONS);
+       radio_group = NULL;
+       for (i = 0; i < num_accounts; i++) {
+               gchar *display_name = NULL;     
+               ModestAccountData *account_data = (ModestAccountData *) g_slist_nth_data (accounts, i);
 
-static void
-_folder_view_csm_menu_activated (GtkWidget *widget, gpointer user_data)
-{
-       g_return_if_fail (MODEST_IS_MAIN_WINDOW (user_data));
+               if (default_account && account_data->account_name && 
+                       !(strcmp (default_account, account_data->account_name) == 0)) {
+                       display_name = g_strdup_printf (_("mcen_me_toolbar_sendreceive_default"), 
+                                                       account_data->display_name);
+               }
+               else {
+                       display_name = g_strdup_printf (_("mcen_me_toolbar_sendreceive_mailbox_n"), 
+                                                       account_data->display_name);
+               }
 
-       /* Update dimmed */     
-       modest_window_check_dimming_rules_group (MODEST_WINDOW (user_data), "ModestMenuDimmingRules");  
-}
+               /* Create action and add it to the action group. The
+                  action name must be the account name, this way we
+                  could know in the handlers the account to show */
+               if(account_data && account_data->account_name) {
+                       gchar* item_name, *refresh_action_name;
+                       guint8 merge_id = 0;
+                       GtkAction *view_account_action, *refresh_account_action;
 
-static void
-_header_view_csm_menu_activated (GtkWidget *widget, gpointer user_data)
-{
-       g_return_if_fail (MODEST_IS_MAIN_WINDOW (user_data));
+                       view_account_action = GTK_ACTION (gtk_radio_action_new (account_data->account_name,
+                                                                               display_name, NULL, NULL, 0));
+                       gtk_action_group_add_action (priv->view_additions_group, view_account_action);
+                       gtk_radio_action_set_group (GTK_RADIO_ACTION (view_account_action), radio_group);
+                       radio_group = gtk_radio_action_get_group (GTK_RADIO_ACTION (view_account_action));
 
-       /* Update visibility */
+                       if (default_account && account_data->account_name && 
+                           (strcmp (default_account, account_data->account_name) == 0)) {
+                               gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (view_account_action), TRUE);
+                       }
 
-       /* Update dimmed */     
-       modest_window_check_dimming_rules_group (MODEST_WINDOW (user_data), "ModestMenuDimmingRules");  
-}
+                       /* Add ui from account data. We allow 2^9-1 account
+                          changes in a single execution because we're
+                          downcasting the guint to a guint8 in order to use a
+                          GByteArray. It should be enough. */
+                       item_name = g_strconcat (account_data->account_name, "Menu", NULL);
+                       merge_id = (guint8) gtk_ui_manager_new_merge_id (parent_priv->ui_manager);
+                       priv->merge_ids = g_byte_array_append (priv->merge_ids, &merge_id, 1);
+                       gtk_ui_manager_add_ui (parent_priv->ui_manager,
+                                              merge_id,
+                                              "/MenuBar/ViewMenu/ViewMenuAdditions",
+                                              item_name,
+                                              account_data->account_name,
+                                              GTK_UI_MANAGER_MENUITEM,
+                                              FALSE);
 
-static void
-modest_main_window_disconnect_signals (ModestWindow *self)
-{      
-       ModestMainWindowPrivate *priv;  
-       priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
+                       /* Connect the action signal "activate" */
+                       g_signal_connect_after (G_OBJECT (view_account_action),
+                                               "toggled",
+                                               G_CALLBACK (on_show_account_action_toggled),
+                                               self);
 
-       modest_signal_mgr_disconnect_all_and_destroy (priv->sighandlers);
-       priv->sighandlers = NULL;       
-}
+                       /* Create the items for the Tools->Send&Receive submenu */
+                       refresh_action_name = g_strconcat ("SendReceive", account_data->account_name, NULL);
+                       refresh_account_action = gtk_action_new ((const gchar*) refresh_action_name, 
+                                                                display_name, NULL, NULL);
+                       gtk_action_group_add_action (priv->view_additions_group, refresh_account_action);
 
-static void
-connect_signals (ModestMainWindow *self)
-{      
-       ModestWindowPrivate *parent_priv;
-       ModestMainWindowPrivate *priv;
-       GtkWidget *menu;
-       
-       priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
-       parent_priv = MODEST_WINDOW_GET_PRIVATE(self);
+                       merge_id = (guint8) gtk_ui_manager_new_merge_id (parent_priv->ui_manager);
+                       priv->merge_ids = g_byte_array_append (priv->merge_ids, &merge_id, 1);
+                       gtk_ui_manager_add_ui (parent_priv->ui_manager, 
+                                              merge_id,
+                                              "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsMenuAdditions",
+                                              item_name,
+                                              refresh_action_name,
+                                              GTK_UI_MANAGER_MENUITEM,
+                                              FALSE);
+                       g_free (refresh_action_name);
 
-       /* folder view */
-       
-       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,
-                                                      G_OBJECT(priv->folder_view), "key-press-event",
-                                                      G_CALLBACK(on_inner_widgets_key_pressed), self);
-       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,G_OBJECT(priv->folder_view), "folder_selection_changed",
-                                                      G_CALLBACK(modest_main_window_on_folder_selection_changed), self);
-       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,G_OBJECT(priv->folder_view), "folder-display-name-changed",
-                                                      G_CALLBACK(modest_ui_actions_on_folder_display_name_changed), self);
-       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,G_OBJECT (priv->folder_view), "focus-in-event", 
-                                                      G_CALLBACK (on_folder_view_focus_in), self);
+                       g_signal_connect_data (G_OBJECT (refresh_account_action), 
+                                              "activate", 
+                                              G_CALLBACK (on_refresh_account_action_activated), 
+                                              g_strdup (account_data->account_name),
+                                              (GClosureNotify) g_free,
+                                              0);
 
-       /* Folder view CSM */
-       menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/FolderViewCSM");
-       gtk_widget_tap_and_hold_setup (GTK_WIDGET (priv->folder_view), menu, NULL, 0);
-       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers, G_OBJECT(priv->folder_view), "tap-and-hold",
-                                                      G_CALLBACK(_folder_view_csm_menu_activated),
-                                                      self);
-       /* header view */
-       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,G_OBJECT(priv->header_view), "header_selected",
-                                                      G_CALLBACK(modest_ui_actions_on_header_selected), self);
-       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,G_OBJECT(priv->header_view), "header_activated",
-                                                      G_CALLBACK(modest_ui_actions_on_header_activated), self);
-       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,G_OBJECT(priv->header_view), "item_not_found",
-                                                      G_CALLBACK(modest_ui_actions_on_item_not_found), self);
-       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,G_OBJECT(priv->header_view), "key-press-event",
-                                                      G_CALLBACK(on_inner_widgets_key_pressed), self);
-       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,G_OBJECT(priv->header_view), "msg_count_changed",
-                                                      G_CALLBACK(_on_msg_count_changed), self);
-       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,G_OBJECT (priv->header_view), "focus-in-event",
-                                                      G_CALLBACK (on_header_view_focus_in), self);
-       
-       /* Header view CSM */
+                       /* Create item and add it to the send&receive
+                          CSM. If there is only one account then
+                          it'll be no menu */
+                       if (priv->accounts_popup) {
+                               GtkWidget *label = gtk_label_new(NULL);
+                               gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+                               if (default_account && (strcmp(account_data->account_name, default_account) == 0))
+                               {
+                                       gchar *escaped = g_markup_printf_escaped ("<b>%s</b>", display_name);
+                                       gtk_label_set_markup (GTK_LABEL (label), escaped);
+                                       g_free (escaped);
+                               }
+                               else
+                               {
+                                       gtk_label_set_text (GTK_LABEL (label), display_name);
+                               }
+
+                               item = gtk_menu_item_new ();
+                               gtk_container_add (GTK_CONTAINER (item), label);
+
+                               gtk_menu_shell_prepend (GTK_MENU_SHELL (priv->accounts_popup), GTK_WIDGET (item));
+                               g_signal_connect_data (G_OBJECT (item), 
+                                                      "activate", 
+                                                      G_CALLBACK (on_send_receive_csm_activated),
+                                                      g_strdup (account_data->account_name),
+                                                      (GClosureNotify) g_free,
+                                                      0);
+                       }
+                       g_free (item_name);
+               }
+
+               /* Frees */
+               g_free (display_name);
+       }
+
+       gtk_ui_manager_insert_action_group (parent_priv->ui_manager, priv->view_additions_group, 1);
+
+       /* We cannot do this in the loop above because this relies on the action
+        * group being inserted. This makes the default account appear in bold.
+        * I agree it is a rather ugly way, but I don't see another possibility. armin. */
+       for (i = 0; i < num_accounts; i++) {
+               ModestAccountData *account_data = (ModestAccountData *) g_slist_nth_data (accounts, i);
+
+               if(account_data->account_name && default_account &&
+                  strcmp (account_data->account_name, default_account) == 0) {
+                       gchar *item_name = g_strconcat (account_data->account_name, "Menu", NULL);
+
+                       gchar *path = g_strconcat ("/MenuBar/ViewMenu/ViewMenuAdditions/", item_name, NULL);
+                       GtkWidget *item = gtk_ui_manager_get_widget (parent_priv->ui_manager, path);
+                       g_free(path);
+
+                       if (item) {
+                               GtkWidget *child = gtk_bin_get_child (GTK_BIN (item));
+                               if (GTK_IS_LABEL (child)) {
+                                       const gchar *cur_name = gtk_label_get_text (GTK_LABEL (child));
+                                       gchar *bold_name = g_markup_printf_escaped("<b>%s</b>", cur_name);
+                                       gtk_label_set_markup (GTK_LABEL (child), bold_name);
+                                       g_free (bold_name);
+                               }
+                       }
+
+                       path = g_strconcat("/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsMenuAdditions/", item_name, NULL);
+                       item = gtk_ui_manager_get_widget (parent_priv->ui_manager, path);
+                       g_free (path);
+
+                       if (item) {
+                               GtkWidget *child = gtk_bin_get_child (GTK_BIN (item));
+                               if (GTK_IS_LABEL (child)) {
+                                       const gchar *cur_name = gtk_label_get_text (GTK_LABEL (child));
+                                       gchar *bold_name = g_markup_printf_escaped("<b>%s</b>", cur_name);
+                                       gtk_label_set_markup (GTK_LABEL (child), bold_name);
+                                       g_free (bold_name);
+                               }
+                       }
+
+                       g_free(item_name);
+               }
+
+               modest_account_mgr_free_account_data (mgr, account_data);
+       }
+
+       if (priv->accounts_popup) {
+               /* Mandatory in order to view the menu contents */
+               gtk_widget_show_all (priv->accounts_popup);
+
+               /* Setup tap_and_hold just if was not done before*/
+               if (!gtk_menu_get_attach_widget (GTK_MENU (priv->accounts_popup)))
+                       gtk_widget_tap_and_hold_setup (send_receive_button, priv->accounts_popup, NULL, 0);
+       }
+
+       /* Frees */
+       g_slist_free (accounts);
+       g_free (default_account);
+
+
+       /* Make sure that at least one account is viewed if there are any 
+        * accounts, for instance when adding the first account: */
+       set_at_least_one_account_visible (self);
+}
+
+static void
+wrap_in_scrolled_window (GtkWidget *win, GtkWidget *widget)
+{
+       if (!gtk_widget_set_scroll_adjustments (widget, NULL, NULL))
+               gtk_scrolled_window_add_with_viewport
+                       (GTK_SCROLLED_WINDOW(win), widget);
+       else
+               gtk_container_add (GTK_CONTAINER(win),
+                                  widget);
+}
+
+
+typedef struct {
+       TnySendQueue *queue;
+       guint signal;
+} QueueErrorSignal;
+
+static void
+modest_main_window_cleanup_queue_error_signals (ModestMainWindow *self)
+{
+       ModestMainWindowPrivate *priv = MODEST_MAIN_WINDOW_GET_PRIVATE (self);
+
+       GList *oerrsignals = priv->queue_err_signals;
+       while (oerrsignals) {
+               QueueErrorSignal *esignal = (QueueErrorSignal *) oerrsignals->data;
+               g_signal_handler_disconnect (esignal->queue, esignal->signal);
+               g_slice_free (QueueErrorSignal, esignal);
+               oerrsignals = g_list_next (oerrsignals);
+       }
+       g_list_free (priv->queue_err_signals);
+       priv->queue_err_signals = NULL;
+}
+
+
+static void
+_folder_view_csm_menu_activated (GtkWidget *widget, gpointer user_data)
+{
+       g_return_if_fail (MODEST_IS_MAIN_WINDOW (user_data));
+
+       /* Update dimmed */     
+       modest_window_check_dimming_rules_group (MODEST_WINDOW (user_data), "ModestMenuDimmingRules");  
+}
+
+static void
+_header_view_csm_menu_activated (GtkWidget *widget, gpointer user_data)
+{
+       g_return_if_fail (MODEST_IS_MAIN_WINDOW (user_data));
+
+       /* Update visibility */
+
+       /* Update dimmed */     
+       modest_window_check_dimming_rules_group (MODEST_WINDOW (user_data), "ModestMenuDimmingRules");  
+}
+
+static void
+modest_main_window_disconnect_signals (ModestWindow *self)
+{      
+       ModestMainWindowPrivate *priv;  
+       priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
+
+       modest_signal_mgr_disconnect_all_and_destroy (priv->sighandlers);
+       priv->sighandlers = NULL;       
+}
+
+static void
+connect_signals (ModestMainWindow *self)
+{      
+       ModestWindowPrivate *parent_priv;
+       ModestMainWindowPrivate *priv;
+       GtkWidget *menu;
+       
+       priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
+       parent_priv = MODEST_WINDOW_GET_PRIVATE(self);
+
+       /* folder view */
+       
+       priv->sighandlers = 
+               modest_signal_mgr_connect (priv->sighandlers,
+                                          G_OBJECT(priv->folder_view), "key-press-event",
+                                          G_CALLBACK(on_inner_widgets_key_pressed), self);
+       priv->sighandlers = 
+               modest_signal_mgr_connect (priv->sighandlers, G_OBJECT(priv->folder_view), "folder_selection_changed",
+                                          G_CALLBACK (modest_main_window_on_folder_selection_changed), self);
+       priv->sighandlers = 
+               modest_signal_mgr_connect (priv->sighandlers,G_OBJECT(priv->folder_view), "folder-display-name-changed",
+                                          G_CALLBACK (modest_ui_actions_on_folder_display_name_changed), self);
+       priv->sighandlers = 
+               modest_signal_mgr_connect (priv->sighandlers,G_OBJECT (priv->folder_view), "focus-in-event", 
+                                          G_CALLBACK (on_folder_view_focus_in), self);
+
+       /* Folder view CSM */
+       menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/FolderViewCSM");
+       gtk_widget_tap_and_hold_setup (GTK_WIDGET (priv->folder_view), menu, NULL, 0);
+       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers, G_OBJECT(priv->folder_view), "tap-and-hold",
+                                                      G_CALLBACK(_folder_view_csm_menu_activated),
+                                                      self);
+       /* header view */
+       priv->sighandlers = 
+               modest_signal_mgr_connect (priv->sighandlers,G_OBJECT(priv->header_view), "header_selected",
+                                          G_CALLBACK(modest_ui_actions_on_header_selected), self);
+       priv->sighandlers = 
+               modest_signal_mgr_connect (priv->sighandlers,G_OBJECT(priv->header_view), "header_activated",
+                                          G_CALLBACK(modest_ui_actions_on_header_activated), self);
+       priv->sighandlers = 
+               modest_signal_mgr_connect (priv->sighandlers,G_OBJECT(priv->header_view), "item_not_found",
+                                          G_CALLBACK(modest_ui_actions_on_item_not_found), self);
+       priv->sighandlers = 
+               modest_signal_mgr_connect (priv->sighandlers,G_OBJECT(priv->header_view), "key-press-event",
+                                          G_CALLBACK(on_inner_widgets_key_pressed), self);
+       priv->sighandlers = 
+               modest_signal_mgr_connect (priv->sighandlers,G_OBJECT(priv->header_view), "msg_count_changed",
+                                          G_CALLBACK(on_msg_count_changed), self);
+       priv->sighandlers = 
+               modest_signal_mgr_connect (priv->sighandlers,G_OBJECT (priv->header_view), "focus-in-event",
+                                          G_CALLBACK (on_header_view_focus_in), self);
+       priv->sighandlers = 
+               modest_signal_mgr_connect (priv->sighandlers,
+                                          G_OBJECT (priv->header_view), 
+                                          "updating-msg-list",
+                                          G_CALLBACK (on_updating_msg_list), 
+                                          self);
+       
+       /* Header view CSM */
        menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/HeaderViewCSM");
        gtk_widget_tap_and_hold_setup (GTK_WIDGET (priv->header_view), menu, NULL, 0);
-       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,G_OBJECT(priv->header_view), "tap-and-hold",
-                                                      G_CALLBACK(_header_view_csm_menu_activated),
-                                                      self);
+       priv->sighandlers = 
+               modest_signal_mgr_connect (priv->sighandlers,G_OBJECT(priv->header_view), "tap-and-hold",
+                                          G_CALLBACK(_header_view_csm_menu_activated),
+                                          self);
        
        /* window */
-       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,G_OBJECT (self), "window-state-event",
-                         G_CALLBACK (modest_main_window_window_state_event),
-                         NULL);
-       
+       priv->sighandlers = 
+               modest_signal_mgr_connect (priv->sighandlers,G_OBJECT (self), "window-state-event",
+                                          G_CALLBACK (modest_main_window_window_state_event),
+                                          NULL);
+
        /* Mail Operation Queue */
-       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,G_OBJECT (modest_runtime_get_mail_operation_queue ()),
-                                                      "queue-changed", G_CALLBACK (on_queue_changed), self);
+       priv->sighandlers = 
+               modest_signal_mgr_connect (priv->sighandlers,
+                                          G_OBJECT (modest_runtime_get_mail_operation_queue ()),
+                                          "queue-changed", 
+                                          G_CALLBACK (on_queue_changed), self);
        
        /* Track changes in the device name */
-       priv->notification_id =  modest_conf_listen_to_namespace (modest_runtime_get_conf (), 
-                                                                 MODEST_CONF_NAMESPACE);
-       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,G_OBJECT(modest_runtime_get_conf ()),
-                                                      "key_changed", G_CALLBACK (on_configuration_key_changed), 
-                                                      self);
+       priv->sighandlers = 
+               modest_signal_mgr_connect (priv->sighandlers,
+                                          G_OBJECT(modest_runtime_get_conf ()),
+                                          "key_changed", 
+                                          G_CALLBACK (on_configuration_key_changed), 
+                                          self);
        
        /* Track account changes. We need to refresh the toolbar */
-       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,G_OBJECT (modest_runtime_get_account_store ()),
-                                                      "account_inserted", G_CALLBACK (account_number_changed),
-                                                      self);
-       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,G_OBJECT (modest_runtime_get_account_store ()),
-                                                      "account_removed", G_CALLBACK (account_number_changed),
-                                                      self);
+       priv->sighandlers = 
+               modest_signal_mgr_connect (priv->sighandlers,
+                                          G_OBJECT (modest_runtime_get_account_store ()),
+                                          "account_inserted", 
+                                          G_CALLBACK (on_account_inserted),
+                                          self);
+       priv->sighandlers = 
+               modest_signal_mgr_connect (priv->sighandlers,
+                                          G_OBJECT (modest_runtime_get_account_store ()),
+                                          "account_removed", 
+                                          G_CALLBACK (on_account_removed),
+                                          self);
+
+       /* We need to refresh the send & receive menu to change the bold
+        * account when the default account changes. */
+       priv->sighandlers = 
+               modest_signal_mgr_connect (priv->sighandlers,
+                                          G_OBJECT (modest_runtime_get_account_mgr ()),
+                                          "default_account_changed", 
+                                          G_CALLBACK (on_default_account_changed),
+                                          self);
+
        /* Account store */
-       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,G_OBJECT (modest_runtime_get_account_store()), 
-                                                      "password_requested",
-                                                      G_CALLBACK (modest_ui_actions_on_password_requested), self);
+       priv->sighandlers = 
+               modest_signal_mgr_connect (priv->sighandlers,
+                                          G_OBJECT (modest_runtime_get_account_store()), 
+                                          "password_requested",
+                                          G_CALLBACK (modest_ui_actions_on_password_requested), 
+                                          self);
 }
 
 #if 0
@@ -739,8 +955,9 @@ sync_accounts_cb (ModestMainWindow *win)
 }
 #endif
 
-static void on_hildon_program_is_topmost_notify(GObject *self,
-       GParamSpec *propert_param, gpointer user_data)
+static void 
+on_hildon_program_is_topmost_notify(GObject *self,
+                                   GParamSpec *propert_param, gpointer user_data)
 {
        HildonProgram *app = HILDON_PROGRAM (self);
        
@@ -790,7 +1007,7 @@ modest_main_window_on_show (GtkWidget *self, gpointer user_data)
        gtk_widget_show (GTK_WIDGET (priv->folder_view));
 
        /* Connect signals */
-       connect_signals ((ModestMainWindow*)self);
+       connect_signals (MODEST_MAIN_WINDOW (self));
 
        /* Set account store */
        tny_account_store_view_set_account_store (TNY_ACCOUNT_STORE_VIEW (priv->folder_view),
@@ -800,15 +1017,14 @@ modest_main_window_on_show (GtkWidget *self, gpointer user_data)
         * hibernation:  */
        modest_osso_load_state ();
 
-       /* Restore window & widget settings */
-       
+       /* Restore window & widget settings */  
        restore_settings (MODEST_MAIN_WINDOW(self), TRUE);
 
-       /* The UI spec wants us to show a connection dialog when the application is 
-        * started by the user, if there is no connection.
-        * Do this before showing the account wizard, 
-        * because wizard needs a connection to discover capabilities. */
-        modest_platform_connect_and_wait (GTK_WINDOW (self), NULL);
+/*     /\* The UI spec wants us to show a connection dialog when the application is  */
+/*      * started by the user, if there is no connection. */
+/*      * Do this before showing the account wizard,  */
+/*      * because wizard needs a connection to discover capabilities. *\/ */
+/*      modest_platform_connect_and_wait (GTK_WINDOW (self), NULL); */
         
        /* Check if accounts exist and show the account wizard if not */
        gboolean accounts_exist = 
@@ -901,11 +1117,11 @@ modest_main_window_new (void)
        modest_dimming_rules_group_add_rules (menu_rules_group, 
                                              modest_main_window_menu_dimming_entries,
                                              G_N_ELEMENTS (modest_main_window_menu_dimming_entries),
-                                             self);
+                                             MODEST_WINDOW (self));
        modest_dimming_rules_group_add_rules (toolbar_rules_group, 
                                              modest_main_window_toolbar_dimming_entries,
                                              G_N_ELEMENTS (modest_main_window_toolbar_dimming_entries),
-                                             self);
+                                             MODEST_WINDOW (self));
 
        /* Insert dimming rules group for this window */
        modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, menu_rules_group);
@@ -923,11 +1139,11 @@ modest_main_window_new (void)
        action = gtk_ui_manager_get_action (parent_priv->ui_manager, 
                                            "/MenuBar/ViewMenu/ViewShowToolbarMainMenu/ViewShowToolbarNormalScreenMenu");
        gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action),
-                                     modest_conf_get_bool (conf, MODEST_CONF_SHOW_TOOLBAR, NULL));
+                                     modest_conf_get_bool (conf, MODEST_CONF_MAIN_WINDOW_SHOW_TOOLBAR, NULL));
        action = gtk_ui_manager_get_action (parent_priv->ui_manager, 
                                            "/MenuBar/ViewMenu/ViewShowToolbarMainMenu/ViewShowToolbarFullScreenMenu");
        gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action),
-                                     modest_conf_get_bool (conf, MODEST_CONF_SHOW_TOOLBAR_FULLSCREEN, NULL));
+                                     modest_conf_get_bool (conf, MODEST_CONF_MAIN_WINDOW_SHOW_TOOLBAR_FULLSCREEN, NULL));
        hildon_window_set_menu (HILDON_WINDOW (self), GTK_MENU (parent_priv->menubar));
        gtk_widget_show (parent_priv->menubar);
 
@@ -1003,29 +1219,6 @@ modest_main_window_new (void)
        return MODEST_WINDOW(self);
 }
 
-gboolean 
-modest_main_window_close_all (ModestMainWindow *self)
-{
-       GtkWidget *note;
-       GtkResponseType response;
-
-       /* Create the confirmation dialog MSG-NOT308 */
-       note = hildon_note_new_confirmation_add_buttons (GTK_WINDOW (self),
-                                                        _("emev_nc_close_windows"),
-                                                        _("mcen_bd_yes"), GTK_RESPONSE_YES,
-                                                        _("mcen_bd_no"), GTK_RESPONSE_NO,
-                                                        NULL);
-
-       response = gtk_dialog_run (GTK_DIALOG (note));
-       gtk_widget_destroy (GTK_WIDGET (note));
-
-       if (response == GTK_RESPONSE_YES)
-               return TRUE;
-       else
-               return FALSE;
-}
-
-
 void 
 modest_main_window_set_style (ModestMainWindow *self, 
                              ModestMainWindowStyle style)
@@ -1066,24 +1259,6 @@ modest_main_window_set_style (ModestMainWindow *self,
                /* Reparent the contents widget to the main vbox */
                gtk_widget_reparent (priv->contents_widget, priv->main_vbox);
 
-               if (modest_header_view_has_selected_headers (MODEST_HEADER_VIEW (priv->header_view))) {
-                       TnyList *selection = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (priv->header_view));
-                       TnyIterator *iterator = tny_list_create_iterator (selection);
-                       TnyHeader *header;
-                       tny_iterator_first (iterator);
-                       header = TNY_HEADER (tny_iterator_get_current (iterator));
-                       if (tny_header_get_subject (header))
-                               gtk_window_set_title (GTK_WINDOW(self), tny_header_get_subject (header));
-                       else
-                               gtk_window_set_title (GTK_WINDOW (self), _("mail_va_no_subject"));
-                       
-                       if (header)
-                               g_object_unref (header);
-
-                       g_object_unref (iterator);
-                       g_object_unref (selection);
-               }
-
                break;
        case MODEST_MAIN_WINDOW_STYLE_SPLIT:
                /* Remove header view */
@@ -1166,6 +1341,8 @@ modest_main_window_show_toolbar (ModestWindow *self,
        GtkWidget *reply_button = NULL, *menu = NULL;
        GtkWidget *placeholder = NULL;
        gint insert_index;
+       const gchar *action_name;
+       GtkAction *action;
 
        g_return_if_fail (MODEST_IS_MAIN_WINDOW (self));
        priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
@@ -1177,6 +1354,7 @@ modest_main_window_show_toolbar (ModestWindow *self,
        if (!parent_priv->toolbar) {
                parent_priv->toolbar = gtk_ui_manager_get_widget (parent_priv->ui_manager, 
                                                                  "/ToolBar");
+               gtk_widget_set_no_show_all (parent_priv->toolbar, TRUE);
 
                /* Set homogeneous toolbar */
                gtk_container_foreach (GTK_CONTAINER (parent_priv->toolbar), 
@@ -1201,318 +1379,75 @@ modest_main_window_show_toolbar (ModestWindow *self,
                
                /* Connect cancel 'clicked' signal to abort progress mode */
                g_signal_connect(priv->cancel_toolitem, "clicked",
-                                G_CALLBACK(cancel_progressbar),
-                                self);
-               
-               /* Add it to the observers list */
-               priv->progress_widgets = g_slist_prepend(priv->progress_widgets, priv->progress_bar);
-
-               /* Add to window */
-               hildon_window_add_toolbar (HILDON_WINDOW (self), 
-                                          GTK_TOOLBAR (parent_priv->toolbar));
-
-               /* Set reply button tap and hold menu */
-               reply_button = gtk_ui_manager_get_widget (parent_priv->ui_manager, 
-                                                         "/ToolBar/ToolbarMessageReply");
-               menu = gtk_ui_manager_get_widget (parent_priv->ui_manager,
-                                                 "/ToolbarReplyCSM");
-               gtk_widget_tap_and_hold_setup (GTK_WIDGET (reply_button), menu, NULL, 0);
-
-               /* Set send & receive button tap and hold menu */
-               account_number_changed (TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()),
-                                  NULL, self);
-       }
-
-       if (show_toolbar) {
-               /* Quick hack: this prevents toolbar icons "dance" when progress bar show status is changed */ 
-               /* TODO: resize mode migth be GTK_RESIZE_QUEUE, in order to avoid unneccesary shows */
-               gtk_container_set_resize_mode (GTK_CONTAINER(parent_priv->toolbar), GTK_RESIZE_IMMEDIATE);
-
-               gtk_widget_show (GTK_WIDGET (parent_priv->toolbar));
-               set_toolbar_mode (MODEST_MAIN_WINDOW(self), TOOLBAR_MODE_NORMAL);
-       } else
-               gtk_widget_hide (GTK_WIDGET (parent_priv->toolbar));
-
-}
-
-static gint
-compare_display_names (ModestAccountData *a,
-                      ModestAccountData *b)
-{
-       return strcmp (a->display_name, b->display_name);
-}
-
-static void 
-account_number_changed (TnyAccountStore *account_store, 
-                       const gchar *account_name,
-                       gpointer user_data)
-{      
-       GSList *account_names, *iter, *accounts;
-       ModestMainWindow *self;
-       ModestMainWindowPrivate *priv;
-       ModestWindowPrivate *parent_priv;
-       ModestAccountMgr *mgr;
-       gint i, num_accounts;                                   
-       GtkActionGroup *action_group;
-       GList *groups;
-       gchar *default_account;
-       GtkWidget *send_receive_button, *item;
-       GtkAction *send_receive_all = NULL;
-               
-       self = MODEST_MAIN_WINDOW (user_data);
-       priv = MODEST_MAIN_WINDOW_GET_PRIVATE (self);
-       parent_priv = MODEST_WINDOW_GET_PRIVATE (self);
-
-       /* Get enabled account IDs */
-       mgr = modest_runtime_get_account_mgr ();
-       account_names = modest_account_mgr_account_names (mgr, TRUE);
-       iter = account_names;
-       accounts = NULL;
-
-       while (iter) {
-               ModestAccountData *account_data = 
-                       modest_account_mgr_get_account_data (mgr, (gchar*) iter->data);
-               accounts = g_slist_prepend (accounts, account_data);
-
-               iter = iter->next;
-       }
-       modest_account_mgr_free_account_names (account_names);
-       account_names = NULL;
-
-       /* Order the list of accounts by its display name */
-       accounts = g_slist_sort (accounts, (GCompareFunc) compare_display_names);
-       num_accounts = g_slist_length (accounts);
-
-       send_receive_all = gtk_ui_manager_get_action (parent_priv->ui_manager, 
-                                                     "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsSendReceiveAllMenu");
-       gtk_action_set_visible (send_receive_all, num_accounts > 1);
-
-       /* Delete old send&receive popup items. We can not just do a
-          menu_detach because it does not work well with
-          tap_and_hold */
-       if (priv->accounts_popup)
-               gtk_container_foreach (GTK_CONTAINER (priv->accounts_popup), 
-                                      (GtkCallback) gtk_widget_destroy, NULL);
-
-       /* Delete old entries in the View menu. Do not free groups, it
-          belongs to Gtk+ */
-       groups = gtk_ui_manager_get_action_groups (parent_priv->ui_manager);
-       while (groups) {
-               if (!strcmp (MODEST_MAIN_WINDOW_ACTION_GROUP_ADDITIONS,
-                            gtk_action_group_get_name (GTK_ACTION_GROUP (groups->data)))) {
-                       gtk_ui_manager_remove_action_group (parent_priv->ui_manager, 
-                                                           GTK_ACTION_GROUP (groups->data));
-                       groups = NULL;
-                       /* Remove uis */
-                       if (priv->merge_ids) {
-                               for (i = 0; i < priv->merge_ids->len; i++)
-                                       gtk_ui_manager_remove_ui (parent_priv->ui_manager, priv->merge_ids->data[i]);
-                               g_byte_array_free (priv->merge_ids, TRUE);
-                       }
-                       /* We need to call this in order to ensure
-                          that the new actions are added in the right
-                          order (alphabetical */
-                       gtk_ui_manager_ensure_update (parent_priv->ui_manager);
-               } else 
-                       groups = g_list_next (groups);
-       }
-       priv->merge_ids = g_byte_array_sized_new (num_accounts);
-
-       /* Get send receive button */
-       send_receive_button = gtk_ui_manager_get_widget (parent_priv->ui_manager,
-                                                         "/ToolBar/ToolbarSendReceive");
-
-       /* Create the menu */
-       if (num_accounts > 1) {
-               if (!priv->accounts_popup)
-                       priv->accounts_popup = gtk_menu_new ();
-               item = gtk_menu_item_new_with_label (_("mcen_me_toolbar_sendreceive_all"));
-               gtk_menu_shell_append (GTK_MENU_SHELL (priv->accounts_popup), GTK_WIDGET (item));
-               g_signal_connect (G_OBJECT (item), 
-                                 "activate", 
-                                 G_CALLBACK (on_send_receive_csm_activated),
-                                 NULL);
-               item = gtk_separator_menu_item_new ();
-               gtk_menu_shell_prepend (GTK_MENU_SHELL (priv->accounts_popup), GTK_WIDGET (item));
-       }
-
-       /* Create a new action group */
-       default_account = modest_account_mgr_get_default_account (mgr);
-       action_group = gtk_action_group_new (MODEST_MAIN_WINDOW_ACTION_GROUP_ADDITIONS);
-       for (i = 0; i < num_accounts; i++) {
-               gchar *display_name = NULL;
-               
-               ModestAccountData *account_data = (ModestAccountData *) g_slist_nth_data (accounts, i);
-
-               /* Create display name. The UI specification specifies a different format string 
-                * to use for the default account, though both seem to be "%s", so 
-                * I don't see what the point is. murrayc. */
-               if (default_account && account_data->account_name && 
-                       !(strcmp (default_account, account_data->account_name) == 0)) {
-                       display_name = g_strdup_printf (_("mcen_me_toolbar_sendreceive_default"), 
-                                                       account_data->display_name);
-               }
-               else {
-                       display_name = g_strdup_printf (_("mcen_me_toolbar_sendreceive_mailbox_n"), 
-                                                       account_data->display_name);
-               }
-
-               /* Create action and add it to the action group. The
-                  action name must be the account name, this way we
-                  could know in the handlers the account to show */
-               if(account_data && account_data->account_name) {
-                       gchar* item_name, *refresh_action_name;
-                       guint8 merge_id = 0;
-                       GtkAction *view_account_action, *refresh_account_action;
-
-                       view_account_action = gtk_action_new (account_data->account_name,
-                                                             display_name, NULL, NULL);
-                       gtk_action_group_add_action (action_group, view_account_action);
-
-                       /* Add ui from account data. We allow 2^9-1 account
-                          changes in a single execution because we're
-                          downcasting the guint to a guint8 in order to use a
-                          GByteArray. It should be enough. */
-                       item_name = g_strconcat (account_data->account_name, "Menu", NULL);
-                       merge_id = (guint8) gtk_ui_manager_new_merge_id (parent_priv->ui_manager);
-                       priv->merge_ids = g_byte_array_append (priv->merge_ids, &merge_id, 1);
-                       gtk_ui_manager_add_ui (parent_priv->ui_manager,
-                                              merge_id,
-                                              "/MenuBar/ViewMenu/ViewMenuAdditions",
-                                              item_name,
-                                              account_data->account_name,
-                                              GTK_UI_MANAGER_MENUITEM,
-                                              FALSE);
-
-                       /* Connect the action signal "activate" */
-                       g_signal_connect (G_OBJECT (view_account_action),
-                                         "activate",
-                                         G_CALLBACK (on_show_account_action_activated),
-                                         self);
-
-                       /* Create the items for the Tools->Send&Receive submenu */
-                       refresh_action_name = g_strconcat ("SendReceive", account_data->account_name, NULL);
-                       refresh_account_action = gtk_action_new ((const gchar*) refresh_action_name, 
-                                                                display_name, NULL, NULL);
-                       printf("DEBUG: %s: menu display_name=%s\n", __FUNCTION__, display_name);
-                       gtk_action_group_add_action (action_group, refresh_account_action);
-
-                       merge_id = (guint8) gtk_ui_manager_new_merge_id (parent_priv->ui_manager);
-                       priv->merge_ids = g_byte_array_append (priv->merge_ids, &merge_id, 1);
-                       gtk_ui_manager_add_ui (parent_priv->ui_manager, 
-                                              merge_id,
-                                              "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsMenuAdditions",
-                                              item_name,
-                                              refresh_action_name,
-                                              GTK_UI_MANAGER_MENUITEM,
-                                              FALSE);
-                       g_free (refresh_action_name);
-
-                       g_signal_connect_data (G_OBJECT (refresh_account_action), 
-                                              "activate", 
-                                              G_CALLBACK (on_refresh_account_action_activated), 
-                                              g_strdup (account_data->account_name),
-                                              (GClosureNotify) g_free,
-                                              0);
-
-                       /* Create item and add it to the send&receive
-                          CSM. If there is only one account then
-                          it'll be no menu */
-                       if (priv->accounts_popup) {
-                               GtkWidget *label = gtk_label_new(NULL);
-                               gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-                               if (default_account && (strcmp(account_data->account_name, default_account) == 0))
-                               {
-                                       gchar *escaped = g_markup_printf_escaped ("<b>%s</b>", display_name);
-                                       gtk_label_set_markup (GTK_LABEL (label), escaped);
-                                       g_free (escaped);
-                               }
-                               else
-                               {
-                                       gtk_label_set_text (GTK_LABEL (label), display_name);
-                               }
-
-                               item = gtk_menu_item_new ();
-                               gtk_container_add (GTK_CONTAINER (item), label);
-
-                               gtk_menu_shell_prepend (GTK_MENU_SHELL (priv->accounts_popup), GTK_WIDGET (item));
-                               g_signal_connect_data (G_OBJECT (item), 
-                                                      "activate", 
-                                                      G_CALLBACK (on_send_receive_csm_activated),
-                                                      g_strdup (account_data->account_name),
-                                                      (GClosureNotify) g_free,
-                                                      0);
-                       }
-                       g_free (item_name);
-               }
-
-               /* Frees */
-               g_free (display_name);
-       }
-
-       gtk_ui_manager_insert_action_group (parent_priv->ui_manager, action_group, 1);
-
-       /* We cannot do this in the loop above because this relies on the action
-        * group being inserted. This makes the default account appear in bold.
-        * I agree it is a rather ugly way, but I don't see another possibility. armin. */
-       for (i = 0; i < num_accounts; i++) {
-               ModestAccountData *account_data = (ModestAccountData *) g_slist_nth_data (accounts, i);
-
-               if(account_data->account_name && default_account &&
-                  strcmp (account_data->account_name, default_account) == 0) {
-                       gchar *item_name = g_strconcat (account_data->account_name, "Menu", NULL);
-
-                       gchar *path = g_strconcat ("/MenuBar/ViewMenu/ViewMenuAdditions/", item_name, NULL);
-                       GtkWidget *item = gtk_ui_manager_get_widget (parent_priv->ui_manager, path);
-                       g_free(path);
-
-                       if (item) {
-                               GtkWidget *child = gtk_bin_get_child (GTK_BIN (item));
-                               if (GTK_IS_LABEL (child)) {
-                                       const gchar *cur_name = gtk_label_get_text (GTK_LABEL (child));
-                                       gchar *bold_name = g_markup_printf_escaped("<b>%s</b>", cur_name);
-                                       gtk_label_set_markup (GTK_LABEL (child), bold_name);
-                                       g_free (bold_name);
-                               }
-                       }
-
-                       path = g_strconcat("/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsMenuAdditions/", item_name, NULL);
-                       item = gtk_ui_manager_get_widget (parent_priv->ui_manager, path);
-                       g_free (path);
+                                G_CALLBACK(cancel_progressbar),
+                                self);
+               
+               /* Add it to the observers list */
+               priv->progress_widgets = g_slist_prepend(priv->progress_widgets, priv->progress_bar);
 
-                       if (item) {
-                               GtkWidget *child = gtk_bin_get_child (GTK_BIN (item));
-                               if (GTK_IS_LABEL (child)) {
-                                       const gchar *cur_name = gtk_label_get_text (GTK_LABEL (child));
-                                       gchar *bold_name = g_markup_printf_escaped("<b>%s</b>", cur_name);
-                                       gtk_label_set_markup (GTK_LABEL (child), bold_name);
-                                       g_free (bold_name);
-                               }
-                       }
+               /* Add to window */
+               hildon_window_add_toolbar (HILDON_WINDOW (self), 
+                                          GTK_TOOLBAR (parent_priv->toolbar));
 
-                       g_free(item_name);
-               }
+               /* Set reply button tap and hold menu */
+               reply_button = gtk_ui_manager_get_widget (parent_priv->ui_manager, 
+                                                         "/ToolBar/ToolbarMessageReply");
+               menu = gtk_ui_manager_get_widget (parent_priv->ui_manager,
+                                                 "/ToolbarReplyCSM");
+               gtk_widget_tap_and_hold_setup (GTK_WIDGET (reply_button), menu, NULL, 0);
 
-               modest_account_mgr_free_account_data (mgr, account_data);
+               /* Set send & receive button tap and hold menu */
+               update_menus (MODEST_MAIN_WINDOW (self));
        }
+       
+       if (show_toolbar) {
+               /* Quick hack: this prevents toolbar icons "dance" when progress bar show status is changed */ 
+               /* TODO: resize mode migth be GTK_RESIZE_QUEUE, in order to avoid unneccesary shows */
+               gtk_container_set_resize_mode (GTK_CONTAINER(parent_priv->toolbar), GTK_RESIZE_IMMEDIATE);
 
-       if (priv->accounts_popup) {
-               /* Mandatory in order to view the menu contents */
-               gtk_widget_show_all (priv->accounts_popup);
+               gtk_widget_show (GTK_WIDGET (parent_priv->toolbar));
+               set_toolbar_mode (MODEST_MAIN_WINDOW(self), TOOLBAR_MODE_NORMAL);
+       } else {
+               gtk_widget_hide (GTK_WIDGET (parent_priv->toolbar));
 
-               /* Setup tap_and_hold just if was not done before*/
-               if (!gtk_menu_get_attach_widget (GTK_MENU (priv->accounts_popup)))
-                       gtk_widget_tap_and_hold_setup (send_receive_button, priv->accounts_popup, NULL, 0);
        }
 
-       /* Frees */
-       g_slist_free (accounts);
-       g_free (default_account);
+       /* Update also the actions (to update the toggles in the
+          menus), we have to do it manually because some other window
+          of the same time could have changed it (remember that the
+          toolbar fullscreen mode is shared by all the windows of the
+          same type */
+       if (modest_window_mgr_get_fullscreen_mode (modest_runtime_get_window_mgr ()))
+               action_name = "/MenuBar/ViewMenu/ViewShowToolbarMainMenu/ViewShowToolbarFullScreenMenu";
+       else
+               action_name = "/MenuBar/ViewMenu/ViewShowToolbarMainMenu/ViewShowToolbarNormalScreenMenu";
 
+       action = gtk_ui_manager_get_action (parent_priv->ui_manager, action_name);
+       modest_maemo_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action),
+                                                           show_toolbar);
+}
 
-       /* Make sure that at least one account is viewed if there are any 
-        * accounts, for instance when adding the first account: */
-       set_at_least_one_account_visible (self);
+static void
+on_account_inserted (TnyAccountStore *accoust_store,
+                     TnyAccount *account,
+                     gpointer user_data)
+{
+       update_menus (MODEST_MAIN_WINDOW (user_data));
+}
+
+static void
+on_default_account_changed (ModestAccountMgr* mgr,
+                           gpointer user_data)
+{
+       update_menus (MODEST_MAIN_WINDOW (user_data));
+}
+
+static void
+on_account_removed (TnyAccountStore *accoust_store,
+                     TnyAccount *account,
+                     gpointer user_data)
+{
+       update_menus (MODEST_MAIN_WINDOW (user_data));
 }
 
 /* 
@@ -1540,9 +1475,17 @@ on_inner_widgets_key_pressed (GtkWidget *widget,
        if (priv->style == MODEST_MAIN_WINDOW_STYLE_SIMPLE)
                return FALSE;
 
-       if (MODEST_IS_HEADER_VIEW (widget) && event->keyval == GDK_Left)
-               gtk_widget_grab_focus (GTK_WIDGET (priv->folder_view));
-       else if (MODEST_IS_FOLDER_VIEW (widget) && event->keyval == GDK_Right)
+       if (MODEST_IS_HEADER_VIEW (widget)) {
+               if (event->keyval == GDK_Left)
+                       gtk_widget_grab_focus (GTK_WIDGET (priv->folder_view));
+               else if ((event->keyval == GDK_Return)||(event->keyval == GDK_KP_Enter)) {
+                       guint selected_headers = modest_header_view_count_selected_headers (MODEST_HEADER_VIEW (widget));
+                       if (selected_headers > 1) {
+                               hildon_banner_show_information (NULL, NULL, _("mcen_ib_select_one_message"));
+                               return TRUE;
+                       }
+               }
+       } else if (MODEST_IS_FOLDER_VIEW (widget) && event->keyval == GDK_Right)
                gtk_widget_grab_focus (GTK_WIDGET (priv->header_view));
 
        return FALSE;
@@ -1570,18 +1513,14 @@ create_empty_view (void)
        return GTK_WIDGET(align);
 }
 
-static GtkWidget *
-create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
+/*
+ * Free the returned string
+ */
+static gchar *
+get_gray_color_markup (GtkWidget *styled_widget)
 {
-       /* TODO: Clean up this function. It's a mess, with lots of copy/paste. murrayc. */
-       
-       GtkWidget *vbox;
-       GtkWidget *label_w;
-       gchar *label;
        gchar *gray_color_markup;
 
-       vbox = gtk_vbox_new (FALSE, 0);
-
        /* Obtain the secondary text color. We need a realized widget, that's why 
           we get styled_widget from outside */
 #ifndef MODEST_HAVE_HILDON0_WIDGETS
@@ -1589,15 +1528,51 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
        gtk_style_lookup_color (styled_widget->style, "SecondaryTextColor", &color);
        gray_color_markup = modest_text_utils_get_color_string (&color);
 #else
-       // gray_color_markup is freed below
        gray_color_markup = g_strdup ("#BBBBBB");
 #endif 
-       /* Account description: */
+       return gray_color_markup;
+}
+
+/*
+ * Free the returned string
+ */
+static gchar*
+create_device_name_visual_string (const gchar *device_name,
+                                 const gchar *gray_color_markup)
+{
+       gchar *tmp, *label;
+
+       /* We have to use "" to fill the %s of the translation. We can
+          not just use the device name because the device name is
+          shown in a different color, so it could not be included
+          into the <span> tag */
+       tmp = g_strdup_printf (_("mcen_fi_localroot_description"), "");
+       label = g_markup_printf_escaped ("<span color='%s'>%s</span>%s", 
+                                        gray_color_markup, 
+                                        tmp, 
+                                        device_name);
+       g_free (tmp);
+
+       return label;
+}
+
+static GtkWidget *
+create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
+{
+       /* TODO: Clean up this function. It's a mess, with lots of copy/paste. murrayc. */
        
+       GtkWidget *vbox;
+       GtkWidget *label_w;
+       gchar *label;
+       gchar *gray_color_markup;
+
+       vbox = gtk_vbox_new (FALSE, 0);
+
+       gray_color_markup = get_gray_color_markup (styled_widget);
+
+       /* Account description: */
        if (modest_tny_account_is_virtual_local_folders (account)
                || (modest_tny_account_is_memory_card_account (account))) {
-               gchar *tmp;
-               /* Local folders: */
        
                /* Get device name */
                gchar *device_name = NULL;
@@ -1606,11 +1581,9 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
                                                      MODEST_CONF_DEVICE_NAME, NULL);
                else
                        device_name = g_strdup (tny_account_get_name (account));
-                                                     
-               tmp = g_strdup_printf (_("mcen_fi_localroot_description"), ""); //TODO: Why the ""?
-               label = g_markup_printf_escaped ("<span color='%s'>%s</span>%s",
-                                                gray_color_markup, tmp, device_name);
-               g_free (tmp);
+
+               label = create_device_name_visual_string ((const gchar *) device_name, 
+                                                         (const gchar *) gray_color_markup);
                label_w = gtk_label_new (NULL);
                gtk_label_set_markup (GTK_LABEL (label_w), label);
                gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
@@ -1686,12 +1659,11 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
                TnyAccount *account = TNY_ACCOUNT(folder_store);
                
                time_t last_updated;
-               gchar *last_updated_string;
+               const gchar *last_updated_string;
                /* Get last updated from configuration */
-               last_updated = modest_account_mgr_get_int (modest_runtime_get_account_mgr (), 
-                                                         tny_account_get_id (account), 
-                                                         MODEST_ACCOUNT_LAST_UPDATED, 
-                                                         TRUE);
+               last_updated = modest_account_mgr_get_last_updated (modest_runtime_get_account_mgr (), 
+                                                                   tny_account_get_id (account));
+
                if (last_updated > 0) 
                        last_updated_string = modest_text_utils_get_display_date(last_updated);
                else
@@ -1702,7 +1674,6 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
                label_w = gtk_label_new (NULL);
                gtk_label_set_markup (GTK_LABEL (label_w), label);
                gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
-               g_free (last_updated_string);
                g_free (label);
        }
 
@@ -1768,13 +1739,13 @@ modest_main_window_notify_send_receive_completed (ModestMainWindow *self)
 
 
 static void
-_on_msg_count_changed (ModestHeaderView *header_view,
-                      TnyFolder *folder,
-                      TnyFolderChange *change,
-                      ModestMainWindow *main_window)
+on_msg_count_changed (ModestHeaderView *header_view,
+                     TnyFolder *folder,
+                     TnyFolderChange *change,
+                     ModestMainWindow *main_window)
 {
-       printf ("DEBUG: %s\n", __FUNCTION__);
        gboolean folder_empty = FALSE;
+       gboolean all_marked_as_deleted = FALSE;
        TnyFolderChangeChanged changed; 
        ModestMainWindowPrivate *priv;
        
@@ -1787,12 +1758,19 @@ _on_msg_count_changed (ModestHeaderView *header_view,
        
        /* If something changes */
        if ((changed) & TNY_FOLDER_CHANGE_CHANGED_ALL_COUNT)
-               folder_empty = (tny_folder_change_get_new_all_count (change) == 0);     
+               folder_empty = (tny_folder_change_get_new_all_count (change) == 0);
        else
                folder_empty = (tny_folder_get_all_count (TNY_FOLDER (folder)) == 0);
        
-       printf ("DEBUG: %s: folder_empty=%d\n", __FUNCTION__, folder_empty);
+/*     Check header removed  (hide marked as DELETED headers) */
+       if (changed & TNY_FOLDER_CHANGE_CHANGED_EXPUNGED_HEADERS) {
+               modest_header_view_refilter (MODEST_HEADER_VIEW(priv->header_view));
+       }
 
+       /* Check if all messages are marked to be deleted */
+       all_marked_as_deleted = modest_header_view_is_empty (header_view);
+       folder_empty = folder_empty || all_marked_as_deleted ;
+       
        /* Set contents style of headers view */
        if (folder_empty)  {
                modest_main_window_set_contents_style (main_window,
@@ -1847,20 +1825,22 @@ modest_main_window_set_contents_style (ModestMainWindow *self,
                break;
        case MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS:
        {
-               TnyFolderStore *selected_folderstore = 
-                       modest_folder_view_get_selected (priv->folder_view);
-               if (TNY_IS_ACCOUNT (selected_folderstore)) {    
-                 priv->details_widget = create_details_widget (GTK_WIDGET (self),
+               /* if we're started without main win, there may not be a folder
+                * view. this fixes a GLib-Critical */
+               if (priv->folder_view) {
+                       TnyFolderStore *selected_folderstore = 
+                               modest_folder_view_get_selected (priv->folder_view);
+                       if (TNY_IS_ACCOUNT (selected_folderstore)) {    
+                               priv->details_widget = create_details_widget (GTK_WIDGET (self),
                                                                TNY_ACCOUNT (selected_folderstore));
-
-                       wrap_in_scrolled_window (priv->contents_widget, 
-                                        priv->details_widget);
+                               
+                               wrap_in_scrolled_window (priv->contents_widget, 
+                                                        priv->details_widget);
+                       }
+                       g_object_unref (selected_folderstore);
+                       modest_maemo_set_thumbable_scrollbar (GTK_SCROLLED_WINDOW(priv->contents_widget),
+                                                             FALSE);
                }
-               g_object_unref (selected_folderstore);
-               modest_maemo_set_thumbable_scrollbar (GTK_SCROLLED_WINDOW(priv->contents_widget),
-                                                     FALSE);
-
-               
                break;
        }
        case MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY:
@@ -1896,23 +1876,23 @@ on_configuration_key_changed (ModestConf* conf,
                              ModestMainWindow *self)
 {
        ModestMainWindowPrivate *priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
-       TnyAccount *account;
+       TnyAccount *account = NULL;
 
-       if (!key || 
-           priv->notification_id != id ||
-           strcmp (key, MODEST_CONF_DEVICE_NAME))
+       if (!key || strcmp (key, MODEST_CONF_DEVICE_NAME))
                return;
 
        if (priv->contents_style != MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS)
                return;
 
-       account = (TnyAccount *) modest_folder_view_get_selected (priv->folder_view);
-       if (TNY_IS_ACCOUNT (account) &&
-           !strcmp (tny_account_get_id (account), MODEST_LOCAL_FOLDERS_ACCOUNT_ID)) {
+       if (priv->folder_view) 
+               account = (TnyAccount *) modest_folder_view_get_selected (priv->folder_view);
+
+       if (account && TNY_IS_ACCOUNT (account) &&
+           strcmp (tny_account_get_id (account), MODEST_LOCAL_FOLDERS_ACCOUNT_ID) == 0) {
                GList *children;
                GtkLabel *label;
                const gchar *device_name;
-               gchar *new_text;
+               gchar *new_text, *gray_color_markup;
                
                /* Get label */
                children = gtk_container_get_children (GTK_CONTAINER (priv->details_widget));
@@ -1920,14 +1900,14 @@ on_configuration_key_changed (ModestConf* conf,
                
                device_name = modest_conf_get_string (modest_runtime_get_conf(),
                                                      MODEST_CONF_DEVICE_NAME, NULL);
+
+               gray_color_markup = get_gray_color_markup (GTK_WIDGET (self));          
+               new_text = create_device_name_visual_string (device_name, gray_color_markup);
                
-               new_text = g_strdup_printf ("%s: %s",
-                                           _("mcen_fi_localroot_description"),
-                                           device_name);
-               
-               gtk_label_set_text (label, new_text);
+               gtk_label_set_markup (label, new_text);
                gtk_widget_show (GTK_WIDGET (label));
                
+               g_free (gray_color_markup);
                g_free (new_text);
                g_list_free (children);
        }
@@ -1979,6 +1959,9 @@ set_toolbar_mode (ModestMainWindow *self,
        /* Sets current toolbar mode */
        priv->current_toolbar_mode = mode;
 
+        /* Checks the dimming rules */
+        modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (self));
+
        /* Show and hide toolbar items */
        switch (mode) {
        case TOOLBAR_MODE_NORMAL:
@@ -1995,19 +1978,6 @@ set_toolbar_mode (ModestMainWindow *self,
                
                if (cancel_action)
                        gtk_action_set_visible (cancel_action, FALSE);
-/*             if (priv->sort_toolitem) */
-/*                     gtk_widget_show (priv->sort_toolitem); */
-               
-/*             if (priv->refresh_toolitem) */
-/*                     gtk_widget_show (priv->refresh_toolitem); */
-                       
-/*             if (priv->progress_toolitem) */
-/*                     gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), FALSE); */
-/*             if (priv->progress_bar) */
-/*                     gtk_widget_hide (priv->progress_bar); */
-                       
-/*             if (priv->cancel_toolitem) */
-/*                     gtk_widget_hide (priv->cancel_toolitem); */
 
                /* Hide toolbar if optimized view is enabled */
                if (priv->optimized_view)
@@ -2027,20 +1997,6 @@ set_toolbar_mode (ModestMainWindow *self,
                if (priv->progress_bar)
                        gtk_widget_show (priv->progress_bar);
 
-/*             if (priv->sort_toolitem) */
-/*                     gtk_widget_hide (priv->sort_toolitem); */
-               
-/*             if (priv->refresh_toolitem) */
-/*                     gtk_widget_hide (priv->refresh_toolitem); */
-               
-/*             if (priv->progress_toolitem) */
-/*                     gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), TRUE); */
-/*             if (priv->progress_bar) */
-/*                     gtk_widget_show (priv->progress_bar); */
-                       
-/*             if (priv->cancel_toolitem) */
-/*                     gtk_widget_show (priv->cancel_toolitem); */
-
                /* Show toolbar if it's hiden (optimized view ) */
                if (priv->optimized_view)
                        gtk_widget_show (GTK_WIDGET (parent_priv->toolbar));
@@ -2050,6 +2006,17 @@ set_toolbar_mode (ModestMainWindow *self,
        }
 }
 
+gboolean
+modest_main_window_transfer_mode_enabled (ModestMainWindow *self)
+{
+       ModestMainWindowPrivate *priv;
+
+       g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (self), FALSE);
+       priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
+
+       return priv->current_toolbar_mode == TOOLBAR_MODE_TRANSFER;
+}
+
 static void
 cancel_progressbar (GtkToolButton *toolbutton,
                    ModestMainWindow *self)
@@ -2089,77 +2056,166 @@ observers_empty (ModestMainWindow *self)
        return is_empty;
 }
 
-static void
-on_queue_changed (ModestMailOperationQueue *queue,
-                 ModestMailOperation *mail_op,
-                 ModestMailOperationQueueNotification type,
-                 ModestMainWindow *self)
+
+/**
+ * Gets the toolbar mode needed for each mail operation. It stores in
+ * @mode_changed if the toolbar mode has changed or not
+ */
+static ModestToolBarModes
+get_toolbar_mode_from_mail_operation (ModestMainWindow *self,
+                                     ModestMailOperation *mail_op,
+                                     gboolean *mode_changed)
 {
-       ModestMainWindowPrivate *priv;
-       ModestMailOperationTypeOperation op_type;
        ModestToolBarModes mode;
-       GSList *tmp;
-       gboolean mode_changed = FALSE;
-/*     ModestMailOperationStatus status; */
+       ModestMainWindowPrivate *priv;
+
+       *mode_changed = FALSE;
+       priv = MODEST_MAIN_WINDOW_GET_PRIVATE (self);
 
-       g_return_if_fail (MODEST_IS_MAIN_WINDOW (self));
-       priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
-              
        /* Get toolbar mode from operation id*/
-       op_type = modest_mail_operation_get_type_operation (mail_op);
-       switch (op_type) {
-/*     case MODEST_MAIL_OPERATION_TYPE_SEND: */
+       switch (modest_mail_operation_get_type_operation (mail_op)) {
        case MODEST_MAIL_OPERATION_TYPE_RECEIVE:
        case MODEST_MAIL_OPERATION_TYPE_OPEN:
                mode = TOOLBAR_MODE_TRANSFER;
                if (priv->current_toolbar_mode == TOOLBAR_MODE_NORMAL)
-                       mode_changed = TRUE;
+                       *mode_changed = TRUE;
                break;
        default:
-               mode = TOOLBAR_MODE_NORMAL;
-               
+               mode = TOOLBAR_MODE_NORMAL;             
        }
-               
-                      
+       return mode;
+}
+
+static void 
+on_mail_operation_started (ModestMailOperation *mail_op,
+                          gpointer user_data)
+{
+       ModestMainWindow *self;
+       ModestMailOperationTypeOperation op_type;
+       ModestMainWindowPrivate *priv;
+       ModestToolBarModes mode;
+       GSList *tmp;
+       gboolean mode_changed = FALSE;
+       TnyAccount *account;
+
+       self = MODEST_MAIN_WINDOW (user_data);
+       priv = MODEST_MAIN_WINDOW_GET_PRIVATE (self);
+
+       /* Do not show progress for receiving operations if the
+          account is the local account or the MMC one */
+       op_type = modest_mail_operation_get_type_operation (mail_op);
+       account = modest_mail_operation_get_account (mail_op);
+       if (account && op_type == MODEST_MAIL_OPERATION_TYPE_RECEIVE) {
+               gboolean is_remote;
+
+               is_remote = !(modest_tny_account_is_virtual_local_folders (account) ||
+                             modest_tny_account_is_memory_card_account (account));
+               g_object_unref (account);
+               if (!is_remote)
+                       return;
+       }
+              
+       /* Get toolbar mode from operation id*/
+       mode = get_toolbar_mode_from_mail_operation (self, mail_op, &mode_changed);
+
        /* Add operation observers and change toolbar if neccessary*/
        tmp = priv->progress_widgets;
-       switch (type) {
-       case MODEST_MAIL_OPERATION_QUEUE_OPERATION_ADDED:
-               if (mode == TOOLBAR_MODE_TRANSFER) {
-                       if (mode_changed)
-                               set_toolbar_transfer_mode(self);                    
-                       while (tmp) {
-                               modest_progress_object_add_operation (MODEST_PROGRESS_OBJECT (tmp->data),
-                                                                     mail_op);
-                               tmp = g_slist_next (tmp);
-                       }
+       if (mode == TOOLBAR_MODE_TRANSFER) {
+               if (mode_changed)
+                       set_toolbar_transfer_mode(self);                    
+
+               while (tmp) {
+                       modest_progress_object_add_operation (MODEST_PROGRESS_OBJECT (tmp->data),
+                                                             mail_op);
+                       tmp = g_slist_next (tmp);
                }
-               break;
-       case MODEST_MAIL_OPERATION_QUEUE_OPERATION_REMOVED:
-               /* Change toolbar mode */
-               if (mode == TOOLBAR_MODE_TRANSFER) {                    
-                       while (tmp) {
-                               modest_progress_object_remove_operation (MODEST_PROGRESS_OBJECT (tmp->data),
-                                                                        mail_op);
-                               tmp = g_slist_next (tmp);
-                       }
-                       
-                       /* If no more operations are being observed, NORMAL mode is enabled again */
-                       if (observers_empty (self)) {
-                               set_toolbar_mode (self, TOOLBAR_MODE_NORMAL);
-                               
-                       }
+       }
+}
+
+static void 
+on_mail_operation_finished (ModestMailOperation *mail_op,
+                           gpointer user_data)
+{
+       ModestToolBarModes mode;
+       ModestMailOperationTypeOperation op_type;
+       GSList *tmp = NULL;
+       ModestMainWindow *self;
+       gboolean mode_changed;
+       TnyAccount *account;
+       ModestMainWindowPrivate *priv;
+
+       self = MODEST_MAIN_WINDOW (user_data);
+       priv = MODEST_MAIN_WINDOW_GET_PRIVATE (self);
+
+       /* The mail operation was not added to the progress objects if
+          the account was the local account or the MMC one */
+       op_type = modest_mail_operation_get_type_operation (mail_op);
+       account = modest_mail_operation_get_account (mail_op);
+       if (account && op_type == MODEST_MAIL_OPERATION_TYPE_RECEIVE) {
+               gboolean is_remote;
+
+               is_remote = !(modest_tny_account_is_virtual_local_folders (account) ||
+                             modest_tny_account_is_memory_card_account (account));
+               g_object_unref (account);
+               if (!is_remote)
+                       return;
+       }
+
+       /* Get toolbar mode from operation id*/
+       mode = get_toolbar_mode_from_mail_operation (self, mail_op, &mode_changed);
+
+       /* Change toolbar mode */
+       tmp = priv->progress_widgets;
+       if (mode == TOOLBAR_MODE_TRANSFER) {                    
+               while (tmp) {
+                       modest_progress_object_remove_operation (MODEST_PROGRESS_OBJECT (tmp->data),
+                                                                mail_op);
+                       tmp = g_slist_next (tmp);
+               }
+               
+               /* If no more operations are being observed, NORMAL mode is enabled again */
+               if (observers_empty (self)) {
+                       set_toolbar_mode (self, TOOLBAR_MODE_NORMAL);                           
                }
+       }
+}
 
-               break;
-       }       
+static void
+on_queue_changed (ModestMailOperationQueue *queue,
+                 ModestMailOperation *mail_op,
+                 ModestMailOperationQueueNotification type,
+                 ModestMainWindow *self)
+{
+       ModestMainWindowPrivate *priv;
+
+       priv = MODEST_MAIN_WINDOW_GET_PRIVATE (self);
 
+       if (type == MODEST_MAIL_OPERATION_QUEUE_OPERATION_ADDED) {
+               priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,
+                                                              G_OBJECT (mail_op),
+                                                              "operation-started",
+                                                              G_CALLBACK (on_mail_operation_started),
+                                                              self);
+               priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers,
+                                                              G_OBJECT (mail_op),
+                                                              "operation-finished",
+                                                              G_CALLBACK (on_mail_operation_finished),
+                                                              self);
+       } else if (type == MODEST_MAIL_OPERATION_QUEUE_OPERATION_REMOVED) {
+               priv->sighandlers = modest_signal_mgr_disconnect (priv->sighandlers,
+                                                                 G_OBJECT (mail_op),
+                                                                 "operation-started");
+               priv->sighandlers = modest_signal_mgr_disconnect (priv->sighandlers,
+                                                                 G_OBJECT (mail_op),
+                                                                 "operation-finished");
+       }
 }
 
 static void
 set_account_visible(ModestMainWindow *self, const gchar *acc_name)
 {
        ModestMainWindowPrivate *priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
+       GtkAction *action;
 
        /* Get account data */
        ModestAccountMgr *mgr = modest_runtime_get_account_mgr ();
@@ -2170,10 +2226,19 @@ set_account_visible(ModestMainWindow *self, const gchar *acc_name)
                modest_folder_view_set_account_id_of_visible_server_account (priv->folder_view,
                                                                             acc_data->store_account->account_name);
                modest_window_set_active_account (MODEST_WINDOW (self), acc_data->account_name);
+               action = gtk_action_group_get_action (priv->view_additions_group, acc_data->account_name);
+               if (action != NULL) {
+                       if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
+                               modest_maemo_toggle_action_set_active_block_notify (
+                                       GTK_TOGGLE_ACTION (action),
+                                       TRUE);
+                       }
+               }
        }
        
        modest_folder_view_select_first_inbox_or_local (priv->folder_view);
 
+
        /* Free */
        if (acc_data)
                modest_account_mgr_free_account_data (mgr, acc_data);
@@ -2205,22 +2270,29 @@ set_at_least_one_account_visible(ModestMainWindow *self)
 }
 
 static void 
-on_show_account_action_activated  (GtkAction *action,
+on_show_account_action_toggled  (GtkToggleAction *action,
                                   gpointer user_data)
 {
        ModestMainWindow *self = MODEST_MAIN_WINDOW (user_data);
 
-       const gchar *acc_name = gtk_action_get_name (action);
-       set_account_visible (self, acc_name);
+       const gchar *acc_name = gtk_action_get_name (GTK_ACTION (action));
+       if (gtk_toggle_action_get_active (action))
+               set_account_visible (self, acc_name);
 }
 
 static void
 refresh_account (const gchar *account_name)
 {
        ModestWindow *win;
-
-       win = MODEST_WINDOW (modest_window_mgr_get_main_window (modest_runtime_get_window_mgr ()));
-
+       
+       /* win must already exists here, obviously */ 
+       win = modest_window_mgr_get_main_window (modest_runtime_get_window_mgr (),
+                                                FALSE);
+       if (!win) {
+               g_warning ("%s: BUG: no main window!", __FUNCTION__);
+               return;
+       }
+       
        /* If account_name == NULL, we must update all (option All) */
        if (!account_name)
                modest_ui_actions_do_send_receive_all (win);
@@ -2281,27 +2353,6 @@ on_header_view_focus_in (GtkWidget *widget,
        main_window = MODEST_MAIN_WINDOW (userdata);
        priv = MODEST_MAIN_WINDOW_GET_PRIVATE (main_window);
 
-       if (modest_header_view_has_selected_headers (MODEST_HEADER_VIEW (priv->header_view))) {
-               TnyList *selection = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (priv->header_view));
-               TnyIterator *iterator = tny_list_create_iterator (selection);
-               TnyHeader *header;
-
-               tny_iterator_first (iterator);
-               header = TNY_HEADER (tny_iterator_get_current (iterator));
-               
-               if (tny_header_get_subject (header))
-                       gtk_window_set_title (GTK_WINDOW(main_window), tny_header_get_subject (header));
-               else
-                       gtk_window_set_title (GTK_WINDOW (main_window), _("mail_va_no_subject"));
-
-               if (header)
-                       g_object_unref (header);
-
-               g_object_unref (iterator);
-               g_object_unref (selection);
-       }
-
-
        /* Update toolbar dimming state */
        modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
 
@@ -2342,6 +2393,9 @@ modest_main_window_on_folder_selection_changed (ModestFolderView *folder_view,
                                        show_clipboard = show_delete = show_cancel_send = TRUE;
                                        show_reply = show_forward = FALSE;
                                        break;
+                               case TNY_FOLDER_TYPE_INVALID:
+                                       g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__);
+                                       break;
                                default:
                                        show_reply = show_forward = show_clipboard = show_delete = TRUE;
                                        show_cancel_send = FALSE;
@@ -2361,19 +2415,12 @@ modest_main_window_on_folder_selection_changed (ModestFolderView *folder_view,
        gtk_action_set_visible (action, show_forward);
        action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/HeaderViewCSM/HeaderViewCSMCancelSending");
        gtk_action_set_visible (action, show_cancel_send);
-       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/HeaderViewCSM/HeaderViewCSMCut");
-       gtk_action_set_visible (action, show_clipboard);
-       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/HeaderViewCSM/HeaderViewCSMCopy");
-       gtk_action_set_visible (action, show_clipboard);
-       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/HeaderViewCSM/HeaderViewCSMPaste");
-       gtk_action_set_visible (action, show_clipboard);
        action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/HeaderViewCSM/HeaderViewCSMDelete");
        gtk_action_set_visible (action, show_delete);
 
        /* We finally call to the ui actions handler, after updating properly
         * the header view CSM */
        modest_ui_actions_on_folder_selection_changed (folder_view, folder_store, selected, main_window);
-
 }
 
 gboolean 
@@ -2386,8 +2433,8 @@ modest_main_window_on_msg_view_window_msg_changed (ModestMsgViewWindow *view_win
        GtkTreeModel *header_model = NULL;
        GtkTreePath *path = NULL;
 
-       g_return_val_if_fail (MODEST_MSG_VIEW_WINDOW (view_window), FALSE);
-       g_return_val_if_fail (MODEST_MAIN_WINDOW (self), FALSE);
+       g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (view_window), FALSE);
+       g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (self), FALSE);
        g_return_val_if_fail (gtk_tree_row_reference_valid (row_reference), FALSE);
 
        priv = MODEST_MAIN_WINDOW_GET_PRIVATE (self);
@@ -2405,3 +2452,55 @@ modest_main_window_on_msg_view_window_msg_changed (ModestMsgViewWindow *view_win
 
        return TRUE;
 }
+
+static gboolean
+show_updating_banner (gpointer user_data)
+{
+       ModestMainWindowPrivate *priv = NULL;
+
+       priv = MODEST_MAIN_WINDOW_GET_PRIVATE (user_data);
+
+       priv->updating_banner = 
+               modest_platform_animation_banner (GTK_WIDGET (user_data), NULL,
+                                                 _CS ("ckdg_pb_updating"));
+
+       /* Remove timeout */
+       priv->updating_banner_timeout = 0;
+       return FALSE;
+}
+
+/**
+ * We use this function to show/hide a progress banner showing
+ * "Updating" while the header view is being filled. We're not showing
+ * it unless the update takes more than 2 seconds
+ *
+ * If starting = TRUE then the refresh is starting, otherwise it means
+ * that is has just finished
+ */
+static void 
+on_updating_msg_list (ModestHeaderView *header_view,
+                     gboolean starting,
+                     gpointer user_data)
+{
+       ModestMainWindowPrivate *priv = NULL;
+
+       priv = MODEST_MAIN_WINDOW_GET_PRIVATE (user_data);
+
+       /* Remove old timeout */
+       if (priv->updating_banner_timeout > 0) {
+               g_source_remove (priv->updating_banner_timeout);
+               priv->updating_banner_timeout = 0;
+       }
+
+       /* Create a new timeout */
+       if (starting) {
+               priv->updating_banner_timeout = 
+                       g_timeout_add (2000, show_updating_banner, user_data);
+       } else {
+               /* Remove the banner if exists */
+               if (priv->updating_banner) {
+                       gtk_widget_destroy (priv->updating_banner);
+                       priv->updating_banner = NULL;
+               }
+       }
+}