#include <modest-maemo-utils.h>
#include <modest-tny-msg.h>
#include <modest-msg-view-window.h>
+#include <modest-attachments-view.h>
#include <modest-main-window-ui.h>
#include <modest-widget-memory.h>
#include <modest-runtime.h>
static void set_toolbar_mode (ModestMsgViewWindow *self,
ModestToolBarModes mode);
+static gboolean set_toolbar_transfer_mode (ModestMsgViewWindow *self);
/* list my signals */
enum {
gboolean optimized_view;
GtkTreeModel *header_model;
- GtkTreeIter iter;
+ GtkTreeRowReference *row_reference;
guint clipboard_change_handler;
guint queue_change_handler;
+
+ guint progress_bar_timeout;
};
#define MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
priv->clipboard_change_handler = 0;
priv->optimized_view = FALSE;
-
+ priv->progress_bar_timeout = 0;
}
+static gboolean
+set_toolbar_transfer_mode (ModestMsgViewWindow *self)
+{
+ ModestMsgViewWindowPrivate *priv = NULL;
+
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self), FALSE);
+
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(self);
+
+ set_toolbar_mode (self, TOOLBAR_MODE_TRANSFER);
+
+ if (priv->progress_bar_timeout > 0) {
+ g_source_remove (priv->progress_bar_timeout);
+ priv->progress_bar_timeout = 0;
+ }
+
+ return FALSE;
+}
+
static void
set_toolbar_mode (ModestMsgViewWindow *self,
ModestToolBarModes mode)
g_signal_connect (G_OBJECT (priv->find_toolbar), "close", G_CALLBACK (modest_msg_view_window_find_toolbar_close), obj);
g_signal_connect (G_OBJECT (priv->find_toolbar), "search", G_CALLBACK (modest_msg_view_window_find_toolbar_search), obj);
- /* TODO: I dont knonw why, but when get_msg_async is used, */
- /* this code makes application doest not work (jfernandez) */
- if (FALSE) {
- priv->clipboard_change_handler = g_signal_connect (G_OBJECT (gtk_clipboard_get (GDK_SELECTION_PRIMARY)), "owner-change", G_CALLBACK (modest_msg_view_window_clipboard_owner_change), obj);
- modest_msg_view_window_clipboard_owner_change (gtk_clipboard_get (GDK_SELECTION_PRIMARY), NULL, obj);
- }
+ priv->clipboard_change_handler = g_signal_connect (G_OBJECT (gtk_clipboard_get (GDK_SELECTION_PRIMARY)), "owner-change", G_CALLBACK (modest_msg_view_window_clipboard_owner_change), obj);
gtk_widget_show_all (GTK_WIDGET(main_vbox));
gtk_box_pack_end (GTK_BOX (main_vbox), priv->find_toolbar, FALSE, FALSE, 0);
+
}
priv->queue_change_handler = 0;
}
+ if (priv->progress_bar_timeout > 0) {
+ g_source_remove (priv->progress_bar_timeout);
+ priv->progress_bar_timeout = 0;
+ }
+
+ if (priv->row_reference) {
+ gtk_tree_row_reference_free (priv->row_reference);
+ priv->row_reference = NULL;
+ }
+
G_OBJECT_CLASS(parent_class)->finalize (obj);
}
ModestWindow *
modest_msg_view_window_new_with_header_model (TnyMsg *msg, const gchar *account_name,
- GtkTreeModel *model, GtkTreeIter iter)
+ GtkTreeModel *model, GtkTreeRowReference *row_reference)
{
ModestMsgViewWindow *window = NULL;
ModestMsgViewWindowPrivate *priv = NULL;
g_object_ref (model);
priv->header_model = model;
- priv->iter = iter;
+ priv->row_reference = gtk_tree_row_reference_copy (row_reference);
modest_msg_view_window_update_priority (window);
GtkActionGroup *action_group;
GError *error = NULL;
GdkPixbuf *window_icon = NULL;
+ GtkAction *action;
g_return_val_if_fail (msg, NULL);
window_icon = modest_platform_get_icon (MODEST_APP_MSG_VIEW_ICON);
gtk_window_set_icon (GTK_WINDOW (obj), window_icon);
+ /* Init the clipboard actions dim status */
+ action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/EditCopyMenu");
+ gtk_action_set_sensitive (action, FALSE);
+
+ action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/EditCutMenu");
+ gtk_action_set_sensitive (action, FALSE);
+
gtk_widget_grab_focus (priv->msg_view);
return MODEST_WINDOW(obj);
+TnyHeader*
+modest_msg_view_window_get_header (ModestMsgViewWindow *self)
+{
+ ModestMsgViewWindowPrivate *priv= 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);
+
+ /* Get current message iter */
+ gtk_tree_model_get_iter (priv->header_model,
+ &iter,
+ gtk_tree_row_reference_get_path (priv->row_reference));
+
+ /* Get current message header */
+ gtk_tree_model_get (priv->header_model, &iter,
+ TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
+ &header, -1);
+
+ return header;
+}
+
TnyMsg*
modest_msg_view_window_get_message (ModestMsgViewWindow *self)
{
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
if (priv->header_model) {
- path = gtk_tree_model_get_path (priv->header_model, &priv->iter);
+ path = gtk_tree_row_reference_get_path (priv->row_reference);
if (!path)
return TRUE;
while (!has_next) {
}
}
- gtk_tree_path_free (path);
return !has_next;
} else {
return TRUE;
if (priv->header_model) {
gchar * path_string;
- path = gtk_tree_model_get_path (priv->header_model, &priv->iter);
+ path = gtk_tree_row_reference_get_path (priv->row_reference);
if (!path)
return TRUE;
}
g_free (path_string);
}
- gtk_tree_path_free (path);
return result;
} else {
return TRUE;
gboolean
modest_msg_view_window_select_next_message (ModestMsgViewWindow *window)
{
+ TnyHeaderFlags flags;
ModestMailOperation *mail_op = NULL;
ModestMsgViewWindowPrivate *priv;
GtkTreeIter tmp_iter;
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
if (priv->header_model) {
- tmp_iter = priv->iter;
+ gtk_tree_model_get_iter (priv->header_model,
+ &tmp_iter,
+ gtk_tree_row_reference_get_path (priv->row_reference));
while (gtk_tree_model_iter_next (priv->header_model, &tmp_iter)) {
TnyHeader *header;
- guint op_status;
+ GtkTreePath *path;
- priv->iter = tmp_iter;
- gtk_tree_model_get (priv->header_model, &(priv->iter), TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
+ gtk_tree_model_get (priv->header_model, &tmp_iter, TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
&header, -1);
if (!header)
break;
if (tny_header_get_flags (header) & TNY_HEADER_FLAG_DELETED)
continue;
+ /* Update the row reference */
+ gtk_tree_row_reference_free (priv->row_reference);
+ path = gtk_tree_model_get_path (priv->header_model, &tmp_iter);
+ priv->row_reference = gtk_tree_row_reference_new (priv->header_model, path);
+ gtk_tree_path_free (path);
+
+ /* 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);
+
/* New mail operation */
mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_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);
- op_status = modest_mail_operation_get_status (mail_op);
-
g_object_unref (mail_op);
- if (op_status == MODEST_MAIL_OPERATION_STATUS_FAILED)
- return FALSE;
- else
- return TRUE;
+ return TRUE;
}
-
- return FALSE;
- } else {
- return FALSE;
}
+ return FALSE;
}
+gboolean
+modest_msg_view_window_select_first_message (ModestMsgViewWindow *self)
+{
+ ModestMsgViewWindowPrivate *priv = NULL;
+ ModestMailOperation *mail_op = NULL;
+ TnyHeader *header = NULL;
+ TnyHeaderFlags flags;
+ GtkTreePath *path = NULL;
+ GtkTreeIter iter;
+
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self), FALSE);
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
+
+ path = gtk_tree_path_new_from_string ("0");
+
+ /* Update the row reference */
+ /* Get first message */
+ gtk_tree_model_get_iter (priv->header_model, &iter, path);
+ gtk_tree_model_get (priv->header_model, &iter, TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
+ &header, -1);
+
+ g_return_val_if_fail (TNY_IS_HEADER (header), FALSE);
+ if (tny_header_get_flags (header) & TNY_HEADER_FLAG_DELETED)
+ return modest_msg_view_window_select_next_message (self);
+
+ /* Update the row reference */
+ gtk_tree_row_reference_free (priv->row_reference);
+ priv->row_reference = gtk_tree_row_reference_new (priv->header_model, path);
+ gtk_tree_path_free (path);
+
+ /* 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);
+
+ /* New mail operation */
+ mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_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);
+
+ /* Free */
+/* g_object_unref (header); */
+
+ return TRUE;
+}
+
gboolean
modest_msg_view_window_select_previous_message (ModestMsgViewWindow *window)
{
+ TnyHeaderFlags flags;
ModestMsgViewWindowPrivate *priv = NULL;
ModestMailOperation *mail_op = NULL;
if (priv->header_model) {
GtkTreePath *path;
- path = gtk_tree_model_get_path (priv->header_model, &(priv->iter));
+ path = gtk_tree_row_reference_get_path (priv->row_reference);
while (gtk_tree_path_prev (path)) {
TnyHeader *header;
- guint op_status;
+ GtkTreeIter iter;
- gtk_tree_model_get_iter (priv->header_model, &(priv->iter), path);
- gtk_tree_model_get (priv->header_model, &(priv->iter), TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
+ gtk_tree_model_get_iter (priv->header_model, &iter, path);
+ gtk_tree_model_get (priv->header_model, &iter, TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
&header, -1);
if (!header)
break;
if (tny_header_get_flags (header) & TNY_HEADER_FLAG_DELETED)
continue;
+
+ /* Update the row reference */
+ gtk_tree_row_reference_free (priv->row_reference);
+ priv->row_reference = gtk_tree_row_reference_new (priv->header_model, path);
+ /* 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);
+
/* New mail operation */
mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_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);
-
- gtk_tree_path_free (path);
+ modest_mail_operation_get_msg (mail_op, header, view_msg_cb, NULL);
- op_status = modest_mail_operation_get_status (mail_op);
- if (op_status == MODEST_MAIL_OPERATION_STATUS_FAILED)
- return FALSE;
- else
- return TRUE;
+ return TRUE;
}
- } else {
- return FALSE;
}
return FALSE;
GList *attachments, *node;
gint n_selected;
gboolean selected_messages = FALSE;
+ gboolean nested_attachments = FALSE;
parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/MessageMenu/MessageForwardMenu");
gtk_action_set_sensitive (widget, !is_not_sent);
+ /* Attachment actions dimming */
attachments = modest_msg_view_get_selected_attachments (MODEST_MSG_VIEW (priv->msg_view));
n_selected = g_list_length (attachments);
for (node = attachments; node != NULL; node = g_list_next (node)) {
- if (!tny_mime_part_is_attachment (TNY_MIME_PART (node->data))) {
+ TnyMimePart *mime_part = TNY_MIME_PART (node->data);
+ TnyList *nested_list = tny_simple_list_new ();
+ if (!tny_mime_part_is_attachment (mime_part)) {
selected_messages = TRUE;
break;
}
+ tny_mime_part_get_parts (mime_part, nested_list);
+ if (tny_list_get_length (nested_list) > 0)
+ nested_attachments = TRUE;
+ g_object_unref (nested_list);
}
g_list_free (attachments);
widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/AttachmentsMenu/ViewAttachmentMenu");
gtk_action_set_sensitive (widget, n_selected == 1);
widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/AttachmentsMenu/SaveAttachmentMenu");
- gtk_action_set_sensitive (widget, (n_selected > 0) && (!selected_messages));
-
+ gtk_action_set_sensitive (widget, (n_selected > 0) && (!selected_messages) && (!nested_attachments));
+
+ /* Dimming depending of message being an attachment or not. It's not an attachment if
+ * we opened it outside a folder view */
+ widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/MessageMenu/MessageDeleteMenu");
+ gtk_action_set_sensitive (widget, priv->header_model != NULL);
+ widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/EditMoveToMenu");
+ gtk_action_set_sensitive (widget, priv->header_model != NULL);
+
}
static void
if (priv->header_model) {
TnyHeader *header;
+ GtkTreeIter iter;
+
+ gtk_tree_model_get_iter (priv->header_model,
+ &iter,
+ gtk_tree_row_reference_get_path (priv->row_reference));
- gtk_tree_model_get (priv->header_model, &(priv->iter), TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
+ gtk_tree_model_get (priv->header_model, &iter, TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
&header, -1);
flags = tny_header_get_flags (header);
}
priv->cancel_toolitem = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarCancel");
priv->next_toolitem = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageNext");
priv->prev_toolitem = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageBack");
- gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), FALSE);
- gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->progress_toolitem), FALSE);
+ gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), TRUE);
+ gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->progress_toolitem), TRUE);
gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->cancel_toolitem), FALSE);
gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->cancel_toolitem), FALSE);
GtkAction *action;
gboolean is_address;
gchar *selection;
+ GtkWidget *focused;
parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
selection = gtk_clipboard_wait_for_text (clipboard);
is_address = ((selection != NULL) && (modest_text_utils_validate_recipient (selection)));
- g_free (selection);
action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ToolsMenu/ToolsAddToContactsMenu");
gtk_action_set_sensitive (action, is_address);
+ focused = gtk_window_get_focus (GTK_WINDOW (window));
+
+ action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/EditCopyMenu");
+ gtk_action_set_sensitive (action, (selection != NULL) && (!MODEST_IS_ATTACHMENTS_VIEW (focused)));
+
+ action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/EditCutMenu");
+ gtk_action_set_sensitive (action, (selection != NULL) && (!MODEST_IS_ATTACHMENTS_VIEW (focused)));
+
+ g_free (selection);
modest_msg_view_window_update_dimmed (window);
}
switch (type) {
case MODEST_MAIL_OPERATION_QUEUE_OPERATION_ADDED:
if (mode == TOOLBAR_MODE_TRANSFER) {
+ /* Enable transfer toolbar mode */
+ set_toolbar_transfer_mode(self);
while (tmp) {
modest_progress_object_add_operation (MODEST_PROGRESS_OBJECT (tmp->data),
mail_op);
tmp = g_slist_next (tmp);
}
- /* Enable transfer toolbar mode */
- set_toolbar_mode (MODEST_MSG_VIEW_WINDOW(self), mode);
}
break;
case MODEST_MAIL_OPERATION_QUEUE_OPERATION_REMOVED:
}
/* If no more operations are being observed, NORMAL mode is enabled again */
- if (observers_empty (self))
+ if (observers_empty (self)) {
set_toolbar_mode (self, TOOLBAR_MODE_NORMAL);
+ }
}
break;
}