+ if (view->document) {
+ int old_page = ev_document_get_page (view->document);
+ int old_width, old_height;
+
+ ev_document_get_page_size (view->document,
+ -1,
+ &old_width, &old_height);
+
+ if (old_page != page) {
+ ev_view_set_cursor (view, EV_VIEW_CURSOR_WAIT);
+ ev_document_set_page (view->document, page);
+ }
+
+ if (old_page != ev_document_get_page (view->document)) {
+ int width, height;
+
+ g_signal_emit (view, page_changed_signal, 0);
+
+ view->has_selection = FALSE;
+ ev_document_get_page_size (view->document,
+ -1,
+ &width, &height);
+ if (width != old_width || height != old_height)
+ gtk_widget_queue_resize (GTK_WIDGET (view));
+
+ gtk_adjustment_set_value (view->vadjustment,
+ view->vadjustment->lower);
+ }
+
+ view->find_page = page;
+ view->find_result = 0;
+ update_find_status_message (view);
+ }
+}
+
+#define MARGIN 5
+
+static void
+ensure_rectangle_is_visible (EvView *view, GdkRectangle *rect)
+{
+ GtkWidget *widget = GTK_WIDGET (view);
+ GtkAdjustment *adjustment;
+ int value;
+
+ adjustment = view->vadjustment;
+
+ if (rect->y < adjustment->value) {
+ value = MAX (adjustment->lower, rect->y - MARGIN);
+ gtk_adjustment_set_value (view->vadjustment, value);
+ } else if (rect->y + rect->height >
+ adjustment->value + widget->allocation.height) {
+ value = MIN (adjustment->upper, rect->y + rect->height -
+ widget->allocation.height + MARGIN);
+ gtk_adjustment_set_value (view->vadjustment, value);
+ }
+
+ adjustment = view->hadjustment;
+
+ if (rect->x < adjustment->value) {
+ value = MAX (adjustment->lower, rect->x - MARGIN);
+ gtk_adjustment_set_value (view->hadjustment, value);
+ } else if (rect->x + rect->height >
+ adjustment->value + widget->allocation.width) {
+ value = MIN (adjustment->upper, rect->x + rect->width -
+ widget->allocation.width + MARGIN);
+ gtk_adjustment_set_value (view->hadjustment, value);
+ }
+}
+
+static void
+jump_to_find_result (EvView *view)
+{
+ GdkRectangle rect;
+
+ ev_document_find_get_result (EV_DOCUMENT_FIND (view->document),
+ view->find_result, &rect);
+ ensure_rectangle_is_visible (view, &rect);
+}
+
+static void
+jump_to_find_page (EvView *view)
+{
+ int n_pages, i;
+
+ n_pages = ev_document_get_n_pages (view->document);
+
+ for (i = 0; i <= n_pages; i++) {
+ int has_results;
+ int page;
+
+ page = i + view->find_page;
+ if (page > n_pages) {
+ page = page - n_pages;
+ }
+
+ has_results = ev_document_find_page_has_results
+ (EV_DOCUMENT_FIND (view->document), page);
+ if (has_results == -1) {
+ view->find_page = page;
+ break;
+ } else if (has_results == 1) {
+ set_document_page (view, page);
+ jump_to_find_result (view);
+ break;
+ }
+ }
+}
+
+static void
+find_changed_cb (EvDocument *document, int page, EvView *view)
+{
+ jump_to_find_page (view);
+ jump_to_find_result (view);
+ update_find_status_message (view);
+
+ if (ev_document_get_page (document) == page) {
+ gtk_widget_queue_draw (GTK_WIDGET (view));
+ }