Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell/ev-view.c
diff options
context:
space:
mode:
authorCarlos Garcia Campos <carlosgc@gnome.org>2008-08-27 09:01:41 (GMT)
committer Carlos Garcia Campos <carlosgc@src.gnome.org>2008-08-27 09:01:41 (GMT)
commitc86fea736694b17beb9fb621fceac7e2970afe08 (patch)
treea56d037212de681d3ee29d4c09a2f75688e416ca /shell/ev-view.c
parent8d5f4e92b97b9ebee0ec3a805e511c60c606e715 (diff)
Removed
2008-08-27 Carlos Garcia Campos <carlosgc@gnome.org> * backend/djvu/Makefile.am: * backend/djvu/djvu-document-private.h: * backend/djvu/djvu-document.c: (djvu_document_find_find_text), (djvu_document_find_iface_init): * backend/djvu/djvu-text-page.[ch]: * backend/djvu/djvu-text.[ch]: Removed * backend/pdf/ev-poppler.cc: (pdf_document_find_find_text), (pdf_document_find_iface_init): * libdocument/ev-document-find.[ch]: (ev_document_find_find_text): * shell/ev-jobs.[ch]: (ev_job_find_init), (ev_job_find_dispose), (ev_job_find_run), (ev_job_find_class_init), (ev_job_find_new), (ev_job_find_get_n_results), (ev_job_find_get_progress), (ev_job_find_has_results), (ev_job_find_get_results): * shell/ev-view-private.h: * shell/ev-view.[ch]: (ev_view_expose_event), (highlight_find_results), (ev_view_finalize), (ev_view_get_property), (ev_view_class_init), (page_changed_cb), (ev_view_set_document), (ev_view_find_get_n_results), (ev_view_find_get_result), (jump_to_find_result), (jump_to_find_page), (ev_view_find_changed), (ev_view_find_next), (ev_view_find_previous), (ev_view_find_search_changed), (ev_view_find_set_highlight_search), (ev_view_find_cancel): * shell/ev-window.c: (ev_window_update_actions), (page_changed_cb), (ev_window_setup_document), (ev_window_update_find_status_message), (ev_window_find_job_finished_cb), (ev_window_find_job_updated_cb), (ev_window_clear_find_job), (find_bar_close_cb), (find_bar_search_changed_cb), (find_bar_visibility_changed_cb), (ev_window_dispose), (ev_window_init): Rework find interface. The find logic has been moved from backends to the shell avoiding a lot of duplicated code in the backends and making easier to implement the find interface in the backends. svn path=/trunk/; revision=3123
Diffstat (limited to 'shell/ev-view.c')
-rw-r--r--shell/ev-view.c230
1 files changed, 46 insertions, 184 deletions
diff --git a/shell/ev-view.c b/shell/ev-view.c
index 2524d11..d00f98c 100644
--- a/shell/ev-view.c
+++ b/shell/ev-view.c
@@ -29,7 +29,6 @@
#include <gdk/gdkkeysyms.h>
#include "ev-application.h"
-#include "ev-document-find.h"
#include "ev-document-forms.h"
#include "ev-document-images.h"
#include "ev-document-links.h"
@@ -53,7 +52,6 @@
enum {
PROP_0,
- PROP_FIND_STATUS,
PROP_CONTINUOUS,
PROP_DUAL_PAGE,
PROP_FULLSCREEN,
@@ -228,9 +226,6 @@ static void draw_loading_text (EvView *view,
GdkRectangle *expose_area);
/*** Callbacks ***/
-static void find_changed_cb (EvDocument *document,
- int page,
- EvView *view);
static void job_finished_cb (EvPixbufCache *pixbuf_cache,
GdkRegion *region,
EvView *view);
@@ -303,10 +298,11 @@ static void ev_view_handle_cursor_over_xy (EvView *view,
gint y);
/*** Find ***/
-static void update_find_status_message (EvView *view,
- gboolean this_page);
-static void ev_view_set_find_status (EvView *view,
- const char *message);
+static gint ev_view_find_get_n_results (EvView *view,
+ gint page);
+static EvRectangle *ev_view_find_get_result (EvView *view,
+ gint page,
+ gint result);
static void jump_to_find_result (EvView *view);
static void jump_to_find_page (EvView *view,
EvViewFindDirection direction,
@@ -2547,7 +2543,7 @@ ev_view_expose_event (GtkWidget *widget,
draw_one_page (view, i, cr, &page_area, &border, &(event->area), &page_ready);
- if (page_ready && EV_IS_DOCUMENT_FIND (view->document) && view->highlight_find_results)
+ if (page_ready && view->find_pages && view->highlight_find_results)
highlight_find_results (view, i);
}
@@ -3608,15 +3604,12 @@ draw_rubberband (GtkWidget *widget, GdkWindow *window,
static void
highlight_find_results (EvView *view, int page)
{
- EvDocumentFind *find;
- int i, results = 0;
+ gint i, n_results = 0;
- find = EV_DOCUMENT_FIND (view->document);
+ n_results = ev_view_find_get_n_results (view, page);
- results = ev_document_find_get_n_results (find, page);
-
- for (i = 0; i < results; i++) {
- EvRectangle rectangle;
+ for (i = 0; i < n_results; i++) {
+ EvRectangle *rectangle;
GdkRectangle view_rectangle;
guchar alpha;
@@ -3626,8 +3619,8 @@ highlight_find_results (EvView *view, int page)
alpha = 0x20;
}
- ev_document_find_get_result (find, page, i, &rectangle);
- doc_rect_to_view_rect (view, page, &rectangle, &view_rectangle);
+ rectangle = ev_view_find_get_result (view, page, i);
+ doc_rect_to_view_rect (view, page, rectangle, &view_rectangle);
draw_rubberband (GTK_WIDGET (view), view->layout.bin_window,
&view_rectangle, alpha);
}
@@ -3822,8 +3815,6 @@ ev_view_finalize (GObject *object)
{
EvView *view = EV_VIEW (object);
- g_free (view->find_status);
-
clear_selection (view);
clear_link_selected (view);
@@ -3973,9 +3964,6 @@ ev_view_get_property (GObject *object,
EvView *view = EV_VIEW (object);
switch (prop_id) {
- case PROP_FIND_STATUS:
- g_value_set_string (value, view->find_status);
- break;
case PROP_CONTINUOUS:
g_value_set_boolean (value, view->continuous);
break;
@@ -4092,14 +4080,6 @@ ev_view_class_init (EvViewClass *class)
g_object_class_install_property (object_class,
- PROP_FIND_STATUS,
- g_param_spec_string ("find-status",
- "Find Status Message",
- "The find status message",
- NULL,
- G_PARAM_READABLE));
-
- g_object_class_install_property (object_class,
PROP_CONTINUOUS,
g_param_spec_boolean ("continuous",
"Continuous",
@@ -4224,25 +4204,6 @@ ev_view_init (EvView *view)
/*** Callbacks ***/
static void
-find_changed_cb (EvDocument *document, int page, EvView *view)
-{
- double percent;
- int n_pages;
-
- percent = ev_document_find_get_progress
- (EV_DOCUMENT_FIND (view->document));
- n_pages = ev_page_cache_get_n_pages (view->page_cache);
-
- if (view->jump_to_find_result == TRUE) {
- jump_to_find_page (view, EV_VIEW_FIND_NEXT, 0);
- jump_to_find_result (view);
- }
- update_find_status_message (view, percent * n_pages >= n_pages - 1 );
- if (view->current_page == page)
- gtk_widget_queue_draw (GTK_WIDGET (view));
-}
-
-static void
ev_view_change_page (EvView *view,
gint new_page)
{
@@ -4334,10 +4295,7 @@ page_changed_cb (EvPageCache *page_cache,
gtk_widget_queue_draw (GTK_WIDGET (view));
}
- if (EV_IS_DOCUMENT_FIND (view->document)) {
- view->find_result = 0;
- update_find_status_message (view, TRUE);
- }
+ view->find_result = 0;
}
static void
@@ -4519,12 +4477,8 @@ ev_view_set_document (EvView *view,
clear_caches (view);
if (view->document) {
- g_signal_handlers_disconnect_by_func (view->document,
- find_changed_cb,
- view);
g_object_unref (view->document);
view->page_cache = NULL;
-
}
view->document = document;
@@ -4532,13 +4486,6 @@ ev_view_set_document (EvView *view,
if (view->document) {
g_object_ref (view->document);
- if (EV_IS_DOCUMENT_FIND (view->document)) {
- g_signal_connect (view->document,
- "find_changed",
- G_CALLBACK (find_changed_cb),
- view);
- }
-
setup_caches (view);
}
@@ -5139,71 +5086,32 @@ ev_view_set_zoom_for_size (EvView *view,
}
/*** Find ***/
-static void
-update_find_status_message (EvView *view, gboolean this_page)
-{
- char *message;
-
- if (this_page) {
- int results;
-
- results = ev_document_find_get_n_results
- (EV_DOCUMENT_FIND (view->document),
- view->current_page);
- /* 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;
-
- percent = ev_document_find_get_progress
- (EV_DOCUMENT_FIND (view->document));
- message = g_strdup_printf (_("%3d%% remaining to search"),
- (int) ((1.0 - percent) * 100));
-
- }
- ev_view_set_find_status (view, message);
- g_free (message);
-}
-
-const char *
-ev_view_get_find_status (EvView *view)
+static gint
+ev_view_find_get_n_results (EvView *view, gint page)
{
- g_return_val_if_fail (EV_IS_VIEW (view), NULL);
-
- return view->find_status;
+ return view->find_pages ? g_list_length (view->find_pages[page]) : 0;
}
-static void
-ev_view_set_find_status (EvView *view, const char *message)
+static EvRectangle *
+ev_view_find_get_result (EvView *view, gint page, gint result)
{
- g_return_if_fail (EV_IS_VIEW (view));
-
- g_free (view->find_status);
- view->find_status = g_strdup (message);
- g_object_notify (G_OBJECT (view), "find-status");
+ return view->find_pages ? (EvRectangle *) g_list_nth_data (view->find_pages[page], result) : NULL;
}
static void
jump_to_find_result (EvView *view)
{
- EvDocumentFind *find = EV_DOCUMENT_FIND (view->document);
- EvRectangle rect;
- GdkRectangle view_rect;
- int n_results;
- int page = view->current_page;
+ gint n_results;
+ gint page = view->current_page;
- n_results = ev_document_find_get_n_results (find, page);
+ n_results = ev_view_find_get_n_results (view, page);
- if (n_results > 0 && view->find_result < n_results) {
- ev_document_find_get_result
- (find, page, view->find_result, &rect);
+ if (n_results > 0 && view->find_result < n_results) {
+ EvRectangle *rect;
+ GdkRectangle view_rect;
- doc_rect_to_view_rect (view, page, &rect, &view_rect);
+ rect = ev_view_find_get_result (view, page, view->find_result);
+ doc_rect_to_view_rect (view, page, rect, &view_rect);
ensure_rectangle_is_visible (view, &view_rect);
}
}
@@ -5226,7 +5134,6 @@ jump_to_find_page (EvView *view, EvViewFindDirection direction, gint shift)
n_pages = ev_page_cache_get_n_pages (view->page_cache);
for (i = 0; i < n_pages; i++) {
- int has_results;
int page;
if (direction == EV_VIEW_FIND_NEXT)
@@ -5237,53 +5144,39 @@ jump_to_find_page (EvView *view, EvViewFindDirection direction, gint shift)
if (page >= n_pages) {
page = page - n_pages;
- }
- if (page < 0)
+ } else if (page < 0)
page = page + n_pages;
-
- has_results = ev_document_find_page_has_results
- (EV_DOCUMENT_FIND (view->document), page);
- if (has_results == -1) {
- break;
- } else if (has_results == 1) {
+
+ if (ev_view_find_get_n_results (view, page) > 0) {
ev_page_cache_set_current_page (view->page_cache, page);
break;
}
}
}
-gboolean
-ev_view_can_find_next (EvView *view)
+void
+ev_view_find_changed (EvView *view, GList **results, gint page)
{
- 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 = 0; i < n_pages; i++) {
- if (ev_document_find_get_n_results (find, i) > 0) {
- return TRUE;
- }
- }
+ view->find_pages = results;
+
+ if (view->jump_to_find_result == TRUE) {
+ jump_to_find_page (view, EV_VIEW_FIND_NEXT, 0);
+ jump_to_find_result (view);
}
- return FALSE;
+ if (view->current_page == page)
+ gtk_widget_queue_draw (GTK_WIDGET (view));
}
void
ev_view_find_next (EvView *view)
{
- int n_results, n_pages;
- EvDocumentFind *find = EV_DOCUMENT_FIND (view->document);
-
- n_results = ev_document_find_get_n_results (find, view->current_page);
-
- n_pages = ev_page_cache_get_n_pages (view->page_cache);
+ gint n_results;
+ n_results = ev_view_find_get_n_results (view, view->current_page);
view->find_result++;
if (view->find_result >= n_results) {
-
view->find_result = 0;
jump_to_find_page (view, EV_VIEW_FIND_NEXT, 1);
jump_to_find_result (view);
@@ -5293,42 +5186,14 @@ ev_view_find_next (EvView *view)
}
}
-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)
{
- int n_results, n_pages;
- EvDocumentFind *find = EV_DOCUMENT_FIND (view->document);
- EvPageCache *page_cache;
-
- page_cache = ev_page_cache_get (view->document);
-
- n_results = ev_document_find_get_n_results (find, view->current_page);
-
- n_pages = ev_page_cache_get_n_pages (page_cache);
-
view->find_result--;
if (view->find_result < 0) {
-
jump_to_find_page (view, EV_VIEW_FIND_PREV, -1);
- view->find_result = ev_document_find_get_n_results (find, view->current_page) - 1;
+ view->find_result = ev_view_find_get_n_results (view, view->current_page) - 1;
jump_to_find_result (view);
} else {
jump_to_find_result (view);
@@ -5337,14 +5202,15 @@ ev_view_find_previous (EvView *view)
}
void
-ev_view_search_changed (EvView *view)
+ev_view_find_search_changed (EvView *view)
{
/* search string has changed, focus on new search result */
view->jump_to_find_result = TRUE;
+ view->find_pages = NULL;
}
void
-ev_view_set_highlight_search (EvView *view, gboolean value)
+ev_view_find_set_highlight_search (EvView *view, gboolean value)
{
view->highlight_find_results = value;
gtk_widget_queue_draw (GTK_WIDGET (view));
@@ -5353,11 +5219,7 @@ ev_view_set_highlight_search (EvView *view, gboolean value)
void
ev_view_find_cancel (EvView *view)
{
- if (EV_IS_DOCUMENT_FIND (view->document)) {
- EvDocumentFind *find = EV_DOCUMENT_FIND (view->document);
-
- ev_document_find_cancel (find);
- }
+ view->find_pages = NULL;
}
/*** Selections ***/