]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-view.c
Add support for "Find Previous" as dictated by the GNOME HIG. A menu item
[evince.git] / shell / ev-view.c
index 2e4752b75ccf8a9eeb26844389ce012ddfd9f745..eb8f3292455d8e56dfa2552c918481c0d26bbaa2 100644 (file)
@@ -471,7 +471,7 @@ view_update_range_and_current_page (EvView *view)
                                else 
                                        view->end_page = view->start_page;
                        } else {
-                               if (view->current_page - 1 < 0)
+                               if (view->current_page < 1)
                                        view->start_page = view->current_page;
                                else
                                        view->start_page = view->current_page - 1;
@@ -487,6 +487,7 @@ view_update_range_and_current_page (EvView *view)
        current_page = ev_page_cache_get_current_page (view->page_cache);
 
        if (current_page < view->start_page || current_page > view->end_page) {
+               view->current_page = view->start_page;
                ev_page_cache_set_current_page (view->page_cache, view->start_page);
        }
 
@@ -569,11 +570,15 @@ ev_view_scroll (EvView        *view,
        gboolean first_page = FALSE;
        gboolean last_page = FALSE;
 
+       view->jump_to_find_result = FALSE;
+
        if (view->presentation) {
                switch (scroll) {
+                       case EV_SCROLL_PAGE_BACKWARD:
                        case EV_SCROLL_STEP_BACKWARD:
                                ev_view_previous_page (view);
                                break;
+                       case EV_SCROLL_PAGE_FORWARD:
                        case EV_SCROLL_STEP_FORWARD:
                                ev_view_next_page (view);
                                break;
@@ -1540,6 +1545,7 @@ ev_view_scroll_event (GtkWidget *widget, GdkEventScroll *event)
                return TRUE;
        }
 
+       view->jump_to_find_result = FALSE;
        /* Shift+Wheel scrolls the in the perpendicular direction */
        if (state & GDK_SHIFT_MASK) {
                if (event->direction == GDK_SCROLL_UP)
@@ -1599,8 +1605,13 @@ ev_view_expose_event (GtkWidget      *widget,
        int i;
 
        if (view->loading) {
+               GdkRectangle area = {0};
+               
+               area.width = widget->allocation.width;
+               area.height = widget->allocation.height;
+               
                draw_loading_text (view,
-                                  &(widget->allocation),
+                                  &area,
                                   &(event->area));
        }
 
@@ -2120,11 +2131,14 @@ draw_one_page (EvView          *view,
        GdkRectangle overlap;
        GdkRectangle real_page_area;
        EvViewSelection *selection;
+       gint current_page;
 
        g_assert (view->document);
+       
        if (! gdk_rectangle_intersect (page_area, expose_area, &overlap))
                return;
-
+       
+       current_page = ev_page_cache_get_current_page (view->page_cache);
        selection = find_selection_for_page (view, page);
        ev_page_cache_get_size (view->page_cache,
                                page, view->rotation,
@@ -2140,7 +2154,8 @@ draw_one_page (EvView          *view,
 
        ev_document_misc_paint_one_page (GTK_WIDGET(view)->window,
                                         GTK_WIDGET (view),
-                                        page_area, border);
+                                        page_area, border, 
+                                        page == current_page);
 
        if (gdk_rectangle_intersect (&real_page_area, expose_area, &overlap)) {
                GdkPixbuf *selection_pixbuf = NULL;
@@ -2568,6 +2583,7 @@ ev_view_init (EvView *view)
        view->fullscreen = FALSE;
        view->sizing_mode = EV_SIZING_FIT_WIDTH;
        view->pending_scroll = SCROLL_TO_KEEP_POSITION;
+       view->jump_to_find_result = TRUE;
 }
 
 /*** Callbacks ***/
@@ -2581,8 +2597,11 @@ find_changed_cb (EvDocument *document, int page, EvView *view)
        percent = ev_document_find_get_progress
                        (EV_DOCUMENT_FIND (view->document)); 
        n_pages = ev_page_cache_get_n_pages (view->page_cache);
-       jump_to_find_page (view, EV_VIEW_FIND_NEXT, 0);
-       jump_to_find_result (view);
+       
+       if (view->jump_to_find_result == TRUE) {
+               jump_to_find_page (view, EV_VIEW_FIND_NEXT, 0);
+               jump_to_find_result (view);
+       }
        update_find_status_message (view, percent * n_pages >= n_pages - 1 );
        if (view->current_page == page)
                gtk_widget_queue_draw (GTK_WIDGET (view));
@@ -2601,15 +2620,16 @@ page_changed_cb (EvPageCache *page_cache,
                 EvView      *view)
 {
        if (view->current_page != new_page) {
-
                view->current_page = new_page;
                view->pending_scroll = SCROLL_TO_PAGE_POSITION;
                gtk_widget_queue_resize (GTK_WIDGET (view));
+       } else {
+               gtk_widget_queue_draw (GTK_WIDGET (view));
+       }
 
-               if (EV_IS_DOCUMENT_FIND (view->document)) {
-                       view->find_result = 0;
-                       update_find_status_message (view, TRUE);
-               }
+       if (EV_IS_DOCUMENT_FIND (view->document)) {
+               view->find_result = 0;
+               update_find_status_message (view, TRUE);
        }
 }
 
@@ -3410,6 +3430,23 @@ ev_view_find_next (EvView *view)
        }
 }
 
+gboolean
+ev_view_can_find_previous (EvView *view)
+{
+       if (EV_IS_DOCUMENT_FIND (view->document)) {
+               EvDocumentFind *find = EV_DOCUMENT_FIND (view->document);
+               int i, n_pages;
+
+               n_pages = ev_page_cache_get_n_pages (view->page_cache);
+               for (i = n_pages - 1; i >= 0; i--) {
+                       if (ev_document_find_get_n_results (find, i) > 0) {
+                               return TRUE;
+                       }
+               }
+       }
+
+       return FALSE;
+}
 void
 ev_view_find_previous (EvView *view)
 {
@@ -3436,6 +3473,12 @@ ev_view_find_previous (EvView *view)
        }
 }
 
+void ev_view_search_changed (EvView *view)
+{
+       /* search string has changed, focus on new search result */
+       view->jump_to_find_result = TRUE;
+}
+
 /*** Selections ***/
 
 /* compute_new_selection_rect/text calculates the area currently selected by
@@ -3945,7 +3988,11 @@ ev_view_next_page (EvView *view)
        g_return_val_if_fail (EV_IS_VIEW (view), FALSE);
 
        page = ev_page_cache_get_current_page (view->page_cache);
-       page = ev_view_get_dual_page (view) ? page + 2 : page + 1;
+
+       if (view->dual_page && !view->presentation)
+               page = page + 2; 
+       else 
+               page = page + 1;
 
        if (page < ev_page_cache_get_n_pages (view->page_cache)) {
                ev_page_cache_set_current_page (view->page_cache, page);
@@ -3966,7 +4013,11 @@ ev_view_previous_page (EvView *view)
        g_return_val_if_fail (EV_IS_VIEW (view), FALSE);
 
        page = ev_page_cache_get_current_page (view->page_cache);
-       page = ev_view_get_dual_page (view) ? page - 2 : page - 1;
+
+       if (view->dual_page && !view->presentation)
+               page = page - 2; 
+       else 
+               page = page - 1;
 
        if (page >= 0) {
                ev_page_cache_set_current_page (view->page_cache, page);