2007-06-13 Johannes Schmid <johannes.schmid@openismus.com>
[modest] / src / maemo / modest-main-window.c
index 4cd1d05..8523cdf 100644 (file)
@@ -82,7 +82,7 @@ static gboolean modest_main_window_window_state_event (GtkWidget *widget,
 
 static void connect_signals (ModestMainWindow *self);
 
-static void restore_settings (ModestMainWindow *self);
+static void restore_settings (ModestMainWindow *self, gboolean do_folder_view_too);
 static void save_state (ModestWindow *self);
 
 static void modest_main_window_show_toolbar   (ModestWindow *window,
@@ -123,6 +123,12 @@ static void on_refresh_account_action_activated   (GtkAction *action,
 static void on_send_receive_csm_activated         (GtkMenuItem *item,
                                                   gpointer user_data);
 
+static void
+_on_msg_count_changed (ModestHeaderView *header_view,
+                      TnyFolder *folder,
+                      TnyFolderChange *change,
+                      ModestMainWindow *main_window);
+
 
 static GtkWidget * create_empty_view (void);
 
@@ -347,7 +353,7 @@ modest_main_window_get_child_widget (ModestMainWindow *self,
 
 
 static void
-restore_settings (ModestMainWindow *self)
+restore_settings (ModestMainWindow *self, gboolean do_folder_view_too)
 {
        ModestConf *conf;
        ModestMainWindowPrivate *priv;
@@ -360,7 +366,9 @@ restore_settings (ModestMainWindow *self)
                                      MODEST_CONF_MAIN_WINDOW_KEY);
        modest_widget_memory_restore (conf, G_OBJECT(priv->header_view),
                                      MODEST_CONF_HEADER_VIEW_KEY);
-       modest_widget_memory_restore (conf, G_OBJECT(priv->folder_view),
+
+       if (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);
@@ -385,8 +393,8 @@ save_state (ModestWindow *window)
                                   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);
+/*     modest_widget_memory_save (conf, G_OBJECT(priv->header_view),  */
+/*                                MODEST_CONF_HEADER_VIEW_KEY); */
        modest_widget_memory_save (conf, G_OBJECT(priv->folder_view), 
                                   MODEST_CONF_FOLDER_VIEW_KEY);
 }
@@ -518,6 +526,8 @@ connect_signals (ModestMainWindow *self)
                          G_CALLBACK(modest_ui_actions_on_item_not_found), self);
        g_signal_connect (G_OBJECT(priv->header_view), "key-press-event",
                          G_CALLBACK(on_inner_widgets_key_pressed), self);
+       g_signal_connect (G_OBJECT(priv->header_view), "msg_count_changed",
+                         G_CALLBACK(_on_msg_count_changed), self);
 
        /* Header view CSM */
        menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/HeaderViewCSM");
@@ -607,8 +617,55 @@ static void on_hildon_program_is_topmost_notify(GObject *self,
        
 }
 
+static void
+modest_main_window_on_show (GtkWidget *self, gpointer user_data)
+{
+       GtkWidget *folder_win = (GtkWidget *) user_data;
+       ModestMainWindowPrivate *priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
+
+       priv->folder_view = MODEST_FOLDER_VIEW(modest_folder_view_new (NULL));
+       if (!priv->folder_view)
+               g_printerr ("modest: cannot instantiate folder view\n");
+
+       gtk_widget_show (GTK_WIDGET (priv->folder_view));
+
+       /* Connect signals */
+       connect_signals ((ModestMainWindow*)self);
+
+       modest_folder_view_set_style (priv->folder_view,
+                     MODEST_FOLDER_VIEW_STYLE_SHOW_ONE);
+
+
+       /* Set account store */
+       tny_account_store_view_set_account_store (TNY_ACCOUNT_STORE_VIEW (priv->folder_view),
+                                                 TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()));
 
 
+       /* 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));
+       }
+
+       wrap_in_scrolled_window (folder_win, GTK_WIDGET(priv->folder_view));
+       wrap_in_scrolled_window (priv->contents_widget, GTK_WIDGET(priv->header_view));
+
+       /* Load previous osso state, for instance if we are being restored from 
+        * hibernation:  */
+       modest_osso_load_state();
+
+       /* Restore window & widget settings */
+
+       restore_settings (MODEST_MAIN_WINDOW(self), TRUE);
+}
+
 ModestWindow*
 modest_main_window_new (void)
 {
@@ -620,7 +677,6 @@ modest_main_window_new (void)
        ModestDimmingRulesGroup *toolbar_rules_group = NULL;
        GtkActionGroup *action_group = NULL;
        GError *error = NULL;
-       TnyFolderStoreQuery *query = NULL;
        GdkPixbuf *window_icon = NULL; 
        ModestConf *conf = NULL;
        GtkAction *action = NULL;
@@ -712,17 +768,6 @@ modest_main_window_new (void)
        /* Get device name */
        modest_maemo_utils_get_device_name ();
 
-       /* folder view */
-       query = tny_folder_store_query_new ();
-       tny_folder_store_query_add_item (query, NULL,
-                                        TNY_FOLDER_STORE_QUERY_OPTION_SUBSCRIBED);
-       priv->folder_view = MODEST_FOLDER_VIEW(modest_folder_view_new (query));
-       if (!priv->folder_view)
-               g_printerr ("modest: cannot instantiate folder view\n");
-       g_object_unref (G_OBJECT (query));
-       modest_folder_view_set_style (priv->folder_view,
-                                     MODEST_FOLDER_VIEW_STYLE_SHOW_ONE);
-
        /* header view */
        priv->header_view  =
                MODEST_HEADER_VIEW(modest_header_view_new (NULL, MODEST_HEADER_VIEW_STYLE_DETAILS));
@@ -743,9 +788,6 @@ modest_main_window_new (void)
                                        GTK_POLICY_NEVER,
                                        GTK_POLICY_AUTOMATIC);
 
-       wrap_in_scrolled_window (folder_win, GTK_WIDGET(priv->folder_view));
-       wrap_in_scrolled_window (priv->contents_widget, GTK_WIDGET(priv->header_view));
-
        /* paned */
        priv->main_paned = gtk_hpaned_new ();
        gtk_paned_pack1 (GTK_PANED(priv->main_paned), folder_win, TRUE, TRUE);
@@ -762,24 +804,7 @@ modest_main_window_new (void)
        window_icon = modest_platform_get_icon (MODEST_APP_ICON);
        gtk_window_set_icon (GTK_WINDOW (self), window_icon);
        
-       /* Connect signals */
-       connect_signals (self);
 
-       /* Set account store */
-       tny_account_store_view_set_account_store (TNY_ACCOUNT_STORE_VIEW (priv->folder_view),
-                                                 TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()));
-
-       /* 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));
-       }
        
        /* Do send & receive when we are idle */
        /* TODO: Enable this again. I have commented it out because, 
@@ -805,13 +830,12 @@ modest_main_window_new (void)
     */
        g_signal_connect (G_OBJECT(app), "notify::is-topmost",
                G_CALLBACK (on_hildon_program_is_topmost_notify), self);
+
+       g_signal_connect (G_OBJECT(self), "show",
+               G_CALLBACK (modest_main_window_on_show), folder_win);
                
-       /* Load previous osso state, for instance if we are being restored from 
-        * hibernation:  */
-       modest_osso_load_state();
 
-       /* Restore window & widget settings */
-       restore_settings (MODEST_MAIN_WINDOW(self));
+       restore_settings (MODEST_MAIN_WINDOW(self), FALSE);
 
        return MODEST_WINDOW(self);
 }
@@ -1396,8 +1420,8 @@ modest_main_window_notify_send_receive_initied (ModestMainWindow *self)
 
         action = modest_window_get_action (MODEST_WINDOW(self), "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsSendReceiveAllMenu");        
        gtk_action_set_sensitive (action, FALSE);
-        action = modest_window_get_action (MODEST_WINDOW(self), "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsSendReceiveCancelSendingMenu");      
-       gtk_action_set_sensitive (action, FALSE);
+/*         action = modest_window_get_action (MODEST_WINDOW(self), "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsSendReceiveCancelSendingMenu"); */
+/*     gtk_action_set_sensitive (action, FALSE); */
         widget = modest_window_get_action_widget (MODEST_WINDOW(self), "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsMenuAdditions");      
        gtk_widget_set_sensitive (widget, FALSE);
 } 
@@ -1412,13 +1436,46 @@ modest_main_window_notify_send_receive_completed (ModestMainWindow *self)
 
         action = modest_window_get_action (MODEST_WINDOW(self), "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsSendReceiveAllMenu");        
        gtk_action_set_sensitive (action, TRUE);
-        action = modest_window_get_action (MODEST_WINDOW(self), "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsSendReceiveCancelSendingMenu");      
-       gtk_action_set_sensitive (action, TRUE);
+/*         action = modest_window_get_action (MODEST_WINDOW(self), "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsSendReceiveCancelSendingMenu");    */
+/*     gtk_action_set_sensitive (action, TRUE); */
         widget = modest_window_get_action_widget (MODEST_WINDOW(self), "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsMenuAdditions");      
        gtk_widget_set_sensitive (widget, TRUE);
 } 
 
 
+static void
+_on_msg_count_changed (ModestHeaderView *header_view,
+                      TnyFolder *folder,
+                      TnyFolderChange *change,
+                      ModestMainWindow *main_window)
+{
+       gboolean folder_empty = FALSE;
+       TnyFolderChangeChanged changed;
+       
+       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));
+       
+       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);
+       
+       /* Set contents style of headers view */
+       if (folder_empty)  {
+               modest_main_window_set_contents_style (main_window,
+                                                      MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY);
+       }
+       else {
+               modest_main_window_set_contents_style (main_window,
+                                                      MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS);
+       }
+       
+}
+
 void 
 modest_main_window_set_contents_style (ModestMainWindow *self, 
                                       ModestMainWindowContentsStyle style)