* Enable modest-tny-send-queue to store information about
[modest] / src / maemo / modest-main-window.c
index d7fa440..a7696f1 100644 (file)
@@ -37,7 +37,7 @@
 #include "modest-hildon-includes.h"
 #include "modest-defs.h"
 #include <string.h>
-
+#include "widgets/modest-header-view-priv.h"
 #include "widgets/modest-main-window.h"
 #include "widgets/modest-msg-edit-window.h"
 #include "widgets/modest-account-view-window.h"
@@ -50,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"
@@ -60,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>
@@ -147,6 +149,11 @@ 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 {
@@ -240,8 +247,8 @@ static const GtkActionEntry modest_header_view_action_entries [] = {
        { "HeaderViewCSMCut",           NULL,  N_("mcen_me_inbox_cut"),         "<CTRL>X", NULL, G_CALLBACK (modest_ui_actions_on_cut) },
        { "HeaderViewCSMCopy",          NULL,  N_("mcen_me_inbox_copy"),        "<CTRL>C", NULL, G_CALLBACK (modest_ui_actions_on_copy) },
        { "HeaderViewCSMPaste",         NULL,  N_("mcen_me_inbox_paste"),       "<CTRL>V", NULL, G_CALLBACK (modest_ui_actions_on_paste) },
-       { "HeaderViewCSMDelete",        NULL,  N_("mcen_me_inbox_delete"),      NULL,      NULL, G_CALLBACK (modest_ui_actions_on_delete) },
-       { "HeaderViewCSMCancelSending", NULL,  N_("mcen_me_outbox_cancelsend"), NULL,      NULL, NULL },
+       { "HeaderViewCSMDelete",        NULL,  N_("mcen_me_inbox_delete"),      NULL,      NULL, G_CALLBACK (modest_ui_actions_on_delete_message) },
+       { "HeaderViewCSMCancelSending", NULL,  N_("mcen_me_outbox_cancelsend"), NULL,      NULL, G_CALLBACK (modest_ui_actions_cancel_send) },
        { "HeaderViewCSMHelp",          NULL,  N_("mcen_me_inbox_help"),        NULL,      NULL, G_CALLBACK (modest_ui_actions_on_help) },
 };
 
@@ -435,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
 {
@@ -476,6 +483,10 @@ on_response (GtkDialog *dialog, gint arg1, gpointer user_data)
 static void
 on_sendqueue_error_happened (TnySendQueue *self, TnyHeader *header, TnyMsg *msg, GError *err, ModestMainWindow *user_data)
 {
+       if (err) {
+               printf ("DEBUG: %s: err->code=%d, err->message=%s\n", __FUNCTION__, err->code, err->message);
+       }
+
        if (header) {
                gchar *str = g_strdup_printf ("%s. Do you want to remove the message (%s)?",
                        err->message, tny_header_get_subject (header));
@@ -613,7 +624,7 @@ 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", 
@@ -647,7 +658,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);
@@ -789,7 +800,8 @@ modest_main_window_new (void)
        GError *error = NULL;
        ModestConf *conf = NULL;
        GtkAction *action = NULL;
-
+       GdkPixbuf *window_icon;
+       
        self  = MODEST_MAIN_WINDOW(g_object_new(MODEST_TYPE_MAIN_WINDOW, NULL));
        priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
        parent_priv = MODEST_WINDOW_GET_PRIVATE(self);
@@ -800,8 +812,8 @@ modest_main_window_new (void)
        action_group = gtk_action_group_new ("ModestMainWindowActions");
        gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE);
 
-       menu_rules_group = modest_dimming_rules_group_new ("ModestMenuDimmingRules");
-       toolbar_rules_group = modest_dimming_rules_group_new ("ModestToolbarDimmingRules");
+       menu_rules_group = modest_dimming_rules_group_new ("ModestMenuDimmingRules", FALSE);
+       toolbar_rules_group = modest_dimming_rules_group_new ("ModestToolbarDimmingRules", TRUE);
 
        /* Add common actions */
        gtk_action_group_add_actions (action_group,
@@ -886,6 +898,11 @@ modest_main_window_new (void)
        modest_widget_memory_restore (modest_runtime_get_conf (), G_OBJECT(priv->header_view),
                                      MODEST_CONF_HEADER_VIEW_KEY);
 
+       /* Other style properties of header view */
+       g_object_set (G_OBJECT (priv->header_view), 
+                     "rules-hint", FALSE,
+                     NULL);
+
        /* Empty view */ 
        priv->empty_view = create_empty_view ();
                 
@@ -920,6 +937,12 @@ modest_main_window_new (void)
        g_signal_connect (G_OBJECT(self), "show",
                          G_CALLBACK (modest_main_window_on_show), folder_win);
                
+       /* Set window icon */
+       window_icon = modest_platform_get_icon (MODEST_APP_ICON);
+       if (window_icon) {
+               gtk_window_set_icon (GTK_WINDOW (self), window_icon);
+               g_object_unref (window_icon);
+       }
 
        restore_settings (MODEST_MAIN_WINDOW(self), FALSE);
 
@@ -1262,7 +1285,9 @@ on_account_update (TnyAccountStore *account_store,
                
                ModestAccountData *account_data = (ModestAccountData *) g_slist_nth_data (accounts, i);
 
-               /* Create display name. The default account is shown differently */
+               /* Create display name. The UI specification specifies a different format string 
+                * to use for the default account, though both seem to be "%s", so 
+                * I don't see what the point is. murrayc. */
                if (default_account && account_data->account_name && 
                        !(strcmp (default_account, account_data->account_name) == 0)) {
                        display_name = g_strdup_printf (_("mcen_me_toolbar_sendreceive_default"), 
@@ -1288,7 +1313,7 @@ on_account_update (TnyAccountStore *account_store,
                        /* Add ui from account data. We allow 2^9-1 account
                           changes in a single execution because we're
                           downcasting the guint to a guint8 in order to use a
-                          GByteArray, it should be enough */
+                          GByteArray. It should be enough. */
                        item_name = g_strconcat (account_data->account_name, "Menu", NULL);
                        merge_id = (guint8) gtk_ui_manager_new_merge_id (parent_priv->ui_manager);
                        priv->merge_ids = g_byte_array_append (priv->merge_ids, &merge_id, 1);
@@ -1520,10 +1545,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);
@@ -1941,7 +1971,7 @@ on_queue_changed (ModestMailOperationQueue *queue,
        /* Get toolbar mode from operation id*/
        op_type = modest_mail_operation_get_type_operation (mail_op);
        switch (op_type) {
-       case MODEST_MAIL_OPERATION_TYPE_SEND:
+/*     case MODEST_MAIL_OPERATION_TYPE_SEND: */
        case MODEST_MAIL_OPERATION_TYPE_RECEIVE:
        case MODEST_MAIL_OPERATION_TYPE_OPEN:
                mode = TOOLBAR_MODE_TRANSFER;
@@ -2062,6 +2092,14 @@ on_folder_view_focus_in (GtkWidget *widget,
                         GdkEventFocus *event,
                         gpointer userdata)
 {
+       ModestMainWindow *main_window = NULL;
+       
+       g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (userdata), FALSE);
+       main_window = MODEST_MAIN_WINDOW (userdata);
+       
+       /* Update toolbar dimming state */
+       modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
+
        return FALSE;
 }
 
@@ -2070,8 +2108,12 @@ 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);
+       ModestMainWindow *main_window = NULL;
+       ModestMainWindowPrivate *priv = NULL;
+
+       g_return_val_if_fail (MODEST_IS_MAIN_WINDOW (userdata), FALSE);
+       main_window = MODEST_MAIN_WINDOW (userdata);
+       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));
@@ -2090,5 +2132,107 @@ on_header_view_focus_in (GtkWidget *widget,
                g_object_unref (iterator);
                g_object_unref (selection);
        }
+
+
+       /* Update toolbar dimming state */
+       modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
+
        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);
+
+}
+
+gboolean 
+modest_main_window_on_msg_view_window_msg_changed (ModestMsgViewWindow *view_window,
+                                                  GtkTreeModel *model,
+                                                  GtkTreeRowReference *row_reference,
+                                                  ModestMainWindow *self)
+{
+       ModestMainWindowPrivate *priv = NULL;
+       GtkTreeModel *header_model = NULL;
+       GtkTreePath *path = NULL;
+
+       g_return_val_if_fail (MODEST_MSG_VIEW_WINDOW (view_window), FALSE);
+       g_return_val_if_fail (MODEST_MAIN_WINDOW (self), FALSE);
+       g_return_val_if_fail (gtk_tree_row_reference_valid (row_reference), FALSE);
+
+       priv = MODEST_MAIN_WINDOW_GET_PRIVATE (self);
+       header_model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->header_view));
+
+       /* Do nothing if we changed the folder in the main view */
+       if (header_model != model)
+               return FALSE;
+
+       /* Select the message in the header view */
+       path = gtk_tree_row_reference_get_path (row_reference);
+       _modest_header_view_select_from_path (MODEST_HEADER_VIEW (priv->header_view), path);
+       gtk_tree_path_free (path);
+
+       return TRUE;
+}