]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-window.c
make page size calculation consistent and set it to (int)( width * scale +
[evince.git] / shell / ev-window.c
index 489c1cc01b9b3f8efae60077f683041a55e26e82..2475de0af289d86378e74ce2ffd9ce9abe8370f8 100644 (file)
@@ -52,6 +52,9 @@
 #include "egg-editable-toolbar.h"
 #include "ephy-zoom.h"
 #include "ephy-zoom-action.h"
+#include "ev-application.h"
+#include "ev-stock-icons.h"
+#include "ev-file-helpers.h"
 
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
 
 #include <string.h>
 
-#include "ev-application.h"
-#include "ev-stock-icons.h"
-
 typedef enum {
-       PAGE_MODE_SINGLE_PAGE,
-       PAGE_MODE_CONTINUOUS_PAGE,
-       PAGE_MODE_PASSWORD,
+       PAGE_MODE_DOCUMENT,
+       PAGE_MODE_PASSWORD
 } EvWindowPageMode;
 
 typedef enum {
@@ -244,18 +243,6 @@ update_action_sensitivity (EvWindow *ev_window)
                set_action_sensitive (ev_window, "GoLastPage", FALSE);
        }
 
-       /* Page View radio group */
-       if (document) {
-               set_action_sensitive (ev_window, "SinglePage", page_mode != PAGE_MODE_PASSWORD);
-               set_action_sensitive (ev_window, "ContinuousPage", page_mode != PAGE_MODE_PASSWORD);
-       } else {
-               set_action_sensitive (ev_window, "SinglePage", FALSE);
-               set_action_sensitive (ev_window, "ContinuousPage", FALSE);
-       }
-       /* Help menu */
-       /* "HelpContents": always sensitive */
-       /* "HelpAbout": always sensitive */
-
        /* Toolbar-specific actions: */
        set_action_sensitive (ev_window, PAGE_SELECTOR_ACTION, has_pages);
        set_action_sensitive (ev_window, ZOOM_CONTROL_ACTION,  has_pages);
@@ -341,6 +328,28 @@ update_chrome_flag (EvWindow *window, EvChrome flag, const char *pref, gboolean
        update_chrome_visibility (window);
 }
 
+static void
+ev_window_cmd_focus_page_selector (GtkAction *act, EvWindow *window)
+{
+       GtkAction *action;
+       
+       action = gtk_action_group_get_action (window->priv->action_group,
+                                             PAGE_SELECTOR_ACTION);
+       ev_page_action_grab_focus (EV_PAGE_ACTION (action));
+}
+
+static void
+ev_window_cmd_scroll_forward (GtkAction *action, EvWindow *window)
+{
+       ev_view_scroll (EV_VIEW (window->priv->view), EV_SCROLL_PAGE_FORWARD);
+}
+
+static void
+ev_window_cmd_scroll_backward (GtkAction *action, EvWindow *window)
+{
+       ev_view_scroll (EV_VIEW (window->priv->view), EV_SCROLL_PAGE_BACKWARD);
+}
+
 static void
 ev_window_cmd_continuous (GtkAction *action, EvWindow *ev_window)
 {
@@ -589,7 +598,7 @@ ev_window_setup_document (EvWindow *ev_window)
                                         ev_window, 0);
        }
 
-       ev_window_set_page_mode (ev_window, PAGE_MODE_SINGLE_PAGE);
+       ev_window_set_page_mode (ev_window, PAGE_MODE_DOCUMENT);
 
        ev_sidebar_set_document (sidebar, document);
 
@@ -1630,15 +1639,12 @@ ev_window_set_page_mode (EvWindow         *window,
        window->priv->page_mode = page_mode;
 
        switch (page_mode) {
-       case PAGE_MODE_SINGLE_PAGE:
+       case PAGE_MODE_DOCUMENT:
                child = window->priv->view;
                break;
        case PAGE_MODE_PASSWORD:
                child = window->priv->password_view;
                break;
-       case PAGE_MODE_CONTINUOUS_PAGE:
-               child = window->priv->page_view;
-               break;
        default:
                g_assert_not_reached ();
        }
@@ -1657,8 +1663,10 @@ static void
 ev_window_cmd_edit_toolbar_cb (GtkDialog *dialog, gint response, gpointer data)
 {
        EvWindow *ev_window = EV_WINDOW (data);
-        egg_editable_toolbar_set_edit_mode (EGG_EDITABLE_TOOLBAR (ev_window->priv->toolbar), FALSE);
-        egg_toolbars_model_save (ev_window->priv->toolbar_model, ev_window->priv->toolbar_file, "1.0");
+        egg_editable_toolbar_set_edit_mode
+                       (EGG_EDITABLE_TOOLBAR (ev_window->priv->toolbar), FALSE);
+        egg_toolbars_model_save (ev_window->priv->toolbar_model,
+                                ev_window->priv->toolbar_file, "1.0");
         gtk_widget_destroy (GTK_WIDGET (dialog));
 }
 
@@ -2125,21 +2133,6 @@ find_bar_close_cb (EggFindBar *find_bar,
        update_chrome_flag (ev_window, EV_CHROME_FINDBAR, NULL, FALSE);
 }
 
-static void
-ev_window_page_mode_cb (GtkRadioAction *action,
-                       GtkRadioAction *activated_action,
-                       EvWindow       *window)
-{
-       int mode;
-
-       mode = gtk_radio_action_get_current_value (action);
-
-       g_assert (mode == PAGE_MODE_CONTINUOUS_PAGE ||
-                 mode == PAGE_MODE_SINGLE_PAGE);
-
-       ev_window_set_page_mode (window, (EvWindowPageMode) mode);
-}
-
 static void
 find_bar_search_changed_cb (EggFindBar *find_bar,
                            GParamSpec *param,
@@ -2324,8 +2317,8 @@ static const GtkActionEntry entries[] = {
        { "EditFindNext", NULL, N_("Find Ne_xt"), "<control>G",
          N_("Find next occurrence of the word or phrase"),
          G_CALLBACK (ev_window_cmd_edit_find_next) },
-        { "EditToolbar", NULL, N_("Toolbar..."), NULL,
-          N_("Open Toolbar Editor Dialog"),
+        { "EditToolbar", NULL, N_("T_oolbar"), NULL,
+          N_("Customize the toolbar"),
           G_CALLBACK (ev_window_cmd_edit_toolbar) },
 
         /* View menu */
@@ -2371,11 +2364,26 @@ static const GtkActionEntry entries[] = {
          G_CALLBACK (ev_window_cmd_leave_fullscreen) },
 
        /* Accellerators */
-       { "Escape", NULL, N_("Selection Caret"), "Escape", "",
+       { "Escape", NULL, "", "Escape", "",
          G_CALLBACK (ev_window_cmd_escape) },
         { "Slash", GTK_STOCK_FIND, NULL, "slash",
           N_("Find a word or phrase in the document"),
-          G_CALLBACK (ev_window_cmd_edit_find) }
+          G_CALLBACK (ev_window_cmd_edit_find) },
+        { "Space", NULL, "", "space",
+          N_("Scroll one page forward"),
+          G_CALLBACK (ev_window_cmd_scroll_forward) },
+        { "ShiftSpace", NULL, "", "<shift>space",
+          N_("Scroll one page backward"),
+          G_CALLBACK (ev_window_cmd_scroll_backward) },
+        { "BackSpace", NULL, "", "BackSpace",
+          N_("Scroll one page backward"),
+          G_CALLBACK (ev_window_cmd_scroll_backward) },
+        { "ShiftBackSpace", NULL, "", "<shift>BackSpace",
+          N_("Scroll one page forward"),
+          G_CALLBACK (ev_window_cmd_scroll_forward) },
+        { "FocusPageSelector", NULL, "", "<control>l",
+          N_("Focus the page selector"),
+          G_CALLBACK (ev_window_cmd_focus_page_selector) }
 };
 
 /* Toggle items */
@@ -2410,15 +2418,6 @@ static const GtkToggleActionEntry toggle_entries[] = {
           G_CALLBACK (ev_window_cmd_view_page_width) },
 };
 
-static const GtkRadioActionEntry page_view_entries[] = {
-       { "SinglePage", GTK_STOCK_DND, N_("Single"), NULL,
-         N_("Show the document one page at a time"),
-         PAGE_MODE_SINGLE_PAGE },
-       { "ContinuousPage", GTK_STOCK_DND_MULTIPLE, N_("Multi"), NULL,
-         N_("Show the full document at once"),
-         PAGE_MODE_CONTINUOUS_PAGE }
-};
-
 static void
 drag_data_received_cb (GtkWidget *widget, GdkDragContext *context,
                       gint x, gint y, GtkSelectionData *selection_data,
@@ -2589,20 +2588,55 @@ sidebar_widget_model_set (EvSidebarLinks *ev_sidebar_links,
        ev_page_action_set_model (EV_PAGE_ACTION (action), model);
 }
 
+
+static void
+set_view_actions_sensitivity (EvWindow *window, gboolean sensitive)
+{
+       if (window->priv->action_group) {
+               set_action_sensitive (window, "Space", sensitive);
+               set_action_sensitive (window, "ShiftSpace", sensitive);
+               set_action_sensitive (window, "BackSpace", sensitive);
+               set_action_sensitive (window, "ShiftBackSpace", sensitive);
+       }
+}
+
+static void
+view_actions_focus_in_cb (GtkWidget *widget, GdkEventFocus *event, EvWindow *window)
+{
+       set_view_actions_sensitivity (window, TRUE);
+}
+
+static void
+view_actions_focus_out_cb (GtkWidget *widget, GdkEventFocus *event, EvWindow *window)
+{
+       set_view_actions_sensitivity (window, FALSE);
+}
+
+static void
+enable_view_actions_for_widget (EvWindow *window, GtkWidget *widget)
+{
+       g_signal_connect_object (widget, "focus_in_event",
+                                G_CALLBACK (view_actions_focus_in_cb),
+                                window, 0);
+       g_signal_connect_object (widget, "focus_out_event",
+                                G_CALLBACK (view_actions_focus_out_cb),
+                                window, 0);
+}
+
 static void
 ev_window_init (EvWindow *ev_window)
 {
        GtkActionGroup *action_group;
        GtkAccelGroup *accel_group;
        GError *error = NULL;
-       GtkWidget *sidebar_widget, *toolbar_dock;
+       GtkWidget *sidebar_widget, *toolbar_dock, *tree_view;
        GConfValue *value;
        GConfClient *client;
        int sidebar_size;
 
        ev_window->priv = EV_WINDOW_GET_PRIVATE (ev_window);
 
-       ev_window->priv->page_mode = PAGE_MODE_SINGLE_PAGE;
+       ev_window->priv->page_mode = PAGE_MODE_DOCUMENT;
        update_window_title (NULL, NULL, ev_window);
 
        ev_window->priv->main_box = gtk_vbox_new (FALSE, 0);
@@ -2617,11 +2651,6 @@ ev_window_init (EvWindow *ev_window)
        gtk_action_group_add_toggle_actions (action_group, toggle_entries,
                                             G_N_ELEMENTS (toggle_entries),
                                             ev_window);
-       gtk_action_group_add_radio_actions (action_group, page_view_entries,
-                                           G_N_ELEMENTS (page_view_entries),
-                                           ev_window->priv->page_mode,
-                                           G_CALLBACK (ev_window_page_mode_cb),
-                                           ev_window);
        set_action_properties (action_group);
        register_custom_actions (ev_window, action_group);
 
@@ -2633,6 +2662,8 @@ ev_window_init (EvWindow *ev_window)
                gtk_ui_manager_get_accel_group (ev_window->priv->ui_manager);
        gtk_window_add_accel_group (GTK_WINDOW (ev_window), accel_group);
 
+       set_view_actions_sensitivity (ev_window, FALSE);
+
        g_signal_connect (ev_window->priv->ui_manager, "connect_proxy",
                          G_CALLBACK (connect_proxy_cb), ev_window);
        g_signal_connect (ev_window->priv->ui_manager, "disconnect_proxy",
@@ -2656,7 +2687,7 @@ ev_window_init (EvWindow *ev_window)
        ev_window->priv->toolbar_model = egg_toolbars_model_new ();
        
        ev_window->priv->toolbar_file = g_build_filename
-                       (g_get_home_dir (), ".gnome2/evince_toolbar.xml", NULL);
+                       (ev_dot_dir (), "evince_toolbar.xml", NULL);
 
        if (!g_file_test (ev_window->priv->toolbar_file, G_FILE_TEST_EXISTS)) {
                egg_toolbars_model_load (ev_window->priv->toolbar_model,
@@ -2665,6 +2696,9 @@ ev_window_init (EvWindow *ev_window)
                egg_toolbars_model_load (ev_window->priv->toolbar_model,
                                         ev_window->priv->toolbar_file);
        }
+
+       egg_toolbars_model_set_flags (ev_window->priv->toolbar_model, 0,
+                                     EGG_TB_MODEL_NOT_REMOVABLE); 
        
        /* This sucks, but there is no way to have a draw=no, expand=true separator
         * in a GtkUIManager-built toolbar. So, just add another toolbar.
@@ -2721,11 +2755,17 @@ ev_window_init (EvWindow *ev_window)
                          "notify::model",
                          G_CALLBACK (sidebar_widget_model_set),
                          ev_window);
+       tree_view = ev_sidebar_links_get_treeview
+                       (EV_SIDEBAR_LINKS (sidebar_widget));
+       enable_view_actions_for_widget (ev_window, tree_view);
        gtk_widget_show (sidebar_widget);
        ev_sidebar_add_page (EV_SIDEBAR (ev_window->priv->sidebar),
                             sidebar_widget);
 
        sidebar_widget = ev_sidebar_thumbnails_new ();
+       tree_view = ev_sidebar_thumbnails_get_treeview
+                       (EV_SIDEBAR_THUMBNAILS (sidebar_widget));
+       enable_view_actions_for_widget (ev_window, tree_view);
        gtk_widget_show (sidebar_widget);
        ev_sidebar_add_page (EV_SIDEBAR (ev_window->priv->sidebar),
                             sidebar_widget);
@@ -2745,8 +2785,8 @@ ev_window_init (EvWindow *ev_window)
                                  "unlock",
                                  G_CALLBACK (ev_window_popup_password_dialog),
                                  ev_window);
+       enable_view_actions_for_widget (ev_window, ev_window->priv->view);
        gtk_widget_show (ev_window->priv->view);
-       //gtk_widget_show (ev_window->priv->page_view);
        gtk_widget_show (ev_window->priv->password_view);
 
        /* We own a ref on these widgets, as we can swap them in and out */