* src/maemo/modest-main-window.c:
[modest] / src / maemo / modest-main-window.c
index bd2b9de..d7fa440 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"
@@ -137,6 +139,14 @@ 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);
 
 /* list my signals */
 enum {
@@ -514,7 +524,7 @@ on_account_store_connecting_finished (TnyAccountStore *store, ModestMainWindow *
 
        TnyDevice *device = tny_account_store_get_device (store);
 
-       modest_folder_view_update_model (MODEST_FOLDER_VIEW (priv->folder_view), store);
+       /* modest_folder_view_update_model (MODEST_FOLDER_VIEW (priv->folder_view), store); */
        
        /* Check that we are really online.
         * This signal should not be emitted when we are not connected, 
@@ -606,6 +616,8 @@ connect_signals (ModestMainWindow *self)
                          G_CALLBACK(modest_ui_actions_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 +636,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");
@@ -637,7 +651,6 @@ connect_signals (ModestMainWindow *self)
        g_signal_connect (G_OBJECT (self), "window-state-event",
                          G_CALLBACK (modest_main_window_window_state_event),
                          NULL);
-       g_signal_connect (G_OBJECT(self), "delete-event", G_CALLBACK(on_delete_event), self);
        
        /* Mail Operation Queue */
        priv->queue_changed_handler_uid = 
@@ -774,7 +787,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;
 
@@ -898,10 +910,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));
@@ -975,6 +983,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 */
@@ -1228,7 +1251,7 @@ on_account_update (TnyAccountStore *account_store,
                                  G_CALLBACK (on_send_receive_csm_activated),
                                  NULL);
                item = gtk_separator_menu_item_new ();
-               gtk_menu_shell_append (GTK_MENU_SHELL (priv->accounts_popup), GTK_WIDGET (item));
+               gtk_menu_shell_prepend (GTK_MENU_SHELL (priv->accounts_popup), GTK_WIDGET (item));
        }
 
        /* Create a new action group */
@@ -1312,7 +1335,7 @@ on_account_update (TnyAccountStore *account_store,
                           it'll be no menu */
                        if (priv->accounts_popup) {
                                item = gtk_menu_item_new_with_label (display_name);
-                               gtk_menu_shell_append (GTK_MENU_SHELL (priv->accounts_popup), GTK_WIDGET (item));
+                               gtk_menu_shell_prepend (GTK_MENU_SHELL (priv->accounts_popup), GTK_WIDGET (item));
                                g_signal_connect_data (G_OBJECT (item), 
                                                       "activate", 
                                                       G_CALLBACK (on_send_receive_csm_activated),
@@ -1401,6 +1424,8 @@ create_empty_view (void)
 static GtkWidget *
 create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
 {
+       /* TODO: Clean up this function. It's a mess, with lots of copy/paste. murrayc. */
+       
        GtkWidget *vbox;
        GtkWidget *label_w;
        gchar *label;
@@ -1415,18 +1440,25 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
        gtk_style_lookup_color (styled_widget->style, "SecondaryTextColor", &color);
        gray_color_markup = modest_text_utils_get_color_string (&color);
 #else
-       gray_color_markup = "#BBBBBB";  
+       // gray_color_markup is freed below
+       gray_color_markup = g_strdup ("#BBBBBB");
 #endif 
        /* Account description: */
        
-       if (modest_tny_account_is_virtual_local_folders (account)) {
+       if (modest_tny_account_is_virtual_local_folders (account)
+               || (modest_tny_account_is_memory_card_account (account))) {
                gchar *tmp;
                /* Local folders: */
        
                /* Get device name */
-               gchar *device_name = modest_conf_get_string (modest_runtime_get_conf(),
+               gchar *device_name = NULL;
+               if (modest_tny_account_is_virtual_local_folders (account))
+                       device_name = modest_conf_get_string (modest_runtime_get_conf(),
                                                      MODEST_CONF_DEVICE_NAME, NULL);
-               tmp = g_strdup_printf (_("mcen_fi_localroot_description"), "");
+               else
+                       device_name = g_strdup (tny_account_get_name (account));
+                                                     
+               tmp = g_strdup_printf (_("mcen_fi_localroot_description"), ""); //TODO: Why the ""?
                label = g_markup_printf_escaped ("<span color='%s'>%s</span>%s",
                                                 gray_color_markup, tmp, device_name);
                g_free (tmp);
@@ -1486,7 +1518,8 @@ create_details_widget (GtkWidget *styled_widget, TnyAccount *account)
        g_free (label);
 
        /* Size / Date */
-       if (modest_tny_account_is_virtual_local_folders (account)) {
+       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"), 
@@ -1527,13 +1560,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);
@@ -1548,8 +1597,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);
@@ -1592,8 +1645,7 @@ _on_msg_count_changed (ModestHeaderView *header_view,
        else {
                modest_main_window_set_contents_style (main_window,
                                                       MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS);
-       }
-       
+       }       
 }
 
 void 
@@ -1763,19 +1815,32 @@ set_toolbar_mode (ModestMainWindow *self,
        /* Show and hide toolbar items */
        switch (mode) {
        case TOOLBAR_MODE_NORMAL:
-               if (sort_action) 
+               if (sort_action)
                        gtk_action_set_visible (sort_action, TRUE);
-               if (refresh_action) 
+               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);                   
+                       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) */
+/*                     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)
@@ -1793,7 +1858,21 @@ set_toolbar_mode (ModestMainWindow *self,
                        gtk_widget_show (priv->progress_toolitem);
                }
                if (priv->progress_bar)
-                       gtk_widget_show (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); */
 
                /* Show toolbar if it's hiden (optimized view ) */
                if (priv->optimized_view)
@@ -1864,6 +1943,7 @@ on_queue_changed (ModestMailOperationQueue *queue,
        switch (op_type) {
        case MODEST_MAIL_OPERATION_TYPE_SEND:
        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;
@@ -1976,3 +2056,39 @@ 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;
+}