* make modest_text_utils_get_display_date return a ptr to
[modest] / src / maemo / modest-main-window.c
index 697be5e..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,8 +96,7 @@ static void restore_settings (ModestMainWindow *self,
 
 static void save_state (ModestWindow *self);
 
-static void
-update_menus (ModestMainWindow* self);
+static void update_menus (ModestMainWindow* self);
 
 static void modest_main_window_show_toolbar   (ModestWindow *window,
                                               gboolean show_toolbar);
@@ -174,6 +173,12 @@ static void      modest_main_window_on_folder_selection_changed (ModestFolderVie
                                                
 static void set_at_least_one_account_visible(ModestMainWindow *self);
 
+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 {
        GtkWidget *msg_paned;
@@ -214,10 +219,15 @@ struct _ModestMainWindowPrivate {
        ModestMainWindowContentsStyle contents_style;
 
        guint progress_bar_timeout;
+       guint restore_paned_timeout;
 
        /* Signal handler UIDs */
        GList *queue_err_signals;
        GSList *sighandlers;
+
+       /* "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
@@ -365,6 +378,16 @@ 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);
 }
 
@@ -393,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)
@@ -417,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));
@@ -515,7 +555,7 @@ update_menus (ModestMainWindow* self)
                        }
                        /* We need to call this in order to ensure
                           that the new actions are added in the right
-                          order (alphabetical */
+                          order (alphabetical) */
                        gtk_ui_manager_ensure_update (parent_priv->ui_manager);
                } else 
                        groups = g_list_next (groups);
@@ -545,13 +585,9 @@ update_menus (ModestMainWindow* self)
        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;
-               
+               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"), 
@@ -841,48 +877,72 @@ connect_signals (ModestMainWindow *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->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 (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);
+       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);
+       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
@@ -947,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),
@@ -957,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 = 
@@ -1160,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)
@@ -1443,8 +1479,11 @@ on_inner_widgets_key_pressed (GtkWidget *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)) {
-                       hildon_banner_show_information (NULL, NULL, _("mcen_ib_select_one_message"));
-                       return TRUE;
+                       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));
@@ -1620,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
@@ -1636,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);
        }
 
@@ -2019,69 +2056,159 @@ 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;
+       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) {
+       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
@@ -2157,9 +2284,15 @@ 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);
@@ -2260,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;
@@ -2317,3 +2453,54 @@ 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;
+               }
+       }
+}