X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmaemo%2Fmodest-msg-view-window.c;h=c5b46d574aebea9d6730554730723cc0d05610fc;hp=15547aa464380ced66007add6721c98e83a77d77;hb=b267362311d6c82f71987833ad14ddfaedc21390;hpb=b1fa5f4856489fb96916ffd1a66af1957f7198dc diff --git a/src/maemo/modest-msg-view-window.c b/src/maemo/modest-msg-view-window.c index 15547aa..c5b46d5 100644 --- a/src/maemo/modest-msg-view-window.c +++ b/src/maemo/modest-msg-view-window.c @@ -31,6 +31,7 @@ #include #include #include +#include "modest-platform.h" #include #include #include @@ -38,9 +39,10 @@ #include #include #include -#include -#include -#include +#include +#include "modest-progress-bar-widget.h" +#include "modest-defs.h" +#include "modest-hildon-includes.h" #include #include @@ -57,21 +59,39 @@ static void modest_msg_view_window_find_toolbar_search (GtkWidget *widget, static void modest_msg_view_window_set_zoom (ModestWindow *window, gdouble zoom); static gdouble modest_msg_view_window_get_zoom (ModestWindow *window); -static void modest_msg_view_window_zoom_minus (GtkAction *action, ModestWindow *window); -static void modest_msg_view_window_zoom_plus (GtkAction *action, 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_release_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_scroll_up (ModestWindow *window); static void modest_msg_view_window_scroll_down (ModestWindow *window); -static void modest_msg_view_window_toggle_fullscreen (GtkAction *action, ModestWindow *window); static gboolean modest_msg_view_window_is_last_message (ModestMsgViewWindow *window); static gboolean modest_msg_view_window_is_first_message (ModestMsgViewWindow *window); static TnyFolderType modest_msg_view_window_get_folder_type (ModestMsgViewWindow *window); static void modest_msg_view_window_update_dimmed (ModestMsgViewWindow *window); static void modest_msg_view_window_update_priority (ModestMsgViewWindow *window); +static void modest_msg_view_window_show_toolbar (ModestWindow *window, + gboolean show_toolbar); +static void modest_msg_view_window_clipboard_owner_change (GtkClipboard *clipboard, + GdkEvent *event, + ModestMsgViewWindow *window); + +static void cancel_progressbar (GtkToolButton *toolbutton, + ModestMsgViewWindow *self); + +static void on_queue_changed (ModestMailOperationQueue *queue, + ModestMailOperation *mail_op, + ModestMailOperationQueueNotification type, + ModestMsgViewWindow *self); + +static void set_toolbar_mode (ModestMsgViewWindow *self, + ModestToolBarModes mode); /* list my signals */ @@ -94,24 +114,29 @@ static const GtkRadioActionEntry msg_view_zoom_action_entries [] = { { "Zoom200", NULL, N_("mcen_me_viewer_200"), NULL, NULL, 200 } }; -static const GtkActionEntry modest_msg_view_action_entries [] = { - { "ZoomPlus", NULL, N_("Zoom +"), "F7", NULL, G_CALLBACK (modest_msg_view_window_zoom_plus) }, - { "ZoomMinus", NULL, N_("Zoom -"), "F8", NULL, G_CALLBACK (modest_msg_view_window_zoom_minus) }, - { "ToggleFullscreen", NULL, N_("Toggle fullscreen"), "F6", NULL, G_CALLBACK (modest_msg_view_window_toggle_fullscreen) }, -}; - typedef struct _ModestMsgViewWindowPrivate ModestMsgViewWindowPrivate; struct _ModestMsgViewWindowPrivate { - GtkWidget *toolbar; - GtkWidget *menubar; 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; + GtkTreeModel *header_model; GtkTreeIter iter; + + guint clipboard_change_handler; + guint queue_change_handler; }; #define MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ @@ -160,6 +185,9 @@ 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->show_toolbar_func = modest_msg_view_window_show_toolbar; g_type_class_add_private (gobject_class, sizeof(ModestMsgViewWindowPrivate)); } @@ -170,18 +198,17 @@ modest_msg_view_window_init (ModestMsgViewWindow *obj) ModestMsgViewWindowPrivate *priv; priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj); - priv->toolbar = NULL; - priv->menubar = NULL; priv->msg_view = NULL; - priv->header_model = NULL; + priv->clipboard_change_handler = 0; } static void save_settings (ModestMsgViewWindow *self) { modest_widget_memory_save (modest_runtime_get_conf (), - G_OBJECT(self), "modest-msg-view-window"); + G_OBJECT(self), + MODEST_CONF_MSG_VIEW_WINDOW_KEY); } @@ -189,10 +216,106 @@ static void restore_settings (ModestMsgViewWindow *self) { modest_widget_memory_restore (modest_runtime_get_conf (), - G_OBJECT(self), "modest-msg-view-window"); + G_OBJECT(self), + MODEST_CONF_MSG_VIEW_WINDOW_KEY); } +static void +set_toolbar_mode (ModestMsgViewWindow *self, + ModestToolBarModes mode) +{ + ModestWindowPrivate *parent_priv; + ModestMsgViewWindowPrivate *priv; + GtkAction *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); + + switch (mode) { + case TOOLBAR_MODE_NORMAL: + widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageNew"); + gtk_action_set_sensitive (widget, TRUE); + widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageReply"); + gtk_action_set_sensitive (widget, TRUE); + widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarDeleteMessage"); + gtk_action_set_sensitive (widget, TRUE); + widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageMoveTo"); + gtk_action_set_sensitive (widget, TRUE); + widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/FindInMessage"); + gtk_action_set_sensitive (widget, TRUE); + + if (priv->prev_toolitem) + gtk_widget_show (priv->prev_toolitem); + + if (priv->next_toolitem) + gtk_widget_show (priv->next_toolitem); + + if (priv->progress_toolitem) + gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), FALSE); + if (priv->progress_bar) + gtk_widget_hide (priv->progress_bar); + + if (priv->cancel_toolitem) + gtk_widget_hide (priv->cancel_toolitem); + break; + case TOOLBAR_MODE_TRANSFER: + widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageNew"); + gtk_action_set_sensitive (widget, FALSE); + widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageReply"); + gtk_action_set_sensitive (widget, FALSE); + widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarDeleteMessage"); + gtk_action_set_sensitive (widget, FALSE); + widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageMoveTo"); + gtk_action_set_sensitive (widget, FALSE); + widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/FindInMessage"); + gtk_action_set_sensitive (widget, FALSE); + + if (priv->prev_toolitem) + gtk_widget_hide (priv->prev_toolitem); + + if (priv->next_toolitem) + gtk_widget_hide (priv->next_toolitem); + + if (priv->progress_toolitem) + gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), TRUE); + if (priv->progress_bar) + gtk_widget_show (priv->progress_bar); + + if (priv->cancel_toolitem) + gtk_widget_show (priv->cancel_toolitem); + break; + default: + widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageNew"); + gtk_action_set_sensitive (widget, TRUE); + widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageReply"); + gtk_action_set_sensitive (widget, TRUE); + widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarDeleteMessage"); + gtk_action_set_sensitive (widget, TRUE); + widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarMessageMoveTo"); + gtk_action_set_sensitive (widget, TRUE); + widget = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/FindInMessage"); + gtk_action_set_sensitive (widget, TRUE); + + if (priv->cancel_toolitem) + gtk_widget_show (priv->prev_toolitem); + + if (priv->next_toolitem) + gtk_widget_show (priv->next_toolitem); + + if (priv->progress_bar) + gtk_widget_hide (priv->progress_bar); + if (priv->progress_bar) + gtk_widget_hide (priv->progress_bar); + + if (priv->cancel_toolitem) + gtk_widget_hide (priv->cancel_toolitem); + } + +} + static GtkWidget * menubar_to_menu (GtkUIManager *ui_manager) @@ -219,52 +342,6 @@ menubar_to_menu (GtkUIManager *ui_manager) return main_menu; } -static GtkWidget* -get_toolbar (ModestMsgViewWindow *self) -{ - GtkWidget *toolbar, *reply_button, *menu; - ModestWindowPrivate *parent_priv; - GtkWidget *button; - - parent_priv = MODEST_WINDOW_GET_PRIVATE (self); - toolbar = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar"); - 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); - - button = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageNew"); - gtk_tool_item_set_expand (GTK_TOOL_ITEM (button), TRUE); - gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (button), TRUE); - - button = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageReply"); - gtk_tool_item_set_expand (GTK_TOOL_ITEM (button), TRUE); - gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (button), TRUE); - - button = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageMoveTo"); - gtk_tool_item_set_expand (GTK_TOOL_ITEM (button), TRUE); - gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (button), TRUE); - - button = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarDeleteMessage"); - gtk_tool_item_set_expand (GTK_TOOL_ITEM (button), TRUE); - gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (button), TRUE); - - button = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageBack"); - gtk_tool_item_set_expand (GTK_TOOL_ITEM (button), TRUE); - gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (button), TRUE); - - button = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarMessageForward"); - gtk_tool_item_set_expand (GTK_TOOL_ITEM (button), TRUE); - gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (button), TRUE); - - button = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/FindInMessage"); - gtk_tool_item_set_expand (GTK_TOOL_ITEM (button), TRUE); - gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (button), TRUE); - - return toolbar; -} - - static void init_window (ModestMsgViewWindow *obj, TnyMsg *msg) { @@ -279,16 +356,11 @@ init_window (ModestMsgViewWindow *obj, TnyMsg *msg) modest_msg_view_set_shadow_type (MODEST_MSG_VIEW (priv->msg_view), GTK_SHADOW_NONE); main_vbox = gtk_vbox_new (FALSE, 6); - /* Toolbar / Menubar */ - + /* Menubar */ parent_priv->menubar = menubar_to_menu (parent_priv->ui_manager); gtk_widget_show_all (GTK_WIDGET(parent_priv->menubar)); hildon_window_set_menu (HILDON_WINDOW(obj), GTK_MENU(parent_priv->menubar)); - parent_priv->toolbar = get_toolbar (obj); - gtk_widget_show_all (GTK_WIDGET(parent_priv->toolbar)); - hildon_window_add_toolbar (HILDON_WINDOW(obj), GTK_TOOLBAR(parent_priv->toolbar)); - priv->main_scroll = gtk_scrolled_window_new (NULL, NULL); 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); @@ -302,6 +374,8 @@ init_window (ModestMsgViewWindow *obj, TnyMsg *msg) 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->clipboard_change_handler = g_signal_connect (G_OBJECT (gtk_clipboard_get (GDK_SELECTION_PRIMARY)), "owner-change", G_CALLBACK (modest_msg_view_window_clipboard_owner_change), obj); + modest_msg_view_window_clipboard_owner_change (gtk_clipboard_get (GDK_SELECTION_PRIMARY), NULL, obj); gtk_widget_show_all (GTK_WIDGET(main_vbox)); gtk_box_pack_end (GTK_BOX (main_vbox), priv->find_toolbar, FALSE, FALSE, 0); } @@ -317,7 +391,17 @@ modest_msg_view_window_finalize (GObject *obj) g_object_unref (priv->header_model); priv->header_model = NULL; } + if (priv->clipboard_change_handler > 0) { + g_signal_handler_disconnect (gtk_clipboard_get (GDK_SELECTION_PRIMARY), priv->clipboard_change_handler); + priv->clipboard_change_handler = 0; + } + /* disconnet operations queue observer */ + if (priv->queue_change_handler > 0) { + g_signal_handler_disconnect (G_OBJECT (modest_runtime_get_mail_operation_queue ()), priv->queue_change_handler); + priv->queue_change_handler = 0; + } + G_OBJECT_CLASS(parent_class)->finalize (obj); } @@ -362,6 +446,7 @@ modest_msg_view_window_new (TnyMsg *msg, const gchar *account_name) ModestWindowPrivate *parent_priv; GtkActionGroup *action_group; GError *error = NULL; + GdkPixbuf *window_icon = NULL; g_return_val_if_fail (msg, NULL); @@ -378,14 +463,10 @@ modest_msg_view_window_new (TnyMsg *msg, const gchar *account_name) modest_action_entries, G_N_ELEMENTS (modest_action_entries), obj); - gtk_action_group_add_actions (action_group, - modest_msg_view_action_entries, - G_N_ELEMENTS (modest_msg_view_action_entries), - obj); gtk_action_group_add_toggle_actions (action_group, - modest_toggle_action_entries, - G_N_ELEMENTS (modest_toggle_action_entries), - obj); + 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), @@ -418,9 +499,6 @@ modest_msg_view_window_new (TnyMsg *msg, const gchar *account_name) init_window (MODEST_MSG_VIEW_WINDOW(obj), msg); restore_settings (MODEST_MSG_VIEW_WINDOW(obj)); - gtk_window_set_title (GTK_WINDOW(obj), "Modest"); - gtk_window_set_icon_from_file (GTK_WINDOW(obj), MODEST_APP_ICON, NULL); - g_signal_connect (G_OBJECT(obj), "delete-event", G_CALLBACK(on_delete_event), obj); g_signal_connect (G_OBJECT(priv->msg_view), "link_clicked", @@ -438,12 +516,26 @@ modest_msg_view_window_new (TnyMsg *msg, const gchar *account_name) G_CALLBACK (modest_msg_view_window_key_release_event), NULL); + g_signal_connect (G_OBJECT (obj), "window-state-event", + G_CALLBACK (modest_msg_view_window_window_state_event), + NULL); + + /* Mail Operation Queue */ + priv->queue_change_handler = g_signal_connect (G_OBJECT (modest_runtime_get_mail_operation_queue ()), + "queue-changed", + G_CALLBACK (on_queue_changed), + obj); + modest_window_set_active_account (MODEST_WINDOW(obj), account_name); priv->last_search = NULL; modest_msg_view_window_update_dimmed (MODEST_MSG_VIEW_WINDOW (obj)); + /* Set window icon */ + window_icon = modest_platform_get_icon (MODEST_APP_MSG_VIEW_ICON); + gtk_window_set_icon (GTK_WINDOW (obj), window_icon); + gtk_widget_grab_focus (priv->msg_view); return MODEST_WINDOW(obj); @@ -565,8 +657,8 @@ modest_msg_view_window_get_zoom (ModestWindow *window) return modest_msg_view_get_zoom (MODEST_MSG_VIEW (priv->msg_view)); } -static void -modest_msg_view_window_zoom_plus (GtkAction *action, ModestWindow *window) +static gboolean +modest_msg_view_window_zoom_plus (ModestWindow *window) { ModestWindowPrivate *parent_priv; GtkRadioAction *zoom_radio_action; @@ -580,19 +672,20 @@ modest_msg_view_window_zoom_plus (GtkAction *action, ModestWindow *window) if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (group->data))) { hildon_banner_show_information (NULL, NULL, _("mcen_ib_max_zoom_level")); - return; + 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; + return TRUE; } } + return FALSE; } -static void -modest_msg_view_window_zoom_minus (GtkAction *action, ModestWindow *window) +static gboolean +modest_msg_view_window_zoom_minus (ModestWindow *window) { ModestWindowPrivate *parent_priv; GtkRadioAction *zoom_radio_action; @@ -606,13 +699,17 @@ modest_msg_view_window_zoom_minus (GtkAction *action, ModestWindow *window) 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) + if (node->next != NULL) { gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (node->next->data), TRUE); - else + return TRUE; + } else { hildon_banner_show_information (NULL, NULL, _("mcen_ib_min_zoom_level")); + return FALSE; + } break; } } + return FALSE; } static gboolean @@ -896,7 +993,7 @@ modest_msg_view_window_update_dimmed (ModestMsgViewWindow *window) 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/ToolbarMessageForward"); + 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); @@ -934,16 +1031,243 @@ modest_msg_view_window_update_priority (ModestMsgViewWindow *window) } +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 -modest_msg_view_window_toggle_fullscreen (GtkAction *action, ModestWindow *window) +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; - GtkAction *fs_toggle_action; - gboolean active; + 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); - fs_toggle_action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ShowToggleFullscreenMenu"); - active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (fs_toggle_action)); - gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (fs_toggle_action), !active); + 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; + } }