+ GTK_WIDGET_SET_FLAGS (view, GTK_CAN_FOCUS);
+
+ view->spacing = 10;
+ view->scale = 1.0;
+ view->current_page = 1;
+ view->pressed_button = -1;
+ view->cursor = EV_VIEW_CURSOR_NORMAL;
+}
+
+static void
+update_find_status_message (EvView *view)
+{
+ char *message;
+
+// g_mutex_lock (EV_DOC_MUTEX);
+ if (ev_document_get_page (view->document) == view->find_page) {
+ int results;
+
+// g_mutex_lock (EV_DOC_MUTEX);
+ results = ev_document_find_get_n_results
+ (EV_DOCUMENT_FIND (view->document));
+// g_mutex_unlock (EV_DOC_MUTEX);
+ /* TRANS: Sometimes this could be better translated as
+ "%d hit(s) on this page". Therefore this string
+ contains plural cases. */
+ message = g_strdup_printf (ngettext ("%d found on this page",
+ "%d found on this page",
+ results),
+ results);
+ } else {
+ double percent;
+
+ g_mutex_lock (EV_DOC_MUTEX);
+ percent = ev_document_find_get_progress
+ (EV_DOCUMENT_FIND (view->document));
+ g_mutex_unlock (EV_DOC_MUTEX);
+ if (percent >= (1.0 - 1e-10)) {
+ message = g_strdup (_("Not found"));
+ } else {
+ message = g_strdup_printf (_("%3d%% remaining to search"),
+ (int) ((1.0 - percent) * 100));
+ }
+
+ }
+// g_mutex_unlock (EV_DOC_MUTEX);
+
+ ev_view_set_find_status (view, message);
+// g_free (message);
+}
+
+#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)
+{
+ EvDocumentFind *find = EV_DOCUMENT_FIND (view->document);
+ GdkRectangle rect;
+ int n_results;
+
+ g_mutex_lock (EV_DOC_MUTEX);
+ n_results = ev_document_find_get_n_results (find);
+ g_mutex_unlock (EV_DOC_MUTEX);
+
+ if (n_results > view->find_result) {
+ g_mutex_lock (EV_DOC_MUTEX);
+ ev_document_find_get_result
+ (find, view->find_result, &rect);
+ g_mutex_unlock (EV_DOC_MUTEX);
+
+ ensure_rectangle_is_visible (view, &rect);
+ }
+}
+
+static void
+jump_to_find_page (EvView *view)
+{
+ int n_pages, i;
+
+ n_pages = ev_page_cache_get_n_pages (view->page_cache);
+
+ 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;
+ }
+
+ g_mutex_lock (EV_DOC_MUTEX);
+ 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) {
+ ev_page_cache_set_current_page (view->page_cache, page);
+ jump_to_find_result (view);
+ break;
+ }
+ }