X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fmaemo%2Fmodest-msg-view-window.c;h=bc0dd5b8dc30e65486a7dd5cc518c5131335f991;hb=652527fd671cc695045b75893d7010c246585ef2;hp=212fd2d052419882dd3e71db95bc4374030441eb;hpb=1e269a39bd6e1c33e72e98b72f59f810d8f64e8a;p=modest diff --git a/src/maemo/modest-msg-view-window.c b/src/maemo/modest-msg-view-window.c index 212fd2d..bc0dd5b 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,8 @@ #include #include #include -#include -#include -#include +#include +#include "modest-hildon-includes.h" #include #include @@ -57,21 +57,28 @@ 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); /* list my signals */ @@ -94,17 +101,9 @@ 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; @@ -112,6 +111,8 @@ struct _ModestMsgViewWindowPrivate { GtkTreeModel *header_model; GtkTreeIter iter; + + guint clipboard_change_handler; }; #define MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ @@ -160,6 +161,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,11 +174,9 @@ 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 @@ -219,59 +221,12 @@ 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) { GtkWidget *main_vbox; ModestMsgViewWindowPrivate *priv; ModestWindowPrivate *parent_priv; - GtkAccelGroup *accel_group; priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj); parent_priv = MODEST_WINDOW_GET_PRIVATE(obj); @@ -280,19 +235,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)); - - accel_group = gtk_ui_manager_get_accel_group (parent_priv->ui_manager); - gtk_window_add_accel_group (GTK_WINDOW (obj), accel_group); - 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); @@ -306,6 +253,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); } @@ -321,6 +270,10 @@ 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; + } G_OBJECT_CLASS(parent_class)->finalize (obj); } @@ -366,6 +319,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); @@ -382,14 +336,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), @@ -422,9 +372,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", @@ -442,12 +389,20 @@ 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); + 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); @@ -470,6 +425,26 @@ modest_msg_view_window_get_message (ModestMsgViewWindow *self) return modest_msg_view_get_message (msg_view); } +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) @@ -549,8 +524,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; @@ -564,19 +539,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; @@ -590,13 +566,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 @@ -880,7 +860,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); @@ -918,16 +898,111 @@ 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) { ModestWindowPrivate *parent_priv; - GtkAction *fs_toggle_action; - gboolean active; + GtkWidget *reply_button = NULL, *menu = NULL; + + parent_priv = MODEST_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); + + /* 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)); + 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); + }