+static void
+find_not_supported_dialog (EvWindow *ev_window)
+{
+ GtkWidget *dialog;
+
+ /* If you change this so it isn't modal, be sure you don't
+ * allow multiple copies of the dialog...
+ */
+
+ dialog = gtk_message_dialog_new (GTK_WINDOW (ev_window),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_CLOSE,
+ _("The \"Find\" feature will not work with this document"));
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ _("Searching for text is only supported for PDF documents."));
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+}
+
+static void
+ev_window_cmd_edit_select_all (GtkAction *action, EvWindow *ev_window)
+{
+ g_return_if_fail (EV_IS_WINDOW (ev_window));
+
+ ev_view_select_all (EV_VIEW (ev_window->priv->view));
+}
+
+static void
+ev_window_cmd_edit_find (GtkAction *action, EvWindow *ev_window)
+{
+ g_return_if_fail (EV_IS_WINDOW (ev_window));
+
+ if (ev_window->priv->document == NULL) {
+ g_printerr ("We should have set the Find menu item insensitive since there's no document\n");
+ } else if (!EV_IS_DOCUMENT_FIND (ev_window->priv->document)) {
+ find_not_supported_dialog (ev_window);
+ } else {
+ gtk_widget_show (ev_window->priv->find_bar);
+
+ if (ev_window->priv->exit_fullscreen_popup)
+ ev_window_update_fullscreen_popup (ev_window);
+
+ egg_find_bar_grab_focus (EGG_FIND_BAR (ev_window->priv->find_bar));
+ }
+}
+
+static void
+ev_window_cmd_edit_copy (GtkAction *action, EvWindow *ev_window)
+{
+ g_return_if_fail (EV_IS_WINDOW (ev_window));
+
+ ev_view_copy (EV_VIEW (ev_window->priv->view));
+}
+
+static void
+ev_window_update_fullscreen_popup (EvWindow *window)
+{
+ GtkWidget *popup = window->priv->exit_fullscreen_popup;
+ int popup_width, popup_height;
+ GdkRectangle screen_rect;
+
+ g_return_if_fail (popup != NULL);
+
+ if (!popup)
+ return;
+
+ popup_width = popup->requisition.width;
+ popup_height = popup->requisition.height;
+
+ /* FIXME multihead */
+ gdk_screen_get_monitor_geometry (gdk_screen_get_default (),
+ gdk_screen_get_monitor_at_window
+ (gdk_screen_get_default (),
+ GTK_WIDGET (window)->window),
+ &screen_rect);
+
+ if (GTK_WIDGET_VISIBLE (window->priv->find_bar)) {
+ GtkRequisition req;
+
+ gtk_widget_size_request (window->priv->find_bar, &req);
+
+ screen_rect.height -= req.height;
+ }
+
+ if (gtk_widget_get_direction (popup) == GTK_TEXT_DIR_RTL)
+ {
+ gtk_window_move (GTK_WINDOW (popup),
+ screen_rect.x + screen_rect.width - popup_width,
+ screen_rect.height - popup_height);
+ }
+ else
+ {
+ gtk_window_move (GTK_WINDOW (popup),
+ screen_rect.x, screen_rect.height - popup_height);
+ }
+}
+
+static void
+screen_size_changed_cb (GdkScreen *screen,
+ EvWindow *window)
+{
+ ev_window_update_fullscreen_popup (window);
+}
+
+static void
+destroy_exit_fullscreen_popup (EvWindow *window)
+{
+ if (window->priv->exit_fullscreen_popup != NULL)
+ {
+ /* FIXME multihead */
+ g_signal_handlers_disconnect_by_func
+ (gdk_screen_get_default (),
+ G_CALLBACK (screen_size_changed_cb), window);
+
+ gtk_widget_destroy (window->priv->exit_fullscreen_popup);
+ window->priv->exit_fullscreen_popup = NULL;
+ }
+}
+
+static void
+exit_fullscreen_button_clicked_cb (GtkWidget *button, EvWindow *window)
+{
+ GtkAction *action;
+
+ action = gtk_action_group_get_action (window->priv->action_group, "ViewFullscreen");
+ g_return_if_fail (action != NULL);
+
+ gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), FALSE);
+}
+
+static void
+fullscreen_popup_size_request_cb (GtkWidget *popup, GtkRequisition *req, EvWindow *window)
+{
+ ev_window_update_fullscreen_popup (window);
+}
+
+static void
+ev_window_fullscreen (EvWindow *window)
+{
+ GtkWidget *popup, *button, *icon, *label, *hbox, *main_menu;
+
+ window->priv->fullscreen_mode = TRUE;
+
+ popup = gtk_window_new (GTK_WINDOW_POPUP);
+ window->priv->exit_fullscreen_popup = popup;
+
+ button = gtk_button_new ();
+ g_signal_connect (button, "clicked",
+ G_CALLBACK (exit_fullscreen_button_clicked_cb),
+ window);
+ gtk_widget_show (button);
+ gtk_container_add (GTK_CONTAINER (popup), button);
+
+ hbox = gtk_hbox_new (FALSE, 2);
+ gtk_widget_show (hbox);
+ gtk_container_add (GTK_CONTAINER (button), hbox);
+
+ icon = gtk_image_new_from_stock (GTK_STOCK_QUIT, GTK_ICON_SIZE_BUTTON);
+ gtk_widget_show (icon);
+ gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 0);
+
+ label = gtk_label_new (_("Exit Fullscreen"));
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+ gtk_window_set_resizable (GTK_WINDOW (popup), FALSE);
+
+ /* FIXME multihead */
+ g_signal_connect (gdk_screen_get_default (), "size-changed",
+ G_CALLBACK (screen_size_changed_cb), window);
+ g_signal_connect (popup, "size_request",
+ G_CALLBACK (fullscreen_popup_size_request_cb), window);
+
+ main_menu = gtk_ui_manager_get_widget (window->priv->ui_manager, "/MainMenu");
+ gtk_widget_hide (main_menu);
+ gtk_widget_hide (window->priv->statusbar);
+
+ ev_window_update_fullscreen_popup (window);
+
+ gtk_widget_show (popup);
+}
+
+static void
+ev_window_unfullscreen (EvWindow *window)
+{
+ GtkWidget *main_menu;
+
+ window->priv->fullscreen_mode = FALSE;
+
+ main_menu = gtk_ui_manager_get_widget (window->priv->ui_manager, "/MainMenu");
+ gtk_widget_show (main_menu);
+ gtk_widget_show (window->priv->statusbar);
+
+ destroy_exit_fullscreen_popup (window);
+}
+
+static void
+ev_window_cmd_view_fullscreen (GtkAction *action, EvWindow *ev_window)
+{
+ gboolean fullscreen;
+
+ g_return_if_fail (EV_IS_WINDOW (ev_window));
+
+ fullscreen = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
+
+ if (fullscreen) {
+ gtk_window_fullscreen (GTK_WINDOW (ev_window));
+ } else {
+ gtk_window_unfullscreen (GTK_WINDOW (ev_window));
+ }
+}
+
+static gboolean
+ev_window_state_event_cb (GtkWidget *widget, GdkEventWindowState *event, EvWindow *window)
+{
+ if (event->changed_mask & GDK_WINDOW_STATE_FULLSCREEN)
+ {
+ GtkActionGroup *action_group;
+ GtkAction *action;
+ gboolean fullscreen;
+
+ fullscreen = event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN;
+
+ if (fullscreen)
+ {
+ ev_window_fullscreen (window);
+ }
+ else
+ {
+ ev_window_unfullscreen (window);
+ }
+
+ action_group = window->priv->action_group;
+
+ action = gtk_action_group_get_action (action_group, "ViewFullscreen");
+ g_signal_handlers_block_by_func
+ (action, G_CALLBACK (ev_window_cmd_view_fullscreen), window);
+ gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), fullscreen);
+ g_signal_handlers_unblock_by_func
+ (action, G_CALLBACK (ev_window_cmd_view_fullscreen), window);
+
+ }
+
+ return FALSE;
+}
+
+static gboolean
+ev_window_focus_out_cb (GtkWidget *widget, GdkEventFocus *event, EvWindow *ev_window)
+{
+ gtk_window_unfullscreen (GTK_WINDOW (ev_window));
+
+ return FALSE;
+}
+
+static void
+ev_window_set_page_mode (EvWindow *window,
+ EvWindowPageMode page_mode)
+{
+ GtkWidget *child = NULL;
+ GtkWidget *real_child;
+
+ if (window->priv->page_mode == page_mode)
+ return;
+
+ window->priv->page_mode = page_mode;
+
+ switch (page_mode) {
+ case PAGE_MODE_SINGLE_PAGE:
+ 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 ();
+ }
+
+ real_child = gtk_bin_get_child (GTK_BIN (window->priv->scrolled_window));
+ if (child != real_child) {
+ gtk_container_remove (GTK_CONTAINER (window->priv->scrolled_window),
+ real_child);
+ gtk_container_add (GTK_CONTAINER (window->priv->scrolled_window),
+ child);
+ }
+ update_action_sensitivity (window);
+}
+
+static void
+ev_window_cmd_view_zoom_in (GtkAction *action, EvWindow *ev_window)
+{
+ g_return_if_fail (EV_IS_WINDOW (ev_window));
+
+ ev_view_zoom_in (EV_VIEW (ev_window->priv->view));
+}
+
+static void
+ev_window_cmd_view_zoom_out (GtkAction *action, EvWindow *ev_window)
+{
+ g_return_if_fail (EV_IS_WINDOW (ev_window));
+
+ ev_view_zoom_out (EV_VIEW (ev_window->priv->view));
+}
+
+static void
+ev_window_cmd_view_normal_size (GtkAction *action, EvWindow *ev_window)
+{
+ g_return_if_fail (EV_IS_WINDOW (ev_window));
+
+ ev_view_normal_size (EV_VIEW (ev_window->priv->view));
+}
+
+static void
+ev_window_cmd_view_best_fit (GtkAction *action, EvWindow *ev_window)
+{
+ g_return_if_fail (EV_IS_WINDOW (ev_window));
+
+ ev_view_best_fit (EV_VIEW (ev_window->priv->view));
+}
+
+static void
+ev_window_cmd_view_page_width (GtkAction *action, EvWindow *ev_window)
+{
+ g_return_if_fail (EV_IS_WINDOW (ev_window));
+
+ ev_view_fit_width (EV_VIEW (ev_window->priv->view));
+}
+
+static void
+ev_window_cmd_go_page_up (GtkAction *action, EvWindow *ev_window)
+{
+ g_return_if_fail (EV_IS_WINDOW (ev_window));
+
+ ev_view_set_page (EV_VIEW (ev_window->priv->view),
+ ev_view_get_page (EV_VIEW (ev_window->priv->view)) - 1);
+}
+
+static void
+ev_window_cmd_go_page_down (GtkAction *action, EvWindow *ev_window)
+{
+ g_return_if_fail (EV_IS_WINDOW (ev_window));
+
+ ev_view_set_page (EV_VIEW (ev_window->priv->view),
+ ev_view_get_page (EV_VIEW (ev_window->priv->view)) + 1);
+}
+
+static void
+ev_window_cmd_go_first_page (GtkAction *action, EvWindow *ev_window)
+{
+ g_return_if_fail (EV_IS_WINDOW (ev_window));
+
+ ev_view_set_page (EV_VIEW (ev_window->priv->view), 1);
+}
+
+static void
+ev_window_cmd_go_last_page (GtkAction *action, EvWindow *ev_window)
+{
+ g_return_if_fail (EV_IS_WINDOW (ev_window));
+
+ ev_view_set_page (EV_VIEW (ev_window->priv->view), G_MAXINT);
+}
+
+static void
+ev_window_cmd_help_contents (GtkAction *action, EvWindow *ev_window)
+{
+ g_return_if_fail (EV_IS_WINDOW (ev_window));
+
+ /* FIXME */
+}
+