]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-view.c
Fix ChangeLog a bit
[evince.git] / shell / ev-view.c
index 0f671c20f5528032752ebf32b51bad3ca6fb0c11..9925d5abc072fb1dbc12bddb41c83c4f717d48ce 100644 (file)
@@ -424,6 +424,7 @@ static void
 view_update_range_and_current_page (EvView *view)
 {
        gint current_page;
+       gint best_current_page = -1;
        
        if (view->pending_scroll != SCROLL_TO_KEEP_POSITION)
                return;
@@ -436,6 +437,7 @@ view_update_range_and_current_page (EvView *view)
                GdkRectangle current_area, unused, page_area;
                GtkBorder border;
                gboolean found = FALSE;
+               gint area_max, area;
                int i;
 
                if (!(view->vadjustment && view->hadjustment))
@@ -451,43 +453,50 @@ view_update_range_and_current_page (EvView *view)
                        get_page_extents (view, i, &page_area, &border);
 
                        if (gdk_rectangle_intersect (&current_area, &page_area, &unused)) {
-                               if (! found) {
+                               area = unused.width * unused.height;
+
+                               if (!found) {
+                                       area_max = area;
                                        view->start_page = i;
                                        found = TRUE;
-
+                                       best_current_page = i;
+                               }
+                               if (area > area_max) {
+                                       best_current_page = (area == area_max) ? MIN (i, best_current_page) : i;
+                                       area_max = area;
                                }
+
                                view->end_page = i;
                        } else if (found) {
                                break;
                        }
                }
 
-       } else {
-               if (view->dual_page) {
-                       if (view->current_page % 2 == ev_page_cache_get_dual_even_left (view->page_cache)) {
-                               view->start_page = view->current_page;
-                               if (view->current_page + 1 < ev_page_cache_get_n_pages (view->page_cache))
-                                       view->end_page = view->start_page + 1;
-                               else 
-                                       view->end_page = view->start_page;
-                       } else {
-                               if (view->current_page - 1 < 0)
-                                       view->start_page = view->current_page;
-                               else
-                                       view->start_page = view->current_page - 1;
-                               view->end_page = view->current_page;
-                       }
-               } else {
+       } else if (view->dual_page) {
+               if (view->current_page % 2 == ev_page_cache_get_dual_even_left (view->page_cache)) {
                        view->start_page = view->current_page;
+                       if (view->current_page + 1 < ev_page_cache_get_n_pages (view->page_cache))
+                               view->end_page = view->start_page + 1;
+                       else 
+                               view->end_page = view->start_page;
+               } else {
+                       if (view->current_page < 1)
+                               view->start_page = view->current_page;
+                       else
+                               view->start_page = view->current_page - 1;
                        view->end_page = view->current_page;
                }
-
+       } else {
+               view->start_page = view->current_page;
+               view->end_page = view->current_page;
        }
 
+       best_current_page = MAX (best_current_page, view->start_page);
        current_page = ev_page_cache_get_current_page (view->page_cache);
 
-       if (current_page < view->start_page || current_page > view->end_page) {
-               ev_page_cache_set_current_page (view->page_cache, view->start_page);
+       if (current_page != best_current_page) {
+               view->current_page = best_current_page;
+               ev_page_cache_set_current_page (view->page_cache, best_current_page);
        }
 
        ev_pixbuf_cache_set_page_range (view->pixbuf_cache,
@@ -573,9 +582,11 @@ ev_view_scroll (EvView        *view,
 
        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;
@@ -643,7 +654,6 @@ ev_view_scroll (EvView        *view,
                       adjustment->upper - adjustment->page_size);      
 
        gtk_adjustment_set_value (adjustment, value);
-
 }
 
 #define MARGIN 5
@@ -1602,8 +1612,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));
        }
 
@@ -2612,15 +2627,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);
        }
 }
 
@@ -3421,6 +3437,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)
 {