+static void
+view_update_range_and_current_page (EvView *view)
+{
+ /* Presentation trumps all other modes */
+ if (view->presentation) {
+ view->start_page = view->current_page;
+ view->end_page = view->current_page;
+ } else if (view->continuous) {
+ GdkRectangle current_area, unused, page_area;
+ gint current_page;
+ gboolean found = FALSE;
+ int i;
+
+ get_bounding_box_size (view, &(page_area.width), &(page_area.height));
+ page_area.x = view->spacing;
+ page_area.y = view->spacing;
+
+ if (view->hadjustment) {
+ current_area.x = view->hadjustment->value;
+ current_area.width = view->hadjustment->page_size;
+ } else {
+ current_area.x = page_area.x;
+ current_area.width = page_area.width;
+ }
+
+ if (view->vadjustment) {
+ current_area.y = view->vadjustment->value;
+ current_area.height = view->vadjustment->page_size;
+ } else {
+ current_area.y = page_area.y;
+ current_area.height = page_area.height;
+ }
+
+ for (i = 0; i < ev_page_cache_get_n_pages (view->page_cache); i++) {
+ if (gdk_rectangle_intersect (¤t_area, &page_area, &unused)) {
+ if (! found) {
+ view->start_page = i;
+ found = TRUE;
+
+ }
+ view->end_page = i;
+ } else if (found) {
+ break;
+ }
+ if (view->dual_page) {
+ if (i % 2 == 0) {
+ page_area.x += page_area.width + view->spacing;
+ } else {
+ page_area.x = view->spacing;
+ page_area.y += page_area.height + view->spacing;
+ }
+ } else {
+ page_area.y += page_area.height + view->spacing;
+ }
+ }
+
+ current_page = ev_page_cache_get_current_page (view->page_cache);
+
+ if (current_page < view->start_page || current_page > view->end_page) {
+ g_signal_handlers_block_by_func (view->page_cache, page_changed_cb, view);
+ ev_page_cache_set_current_page (view->page_cache, view->start_page);
+ g_signal_handlers_unblock_by_func (view->page_cache, page_changed_cb, view);
+ }
+ } else {
+ if (view->dual_page) {
+ if (view->current_page % 2 == 0) {
+ 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->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;
+ }
+ }
+
+ ev_pixbuf_cache_set_page_range (view->pixbuf_cache,
+ view->start_page,
+ view->end_page,
+ view->scale);
+}
+
+static void
+clear_selection (EvView *view)
+{
+ g_list_foreach (view->selections, (GFunc)g_free, NULL);
+ view->selections = NULL;
+}
+