X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-view.c;h=9925d5abc072fb1dbc12bddb41c83c4f717d48ce;hb=70693deccf54d178c25d7f89c1b2d4a51fa5316f;hp=0f671c20f5528032752ebf32b51bad3ca6fb0c11;hpb=d85cfd80bcec6fc589702f45de1a254b32094f1f;p=evince.git diff --git a/shell/ev-view.c b/shell/ev-view.c index 0f671c20..9925d5ab 100644 --- a/shell/ev-view.c +++ b/shell/ev-view.c @@ -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 (¤t_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) {