X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fhildon2%2Fmodest-msg-view-window.c;h=d5926f62e6306707ff77a65b50bea899a28d35c9;hp=20202e5f084f54d3e175d64fab43eb8ad72baf3c;hb=62fb96863939aea81ed8e45e1b2043d892e0978d;hpb=601dda9cd13b952988d28a8f87f63a6a3ed84be8 diff --git a/src/hildon2/modest-msg-view-window.c b/src/hildon2/modest-msg-view-window.c index 20202e5..d5926f6 100644 --- a/src/hildon2/modest-msg-view-window.c +++ b/src/hildon2/modest-msg-view-window.c @@ -33,6 +33,7 @@ #include #include #include +#include #include "modest-marshal.h" #include "modest-platform.h" #include @@ -42,13 +43,15 @@ #include #include "modest-msg-view-window-ui-dimming.h" #include +#include #include #include #include #include #include -#include "modest-progress-bar.h" -#include "hildon/hildon-pannable-area.h" +#include +#include +#include #include "modest-defs.h" #include "modest-hildon-includes.h" #include "modest-ui-dimming-manager.h" @@ -57,12 +60,68 @@ #include #include #include +#include #include #include #include #include +#include +#include -#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; + TnyMimePart *other_body; + + GSList *sighandlers; +}; static void modest_msg_view_window_class_init (ModestMsgViewWindowClass *klass); static void modest_msg_view_window_init (ModestMsgViewWindow *obj); @@ -77,17 +136,15 @@ static void modest_msg_view_window_find_toolbar_search (GtkWidget *widget, 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, @@ -121,9 +178,6 @@ static void modest_msg_view_window_update_model_replaced (ModestHeaderViewObserv 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, @@ -144,8 +198,8 @@ static void view_msg_cb (ModestMailOperation *mail_op, 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); @@ -165,6 +219,19 @@ static gboolean modest_msg_view_window_scroll_child (ModestMsgViewWindow *self, GtkScrollType scroll_type, gboolean horizontal, gpointer userdata); +static gboolean message_reader (ModestMsgViewWindow *window, + ModestMsgViewWindowPrivate *priv, + TnyHeader *header, + const gchar *msg_uid, + TnyFolder *folder, + GtkTreeRowReference *row_reference); + +static void setup_menu (ModestMsgViewWindow *self); +static gboolean _modest_msg_view_window_map_event (GtkWidget *widget, + GdkEvent *event, + gpointer userdata); +static void update_branding (ModestMsgViewWindow *self); + /* list my signals */ enum { @@ -174,72 +241,7 @@ 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"), "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; + { "FindInMessage", MODEST_TOOLBAR_ICON_FIND, N_("qgn_toolb_gene_find"), "F", NULL, G_CALLBACK (modest_msg_view_window_toggle_find_toolbar), FALSE }, }; #define MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ @@ -268,7 +270,7 @@ modest_msg_view_window_get_type (void) (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); @@ -294,32 +296,11 @@ save_state (ModestWindow *self) 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; @@ -350,10 +331,12 @@ static void 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); @@ -361,8 +344,8 @@ modest_msg_view_window_class_init (ModestMsgViewWindowClass *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; @@ -428,19 +411,9 @@ modest_msg_view_window_init (ModestMsgViewWindow *obj) 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); @@ -472,13 +445,14 @@ modest_msg_view_window_init (ModestMsgViewWindow *obj) 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->other_body = NULL; priv->sighandlers = NULL; @@ -495,8 +469,6 @@ modest_msg_view_window_init (ModestMsgViewWindow *obj) 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"); } @@ -509,89 +481,39 @@ set_toolbar_transfer_mode (ModestMsgViewWindow *self) 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; + /* Sets current progress hint */ + priv->progress_hint = enabled; - /* 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); - - 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); } @@ -607,29 +529,14 @@ init_window (ModestMsgViewWindow *obj) 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)); } @@ -637,8 +544,8 @@ static void 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); @@ -682,21 +589,15 @@ modest_msg_view_window_disconnect_signals (ModestWindow *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 @@ -710,16 +611,16 @@ modest_msg_view_window_finalize (GObject *obj) call this function before */ modest_msg_view_window_disconnect_signals (MODEST_WINDOW (obj)); + if (priv->other_body != NULL) { + g_object_unref (priv->other_body); + priv->other_body = NULL; + } + if (priv->header_model != NULL) { g_object_unref (priv->header_model); 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); @@ -829,12 +730,12 @@ select_next_valid_row (GtkTreeModel *model, 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; @@ -845,20 +746,13 @@ modest_msg_view_window_construct (ModestMsgViewWindow *self, 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), @@ -869,15 +763,11 @@ modest_msg_view_window_construct (ModestMsgViewWindow *self, 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); @@ -889,6 +779,8 @@ modest_msg_view_window_construct (ModestMsgViewWindow *self, 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", @@ -902,13 +794,13 @@ modest_msg_view_window_construct (ModestMsgViewWindow *self, 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", @@ -922,9 +814,20 @@ modest_msg_view_window_construct (ModestMsgViewWindow *self, obj); modest_window_set_active_account (MODEST_WINDOW(obj), modest_account_name); + modest_window_set_active_mailbox (MODEST_WINDOW(obj), mailbox); + + /* First add out toolbar ... */ + modest_msg_view_window_show_toolbar (MODEST_WINDOW (obj), TRUE); - 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); + /* ... and later the find toolbar. This way find toolbar will + be shown over the other */ + 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); + 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; /* Init the clipboard actions dim status */ @@ -939,6 +842,7 @@ modest_msg_view_window_construct (ModestMsgViewWindow *self, 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) @@ -947,7 +851,6 @@ modest_msg_view_window_new_with_header_model (TnyMsg *msg, ModestMsgViewWindowPrivate *priv = NULL; TnyFolder *header_folder = NULL; ModestHeaderView *header_view = NULL; - ModestWindow *main_window = NULL; ModestWindowMgr *mgr = NULL; MODEST_DEBUG_BLOCK ( @@ -958,20 +861,171 @@ modest_msg_view_window_new_with_header_model (TnyMsg *msg, 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); + + 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); - 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 (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)); + update_branding (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_uid (const gchar *modest_account_name, + const gchar *mailbox, + const gchar *msg_uid) +{ + ModestMsgViewWindow *window = NULL; + ModestMsgViewWindowPrivate *priv = NULL; + ModestWindowMgr *mgr = NULL; + gboolean is_merge; + TnyAccount *account = 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, mailbox, msg_uid); + + priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window); + + + + is_merge = g_str_has_prefix (msg_uid, "merge:"); + + /* Get the account */ + if (!is_merge) + account = tny_account_store_find_account (TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()), + msg_uid); + + + if (is_merge || account) { + TnyFolder *folder = NULL; + + /* Try to get the message, if it's already downloaded + we don't need to connect */ + if (account) { + folder = tny_store_account_find_folder (TNY_STORE_ACCOUNT (account), msg_uid, NULL); + } else { + ModestTnyAccountStore *account_store; + ModestTnyLocalFoldersAccount *local_folders_account; + + account_store = modest_runtime_get_account_store (); + local_folders_account = MODEST_TNY_LOCAL_FOLDERS_ACCOUNT ( + modest_tny_account_store_get_local_folders_account (account_store)); + folder = modest_tny_local_folders_account_get_merged_outbox (local_folders_account); + g_object_unref (local_folders_account); + } + if (folder) { + TnyDevice *device; + gboolean device_online; + + device = modest_runtime_get_device(); + device_online = tny_device_is_online (device); + if (device_online) { + message_reader (window, priv, NULL, msg_uid, folder, NULL); + } else { + TnyMsg *msg = tny_folder_find_msg (folder, msg_uid, NULL); + if (msg) { + tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg); + update_branding (MODEST_MSG_VIEW_WINDOW (window)); + g_object_unref (msg); + } else { + message_reader (window, priv, NULL, msg_uid, folder, NULL); + } + } + g_object_unref (folder); + } + + } + + /* 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 @@ -979,20 +1033,21 @@ modest_msg_view_window_new_with_header_model (TnyMsg *msg, 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; @@ -1000,31 +1055,40 @@ modest_msg_view_window_new_with_header_model (TnyMsg *msg, /* 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); + update_branding (MODEST_MSG_VIEW_WINDOW (window)); + + 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, NULL, NULL, row_reference); + g_object_unref (header); + } + gtk_tree_path_free (path); /* Check dimming rules */ modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window)); @@ -1035,8 +1099,9 @@ modest_msg_view_window_new_with_header_model (TnyMsg *msg, } ModestWindow * -modest_msg_view_window_new_for_search_result (TnyMsg *msg, +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; @@ -1046,7 +1111,7 @@ modest_msg_view_window_new_for_search_result (TnyMsg *msg, 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); @@ -1055,6 +1120,7 @@ modest_msg_view_window_new_for_search_result (TnyMsg *msg, priv->is_search_result = TRUE; tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg); + update_branding (MODEST_MSG_VIEW_WINDOW (window)); update_window_title (window); /* gtk_widget_show_all (GTK_WIDGET (window));*/ @@ -1068,10 +1134,23 @@ modest_msg_view_window_new_for_search_result (TnyMsg *msg, return MODEST_WINDOW(window); } +gboolean +modest_msg_view_window_is_other_body (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); + + return (priv->other_body != NULL); +} + 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; @@ -1082,10 +1161,16 @@ modest_msg_view_window_new_for_attachment (TnyMsg *msg, 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->other_body = g_object_ref (other_body); + 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)); + update_branding (MODEST_MSG_VIEW_WINDOW (obj)); /* gtk_widget_show_all (GTK_WIDGET (obj)); */ @@ -1097,6 +1182,15 @@ modest_msg_view_window_new_for_attachment (TnyMsg *msg, 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, @@ -1176,7 +1270,7 @@ modest_msg_view_window_on_row_inserted (GtkTreeModel *model, /* Setup row_reference for the actual msg. */ priv->row_reference = gtk_tree_row_reference_new (priv->header_model, tree_path); if (priv->row_reference == NULL) { - g_warning("No reference for msg header item."); + g_warning("%s: No reference for msg header item.", __FUNCTION__); return; } @@ -1344,7 +1438,7 @@ modest_msg_view_window_toolbar_on_transfer_mode (ModestMsgViewWindow *self) 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* @@ -1435,10 +1529,9 @@ modest_msg_view_window_toggle_find_toolbar (GtkToggleAction *toggle, /* 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 @@ -1451,7 +1544,7 @@ modest_msg_view_window_find_toolbar_close (GtkWidget *widget, 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)); @@ -1473,7 +1566,7 @@ modest_msg_view_window_find_toolbar_search (GtkWidget *widget, 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; } @@ -1484,20 +1577,20 @@ modest_msg_view_window_find_toolbar_search (GtkWidget *widget, 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); } } @@ -1512,8 +1605,6 @@ modest_msg_view_window_set_zoom (ModestWindow *window, { 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)); @@ -1521,10 +1612,6 @@ modest_msg_view_window_set_zoom (ModestWindow *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 @@ -1541,56 +1628,84 @@ modest_msg_view_window_get_zoom (ModestWindow *window) 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 @@ -1624,7 +1739,7 @@ modest_msg_view_window_key_event (GtkWidget *window, if (event->type == GDK_KEY_PRESS) { GtkScrollType scroll_type; - + switch (event->keyval) { case GDK_Up: case GDK_KP_Up: @@ -1646,7 +1761,7 @@ modest_msg_view_window_key_event (GtkWidget *window, 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; @@ -1782,6 +1897,8 @@ modest_msg_view_window_first_message_selected (ModestMsgViewWindow *window) typedef struct { TnyHeader *header; + gchar *msg_uid; + TnyFolder *folder; GtkTreeRowReference *row_reference; } MsgReaderInfo; @@ -1797,6 +1914,7 @@ message_reader_performer (gboolean canceled, info = (MsgReaderInfo *) user_data; if (canceled || err) { + update_window_title (MODEST_MSG_VIEW_WINDOW (parent_window)); goto frees; } @@ -1807,9 +1925,12 @@ message_reader_performer (gboolean canceled, 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); + if (info->header) + modest_mail_operation_get_msg (mail_op, info->header, TRUE, view_msg_cb, info->row_reference); + else + modest_mail_operation_find_msg (mail_op, info->folder, info->msg_uid, TRUE, view_msg_cb, NULL); g_object_unref (mail_op); /* Update dimming rules */ @@ -1818,7 +1939,11 @@ message_reader_performer (gboolean canceled, frees: /* Frees. The row_reference will be freed by the view_msg_cb callback */ - g_object_unref (info->header); + g_free (info->msg_uid); + if (info->folder) + g_object_unref (info->folder); + if (info->header) + g_object_unref (info->header); g_slice_free (MsgReaderInfo, info); } @@ -1839,18 +1964,22 @@ static gboolean message_reader (ModestMsgViewWindow *window, ModestMsgViewWindowPrivate *priv, TnyHeader *header, + const gchar *msg_uid, + TnyFolder *folder, GtkTreeRowReference *row_reference) { ModestWindowMgr *mgr; TnyAccount *account; - TnyFolder *folder; MsgReaderInfo *info; - 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)) { + if (!header || !(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())) { @@ -1858,13 +1987,31 @@ message_reader (ModestMsgViewWindow *window, 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); + } + + if (header) { + folder = tny_header_get_folder (header); + } else { + g_object_ref (folder); + } info = g_slice_new (MsgReaderInfo); - info->header = g_object_ref (header); - info->row_reference = gtk_tree_row_reference_copy (row_reference); + info->msg_uid = g_strdup (msg_uid); + if (header) + info->header = g_object_ref (header); + else + info->header = NULL; + if (folder) + info->folder = g_object_ref (folder); + else + info->folder = NULL; + if (row_reference) { + info->row_reference = gtk_tree_row_reference_copy (row_reference); + } else { + info->row_reference = NULL; + } /* Offer the connection dialog if necessary */ modest_platform_connect_if_remote_and_perform ((GtkWindow *) window, @@ -1876,13 +2023,28 @@ message_reader (ModestMsgViewWindow *window, return TRUE; } } - - folder = tny_header_get_folder (header); + + if (header) { + folder = tny_header_get_folder (header); + } else { + g_object_ref (folder); + } 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); - + info->msg_uid = g_strdup (msg_uid); + if (info->folder) + info->folder = g_object_ref (folder); + else + info->folder = NULL; + if (info->header) + info->header = g_object_ref (header); + else + info->header = NULL; + if (row_reference) + info->row_reference = gtk_tree_row_reference_copy (row_reference); + else + info->row_reference = NULL; + message_reader_performer (FALSE, NULL, (GtkWindow *) window, account, info); g_object_unref (account); g_object_unref (folder); @@ -1935,7 +2097,7 @@ modest_msg_view_window_select_next_message (ModestMsgViewWindow *window) &header, -1); /* Read the message & show it */ - if (!message_reader (window, priv, header, row_reference)) { + if (!message_reader (window, priv, header, NULL, NULL, row_reference)) { retval = FALSE; } gtk_tree_row_reference_free (row_reference); @@ -1976,7 +2138,7 @@ modest_msg_view_window_select_previous_message (ModestMsgViewWindow *window) GtkTreeRowReference *row_reference; row_reference = gtk_tree_row_reference_new (priv->header_model, path); /* Read the message & show it */ - retval = message_reader (window, priv, header, row_reference); + retval = message_reader (window, priv, header, NULL, NULL, row_reference); gtk_tree_row_reference_free (row_reference); } else { finished = FALSE; @@ -2006,13 +2168,27 @@ view_msg_cb (ModestMailOperation *mail_op, row_reference = (GtkTreeRowReference *) user_data; if (canceled) { - gtk_tree_row_reference_free (row_reference); + if (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; } - + /* If there was any error */ if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg)) { - gtk_tree_row_reference_free (row_reference); + if (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; } @@ -2041,6 +2217,7 @@ view_msg_cb (ModestMailOperation *mail_op, tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg); modest_msg_view_window_update_priority (self); update_window_title (MODEST_MSG_VIEW_WINDOW (self)); + update_branding (MODEST_MSG_VIEW_WINDOW (self)); modest_msg_view_grab_focus (MODEST_MSG_VIEW (priv->msg_view)); } @@ -2056,7 +2233,8 @@ view_msg_cb (ModestMailOperation *mail_op, /* Frees */ g_object_unref (self); - gtk_tree_row_reference_free (row_reference); + if (row_reference) + gtk_tree_row_reference_free (row_reference); } TnyFolderType @@ -2140,7 +2318,7 @@ toolbar_resize (ModestMsgViewWindow *self) 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 */ @@ -2160,44 +2338,12 @@ toolbar_resize (ModestMsgViewWindow *self) 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 @@ -2206,12 +2352,7 @@ modest_msg_view_window_show_toolbar (ModestWindow *self, { 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); @@ -2221,40 +2362,17 @@ modest_msg_view_window_show_toolbar (ModestWindow *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) { @@ -2264,28 +2382,14 @@ modest_msg_view_window_show_toolbar (ModestWindow *self, 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 @@ -2307,25 +2411,9 @@ modest_msg_view_window_transfer_mode_enabled (ModestMsgViewWindow *self) 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) { @@ -2363,7 +2451,7 @@ on_account_removed (TnyAccountStore *account_store, 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)); } } @@ -2384,7 +2472,7 @@ on_mail_operation_started (ModestMailOperation *mail_op, 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 ( @@ -2411,7 +2499,7 @@ on_mail_operation_finished (ModestMailOperation *mail_op, 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); @@ -2420,17 +2508,17 @@ on_mail_operation_finished (ModestMailOperation *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 @@ -2477,29 +2565,17 @@ modest_msg_view_window_get_attachments (ModestMsgViewWindow *win) 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, @@ -2509,29 +2585,29 @@ on_decode_to_stream_async_handler (TnyMimePart *mime_part, { 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); } @@ -2553,7 +2629,7 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, 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); } @@ -2572,35 +2648,39 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, 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 @@ -2621,35 +2701,80 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, 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; + ModestWindow *msg_win = NULL; + TnyMsg *current_msg; + gboolean found; + TnyHeader *header; + + current_msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (window)); + mgr = modest_runtime_get_window_mgr (); + header = tny_msg_get_header (TNY_MSG (current_msg)); + found = modest_window_mgr_find_registered_message_uid (mgr, + attachment_uid, + &msg_win); + + if (found) { + g_debug ("window for this body is already being created"); + } 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_with_other_body (TNY_MSG (current_msg), TNY_MIME_PART (mime_part), + account, mailbox, attachment_uid); + + 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)); + } + g_object_unref (current_msg); } 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 { + g_debug ("window for is already being created"); + } 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 @@ -2661,20 +2786,19 @@ typedef struct typedef struct { GList *pairs; - GtkWidget *banner; GnomeVFSResult result; } SaveMimePartInfo; static void save_mime_part_info_free (SaveMimePartInfo *info, gboolean with_struct); static gboolean idle_save_mime_part_show_result (SaveMimePartInfo *info); static gpointer save_mime_part_to_file (SaveMimePartInfo *info); -static void save_mime_parts_to_file_with_checks (SaveMimePartInfo *info); +static void save_mime_parts_to_file_with_checks (GtkWindow *parent, 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); @@ -2684,7 +2808,6 @@ save_mime_part_info_free (SaveMimePartInfo *info, gboolean with_struct) g_list_free (info->pairs); info->pairs = NULL; if (with_struct) { - gtk_widget_destroy (info->banner); g_slice_free (SaveMimePartInfo, info); } } @@ -2703,8 +2826,9 @@ idle_save_mime_part_show_result (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")); } @@ -2727,15 +2851,21 @@ save_mime_part_to_file (SaveMimePartInfo *info) 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); g_slice_free (SaveMimePartPair, pair); info->pairs = g_list_delete_link (info->pairs, info->pairs); } else { - g_warning ("modest: could not create save attachment %s: %s\n", pair->filename, gnome_vfs_result_to_string (info->result)); + g_warning ("Could not create save attachment %s: %s\n", pair->filename, gnome_vfs_result_to_string (info->result)); save_mime_part_info_free (info, FALSE); } @@ -2744,36 +2874,48 @@ save_mime_part_to_file (SaveMimePartInfo *info) } static void -save_mime_parts_to_file_with_checks (SaveMimePartInfo *info) +save_mime_parts_to_file_with_checks (GtkWindow *parent, + SaveMimePartInfo *info) { gboolean is_ok = TRUE; gint replaced_files = 0; const GList *files = info->pairs; - const GList *iter; + const GList *iter, *to_replace = NULL; for (iter = files; (iter != NULL) && (replaced_files < 2); iter = g_list_next(iter)) { SaveMimePartPair *pair = iter->data; if (modest_utils_file_exists (pair->filename)) { replaced_files++; + if (replaced_files == 1) + to_replace = iter; } } 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; + gint response; + + if (replaced_files == 1) { + SaveMimePartPair *pair = to_replace->data; + const gchar *basename = strrchr (pair->filename, G_DIR_SEPARATOR) + 1; + gchar *escaped_basename, *message; + + escaped_basename = g_uri_unescape_string (basename, NULL); + message = g_strdup_printf ("%s\n%s", + _FM("docm_nc_replace_file"), + (escaped_basename) ? escaped_basename : ""); + response = modest_platform_run_confirmation_dialog (parent, message); + g_free (message); + g_free (escaped_basename); + } else { + response = modest_platform_run_confirmation_dialog (parent, + _FM("docm_nc_replace_multiple")); } - gtk_widget_destroy (confirm_overwrite_dialog); + if (response != GTK_RESPONSE_OK) + is_ok = FALSE; } 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); } @@ -2787,6 +2929,7 @@ save_attachments_response (GtkDialog *dialog, TnyList *mime_parts; gchar *chooser_uri; GList *files_to_save = NULL; + gchar *current_folder; mime_parts = TNY_LIST (user_data); @@ -2794,10 +2937,21 @@ save_attachments_response (GtkDialog *dialog, 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; @@ -2809,7 +2963,7 @@ save_attachments_response (GtkDialog *dialog, !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) { @@ -2833,7 +2987,7 @@ save_attachments_response (GtkDialog *dialog, SaveMimePartInfo *info = g_slice_new0 (SaveMimePartInfo); info->pairs = files_to_save; info->result = TRUE; - save_mime_parts_to_file_with_checks (info); + save_mime_parts_to_file_with_checks ((GtkWindow *) dialog, info); } end: @@ -2843,11 +2997,12 @@ save_attachments_response (GtkDialog *dialog, } 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; @@ -2855,9 +3010,20 @@ modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, TnyList *m 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); } @@ -2875,23 +3041,34 @@ modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, TnyList *m filename = g_strdup (tny_mime_part_get_filename (mime_part)); } else { /* TODO: show any error? */ - g_warning ("Tried to save a non-file attachment"); + g_warning ("%s: Tried to save a non-file attachment", __FUNCTION__); g_object_unref (mime_parts); return; } g_object_unref (mime_part); } else { - save_multiple_str = g_strdup_printf (_FM("sfil_va_number_of_objects_attachments"), - tny_list_get_length (mime_parts)); + gint num = tny_list_get_length (mime_parts); + save_multiple_str = g_strdup_printf (dngettext("hildon-fm", + "sfil_va_number_of_objects_attachment", + "sfil_va_number_of_objects_attachments", + num), num); } - + 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) { @@ -2930,7 +3107,7 @@ show_remove_attachment_information (gpointer userdata) } 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 (); @@ -2941,7 +3118,7 @@ void 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; @@ -2951,24 +3128,28 @@ modest_msg_view_window_remove_attachments (ModestMsgViewWindow *window, gboolean 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; } @@ -3009,7 +3190,7 @@ modest_msg_view_window_remove_attachments (ModestMsgViewWindow *window, gboolean } 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; @@ -3026,6 +3207,7 @@ modest_msg_view_window_remove_attachments (ModestMsgViewWindow *window, gboolean tny_msg_rewrite_cache (msg); tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg); g_object_unref (msg); + update_branding (MODEST_MSG_VIEW_WINDOW (window)); g_object_unref (mime_parts); @@ -3039,22 +3221,35 @@ modest_msg_view_window_remove_attachments (ModestMsgViewWindow *window, gboolean 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) { + if (priv->other_body) { + gchar *description; + + description = modest_tny_mime_part_get_header_value (priv->other_body, "Content-Description"); + if (description) { + g_strstrip (description); + subject = description; + } + } else if (msg != NULL) { header = tny_msg_get_header (msg); subject = tny_header_dup_subject (header); g_object_unref (header); @@ -3070,9 +3265,10 @@ update_window_title (ModestMsgViewWindow *window) } -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"); } @@ -3112,6 +3308,7 @@ typedef struct { gchar *cache_id; TnyStream *output_stream; GtkWidget *msg_view; + GtkWidget *window; } FetchImageData; gboolean @@ -3119,12 +3316,20 @@ on_fetch_image_idle_refresh_view (gpointer userdata) { 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; } @@ -3137,12 +3342,37 @@ on_fetch_image_thread (gpointer userdata) 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); } @@ -3150,10 +3380,7 @@ on_fetch_image_thread (gpointer userdata) 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; } @@ -3174,10 +3401,12 @@ on_fetch_image (ModestMsgView *msgview, 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); @@ -3185,8 +3414,204 @@ on_fetch_image (ModestMsgView *msgview, 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"), "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"), "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, NULL, NULL, priv->row_reference)) { + g_warning ("Shouldn't happen, trying to reload a message failed"); + } + + g_object_unref (header); +} + +static void +update_branding (ModestMsgViewWindow *self) +{ + const gchar *account; + const gchar *mailbox; + ModestAccountMgr *mgr; + ModestProtocol *protocol = NULL; + gchar *service_name = NULL; + const GdkPixbuf *service_icon = NULL; + ModestMsgViewWindowPrivate *priv; + + priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self); + + account = modest_window_get_active_account (MODEST_WINDOW (self)); + mailbox = modest_window_get_active_mailbox (MODEST_WINDOW (self)); + + mgr = modest_runtime_get_account_mgr (); + + if (modest_account_mgr_account_is_multimailbox (mgr, account, &protocol)) { + if (MODEST_IS_ACCOUNT_PROTOCOL (protocol)) { + service_name = modest_account_protocol_get_service_name (MODEST_ACCOUNT_PROTOCOL (protocol), + account, mailbox); + service_icon = modest_account_protocol_get_service_icon (MODEST_ACCOUNT_PROTOCOL (protocol), + account, mailbox, MODEST_ICON_SIZE_SMALL); + } + } - return TRUE;; + modest_msg_view_set_branding (MODEST_MSG_VIEW (priv->msg_view), service_name, service_icon); + g_free (service_name); }