Don't refilter the model everytime the msg count changes,
[modest] / src / maemo / modest-main-window.c
index c444b74..80abed1 100644 (file)
@@ -53,6 +53,7 @@
 #include "modest-tny-account.h"
 #include "modest-tny-folder.h"
 #include "modest-conf.h"
+#include <modest-utils.h>
 #include <modest-maemo-utils.h>
 #include "modest-tny-platform-factory.h"
 #include "modest-tny-msg.h"
 #include "modest-text-utils.h"
 #include "modest-signal-mgr.h"
 
-#ifdef MODEST_HAVE_HILDON0_WIDGETS
-#include <hildon-widgets/hildon-program.h>
-#else
-#include <hildon/hildon-program.h>
-#endif /*MODEST_HAVE_HILDON0_WIDGETS*/
-
 #define MODEST_MAIN_WINDOW_ACTION_GROUP_ADDITIONS "ModestMainWindowActionAdditions"
 
 #define XALIGN 0.5
@@ -111,15 +106,17 @@ static void on_queue_changed   (ModestMailOperationQueue *queue,
 
 static gboolean on_zoom_minus_plus_not_implemented (ModestWindow *window);
 
-static void
-on_account_inserted (TnyAccountStore *accoust_store,
-                     TnyAccount *account,
-                     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_account_removed  (TnyAccountStore *accoust_store,
+                                TnyAccount *account,
+                                gpointer user_data);
+
+static void on_account_changed  (TnyAccountStore *account_store,
+                                TnyAccount *account,
+                                gpointer user_data);
 
 static void on_default_account_changed (ModestAccountMgr* mgr,
                                        gpointer user_data);
@@ -166,10 +163,10 @@ 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      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);
 
@@ -217,6 +214,7 @@ struct _ModestMainWindowPrivate {
 
        ModestMainWindowStyle style;
        ModestMainWindowContentsStyle contents_style;
+       gboolean wait_for_settings;
 
        guint progress_bar_timeout;
        guint restore_paned_timeout;
@@ -228,6 +226,9 @@ struct _ModestMainWindowPrivate {
        /* "Updating" banner for header view */
        GtkWidget *updating_banner;
        guint updating_banner_timeout;
+
+       /* Display state */
+       osso_display_state_t display_state;
 };
 #define MODEST_MAIN_WINDOW_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
                                                 MODEST_TYPE_MAIN_WINDOW, \
@@ -345,6 +346,7 @@ modest_main_window_init (ModestMainWindow *obj)
        priv->progress_bar = NULL;
        priv->current_toolbar_mode = TOOLBAR_MODE_NORMAL;
        priv->style  = MODEST_MAIN_WINDOW_STYLE_SPLIT;
+       priv->wait_for_settings = TRUE;
        priv->contents_style  = -1; /* invalid contents style. We need this to select it for the first time */
        priv->merge_ids = NULL;
        priv->optimized_view  = FALSE;
@@ -354,6 +356,11 @@ modest_main_window_init (ModestMainWindow *obj)
        priv->sighandlers = NULL;
        priv->updating_banner = NULL;
        priv->updating_banner_timeout = 0;
+       priv->display_state = OSSO_DISPLAY_ON;
+       
+       modest_window_mgr_register_help_id (modest_runtime_get_window_mgr(),
+                                           GTK_WINDOW(obj),
+                                           "applications_email_mainview");
 }
 
 static void
@@ -365,10 +372,9 @@ modest_main_window_finalize (GObject *obj)
 
        /* Sanity check: shouldn't be needed, the window mgr should
           call this function before */
-       modest_main_window_disconnect_signals (MODEST_WINDOW (obj));
-
+       modest_main_window_disconnect_signals (MODEST_WINDOW (obj));    
        modest_main_window_cleanup_queue_error_signals ((ModestMainWindow *) obj);
-
+       
        g_slist_free (priv->progress_widgets);
 
        g_byte_array_free (priv->merge_ids, TRUE);
@@ -383,11 +389,16 @@ modest_main_window_finalize (GObject *obj)
                priv->updating_banner_timeout = 0;
        }
 
+       if (priv->updating_banner) {
+               gtk_widget_destroy (priv->updating_banner);
+               priv->updating_banner = NULL;
+       }
+
        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);
 }
 
@@ -398,7 +409,7 @@ modest_main_window_get_child_widget (ModestMainWindow *self,
        ModestMainWindowPrivate *priv;
        GtkWidget *widget;
        
-       g_return_val_if_fail (self, NULL);
+       g_return_val_if_fail (self && MODEST_IS_MAIN_WINDOW(self), NULL);
        g_return_val_if_fail (widget_type >= 0 && widget_type < MODEST_MAIN_WINDOW_WIDGET_TYPE_NUM,
                              NULL);
        
@@ -423,11 +434,15 @@ restore_paned_timeout_handler (gpointer *data)
        ModestMainWindowPrivate *priv = MODEST_MAIN_WINDOW_GET_PRIVATE (main_window);
        ModestConf *conf;
 
+       /* Timeouts are outside the main lock */
+       gdk_threads_enter ();
        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);
        }
+       gdk_threads_leave ();
+
        return FALSE;
 }
 
@@ -452,10 +467,10 @@ restore_settings (ModestMainWindow *self, gboolean do_folder_view_too)
                modest_widget_memory_restore (conf, G_OBJECT(priv->folder_view),
                                      MODEST_CONF_FOLDER_VIEW_KEY);
 
-       modest_widget_memory_restore (conf, G_OBJECT(priv->main_paned),
-                                     MODEST_CONF_MAIN_PANED_KEY);
+/*     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);
+       g_timeout_add (250, (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 */
@@ -475,19 +490,28 @@ save_state (ModestWindow *window)
        
        modest_widget_memory_save (conf,G_OBJECT(self), 
                                   MODEST_CONF_MAIN_WINDOW_KEY);
-       modest_widget_memory_save (conf, G_OBJECT(priv->main_paned), 
-                                  MODEST_CONF_MAIN_PANED_KEY);
-       //      modest_widget_memory_save (conf, G_OBJECT(priv->header_view), 
-       //                         MODEST_CONF_HEADER_VIEW_KEY);
+       /* Only save main paned position if we're in split mode */
+       if (priv->style == MODEST_MAIN_WINDOW_STYLE_SPLIT)
+               modest_widget_memory_save (conf, G_OBJECT(priv->main_paned), 
+                                          MODEST_CONF_MAIN_PANED_KEY);
        modest_widget_memory_save (conf, G_OBJECT(priv->folder_view), 
                                   MODEST_CONF_FOLDER_VIEW_KEY);
 }
 
 static gint
-compare_display_names (ModestAccountData *a,
-                      ModestAccountData *b)
+compare_display_names (ModestAccountSettings *a,
+                      ModestAccountSettings *b)
+{
+       return strcmp (modest_account_settings_get_display_name (a),
+                      modest_account_settings_get_display_name (b));
+}
+
+/* We use this function to prevent the send&receive CSM to be shown
+   when there are less than two account */
+static gboolean
+tap_and_hold_query_cb (GtkWidget *widget, GdkEvent *event)
 {
-       return strcmp (a->display_name, b->display_name);
+       return TRUE;
 }
 
 static void
@@ -500,6 +524,7 @@ update_menus (ModestMainWindow* self)
        gint i, num_accounts;
        GList *groups;
        gchar *default_account;
+       const gchar *active_account_name;
        GtkWidget *send_receive_button, *item;
        GtkAction *send_receive_all = NULL;
        GSList *radio_group;
@@ -514,9 +539,9 @@ update_menus (ModestMainWindow* self)
        accounts = NULL;
 
        while (iter) {
-               ModestAccountData *account_data = 
-                       modest_account_mgr_get_account_data (mgr, (gchar*) iter->data);
-               accounts = g_slist_prepend (accounts, account_data);
+               ModestAccountSettings *settings = 
+                       modest_account_mgr_load_account_settings (mgr, (gchar*) iter->data);
+               accounts = g_slist_prepend (accounts, settings);
 
                iter = iter->next;
        }
@@ -529,7 +554,7 @@ update_menus (ModestMainWindow* self)
 
        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);
+       gtk_action_set_visible (send_receive_all, num_accounts > 0);
 
        /* Delete old send&receive popup items. We can not just do a
           menu_detach because it does not work well with
@@ -582,53 +607,66 @@ update_menus (ModestMainWindow* self)
 
        /* Create a new action group */
        default_account = modest_account_mgr_get_default_account (mgr);
+       active_account_name = modest_window_get_active_account (MODEST_WINDOW (self));
+       
+       if (!active_account_name) 
+               modest_window_set_active_account (MODEST_WINDOW (self), default_account);
+       
        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);
+               const gchar *account_name;
+               ModestAccountSettings *settings = (ModestAccountSettings *) g_slist_nth_data (accounts, i);
 
-               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);
+               if (!settings) {
+                       g_warning ("%s: BUG: account_data == NULL", __FUNCTION__);
+                       continue;
                }
-               else {
+               account_name = modest_account_settings_get_account_name (settings);
+       
+               if (default_account && account_name && 
+                   !(strcmp (default_account, account_name) == 0)) {
+                       display_name = g_strdup_printf (_("mcen_me_toolbar_sendreceive_default"), 
+                                                       modest_account_settings_get_display_name (settings));
+               } else {
                        display_name = g_strdup_printf (_("mcen_me_toolbar_sendreceive_mailbox_n"), 
-                                                       account_data->display_name);
+                                                       modest_account_settings_get_display_name (settings));
                }
-
+               
                /* 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) {
+               if (settings && account_name) {
                        gchar* item_name, *refresh_action_name;
                        guint8 merge_id = 0;
                        GtkAction *view_account_action, *refresh_account_action;
 
-                       view_account_action = GTK_ACTION (gtk_radio_action_new (account_data->account_name,
+                       view_account_action = GTK_ACTION (gtk_radio_action_new (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));
 
-                       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);
+                       if (active_account_name) {
+                               if (active_account_name && account_name && 
+                                   (strcmp (active_account_name, account_name) == 0)) {
+                                       gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (view_account_action), TRUE);
+                               }
                        }
 
                        /* 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);
+                       item_name = g_strconcat (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,
+                                              account_name,
                                               GTK_UI_MANAGER_MENUITEM,
                                               FALSE);
 
@@ -639,7 +677,7 @@ update_menus (ModestMainWindow* self)
                                                self);
 
                        /* Create the items for the Tools->Send&Receive submenu */
-                       refresh_action_name = g_strconcat ("SendReceive", account_data->account_name, NULL);
+                       refresh_action_name = g_strconcat ("SendReceive", 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);
@@ -658,24 +696,21 @@ update_menus (ModestMainWindow* self)
                        g_signal_connect_data (G_OBJECT (refresh_account_action), 
                                               "activate", 
                                               G_CALLBACK (on_refresh_account_action_activated), 
-                                              g_strdup (account_data->account_name),
+                                              g_strdup (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) {
+                       if (num_accounts > 1) {
                                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))
-                               {
+                               if (default_account && (strcmp(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
-                               {
+                               } else {
                                        gtk_label_set_text (GTK_LABEL (label), display_name);
                                }
 
@@ -686,7 +721,7 @@ update_menus (ModestMainWindow* self)
                                g_signal_connect_data (G_OBJECT (item), 
                                                       "activate", 
                                                       G_CALLBACK (on_send_receive_csm_activated),
-                                                      g_strdup (account_data->account_name),
+                                                      g_strdup (account_name),
                                                       (GClosureNotify) g_free,
                                                       0);
                        }
@@ -703,53 +738,82 @@ update_menus (ModestMainWindow* self)
         * 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 *item_name, *path;
+               GtkWidget *item;
+               ModestAccountSettings *settings;
+               const gchar *account_name;
+               gboolean is_default;
+
+               settings = (ModestAccountSettings *) g_slist_nth_data (accounts, i);
+               account_name = modest_account_settings_get_account_name (settings);
+               is_default = (account_name && default_account && !strcmp (account_name, default_account));
+
+               /* Get the item of the view menu */
+               item_name = g_strconcat (account_name, "Menu", NULL);
+               path = g_strconcat ("/MenuBar/ViewMenu/ViewMenuAdditions/", 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));
+                               if (is_default) {
                                        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);
                                }
+                               gtk_label_set_ellipsize (GTK_LABEL (child),  PANGO_ELLIPSIZE_END);
                        }
-
-                       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));
+               }
+                       
+               /* Get the item of the tools menu */
+               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));
+                               if (is_default) {
                                        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);
                                }
+                               gtk_label_set_ellipsize (GTK_LABEL (child),  PANGO_ELLIPSIZE_END);
                        }
-
-                       g_free(item_name);
                }
 
-               modest_account_mgr_free_account_data (mgr, account_data);
+               g_free(item_name);
+               g_object_unref (settings);
        }
 
-       if (priv->accounts_popup) {
+       if (num_accounts > 1) {
+               /* Disconnect the tap-and-hold-query if it's connected */
+               if (modest_signal_mgr_is_connected (priv->sighandlers, 
+                                                   G_OBJECT (send_receive_button),
+                                                   "tap-and-hold-query"))
+                       priv->sighandlers = modest_signal_mgr_disconnect (priv->sighandlers, 
+                                                                         G_OBJECT (send_receive_button),
+                                                                         "tap-and-hold-query");
+
                /* 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);
+       } else {
+               /* Connect the tap-and-hold-query in order not to show the CSM */
+               if (!modest_signal_mgr_is_connected (priv->sighandlers, 
+                                                    G_OBJECT (send_receive_button),
+                                                    "tap-and-hold-query"))
+                       priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers, 
+                                                                      G_OBJECT (send_receive_button),
+                                                                      "tap-and-hold-query",
+                                                                      G_CALLBACK (tap_and_hold_query_cb), 
+                                                                      NULL);
        }
 
        /* Frees */
@@ -801,8 +865,8 @@ _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");  
+       /* Update dimmed */
+       modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW(user_data));
 }
 
 static void
@@ -812,8 +876,8 @@ _header_view_csm_menu_activated (GtkWidget *widget, gpointer user_data)
 
        /* Update visibility */
 
-       /* Update dimmed */     
-       modest_window_check_dimming_rules_group (MODEST_WINDOW (user_data), "ModestMenuDimmingRules");  
+       /* Update dimmed */
+       modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW(user_data));
 }
 
 static void
@@ -843,14 +907,20 @@ connect_signals (ModestMainWindow *self)
                                           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);
+               modest_signal_mgr_connect (priv->sighandlers, G_OBJECT(priv->folder_view), 
+                                          "folder_selection_changed",
+                                          G_CALLBACK (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);
+               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);
+               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");
@@ -939,32 +1009,26 @@ connect_signals (ModestMainWindow *self)
        /* Account store */
        priv->sighandlers = 
                modest_signal_mgr_connect (priv->sighandlers,
+                                          G_OBJECT (modest_runtime_get_account_store ()),
+                                          "account_changed", 
+                                          G_CALLBACK (on_account_changed),
+                                          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
-/** Idle handler, to send/receive at startup .*/
-gboolean
-sync_accounts_cb (ModestMainWindow *win)
-{
-       modest_ui_actions_do_send_receive (NULL, MODEST_WINDOW (win));
-       return FALSE; /* Do not call this idle handler again. */
-}
-#endif
-
 static void 
 on_hildon_program_is_topmost_notify(GObject *self,
-                                   GParamSpec *propert_param, gpointer user_data)
+                                   GParamSpec *propert_param, 
+                                   gpointer user_data)
 {
        HildonProgram *app = HILDON_PROGRAM (self);
        
-       /*
-       ModestWindow* self = MODEST_WINDOW(user_data);
-       */
-       
        /* Note that use of hildon_program_set_can_hibernate() 
         * is generally referred to as "setting the killable flag", 
         * though hibernation does not seem equal to death.
@@ -975,13 +1039,16 @@ on_hildon_program_is_topmost_notify(GObject *self,
                 * because hibernation should only happen when the application 
                 * is in the background: */
                hildon_program_set_can_hibernate (app, FALSE);
+
+               /* Remove new mail visual notifications */
+               modest_platform_remove_new_mail_notifications (TRUE);
        } else {
                /* Allow hibernation if the program has gone to the background: */
                
                /* However, prevent hibernation while the settings are being changed: */
                const gboolean hibernation_prevented = 
                        modest_window_mgr_get_hibernation_is_prevented (
-       modest_runtime_get_window_mgr ()); 
+                                                                       modest_runtime_get_window_mgr ()); 
        
                if (hibernation_prevented)
                        hildon_program_set_can_hibernate (app, FALSE);
@@ -990,8 +1057,7 @@ on_hildon_program_is_topmost_notify(GObject *self,
                        modest_osso_save_state();
                        hildon_program_set_can_hibernate (app, TRUE);
                }
-       }
-       
+       }       
 }
 
 static void
@@ -1002,7 +1068,6 @@ modest_main_window_on_show (GtkWidget *self, gpointer user_data)
        
        priv->folder_view = MODEST_FOLDER_VIEW (modest_platform_create_folder_view (NULL));
        wrap_in_scrolled_window (folder_win, GTK_WIDGET(priv->folder_view));
-/*     wrap_in_scrolled_window (priv->contents_widget, GTK_WIDGET(priv->header_view)); */
 
        gtk_widget_show (GTK_WIDGET (priv->folder_view));
 
@@ -1018,14 +1083,10 @@ modest_main_window_on_show (GtkWidget *self, gpointer user_data)
        modest_osso_load_state ();
 
        /* Restore window & widget settings */  
+       priv->wait_for_settings = TRUE;
        restore_settings (MODEST_MAIN_WINDOW(self), TRUE);
+       priv->wait_for_settings = FALSE;
 
-/*     /\* 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 = 
                modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE);
@@ -1042,11 +1103,25 @@ modest_main_window_on_show (GtkWidget *self, gpointer user_data)
                accounts = modest_account_mgr_account_names (modest_runtime_get_account_mgr (), TRUE);
                send_receive_all = gtk_ui_manager_get_action (parent_priv->ui_manager, 
                                                              "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsSendReceiveAllMenu");
-               gtk_action_set_visible (send_receive_all, g_slist_length (accounts) > 1);
+               gtk_action_set_visible (send_receive_all, g_slist_length (accounts) > 0);
                modest_account_mgr_free_account_names (accounts);
+               update_menus (MODEST_MAIN_WINDOW (self));
        }
 }
 
+static void 
+osso_display_event_cb (osso_display_state_t state, 
+                      gpointer data)
+{
+       ModestMainWindowPrivate *priv = MODEST_MAIN_WINDOW_GET_PRIVATE (data);
+
+       priv->display_state = state;
+
+       /* Stop blinking if the screen becomes on */
+       if (priv->display_state == OSSO_DISPLAY_ON)
+               modest_platform_remove_new_mail_notifications (TRUE);
+}
+
 ModestWindow *
 modest_main_window_new (void)
 {
@@ -1058,6 +1133,7 @@ modest_main_window_new (void)
        ModestDimmingRulesGroup *toolbar_rules_group = NULL;
        GtkActionGroup *action_group = NULL;
        GError *error = NULL;
+       HildonProgram *app;
        ModestConf *conf = NULL;
        GtkAction *action = NULL;
        GdkPixbuf *window_icon;
@@ -1072,8 +1148,8 @@ modest_main_window_new (void)
        action_group = gtk_action_group_new ("ModestMainWindowActions");
        gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE);
 
-       menu_rules_group = modest_dimming_rules_group_new ("ModestMenuDimmingRules", FALSE);
-       toolbar_rules_group = modest_dimming_rules_group_new ("ModestToolbarDimmingRules", TRUE);
+       menu_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_MENU, FALSE);
+       toolbar_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_TOOLBAR, TRUE);
 
        /* Add common actions */
        gtk_action_group_add_actions (action_group,
@@ -1134,7 +1210,7 @@ modest_main_window_new (void)
                                    gtk_ui_manager_get_accel_group (parent_priv->ui_manager));
 
        /* Menubar. Update the state of some toggles */
-       parent_priv->menubar = modest_maemo_utils_menubar_to_menu (parent_priv->ui_manager);
+       parent_priv->menubar = modest_maemo_utils_get_manager_menubar_as_menu (parent_priv->ui_manager, "/MenuBar");
        conf = modest_runtime_get_conf ();
        action = gtk_ui_manager_get_action (parent_priv->ui_manager, 
                                            "/MenuBar/ViewMenu/ViewShowToolbarMainMenu/ViewShowToolbarNormalScreenMenu");
@@ -1193,7 +1269,7 @@ modest_main_window_new (void)
        
        gtk_container_add (GTK_CONTAINER(self), priv->main_vbox);
        
-       HildonProgram *app = hildon_program_get_instance ();
+       app = hildon_program_get_instance ();
        hildon_program_add_window (app, HILDON_WINDOW (self));
        
        g_signal_connect (G_OBJECT(app), "notify::is-topmost",
@@ -1203,45 +1279,27 @@ modest_main_window_new (void)
                          G_CALLBACK (modest_main_window_on_show), folder_win);
                
        /* Set window icon */
-       window_icon = modest_platform_get_icon (MODEST_APP_ICON);
+       window_icon = modest_platform_get_icon (MODEST_APP_ICON, MODEST_ICON_SIZE_BIG);
        if (window_icon) {
                gtk_window_set_icon (GTK_WINDOW (self), window_icon);
                g_object_unref (window_icon);
        }
 
+       /* Listen for changes in the screen, we don't want to show a
+          led pattern when the display is on for example */
+       osso_hw_set_display_event_cb (modest_maemo_utils_get_osso_context (),
+                                     osso_display_event_cb,
+                                     self); 
+
        /* Dont't restore settings here, 
         * because it requires a gtk_widget_show(), 
         * and we don't want to do that until later,
         * so that the UI is not visible for non-menu D-Bus activation.
         */
-       /* restore_settings (MODEST_MAIN_WINDOW(self), FALSE); */
 
        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)
@@ -1275,6 +1333,10 @@ modest_main_window_set_style (ModestMainWindow *self,
        priv->style = style;
        switch (style) {
        case MODEST_MAIN_WINDOW_STYLE_SIMPLE:
+
+               if (!priv->wait_for_settings)
+                       modest_widget_memory_save (modest_runtime_get_conf (), G_OBJECT (priv->main_paned),
+                                                  MODEST_CONF_MAIN_PANED_KEY);
                /* Remove main paned */
                g_object_ref (priv->main_paned);
                gtk_container_remove (GTK_CONTAINER (priv->main_vbox), priv->main_paned);
@@ -1292,6 +1354,8 @@ modest_main_window_set_style (ModestMainWindow *self,
                gtk_paned_add2 (GTK_PANED (priv->main_paned), priv->contents_widget);
                gtk_container_add (GTK_CONTAINER (priv->main_vbox), priv->main_paned);
 
+               g_timeout_add (500, (GSourceFunc) restore_paned_timeout_handler, self);
+
                break;
        default:
                g_return_if_reached ();
@@ -1318,6 +1382,53 @@ modest_main_window_get_style (ModestMainWindow *self)
        return priv->style;
 }
 
+static void
+toolbar_resize (ModestMainWindow *self)
+{
+       ModestMainWindowPrivate *priv = NULL;
+       ModestWindowPrivate *parent_priv = NULL;
+       GtkWidget *widget;
+       gint static_button_size;
+       ModestWindowMgr *mgr;
+
+       g_return_if_fail (MODEST_IS_MAIN_WINDOW (self));
+       priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
+       parent_priv = MODEST_WINDOW_GET_PRIVATE(self);
+
+       mgr = modest_runtime_get_window_mgr ();
+       static_button_size = modest_window_mgr_get_fullscreen_mode (mgr)?118:108;
+
+       if (parent_priv->toolbar) {
+               /* left size buttons */
+               widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageNew");
+               gtk_tool_item_set_expand (GTK_TOOL_ITEM (widget), FALSE);
+               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), FALSE);
+               gtk_widget_set_size_request (GTK_WIDGET (widget), static_button_size, -1);
+               widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageReply");
+               gtk_tool_item_set_expand (GTK_TOOL_ITEM (widget), FALSE);
+               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), FALSE);
+               gtk_widget_set_size_request (GTK_WIDGET (widget), static_button_size, -1);
+               widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarDeleteMessage");
+               gtk_tool_item_set_expand (GTK_TOOL_ITEM (widget), FALSE);
+               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), FALSE);
+               gtk_widget_set_size_request (GTK_WIDGET (widget), static_button_size, -1);
+               widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToggleFolders");
+               gtk_tool_item_set_expand (GTK_TOOL_ITEM (widget), FALSE);
+               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), FALSE);
+               gtk_widget_set_size_request (GTK_WIDGET (widget), static_button_size, -1);
+               
+               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->progress_toolitem), FALSE);
+               gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), TRUE);
+               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->cancel_toolitem), FALSE);
+               gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->cancel_toolitem), FALSE);
+               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->refresh_toolitem), TRUE);
+               gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->refresh_toolitem), TRUE);
+               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->sort_toolitem), TRUE);
+               gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->sort_toolitem), TRUE);
+       }
+               
+}
+
 
 
 static gboolean
@@ -1341,20 +1452,14 @@ modest_main_window_window_state_event (GtkWidget *widget, GdkEventWindowState *e
                if (is_fullscreen != active) {
                        gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (fs_toggle_action), is_fullscreen);
                }
+
+               toolbar_resize (MODEST_MAIN_WINDOW (widget));
        }
 
        return FALSE;
 
 }
 
-static void
-set_homogeneous (GtkWidget *widget,
-                gpointer data)
-{
-       gtk_tool_item_set_expand (GTK_TOOL_ITEM (widget), TRUE);
-       gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), TRUE);
-}
-
 static void 
 modest_main_window_show_toolbar (ModestWindow *self,
                                 gboolean show_toolbar)
@@ -1379,19 +1484,12 @@ modest_main_window_show_toolbar (ModestWindow *self,
                                                                  "/ToolBar");
                gtk_widget_set_no_show_all (parent_priv->toolbar, TRUE);
 
-               /* Set homogeneous toolbar */
-               gtk_container_foreach (GTK_CONTAINER (parent_priv->toolbar), 
-                                      set_homogeneous, NULL);
-       
                priv->progress_toolitem = GTK_WIDGET (gtk_tool_item_new ());
                priv->cancel_toolitem = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarCancel");
                priv->refresh_toolitem = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarSendReceive");
                priv->sort_toolitem = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarSort");
-               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->progress_toolitem), TRUE);
-               gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), TRUE);
-               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->cancel_toolitem), FALSE);
-               gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->cancel_toolitem), FALSE);
-
+               toolbar_resize (MODEST_MAIN_WINDOW (self));
+               
                /* Add ProgressBar (Transfer toolbar) */ 
                priv->progress_bar = modest_progress_bar_widget_new ();
                gtk_widget_set_no_show_all (priv->progress_bar, TRUE);
@@ -1429,7 +1527,10 @@ modest_main_window_show_toolbar (ModestWindow *self,
                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);
+               if (modest_main_window_transfer_mode_enabled (MODEST_MAIN_WINDOW(self)))
+                       set_toolbar_mode (MODEST_MAIN_WINDOW(self), TOOLBAR_MODE_TRANSFER);
+               else
+                       set_toolbar_mode (MODEST_MAIN_WINDOW(self), TOOLBAR_MODE_NORMAL);
        } else {
                gtk_widget_hide (GTK_WIDGET (parent_priv->toolbar));
 
@@ -1446,7 +1547,7 @@ modest_main_window_show_toolbar (ModestWindow *self,
                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),
+       modest_utils_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action),
                                                            show_toolbar);
 }
 
@@ -1455,7 +1556,11 @@ on_account_inserted (TnyAccountStore *accoust_store,
                      TnyAccount *account,
                      gpointer user_data)
 {
-       update_menus (MODEST_MAIN_WINDOW (user_data));
+       /* Transport accounts and local ones (MMC and the Local
+          folders account do now cause menu changes */
+       if (TNY_IS_STORE_ACCOUNT (account) && 
+           modest_tny_folder_store_is_remote (TNY_FOLDER_STORE (account)))
+               update_menus (MODEST_MAIN_WINDOW (user_data));
 }
 
 static void
@@ -1470,7 +1575,31 @@ on_account_removed (TnyAccountStore *accoust_store,
                      TnyAccount *account,
                      gpointer user_data)
 {
-       update_menus (MODEST_MAIN_WINDOW (user_data));
+       /* Transport accounts and local ones (MMC and the Local
+          folders account do now cause menu changes */
+       if (TNY_IS_STORE_ACCOUNT (account) && 
+           modest_tny_folder_store_is_remote (TNY_FOLDER_STORE (account)))
+               update_menus (MODEST_MAIN_WINDOW (user_data));
+}
+
+static void
+on_account_changed (TnyAccountStore *account_store,
+                    TnyAccount *account,
+                    gpointer user_data)
+{
+       ModestMainWindow *win = MODEST_MAIN_WINDOW (user_data);
+       
+       /* We need to refresh the details widget because it could have changed */
+       if (modest_main_window_get_contents_style(win) == MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS) {
+               modest_main_window_set_contents_style (win, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS);
+       }
+
+       /* Update the menus as well, the account name could be
+          changed. Transport accounts and local ones (MMC and the
+          Local folders account do now cause menu changes */
+       if (TNY_IS_STORE_ACCOUNT (account) && 
+           modest_tny_folder_store_is_remote (TNY_FOLDER_STORE (account)))
+               update_menus (MODEST_MAIN_WINDOW (user_data));
 }
 
 /* 
@@ -1542,17 +1671,18 @@ create_empty_view (void)
 static gchar *
 get_gray_color_markup (GtkWidget *styled_widget)
 {
-       gchar *gray_color_markup;
-
+       gchar *gray_color_markup = NULL;
+#ifndef MODEST_HAVE_HILDON0_WIDGETS
        /* Obtain the secondary text color. We need a realized widget, that's why 
           we get styled_widget from outside */
-#ifndef MODEST_HAVE_HILDON0_WIDGETS
        GdkColor color;
-       gtk_style_lookup_color (styled_widget->style, "SecondaryTextColor", &color);
-       gray_color_markup = modest_text_utils_get_color_string (&color);
-#else
-       gray_color_markup = g_strdup ("#BBBBBB");
-#endif 
+       if (gtk_style_lookup_color (styled_widget->style, "SecondaryTextColor", &color)) 
+               gray_color_markup = modest_text_utils_get_color_string (&color);
+#endif /*MODEST_HAVE_HILDON0_WIDGETS*/
+       
+       if (!gray_color_markup) 
+               gray_color_markup = g_strdup ("#BBBBBB");
+
        return gray_color_markup;
 }
 
@@ -1609,6 +1739,7 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
                                                          (const gchar *) gray_color_markup);
                label_w = gtk_label_new (NULL);
                gtk_label_set_markup (GTK_LABEL (label_w), label);
+               gtk_label_set_ellipsize (GTK_LABEL (label_w),  PANGO_ELLIPSIZE_END);
                gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
                g_free (device_name);
                g_free (label);
@@ -1636,6 +1767,7 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
 
                        label_w = gtk_label_new (NULL);
                        gtk_label_set_markup (GTK_LABEL (label_w), label);
+                       gtk_label_set_ellipsize (GTK_LABEL (label_w),  PANGO_ELLIPSIZE_END);
                        gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
                        g_string_free (proto, TRUE);
                        g_free (label);
@@ -1649,6 +1781,7 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
                                         modest_tny_folder_store_get_message_count (folder_store));
        label_w = gtk_label_new (NULL);
        gtk_label_set_markup (GTK_LABEL (label_w), label);
+       gtk_label_set_ellipsize (GTK_LABEL (label_w),  PANGO_ELLIPSIZE_END);
        gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
        g_free (label);
 
@@ -1659,6 +1792,7 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
                                         modest_tny_folder_store_get_folder_count (folder_store));
        label_w = gtk_label_new (NULL);
        gtk_label_set_markup (GTK_LABEL (label_w), label);
+       gtk_label_set_ellipsize (GTK_LABEL (label_w),  PANGO_ELLIPSIZE_END);
        gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
        g_free (label);
 
@@ -1676,13 +1810,14 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
                
                label_w = gtk_label_new (NULL);
                gtk_label_set_markup (GTK_LABEL (label_w), label);
+               gtk_label_set_ellipsize (GTK_LABEL (label_w),  PANGO_ELLIPSIZE_END);
                gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
                g_free (label);
        } else if (TNY_IS_ACCOUNT(folder_store)) {
                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_last_updated (modest_runtime_get_account_mgr (), 
                                                                    tny_account_get_id (account));
@@ -1696,8 +1831,8 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
                                                 gray_color_markup, _("mcen_ti_lastupdated"), last_updated_string);
                label_w = gtk_label_new (NULL);
                gtk_label_set_markup (GTK_LABEL (label_w), label);
+               gtk_label_set_ellipsize (GTK_LABEL (label_w),  PANGO_ELLIPSIZE_END);
                gtk_box_pack_start (GTK_BOX (vbox), label_w, FALSE, FALSE, 0);
-               g_free (last_updated_string);
                g_free (label);
        }
 
@@ -1770,41 +1905,41 @@ on_msg_count_changed (ModestHeaderView *header_view,
 {
        gboolean folder_empty = FALSE;
        gboolean all_marked_as_deleted = FALSE;
-       TnyFolderChangeChanged changed; 
        ModestMainWindowPrivate *priv;
-       
+
        g_return_if_fail (MODEST_IS_MAIN_WINDOW (main_window));
        g_return_if_fail (TNY_IS_FOLDER(folder));
-       g_return_if_fail (TNY_IS_FOLDER_CHANGE(change));
        priv = MODEST_MAIN_WINDOW_GET_PRIVATE (main_window);
-       
-       changed = tny_folder_change_get_changed (change);
-       
-       /* If something changes */
-       if ((changed) & TNY_FOLDER_CHANGE_CHANGED_ALL_COUNT)
-               folder_empty = (tny_folder_change_get_new_all_count (change) == 0);
-       else
-               folder_empty = (tny_folder_get_all_count (TNY_FOLDER (folder)) == 0);
-       
-/*     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));
+
+       if (change != NULL) {
+               TnyFolderChangeChanged changed;
+
+               changed = tny_folder_change_get_changed (change);
+               /* If something changes */
+               if ((changed) & TNY_FOLDER_CHANGE_CHANGED_ALL_COUNT)
+                       folder_empty = (((guint) tny_folder_change_get_new_all_count (change)) == 0);
+               else
+                       folder_empty = (((guint) tny_folder_get_all_count (TNY_FOLDER (folder))) == 0);
+
+               /* Play a sound (if configured) and make the LED blink  */
+               if (changed & TNY_FOLDER_CHANGE_CHANGED_ADDED_HEADERS) {
+                       modest_platform_push_email_notification ();
+               }
        }
 
        /* 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 ;
-       
+       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,
                                                       MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY);
                gtk_widget_grab_focus (GTK_WIDGET (priv->folder_view));
-       }
-       else {
+       } else {
                modest_main_window_set_contents_style (main_window,
                                                       MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS);
-       }       
+       }
 }
 
 
@@ -2014,12 +2149,12 @@ set_toolbar_mode (ModestMainWindow *self,
                        gtk_action_set_visible (refresh_action, FALSE);
                if (cancel_action)
                        gtk_action_set_visible (cancel_action, TRUE);
+               if (priv->progress_bar)
+                       gtk_widget_show (priv->progress_bar);
                if (priv->progress_toolitem) {
                        gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), TRUE);
                        gtk_widget_show (priv->progress_toolitem);
                }
-               if (priv->progress_bar)
-                       gtk_widget_show (priv->progress_bar);
 
                /* Show toolbar if it's hiden (optimized view ) */
                if (priv->optimized_view)
@@ -2098,6 +2233,7 @@ get_toolbar_mode_from_mail_operation (ModestMainWindow *self,
 
        /* Get toolbar mode from operation id*/
        switch (modest_mail_operation_get_type_operation (mail_op)) {
+       case MODEST_MAIL_OPERATION_TYPE_SEND_AND_RECEIVE:
        case MODEST_MAIL_OPERATION_TYPE_RECEIVE:
        case MODEST_MAIL_OPERATION_TYPE_OPEN:
                mode = TOOLBAR_MODE_TRANSFER;
@@ -2145,8 +2281,13 @@ on_mail_operation_started (ModestMailOperation *mail_op,
        /* Add operation observers and change toolbar if neccessary*/
        tmp = priv->progress_widgets;
        if (mode == TOOLBAR_MODE_TRANSFER) {
-               if (mode_changed)
-                       set_toolbar_transfer_mode(self);                    
+               if (mode_changed) {
+                       GObject *source = modest_mail_operation_get_source(mail_op);
+                       if (G_OBJECT (self) == source) {
+                               set_toolbar_transfer_mode(self);
+                       }
+                       g_object_unref (source);
+               }
 
                while (tmp) {
                        modest_progress_object_add_operation (MODEST_PROGRESS_OBJECT (tmp->data),
@@ -2240,20 +2381,30 @@ set_account_visible(ModestMainWindow *self, const gchar *acc_name)
 {
        ModestMainWindowPrivate *priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
        GtkAction *action;
+       ModestAccountMgr *mgr;
+       ModestAccountSettings *settings;
+       ModestServerAccountSettings *store_settings = NULL;
 
        /* Get account data */
-       ModestAccountMgr *mgr = modest_runtime_get_account_mgr ();
-       ModestAccountData *acc_data = modest_account_mgr_get_account_data (mgr, acc_name);
+       mgr = modest_runtime_get_account_mgr ();
+       settings = modest_account_mgr_load_account_settings (mgr, acc_name);
+       if (settings)
+               store_settings = modest_account_settings_get_store_settings (settings);
 
        /* Set the new visible & active account */
-       if (acc_data && acc_data->store_account) { 
-               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 (settings && (modest_server_account_settings_get_account_name (store_settings)!= NULL)) { 
+               const gchar *account_name;
+
+               account_name = modest_account_settings_get_account_name (settings);
+
+               modest_folder_view_set_account_id_of_visible_server_account 
+                       (priv->folder_view,
+                        modest_server_account_settings_get_account_name (store_settings));
+               modest_window_set_active_account (MODEST_WINDOW (self), account_name);
+               action = gtk_action_group_get_action (priv->view_additions_group, account_name);
                if (action != NULL) {
                        if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
-                               modest_maemo_toggle_action_set_active_block_notify (
+                               modest_utils_toggle_action_set_active_block_notify (
                                        GTK_TOGGLE_ACTION (action),
                                        TRUE);
                        }
@@ -2264,8 +2415,10 @@ set_account_visible(ModestMainWindow *self, const gchar *acc_name)
 
 
        /* Free */
-       if (acc_data)
-               modest_account_mgr_free_account_data (mgr, acc_data);
+       if (settings) {
+               g_object_unref (store_settings);
+               g_object_unref (settings);
+       }
 }
 
 /* Make sure that at least one account is "viewed": */
@@ -2281,15 +2434,20 @@ set_at_least_one_account_visible(ModestMainWindow *self)
        }
        
        const gchar *active_server_account_name = 
-               modest_folder_view_get_account_id_of_visible_server_account (priv->folder_view);        
+               modest_folder_view_get_account_id_of_visible_server_account (priv->folder_view);
+       
        if (!active_server_account_name ||
                !modest_account_mgr_account_exists (account_mgr, active_server_account_name, TRUE))
        {
                gchar* first_modest_name = modest_account_mgr_get_first_account_name (account_mgr);
-               if (first_modest_name) {
+               gchar* default_modest_name = modest_account_mgr_get_default_account (account_mgr);
+               if (default_modest_name) {
+                       set_account_visible (self, default_modest_name);
+               } else if (first_modest_name) {
                        set_account_visible (self, first_modest_name);
-                       g_free (first_modest_name);
                }
+               g_free (first_modest_name);
+               g_free (default_modest_name);
        }
 }
 
@@ -2308,14 +2466,20 @@ 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);
+               modest_ui_actions_do_send_receive_all (win, FALSE);
        else
-               modest_ui_actions_do_send_receive (account_name, win);
+               modest_ui_actions_do_send_receive (account_name, FALSE, win);
        
 }
 
@@ -2344,9 +2508,7 @@ on_zoom_minus_plus_not_implemented (ModestWindow *window)
 }
 
 static gboolean
-on_folder_view_focus_in (GtkWidget *widget,
-                        GdkEventFocus *event,
-                        gpointer userdata)
+on_folder_view_focus_in (GtkWidget *widget, GdkEventFocus *event, gpointer userdata)
 {
        ModestMainWindow *main_window = NULL;
        
@@ -2365,11 +2527,10 @@ on_header_view_focus_in (GtkWidget *widget,
                         gpointer userdata)
 {
        ModestMainWindow *main_window = NULL;
-       ModestMainWindowPrivate *priv = NULL;
 
        g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (userdata), FALSE);
+
        main_window = MODEST_MAIN_WINDOW (userdata);
-       priv = MODEST_MAIN_WINDOW_GET_PRIVATE (main_window);
 
        /* Update toolbar dimming state */
        modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
@@ -2378,10 +2539,10 @@ on_header_view_focus_in (GtkWidget *widget,
 }
 
 static void 
-modest_main_window_on_folder_selection_changed (ModestFolderView *folder_view,
-                                               TnyFolderStore *folder_store, 
-                                               gboolean selected,
-                                               ModestMainWindow *main_window)
+on_folder_selection_changed (ModestFolderView *folder_view,
+                            TnyFolderStore *folder_store, 
+                            gboolean selected,
+                            ModestMainWindow *main_window)
 {
        ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (main_window);
        GtkAction *action = NULL;
@@ -2411,6 +2572,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;
@@ -2475,9 +2639,15 @@ show_updating_banner (gpointer user_data)
 
        priv = MODEST_MAIN_WINDOW_GET_PRIVATE (user_data);
 
-       priv->updating_banner = 
-               modest_platform_animation_banner (GTK_WIDGET (user_data), NULL,
-                                                 _CS ("ckdg_pb_updating"));
+       if (priv->updating_banner == NULL) {
+
+               /* We're outside the main lock */
+               gdk_threads_enter ();
+               priv->updating_banner = 
+                       modest_platform_animation_banner (GTK_WIDGET (user_data), NULL,
+                                                         _CS ("ckdg_pb_updating"));
+               gdk_threads_leave ();
+       }
 
        /* Remove timeout */
        priv->updating_banner_timeout = 0;
@@ -2500,7 +2670,7 @@ on_updating_msg_list (ModestHeaderView *header_view,
        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);
@@ -2519,3 +2689,15 @@ on_updating_msg_list (ModestHeaderView *header_view,
                }
        }
 }
+
+gboolean
+modest_main_window_screen_is_on (ModestMainWindow *self)
+{
+       ModestMainWindowPrivate *priv = NULL;
+
+       g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(self), FALSE);
+
+       priv = MODEST_MAIN_WINDOW_GET_PRIVATE (self);
+       
+       return (priv->display_state == OSSO_DISPLAY_ON) ? TRUE : FALSE;
+}