X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fhildon2%2Fmodest-msg-view-window.c;h=29ba8a37239fd2cd600b5edb2c6473ff10003a31;hp=4f1f13953e39c0c3a00c87813ce0aad4374352b9;hb=e374da56f67092cecb1572dd4bee2ca34e0bc04c;hpb=a7be4d9c27d5a6074f3a1701b12bcc2c45887022 diff --git a/src/hildon2/modest-msg-view-window.c b/src/hildon2/modest-msg-view-window.c index 4f1f139..29ba8a3 100644 --- a/src/hildon2/modest-msg-view-window.c +++ b/src/hildon2/modest-msg-view-window.c @@ -42,12 +42,15 @@ #include #include "modest-msg-view-window-ui-dimming.h" #include +#include #include #include #include #include #include -#include "modest-progress-bar.h" +#include +#include +#include #include "modest-defs.h" #include "modest-hildon-includes.h" #include "modest-ui-dimming-manager.h" @@ -56,12 +59,65 @@ #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; + + /* 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; + + GSList *sighandlers; +}; static void modest_msg_view_window_class_init (ModestMsgViewWindowClass *klass); static void modest_msg_view_window_init (ModestMsgViewWindow *obj); @@ -76,17 +132,18 @@ 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 gboolean modest_msg_view_window_toggle_menu (HildonWindow *window, + guint button, + guint32 time); static void modest_msg_view_window_update_priority (ModestMsgViewWindow *window); static void modest_msg_view_window_show_toolbar (ModestWindow *window, @@ -120,9 +177,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, @@ -143,8 +197,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); @@ -164,6 +218,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, + GtkTreeRowReference *row_reference); + +static void add_to_menu (ModestMsgViewWindow *self, + HildonAppMenu *menu, + gchar *label, + GCallback callback, + ModestDimmingRulesGroup *group, + GCallback dimming_callback); +static void setup_menu (ModestMsgViewWindow *self, + ModestDimmingRulesGroup *group); /* list my signals */ enum { @@ -174,72 +241,8 @@ 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; -}; #define MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ MODEST_TYPE_MSG_VIEW_WINDOW, \ @@ -293,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; @@ -349,19 +331,23 @@ 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); gobject_class->finalize = modest_msg_view_window_finalize; + hildon_window_class->toggle_menu = modest_msg_view_window_toggle_menu; + 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; @@ -427,19 +413,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); @@ -471,10 +447,9 @@ 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->optimized_view = FALSE; - priv->progress_bar_timeout = 0; priv->purge_timeout = 0; priv->remove_attachment_banner = NULL; priv->msg_uid = NULL; @@ -494,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"); } @@ -508,88 +481,28 @@ 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 -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); - - 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)); - } + /* Sets current progress hint */ + priv->progress_hint = enabled; - break; - default: - g_return_if_reached (); + if (GTK_WIDGET_VISIBLE (self)) { + hildon_gtk_window_set_progress_indicator (GTK_WINDOW (self), enabled?1:0); } } @@ -606,7 +519,10 @@ 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); @@ -618,6 +534,7 @@ init_window (ModestMsgViewWindow *obj) 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); @@ -632,8 +549,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); @@ -677,21 +594,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,11 +621,6 @@ modest_msg_view_window_finalize (GObject *obj) 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); @@ -775,6 +681,7 @@ select_next_valid_row (GtkTreeModel *model, 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; } @@ -804,6 +711,7 @@ select_next_valid_row (GtkTreeModel *model, 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 @@ -814,8 +722,6 @@ select_next_valid_row (GtkTreeModel *model, /* Free */ gtk_tree_path_free (path); - if (next) - gtk_tree_path_free (next); return retval; } @@ -840,15 +746,14 @@ 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->menubar = NULL; parent_priv->ui_dimming_manager = modest_ui_dimming_manager_new(); 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, menu_rules_group); /* Add common dimming rules */ modest_dimming_rules_group_add_rules (menu_rules_group, modest_msg_view_menu_dimming_entries, @@ -871,8 +776,6 @@ modest_msg_view_window_construct (ModestMsgViewWindow *self, 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); @@ -884,6 +787,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", @@ -897,10 +802,6 @@ 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); @@ -922,6 +823,8 @@ modest_msg_view_window_construct (ModestMsgViewWindow *self, 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)); @@ -1018,8 +921,102 @@ modest_msg_view_window_new_with_header_model (TnyMsg *msg, 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)); + + /* 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 *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, 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 + unseleted before opening this msg window (for + 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->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 = 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 (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(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(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(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(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)); + } + + 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); + } + gtk_tree_path_free (path); /* Check dimming rules */ modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window)); @@ -1052,7 +1049,7 @@ modest_msg_view_window_new_for_search_result (TnyMsg *msg, 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 */ @@ -1082,7 +1079,7 @@ modest_msg_view_window_new_for_attachment (TnyMsg *msg, 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)); @@ -1339,7 +1336,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* @@ -1425,14 +1422,14 @@ modest_msg_view_window_toggle_find_toolbar (GtkToggleAction *toggle, 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 @@ -1445,7 +1442,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)); @@ -1506,8 +1503,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)); @@ -1515,10 +1510,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 @@ -1535,56 +1526,71 @@ 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; + + 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))) { + if (zoom_level >= 2.0) { hildon_banner_show_information (NULL, NULL, dgettext("hildon-common-strings", "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 */ + 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; - - 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; + + 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)); - 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 { + if (zoom_level <= 0.5) { hildon_banner_show_information (NULL, NULL, dgettext("hildon-common-strings", "ckct_ib_min_zoom_level_reached")); - return FALSE; - } - break; - } + 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; } - return FALSE; + + /* set zoom level */ + modest_zoomable_set_zoom (MODEST_ZOOMABLE (priv->msg_view), zoom_level); + + return TRUE; + } static gboolean @@ -1835,8 +1841,6 @@ message_reader (ModestMsgViewWindow *window, TnyHeader *header, GtkTreeRowReference *row_reference) { - gboolean already_showing = FALSE; - ModestWindow *msg_window = NULL; ModestWindowMgr *mgr; TnyAccount *account; TnyFolder *folder; @@ -1845,15 +1849,6 @@ message_reader (ModestMsgViewWindow *window, g_return_val_if_fail (row_reference != NULL, FALSE); mgr = modest_runtime_get_window_mgr (); - already_showing = modest_window_mgr_find_registered_header (mgr, header, &msg_window); - if (already_showing && (msg_window != MODEST_WINDOW (window))) { - gboolean retval; - if (msg_window) - gtk_window_present (GTK_WINDOW (msg_window)); - g_signal_emit_by_name (G_OBJECT (window), "delete-event", NULL, &retval); - return TRUE; - } - /* Msg download completed */ if (!(tny_header_get_flags (header) & TNY_HEADER_FLAG_CACHED)) { /* Ask the user if he wants to download the message if @@ -2166,10 +2161,6 @@ toolbar_resize (ModestMsgViewWindow *self) 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); @@ -2178,33 +2169,6 @@ toolbar_resize (ModestMsgViewWindow *self) } -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 modest_msg_view_window_show_toolbar (ModestWindow *self, gboolean show_toolbar) @@ -2212,11 +2176,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); @@ -2228,38 +2188,21 @@ modest_msg_view_window_show_toolbar (ModestWindow *self, "/ToolBar"); 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 */ + /* 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 (menu && reply_button) + gtk_widget_tap_and_hold_setup (GTK_WIDGET (reply_button), menu, NULL, 0); } if (show_toolbar) { @@ -2269,28 +2212,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 @@ -2312,25 +2241,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) { @@ -2425,7 +2338,7 @@ 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 @@ -2500,7 +2413,6 @@ decode_async_banner_idle (gpointer 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; } @@ -2520,6 +2432,7 @@ on_decode_to_stream_async_handler (TnyMimePart *mime_part, } if (helper->banner) { gtk_widget_destroy (helper->banner); + helper->banner = NULL; } if (cancelled || err) { modest_platform_information_banner (NULL, NULL, @@ -2529,14 +2442,13 @@ on_decode_to_stream_async_handler (TnyMimePart *mime_part, /* make the file read-only */ g_chmod(helper->filepath, 0444); - + /* Activate the file */ modest_platform_activate_file (helper->filepath, tny_mime_part_get_content_type (mime_part)); free: /* Frees */ g_free (helper->filepath); - g_object_unref (helper->banner); g_slice_free (DecodeAsyncHelper, helper); } @@ -2632,28 +2544,25 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, 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 (msg_win) /* there is already a window for this uid; top it */ - gtk_window_present (GTK_WINDOW(msg_win)); - else - /* 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 { + /* 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 { /* 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))); 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), + 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_mgr_register_window (mgr, msg_win, MODEST_WINDOW (window)); gtk_widget_show_all (GTK_WIDGET (msg_win)); } } @@ -2897,7 +2806,7 @@ modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, TnyList *m GTK_FILE_CHOOSER_ACTION_SAVE); /* set folder */ - folder = g_build_filename (g_get_home_dir (), DEFAULT_FOLDER, NULL); + folder = g_build_filename (g_get_home_dir (), g_getenv (MYDOCS_ENV), DOCS_FOLDER, NULL); gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (save_dialog), folder); g_free (folder); @@ -2938,7 +2847,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 (); @@ -3198,3 +3107,140 @@ on_fetch_image (ModestMsgView *msgview, return TRUE;; } + +static void +add_to_menu (ModestMsgViewWindow *self, + HildonAppMenu *menu, + gchar *label, + GCallback callback, + ModestDimmingRulesGroup *dimming_group, + GCallback dimming_callback) +{ + GtkWidget *button; + + button = gtk_button_new_with_label (label); + g_signal_connect_after (G_OBJECT (button), "clicked", + callback, (gpointer) self); + modest_dimming_rules_group_add_widget_rule (dimming_group, + button, + dimming_callback, + MODEST_WINDOW (self)); + hildon_app_menu_append (menu, GTK_BUTTON (button)); +} + +static void +setup_menu (ModestMsgViewWindow *self, ModestDimmingRulesGroup *group) +{ + ModestMsgViewWindowPrivate *priv = NULL; + GtkWidget *app_menu; + + g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW(self)); + + priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self); + + app_menu = hildon_app_menu_new (); + + /* Settings menu buttons */ + add_to_menu (self, HILDON_APP_MENU (app_menu), _("mcen_me_inbox_replytoall"), + G_CALLBACK (modest_ui_actions_on_reply_all), + group, G_CALLBACK (modest_ui_dimming_rules_on_reply_msg)); + add_to_menu (self, HILDON_APP_MENU (app_menu), _("mcen_me_inbox_forward"), + G_CALLBACK (modest_ui_actions_on_forward), + group, G_CALLBACK (modest_ui_dimming_rules_on_reply_msg)); + + add_to_menu (self, HILDON_APP_MENU (app_menu), _("mcen_me_inbox_mark_as_read"), + G_CALLBACK (modest_ui_actions_on_mark_as_read), + group, G_CALLBACK (modest_ui_dimming_rules_on_mark_as_read_msg_in_view)); + add_to_menu (self, HILDON_APP_MENU (app_menu), _("mcen_me_inbox_mark_as_unread"), + G_CALLBACK (modest_ui_actions_on_mark_as_unread), + group, G_CALLBACK (modest_ui_dimming_rules_on_mark_as_unread_msg_in_view)); + + add_to_menu (self, HILDON_APP_MENU (app_menu), _("mcen_me_viewer_save_attachments"), + G_CALLBACK (modest_ui_actions_save_attachments), + group, G_CALLBACK (modest_ui_dimming_rules_on_save_attachments)); + add_to_menu (self, HILDON_APP_MENU (app_menu), _("mcen_me_inbox_remove_attachments"), + G_CALLBACK (modest_ui_actions_remove_attachments), + group, G_CALLBACK (modest_ui_dimming_rules_on_remove_attachments)); + + add_to_menu (self, HILDON_APP_MENU (app_menu), _("mcen_me_viewer_newemail"), + G_CALLBACK (modest_ui_actions_on_new_msg), + group, G_CALLBACK (modest_ui_dimming_rules_on_new_msg)); + add_to_menu (self, HILDON_APP_MENU (app_menu), _("mcen_me_viewer_addtocontacts"), + G_CALLBACK (modest_ui_actions_add_to_contacts), + group, G_CALLBACK (modest_ui_dimming_rules_on_add_to_contacts)); + + hildon_stackable_window_set_main_menu (HILDON_STACKABLE_WINDOW (self), + HILDON_APP_MENU (app_menu)); +} + +static gboolean +modest_msg_view_window_toggle_menu (HildonWindow *window, + guint button, + guint32 time) +{ + modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (window)); + + return HILDON_WINDOW_CLASS (parent_class)->toggle_menu (window, button, time); +} + + +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) return; + recipients = modest_tny_msg_get_all_recipients_list (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);} + g_object_unref (msg); +}