#include <tny-msg.h>
#include <tny-mime-part.h>
#include <tny-vfs-stream.h>
+#include <tny-error.h>
#include "modest-marshal.h"
#include "modest-platform.h"
#include <modest-utils.h>
#include <modest-main-window-ui.h>
#include "modest-msg-view-window-ui-dimming.h"
#include <modest-widget-memory.h>
+#include <modest-progress-object.h>
#include <modest-runtime.h>
#include <modest-window-priv.h>
#include <modest-tny-folder.h>
#include <modest-text-utils.h>
#include <modest-account-mgr-helpers.h>
-#include "modest-progress-bar.h"
-#include "hildon/hildon-pannable-area.h"
+#include <hildon/hildon-pannable-area.h>
+#include <hildon/hildon-picker-dialog.h>
+#include <hildon/hildon-app-menu.h>
#include "modest-defs.h"
#include "modest-hildon-includes.h"
#include "modest-ui-dimming-manager.h"
#include <modest-mime-part-view.h>
#include <modest-isearch-view.h>
#include <modest-tny-mime-part.h>
+#include <modest-address-book.h>
#include <math.h>
#include <errno.h>
#include <glib/gstdio.h>
#include <modest-debug.h>
+#include <modest-header-window.h>
-#define DEFAULT_FOLDER "MyDocs/.documents"
+#define MYDOCS_ENV "MYDOCSDIR"
+#define DOCS_FOLDER ".documents"
+
+typedef struct _ModestMsgViewWindowPrivate ModestMsgViewWindowPrivate;
+struct _ModestMsgViewWindowPrivate {
+
+ GtkWidget *msg_view;
+ GtkWidget *main_scroll;
+ GtkWidget *find_toolbar;
+ gchar *last_search;
+
+ /* Progress observers */
+ GSList *progress_widgets;
+
+ /* Tollbar items */
+ GtkWidget *prev_toolitem;
+ GtkWidget *next_toolitem;
+ gboolean progress_hint;
+ gint fetching_images;
+
+ /* Optimized view enabled */
+ gboolean optimized_view;
+
+ /* Whether this was created via the *_new_for_search_result() function. */
+ gboolean is_search_result;
+
+ /* Whether the message is in outbox */
+ gboolean is_outbox;
+
+ /* A reference to the @model of the header view
+ * to allow selecting previous/next messages,
+ * if the message is currently selected in the header view.
+ */
+ const gchar *header_folder_id;
+ GtkTreeModel *header_model;
+ GtkTreeRowReference *row_reference;
+ GtkTreeRowReference *next_row_reference;
+
+ gulong clipboard_change_handler;
+ gulong queue_change_handler;
+ gulong account_removed_handler;
+ gulong row_changed_handler;
+ gulong row_deleted_handler;
+ gulong row_inserted_handler;
+ gulong rows_reordered_handler;
+
+ guint purge_timeout;
+ GtkWidget *remove_attachment_banner;
+
+ gchar *msg_uid;
+ gboolean is_other_body;
+
+ GSList *sighandlers;
+};
static void modest_msg_view_window_class_init (ModestMsgViewWindowClass *klass);
static void modest_msg_view_window_init (ModestMsgViewWindow *obj);
ModestMsgViewWindow *obj);
static void modest_msg_view_window_disconnect_signals (ModestWindow *self);
+
+static gdouble modest_msg_view_window_get_zoom (ModestWindow *window);
static void modest_msg_view_window_set_zoom (ModestWindow *window,
gdouble zoom);
-static gdouble modest_msg_view_window_get_zoom (ModestWindow *window);
static gboolean modest_msg_view_window_zoom_minus (ModestWindow *window);
static gboolean modest_msg_view_window_zoom_plus (ModestWindow *window);
static gboolean modest_msg_view_window_key_event (GtkWidget *window,
GdkEventKey *event,
gpointer userdata);
-static gboolean modest_msg_view_window_window_state_event (GtkWidget *widget,
- GdkEventWindowState *event,
- gpointer userdata);
static void modest_msg_view_window_update_priority (ModestMsgViewWindow *window);
static void modest_msg_view_window_show_toolbar (ModestWindow *window,
GtkTreeModel *model,
const gchar *tny_folder_id);
-static void cancel_progressbar (GtkToolButton *toolbutton,
- ModestMsgViewWindow *self);
-
static void on_queue_changed (ModestMailOperationQueue *queue,
ModestMailOperation *mail_op,
ModestMailOperationQueueNotification type,
GError *error,
gpointer user_data);
-static void set_toolbar_mode (ModestMsgViewWindow *self,
- ModestToolBarModes mode);
+static void set_progress_hint (ModestMsgViewWindow *self,
+ gboolean enabled);
static void update_window_title (ModestMsgViewWindow *window);
GtkScrollType scroll_type,
gboolean horizontal,
gpointer userdata);
+static gboolean message_reader (ModestMsgViewWindow *window,
+ ModestMsgViewWindowPrivate *priv,
+ TnyHeader *header,
+ GtkTreeRowReference *row_reference);
+
+static void setup_menu (ModestMsgViewWindow *self);
+static gboolean _modest_msg_view_window_map_event (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer userdata);
+
/* list my signals */
enum {
static const GtkToggleActionEntry msg_view_toggle_action_entries [] = {
{ "FindInMessage", MODEST_TOOLBAR_ICON_FIND, N_("qgn_toolb_gene_find"), NULL, NULL, G_CALLBACK (modest_msg_view_window_toggle_find_toolbar), FALSE },
- { "ToolsFindInMessage", NULL, N_("mcen_me_viewer_find"), "<CTRL>F", NULL, G_CALLBACK (modest_msg_view_window_toggle_find_toolbar), FALSE },
};
-static const GtkRadioActionEntry msg_view_zoom_action_entries [] = {
- { "Zoom50", NULL, N_("mcen_me_viewer_50"), NULL, NULL, 50 },
- { "Zoom80", NULL, N_("mcen_me_viewer_80"), NULL, NULL, 80 },
- { "Zoom100", NULL, N_("mcen_me_viewer_100"), NULL, NULL, 100 },
- { "Zoom120", NULL, N_("mcen_me_viewer_120"), NULL, NULL, 120 },
- { "Zoom150", NULL, N_("mcen_me_viewer_150"), NULL, NULL, 150 },
- { "Zoom200", NULL, N_("mcen_me_viewer_200"), NULL, NULL, 200 }
-};
-
-typedef struct _ModestMsgViewWindowPrivate ModestMsgViewWindowPrivate;
-struct _ModestMsgViewWindowPrivate {
-
- GtkWidget *msg_view;
- GtkWidget *main_scroll;
- GtkWidget *find_toolbar;
- gchar *last_search;
-
- /* Progress observers */
- GtkWidget *progress_bar;
- GSList *progress_widgets;
-
- /* Tollbar items */
- GtkWidget *progress_toolitem;
- GtkWidget *cancel_toolitem;
- GtkWidget *prev_toolitem;
- GtkWidget *next_toolitem;
- ModestToolBarModes current_toolbar_mode;
-
- /* Optimized view enabled */
- gboolean optimized_view;
-
- /* Whether this was created via the *_new_for_search_result() function. */
- gboolean is_search_result;
-
- /* Whether the message is in outbox */
- gboolean is_outbox;
-
- /* A reference to the @model of the header view
- * to allow selecting previous/next messages,
- * if the message is currently selected in the header view.
- */
- const gchar *header_folder_id;
- GtkTreeModel *header_model;
- GtkTreeRowReference *row_reference;
- GtkTreeRowReference *next_row_reference;
-
- gulong clipboard_change_handler;
- gulong queue_change_handler;
- gulong account_removed_handler;
- gulong row_changed_handler;
- gulong row_deleted_handler;
- gulong row_inserted_handler;
- gulong rows_reordered_handler;
-
- guint purge_timeout;
- GtkWidget *remove_attachment_banner;
-
- guint progress_bar_timeout;
-
- gchar *msg_uid;
-
- GSList *sighandlers;
-};
#define MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
MODEST_TYPE_MSG_VIEW_WINDOW, \
(GInstanceInitFunc) modest_msg_view_window_init,
NULL
};
- my_type = g_type_register_static (MODEST_TYPE_WINDOW,
+ my_type = g_type_register_static (MODEST_TYPE_HILDON2_WINDOW,
"ModestMsgViewWindow",
&my_info, 0);
MODEST_CONF_MSG_VIEW_WINDOW_KEY);
}
-
-static void
-restore_settings (ModestMsgViewWindow *self)
-{
- ModestConf *conf;
- ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (self);
- GtkAction *action;
-
- conf = modest_runtime_get_conf ();
- action = gtk_ui_manager_get_action (parent_priv->ui_manager,
- "/MenuBar/ViewMenu/ViewShowToolbarMenu/ViewShowToolbarNormalScreenMenu");
- gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action),
- modest_conf_get_bool (conf, MODEST_CONF_MSG_VIEW_WINDOW_SHOW_TOOLBAR, NULL));
- action = gtk_ui_manager_get_action (parent_priv->ui_manager,
- "/MenuBar/ViewMenu/ViewShowToolbarMenu/ViewShowToolbarFullScreenMenu");
- gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action),
- modest_conf_get_bool (conf, MODEST_CONF_MSG_VIEW_WINDOW_SHOW_TOOLBAR_FULLSCREEN, NULL));
- modest_widget_memory_restore (conf,
- G_OBJECT(self),
- MODEST_CONF_MSG_VIEW_WINDOW_KEY);
-}
-
-static gboolean modest_msg_view_window_scroll_child (ModestMsgViewWindow *self,
- GtkScrollType scroll_type,
- gboolean horizontal,
- gpointer userdata)
+static
+gboolean modest_msg_view_window_scroll_child (ModestMsgViewWindow *self,
+ GtkScrollType scroll_type,
+ gboolean horizontal,
+ gpointer userdata)
{
ModestMsgViewWindowPrivate *priv;
gboolean return_value;
modest_msg_view_window_class_init (ModestMsgViewWindowClass *klass)
{
GObjectClass *gobject_class;
+ HildonWindowClass *hildon_window_class;
ModestWindowClass *modest_window_class;
GtkBindingSet *binding_set;
gobject_class = (GObjectClass*) klass;
+ hildon_window_class = (HildonWindowClass *) klass;
modest_window_class = (ModestWindowClass *) klass;
parent_class = g_type_class_peek_parent (klass);
modest_window_class->set_zoom_func = modest_msg_view_window_set_zoom;
modest_window_class->get_zoom_func = modest_msg_view_window_get_zoom;
- modest_window_class->zoom_minus_func = modest_msg_view_window_zoom_minus;
modest_window_class->zoom_plus_func = modest_msg_view_window_zoom_plus;
+ modest_window_class->zoom_minus_func = modest_msg_view_window_zoom_minus;
modest_window_class->show_toolbar_func = modest_msg_view_window_show_toolbar;
modest_window_class->disconnect_signals_func = modest_msg_view_window_disconnect_signals;
G_N_ELEMENTS (modest_action_entries),
obj);
gtk_action_group_add_toggle_actions (action_group,
- modest_toggle_action_entries,
- G_N_ELEMENTS (modest_toggle_action_entries),
- obj);
- gtk_action_group_add_toggle_actions (action_group,
msg_view_toggle_action_entries,
G_N_ELEMENTS (msg_view_toggle_action_entries),
obj);
- gtk_action_group_add_radio_actions (action_group,
- msg_view_zoom_action_entries,
- G_N_ELEMENTS (msg_view_zoom_action_entries),
- 100,
- G_CALLBACK (modest_ui_actions_on_change_zoom),
- obj);
gtk_ui_manager_insert_action_group (parent_priv->ui_manager, action_group, 0);
g_object_unref (action_group);
priv->row_deleted_handler = 0;
priv->row_inserted_handler = 0;
priv->rows_reordered_handler = 0;
- priv->current_toolbar_mode = TOOLBAR_MODE_NORMAL;
+ priv->progress_hint = FALSE;
+ priv->fetching_images = 0;
priv->optimized_view = FALSE;
- priv->progress_bar_timeout = 0;
priv->purge_timeout = 0;
priv->remove_attachment_banner = NULL;
priv->msg_uid = NULL;
+ priv->is_other_body = FALSE;
priv->sighandlers = NULL;
hildon_program_add_window (hildon_program_get_instance(),
HILDON_WINDOW(obj));
- modest_window_mgr_register_help_id (modest_runtime_get_window_mgr(),
- GTK_WINDOW(obj),"applications_email_viewer");
}
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;
- }
+ set_progress_hint (self, TRUE);
return FALSE;
}
+static void
+update_progress_hint (ModestMsgViewWindow *self)
+{
+ ModestMsgViewWindowPrivate *priv;
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(self);
+
+ if (GTK_WIDGET_VISIBLE (self)) {
+ hildon_gtk_window_set_progress_indicator (GTK_WINDOW (self),
+ (priv->progress_hint || (priv->fetching_images > 0))?1:0);
+ }
+}
+
static void
-set_toolbar_mode (ModestMsgViewWindow *self,
- ModestToolBarModes mode)
+set_progress_hint (ModestMsgViewWindow *self,
+ gboolean enabled)
{
ModestWindowPrivate *parent_priv;
ModestMsgViewWindowPrivate *priv;
-/* GtkWidget *widget = NULL; */
g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self));
parent_priv = MODEST_WINDOW_GET_PRIVATE(self);
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(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:
- 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 (priv->cancel_toolitem)
- gtk_widget_hide (priv->cancel_toolitem);
-
- if (priv->prev_toolitem)
- gtk_widget_show (priv->prev_toolitem);
-
- if (priv->next_toolitem)
- gtk_widget_show (priv->next_toolitem);
-
- /* Hide toolbar if optimized view is enabled */
- if (priv->optimized_view) {
- gtk_widget_set_no_show_all (parent_priv->toolbar, TRUE);
- gtk_widget_hide (GTK_WIDGET(parent_priv->toolbar));
- }
-
- break;
- case TOOLBAR_MODE_TRANSFER:
- if (priv->prev_toolitem)
- gtk_widget_hide (priv->prev_toolitem);
-
- if (priv->next_toolitem)
- gtk_widget_hide (priv->next_toolitem);
-
- if (priv->progress_bar)
- gtk_widget_show (priv->progress_bar);
+ /* Sets current progress hint */
+ priv->progress_hint = enabled;
- if (priv->progress_toolitem) {
- gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), TRUE);
- gtk_widget_show (priv->progress_toolitem);
- }
-
- if (priv->cancel_toolitem)
- gtk_widget_show (priv->cancel_toolitem);
-
- /* Show toolbar if it's hiden (optimized view ) */
- if (priv->optimized_view) {
- gtk_widget_set_no_show_all (parent_priv->toolbar, FALSE);
- gtk_widget_show (GTK_WIDGET (parent_priv->toolbar));
- }
-
- break;
- default:
- g_return_if_reached ();
- }
+ update_progress_hint (self);
}
priv->msg_view = GTK_WIDGET (tny_platform_factory_new_msg_view (modest_tny_platform_factory_get_instance ()));
modest_msg_view_set_shadow_type (MODEST_MSG_VIEW (priv->msg_view), GTK_SHADOW_NONE);
main_vbox = gtk_vbox_new (FALSE, 6);
-#ifdef MODEST_TOOLKIT_HILDON2
priv->main_scroll = hildon_pannable_area_new ();
gtk_container_add (GTK_CONTAINER (priv->main_scroll), priv->msg_view);
-#else
-#ifdef MODEST_USE_MOZEMBED
- priv->main_scroll = priv->msg_view;
- gtk_widget_set_size_request (priv->msg_view, -1, 1600);
-#else
- priv->main_scroll = gtk_scrolled_window_new (NULL, NULL);
- gtk_container_add (GTK_CONTAINER (priv->main_scroll), priv->msg_view);
-#endif
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->main_scroll), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (priv->main_scroll), GTK_SHADOW_NONE);
- modest_maemo_set_thumbable_scrollbar (GTK_SCROLLED_WINDOW(priv->main_scroll), TRUE);
-
-#endif
gtk_box_pack_start (GTK_BOX(main_vbox), priv->main_scroll, TRUE, TRUE, 0);
gtk_container_add (GTK_CONTAINER(obj), main_vbox);
priv->find_toolbar = hildon_find_toolbar_new (NULL);
hildon_window_add_toolbar (HILDON_WINDOW (obj), GTK_TOOLBAR (priv->find_toolbar));
gtk_widget_set_no_show_all (priv->find_toolbar, TRUE);
-
+
+ /* NULL-ize fields if the window is destroyed */
+ g_signal_connect (priv->msg_view, "destroy", G_CALLBACK (gtk_widget_destroyed), &(priv->msg_view));
+
gtk_widget_show_all (GTK_WIDGET(main_vbox));
}
modest_msg_view_window_disconnect_signals (ModestWindow *self)
{
ModestMsgViewWindowPrivate *priv;
- ModestHeaderView *header_view = NULL;
- ModestWindow *main_window = NULL;
+ GtkWidget *header_view = NULL;
+ GtkWindow *parent_window = NULL;
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
modest_signal_mgr_disconnect_all_and_destroy (priv->sighandlers);
priv->sighandlers = NULL;
-
- main_window = modest_window_mgr_get_main_window (modest_runtime_get_window_mgr(),
- FALSE); /* don't create */
- if (!main_window)
- return;
-
- header_view = MODEST_HEADER_VIEW(
- modest_main_window_get_child_widget(
- MODEST_MAIN_WINDOW(main_window),
- MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW));
- if (header_view == NULL)
- return;
-
- modest_header_view_remove_observer(header_view,
- MODEST_HEADER_VIEW_OBSERVER(self));
+
+ parent_window = gtk_window_get_transient_for (GTK_WINDOW (self));
+ if (parent_window && MODEST_IS_HEADER_WINDOW (parent_window)) {
+ header_view = GTK_WIDGET (modest_header_window_get_header_view (MODEST_HEADER_WINDOW (parent_window)));
+ if (header_view) {
+ modest_header_view_remove_observer(MODEST_HEADER_VIEW (header_view),
+ MODEST_HEADER_VIEW_OBSERVER(self));
+ }
+ }
}
static void
priv->header_model = NULL;
}
- if (priv->progress_bar_timeout > 0) {
- g_source_remove (priv->progress_bar_timeout);
- priv->progress_bar_timeout = 0;
- }
-
if (priv->remove_attachment_banner) {
gtk_widget_destroy (priv->remove_attachment_banner);
g_object_unref (priv->remove_attachment_banner);
if (msg_is_visible (header, is_outbox)) {
next = gtk_tree_model_get_path (model, &tmp_iter);
*row_reference = gtk_tree_row_reference_new (model, next);
+ gtk_tree_path_free (next);
retval = TRUE;
finished = TRUE;
}
message */
finished = TRUE;
}
+ gtk_tree_path_free (next);
} else {
/* If there are no more messages and we don't
want to start again in the first one then
/* Free */
gtk_tree_path_free (path);
- if (next)
- gtk_tree_path_free (next);
return retval;
}
static void
modest_msg_view_window_construct (ModestMsgViewWindow *self,
const gchar *modest_account_name,
+ const gchar *mailbox,
const gchar *msg_uid)
{
GObject *obj = NULL;
ModestMsgViewWindowPrivate *priv = NULL;
ModestWindowPrivate *parent_priv = NULL;
- ModestDimmingRulesGroup *menu_rules_group = NULL;
ModestDimmingRulesGroup *toolbar_rules_group = NULL;
ModestDimmingRulesGroup *clipboard_rules_group = NULL;
priv->msg_uid = g_strdup (msg_uid);
/* Menubar */
- parent_priv->menubar = modest_maemo_utils_get_manager_menubar_as_menu (parent_priv->ui_manager, "/MenuBar");
- hildon_window_set_menu (HILDON_WINDOW(obj), GTK_MENU(parent_priv->menubar));
- gtk_widget_show (parent_priv->menubar);
- parent_priv->ui_dimming_manager = modest_ui_dimming_manager_new();
+ parent_priv->menubar = NULL;
- menu_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_MENU, FALSE);
toolbar_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_TOOLBAR, TRUE);
clipboard_rules_group = modest_dimming_rules_group_new (MODEST_DIMMING_RULES_CLIPBOARD, FALSE);
+ setup_menu (self);
/* Add common dimming rules */
- modest_dimming_rules_group_add_rules (menu_rules_group,
- modest_msg_view_menu_dimming_entries,
- G_N_ELEMENTS (modest_msg_view_menu_dimming_entries),
- MODEST_WINDOW (self));
modest_dimming_rules_group_add_rules (toolbar_rules_group,
modest_msg_view_toolbar_dimming_entries,
G_N_ELEMENTS (modest_msg_view_toolbar_dimming_entries),
MODEST_WINDOW (self));
/* Insert dimming rules group for this window */
- modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, menu_rules_group);
modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, toolbar_rules_group);
modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, clipboard_rules_group);
- g_object_unref (menu_rules_group);
g_object_unref (toolbar_rules_group);
g_object_unref (clipboard_rules_group);
- restore_settings (MODEST_MSG_VIEW_WINDOW(obj));
-
/* g_signal_connect (G_OBJECT(obj), "delete-event", G_CALLBACK(on_delete_event), 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);
G_CALLBACK (modest_ui_actions_on_msg_attachment_clicked), obj);
g_signal_connect (G_OBJECT(priv->msg_view), "recpt_activated",
G_CALLBACK (modest_ui_actions_on_msg_recpt_activated), obj);
+ g_signal_connect (G_OBJECT(priv->msg_view), "show_details",
+ G_CALLBACK (modest_ui_actions_on_details), obj);
g_signal_connect (G_OBJECT(priv->msg_view), "link_contextual",
G_CALLBACK (modest_ui_actions_on_msg_link_contextual), obj);
g_signal_connect (G_OBJECT (priv->msg_view), "fetch_image",
G_CALLBACK (modest_msg_view_window_key_event),
NULL);
- g_signal_connect (G_OBJECT (obj), "window-state-event",
- G_CALLBACK (modest_msg_view_window_window_state_event),
- NULL);
-
g_signal_connect (G_OBJECT (obj), "move-focus",
G_CALLBACK (on_move_focus), obj);
+ g_signal_connect (G_OBJECT (obj), "map-event",
+ G_CALLBACK (_modest_msg_view_window_map_event),
+ G_OBJECT (obj));
+
/* Mail Operation Queue */
priv->queue_change_handler = g_signal_connect (G_OBJECT (modest_runtime_get_mail_operation_queue ()),
"queue-changed",
obj);
modest_window_set_active_account (MODEST_WINDOW(obj), modest_account_name);
+ modest_window_set_active_mailbox (MODEST_WINDOW(obj), mailbox);
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);
priv->last_search = NULL;
+ modest_msg_view_window_show_toolbar (MODEST_WINDOW (obj), TRUE);
+
/* Init the clipboard actions dim status */
modest_msg_view_grab_focus(MODEST_MSG_VIEW (priv->msg_view));
ModestWindow *
modest_msg_view_window_new_with_header_model (TnyMsg *msg,
const gchar *modest_account_name,
+ const gchar *mailbox,
const gchar *msg_uid,
GtkTreeModel *model,
GtkTreeRowReference *row_reference)
ModestMsgViewWindowPrivate *priv = NULL;
TnyFolder *header_folder = NULL;
ModestHeaderView *header_view = NULL;
- ModestWindow *main_window = NULL;
ModestWindowMgr *mgr = NULL;
MODEST_DEBUG_BLOCK (
window = MODEST_MSG_VIEW_WINDOW (modest_window_mgr_get_msg_view_window (mgr));
g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), NULL);
- modest_msg_view_window_construct (window, modest_account_name, msg_uid);
+ modest_msg_view_window_construct (window, modest_account_name, mailbox, msg_uid);
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
- /* Remember the message list's TreeModel so we can detect changes
+ /* Remember the message list's TreeModel so we can detect changes
* and change the list selection when necessary: */
+ header_folder = modest_header_view_get_folder (header_view);
+ if (header_folder) {
+ priv->is_outbox = (modest_tny_folder_guess_folder_type (header_folder) ==
+ TNY_FOLDER_TYPE_OUTBOX);
+ priv->header_folder_id = tny_folder_get_id (header_folder);
+ g_object_unref(header_folder);
+ }
+
+ /* Setup row references and connect signals */
+ priv->header_model = g_object_ref (model);
- main_window = modest_window_mgr_get_main_window(mgr, FALSE); /* don't create */
- if (main_window) {
- header_view = MODEST_HEADER_VIEW(modest_main_window_get_child_widget(
- MODEST_MAIN_WINDOW(main_window),
- MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW));
+ if (row_reference) {
+ priv->row_reference = gtk_tree_row_reference_copy (row_reference);
+ priv->next_row_reference = gtk_tree_row_reference_copy (row_reference);
+ select_next_valid_row (model, &(priv->next_row_reference), TRUE, priv->is_outbox);
+ } else {
+ priv->row_reference = NULL;
+ priv->next_row_reference = NULL;
}
-
+
+ /* Connect signals */
+ priv->row_changed_handler =
+ g_signal_connect (GTK_TREE_MODEL(model), "row-changed",
+ G_CALLBACK(modest_msg_view_window_on_row_changed),
+ window);
+ priv->row_deleted_handler =
+ g_signal_connect (GTK_TREE_MODEL(model), "row-deleted",
+ G_CALLBACK(modest_msg_view_window_on_row_deleted),
+ window);
+ priv->row_inserted_handler =
+ g_signal_connect (GTK_TREE_MODEL(model), "row-inserted",
+ G_CALLBACK(modest_msg_view_window_on_row_inserted),
+ window);
+ priv->rows_reordered_handler =
+ g_signal_connect(GTK_TREE_MODEL(model), "rows-reordered",
+ G_CALLBACK(modest_msg_view_window_on_row_reordered),
+ window);
+
+ if (header_view != NULL){
+ modest_header_view_add_observer(header_view,
+ MODEST_HEADER_VIEW_OBSERVER(window));
+ }
+
+ tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
+ update_window_title (MODEST_MSG_VIEW_WINDOW (window));
+
+ /* gtk_widget_show_all (GTK_WIDGET (window)); */
+ modest_msg_view_window_update_priority (window);
+ /* Check dimming rules */
+ modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
+ modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (window));
+ modest_window_check_dimming_rules_group (MODEST_WINDOW (window), MODEST_DIMMING_RULES_CLIPBOARD);
+
+ return MODEST_WINDOW(window);
+}
+
+ModestWindow *
+modest_msg_view_window_new_from_header_view (ModestHeaderView *header_view,
+ const gchar *modest_account_name,
+ const gchar *mailbox,
+ const gchar *msg_uid,
+ GtkTreeRowReference *row_reference)
+{
+ ModestMsgViewWindow *window = NULL;
+ ModestMsgViewWindowPrivate *priv = NULL;
+ TnyFolder *header_folder = NULL;
+ ModestWindowMgr *mgr = NULL;
+ GtkTreePath *path;
+ GtkTreeIter iter;
+
+ mgr = modest_runtime_get_window_mgr ();
+ window = MODEST_MSG_VIEW_WINDOW (modest_window_mgr_get_msg_view_window (mgr));
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), NULL);
+
+ modest_msg_view_window_construct (window, modest_account_name, mailbox, msg_uid);
+
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+
+ /* Remember the message list's TreeModel so we can detect changes
+ * and change the list selection when necessary: */
+
if (header_view != NULL){
header_folder = modest_header_view_get_folder(header_view);
/* This could happen if the header folder was
example if the user selects an account in the
folder view of the main window */
if (header_folder) {
- priv->is_outbox = (modest_tny_folder_guess_folder_type (header_folder) == TNY_FOLDER_TYPE_OUTBOX);
+ priv->is_outbox = (modest_tny_folder_guess_folder_type (header_folder) ==
+ TNY_FOLDER_TYPE_OUTBOX);
priv->header_folder_id = tny_folder_get_id(header_folder);
- g_assert(priv->header_folder_id != NULL);
g_object_unref(header_folder);
}
}
/* Setup row references and connect signals */
- priv->header_model = g_object_ref (model);
+ priv->header_model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view));
+ g_object_ref (priv->header_model);
if (row_reference) {
priv->row_reference = gtk_tree_row_reference_copy (row_reference);
priv->next_row_reference = gtk_tree_row_reference_copy (row_reference);
- select_next_valid_row (model, &(priv->next_row_reference), TRUE, priv->is_outbox);
+ select_next_valid_row (priv->header_model, &(priv->next_row_reference), TRUE, priv->is_outbox);
} else {
priv->row_reference = NULL;
priv->next_row_reference = NULL;
/* Connect signals */
priv->row_changed_handler =
- g_signal_connect (GTK_TREE_MODEL(model), "row-changed",
+ g_signal_connect (GTK_TREE_MODEL(priv->header_model), "row-changed",
G_CALLBACK(modest_msg_view_window_on_row_changed),
window);
priv->row_deleted_handler =
- g_signal_connect (GTK_TREE_MODEL(model), "row-deleted",
+ g_signal_connect (GTK_TREE_MODEL(priv->header_model), "row-deleted",
G_CALLBACK(modest_msg_view_window_on_row_deleted),
window);
priv->row_inserted_handler =
- g_signal_connect (GTK_TREE_MODEL(model), "row-inserted",
+ g_signal_connect (GTK_TREE_MODEL(priv->header_model), "row-inserted",
G_CALLBACK(modest_msg_view_window_on_row_inserted),
window);
priv->rows_reordered_handler =
- g_signal_connect(GTK_TREE_MODEL(model), "rows-reordered",
+ g_signal_connect(GTK_TREE_MODEL(priv->header_model), "rows-reordered",
G_CALLBACK(modest_msg_view_window_on_row_reordered),
window);
if (header_view != NULL){
modest_header_view_add_observer(header_view,
- MODEST_HEADER_VIEW_OBSERVER(window));
+ MODEST_HEADER_VIEW_OBSERVER(window));
}
- tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
- update_window_title (MODEST_MSG_VIEW_WINDOW (window));
- gtk_widget_show_all (GTK_WIDGET (window));
- modest_msg_view_window_update_priority (window);
+ tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), NULL);
+
+ path = gtk_tree_row_reference_get_path (row_reference);
+ if (gtk_tree_model_get_iter (priv->header_model, &iter, path)) {
+ TnyHeader *header;
+ gtk_tree_model_get (priv->header_model, &iter,
+ TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
+ &header, -1);
+ message_reader (window, priv, header, row_reference);
+ g_object_unref (header);
+ }
+ gtk_tree_path_free (path);
/* Check dimming rules */
modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
ModestWindow *
modest_msg_view_window_new_for_search_result (TnyMsg *msg,
const gchar *modest_account_name,
+ const gchar *mailbox,
const gchar *msg_uid)
{
ModestMsgViewWindow *window = NULL;
mgr = modest_runtime_get_window_mgr ();
window = MODEST_MSG_VIEW_WINDOW (modest_window_mgr_get_msg_view_window (mgr));
g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), NULL);
- modest_msg_view_window_construct (window, modest_account_name, msg_uid);
+ modest_msg_view_window_construct (window, modest_account_name, mailbox, msg_uid);
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
update_window_title (window);
- gtk_widget_show_all (GTK_WIDGET (window));
+ /* gtk_widget_show_all (GTK_WIDGET (window));*/
modest_msg_view_window_update_priority (window);
/* Check dimming rules */
}
ModestWindow *
-modest_msg_view_window_new_for_attachment (TnyMsg *msg,
- const gchar *modest_account_name,
- const gchar *msg_uid)
+modest_msg_view_window_new_with_other_body (TnyMsg *msg,
+ TnyMimePart *other_body,
+ const gchar *modest_account_name,
+ const gchar *mailbox,
+ const gchar *msg_uid)
{
GObject *obj = NULL;
ModestMsgViewWindowPrivate *priv;
obj = G_OBJECT (modest_window_mgr_get_msg_view_window (mgr));
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (obj);
modest_msg_view_window_construct (MODEST_MSG_VIEW_WINDOW (obj),
- modest_account_name, msg_uid);
+ modest_account_name, mailbox, msg_uid);
- tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
+ if (other_body) {
+ priv->is_other_body = TRUE;
+ modest_msg_view_set_msg_with_other_body (MODEST_MSG_VIEW (priv->msg_view), msg, other_body);
+ } else {
+ tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg);
+ }
update_window_title (MODEST_MSG_VIEW_WINDOW (obj));
- gtk_widget_show_all (GTK_WIDGET (obj));
+ /* gtk_widget_show_all (GTK_WIDGET (obj)); */
/* Check dimming rules */
modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (obj));
return MODEST_WINDOW(obj);
}
+ModestWindow *
+modest_msg_view_window_new_for_attachment (TnyMsg *msg,
+ const gchar *modest_account_name,
+ const gchar *mailbox,
+ const gchar *msg_uid)
+{
+ return modest_msg_view_window_new_with_other_body (msg, NULL, modest_account_name, mailbox, msg_uid);
+}
+
static void
modest_msg_view_window_on_row_changed (GtkTreeModel *header_model,
GtkTreePath *arg1,
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;
+ return priv->progress_hint;
}
TnyHeader*
g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self), NULL);
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
+ if (priv->is_other_body)
+ return NULL;
+
/* If the message was not obtained from a treemodel,
* for instance if it was opened directly by the search UI:
*/
hildon_find_toolbar_highlight_entry (HILDON_FIND_TOOLBAR (priv->find_toolbar), TRUE);
} else {
gtk_widget_hide (priv->find_toolbar);
+ modest_msg_view_grab_focus (MODEST_MSG_VIEW (priv->msg_view));
}
/* update the toggle buttons status */
action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/FindInMessage");
- modest_utils_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), is_active);
- action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ToolsMenu/ToolsFindInMessageMenu");
- modest_utils_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), is_active);
-
+ if (action)
+ modest_utils_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), is_active);
+
}
static void
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (obj);
parent_priv = MODEST_WINDOW_GET_PRIVATE (obj);
-
+
toggle = GTK_TOGGLE_ACTION (gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/FindInMessage"));
gtk_toggle_action_set_active (toggle, FALSE);
modest_msg_view_grab_focus (MODEST_MSG_VIEW (priv->msg_view));
if ((current_search == NULL) || (strcmp (current_search, "") == 0)) {
g_free (current_search);
- hildon_banner_show_information (NULL, NULL, dgettext("hildon-common-strings", "ecdg_ib_find_rep_enter_text"));
+ hildon_banner_show_information (NULL, NULL, _CS("ecdg_ib_find_rep_enter_text"));
return;
}
result = modest_isearch_view_search (MODEST_ISEARCH_VIEW (priv->msg_view),
priv->last_search);
if (!result) {
- hildon_banner_show_information (NULL, NULL, dgettext("hildon-libs", "ckct_ib_find_no_matches"));
+ hildon_banner_show_information (NULL, NULL,
+ _HL("ckct_ib_find_no_matches"));
g_free (priv->last_search);
priv->last_search = NULL;
} else {
- modest_msg_view_grab_focus (MODEST_MSG_VIEW (priv->msg_view));
hildon_find_toolbar_highlight_entry (HILDON_FIND_TOOLBAR (priv->find_toolbar), TRUE);
}
} else {
if (!modest_isearch_view_search_next (MODEST_ISEARCH_VIEW (priv->msg_view))) {
- hildon_banner_show_information (NULL, NULL, dgettext("hildon-libs", "ckct_ib_find_search_complete"));
+ hildon_banner_show_information (NULL, NULL,
+ _HL("ckct_ib_find_search_complete"));
g_free (priv->last_search);
priv->last_search = NULL;
} else {
- modest_msg_view_grab_focus (MODEST_MSG_VIEW (priv->msg_view));
hildon_find_toolbar_highlight_entry (HILDON_FIND_TOOLBAR (priv->find_toolbar), TRUE);
}
}
{
ModestMsgViewWindowPrivate *priv;
ModestWindowPrivate *parent_priv;
- GtkAction *action = NULL;
- gint int_zoom = (gint) rint (zoom*100.0+0.1);
g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window));
parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
modest_zoomable_set_zoom (MODEST_ZOOMABLE (priv->msg_view), zoom);
- action = gtk_ui_manager_get_action (parent_priv->ui_manager,
- "/MenuBar/ViewMenu/ZoomMenu/Zoom50Menu");
-
- gtk_radio_action_set_current_value (GTK_RADIO_ACTION (action), int_zoom);
}
static gdouble
static gboolean
modest_msg_view_window_zoom_plus (ModestWindow *window)
{
- ModestWindowPrivate *parent_priv;
- GtkRadioAction *zoom_radio_action;
- GSList *group, *node;
-
- parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
- zoom_radio_action = GTK_RADIO_ACTION (gtk_ui_manager_get_action (parent_priv->ui_manager,
- "/MenuBar/ViewMenu/ZoomMenu/Zoom50Menu"));
-
- group = gtk_radio_action_get_group (zoom_radio_action);
+ gdouble zoom_level;
+ ModestMsgViewWindowPrivate *priv;
+ gint int_zoom;
+ gchar *banner_text;
+
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), 1.0);
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+
+ zoom_level = modest_zoomable_get_zoom (MODEST_ZOOMABLE (priv->msg_view));
- if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (group->data))) {
- hildon_banner_show_information (NULL, NULL, dgettext("hildon-common-strings", "ckct_ib_max_zoom_level_reached"));
+ if (zoom_level >= 2.0) {
+ hildon_banner_show_information (NULL, NULL,
+ _CS("ckct_ib_max_zoom_level_reached"));
return FALSE;
+ } else if (zoom_level >= 1.5) {
+ zoom_level = 2.0;
+ } else if (zoom_level >= 1.2) {
+ zoom_level = 1.5;
+ } else if (zoom_level >= 1.0) {
+ zoom_level = 1.2;
+ } else if (zoom_level >= 0.8) {
+ zoom_level = 1.0;
+ } else if (zoom_level >= 0.5) {
+ zoom_level = 0.8;
+ } else {
+ zoom_level = 0.5;
}
- for (node = group; node != NULL; node = g_slist_next (node)) {
- if ((node->next != NULL) && gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (node->next->data))) {
- gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (node->data), TRUE);
- return TRUE;
- }
- }
- return FALSE;
+ /* set zoom level */
+ int_zoom = (gint) rint (zoom_level*100.0+0.1);
+ banner_text = g_strdup_printf (_HL("wdgt_ib_zoom"), int_zoom);
+ modest_platform_information_banner (GTK_WIDGET (window), NULL, banner_text);
+ g_free (banner_text);
+ modest_zoomable_set_zoom (MODEST_ZOOMABLE (priv->msg_view), zoom_level);
+
+ return TRUE;
}
static gboolean
modest_msg_view_window_zoom_minus (ModestWindow *window)
{
- ModestWindowPrivate *parent_priv;
- GtkRadioAction *zoom_radio_action;
- GSList *group, *node;
+ gdouble zoom_level;
+ ModestMsgViewWindowPrivate *priv;
+ gint int_zoom;
+ gchar *banner_text;
+
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), 1.0);
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+
+ zoom_level = modest_zoomable_get_zoom (MODEST_ZOOMABLE (priv->msg_view));
- parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
- zoom_radio_action = GTK_RADIO_ACTION (gtk_ui_manager_get_action (parent_priv->ui_manager,
- "/MenuBar/ViewMenu/ZoomMenu/Zoom50Menu"));
+ if (zoom_level <= 0.5) {
+ hildon_banner_show_information (NULL, NULL,
+ _CS("ckct_ib_min_zoom_level_reached"));
+ return FALSE;
+ } else if (zoom_level <= 0.8) {
+ zoom_level = 0.5;
+ } else if (zoom_level <= 1.0) {
+ zoom_level = 0.8;
+ } else if (zoom_level <= 1.2) {
+ zoom_level = 1.0;
+ } else if (zoom_level <= 1.5) {
+ zoom_level = 1.2;
+ } else if (zoom_level <= 2.0) {
+ zoom_level = 1.5;
+ } else {
+ zoom_level = 2.0;
+ }
- group = gtk_radio_action_get_group (zoom_radio_action);
+ /* set zoom level */
+ int_zoom = (gint) rint (zoom_level*100.0+0.1);
+ banner_text = g_strdup_printf (_HL("wdgt_ib_zoom"), int_zoom);
+ modest_platform_information_banner (GTK_WIDGET (window), NULL, banner_text);
+ g_free (banner_text);
+ modest_zoomable_set_zoom (MODEST_ZOOMABLE (priv->msg_view), zoom_level);
- for (node = group; node != NULL; node = g_slist_next (node)) {
- if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (node->data))) {
- if (node->next != NULL) {
- gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (node->next->data), TRUE);
- return TRUE;
- } else {
- hildon_banner_show_information (NULL, NULL, dgettext("hildon-common-strings", "ckct_ib_min_zoom_level_reached"));
- return FALSE;
- }
- break;
- }
- }
- return FALSE;
+ return TRUE;
+
}
static gboolean
if (event->type == GDK_KEY_PRESS) {
GtkScrollType scroll_type;
-
+
switch (event->keyval) {
case GDK_Up:
case GDK_KP_Up:
scroll_type = GTK_SCROLL_END; break;
default: scroll_type = GTK_SCROLL_NONE;
}
-
+
/* g_signal_emit_by_name (G_OBJECT (priv->main_scroll), "scroll-child", */
/* scroll_type, FALSE, &return_value); */
return FALSE;
info = (MsgReaderInfo *) user_data;
if (canceled || err) {
+ update_window_title (MODEST_MSG_VIEW_WINDOW (parent_window));
goto frees;
}
mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT(parent_window),
modest_ui_actions_disk_operations_error_handler,
NULL, NULL);
-
+
modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
modest_mail_operation_get_msg (mail_op, info->header, TRUE, view_msg_cb, info->row_reference);
g_object_unref (mail_op);
g_return_val_if_fail (row_reference != NULL, FALSE);
+ /* We set the header from model while we're loading */
+ tny_header_view_set_header (TNY_HEADER_VIEW (priv->msg_view), header);
+ gtk_window_set_title (GTK_WINDOW (window), _CS("ckdg_pb_updating"));
+
mgr = modest_runtime_get_window_mgr ();
/* Msg download completed */
if (!(tny_header_get_flags (header) & TNY_HEADER_FLAG_CACHED)) {
+
/* Ask the user if he wants to download the message if
we're not online */
if (!tny_device_is_online (modest_runtime_get_device())) {
response = modest_platform_run_confirmation_dialog (GTK_WINDOW (window),
_("mcen_nc_get_msg"));
- if (response == GTK_RESPONSE_CANCEL)
+ if (response == GTK_RESPONSE_CANCEL) {
+ update_window_title (window);
return FALSE;
-
+ }
+
folder = tny_header_get_folder (header);
info = g_slice_new (MsgReaderInfo);
info->header = g_object_ref (header);
return TRUE;
}
}
-
+
folder = tny_header_get_folder (header);
account = tny_folder_get_account (folder);
info = g_slice_new (MsgReaderInfo);
info->header = g_object_ref (header);
info->row_reference = gtk_tree_row_reference_copy (row_reference);
-
+
message_reader_performer (FALSE, NULL, (GtkWindow *) window, account, info);
g_object_unref (account);
g_object_unref (folder);
row_reference = (GtkTreeRowReference *) user_data;
if (canceled) {
gtk_tree_row_reference_free (row_reference);
+ self = (ModestMsgViewWindow *) modest_mail_operation_get_source (mail_op);
+ if (self) {
+ /* Restore window title */
+ update_window_title (self);
+ g_object_unref (self);
+ }
return;
}
-
+
/* If there was any error */
if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg)) {
- gtk_tree_row_reference_free (row_reference);
+ gtk_tree_row_reference_free (row_reference);
+ self = (ModestMsgViewWindow *) modest_mail_operation_get_source (mail_op);
+ if (self) {
+ /* Restore window title */
+ update_window_title (self);
+ g_object_unref (self);
+ }
return;
}
parent_priv = MODEST_WINDOW_GET_PRIVATE(self);
mgr = modest_runtime_get_window_mgr ();
- static_button_size = modest_window_mgr_get_fullscreen_mode (mgr)?118:108;
+ static_button_size = modest_window_mgr_get_fullscreen_mode (mgr)?120:120;
if (parent_priv->toolbar) {
/* left size buttons */
gtk_tool_item_set_expand (GTK_TOOL_ITEM (widget), FALSE);
gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), FALSE);
gtk_widget_set_size_request (GTK_WIDGET (widget), static_button_size, -1);
-
- 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->cancel_toolitem), FALSE);
- gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->cancel_toolitem), FALSE);
+
gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->next_toolitem), TRUE);
gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->next_toolitem), TRUE);
gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->prev_toolitem), TRUE);
gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->prev_toolitem), TRUE);
}
-
-}
-
-static gboolean
-modest_msg_view_window_window_state_event (GtkWidget *widget, GdkEventWindowState *event, gpointer userdata)
-{
- if (event->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) {
- ModestWindowPrivate *parent_priv;
- ModestWindowMgr *mgr;
- gboolean is_fullscreen;
- GtkAction *fs_toggle_action;
- gboolean active;
-
- mgr = modest_runtime_get_window_mgr ();
- is_fullscreen = (modest_window_mgr_get_fullscreen_mode (mgr))?1:0;
-
- parent_priv = MODEST_WINDOW_GET_PRIVATE (widget);
-
- fs_toggle_action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ViewToggleFullscreenMenu");
- active = (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (fs_toggle_action)))?1:0;
- if (is_fullscreen != active) {
- gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (fs_toggle_action), is_fullscreen);
- }
- toolbar_resize (MODEST_MSG_VIEW_WINDOW (widget));
- }
-
- return FALSE;
-
}
static void
{
ModestMsgViewWindowPrivate *priv = NULL;
ModestWindowPrivate *parent_priv;
- GtkWidget *reply_button = NULL, *menu = NULL;
- GtkWidget *placeholder = NULL;
- gint insert_index;
- const gchar *action_name;
- GtkAction *action;
-
+
parent_priv = MODEST_WINDOW_GET_PRIVATE(self);
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(self);
if (!parent_priv->toolbar) {
parent_priv->toolbar = gtk_ui_manager_get_widget (parent_priv->ui_manager,
"/ToolBar");
+ gtk_toolbar_set_icon_size (GTK_TOOLBAR (parent_priv->toolbar), HILDON_ICON_SIZE_FINGER);
gtk_widget_set_no_show_all (parent_priv->toolbar, TRUE);
- priv->progress_toolitem = GTK_WIDGET (gtk_tool_item_new ());
- 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");
toolbar_resize (MODEST_MSG_VIEW_WINDOW (self));
- /* Add ProgressBar (Transfer toolbar) */
- priv->progress_bar = modest_progress_bar_new ();
- gtk_widget_set_no_show_all (priv->progress_bar, TRUE);
- placeholder = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ProgressbarView");
- insert_index = gtk_toolbar_get_item_index(GTK_TOOLBAR (parent_priv->toolbar), GTK_TOOL_ITEM(placeholder));
- gtk_container_add (GTK_CONTAINER (priv->progress_toolitem), priv->progress_bar);
- gtk_toolbar_insert(GTK_TOOLBAR(parent_priv->toolbar), GTK_TOOL_ITEM (priv->progress_toolitem), insert_index);
-
- /* Connect cancel 'clicked' signal to abort progress mode */
- g_signal_connect(priv->cancel_toolitem, "clicked",
- G_CALLBACK(cancel_progressbar),
- self);
-
- /* Add it to the observers list */
- priv->progress_widgets = g_slist_prepend(priv->progress_widgets, priv->progress_bar);
-
/* Add to window */
hildon_window_add_toolbar (HILDON_WINDOW (self),
GTK_TOOLBAR (parent_priv->toolbar));
- /* Set reply button tap and hold menu */
- reply_button = gtk_ui_manager_get_widget (parent_priv->ui_manager,
- "/ToolBar/ToolbarMessageReply");
- menu = gtk_ui_manager_get_widget (parent_priv->ui_manager,
- "/ToolbarReplyCSM");
- gtk_widget_tap_and_hold_setup (GTK_WIDGET (reply_button), menu, NULL, 0);
}
if (show_toolbar) {
gtk_widget_show (GTK_WIDGET (parent_priv->toolbar));
if (modest_msg_view_window_transfer_mode_enabled (MODEST_MSG_VIEW_WINDOW (self)))
- set_toolbar_mode (MODEST_MSG_VIEW_WINDOW (self), TOOLBAR_MODE_TRANSFER);
+ set_progress_hint (MODEST_MSG_VIEW_WINDOW (self), TRUE);
else
- set_toolbar_mode (MODEST_MSG_VIEW_WINDOW (self), TOOLBAR_MODE_NORMAL);
+ set_progress_hint (MODEST_MSG_VIEW_WINDOW (self), FALSE);
} else {
gtk_widget_set_no_show_all (parent_priv->toolbar, TRUE);
gtk_widget_hide (GTK_WIDGET (parent_priv->toolbar));
}
-
- /* Update also the actions (to update the toggles in the
- menus), we have to do it manually because some other window
- of the same time could have changed it (remember that the
- toolbar fullscreen mode is shared by all the windows of the
- same type */
- if (modest_window_mgr_get_fullscreen_mode (modest_runtime_get_window_mgr ()))
- action_name = "/MenuBar/ViewMenu/ViewShowToolbarMenu/ViewShowToolbarFullScreenMenu";
- else
- action_name = "/MenuBar/ViewMenu/ViewShowToolbarMenu/ViewShowToolbarNormalScreenMenu";
-
- action = gtk_ui_manager_get_action (parent_priv->ui_manager, action_name);
- modest_utils_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action),
- show_toolbar);
}
static void
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;
+ return priv->progress_hint;
}
-static void
-cancel_progressbar (GtkToolButton *toolbutton,
- ModestMsgViewWindow *self)
-{
- GSList *tmp;
- ModestMsgViewWindowPrivate *priv;
-
- priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(self);
-
- /* Get operation observers and cancel its current operation */
- tmp = priv->progress_widgets;
- while (tmp) {
- modest_progress_object_cancel_current_operation (MODEST_PROGRESS_OBJECT(tmp->data));
- tmp=g_slist_next(tmp);
- }
-}
static gboolean
observers_empty (ModestMsgViewWindow *self)
{
parent_acc = modest_tny_account_get_parent_modest_account_name_for_server_account (account);
/* Close this window if I'm showing a message of the removed account */
- if (strcmp (parent_acc, our_acc) == 0)
+ if (our_acc && parent_acc && strcmp (parent_acc, our_acc) == 0)
modest_ui_actions_on_close_window (NULL, MODEST_WINDOW (user_data));
}
}
tmp = priv->progress_widgets;
source = modest_mail_operation_get_source(mail_op);
if (G_OBJECT (self) == source) {
- if (op_type == MODEST_MAIL_OPERATION_TYPE_RECEIVE ) {
+ if (op_type == MODEST_MAIL_OPERATION_TYPE_RECEIVE) {
set_toolbar_transfer_mode(self);
while (tmp) {
modest_progress_object_add_operation (
op_type = modest_mail_operation_get_type_operation (mail_op);
tmp = priv->progress_widgets;
- if (op_type == MODEST_MAIL_OPERATION_TYPE_RECEIVE ) {
+ if (op_type == MODEST_MAIL_OPERATION_TYPE_RECEIVE) {
while (tmp) {
modest_progress_object_remove_operation (MODEST_PROGRESS_OBJECT (tmp->data),
mail_op);
/* If no more operations are being observed, NORMAL mode is enabled again */
if (observers_empty (self)) {
- set_toolbar_mode (self, TOOLBAR_MODE_NORMAL);
+ set_progress_hint (self, FALSE);
}
-
- /* Update dimming rules. We have to do this right here
- and not in view_msg_cb because at that point the
- transfer mode is still enabled so the dimming rule
- won't let the user delete the message that has been
- readed for example */
- modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (self));
- modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (self));
}
+
+ /* Update dimming rules. We have to do this right here
+ and not in view_msg_cb because at that point the
+ transfer mode is still enabled so the dimming rule
+ won't let the user delete the message that has been
+ readed for example */
+ check_dimming_rules_after_change (self);
+
}
static void
g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), NULL);
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (win);
- selected_attachments = modest_msg_view_get_selected_attachments (MODEST_MSG_VIEW (priv->msg_view));
+ /* In Hildon 2.2 as there's no selection we assume we have all attachments selected */
+ selected_attachments = modest_msg_view_get_attachments (MODEST_MSG_VIEW (priv->msg_view));
return selected_attachments;
}
typedef struct {
- gchar *filepath;
- GtkWidget *banner;
- guint banner_idle_id;
+ ModestMsgViewWindow *self;
+ gchar *file_path;
} DecodeAsyncHelper;
-static gboolean
-decode_async_banner_idle (gpointer user_data)
-{
- DecodeAsyncHelper *helper = (DecodeAsyncHelper *) user_data;
-
- helper->banner_idle_id = 0;
- helper->banner = hildon_banner_show_animation (NULL, NULL, _("mail_me_opening"));
- g_object_ref (helper->banner);
-
- return FALSE;
-}
-
static void
on_decode_to_stream_async_handler (TnyMimePart *mime_part,
gboolean cancelled,
{
DecodeAsyncHelper *helper = (DecodeAsyncHelper *) user_data;
- if (helper->banner_idle_id > 0) {
- g_source_remove (helper->banner_idle_id);
- helper->banner_idle_id = 0;
- }
- if (helper->banner) {
- gtk_widget_destroy (helper->banner);
- }
+ /* It could happen that the window was closed */
+ if (GTK_WIDGET_VISIBLE (helper->self))
+ set_progress_hint (helper->self, FALSE);
+
if (cancelled || err) {
- modest_platform_information_banner (NULL, NULL,
- _("mail_ib_file_operation_failed"));
+ if (err) {
+ gchar *msg = g_strdup_printf (_KR("cerm_device_memory_full"), "");
+ modest_platform_information_banner (NULL, NULL, msg);
+ g_free (msg);
+ }
goto free;
}
/* make the file read-only */
- g_chmod(helper->filepath, 0444);
-
+ g_chmod(helper->file_path, 0444);
+
/* Activate the file */
- modest_platform_activate_file (helper->filepath, tny_mime_part_get_content_type (mime_part));
+ modest_platform_activate_file (helper->file_path, tny_mime_part_get_content_type (mime_part));
free:
/* Frees */
- g_free (helper->filepath);
- g_object_unref (helper->banner);
+ g_object_unref (helper->self);
+ g_free (helper->file_path);
g_slice_free (DecodeAsyncHelper, helper);
}
attachments = modest_msg_view_get_attachments (MODEST_MSG_VIEW (priv->msg_view));
attachment_index = modest_list_index (attachments, (GObject *) mime_part);
g_object_unref (attachments);
-
+
if (msg_uid && attachment_index >= 0) {
attachment_uid = g_strdup_printf ("%s/%d", msg_uid, attachment_index);
}
mime_part = (TnyMimePart *) tny_iterator_get_current (iter);
g_object_unref (iter);
}
- g_object_unref (selected_attachments);
+ if (selected_attachments)
+ g_object_unref (selected_attachments);
if (error)
- return;
+ goto frees;
} else {
g_object_ref (mime_part);
}
- if (tny_mime_part_is_purged (mime_part)) {
- g_object_unref (mime_part);
- return;
- }
+ if (tny_mime_part_is_purged (mime_part))
+ goto frees;
- if (!modest_tny_mime_part_is_msg (mime_part)) {
+ if (!modest_tny_mime_part_is_msg (mime_part) && tny_mime_part_get_filename (mime_part)) {
gchar *filepath = NULL;
const gchar *att_filename = tny_mime_part_get_filename (mime_part);
gboolean show_error_banner = FALSE;
TnyFsStream *temp_stream = NULL;
temp_stream = modest_utils_create_temp_stream (att_filename, attachment_uid,
&filepath);
-
+
if (temp_stream != NULL) {
- DecodeAsyncHelper *helper = g_slice_new (DecodeAsyncHelper);
- helper->filepath = g_strdup (filepath);
- helper->banner = NULL;
- helper->banner_idle_id = g_timeout_add (1000, decode_async_banner_idle, helper);
- tny_mime_part_decode_to_stream_async (mime_part, TNY_STREAM (temp_stream),
- on_decode_to_stream_async_handler,
- NULL,
+ DecodeAsyncHelper *helper;
+
+ /* Activate progress hint */
+ set_progress_hint (window, TRUE);
+
+ helper = g_slice_new0 (DecodeAsyncHelper);
+ helper->self = g_object_ref (window);
+ helper->file_path = g_strdup (filepath);
+
+ tny_mime_part_decode_to_stream_async (mime_part, TNY_STREAM (temp_stream),
+ on_decode_to_stream_async_handler,
+ NULL,
helper);
g_object_unref (temp_stream);
/* NOTE: files in the temporary area will be automatically
g_free (filepath);
if (show_error_banner)
modest_platform_information_banner (NULL, NULL, _("mail_ib_file_operation_failed"));
+ } else if (!modest_tny_mime_part_is_msg (mime_part)) {
+ ModestWindowMgr *mgr;
+ mgr = modest_runtime_get_window_mgr ();
+ ModestWindow *msg_win = NULL;
+ TnyMsg *current_msg;
+
+ gchar *account = g_strdup (modest_window_get_active_account (MODEST_WINDOW (window)));
+ const gchar *mailbox = modest_window_get_active_mailbox (MODEST_WINDOW (window));
+ if (!account)
+ account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr ());
+
+ current_msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (window));
+ msg_win = modest_msg_view_window_new_with_other_body (TNY_MSG (current_msg), TNY_MIME_PART (mime_part),
+ account, mailbox, attachment_uid);
+ g_object_unref (current_msg);
+
+ modest_window_set_zoom (MODEST_WINDOW (msg_win),
+ modest_window_get_zoom (MODEST_WINDOW (window)));
+ if (modest_window_mgr_register_window (mgr, msg_win, MODEST_WINDOW (window)))
+ gtk_widget_show_all (GTK_WIDGET (msg_win));
+ else
+ gtk_widget_destroy (GTK_WIDGET (msg_win));
+
} else {
/* message attachment */
TnyHeader *header = NULL;
ModestWindowMgr *mgr;
ModestWindow *msg_win = NULL;
gboolean found;
-
+
header = tny_msg_get_header (TNY_MSG (mime_part));
- mgr = modest_runtime_get_window_mgr ();
+ mgr = modest_runtime_get_window_mgr ();
found = modest_window_mgr_find_registered_header (mgr, header, &msg_win);
if (found) {
/* if it's found, but there is no msg_win, it's probably in the process of being created;
* thus, we don't do anything */
g_warning ("window for is already being created");
- } else {
+ } else {
/* it's not found, so create a new window for it */
modest_window_mgr_register_header (mgr, header, attachment_uid); /* register the uid before building the window */
gchar *account = g_strdup (modest_window_get_active_account (MODEST_WINDOW (window)));
+ const gchar *mailbox = modest_window_get_active_mailbox (MODEST_WINDOW (window));
if (!account)
account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr ());
- msg_win = modest_msg_view_window_new_for_attachment (TNY_MSG (mime_part), account, attachment_uid);
- modest_window_set_zoom (MODEST_WINDOW (msg_win),
+ msg_win = modest_msg_view_window_new_for_attachment (TNY_MSG (mime_part), account,
+ mailbox, attachment_uid);
+ modest_window_set_zoom (MODEST_WINDOW (msg_win),
modest_window_get_zoom (MODEST_WINDOW (window)));
- modest_window_mgr_register_window (mgr, msg_win, MODEST_WINDOW (window));
- gtk_widget_show_all (GTK_WIDGET (msg_win));
+ if (modest_window_mgr_register_window (mgr, msg_win, MODEST_WINDOW (window)))
+ gtk_widget_show_all (GTK_WIDGET (msg_win));
+ else
+ gtk_widget_destroy (GTK_WIDGET (msg_win));
}
}
- g_object_unref (mime_part);
+
+ frees:
+ if (attachment_uid)
+ g_free (attachment_uid);
+ if (mime_part)
+ g_object_unref (mime_part);
}
typedef struct
typedef struct
{
GList *pairs;
- GtkWidget *banner;
GnomeVFSResult result;
} SaveMimePartInfo;
static gpointer save_mime_part_to_file (SaveMimePartInfo *info);
static void save_mime_parts_to_file_with_checks (SaveMimePartInfo *info);
-static void
+static void
save_mime_part_info_free (SaveMimePartInfo *info, gboolean with_struct)
{
-
GList *node;
+
for (node = info->pairs; node != NULL; node = g_list_next (node)) {
SaveMimePartPair *pair = (SaveMimePartPair *) node->data;
g_free (pair->filename);
g_list_free (info->pairs);
info->pairs = NULL;
if (with_struct) {
- gtk_widget_destroy (info->banner);
g_slice_free (SaveMimePartInfo, info);
}
}
if (info->result == GNOME_VFS_OK) {
hildon_banner_show_information (NULL, NULL, _CS("sfil_ib_saved"));
} else if (info->result == GNOME_VFS_ERROR_NO_SPACE) {
- hildon_banner_show_information (NULL, NULL, dgettext("ke-recv",
- "cerm_device_memory_full"));
+ gchar *msg = g_strdup_printf (_KR("cerm_device_memory_full"), "");
+ modest_platform_information_banner (NULL, NULL, msg);
+ g_free (msg);
} else {
hildon_banner_show_information (NULL, NULL, _("mail_ib_file_operation_failed"));
}
stream = tny_vfs_stream_new (handle);
if (tny_mime_part_decode_to_stream (pair->part, stream, &error) < 0) {
g_warning ("modest: could not save attachment %s: %d (%s)\n", pair->filename, error?error->code:-1, error?error->message:"Unknown error");
-
- info->result = GNOME_VFS_ERROR_IO;
+
+ if ((error->domain == TNY_ERROR_DOMAIN) &&
+ (error->code == TNY_IO_ERROR_WRITE) &&
+ (errno == ENOSPC)) {
+ info->result = GNOME_VFS_ERROR_NO_SPACE;
+ } else {
+ info->result = GNOME_VFS_ERROR_IO;
+ }
}
g_object_unref (G_OBJECT (stream));
g_object_unref (pair->part);
}
if (replaced_files) {
GtkWidget *confirm_overwrite_dialog;
- const gchar *message = (replaced_files == 1) ?
- _FM("docm_nc_replace_file") : _FM("docm_nc_replace_multiple");
- confirm_overwrite_dialog = hildon_note_new_confirmation (NULL, message);
- if (gtk_dialog_run (GTK_DIALOG (confirm_overwrite_dialog)) != GTK_RESPONSE_OK) {
- is_ok = FALSE;
+
+ if (replaced_files == 1) {
+ SaveMimePartPair *pair = files->data;
+ const gchar *basename = strrchr (pair->filename, G_DIR_SEPARATOR) + 1;
+
+ gchar *message = g_strdup_printf ("%s\n%s",
+ _FM("docm_nc_replace_file"),
+ (basename) ? basename : "");
+ confirm_overwrite_dialog = hildon_note_new_confirmation (NULL, message);
+ g_free (message);
+ } else {
+ confirm_overwrite_dialog = hildon_note_new_confirmation (NULL,
+ _FM("docm_nc_replace_multiple"));
}
+ if (gtk_dialog_run (GTK_DIALOG (confirm_overwrite_dialog)) != GTK_RESPONSE_OK)
+ is_ok = FALSE;
+
gtk_widget_destroy (confirm_overwrite_dialog);
}
if (!is_ok) {
save_mime_part_info_free (info, TRUE);
} else {
- GtkWidget *banner = hildon_banner_show_animation (NULL, NULL,
- _CS("sfil_ib_saving"));
- info->banner = banner;
g_thread_create ((GThreadFunc)save_mime_part_to_file, info, FALSE, NULL);
}
TnyList *mime_parts;
gchar *chooser_uri;
GList *files_to_save = NULL;
+ gchar *current_folder;
mime_parts = TNY_LIST (user_data);
goto end;
chooser_uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog));
+ current_folder = gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (dialog));
+ if (current_folder && current_folder != '\0') {
+ GError *err = NULL;
+ modest_conf_set_string (modest_runtime_get_conf (), MODEST_CONF_LATEST_SAVE_ATTACHMENT_PATH,
+ current_folder,&err);
+ if (err != NULL) {
+ g_debug ("Error storing latest used folder: %s", err->message);
+ g_error_free (err);
+ }
+ }
+ g_free (current_folder);
if (!modest_utils_folder_writable (chooser_uri)) {
hildon_banner_show_information
- (NULL, NULL, dgettext("hildon-fm", "sfil_ib_readonly_location"));
+ (NULL, NULL, _FM("sfil_ib_readonly_location"));
} else {
TnyIterator *iter;
!tny_mime_part_is_purged (mime_part) &&
(tny_mime_part_get_filename (mime_part) != NULL)) {
SaveMimePartPair *pair;
-
+
pair = g_slice_new0 (SaveMimePartPair);
if (tny_list_get_length (mime_parts) > 1) {
}
void
-modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, TnyList *mime_parts)
+modest_msg_view_window_save_attachments (ModestMsgViewWindow *window,
+ TnyList *mime_parts)
{
ModestMsgViewWindowPrivate *priv;
GtkWidget *save_dialog = NULL;
- gchar *folder = NULL;
+ gchar *conf_folder = NULL;
gchar *filename = NULL;
gchar *save_multiple_str = NULL;
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
if (mime_parts == NULL) {
- mime_parts = modest_msg_view_get_selected_attachments (MODEST_MSG_VIEW (priv->msg_view));
- if (mime_parts == NULL || tny_list_get_length (mime_parts) == 0)
+ /* In Hildon 2.2 save and delete operate over all the attachments as there's no
+ * selection available */
+ mime_parts = modest_msg_view_get_attachments (MODEST_MSG_VIEW (priv->msg_view));
+ if (mime_parts && !modest_maemo_utils_select_attachments (GTK_WINDOW (window), mime_parts, FALSE)) {
+ g_object_unref (mime_parts);
+ return;
+ }
+ if (mime_parts == NULL || tny_list_get_length (mime_parts) == 0) {
+ if (mime_parts) {
+ g_object_unref (mime_parts);
+ mime_parts = NULL;
+ }
return;
+ }
} else {
g_object_ref (mime_parts);
}
save_multiple_str = g_strdup_printf (_FM("sfil_va_number_of_objects_attachments"),
tny_list_get_length (mime_parts));
}
-
+
save_dialog = hildon_file_chooser_dialog_new (GTK_WINDOW (window),
GTK_FILE_CHOOSER_ACTION_SAVE);
/* set folder */
- folder = g_build_filename (g_get_home_dir (), DEFAULT_FOLDER, NULL);
- gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (save_dialog), folder);
- g_free (folder);
+ conf_folder = modest_conf_get_string (modest_runtime_get_conf (), MODEST_CONF_LATEST_SAVE_ATTACHMENT_PATH, NULL);
+ if (conf_folder && conf_folder[0] != '\0') {
+ gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (save_dialog), conf_folder);
+ } else {
+ gchar *docs_folder;
+ /* Set the default folder to images folder */
+ docs_folder = g_build_filename (g_getenv (MYDOCS_ENV), DOCS_FOLDER, NULL);
+ gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (save_dialog), docs_folder);
+ g_free (docs_folder);
+ }
+ g_free (conf_folder);
/* set filename */
if (filename) {
}
priv->remove_attachment_banner = g_object_ref (
- hildon_banner_show_animation (NULL, NULL, _("mcen_ib_removing_attachment")));
+ hildon_banner_show_animation (NULL, NULL, _("mcen_me_inbox_remove_attachments")));
gdk_threads_leave ();
modest_msg_view_window_remove_attachments (ModestMsgViewWindow *window, gboolean get_all)
{
ModestMsgViewWindowPrivate *priv;
- TnyList *mime_parts = NULL;
+ TnyList *mime_parts = NULL, *tmp;
gchar *confirmation_message;
gint response;
gint n_attachments;
g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window));
priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
- 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 */
- iter = tny_list_create_iterator (mime_parts);
+ /* In hildon 2.2 we ignore the get_all flag as we always get all attachments. This is
+ * because we don't have selection
+ */
+ mime_parts = modest_msg_view_get_attachments (MODEST_MSG_VIEW (priv->msg_view));
+
+ /* Remove already purged messages from mime parts list. We use
+ a copy of the list to remove items in the original one */
+ tmp = tny_list_copy (mime_parts);
+ iter = tny_list_create_iterator (tmp);
while (!tny_iterator_is_done (iter)) {
TnyMimePart *part = TNY_MIME_PART (tny_iterator_get_current (iter));
- tny_iterator_next (iter);
- if (tny_mime_part_is_purged (part)) {
+ if (tny_mime_part_is_purged (part))
tny_list_remove (mime_parts, (GObject *) part);
- }
+
g_object_unref (part);
+ tny_iterator_next (iter);
}
+ g_object_unref (tmp);
g_object_unref (iter);
- if (tny_list_get_length (mime_parts) == 0) {
+ if (!modest_maemo_utils_select_attachments (GTK_WINDOW (window), mime_parts, TRUE) ||
+ tny_list_get_length (mime_parts) == 0) {
g_object_unref (mime_parts);
return;
}
}
priv->purge_timeout = g_timeout_add (2000, show_remove_attachment_information, window);
-
+
iter = tny_list_create_iterator (mime_parts);
while (!tny_iterator_is_done (iter)) {
TnyMimePart *part;
g_object_unref (priv->remove_attachment_banner);
priv->remove_attachment_banner = NULL;
}
-
-
}
static void
update_window_title (ModestMsgViewWindow *window)
{
- ModestMsgViewWindowPrivate *priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+ ModestMsgViewWindowPrivate *priv;
TnyMsg *msg = NULL;
TnyHeader *header = NULL;
gchar *subject = NULL;
-
+
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+
+ /* Note that if the window is closed while we're retrieving
+ the message, this widget could de deleted */
+ if (!priv->msg_view)
+ return;
+
msg = tny_msg_view_get_msg (TNY_MSG_VIEW (priv->msg_view));
if (msg != NULL) {
}
-static void on_move_focus (GtkWidget *widget,
- GtkDirectionType direction,
- gpointer userdata)
+static void
+on_move_focus (GtkWidget *widget,
+ GtkDirectionType direction,
+ gpointer userdata)
{
g_signal_stop_emission_by_name (G_OBJECT (widget), "move-focus");
}
gchar *cache_id;
TnyStream *output_stream;
GtkWidget *msg_view;
+ GtkWidget *window;
} FetchImageData;
gboolean
{
FetchImageData *fidata = (FetchImageData *) userdata;
- g_message ("REFRESH VIEW");
+
+ gdk_threads_enter ();
if (GTK_WIDGET_DRAWABLE (fidata->msg_view)) {
- g_message ("QUEUING DRAW");
+ ModestMsgViewWindowPrivate *priv;
+
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (fidata->window);
+ priv->fetching_images--;
gtk_widget_queue_draw (fidata->msg_view);
+ update_progress_hint (MODEST_MSG_VIEW_WINDOW (fidata->window));
}
+ gdk_threads_leave ();
+
g_object_unref (fidata->msg_view);
+ g_object_unref (fidata->window);
g_slice_free (FetchImageData, fidata);
return FALSE;
}
TnyStream *cache_stream;
cache = modest_runtime_get_images_cache ();
- cache_stream = tny_stream_cache_get_stream (cache, fidata->cache_id, (TnyStreamCacheOpenStreamFetcher) fetch_image_open_stream, (gpointer) fidata->uri);
+ cache_stream =
+ tny_stream_cache_get_stream (cache,
+ fidata->cache_id,
+ (TnyStreamCacheOpenStreamFetcher) fetch_image_open_stream,
+ (gpointer) fidata->uri);
g_free (fidata->cache_id);
g_free (fidata->uri);
if (cache_stream != NULL) {
- tny_stream_write_to_stream (cache_stream, fidata->output_stream);
+ char buffer[4096];
+
+ while (G_LIKELY (!tny_stream_is_eos (cache_stream))) {
+ gssize nb_read;
+
+ nb_read = tny_stream_read (cache_stream, buffer, sizeof (buffer));
+ if (G_UNLIKELY (nb_read < 0)) {
+ break;
+ } else if (G_LIKELY (nb_read > 0)) {
+ gssize nb_written = 0;
+
+ while (G_UNLIKELY (nb_written < nb_read)) {
+ gssize len;
+
+ len = tny_stream_write (fidata->output_stream, buffer + nb_written,
+ nb_read - nb_written);
+ if (G_UNLIKELY (len < 0))
+ break;
+ nb_written += len;
+ }
+ }
+ }
tny_stream_close (cache_stream);
g_object_unref (cache_stream);
}
tny_stream_close (fidata->output_stream);
g_object_unref (fidata->output_stream);
-
- gdk_threads_enter ();
g_idle_add (on_fetch_image_idle_refresh_view, fidata);
- gdk_threads_leave ();
return NULL;
}
fidata = g_slice_new0 (FetchImageData);
fidata->msg_view = g_object_ref (msgview);
+ fidata->window = g_object_ref (window);
fidata->uri = g_strdup (uri);
fidata->cache_id = modest_images_cache_get_id (current_account, uri);
fidata->output_stream = g_object_ref (stream);
+ priv->fetching_images++;
if (g_thread_create (on_fetch_image_thread, fidata, FALSE, NULL) == NULL) {
g_object_unref (fidata->output_stream);
g_free (fidata->cache_id);
g_object_unref (fidata->msg_view);
g_slice_free (FetchImageData, fidata);
tny_stream_close (stream);
+ priv->fetching_images--;
+ update_progress_hint (window);
return FALSE;
}
+ update_progress_hint (window);
+
+ return TRUE;
+}
+
+static void
+setup_menu (ModestMsgViewWindow *self)
+{
+ g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW(self));
+
+ /* Settings menu buttons */
+ modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_inbox_replytoall"), NULL,
+ APP_MENU_CALLBACK (modest_ui_actions_on_reply_all),
+ MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_reply_msg));
+ modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_inbox_forward"), "<Control>d",
+ APP_MENU_CALLBACK (modest_ui_actions_on_forward),
+ MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_reply_msg));
+
+ modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_inbox_mark_as_read"), NULL,
+ APP_MENU_CALLBACK (modest_ui_actions_on_mark_as_read),
+ MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_mark_as_read_msg_in_view));
+ modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_inbox_mark_as_unread"), NULL,
+ APP_MENU_CALLBACK (modest_ui_actions_on_mark_as_unread),
+ MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_mark_as_unread_msg_in_view));
+
+ modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_viewer_save_attachments"), NULL,
+ APP_MENU_CALLBACK (modest_ui_actions_save_attachments),
+ MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_save_attachments));
+ modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_inbox_remove_attachments"), NULL,
+ APP_MENU_CALLBACK (modest_ui_actions_remove_attachments),
+ MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_remove_attachments));
+
+ modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_new_message"), "<Control>n",
+ APP_MENU_CALLBACK (modest_ui_actions_on_new_msg),
+ MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_new_msg));
+ modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_viewer_addtocontacts"), NULL,
+ APP_MENU_CALLBACK (modest_ui_actions_add_to_contacts),
+ MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_add_to_contacts));
+
+ modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mail_bd_external_images"), NULL,
+ APP_MENU_CALLBACK (modest_ui_actions_on_fetch_images),
+ MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_fetch_images));
+ modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_ti_message_properties"), NULL,
+ APP_MENU_CALLBACK (modest_ui_actions_on_details),
+ MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_details));
+}
+
+void
+modest_msg_view_window_add_to_contacts (ModestMsgViewWindow *self)
+{
+ ModestMsgViewWindowPrivate *priv;
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
+ GSList *recipients = NULL;
+ TnyMsg *msg = NULL;
+ gboolean contacts_to_add = FALSE;
+
+ msg = tny_msg_view_get_msg (TNY_MSG_VIEW (priv->msg_view));
+ if (msg == NULL) {
+ TnyHeader *header;
+
+ header = modest_msg_view_window_get_header (self);
+ if (header == NULL)
+ return;
+ recipients = modest_tny_msg_header_get_all_recipients_list (header);
+ g_object_unref (header);
+ } else {
+ recipients = modest_tny_msg_get_all_recipients_list (msg);
+ g_object_unref (msg);
+ }
+
+ if (recipients != NULL) {
+ GtkWidget *picker_dialog;
+ GtkWidget *selector;
+ GSList *node;
+ gchar *selected = NULL;
+
+ selector = hildon_touch_selector_new_text ();
+ g_object_ref (selector);
+
+ for (node = recipients; node != NULL; node = g_slist_next (node)) {
+ if (!modest_address_book_has_address ((const gchar *) node->data)) {
+ hildon_touch_selector_append_text (HILDON_TOUCH_SELECTOR (selector),
+ (const gchar *) node->data);
+ contacts_to_add = TRUE;
+ }
+ }
+
+ if (contacts_to_add) {
+ gint picker_result;
+
+ picker_dialog = hildon_picker_dialog_new (GTK_WINDOW (self));
+ gtk_window_set_title (GTK_WINDOW (picker_dialog), _("mcen_me_viewer_addtocontacts"));
+
+ hildon_picker_dialog_set_selector (HILDON_PICKER_DIALOG (picker_dialog),
+ HILDON_TOUCH_SELECTOR (selector));
+
+ picker_result = gtk_dialog_run (GTK_DIALOG (picker_dialog));
+
+ if (picker_result == GTK_RESPONSE_OK) {
+ selected = hildon_touch_selector_get_current_text (HILDON_TOUCH_SELECTOR (selector));
+ }
+ gtk_widget_destroy (picker_dialog);
+
+ if (selected)
+ modest_address_book_add_address (selected);
+ g_free (selected);
+
+ } else {
+
+ g_object_unref (selector);
+
+ }
+ }
+
+ if (recipients) {g_slist_foreach (recipients, (GFunc) g_free, NULL); g_slist_free (recipients);}
+}
+
+static gboolean
+_modest_msg_view_window_map_event (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer userdata)
+{
+ ModestMsgViewWindow *self = (ModestMsgViewWindow *) userdata;
+
+ update_progress_hint (self);
+
+ return FALSE;
+}
+
+void
+modest_msg_view_window_fetch_images (ModestMsgViewWindow *self)
+{
+ ModestMsgViewWindowPrivate *priv;
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
+
+ modest_msg_view_request_fetch_images (MODEST_MSG_VIEW (priv->msg_view));
+}
+
+gboolean
+modest_msg_view_window_has_blocked_external_images (ModestMsgViewWindow *self)
+{
+ ModestMsgViewWindowPrivate *priv;
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
+
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self), FALSE);
+
+ return modest_msg_view_has_blocked_external_images (MODEST_MSG_VIEW (priv->msg_view));
+}
+
+void
+modest_msg_view_window_reload (ModestMsgViewWindow *self)
+{
+ ModestMsgViewWindowPrivate *priv;
+ TnyHeader *header;
+
+ g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self));
+
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self);
+ header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (self));
+
+ if (!message_reader (self, priv, header, priv->row_reference)) {
+ g_warning ("Shouldn't happen, trying to reload a message failed");
+ }
- return TRUE;;
+ g_object_unref (header);
}