* Change save_settings call of main and viewer windows to
[modest] / src / maemo / modest-main-window.c
index 921cfc2..da10328 100644 (file)
@@ -31,6 +31,8 @@
 #include <gtk/gtktreeviewcolumn.h>
 #include <tny-account-store-view.h>
 #include <tny-simple-list.h>
+#include <tny-list.h>
+#include <tny-iterator.h>
 #include <tny-maemo-conic-device.h>
 #include "modest-hildon-includes.h"
 #include "modest-defs.h"
@@ -48,6 +50,7 @@
 #include "modest-main-window-ui-dimming.h"
 #include "modest-account-mgr.h"
 #include "modest-tny-account.h"
+#include "modest-tny-folder.h"
 #include "modest-conf.h"
 #include <modest-maemo-utils.h>
 #include "modest-tny-platform-factory.h"
@@ -58,6 +61,7 @@
 #include "modest-text-utils.h"
 #include "modest-ui-dimming-manager.h"
 #include "maemo/modest-osso-state-saving.h"
+#include "modest-text-utils.h"
 
 #ifdef MODEST_HAVE_HILDON0_WIDGETS
 #include <hildon-widgets/hildon-program.h>
@@ -137,6 +141,19 @@ modest_main_window_cleanup_queue_error_signals (ModestMainWindow *self);
 
 static GtkWidget * create_empty_view (void);
 
+static gboolean
+on_folder_view_focus_in (GtkWidget *widget,
+                        GdkEventFocus *event,
+                        gpointer userdata);
+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);
 
 /* list my signals */
 enum {
@@ -425,12 +442,12 @@ wrap_in_scrolled_window (GtkWidget *win, GtkWidget *widget)
 }
 
 
-static gboolean
-on_delete_event (GtkWidget *widget, GdkEvent  *event, ModestMainWindow *self)
-{
-       modest_window_save_state (MODEST_WINDOW(self));
-       return FALSE;
-}
+/* static gboolean */
+/* on_delete_event (GtkWidget *widget, GdkEvent  *event, ModestMainWindow *self) */
+/* { */
+/*     modest_window_save_state (MODEST_WINDOW(self)); */
+/*     return FALSE; */
+/* } */
 
 typedef struct
 {
@@ -603,9 +620,11 @@ connect_signals (ModestMainWindow *self)
        g_signal_connect (G_OBJECT(priv->folder_view), "key-press-event",
                          G_CALLBACK(on_inner_widgets_key_pressed), self);
        g_signal_connect (G_OBJECT(priv->folder_view), "folder_selection_changed",
-                         G_CALLBACK(modest_ui_actions_on_folder_selection_changed), self);
+                         G_CALLBACK(modest_main_window_on_folder_selection_changed), self);
        g_signal_connect (G_OBJECT(priv->folder_view), "folder-display-name-changed",
                          G_CALLBACK(modest_ui_actions_on_folder_display_name_changed), self);
+       g_signal_connect (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");
@@ -624,6 +643,8 @@ connect_signals (ModestMainWindow *self)
                          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);
+       g_signal_connect (G_OBJECT (priv->header_view), "focus-in-event",
+                         G_CALLBACK (on_header_view_focus_in), self);
 
        /* Header view CSM */
        menu = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/HeaderViewCSM");
@@ -633,7 +654,7 @@ connect_signals (ModestMainWindow *self)
                          self);
        
        /* window */
-       g_signal_connect (G_OBJECT(self), "delete-event", G_CALLBACK(on_delete_event), self);
+/*     g_signal_connect (G_OBJECT(self), "delete-event", G_CALLBACK(on_delete_event), self); */
        g_signal_connect (G_OBJECT (self), "window-state-event",
                          G_CALLBACK (modest_main_window_window_state_event),
                          NULL);
@@ -773,7 +794,6 @@ modest_main_window_new (void)
        ModestDimmingRulesGroup *toolbar_rules_group = NULL;
        GtkActionGroup *action_group = NULL;
        GError *error = NULL;
-       GdkPixbuf *window_icon = NULL; 
        ModestConf *conf = NULL;
        GtkAction *action = NULL;
 
@@ -897,10 +917,6 @@ modest_main_window_new (void)
        gtk_box_pack_start (GTK_BOX(priv->main_vbox), priv->main_paned, TRUE, TRUE,0);
 
        gtk_container_add (GTK_CONTAINER(self), priv->main_vbox);
-
-       /* Set window icon */
-       window_icon = modest_platform_get_icon (MODEST_APP_ICON);
-       gtk_window_set_icon (GTK_WINDOW (self), window_icon);
        
        HildonProgram *app = hildon_program_get_instance ();
        hildon_program_add_window (app, HILDON_WINDOW (self));
@@ -974,6 +990,21 @@ modest_main_window_set_style (ModestMainWindow *self,
                gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE);
                g_signal_handlers_unblock_by_func (action, modest_ui_actions_toggle_folders_view, self);
 
+               if (modest_header_view_has_selected_headers (MODEST_HEADER_VIEW (priv->header_view))) {
+                       TnyList *selection = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (priv->header_view));
+                       TnyIterator *iterator = tny_list_create_iterator (selection);
+                       TnyHeader *header;
+                       tny_iterator_first (iterator);
+                       header = TNY_HEADER (tny_iterator_get_current (iterator));
+                       if (tny_header_get_subject (header))
+                               gtk_window_set_title (GTK_WINDOW(self), tny_header_get_subject (header));
+                       else
+                               gtk_window_set_title (GTK_WINDOW (self), _("mail_va_no_subject"));
+                       g_object_unref (header);
+                       g_object_unref (iterator);
+                       g_object_unref (selection);
+               }
+
                break;
        case MODEST_MAIN_WINDOW_STYLE_SPLIT:
                /* Remove header view */
@@ -1496,10 +1527,15 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
        /* Size / Date */
        if (modest_tny_account_is_virtual_local_folders (account)
                || modest_tny_account_is_memory_card_account (account)) {
-               /* FIXME: format size */
-               label = g_markup_printf_escaped ("<span color='%s'>%s:</span> %d", 
-                                                gray_color_markup, _("mcen_fi_rootfolder_size"), 
-                                                modest_tny_folder_store_get_local_size (folder_store));
+
+               gchar *size = modest_text_utils_get_display_size (
+                       modest_tny_folder_store_get_local_size (folder_store));
+               
+               label = g_markup_printf_escaped ("<span color='%s'>%s:</span> %s", 
+                                                gray_color_markup, _("mcen_fi_rootfolder_size"),
+                                                size);
+               g_free (size);
+               
                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);
@@ -1536,13 +1572,29 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
        return vbox;
 }
 
+gboolean
+modest_main_window_send_receive_in_progress (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->send_receive_in_progress;
+}
+
 void 
 modest_main_window_notify_send_receive_initied (ModestMainWindow *self)
 {
        GtkAction *action = NULL;
        GtkWidget *widget = NULL;
-
+       ModestMainWindowPrivate *priv = NULL;
+               
        g_return_if_fail (MODEST_IS_MAIN_WINDOW (self));
+       priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
+       
+       priv->send_receive_in_progress  = TRUE;
 
         action = modest_window_get_action (MODEST_WINDOW(self), "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsSendReceiveAllMenu");        
        gtk_action_set_sensitive (action, FALSE);
@@ -1557,8 +1609,12 @@ modest_main_window_notify_send_receive_completed (ModestMainWindow *self)
 {
        GtkAction *action = NULL;
        GtkWidget *widget = NULL;
-
+       ModestMainWindowPrivate *priv = NULL;
+               
        g_return_if_fail (MODEST_IS_MAIN_WINDOW (self));
+       priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
+
+       priv->send_receive_in_progress  = FALSE;
 
         action = modest_window_get_action (MODEST_WINDOW(self), "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsSendReceiveAllMenu");        
        gtk_action_set_sensitive (action, TRUE);
@@ -1771,64 +1827,64 @@ set_toolbar_mode (ModestMainWindow *self,
        /* Show and hide toolbar items */
        switch (mode) {
        case TOOLBAR_MODE_NORMAL:
-/*             if (sort_action)  */
-/*                     gtk_action_set_visible (sort_action, TRUE); */
-/*             if (refresh_action)  */
-/*                     gtk_action_set_visible (refresh_action, TRUE); */
-/*             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 (cancel_action) */
-/*                     gtk_action_set_visible (cancel_action, FALSE); */
-               if (priv->sort_toolitem)
-                       gtk_widget_show (priv->sort_toolitem);
-               
-               if (priv->refresh_toolitem)
-                       gtk_widget_show (priv->refresh_toolitem);
-                       
-               if (priv->progress_toolitem)
+               if (sort_action)
+                       gtk_action_set_visible (sort_action, TRUE);
+               if (refresh_action)
+                       gtk_action_set_visible (refresh_action, TRUE);
+               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 (cancel_action)
+                       gtk_action_set_visible (cancel_action, FALSE);
+/*             if (priv->sort_toolitem) */
+/*                     gtk_widget_show (priv->sort_toolitem); */
+               
+/*             if (priv->refresh_toolitem) */
+/*                     gtk_widget_show (priv->refresh_toolitem); */
                        
-               if (priv->cancel_toolitem)
-                       gtk_widget_hide (priv->cancel_toolitem);
+/*             if (priv->progress_toolitem) */
+/*                     gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), FALSE); */
+/*             if (priv->progress_bar) */
+/*                     gtk_widget_hide (priv->progress_bar); */
+                       
+/*             if (priv->cancel_toolitem) */
+/*                     gtk_widget_hide (priv->cancel_toolitem); */
 
                /* Hide toolbar if optimized view is enabled */
                if (priv->optimized_view)
                        gtk_widget_hide (GTK_WIDGET(parent_priv->toolbar));
                break;
        case TOOLBAR_MODE_TRANSFER:
-/*             if (sort_action) */
-/*                     gtk_action_set_visible (sort_action, FALSE); */
-/*             if (refresh_action) */
-/*                     gtk_action_set_visible (refresh_action, FALSE); */
-/*             if (cancel_action) */
-/*                     gtk_action_set_visible (cancel_action, TRUE); */
-/*             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); */
-
-               if (priv->sort_toolitem)
-                       gtk_widget_hide (priv->sort_toolitem);
-               
-               if (priv->refresh_toolitem)
-                       gtk_widget_hide (priv->refresh_toolitem);
-               
-               if (priv->progress_toolitem)
+               if (sort_action)
+                       gtk_action_set_visible (sort_action, FALSE);
+               if (refresh_action)
+                       gtk_action_set_visible (refresh_action, FALSE);
+               if (cancel_action)
+                       gtk_action_set_visible (cancel_action, TRUE);
+               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);
+
+/*             if (priv->sort_toolitem) */
+/*                     gtk_widget_hide (priv->sort_toolitem); */
+               
+/*             if (priv->refresh_toolitem) */
+/*                     gtk_widget_hide (priv->refresh_toolitem); */
+               
+/*             if (priv->progress_toolitem) */
+/*                     gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), TRUE); */
+/*             if (priv->progress_bar) */
+/*                     gtk_widget_show (priv->progress_bar); */
                        
-               if (priv->cancel_toolitem)
-                       gtk_widget_show (priv->cancel_toolitem);
+/*             if (priv->cancel_toolitem) */
+/*                     gtk_widget_show (priv->cancel_toolitem); */
 
                /* Show toolbar if it's hiden (optimized view ) */
                if (priv->optimized_view)
@@ -2012,3 +2068,107 @@ on_zoom_minus_plus_not_implemented (ModestWindow *window)
        return FALSE;
 
 }
+
+static gboolean
+on_folder_view_focus_in (GtkWidget *widget,
+                        GdkEventFocus *event,
+                        gpointer userdata)
+{
+       return FALSE;
+}
+
+static gboolean
+on_header_view_focus_in (GtkWidget *widget,
+                        GdkEventFocus *event,
+                        gpointer userdata)
+{
+       ModestMainWindow *main_window = MODEST_MAIN_WINDOW (userdata);
+       ModestMainWindowPrivate *priv = MODEST_MAIN_WINDOW_GET_PRIVATE (main_window);
+
+       if (modest_header_view_has_selected_headers (MODEST_HEADER_VIEW (priv->header_view))) {
+               TnyList *selection = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (priv->header_view));
+               TnyIterator *iterator = tny_list_create_iterator (selection);
+               TnyHeader *header;
+
+               tny_iterator_first (iterator);
+               header = TNY_HEADER (tny_iterator_get_current (iterator));
+               
+               if (tny_header_get_subject (header))
+                       gtk_window_set_title (GTK_WINDOW(main_window), tny_header_get_subject (header));
+               else
+                       gtk_window_set_title (GTK_WINDOW (main_window), _("mail_va_no_subject"));
+
+               g_object_unref (header);
+               g_object_unref (iterator);
+               g_object_unref (selection);
+       }
+       return FALSE;
+}
+
+static void 
+modest_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;
+       gboolean show_reply = TRUE;
+       gboolean show_forward = TRUE;
+       gboolean show_cancel_send = FALSE;
+       gboolean show_clipboard = TRUE;
+       gboolean show_delete = TRUE;
+
+       if (selected) {
+               if (TNY_IS_ACCOUNT (folder_store)) {
+                       show_reply = show_forward = show_cancel_send = show_clipboard = show_delete = FALSE;
+               } else if (TNY_IS_FOLDER (folder_store)) {
+                       if (modest_tny_folder_is_local_folder (TNY_FOLDER (folder_store))) {
+                               TnyFolderType folder_type = modest_tny_folder_get_local_folder_type (
+                                       TNY_FOLDER (folder_store));
+                               switch (folder_type) {
+                               case TNY_FOLDER_TYPE_DRAFTS:
+                                       show_clipboard = show_delete = TRUE;
+                                       show_reply = show_forward = show_cancel_send = FALSE;
+                                       break;
+                               case TNY_FOLDER_TYPE_SENT:
+                                       show_forward = show_clipboard = show_delete = TRUE;
+                                       show_reply = show_cancel_send = FALSE;
+                                       break;
+                               case TNY_FOLDER_TYPE_OUTBOX:
+                                       show_clipboard = show_delete = show_cancel_send = TRUE;
+                                       show_reply = show_forward = FALSE;
+                                       break;
+                               default:
+                                       show_reply = show_forward = show_clipboard = show_delete = TRUE;
+                                       show_cancel_send = FALSE;
+                               }
+                       } else {
+                               show_reply = show_forward = show_clipboard = show_delete = TRUE;
+                               show_cancel_send = FALSE;
+                       }
+               }
+       }
+
+       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/HeaderViewCSM/HeaderViewCSMReply");
+       gtk_action_set_visible (action, show_reply);
+       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/HeaderViewCSM/HeaderViewCSMReplyAll");
+       gtk_action_set_visible (action, show_reply);
+       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/HeaderViewCSM/HeaderViewCSMForward");
+       gtk_action_set_visible (action, show_forward);
+       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/HeaderViewCSM/HeaderViewCSMCancelSending");
+       gtk_action_set_visible (action, show_cancel_send);
+       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/HeaderViewCSM/HeaderViewCSMCut");
+       gtk_action_set_visible (action, show_clipboard);
+       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/HeaderViewCSM/HeaderViewCSMCopy");
+       gtk_action_set_visible (action, show_clipboard);
+       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/HeaderViewCSM/HeaderViewCSMPaste");
+       gtk_action_set_visible (action, show_clipboard);
+       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/HeaderViewCSM/HeaderViewCSMDelete");
+       gtk_action_set_visible (action, show_delete);
+
+       /* We finally call to the ui actions handler, after updating properly
+        * the header view CSM */
+       modest_ui_actions_on_folder_selection_changed (folder_view, folder_store, selected, main_window);
+
+}