+static void
+djvu_document_find_begin (EvDocumentFind *document,
+ int page,
+ const char *search_string,
+ gboolean case_sensitive)
+{
+ DjvuDocument *djvu_document = DJVU_DOCUMENT (document);
+
+ if (djvu_document->search &&
+ strcmp (search_string, djvu_text_get_text (djvu_document->search)) == 0)
+ return;
+
+ if (djvu_document->search)
+ djvu_text_free (djvu_document->search);
+
+ djvu_document->search = djvu_text_new (djvu_document,
+ page,
+ case_sensitive,
+ search_string);
+}
+
+static int
+djvu_document_find_get_n_results (EvDocumentFind *document_find, int page)
+{
+ DjvuText *search = DJVU_DOCUMENT (document_find)->search;
+
+ if (search) {
+ return djvu_text_n_results (search, page);
+ } else {
+ return 0;
+ }
+}
+
+static gboolean
+djvu_document_find_get_result (EvDocumentFind *document_find,
+ int page,
+ int n_result,
+ EvRectangle *rectangle)
+{
+ DjvuDocument *djvu_document = DJVU_DOCUMENT (document_find);
+ DjvuText *search = djvu_document->search;
+ EvRectangle *r;
+ double width, height;
+
+ if (search == NULL)
+ return FALSE;
+
+ r = djvu_text_get_result (search, page, n_result);
+ if (r == NULL)
+ return FALSE;
+
+ djvu_document_get_page_size (EV_DOCUMENT (djvu_document),
+ page, &width, &height);
+ rectangle->x1 = r->x1 * SCALE_FACTOR;
+ rectangle->y1 = height - r->y2 * SCALE_FACTOR;
+ rectangle->x2 = r->x2 * SCALE_FACTOR;
+ rectangle->y2 = height - r->y1 * SCALE_FACTOR;
+
+ return TRUE;
+}
+
+static int
+djvu_document_find_page_has_results (EvDocumentFind *document_find,
+ int page)
+{
+ DjvuText *search = DJVU_DOCUMENT (document_find)->search;
+
+ return search && djvu_text_has_results (search, page);
+}
+
+static double
+djvu_document_find_get_progress (EvDocumentFind *document_find)
+{
+ DjvuText *search = DJVU_DOCUMENT (document_find)->search;
+
+ if (search == NULL) {
+ return 0;
+ }
+
+ return djvu_text_get_progress (search);
+}
+
+static void
+djvu_document_find_cancel (EvDocumentFind *document)
+{
+ DjvuDocument *djvu_document = DJVU_DOCUMENT (document);
+
+ if (djvu_document->search) {
+ djvu_text_free (djvu_document->search);
+ djvu_document->search = NULL;
+ }
+}
+
+static void
+djvu_document_find_iface_init (EvDocumentFindIface *iface)
+{
+ iface->begin = djvu_document_find_begin;
+ iface->get_n_results = djvu_document_find_get_n_results;
+ iface->get_result = djvu_document_find_get_result;
+ iface->page_has_results = djvu_document_find_page_has_results;
+ iface->get_progress = djvu_document_find_get_progress;
+ iface->cancel = djvu_document_find_cancel;
+}