Add "updating" title as progress feedback in msg view
[modest] / src / hildon2 / modest-msg-view-window.c
index a35bc6b..5519206 100644 (file)
 #include <modest-main-window-ui.h>
 #include "modest-msg-view-window-ui-dimming.h"
 #include <modest-widget-memory.h>
+#include <modest-progress-object.h>
 #include <modest-runtime.h>
 #include <modest-window-priv.h>
 #include <modest-tny-folder.h>
 #include <modest-text-utils.h>
 #include <modest-account-mgr-helpers.h>
-#include "modest-progress-bar.h"
 #include <hildon/hildon-pannable-area.h>
 #include <hildon/hildon-picker-dialog.h>
+#include <hildon/hildon-app-menu.h>
 #include "modest-defs.h"
 #include "modest-hildon-includes.h"
 #include "modest-ui-dimming-manager.h"
@@ -63,6 +64,7 @@
 #include <errno.h>
 #include <glib/gstdio.h>
 #include <modest-debug.h>
+#include <modest-header-window.h>
 
 #define MYDOCS_ENV "MYDOCSDIR"
 #define DOCS_FOLDER ".documents"
@@ -76,15 +78,12 @@ struct _ModestMsgViewWindowPrivate {
        gchar       *last_search;
 
        /* Progress observers */
-       GtkWidget        *progress_bar;
        GSList           *progress_widgets;
 
        /* Tollbar items */
-       GtkWidget   *progress_toolitem;
-       GtkWidget   *cancel_toolitem;
        GtkWidget   *prev_toolitem;
        GtkWidget   *next_toolitem;
-       ModestToolBarModes current_toolbar_mode;
+       gboolean    progress_hint;
 
        /* Optimized view enabled */
        gboolean optimized_view;
@@ -115,8 +114,6 @@ struct _ModestMsgViewWindowPrivate {
        guint purge_timeout;
        GtkWidget *remove_attachment_banner;
 
-       guint progress_bar_timeout;
-
        gchar *msg_uid;
        
        GSList *sighandlers;
@@ -137,10 +134,13 @@ static void  modest_msg_view_window_find_toolbar_search (GtkWidget *widget,
 static void modest_msg_view_window_disconnect_signals (ModestWindow *self);
 
 static gdouble modest_msg_view_window_get_zoom (ModestWindow *window);
+static void modest_msg_view_window_set_zoom (ModestWindow *window,
+                                            gdouble zoom);
+static gboolean modest_msg_view_window_zoom_minus (ModestWindow *window);
+static gboolean modest_msg_view_window_zoom_plus (ModestWindow *window);
 static gboolean modest_msg_view_window_key_event (GtkWidget *window,
                                                  GdkEventKey *event,
                                                  gpointer userdata);
-
 static void modest_msg_view_window_update_priority (ModestMsgViewWindow *window);
 
 static void modest_msg_view_window_show_toolbar   (ModestWindow *window,
@@ -174,9 +174,6 @@ static void modest_msg_view_window_update_model_replaced (ModestHeaderViewObserv
                                                          GtkTreeModel *model,
                                                          const gchar *tny_folder_id);
 
-static void cancel_progressbar  (GtkToolButton *toolbutton,
-                                ModestMsgViewWindow *self);
-
 static void on_queue_changed    (ModestMailOperationQueue *queue,
                                 ModestMailOperation *mail_op,
                                 ModestMailOperationQueueNotification type,
@@ -197,8 +194,8 @@ static void view_msg_cb         (ModestMailOperation *mail_op,
                                 GError *error,
                                 gpointer user_data);
 
-static void set_toolbar_mode    (ModestMsgViewWindow *self, 
-                                ModestToolBarModes mode);
+static void set_progress_hint    (ModestMsgViewWindow *self, 
+                                 gboolean enabled);
 
 static void update_window_title (ModestMsgViewWindow *window);
 
@@ -223,6 +220,8 @@ static gboolean message_reader (ModestMsgViewWindow *window,
                                TnyHeader *header,
                                GtkTreeRowReference *row_reference);
 
+static void setup_menu (ModestMsgViewWindow *self);
+
 /* list my signals */
 enum {
        MSG_CHANGED_SIGNAL,
@@ -234,6 +233,7 @@ static const GtkToggleActionEntry msg_view_toggle_action_entries [] = {
        { "FindInMessage",    MODEST_TOOLBAR_ICON_FIND,    N_("qgn_toolb_gene_find"), NULL, NULL, G_CALLBACK (modest_msg_view_window_toggle_find_toolbar), FALSE },
 };
 
+
 #define MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
                                                     MODEST_TYPE_MSG_VIEW_WINDOW, \
                                                     ModestMsgViewWindowPrivate))
@@ -260,7 +260,7 @@ modest_msg_view_window_get_type (void)
                        (GInstanceInitFunc) modest_msg_view_window_init,
                        NULL
                };
-               my_type = g_type_register_static (MODEST_TYPE_WINDOW,
+               my_type = g_type_register_static (MODEST_TYPE_HILDON2_WINDOW,
                                                  "ModestMsgViewWindow",
                                                  &my_info, 0);
 
@@ -286,21 +286,11 @@ save_state (ModestWindow *self)
                                   MODEST_CONF_MSG_VIEW_WINDOW_KEY);
 }
 
-static void
-restore_settings (ModestMsgViewWindow *self)
-{
-       ModestConf *conf;
-
-       conf = modest_runtime_get_conf ();
-       modest_widget_memory_restore (conf,
-                                     G_OBJECT(self), 
-                                     MODEST_CONF_MSG_VIEW_WINDOW_KEY);
-}
-
-static gboolean modest_msg_view_window_scroll_child (ModestMsgViewWindow *self,
-                                                    GtkScrollType scroll_type,
-                                                    gboolean horizontal,
-                                                    gpointer userdata)
+static 
+gboolean modest_msg_view_window_scroll_child (ModestMsgViewWindow *self,
+                                             GtkScrollType scroll_type,
+                                             gboolean horizontal,
+                                             gpointer userdata)
 {
        ModestMsgViewWindowPrivate *priv;
        gboolean return_value;
@@ -331,16 +321,21 @@ static void
 modest_msg_view_window_class_init (ModestMsgViewWindowClass *klass)
 {
        GObjectClass *gobject_class;
+       HildonWindowClass *hildon_window_class;
        ModestWindowClass *modest_window_class;
        GtkBindingSet *binding_set;
 
        gobject_class = (GObjectClass*) klass;
+       hildon_window_class = (HildonWindowClass *) klass;
        modest_window_class = (ModestWindowClass *) klass;
 
        parent_class            = g_type_class_peek_parent (klass);
        gobject_class->finalize = modest_msg_view_window_finalize;
 
+       modest_window_class->set_zoom_func = modest_msg_view_window_set_zoom;
        modest_window_class->get_zoom_func = modest_msg_view_window_get_zoom;
+       modest_window_class->zoom_plus_func = modest_msg_view_window_zoom_plus;
+       modest_window_class->zoom_minus_func = modest_msg_view_window_zoom_minus;
        modest_window_class->show_toolbar_func = modest_msg_view_window_show_toolbar;
        modest_window_class->disconnect_signals_func = modest_msg_view_window_disconnect_signals;
 
@@ -440,10 +435,9 @@ modest_msg_view_window_init (ModestMsgViewWindow *obj)
        priv->row_deleted_handler = 0;
        priv->row_inserted_handler = 0;
        priv->rows_reordered_handler = 0;
-       priv->current_toolbar_mode = TOOLBAR_MODE_NORMAL;
+       priv->progress_hint = FALSE;
 
        priv->optimized_view  = FALSE;
-       priv->progress_bar_timeout = 0;
        priv->purge_timeout = 0;
        priv->remove_attachment_banner = NULL;
        priv->msg_uid = NULL;
@@ -475,88 +469,28 @@ set_toolbar_transfer_mode (ModestMsgViewWindow *self)
 
        priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(self);
 
-       set_toolbar_mode (self, TOOLBAR_MODE_TRANSFER);
-       
-       if (priv->progress_bar_timeout > 0) {
-               g_source_remove (priv->progress_bar_timeout);
-               priv->progress_bar_timeout = 0;
-       }
+       set_progress_hint (self, TRUE);
        
        return FALSE;
 }
 
 static void 
-set_toolbar_mode (ModestMsgViewWindow *self, 
-                 ModestToolBarModes mode)
+set_progress_hint (ModestMsgViewWindow *self, 
+                  gboolean enabled)
 {
        ModestWindowPrivate *parent_priv;
        ModestMsgViewWindowPrivate *priv;
-/*     GtkWidget *widget = NULL; */
 
        g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self));
 
        parent_priv = MODEST_WINDOW_GET_PRIVATE(self);
        priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(self);
                        
-       /* Sets current toolbar mode */
-       priv->current_toolbar_mode = mode;
-
-       /* Update toolbar dimming state */
-       modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (self));
-
-       switch (mode) {
-       case TOOLBAR_MODE_NORMAL:               
-               if (priv->progress_toolitem) {
-                       gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), FALSE);
-                       gtk_widget_hide (priv->progress_toolitem);
-               }
-
-               if (priv->progress_bar)
-                       gtk_widget_hide (priv->progress_bar);
-                       
-               if (priv->cancel_toolitem)
-                       gtk_widget_hide (priv->cancel_toolitem);
-
-               if (priv->prev_toolitem)
-                       gtk_widget_show (priv->prev_toolitem);
-               
-               if (priv->next_toolitem)
-                       gtk_widget_show (priv->next_toolitem);
-                       
-               /* Hide toolbar if optimized view is enabled */
-               if (priv->optimized_view) {
-                       gtk_widget_set_no_show_all (parent_priv->toolbar, TRUE);
-                       gtk_widget_hide (GTK_WIDGET(parent_priv->toolbar));
-               }
-
-               break;
-       case TOOLBAR_MODE_TRANSFER:
-               if (priv->prev_toolitem)
-                       gtk_widget_hide (priv->prev_toolitem);
-               
-               if (priv->next_toolitem)
-                       gtk_widget_hide (priv->next_toolitem);
-               
-               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->cancel_toolitem)
-                       gtk_widget_show (priv->cancel_toolitem);
-
-               /* Show toolbar if it's hiden (optimized view ) */
-               if (priv->optimized_view) {
-                       gtk_widget_set_no_show_all (parent_priv->toolbar, FALSE);
-                       gtk_widget_show (GTK_WIDGET (parent_priv->toolbar));
-               }
+       /* Sets current progress hint */
+       priv->progress_hint = enabled;
 
-               break;
-       default:
-               g_return_if_reached ();
+       if (GTK_WIDGET_VISIBLE (self)) {
+               hildon_gtk_window_set_progress_indicator (GTK_WINDOW (self), enabled?1:0);
        }
 
 }
@@ -603,8 +537,8 @@ static void
 modest_msg_view_window_disconnect_signals (ModestWindow *self)
 {
        ModestMsgViewWindowPrivate *priv;
-       ModestHeaderView *header_view = NULL;
-       ModestWindow *main_window = NULL;
+       GtkWidget *header_view = NULL;
+       GtkWindow *parent_window = NULL;
        
        priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
 
@@ -648,21 +582,15 @@ modest_msg_view_window_disconnect_signals (ModestWindow *self)
 
        modest_signal_mgr_disconnect_all_and_destroy (priv->sighandlers);
        priv->sighandlers = NULL;
-       
-       main_window = modest_window_mgr_get_main_window (modest_runtime_get_window_mgr(),
-                                                        FALSE); /* don't create */
-       if (!main_window)
-               return;
-       
-       header_view = MODEST_HEADER_VIEW(
-                       modest_main_window_get_child_widget(
-                               MODEST_MAIN_WINDOW(main_window),
-                               MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW));
-       if (header_view == NULL)
-               return;
-       
-       modest_header_view_remove_observer(header_view,
-                       MODEST_HEADER_VIEW_OBSERVER(self));
+
+       parent_window = gtk_window_get_transient_for (GTK_WINDOW (self));
+       if (parent_window && MODEST_IS_HEADER_WINDOW (parent_window)) {
+               header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (parent_window)));
+               if (header_view) {
+                       modest_header_view_remove_observer(MODEST_HEADER_VIEW (header_view),
+                                                          MODEST_HEADER_VIEW_OBSERVER(self));
+               }
+       }
 }      
 
 static void
@@ -681,11 +609,6 @@ modest_msg_view_window_finalize (GObject *obj)
                priv->header_model = NULL;
        }
 
-       if (priv->progress_bar_timeout > 0) {
-               g_source_remove (priv->progress_bar_timeout);
-               priv->progress_bar_timeout = 0;
-       }
-
        if (priv->remove_attachment_banner) {
                gtk_widget_destroy (priv->remove_attachment_banner);
                g_object_unref (priv->remove_attachment_banner);
@@ -800,7 +723,6 @@ modest_msg_view_window_construct (ModestMsgViewWindow *self,
        GObject *obj = NULL;
        ModestMsgViewWindowPrivate *priv = NULL;
        ModestWindowPrivate *parent_priv = NULL;
-       ModestDimmingRulesGroup *menu_rules_group = NULL;
        ModestDimmingRulesGroup *toolbar_rules_group = NULL;
        ModestDimmingRulesGroup *clipboard_rules_group = NULL;
 
@@ -811,20 +733,13 @@ modest_msg_view_window_construct (ModestMsgViewWindow *self,
        priv->msg_uid = g_strdup (msg_uid);
 
        /* Menubar */
-       parent_priv->menubar = modest_maemo_utils_get_manager_menubar_as_menu (parent_priv->ui_manager, "/MenuBar");
-       hildon_window_set_menu    (HILDON_WINDOW(obj), GTK_MENU(parent_priv->menubar));
-       gtk_widget_show (parent_priv->menubar);
-       parent_priv->ui_dimming_manager = modest_ui_dimming_manager_new();
+       parent_priv->menubar = NULL;
 
-       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);
        clipboard_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_CLIPBOARD, FALSE);
 
+       setup_menu (self);
        /* Add common dimming rules */
-       modest_dimming_rules_group_add_rules (menu_rules_group, 
-                                             modest_msg_view_menu_dimming_entries,
-                                             G_N_ELEMENTS (modest_msg_view_menu_dimming_entries),
-                                             MODEST_WINDOW (self));
        modest_dimming_rules_group_add_rules (toolbar_rules_group, 
                                              modest_msg_view_toolbar_dimming_entries,
                                              G_N_ELEMENTS (modest_msg_view_toolbar_dimming_entries),
@@ -835,10 +750,8 @@ modest_msg_view_window_construct (ModestMsgViewWindow *self,
                                              MODEST_WINDOW (self));
 
        /* Insert dimming rules group for this window */
-       modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, menu_rules_group);
        modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, toolbar_rules_group);
        modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, clipboard_rules_group);
-       g_object_unref (menu_rules_group);
        g_object_unref (toolbar_rules_group);
        g_object_unref (clipboard_rules_group);
 
@@ -1038,6 +951,7 @@ modest_msg_view_window_new_from_header_view (ModestHeaderView *header_view,
 
        /* Setup row references and connect signals */
        priv->header_model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
+       g_object_ref (priv->header_model);
 
        if (row_reference) {
                priv->row_reference = gtk_tree_row_reference_copy (row_reference);
@@ -1401,7 +1315,7 @@ modest_msg_view_window_toolbar_on_transfer_mode     (ModestMsgViewWindow *self)
        g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self), FALSE);
        priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
 
-       return priv->current_toolbar_mode == TOOLBAR_MODE_TRANSFER;
+       return priv->progress_hint;
 }
 
 TnyHeader*
@@ -1492,7 +1406,9 @@ modest_msg_view_window_toggle_find_toolbar (GtkToggleAction *toggle,
 
        /* update the toggle buttons status */
        action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/FindInMessage");
-       modest_utils_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), is_active);
+       if (action)
+               modest_utils_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), is_active);
+
 }
 
 static void
@@ -1505,7 +1421,7 @@ modest_msg_view_window_find_toolbar_close (GtkWidget *widget,
 
        priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (obj);
        parent_priv = MODEST_WINDOW_GET_PRIVATE (obj);
-       
+
        toggle = GTK_TOGGLE_ACTION (gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/FindInMessage"));
        gtk_toggle_action_set_active (toggle, FALSE);
        modest_msg_view_grab_focus (MODEST_MSG_VIEW (priv->msg_view));
@@ -1560,6 +1476,21 @@ modest_msg_view_window_find_toolbar_search (GtkWidget *widget,
                
 }
 
+static void
+modest_msg_view_window_set_zoom (ModestWindow *window,
+                                gdouble zoom)
+{
+       ModestMsgViewWindowPrivate *priv;
+       ModestWindowPrivate *parent_priv;
+     
+       g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window));
+
+       priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+       parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
+       modest_zoomable_set_zoom (MODEST_ZOOMABLE (priv->msg_view), zoom);
+
+}
+
 static gdouble
 modest_msg_view_window_get_zoom (ModestWindow *window)
 {
@@ -1572,6 +1503,76 @@ modest_msg_view_window_get_zoom (ModestWindow *window)
 }
 
 static gboolean
+modest_msg_view_window_zoom_plus (ModestWindow *window)
+{
+       gdouble zoom_level;
+       ModestMsgViewWindowPrivate *priv;
+     
+       g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), 1.0);
+       priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+  
+       zoom_level =  modest_zoomable_get_zoom (MODEST_ZOOMABLE (priv->msg_view));
+
+       if (zoom_level >= 2.0) {
+               hildon_banner_show_information (NULL, NULL, dgettext("hildon-common-strings", "ckct_ib_max_zoom_level_reached"));
+               return FALSE;
+       } else if (zoom_level >= 1.5) {
+               zoom_level = 2.0;
+       } else if (zoom_level >= 1.2) {
+               zoom_level = 1.5;
+       } else if (zoom_level >= 1.0) {
+               zoom_level = 1.2;
+       } else if (zoom_level >= 0.8) {
+               zoom_level = 1.0;
+       } else if (zoom_level >= 0.5) {
+               zoom_level = 0.8;
+       } else {
+               zoom_level = 0.5;
+       }
+
+       /* set zoom level */
+       modest_zoomable_set_zoom (MODEST_ZOOMABLE (priv->msg_view), zoom_level);
+
+       return TRUE;
+       
+}
+
+static gboolean
+modest_msg_view_window_zoom_minus (ModestWindow *window)
+{
+       gdouble zoom_level;
+       ModestMsgViewWindowPrivate *priv;
+     
+       g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), 1.0);
+       priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+  
+       zoom_level =  modest_zoomable_get_zoom (MODEST_ZOOMABLE (priv->msg_view));
+
+       if (zoom_level <= 0.5) {
+                         hildon_banner_show_information (NULL, NULL, dgettext("hildon-common-strings", "ckct_ib_min_zoom_level_reached"));
+               return FALSE;
+       } else if (zoom_level <= 0.8) {
+               zoom_level = 0.5;
+       } else if (zoom_level <= 1.0) {
+               zoom_level = 0.8;
+       } else if (zoom_level <= 1.2) {
+               zoom_level = 1.0;
+       } else if (zoom_level <= 1.5) {
+               zoom_level = 1.2;
+       } else if (zoom_level <= 2.0) {
+               zoom_level = 1.5;
+       } else {
+               zoom_level = 2.0;
+       }
+
+       /* set zoom level */
+       modest_zoomable_set_zoom (MODEST_ZOOMABLE (priv->msg_view), zoom_level);
+
+       return TRUE;
+       
+}
+
+static gboolean
 modest_msg_view_window_key_event (GtkWidget *window,
                                  GdkEventKey *event,
                                  gpointer userdata)
@@ -1829,6 +1830,11 @@ message_reader (ModestMsgViewWindow *window,
        mgr = modest_runtime_get_window_mgr ();
        /* Msg download completed */
        if (!(tny_header_get_flags (header) & TNY_HEADER_FLAG_CACHED)) {
+
+               /* We set the header from model while we're loading */
+               tny_header_view_set_header (TNY_HEADER_VIEW (priv->msg_view), header);
+               gtk_window_set_title (GTK_WINDOW (window), _CS("ckdg_pb_updating"));
+
                /* Ask the user if he wants to download the message if
                   we're not online */
                if (!tny_device_is_online (modest_runtime_get_device())) {
@@ -2139,10 +2145,6 @@ toolbar_resize (ModestMsgViewWindow *self)
                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->next_toolitem), TRUE);
                gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->next_toolitem), TRUE);
                gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->prev_toolitem), TRUE);
@@ -2158,8 +2160,6 @@ modest_msg_view_window_show_toolbar (ModestWindow *self,
        ModestMsgViewWindowPrivate *priv = NULL;
        ModestWindowPrivate *parent_priv;
        GtkWidget *reply_button = NULL, *menu = NULL;
-       GtkWidget *placeholder = NULL;
-       gint insert_index;
 
        parent_priv = MODEST_WINDOW_GET_PRIVATE(self);
        priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(self);
@@ -2172,28 +2172,10 @@ modest_msg_view_window_show_toolbar (ModestWindow *self,
                                                                  "/ToolBar");
                gtk_widget_set_no_show_all (parent_priv->toolbar, TRUE);
 
-               priv->progress_toolitem = GTK_WIDGET (gtk_tool_item_new ());
-               priv->cancel_toolitem = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarCancel");
                priv->next_toolitem = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageNext");
                priv->prev_toolitem = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageBack");
                toolbar_resize (MODEST_MSG_VIEW_WINDOW (self));
 
-               /* Add ProgressBar (Transfer toolbar) */ 
-               priv->progress_bar = modest_progress_bar_new ();
-               gtk_widget_set_no_show_all (priv->progress_bar, TRUE);
-               placeholder = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ProgressbarView");
-               insert_index = gtk_toolbar_get_item_index(GTK_TOOLBAR (parent_priv->toolbar), GTK_TOOL_ITEM(placeholder));
-               gtk_container_add (GTK_CONTAINER (priv->progress_toolitem), priv->progress_bar);
-               gtk_toolbar_insert(GTK_TOOLBAR(parent_priv->toolbar), GTK_TOOL_ITEM (priv->progress_toolitem), insert_index);
-
-               /* Connect cancel 'clicked' signal to abort progress mode */
-               g_signal_connect(priv->cancel_toolitem, "clicked",
-                                G_CALLBACK(cancel_progressbar),
-                                self);
-
-               /* Add it to the observers list */
-               priv->progress_widgets = g_slist_prepend(priv->progress_widgets, priv->progress_bar);
-
                /* Add to window */
                hildon_window_add_toolbar (HILDON_WINDOW (self), 
                                           GTK_TOOLBAR (parent_priv->toolbar));
@@ -2203,7 +2185,8 @@ modest_msg_view_window_show_toolbar (ModestWindow *self,
                                                          "/ToolBar/ToolbarMessageReply");
                menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, 
                                                  "/ToolbarReplyCSM");
-               gtk_widget_tap_and_hold_setup (GTK_WIDGET (reply_button), menu, NULL, 0);
+               if (menu && reply_button)
+                       gtk_widget_tap_and_hold_setup (GTK_WIDGET (reply_button), menu, NULL, 0);
        }
 
        if (show_toolbar) {
@@ -2213,9 +2196,9 @@ modest_msg_view_window_show_toolbar (ModestWindow *self,
 
                gtk_widget_show (GTK_WIDGET (parent_priv->toolbar));
                if (modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (self))) 
-                       set_toolbar_mode (MODEST_MSG_VIEW_WINDOW (self), TOOLBAR_MODE_TRANSFER);
+                       set_progress_hint (MODEST_MSG_VIEW_WINDOW (self), TRUE);
                else
-                       set_toolbar_mode (MODEST_MSG_VIEW_WINDOW (self), TOOLBAR_MODE_NORMAL);
+                       set_progress_hint (MODEST_MSG_VIEW_WINDOW (self), FALSE);
 
        } else {
                gtk_widget_set_no_show_all (parent_priv->toolbar, TRUE);
@@ -2242,25 +2225,9 @@ modest_msg_view_window_transfer_mode_enabled (ModestMsgViewWindow *self)
        g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self), FALSE); 
        priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(self);
 
-       return priv->current_toolbar_mode == TOOLBAR_MODE_TRANSFER;
+       return priv->progress_hint;
 }
 
-static void
-cancel_progressbar (GtkToolButton *toolbutton,
-                   ModestMsgViewWindow *self)
-{
-       GSList *tmp;
-       ModestMsgViewWindowPrivate *priv;
-       
-       priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(self);
-
-       /* Get operation observers and cancel its current operation */
-       tmp = priv->progress_widgets;
-       while (tmp) {
-               modest_progress_object_cancel_current_operation (MODEST_PROGRESS_OBJECT(tmp->data));
-               tmp=g_slist_next(tmp);
-       }
-}
 static gboolean
 observers_empty (ModestMsgViewWindow *self)
 {
@@ -2355,7 +2322,7 @@ on_mail_operation_finished (ModestMailOperation *mail_op,
 
                /* If no more operations are being observed, NORMAL mode is enabled again */
                if (observers_empty (self)) {
-                       set_toolbar_mode (self, TOOLBAR_MODE_NORMAL);
+                       set_progress_hint (self, FALSE);
                }
 
                /* Update dimming rules. We have to do this right here
@@ -2430,7 +2397,6 @@ decode_async_banner_idle (gpointer user_data)
 
        helper->banner_idle_id = 0;
        helper->banner = hildon_banner_show_animation (NULL, NULL, _("mail_me_opening"));
-       g_object_ref (helper->banner);
 
        return FALSE;
 }
@@ -2450,6 +2416,7 @@ on_decode_to_stream_async_handler (TnyMimePart *mime_part,
        }
        if (helper->banner) {
                gtk_widget_destroy (helper->banner);
+               helper->banner = NULL;
        }
        if (cancelled || err) {
                modest_platform_information_banner (NULL, NULL, 
@@ -2459,14 +2426,13 @@ on_decode_to_stream_async_handler (TnyMimePart *mime_part,
 
        /* make the file read-only */
        g_chmod(helper->filepath, 0444);
-       
+
        /* Activate the file */
        modest_platform_activate_file (helper->filepath, tny_mime_part_get_content_type (mime_part));
 
  free:
        /* Frees */
        g_free (helper->filepath);
-       g_object_unref (helper->banner);
        g_slice_free (DecodeAsyncHelper, helper);
 }
 
@@ -2824,7 +2790,7 @@ modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, TnyList *m
                                                      GTK_FILE_CHOOSER_ACTION_SAVE);
 
        /* set folder */
-       folder = g_build_filename (g_get_home_dir (), g_getenv (MYDOCS_ENV), DOCS_FOLDER, NULL);
+       folder = g_build_filename (g_getenv (MYDOCS_ENV), DOCS_FOLDER, NULL);
        gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (save_dialog), folder);
        g_free (folder);
 
@@ -3126,6 +3092,41 @@ on_fetch_image (ModestMsgView *msgview,
        return TRUE;;
 }
 
+static void 
+setup_menu (ModestMsgViewWindow *self)
+{
+       g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW(self));
+
+       /* Settings menu buttons */
+       modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_inbox_replytoall"), NULL,
+                                          APP_MENU_CALLBACK (modest_ui_actions_on_reply_all),
+                                          MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_reply_msg));
+       modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_inbox_forward"), "<Control>d",
+                                          APP_MENU_CALLBACK (modest_ui_actions_on_forward),
+                                          MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_reply_msg));
+       
+       modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_inbox_mark_as_read"), NULL,
+                                          APP_MENU_CALLBACK (modest_ui_actions_on_mark_as_read),
+                                          MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_mark_as_read_msg_in_view));
+       modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_inbox_mark_as_unread"), NULL,
+                                          APP_MENU_CALLBACK (modest_ui_actions_on_mark_as_unread),
+                                          MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_mark_as_unread_msg_in_view));
+       
+       modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_viewer_save_attachments"), NULL,
+                                          APP_MENU_CALLBACK (modest_ui_actions_save_attachments),
+                                          MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_save_attachments));
+       modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_inbox_remove_attachments"), NULL,
+                                          APP_MENU_CALLBACK (modest_ui_actions_remove_attachments),
+                                          MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_remove_attachments));
+       
+       modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_new_message"), "<Control>n",
+                                          APP_MENU_CALLBACK (modest_ui_actions_on_new_msg),
+                                          MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_new_msg));
+       modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_viewer_addtocontacts"), NULL,
+                                          APP_MENU_CALLBACK (modest_ui_actions_add_to_contacts),
+                                          MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_add_to_contacts));
+}
+
 void
 modest_msg_view_window_add_to_contacts (ModestMsgViewWindow *self)
 {
@@ -3143,9 +3144,11 @@ modest_msg_view_window_add_to_contacts (ModestMsgViewWindow *self)
                GtkWidget *picker_dialog;
                GtkWidget *selector;
                GSList *node;
-               gchar *selected;
+               gchar *selected = NULL;
 
                selector = hildon_touch_selector_new_text ();
+               g_object_ref (selector);
+
                for (node = recipients; node != NULL; node = g_slist_next (node)) {
                        if (!modest_address_book_has_address ((const gchar *) node->data)) {
                                hildon_touch_selector_append_text (HILDON_TOUCH_SELECTOR (selector), 
@@ -3155,6 +3158,7 @@ modest_msg_view_window_add_to_contacts (ModestMsgViewWindow *self)
                }
 
                if (contacts_to_add) {
+                       gint picker_result;
 
                        picker_dialog = hildon_picker_dialog_new (GTK_WINDOW (self));
                        gtk_window_set_title (GTK_WINDOW (picker_dialog), _("mcen_me_viewer_addtocontacts"));
@@ -3162,8 +3166,11 @@ modest_msg_view_window_add_to_contacts (ModestMsgViewWindow *self)
                        hildon_picker_dialog_set_selector (HILDON_PICKER_DIALOG (picker_dialog), 
                                                           HILDON_TOUCH_SELECTOR (selector));
                        
-                       gtk_dialog_run (GTK_DIALOG (picker_dialog));
-                       selected = hildon_touch_selector_get_current_text (HILDON_TOUCH_SELECTOR (selector));
+                       picker_result = gtk_dialog_run (GTK_DIALOG (picker_dialog));
+
+                       if (picker_result == GTK_RESPONSE_OK) {
+                               selected = hildon_touch_selector_get_current_text (HILDON_TOUCH_SELECTOR (selector));
+                       }
                        gtk_widget_destroy (picker_dialog);
 
                        if (selected)