+
+const gchar*
+modest_msg_view_window_get_message_uid (ModestMsgViewWindow *self)
+{
+ TnyMsg *msg;
+ TnyHeader *header;
+ const gchar *retval = NULL;
+
+ msg = modest_msg_view_window_get_message (self);
+
+ if (!msg)
+ return NULL;
+
+ header = tny_msg_get_header (msg);
+ if (header) {
+ retval = tny_header_get_uid (header);
+ g_object_unref (header);
+ }
+ return retval;
+}
+
+static void
+modest_msg_view_window_toggle_find_toolbar (GtkToggleAction *toggle,
+ gpointer data)
+{
+ ModestMsgViewWindow *window = MODEST_MSG_VIEW_WINDOW (data);
+ ModestMsgViewWindowPrivate *priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+
+ if (gtk_toggle_action_get_active (toggle)) {
+ gtk_widget_show (priv->find_toolbar);
+ } else {
+ gtk_widget_hide (priv->find_toolbar);
+ }
+
+
+}
+
+static void
+modest_msg_view_window_find_toolbar_close (GtkWidget *widget,
+ ModestMsgViewWindow *obj)
+{
+ GtkToggleAction *toggle;
+ ModestWindowPrivate *parent_priv;
+ 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);
+}
+
+static void
+modest_msg_view_window_find_toolbar_search (GtkWidget *widget,
+ ModestMsgViewWindow *obj)
+{
+ gchar *current_search;
+ ModestMsgViewWindowPrivate *priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (obj);
+
+ g_object_get (G_OBJECT (widget), "prefix", ¤t_search, NULL);
+
+ if ((current_search == NULL) && (strcmp (current_search, "") == 0)) {
+ g_free (current_search);
+ return;
+ }
+
+ if ((priv->last_search == NULL) || (strcmp (priv->last_search, current_search) != 0)) {
+ gboolean result;
+ g_free (priv->last_search);
+ priv->last_search = g_strdup (current_search);
+ result = modest_msg_view_search (MODEST_MSG_VIEW (priv->msg_view),
+ priv->last_search);
+ } else {
+ modest_msg_view_search_next (MODEST_MSG_VIEW (priv->msg_view));
+ }
+
+ g_free (current_search);
+
+}
+
+static void
+modest_msg_view_window_set_zoom (ModestWindow *window,
+ gdouble zoom)
+{
+ ModestMsgViewWindowPrivate *priv;
+
+ g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window));
+
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+ modest_msg_view_set_zoom (MODEST_MSG_VIEW (priv->msg_view), zoom);
+}
+
+static gdouble
+modest_msg_view_window_get_zoom (ModestWindow *window)
+{
+ ModestMsgViewWindowPrivate *priv;
+
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), 1.0);
+
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+ return modest_msg_view_get_zoom (MODEST_MSG_VIEW (priv->msg_view));
+}
+
+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);
+
+ if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (group->data))) {
+ hildon_banner_show_information (NULL, NULL, _("mcen_ib_max_zoom_level"));
+ return FALSE;
+ }
+
+ 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;
+}
+
+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);
+
+ 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, _("mcen_ib_min_zoom_level"));
+ return FALSE;
+ }
+ break;
+ }
+ }
+ return FALSE;
+}
+
+static gboolean
+modest_msg_view_window_key_release_event (GtkWidget *window,
+ GdkEventKey *event,
+ gpointer userdata)
+{
+ if (event->type == GDK_KEY_RELEASE) {
+ switch (event->keyval) {
+ case GDK_Up:
+ modest_msg_view_window_scroll_up (MODEST_WINDOW (window));
+ return TRUE;
+ break;
+ case GDK_Down:
+ modest_msg_view_window_scroll_down (MODEST_WINDOW (window));
+ return TRUE;
+ break;
+ default:
+ return FALSE;
+ break;
+ };
+ } else {
+ return FALSE;
+ }
+}
+
+static void
+modest_msg_view_window_scroll_up (ModestWindow *window)
+{
+ ModestMsgViewWindowPrivate *priv;
+
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+ g_signal_emit_by_name (G_OBJECT (priv->main_scroll), "scroll-child", GTK_SCROLL_STEP_UP, FALSE);
+}
+
+static void
+modest_msg_view_window_scroll_down (ModestWindow *window)
+{
+ ModestMsgViewWindowPrivate *priv;
+
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+ g_signal_emit_by_name (G_OBJECT (priv->main_scroll), "scroll-child", GTK_SCROLL_STEP_DOWN, FALSE);
+}
+
+static gboolean
+modest_msg_view_window_is_last_message (ModestMsgViewWindow *window)
+{
+ GtkTreePath *path;
+ ModestMsgViewWindowPrivate *priv;
+ GtkTreeIter tmp_iter;
+ gboolean has_next = FALSE;
+
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), TRUE);
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+
+ if (priv->header_model) {
+ path = gtk_tree_model_get_path (priv->header_model, &priv->iter);
+ if (!path)
+ return TRUE;
+ while (!has_next) {
+ TnyHeader *header;
+ gtk_tree_path_next (path);
+ if (!gtk_tree_model_get_iter (priv->header_model, &tmp_iter, path))
+ break;
+ gtk_tree_model_get (priv->header_model, &tmp_iter, TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
+ &header, -1);
+ if (!(tny_header_get_flags(header)&TNY_HEADER_FLAG_DELETED)) {
+ has_next = TRUE;
+ break;
+ }
+
+ }
+ gtk_tree_path_free (path);
+ return !has_next;
+ } else {
+ return TRUE;
+ }
+
+}
+
+static gboolean
+modest_msg_view_window_is_first_message (ModestMsgViewWindow *window)
+{
+ GtkTreePath *path;
+ ModestMsgViewWindowPrivate *priv;
+ gboolean result;
+ GtkTreeIter tmp_iter;
+
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), TRUE);
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+
+ if (priv->header_model) {
+ gchar * path_string;
+ path = gtk_tree_model_get_path (priv->header_model, &priv->iter);
+ if (!path)
+ return TRUE;
+
+ path_string = gtk_tree_path_to_string (path);
+ result = (strcmp (path_string, "0")==0);
+ if (result) {
+ g_free (path_string);
+ gtk_tree_path_free (path);
+ return result;
+ }
+
+ while (result) {
+ TnyHeader *header;
+
+ gtk_tree_path_prev (path);
+
+ if (!gtk_tree_model_get_iter (priv->header_model, &tmp_iter, path))
+ break;
+ gtk_tree_model_get (priv->header_model, &tmp_iter, TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
+ &header, -1);
+ if (!(tny_header_get_flags(header)&TNY_HEADER_FLAG_DELETED)) {
+ result = FALSE;
+ break;
+ }
+
+ path_string = gtk_tree_path_to_string (path);
+ if (strcmp(path_string, "0")==0) {
+ g_free (path_string);
+ break;
+ }
+ g_free (path_string);
+ }
+ gtk_tree_path_free (path);
+ return result;
+ } else {
+ return TRUE;
+ }
+
+}
+
+gboolean
+modest_msg_view_window_select_next_message (ModestMsgViewWindow *window)
+{
+ ModestMsgViewWindowPrivate *priv;
+ GtkTreeIter tmp_iter;
+ gboolean has_next = FALSE;
+
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), FALSE);
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+
+ if (priv->header_model) {
+ tmp_iter = priv->iter;
+ while (gtk_tree_model_iter_next (priv->header_model, &tmp_iter)) {
+ TnyHeader *header;
+ TnyFolder *folder;
+ TnyMsg *msg;
+
+ priv->iter = tmp_iter;
+ gtk_tree_model_get (priv->header_model, &(priv->iter), TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
+ &header, -1);
+ if (!header)
+ break;
+ if (tny_header_get_flags (header) & TNY_HEADER_FLAG_DELETED)
+ continue;
+
+ folder = tny_header_get_folder (header);
+ if (!folder)
+ break;
+ msg = tny_folder_get_msg (folder, header, NULL);
+ if (!msg) {
+ g_object_unref (folder);
+ break;
+ }
+ has_next = TRUE;
+ modest_msg_view_set_message (MODEST_MSG_VIEW (priv->msg_view), msg);
+ modest_msg_view_window_update_dimmed (window);
+ modest_msg_view_window_update_priority (window);
+ gtk_widget_grab_focus (priv->msg_view);
+
+ g_object_unref (msg);
+ break;
+ }
+
+ return has_next;
+ } else {
+ return FALSE;
+ }
+}
+
+gboolean
+modest_msg_view_window_select_previous_message (ModestMsgViewWindow *window)
+{
+ ModestMsgViewWindowPrivate *priv;
+
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), FALSE);
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+
+ if (priv->header_model) {
+ GtkTreePath *path;
+ gboolean has_prev = FALSE;
+
+ path = gtk_tree_model_get_path (priv->header_model, &(priv->iter));
+ while (gtk_tree_path_prev (path)) {
+ TnyHeader *header;
+ TnyFolder *folder;
+ TnyMsg *msg;
+
+ gtk_tree_model_get_iter (priv->header_model, &(priv->iter), path);
+ gtk_tree_model_get (priv->header_model, &(priv->iter), TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
+ &header, -1);
+ if (!header)
+ break;
+ if (tny_header_get_flags (header) & TNY_HEADER_FLAG_DELETED)
+ continue;
+ folder = tny_header_get_folder (header);
+ if (!folder)
+ break;
+ msg = tny_folder_get_msg (folder, header, NULL);
+ if (!msg) {
+ g_object_unref (folder);
+ break;
+ }
+ has_prev = TRUE;
+ modest_msg_view_set_message (MODEST_MSG_VIEW (priv->msg_view), msg);
+ modest_msg_view_window_update_dimmed (window);
+ modest_msg_view_window_update_priority (window);
+ gtk_widget_grab_focus (priv->msg_view);
+
+ g_object_unref (msg);
+ break;
+ }
+ gtk_tree_path_free (path);
+ return has_prev;
+ } else {
+ return FALSE;
+ }
+}
+
+static TnyFolderType
+modest_msg_view_window_get_folder_type (ModestMsgViewWindow *window)
+{
+ ModestMsgViewWindowPrivate *priv;
+ TnyMsg *msg;
+ TnyFolderType folder_type;
+
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+
+ folder_type = TNY_FOLDER_TYPE_UNKNOWN;
+
+ msg = modest_msg_view_get_message (MODEST_MSG_VIEW (priv->msg_view));
+ if (msg) {
+ TnyFolder *folder;
+
+ folder = tny_msg_get_folder (msg);
+
+ if (folder) {
+ folder_type = tny_folder_get_folder_type (folder);
+
+ if (folder_type == TNY_FOLDER_TYPE_NORMAL || folder_type == TNY_FOLDER_TYPE_UNKNOWN) {
+ const gchar *fname = tny_folder_get_name (folder);
+ folder_type = modest_tny_folder_guess_folder_type_from_name (fname);
+ }
+
+ g_object_unref (folder);
+ }
+ }
+
+ return folder_type;
+}
+
+static void
+modest_msg_view_window_update_dimmed (ModestMsgViewWindow *window)
+{
+ ModestWindowPrivate *parent_priv;
+ GtkAction *widget;
+ gboolean is_first, is_last;
+ TnyFolderType folder_type;
+ gboolean is_not_sent;
+
+ parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
+
+ is_first = modest_msg_view_window_is_first_message (window);
+ is_last = modest_msg_view_window_is_last_message (window);
+
+ widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageBack");
+ gtk_action_set_sensitive (widget, !is_first);
+ widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ViewPreviousMessageMenu");
+ gtk_action_set_sensitive (widget, !is_first);
+
+ widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageNext");
+ gtk_action_set_sensitive (widget, !is_last);
+ widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ViewNextMessageMenu");
+ gtk_action_set_sensitive (widget, !is_last);
+
+ folder_type = modest_msg_view_window_get_folder_type (MODEST_MSG_VIEW_WINDOW (window));
+ is_not_sent = ((folder_type == TNY_FOLDER_TYPE_DRAFTS)||(folder_type == TNY_FOLDER_TYPE_OUTBOX));
+ widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageReply");
+ gtk_action_set_sensitive (widget, !is_not_sent);
+ widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/MessageMenu/MessageReplyMenu");
+ gtk_action_set_sensitive (widget, !is_not_sent);
+ widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/MessageMenu/MessageReplyAllMenu");
+ gtk_action_set_sensitive (widget, !is_not_sent);
+ widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/MessageMenu/MessageForwardMenu");
+ gtk_action_set_sensitive (widget, !is_not_sent);
+
+}
+
+static void
+modest_msg_view_window_update_priority (ModestMsgViewWindow *window)
+{
+ ModestMsgViewWindowPrivate *priv;
+ TnyHeaderFlags flags = 0;
+
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window);
+
+ if (priv->header_model) {
+ TnyHeader *header;
+
+ gtk_tree_model_get (priv->header_model, &(priv->iter), TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
+ &header, -1);
+ flags = tny_header_get_flags (header);
+ }
+
+ modest_msg_view_set_priority (MODEST_MSG_VIEW(priv->msg_view), flags);
+
+}
+
+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);
+ }
+ }
+
+ return FALSE;
+
+}
+
+void
+modest_msg_view_window_toggle_fullscreen (ModestMsgViewWindow *window)
+{
+ ModestWindowPrivate *parent_priv;
+ GtkAction *fs_toggle_action;
+ parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
+
+ fs_toggle_action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ViewToggleFullscreenMenu");
+ gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (fs_toggle_action),
+ !gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (fs_toggle_action)));
+}
+
+static void
+set_homogeneous (GtkWidget *widget,
+ gpointer data)
+{
+ if (GTK_IS_TOOL_ITEM (widget)) {
+ gtk_tool_item_set_expand (GTK_TOOL_ITEM (widget), TRUE);
+ gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (widget), TRUE);
+ }
+}
+
+static void
+modest_msg_view_window_show_toolbar (ModestWindow *self,
+ gboolean show_toolbar)
+{
+ ModestMsgViewWindowPrivate *priv = NULL;
+ ModestWindowPrivate *parent_priv;
+ GtkWidget *reply_button = NULL, *menu = NULL;
+ GtkWidget *placeholder = NULL;
+ gint insert_index;
+
+ parent_priv = MODEST_WINDOW_GET_PRIVATE(self);
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(self);
+
+ if (!parent_priv->toolbar && show_toolbar) {
+ parent_priv->toolbar = gtk_ui_manager_get_widget (parent_priv->ui_manager,
+ "/ToolBar");
+
+ /* Set homogeneous toolbar */
+ gtk_container_foreach (GTK_CONTAINER (parent_priv->toolbar),
+ set_homogeneous, NULL);
+
+ 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");
+ gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), FALSE);
+ gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->progress_toolitem), FALSE);
+ gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->cancel_toolitem), FALSE);
+ gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->cancel_toolitem), FALSE);
+
+ /* Add ProgressBar (Transfer toolbar) */
+ priv->progress_bar = modest_progress_bar_widget_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);
+ }
+
+ /* TODO: Why is this sometimes NULL? murrayc */
+ if (parent_priv->toolbar) {
+ if (show_toolbar) {
+ gtk_widget_show (GTK_WIDGET (parent_priv->toolbar));
+ set_toolbar_mode (MODEST_MSG_VIEW_WINDOW(self), TOOLBAR_MODE_NORMAL);
+ } else
+ gtk_widget_hide (GTK_WIDGET (parent_priv->toolbar));
+ }
+}
+
+static void
+modest_msg_view_window_clipboard_owner_change (GtkClipboard *clipboard,
+ GdkEvent *event,
+ ModestMsgViewWindow *window)
+{
+ ModestWindowPrivate *parent_priv;
+ GtkAction *action;
+ gboolean is_address;
+ gchar *selection;
+
+ parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
+ selection = gtk_clipboard_wait_for_text (clipboard);
+
+ g_message ("SELECTION %s", selection);
+ is_address = ((selection != NULL) && (modest_text_utils_validate_recipient (selection)));
+ g_free (selection);
+
+ action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ToolsMenu/ToolsAddToContactsMenu");
+ gtk_action_set_sensitive (action, is_address);
+
+}
+
+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)
+{
+ GSList *tmp = NULL;
+ ModestMsgViewWindowPrivate *priv;
+ gboolean is_empty = TRUE;
+ guint pending_ops = 0;
+
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(self);
+ tmp = priv->progress_widgets;
+
+ /* Check all observers */
+ while (tmp && is_empty) {
+ pending_ops = modest_progress_object_num_pending_operations (MODEST_PROGRESS_OBJECT(tmp->data));
+ is_empty = pending_ops == 0;
+
+ tmp = g_slist_next(tmp);
+ }
+
+ return is_empty;
+}
+
+
+static void
+on_queue_changed (ModestMailOperationQueue *queue,
+ ModestMailOperation *mail_op,
+ ModestMailOperationQueueNotification type,
+ ModestMsgViewWindow *self)
+{
+ GSList *tmp;
+ ModestMsgViewWindowPrivate *priv;
+ ModestMailOperationId op_id;
+ ModestToolBarModes mode;
+
+ g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self));
+ priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(self);
+
+ /* If this operations was created by another window, do nothing */
+ if (!modest_mail_operation_is_mine (mail_op, G_OBJECT(self)))
+ return;
+
+ /* Get toolbar mode from operation id*/
+ op_id = modest_mail_operation_get_id (mail_op);
+ switch (op_id) {
+ case MODEST_MAIL_OPERATION_ID_SEND:
+ case MODEST_MAIL_OPERATION_ID_RECEIVE:
+ mode = TOOLBAR_MODE_TRANSFER;
+ break;
+ default:
+ mode = TOOLBAR_MODE_NORMAL;
+
+ }
+
+ /* Add operation observers and change toolbar if neccessary*/
+ tmp = priv->progress_widgets;
+ switch (type) {
+ case MODEST_MAIL_OPERATION_QUEUE_OPERATION_ADDED:
+ if (mode == TOOLBAR_MODE_TRANSFER) {
+ while (tmp) {
+ modest_progress_object_add_operation (MODEST_PROGRESS_OBJECT (tmp->data),
+ mail_op);
+ tmp = g_slist_next (tmp);
+ }
+
+ /* Enable transfer toolbar mode */
+ set_toolbar_mode (MODEST_MSG_VIEW_WINDOW(self), mode);
+ }
+ break;
+ case MODEST_MAIL_OPERATION_QUEUE_OPERATION_REMOVED:
+ if (mode == TOOLBAR_MODE_TRANSFER) {
+ set_toolbar_mode (MODEST_MSG_VIEW_WINDOW(self), TOOLBAR_MODE_NORMAL);
+ while (tmp) {
+ modest_progress_object_remove_operation (MODEST_PROGRESS_OBJECT (tmp->data),
+ mail_op);
+ tmp = g_slist_next (tmp);
+
+ }
+
+ /* If no more operations are being observed, NORMAL mode is enabled again */
+ if (observers_empty (self))
+ set_toolbar_mode (self, TOOLBAR_MODE_NORMAL);
+ }
+ break;
+ }
+}