This is a manual merge of branch drop split view intro trunk.
[modest] / src / maemo / modest-main-window.c
index 5025c92..e63d715 100644 (file)
@@ -33,7 +33,6 @@
 #include <tny-simple-list.h>
 #include <tny-list.h>
 #include <tny-iterator.h>
-#include <tny-maemo-conic-device.h>
 #include <tny-error.h>
 #include "modest-hildon-includes.h"
 #include "modest-defs.h"
@@ -176,7 +175,7 @@ static void on_updating_msg_list (ModestHeaderView *header_view,
 
 static gboolean restore_paned_timeout_handler (gpointer *data);
 
-static gboolean show_retrieving_banner (gpointer user_data);
+static gboolean show_opening_banner (gpointer user_data);
 
 static void on_window_destroy (GtkObject *widget,
                               gpointer userdata);
@@ -236,9 +235,9 @@ struct _ModestMainWindowPrivate {
        GtkWidget *updating_banner;
        guint updating_banner_timeout;
 
-       /* "Retrieving" banner for header view */
-       GtkWidget *retrieving_banner;
-       guint retrieving_banner_timeout;
+       /* "Opening" banner for header view */
+       GtkWidget *opening_banner;
+       guint opening_banner_timeout;
 
        /* Display state */
        osso_display_state_t display_state;
@@ -369,8 +368,8 @@ modest_main_window_init (ModestMainWindow *obj)
        priv->sighandlers = NULL;
        priv->updating_banner = NULL;
        priv->updating_banner_timeout = 0;
-       priv->retrieving_banner = NULL;
-       priv->retrieving_banner_timeout = 0;
+       priv->opening_banner = NULL;
+       priv->opening_banner_timeout = 0;
        priv->display_state = OSSO_DISPLAY_ON;
        
        modest_window_mgr_register_help_id (modest_runtime_get_window_mgr(),
@@ -419,14 +418,14 @@ modest_main_window_finalize (GObject *obj)
                priv->updating_banner = NULL;
        }
 
-       if (priv->retrieving_banner_timeout > 0) {
-               g_source_remove (priv->retrieving_banner_timeout);
-               priv->retrieving_banner_timeout = 0;
+       if (priv->opening_banner_timeout > 0) {
+               g_source_remove (priv->opening_banner_timeout);
+               priv->opening_banner_timeout = 0;
        }
 
-       if (priv->retrieving_banner) {
-               gtk_widget_destroy (priv->retrieving_banner);
-               priv->retrieving_banner = NULL;
+       if (priv->opening_banner) {
+               gtk_widget_destroy (priv->opening_banner);
+               priv->opening_banner = NULL;
        }
 
        if (priv->restore_paned_timeout > 0) {
@@ -1115,7 +1114,8 @@ modest_main_window_on_show (GtkWidget *self, gpointer user_data)
        ShowHelper *helper = (ShowHelper *) user_data;
        GtkWidget *folder_win = helper->folder_win;
        ModestMainWindowPrivate *priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
-       
+       ModestAccountMgr *mgr;
+
        priv->folder_view = MODEST_FOLDER_VIEW (modest_platform_create_folder_view (NULL));
        wrap_in_scrolled_window (folder_win, GTK_WIDGET(priv->folder_view));
 
@@ -1137,18 +1137,10 @@ modest_main_window_on_show (GtkWidget *self, gpointer user_data)
        restore_settings (MODEST_MAIN_WINDOW(self), TRUE);
        priv->wait_for_settings = FALSE;
 
-       /* 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);
-
-       if (!accounts_exist) {
-               /* This is necessary to have the main window shown behind the dialog 
-               It's an ugly hack... jschmid */
-               gtk_widget_show_all(GTK_WIDGET(self));
-               modest_ui_actions_on_accounts (NULL, MODEST_WINDOW(self));
-       } else {
+       /* Update the menus if there are accounts */
+       mgr = modest_runtime_get_account_mgr();
+       if (modest_account_mgr_has_accounts(mgr, TRUE))
                update_menus (MODEST_MAIN_WINDOW (self));
-       }
 
        /* Never call this function again (NOTE that it could happen
           as we hide the main window instead of closing it while
@@ -1722,7 +1714,7 @@ on_inner_widgets_key_pressed (GtkWidget *widget,
                return FALSE;
 
        if (MODEST_IS_HEADER_VIEW (widget)) {
-               if (event->keyval == GDK_Left)
+               if (event->keyval == GDK_Left || event->keyval == GDK_KP_Left)
                        gtk_widget_grab_focus (GTK_WIDGET (priv->folder_view));
                else if ((event->keyval == GDK_Return)||(event->keyval == GDK_KP_Enter)) {
                        guint selected_headers = modest_header_view_count_selected_headers (MODEST_HEADER_VIEW (widget));
@@ -1745,7 +1737,8 @@ on_inner_widgets_key_pressed (GtkWidget *widget,
                                }
                        }
                }
-       } else if (MODEST_IS_FOLDER_VIEW (widget) && (event->keyval == GDK_Right || event->keyval == GDK_Left)) {
+       } else if (MODEST_IS_FOLDER_VIEW (widget) && 
+                  (event->keyval == GDK_Right || event->keyval == GDK_KP_Right || event->keyval == GDK_Left || event->keyval == GDK_KP_Left)) {
 #if GTK_CHECK_VERSION(2, 8, 0) /* TODO: gtk_tree_view_get_visible_range() is only available in GTK+ 2.8 */
                GtkTreePath *selected_path = NULL;
                GtkTreePath *start_path = NULL;
@@ -2206,6 +2199,8 @@ modest_main_window_set_contents_style (ModestMainWindow *self,
                wrap_in_scrolled_window (priv->contents_widget, GTK_WIDGET (priv->header_view));
                modest_maemo_set_thumbable_scrollbar (GTK_SCROLLED_WINDOW(priv->contents_widget),
                                                      TRUE);
+               if (priv->style == MODEST_MAIN_WINDOW_STYLE_SIMPLE)
+                       gtk_widget_grab_focus (GTK_WIDGET (priv->header_view));
                break;
        case MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS:
        {
@@ -2221,16 +2216,21 @@ modest_main_window_set_contents_style (ModestMainWindow *self,
                                wrap_in_scrolled_window (priv->contents_widget, 
                                                         priv->details_widget);
                        }
-                       g_object_unref (selected_folderstore);
+                       if (selected_folderstore)
+                               g_object_unref (selected_folderstore);
                        modest_maemo_set_thumbable_scrollbar (GTK_SCROLLED_WINDOW(priv->contents_widget),
                                                              FALSE);
                }
+               if (priv->style == MODEST_MAIN_WINDOW_STYLE_SIMPLE)
+                       gtk_widget_grab_focus (GTK_WIDGET (priv->details_widget));
                break;
        }
        case MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY:
                wrap_in_scrolled_window (priv->contents_widget, GTK_WIDGET (priv->empty_view));
                modest_maemo_set_thumbable_scrollbar (GTK_SCROLLED_WINDOW(priv->contents_widget),
                                                      FALSE);
+               if (priv->style == MODEST_MAIN_WINDOW_STYLE_SIMPLE)
+                       gtk_widget_grab_focus (GTK_WIDGET (priv->empty_view));
                break;
        default:
                g_return_if_reached ();
@@ -2238,6 +2238,10 @@ modest_main_window_set_contents_style (ModestMainWindow *self,
 
        /* Show */
        gtk_widget_show_all (priv->contents_widget);
+
+       /* Recompute dimming rules */
+        modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (self));
+       modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (self));
 }
 
 ModestMainWindowContentsStyle
@@ -2461,7 +2465,6 @@ get_toolbar_mode_from_mail_operation (ModestMainWindow *self,
        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;
                if (priv->current_toolbar_mode == TOOLBAR_MODE_NORMAL)
                        *mode_changed = TRUE;
@@ -2491,7 +2494,7 @@ on_mail_operation_started (ModestMailOperation *mail_op,
           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) {
+       if (account && op_type == MODEST_MAIL_OPERATION_TYPE_OPEN) {
                gboolean is_remote;
 
                is_remote = !(modest_tny_account_is_virtual_local_folders (account) ||
@@ -2502,13 +2505,13 @@ on_mail_operation_started (ModestMailOperation *mail_op,
                }
 
                /* Show information banner. Remove old timeout */
-               if (priv->retrieving_banner_timeout > 0) {
-                       g_source_remove (priv->retrieving_banner_timeout);
-                       priv->retrieving_banner_timeout = 0;
+               if (priv->opening_banner_timeout > 0) {
+                       g_source_remove (priv->opening_banner_timeout);
+                       priv->opening_banner_timeout = 0;
                }
                /* Create a new timeout */
-               priv->retrieving_banner_timeout = 
-                       g_timeout_add (2000, show_retrieving_banner, self);
+               priv->opening_banner_timeout = 
+                       g_timeout_add (2000, show_opening_banner, self);
        }
 
        /* Not every mail operation has account, noop does not */
@@ -2560,7 +2563,7 @@ on_mail_operation_finished (ModestMailOperation *mail_op,
           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) {
+       if (account && op_type == MODEST_MAIL_OPERATION_TYPE_OPEN) {
                gboolean is_remote;
 
                is_remote = !(modest_tny_account_is_virtual_local_folders (account) ||
@@ -2571,15 +2574,15 @@ on_mail_operation_finished (ModestMailOperation *mail_op,
                }
 
                /* Remove old timeout */
-               if (priv->retrieving_banner_timeout > 0) {
-                       g_source_remove (priv->retrieving_banner_timeout);
-                       priv->retrieving_banner_timeout = 0;
+               if (priv->opening_banner_timeout > 0) {
+                       g_source_remove (priv->opening_banner_timeout);
+                       priv->opening_banner_timeout = 0;
                }
 
                /* Remove the banner if exists */
-               if (priv->retrieving_banner) {
-                       gtk_widget_destroy (priv->retrieving_banner);
-                       priv->retrieving_banner = NULL;
+               if (priv->opening_banner) {
+                       gtk_widget_destroy (priv->opening_banner);
+                       priv->opening_banner = NULL;
                }
        }
 
@@ -2989,14 +2992,14 @@ remove_banners (ModestMainWindow *window)
 
        priv = MODEST_MAIN_WINDOW_GET_PRIVATE (window);
 
-       if (priv->retrieving_banner_timeout > 0) {
-               g_source_remove (priv->retrieving_banner_timeout);
-               priv->retrieving_banner_timeout = 0;
+       if (priv->opening_banner_timeout > 0) {
+               g_source_remove (priv->opening_banner_timeout);
+               priv->opening_banner_timeout = 0;
        }
 
-       if (priv->retrieving_banner != NULL) {
-               gtk_widget_destroy (priv->retrieving_banner);
-               priv->retrieving_banner = NULL;
+       if (priv->opening_banner != NULL) {
+               gtk_widget_destroy (priv->opening_banner);
+               priv->opening_banner = NULL;
        }
        
        if (priv->updating_banner_timeout > 0) {
@@ -3052,41 +3055,48 @@ on_window_destroy (GtkObject *widget,
 }
 
 static void
-retrieving_banner_destroyed (gpointer data,
-                            GObject *where_the_object_was)
+opening_banner_destroyed (gpointer data,
+                          GObject *where_the_object_was)
 {
        ModestMainWindowPrivate *priv = NULL;
 
        priv = MODEST_MAIN_WINDOW_GET_PRIVATE (data);
 
-       priv->retrieving_banner = NULL;
+       priv->opening_banner = NULL;
 }
 
 static gboolean
-show_retrieving_banner (gpointer user_data)
+show_opening_banner (gpointer user_data)
 {
        ModestMainWindowPrivate *priv = NULL;
 
        priv = MODEST_MAIN_WINDOW_GET_PRIVATE (user_data);
 
-       if (priv->retrieving_banner == NULL) {
+       if (priv->opening_banner == NULL) {
 
                /* We're outside the main lock */
                gdk_threads_enter ();
-               priv->retrieving_banner = 
+               priv->opening_banner = 
                        modest_platform_animation_banner (GTK_WIDGET (user_data), NULL,
-                                                         _("mcen_ib_getting_items"));
+                                                         _("mail_me_opening"));
+
+               /* We need this because banners in Maemo could be
+                  destroyed by dialogs so we need to properly update
+                  our reference to it */
+               g_object_weak_ref (G_OBJECT (priv->opening_banner),
+                                  opening_banner_destroyed,
+                                  user_data);
 
                /* We need this because banners in Maemo could be
                   destroyed by dialogs so we need to properly update
                   our reference to it */
-               g_object_weak_ref (G_OBJECT (priv->retrieving_banner),
-                                  retrieving_banner_destroyed,
+               g_object_weak_ref (G_OBJECT (priv->updating_banner),
+                                  updating_banner_destroyed,
                                   user_data);
                gdk_threads_leave ();
        }
 
        /* Remove timeout */
-       priv->retrieving_banner_timeout = 0;
+       priv->opening_banner_timeout = 0;
        return FALSE;
 }