Work to complete implementation of purge attachments operation
[modest] / src / maemo / modest-msg-view-window.c
index 13e59a8..b84a728 100644 (file)
@@ -273,7 +273,7 @@ set_toolbar_mode (ModestMsgViewWindow *self,
 {
        ModestWindowPrivate *parent_priv;
        ModestMsgViewWindowPrivate *priv;
-       GtkAction *widget = NULL;
+/*     GtkWidget *widget = NULL; */
 
        g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self));
 
@@ -283,18 +283,19 @@ set_toolbar_mode (ModestMsgViewWindow *self,
        /* Sets current toolbar mode */
        priv->current_toolbar_mode = mode;
 
+       /* Update toolbar dimming state */
+       modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (self));
+
        switch (mode) {
-       case TOOLBAR_MODE_NORMAL:
-               widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageNew");
-               gtk_action_set_sensitive (widget, TRUE);
-               widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageReply");
-               gtk_action_set_sensitive (widget, TRUE);
-               widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarDeleteMessage");
-               gtk_action_set_sensitive (widget, TRUE);
-               widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageMoveTo");
-               gtk_action_set_sensitive (widget, TRUE);
-               widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/FindInMessage");
-               gtk_action_set_sensitive (widget, TRUE);
+       case TOOLBAR_MODE_NORMAL:               
+/*             widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageReply"); */
+/*             gtk_action_set_sensitive (widget, TRUE); */
+/*             widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarDeleteMessage"); */
+/*             gtk_action_set_sensitive (widget, TRUE); */
+/*             widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageMoveTo"); */
+/*             gtk_action_set_sensitive (widget, TRUE); */
+/*             widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/FindInMessage"); */
+/*             gtk_action_set_sensitive (widget, TRUE); */
 
                if (priv->prev_toolitem)
                        gtk_widget_show (priv->prev_toolitem);
@@ -318,16 +319,14 @@ set_toolbar_mode (ModestMsgViewWindow *self,
 
                break;
        case TOOLBAR_MODE_TRANSFER:
-               widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageNew");
-               gtk_action_set_sensitive (widget, FALSE);
-               widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageReply");
-               gtk_action_set_sensitive (widget, FALSE);
-               widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarDeleteMessage");
-               gtk_action_set_sensitive (widget, FALSE);
-               widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageMoveTo");
-               gtk_action_set_sensitive (widget, FALSE);
-               widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/FindInMessage");
-               gtk_action_set_sensitive (widget, FALSE);
+/*             widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageReply"); */
+/*             gtk_action_set_sensitive (widget, FALSE); */
+/*             widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarDeleteMessage"); */
+/*             gtk_action_set_sensitive (widget, FALSE); */
+/*             widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageMoveTo"); */
+/*             gtk_action_set_sensitive (widget, FALSE); */
+/*             widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/FindInMessage"); */
+/*             gtk_action_set_sensitive (widget, FALSE); */
 
                if (priv->prev_toolitem)
                        gtk_widget_hide (priv->prev_toolitem);
@@ -628,6 +627,9 @@ modest_msg_view_window_new (TnyMsg *msg,
 
        update_window_title (MODEST_MSG_VIEW_WINDOW (obj));
 
+       /* Check toolbar dimming rules */
+       modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (obj));
+
        return MODEST_WINDOW(obj);
 }
 
@@ -647,12 +649,21 @@ TnyHeader*
 modest_msg_view_window_get_header (ModestMsgViewWindow *self)
 {
        ModestMsgViewWindowPrivate *priv= NULL; 
+       TnyMsg *msg = NULL;
        TnyHeader *header = NULL;
        GtkTreeIter iter;
 
        g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self), NULL);
        priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
 
+       /* Message is not obtained from a treemodel (Attachment ?) */
+       if (priv->header_model == NULL) {
+               msg = modest_msg_view_window_get_message (self);
+               header = tny_msg_get_header (msg);
+               g_object_unref (msg);
+               return header;
+       }
+
        /* Get current message iter */
        gtk_tree_model_get_iter (priv->header_model, 
                                 &iter, 
@@ -930,9 +941,9 @@ modest_msg_view_window_last_message_selected (ModestMsgViewWindow *window)
                        if (!(tny_header_get_flags(header)&TNY_HEADER_FLAG_DELETED)) {
                                has_next = TRUE;
                                break;
-                       }
-                       
+                       }       
                }
+               gtk_tree_path_free (path);
                return !has_next;
        } else {
                return TRUE;
@@ -1039,13 +1050,15 @@ modest_msg_view_window_select_next_message (ModestMsgViewWindow *window)
                        /* Mark as read */
                        flags = tny_header_get_flags (header);
                        if (!(flags & TNY_HEADER_FLAG_SEEN))
-/*                             tny_header_set_flags (header, flags | TNY_HEADER_FLAG_SEEN); */
                                tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN);
 
-                       /* Msg download initied */
-
+                       /* Msg download completed */
+                       if (flags & TNY_HEADER_FLAG_CACHED)
+                               mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_OPEN, G_OBJECT(window));
+                       else
+                               mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(window));
+                               
                        /* New mail operation */
-                       mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(window));
                        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
                        modest_mail_operation_get_msg (mail_op, header, view_msg_cb, NULL);
                        g_object_unref (mail_op);
@@ -1097,11 +1110,15 @@ modest_msg_view_window_select_first_message (ModestMsgViewWindow *self)
        /* Mark as read */
        flags = tny_header_get_flags (header);
        if (!(flags & TNY_HEADER_FLAG_SEEN))
-/*             tny_header_set_flags (header, flags | TNY_HEADER_FLAG_SEEN); */
                tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN);
        
+       /* Msg download completed */
+       if (flags & TNY_HEADER_FLAG_CACHED)
+               mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_OPEN, G_OBJECT(self));
+       else 
+               mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(self));
+       
        /* New mail operation */
-       mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(self));
        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
        modest_mail_operation_get_msg (mail_op, header, view_msg_cb, NULL);
        g_object_unref (mail_op);
@@ -1153,11 +1170,15 @@ modest_msg_view_window_select_previous_message (ModestMsgViewWindow *window)
                /* Mark as read */
                flags = tny_header_get_flags (header);
                if (!(flags & TNY_HEADER_FLAG_SEEN))
-/*                     tny_header_set_flags (header, flags | TNY_HEADER_FLAG_SEEN); */
                        tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN);
-
+               
+               /* Msg download completed */
+               if (flags & TNY_HEADER_FLAG_CACHED)
+                       mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_OPEN, G_OBJECT(window));
+               else
+                       mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(window));
+               
                /* New mail operation */
-               mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_RECEIVE, G_OBJECT(window));
                modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
                modest_mail_operation_get_msg (mail_op, header, view_msg_cb, NULL);             
 
@@ -1375,6 +1396,7 @@ modest_msg_view_window_show_toolbar (ModestWindow *self,
                
                gtk_widget_show (GTK_WIDGET (parent_priv->toolbar));
                set_toolbar_mode (MODEST_MSG_VIEW_WINDOW(self), TOOLBAR_MODE_NORMAL);                   
+               
        } else {
                gtk_widget_set_no_show_all (parent_priv->toolbar, TRUE);
                gtk_widget_hide (GTK_WIDGET (parent_priv->toolbar));
@@ -1413,6 +1435,17 @@ modest_msg_view_window_clipboard_owner_change (GtkClipboard *clipboard,
        
 }
 
+gboolean 
+modest_msg_view_window_transfer_mode_enabled (ModestMsgViewWindow *self)
+{
+       ModestMsgViewWindowPrivate *priv;
+       
+       g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self), FALSE); 
+       priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(self);
+
+       return priv->current_toolbar_mode == TOOLBAR_MODE_TRANSFER;
+}
+
 static void
 cancel_progressbar (GtkToolButton *toolbutton,
                    ModestMsgViewWindow *self)
@@ -1475,6 +1508,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;
                break;
        default:
@@ -1559,6 +1593,12 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, TnyMimePart
                g_object_ref (mime_part);
        }
 
+       if (tny_mime_part_is_purged (mime_part)) {
+               g_object_unref (mime_part);
+               hildon_banner_show_information (NULL, NULL, _("mail_ib_attach_not_local"));
+               return;
+       }
+
        if (!TNY_IS_MSG (mime_part)) {
                gchar *filepath = NULL;
                const gchar *att_filename = tny_mime_part_get_filename (mime_part);
@@ -1742,18 +1782,38 @@ modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, GList *mim
 }
 
 void
-modest_msg_view_window_remove_attachments (ModestMsgViewWindow *window)
+modest_msg_view_window_remove_attachments (ModestMsgViewWindow *window, gboolean get_all)
 {
        ModestMsgViewWindowPrivate *priv;
        GList *mime_parts = NULL, *node;
        gchar *confirmation_message;
        gint response;
        gint n_attachments;
+       TnyMsg *msg;
+/*     TnyFolder *folder; */
 
        g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window));
        priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
 
-       mime_parts = modest_msg_view_get_selected_attachments (MODEST_MSG_VIEW (priv->msg_view));
+       if (get_all)
+               mime_parts = modest_msg_view_get_attachments (MODEST_MSG_VIEW (priv->msg_view));
+       else
+               mime_parts = modest_msg_view_get_selected_attachments (MODEST_MSG_VIEW (priv->msg_view));
+               
+       /* Remove already purged messages from mime parts list */
+       node = mime_parts;
+       while (node != NULL) {
+               TnyMimePart *part = TNY_MIME_PART (node->data);
+               if (tny_mime_part_is_purged (part)) {
+                       GList *deleted_node = node;
+                       node = g_list_next (node);
+                       g_object_unref (part);
+                       mime_parts = g_list_delete_link (mime_parts, deleted_node);
+               } else {
+                       node = g_list_next (node);
+               }
+       }
+
        if (mime_parts == NULL)
                return;
 
@@ -1784,11 +1844,27 @@ modest_msg_view_window_remove_attachments (ModestMsgViewWindow *window)
        if (response != GTK_RESPONSE_OK)
                return;
 
+/*     folder = tny_msg_get_folder (msg); */
+/*     tny_msg_uncache_attachments (msg); */
+/*     tny_folder_refresh (folder, NULL); */
+/*     g_object_unref (folder); */
+       
+       modest_platform_information_banner (NULL, NULL, _("mcen_ib_removing_attachment"));
+
        for (node = mime_parts; node != NULL; node = g_list_next (node)) {
-               modest_msg_view_remove_attachment (MODEST_MSG_VIEW (priv->msg_view), node->data);
+               tny_mime_part_set_purged (TNY_MIME_PART (node->data));
+/*             modest_msg_view_remove_attachment (MODEST_MSG_VIEW (priv->msg_view), node->data); */
        }
+
+       msg = modest_msg_view_get_message (MODEST_MSG_VIEW (priv->msg_view));
+       modest_msg_view_set_message (MODEST_MSG_VIEW (priv->msg_view), NULL);
+       tny_msg_rewrite_cache (msg);
+       modest_msg_view_set_message (MODEST_MSG_VIEW (priv->msg_view), msg);
+
        g_list_foreach (mime_parts, (GFunc) g_object_unref, NULL);
        g_list_free (mime_parts);
+
+
 }
 
 
@@ -1804,6 +1880,7 @@ update_window_title (ModestMsgViewWindow *window)
        if (msg != NULL) {
                header = tny_msg_get_header (msg);
                subject = tny_header_get_subject (header);
+               g_object_unref (msg);
        }
 
        if ((subject == NULL)||(subject[0] == '\0'))
@@ -1812,3 +1889,4 @@ update_window_title (ModestMsgViewWindow *window)
        gtk_window_set_title (GTK_WINDOW (window), subject);
 }
 
+