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;
GdkRectangle current_area, unused, page_area;
GtkBorder border;
gboolean found = FALSE;
+ gint area_max, area;
int i;
if (!(view->vadjustment && view->hadjustment))
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,
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;
adjustment->upper - adjustment->page_size);
gtk_adjustment_set_value (adjustment, value);
-
}
#define MARGIN 5
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));
}
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);
}
}
}
}
+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)
{