X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-window.c;h=2404001ef4862262c01bbb05543b5798619943ee;hb=dbe438c1e95c6d2901c282a0c0e204c94114fb75;hp=2a3783476e71fd723fb4284997cc5cbf854efa2d;hpb=80a9ffebfe5125584341d4fb005ee1a29219c970;p=evince.git diff --git a/shell/ev-window.c b/shell/ev-window.c index 2a378347..2404001e 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -37,8 +37,10 @@ #include "ev-password.h" #include "ev-password-view.h" #include "ev-print-job.h" +#include "ev-properties.h" #include "ev-document-thumbnails.h" #include "ev-document-links.h" +#include "ev-document-fonts.h" #include "ev-document-types.h" #include "ev-document-find.h" #include "ev-document-security.h" @@ -158,6 +160,9 @@ static gboolean start_loading_document (EvWindow *ev_wi static void ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window); +static void ev_window_zoom_changed_cb (EvView *view, + GParamSpec *pspec, + EvWindow *ev_window); static void ev_window_add_recent (EvWindow *window, const char *filename); static void ev_window_fullscreen (EvWindow *window); @@ -168,7 +173,8 @@ static void ev_window_run_presentation (EvWindow *windo static void ev_window_stop_presentation (EvWindow *window); static void ev_window_cmd_view_presentation (GtkAction *action, EvWindow *window); - +static void show_fullscreen_popup (EvWindow *window); + G_DEFINE_TYPE (EvWindow, ev_window, GTK_TYPE_WINDOW) @@ -187,12 +193,17 @@ update_action_sensitivity (EvWindow *ev_window) { EvView *view; EvDocument *document; + const EvDocumentInfo *info = NULL; EvWindowPageMode page_mode; gboolean sensitive, has_pages = FALSE, has_document; int n_pages = 0, page = -1; + gboolean ok_to_print = TRUE; + gboolean ok_to_copy = TRUE; view = EV_VIEW (ev_window->priv->view); document = ev_window->priv->document; + if (document) + info = ev_page_cache_get_info (ev_window->priv->page_cache); page_mode = ev_window->priv->page_mode; has_document = document != NULL; if (has_document && ev_window->priv->page_cache) { @@ -201,17 +212,22 @@ update_action_sensitivity (EvWindow *ev_window) has_pages = has_document && n_pages > 0; } + if (info && info->fields_mask & EV_DOCUMENT_INFO_PERMISSIONS) { + ok_to_print = (info->permissions & EV_DOCUMENT_PERMISSIONS_OK_TO_PRINT); + ok_to_copy = (info->permissions & EV_DOCUMENT_PERMISSIONS_OK_TO_COPY); + } + /* File menu */ /* "FileOpen": always sensitive */ - set_action_sensitive (ev_window, "FileSaveAs", has_document); - set_action_sensitive (ev_window, "FilePrint", has_pages); + set_action_sensitive (ev_window, "FileSaveAs", has_document && ok_to_copy); + set_action_sensitive (ev_window, "FilePrint", has_pages && ok_to_print); + set_action_sensitive (ev_window, "FileProperties", has_document); /* "FileCloseWindow": always sensitive */ /* Edit menu */ - sensitive = has_pages && ev_document_can_get_text (document); - set_action_sensitive (ev_window, "EditCopy", sensitive); - set_action_sensitive (ev_window, "EditSelectAll", sensitive); + 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, "EditFind", has_pages && EV_IS_DOCUMENT_FIND (document)); set_action_sensitive (ev_window, "Slash", @@ -302,7 +318,10 @@ update_chrome_visibility (EvWindow *window) set_widget_visibility (priv->fullscreen_toolbar, fullscreen_toolbar); if (priv->fullscreen_popup != NULL) { - set_widget_visibility (priv->fullscreen_popup, fullscreen); + if (fullscreen) + show_fullscreen_popup (window); + else + set_widget_visibility (priv->fullscreen_popup, FALSE); } } @@ -578,7 +597,7 @@ update_document_mode (EvWindow *window, EvDocumentMode mode) static void ev_window_setup_document (EvWindow *ev_window) { - EvDocumentInfo *info; + const EvDocumentInfo *info; EvDocument *document; EvView *view = EV_VIEW (ev_window->priv->view); EvSidebar *sidebar = EV_SIDEBAR (ev_window->priv->sidebar); @@ -612,9 +631,8 @@ ev_window_setup_document (EvWindow *ev_window) ev_page_action_set_document (EV_PAGE_ACTION (action), document); update_action_sensitivity (ev_window); - info = ev_document_get_info (document); + info = ev_page_cache_get_info (ev_window->priv->page_cache); update_document_mode (ev_window, info->mode); - ev_document_info_free (info); } static void @@ -1168,6 +1186,27 @@ ev_window_cmd_file_print (GtkAction *action, EvWindow *ev_window) ev_window_print (ev_window); } +static void +ev_window_cmd_file_properties (GtkAction *action, EvWindow *ev_window) +{ + EvDocument *document = ev_window->priv->document; + EvDocumentInfo *info; + GtkDialog *dialog; + GtkTreeModel *fonts; + + if (EV_IS_DOCUMENT_FONTS (document)) { + fonts = ev_document_fonts_get_fonts_model (EV_DOCUMENT_FONTS (document)); + } else { + fonts = NULL; + } + + info = ev_document_get_info (document); + dialog = ev_properties_new (info, fonts); + gtk_dialog_run (dialog); + gtk_widget_destroy (GTK_WIDGET (dialog)); + ev_document_info_free (info); +} + static void ev_window_cmd_file_close_window (GtkAction *action, EvWindow *ev_window) { @@ -1362,6 +1401,18 @@ fullscreen_clear_timeout (EvWindow *window) ev_view_show_cursor (EV_VIEW (window->priv->view)); } + +static void +show_fullscreen_popup (EvWindow *window) +{ + if (!GTK_WIDGET_VISIBLE (window->priv->fullscreen_popup)) { + g_object_set (window->priv->fullscreen_popup, "visible", TRUE, NULL); + ev_view_show_cursor (EV_VIEW (window->priv->view)); + } + + fullscreen_set_timeout (window); +} + static gboolean fullscreen_motion_notify_cb (GtkWidget *widget, GdkEventMotion *event, @@ -1369,12 +1420,7 @@ fullscreen_motion_notify_cb (GtkWidget *widget, { EvWindow *window = EV_WINDOW (user_data); - if (!GTK_WIDGET_VISIBLE (window->priv->fullscreen_popup)) { - g_object_set (window->priv->fullscreen_popup, "visible", TRUE, NULL); - ev_view_show_cursor (EV_VIEW (window->priv->view)); - } - - fullscreen_set_timeout (window); + show_fullscreen_popup (window); return FALSE; } @@ -1619,7 +1665,7 @@ ev_window_focus_in_event (GtkWidget *widget, GdkEventFocus *event) NULL); if (fullscreen) - gtk_widget_show (priv->fullscreen_popup); + show_fullscreen_popup (window); return GTK_WIDGET_CLASS (ev_window_parent_class)->focus_in_event (widget, event); } @@ -1726,7 +1772,6 @@ ev_window_cmd_view_zoom_in (GtkAction *action, EvWindow *ev_window) ev_view_set_sizing_mode (EV_VIEW (ev_window->priv->view), EV_SIZING_FREE); ev_view_zoom_in (EV_VIEW (ev_window->priv->view)); - update_action_sensitivity (ev_window); } static void @@ -1736,7 +1781,6 @@ ev_window_cmd_view_zoom_out (GtkAction *action, EvWindow *ev_window) ev_view_set_sizing_mode (EV_VIEW (ev_window->priv->view), EV_SIZING_FREE); ev_view_zoom_out (EV_VIEW (ev_window->priv->view)); - update_action_sensitivity (ev_window); } static void @@ -1923,6 +1967,13 @@ ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec, update_sizing_buttons (ev_window); } +static void +ev_window_zoom_changed_cb (EvView *view, GParamSpec *pspec, + EvWindow *ev_window) +{ + update_action_sensitivity (ev_window); +} + static char * build_comments_string (void) { @@ -2233,7 +2284,6 @@ zoom_control_changed_cb (EphyZoomAction *action, } ev_view_set_sizing_mode (EV_VIEW (ev_window->priv->view), mode); - update_action_sensitivity (ev_window); } static void @@ -2297,6 +2347,10 @@ ev_window_dispose (GObject *object) priv->find_bar = NULL; } + if (window->priv->fullscreen_timeout_source) { + g_source_destroy (window->priv->fullscreen_timeout_source); + window->priv->fullscreen_timeout_source = NULL; + } destroy_fullscreen_popup (window); G_OBJECT_CLASS (ev_window_parent_class)->dispose (object); @@ -2335,6 +2389,9 @@ static const GtkActionEntry entries[] = { { "FilePrint", GTK_STOCK_PRINT, N_("Print..."), "P", N_("Print this document"), G_CALLBACK (ev_window_cmd_file_print) }, + { "FileProperties", GTK_STOCK_PROPERTIES, N_("Properties"), "Return", + N_("View the properties of this document"), + G_CALLBACK (ev_window_cmd_file_properties) }, { "FileCloseWindow", GTK_STOCK_CLOSE, NULL, "W", N_("Close this window"), G_CALLBACK (ev_window_cmd_file_close_window) }, @@ -2419,6 +2476,12 @@ static const GtkActionEntry entries[] = { { "ShiftBackSpace", NULL, "", "BackSpace", N_("Scroll one page forward"), G_CALLBACK (ev_window_cmd_scroll_forward) }, + { "Plus", GTK_STOCK_ZOOM_IN, NULL, "plus", + N_("Enlarge the document"), + G_CALLBACK (ev_window_cmd_view_zoom_in) }, + { "Minus", GTK_STOCK_ZOOM_OUT, NULL, "minus", + N_("Shrink the document"), + G_CALLBACK (ev_window_cmd_view_zoom_out) }, { "FocusPageSelector", NULL, "", "l", N_("Focus the page selector"), G_CALLBACK (ev_window_cmd_focus_page_selector) } @@ -2660,6 +2723,9 @@ set_view_actions_sensitivity (EvWindow *window, gboolean sensitive) set_action_sensitive (window, "ShiftSpace", sensitive); set_action_sensitive (window, "BackSpace", sensitive); set_action_sensitive (window, "ShiftBackSpace", sensitive); + set_action_sensitive (window, "Slash", sensitive); + set_action_sensitive (window, "Plus", sensitive); + set_action_sensitive (window, "Minus", sensitive); } } @@ -2872,6 +2938,10 @@ ev_window_init (EvWindow *ev_window) "notify::sizing-mode", G_CALLBACK (ev_window_sizing_mode_changed_cb), ev_window); + g_signal_connect (ev_window->priv->view, + "notify::zoom", + G_CALLBACK (ev_window_zoom_changed_cb), + ev_window); ev_window->priv->statusbar = gtk_statusbar_new (); gtk_box_pack_end (GTK_BOX (ev_window->priv->main_box),