gboolean ok_to_copy = TRUE;
gboolean has_properties = TRUE;
gboolean override_restrictions = FALSE;
+ gboolean can_get_text = FALSE;
+ gboolean ok_to_copy_text = FALSE;
GConfClient *client;
view = EV_VIEW (ev_window->priv->view);
g_object_unref (client);
+ if (has_document && ev_document_can_get_text (document)) {
+ can_get_text = TRUE;
+ ok_to_copy_text = ev_view_get_has_selection (view);
+ }
+
/* File menu */
/* "FileOpen": always sensitive */
set_action_sensitive (ev_window, "FileSaveAs", has_document && ok_to_copy);
/* Edit menu */
sensitive = has_pages && ev_document_can_get_text (document);
- set_action_sensitive (ev_window, "EditCopy", sensitive && ok_to_copy);
- set_action_sensitive (ev_window, "EditSelectAll", sensitive && ok_to_copy);
+ set_action_sensitive (ev_window, "EditCopy", sensitive && ok_to_copy_text);
+ set_action_sensitive (ev_window, "EditSelectAll", sensitive && can_get_text);
set_action_sensitive (ev_window, "EditFind",
has_pages && EV_IS_DOCUMENT_FIND (document));
set_action_sensitive (ev_window, "Slash",
set_action_sensitive (ev_window, PAGE_SELECTOR_ACTION, has_pages);
set_action_sensitive (ev_window, ZOOM_CONTROL_ACTION, has_pages);
- if (has_pages && ev_view_get_sizing_mode (view) == EV_SIZING_FREE) {
+ if (has_pages &&
+ ev_view_get_sizing_mode (view) != EV_SIZING_FIT_WIDTH &&
+ ev_view_get_sizing_mode (view) != EV_SIZING_BEST_FIT) {
GtkAction *action;
float zoom;
float real_zoom;
}
}
+static void
+update_sidebar_visibility (EvWindow *window)
+{
+ char *uri = window->priv->uri;
+ GValue sidebar_visibility = { 0, };
+
+ if (uri && ev_metadata_manager_get (uri, "sidebar_visibility", &sidebar_visibility)) {
+ set_widget_visibility (window->priv->sidebar,
+ g_value_get_boolean (&sidebar_visibility));
+ }
+}
+
static void
setup_document_from_metadata (EvWindow *window)
{
}
}
+static void
+setup_sidebar_from_metadata (EvWindow *window, EvDocument *document)
+{
+ char *uri = window->priv->uri;
+ GtkWidget *sidebar = window->priv->sidebar;
+ GtkWidget *links = window->priv->sidebar_links;
+ GtkWidget *thumbs = window->priv->sidebar_thumbs;
+ GValue sidebar_size = { 0, };
+ GValue sidebar_page = { 0, };
+
+ if (ev_metadata_manager_get (uri, "sidebar_size", &sidebar_size)) {
+ gtk_paned_set_position (GTK_PANED (window->priv->hpaned),
+ g_value_get_int (&sidebar_size));
+ }
+
+ if (ev_metadata_manager_get (uri, "sidebar_page", &sidebar_page)) {
+ const char *page_id = g_value_get_string (&sidebar_page);
+
+ if (strcmp (page_id, "links") == 0) {
+ ev_sidebar_set_page (EV_SIDEBAR (sidebar), links);
+ } else if (strcmp (page_id, "thumbnails")) {
+ ev_sidebar_set_page (EV_SIDEBAR (sidebar), thumbs);
+ }
+ } else {
+ if (ev_sidebar_page_support_document (EV_SIDEBAR_PAGE (links), document)) {
+ ev_sidebar_set_page (EV_SIDEBAR (sidebar), links);
+ } else if (ev_sidebar_page_support_document (EV_SIDEBAR_PAGE (thumbs), document)) {
+ ev_sidebar_set_page (EV_SIDEBAR (sidebar), thumbs);
+ }
+ }
+
+ update_sidebar_visibility (window);
+}
+
static void
ev_window_setup_document (EvWindow *ev_window)
{
ev_view_set_document (view, document);
}
- ev_window_title_set_document (ev_window->priv->title, document, ev_window->priv->uri);
+ ev_window_title_set_uri (ev_window->priv->title, ev_window->priv->uri);
+ ev_window_title_set_document (ev_window->priv->title, document);
action = gtk_action_group_get_action (ev_window->priv->action_group, PAGE_SELECTOR_ACTION);
ev_page_action_set_document (EV_PAGE_ACTION (action), document);
update_action_sensitivity (ev_window);
}
setup_document_from_metadata (ev_window);
+ setup_sidebar_from_metadata (ev_window, document);
}
static void
gtk_widget_set_sensitive (ev_window->priv->password_view, FALSE);
+ ev_window_title_set_uri (ev_window->priv->title, ev_window->priv->password_uri);
ev_window_title_set_type (ev_window->priv->title, EV_WINDOW_TITLE_PASSWORD);
if (ev_window->priv->password_dialog == NULL) {
}
}
-static void
-update_sidebar_visibility (EvWindow *window)
-{
- char *uri = window->priv->uri;
- GValue sidebar_visibility = { 0, };
-
- if (uri && ev_metadata_manager_get (uri, "sidebar_visibility", &sidebar_visibility)) {
- set_widget_visibility (window->priv->sidebar,
- g_value_get_boolean (&sidebar_visibility));
- }
-}
-
static void
setup_view_from_metadata (EvWindow *window)
{
GValue presentation = { 0, };
GValue fullscreen = { 0, };
GValue rotation = { 0, };
- GValue sidebar_size = { 0, };
- GValue sidebar_page = { 0, };
if (window->priv->uri == NULL) {
return;
}
}
}
-
- /* Sidebar */
- if (ev_metadata_manager_get (uri, "sidebar_size", &sidebar_size)) {
- gtk_paned_set_position (GTK_PANED (window->priv->hpaned),
- g_value_get_int (&sidebar_size));
- }
-
- if (ev_metadata_manager_get (uri, "sidebar_page", &sidebar_page)) {
- const char *page_id = g_value_get_string (&sidebar_page);
-
- if (strcmp (page_id, "links") == 0) {
- ev_sidebar_set_page (EV_SIDEBAR (window->priv->sidebar),
- window->priv->sidebar_links);
- } else if (strcmp (page_id, "thumbnails")) {
- ev_sidebar_set_page (EV_SIDEBAR (window->priv->sidebar),
- window->priv->sidebar_thumbs);
- }
- }
-
- update_sidebar_visibility (window);
}
void
GTK_STOCK_CLOSE,
GTK_RESPONSE_CLOSE,
NULL);
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CLOSE);
gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)), 5);
gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 2);
gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
{
g_return_if_fail (EV_IS_WINDOW (ev_window));
- ev_page_cache_prev_page (ev_window->priv->page_cache);
+ ev_view_previous_page (EV_VIEW (ev_window->priv->view));
}
static void
{
g_return_if_fail (EV_IS_WINDOW (ev_window));
- ev_page_cache_next_page (ev_window->priv->page_cache);
+ ev_view_next_page (EV_VIEW (ev_window->priv->view));
}
static void
rotation);
}
+static void
+ev_window_has_selection_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *window)
+{
+ update_action_sensitivity (window);
+}
+
static void
ev_window_dual_mode_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window)
{
ev_document_find_cancel (EV_DOCUMENT_FIND (ev_window->priv->document));
ev_document_doc_mutex_unlock ();
+ update_action_sensitivity (ev_window);
egg_find_bar_set_status_text (EGG_FIND_BAR (ev_window->priv->find_bar),
NULL);
gtk_widget_queue_draw (GTK_WIDGET (ev_window->priv->view));
static void
ev_window_finalize (GObject *object)
{
- gboolean empty = TRUE;
- GList *list, *windows;
+ GList *windows = ev_application_get_windows (EV_APP);
-
- windows = gtk_window_list_toplevels ();
-
- for (list = windows; list; list = list->next) {
- if (EV_IS_WINDOW (list->data)) {
- empty = FALSE;
- break;
- }
- }
-
- if (empty)
+ if (windows == NULL) {
ev_application_shutdown (EV_APP);
+ } else {
+ g_list_free (windows);
+ }
g_list_free (windows);
G_OBJECT_CLASS (ev_window_parent_class)->finalize (object);
{ "FileOpen", GTK_STOCK_OPEN, N_("_Open..."), "<control>O",
N_("Open an existing document"),
G_CALLBACK (ev_window_cmd_file_open) },
- { "FileSaveAs", GTK_STOCK_SAVE_AS, N_("_Save a Copy..."), NULL,
- N_("Save the current document with a new filename"),
+ { "FileSaveAs", GTK_STOCK_SAVE_AS, N_("_Save a Copy..."), NULL, NULL,
G_CALLBACK (ev_window_cmd_save_as) },
{ "FilePrint", GTK_STOCK_PRINT, N_("_Print..."), "<control>P",
N_("Print this document"),
G_CALLBACK (ev_window_cmd_file_print) },
- { "FileProperties", GTK_STOCK_PROPERTIES, N_("P_roperties"), "<alt>Return",
- N_("View the properties of this document"),
+ { "FileProperties", GTK_STOCK_PROPERTIES, N_("P_roperties"), "<alt>Return", NULL,
G_CALLBACK (ev_window_cmd_file_properties) },
- { "FileCloseWindow", GTK_STOCK_CLOSE, NULL, "<control>W",
- N_("Close this window"),
+ { "FileCloseWindow", GTK_STOCK_CLOSE, NULL, "<control>W", NULL,
G_CALLBACK (ev_window_cmd_file_close_window) },
/* Edit menu */
- { "EditCopy", GTK_STOCK_COPY, NULL, "<control>C",
- N_("Copy text from the document"),
+ { "EditCopy", GTK_STOCK_COPY, NULL, "<control>C", NULL,
G_CALLBACK (ev_window_cmd_edit_copy) },
- { "EditSelectAll", NULL, N_("Select _All"), "<control>A",
- N_("Select the entire page"),
+ { "EditSelectAll", NULL, N_("Select _All"), "<control>A", NULL,
G_CALLBACK (ev_window_cmd_edit_select_all) },
{ "EditFind", GTK_STOCK_FIND, NULL, "<control>F",
N_("Find a word or phrase in the document"),
G_CALLBACK (ev_window_cmd_edit_find) },
- { "EditFindNext", NULL, N_("Find Ne_xt"), "<control>G",
- N_("Find next occurrence of the word or phrase"),
+ { "EditFindNext", NULL, N_("Find Ne_xt"), "<control>G", NULL,
G_CALLBACK (ev_window_cmd_edit_find_next) },
- { "EditToolbar", NULL, N_("T_oolbar"), NULL,
- N_("Customize the toolbar"),
+ { "EditToolbar", NULL, N_("T_oolbar"), NULL, NULL,
G_CALLBACK (ev_window_cmd_edit_toolbar) },
- { "EditRotateLeft", NULL, N_("Rotate _Left"), NULL,
- N_("Rotate the document to the left"),
+ { "EditRotateLeft", NULL, N_("Rotate _Left"), NULL, NULL,
G_CALLBACK (ev_window_cmd_edit_rotate_left) },
- { "EditRotateRight", NULL, N_("Rotate _Right"), NULL,
- N_("Rotate the document to the right"),
+ { "EditRotateRight", NULL, N_("Rotate _Right"), NULL, NULL,
G_CALLBACK (ev_window_cmd_edit_rotate_right) },
/* View menu */
G_CALLBACK (ev_window_cmd_go_last_page) },
/* Help menu */
- { "HelpContents", GTK_STOCK_HELP, N_("_Contents"), "F1",
- N_("Display help for the viewer application"),
+ { "HelpContents", GTK_STOCK_HELP, N_("_Contents"), "F1", NULL,
G_CALLBACK (ev_window_cmd_help_contents) },
- { "HelpAbout", GTK_STOCK_ABOUT, N_("_About"), NULL,
- N_("Display credits for the document viewer creators"),
+ { "HelpAbout", GTK_STOCK_ABOUT, N_("_About"), NULL, NULL,
G_CALLBACK (ev_window_cmd_help_about) },
/* Toolbar-only */
/* Accellerators */
{ "Escape", NULL, "", "Escape", "",
G_CALLBACK (ev_window_cmd_escape) },
- { "Slash", GTK_STOCK_FIND, NULL, "slash",
- N_("Find a word or phrase in the document"),
+ { "Slash", GTK_STOCK_FIND, NULL, "slash", NULL,
G_CALLBACK (ev_window_cmd_edit_find) },
- { "PageDown", NULL, "", "Page_Down",
- N_("Scroll one page forward"),
+ { "PageDown", NULL, "", "Page_Down", NULL,
G_CALLBACK (ev_window_cmd_scroll_forward) },
- { "PageUp", NULL, "", "Page_Up",
- N_("Scroll one page backward"),
+ { "PageUp", NULL, "", "Page_Up", NULL,
G_CALLBACK (ev_window_cmd_scroll_backward) },
- { "Space", NULL, "", "space",
- N_("Scroll one page forward"),
+ { "Space", NULL, "", "space", NULL,
G_CALLBACK (ev_window_cmd_scroll_forward) },
- { "ShiftSpace", NULL, "", "<shift>space",
- N_("Scroll one page backward"),
+ { "ShiftSpace", NULL, "", "<shift>space", NULL,
G_CALLBACK (ev_window_cmd_scroll_backward) },
- { "BackSpace", NULL, "", "BackSpace",
- N_("Scroll one page backward"),
+ { "BackSpace", NULL, "", "BackSpace", NULL,
G_CALLBACK (ev_window_cmd_scroll_backward) },
- { "ShiftBackSpace", NULL, "", "<shift>BackSpace",
- N_("Scroll one page forward"),
+ { "ShiftBackSpace", NULL, "", "<shift>BackSpace", NULL,
G_CALLBACK (ev_window_cmd_scroll_forward) },
- { "Plus", GTK_STOCK_ZOOM_IN, NULL, "plus",
- N_("Enlarge the document"),
+ { "Plus", GTK_STOCK_ZOOM_IN, NULL, "plus", NULL,
G_CALLBACK (ev_window_cmd_view_zoom_in) },
- { "CtrlEqual", GTK_STOCK_ZOOM_IN, NULL, "<control>equal",
- N_("Enlarge the document"),
+ { "CtrlEqual", GTK_STOCK_ZOOM_IN, NULL, "<control>equal", NULL,
G_CALLBACK (ev_window_cmd_view_zoom_in) },
- { "Minus", GTK_STOCK_ZOOM_OUT, NULL, "minus",
- N_("Shrink the document"),
+ { "Minus", GTK_STOCK_ZOOM_OUT, NULL, "minus", NULL,
G_CALLBACK (ev_window_cmd_view_zoom_out) },
- { "FocusPageSelector", NULL, "", "<control>l",
- N_("Focus the page selector"),
+ { "FocusPageSelector", NULL, "", "<control>l", NULL,
G_CALLBACK (ev_window_cmd_focus_page_selector) },
- { "GoBackwardFast", NULL, "", "<shift>Page_Up",
- N_("Go ten pages backward"),
+ { "GoBackwardFast", NULL, "", "<shift>Page_Up", NULL,
G_CALLBACK (ev_window_cmd_go_backward) },
- { "GoForwardFast", NULL, "", "<shift>Page_Down",
- N_("Go ten pages forward"),
+ { "GoForwardFast", NULL, "", "<shift>Page_Down", NULL,
G_CALLBACK (ev_window_cmd_go_forward) },
- { "KpPlus", GTK_STOCK_ZOOM_IN, NULL, "KP_Add",
- N_("Enlarge the document"),
+ { "KpPlus", GTK_STOCK_ZOOM_IN, NULL, "KP_Add", NULL,
G_CALLBACK (ev_window_cmd_view_zoom_in) },
- { "KpMinus", GTK_STOCK_ZOOM_OUT, NULL, "KP_Subtract",
- N_("Shrink the document"),
+ { "KpMinus", GTK_STOCK_ZOOM_OUT, NULL, "KP_Subtract", NULL,
G_CALLBACK (ev_window_cmd_view_zoom_out) },
};
ev_view_goto_link (EV_VIEW (window->priv->view), link);
}
+static void
+launch_link (EvWindow *window, EvLink *link)
+{
+ const char *filename = ev_link_get_filename (link);
+ char *uri = NULL;
+
+ if (g_path_is_absolute (filename)) {
+ uri = g_strconcat ("file://", filename, NULL);
+ } else {
+ GnomeVFSURI *base_uri, *resolved_uri;
+
+ base_uri = gnome_vfs_uri_new (window->priv->uri);
+ if (base_uri) {
+ resolved_uri = gnome_vfs_uri_resolve_relative (base_uri, filename);
+ if (resolved_uri) {
+ uri = gnome_vfs_uri_to_string (resolved_uri, GNOME_VFS_URI_HIDE_NONE);
+ gnome_vfs_uri_unref (resolved_uri);
+ }
+ gnome_vfs_uri_unref (base_uri);
+ }
+ }
+
+ if (uri) {
+ gnome_vfs_url_show (uri);
+ } else {
+ gnome_vfs_url_show (filename);
+ }
+
+ g_free (uri);
+
+ /* According to the PDF spec filename can be an executable. I'm not sure
+ allowing to launch executables is a good idea though. -- marco */
+}
+
+static void
+view_external_link_cb (EvView *view, EvLink *link, EvWindow *window)
+{
+ const char *uri;
+
+ switch (ev_link_get_link_type (link)) {
+ case EV_LINK_TYPE_EXTERNAL_URI:
+ uri = ev_link_get_uri (link);
+ gnome_vfs_url_show (uri);
+ break;
+ case EV_LINK_TYPE_LAUNCH:
+ launch_link (window, link);
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+}
+
static void
ev_window_init (EvWindow *ev_window)
{
g_signal_connect_object (ev_window->priv->view, "focus_out_event",
G_CALLBACK (view_actions_focus_out_cb),
ev_window, 0);
+ g_signal_connect_object (ev_window->priv->view, "external-link",
+ G_CALLBACK (view_external_link_cb),
+ ev_window, 0);
gtk_widget_show (ev_window->priv->view);
gtk_widget_show (ev_window->priv->password_view);
"notify::rotation",
G_CALLBACK (ev_window_rotation_changed_cb),
ev_window);
+ g_signal_connect (ev_window->priv->view,
+ "notify::has-selection",
+ G_CALLBACK (ev_window_has_selection_changed_cb),
+ ev_window);
ev_window->priv->find_bar = egg_find_bar_new ();
gtk_box_pack_end (GTK_BOX (ev_window->priv->main_box),