diff options
author | Kristian Høgsberg <krh@redhat.com> | 2005-04-05 00:40:58 (GMT) |
---|---|---|
committer | Kristian Høgsberg <krh@src.gnome.org> | 2005-04-05 00:40:58 (GMT) |
commit | 5e6728daa9b09a76f2537f7c848123639165cd70 (patch) | |
tree | 5025ca7e39a8b82ffecf70292de02360cf98973c /shell | |
parent | 0278ffdb57c2e17e33acb52bb5569d746246f671 (diff) |
Make searching work again.
2005-04-04 Kristian Høgsberg <krh@redhat.com>
Make searching work again.
* backend/ev-document.c:
* backend/ev-document.h:
* backend/ev-document-find.c:
* backend/ev-document-find.h: Change EvDocumentIface so we no
longer store the current page or zoom level in the document. The
consequence is that all calls that operate on the current page now
instead take the page number as an extra argument, and all
coordinates are now doubles in document coordinate system.
* pdf/ev-poppler.cc:
* pixbuf/pixbuf-document.c:
* ps/ps-document.c: Update backends accordingly.
Diffstat (limited to 'shell')
-rw-r--r-- | shell/ev-view.c | 84 | ||||
-rw-r--r-- | shell/ev-view.h | 1 | ||||
-rw-r--r-- | shell/ev-window.c | 5 |
3 files changed, 50 insertions, 40 deletions
diff --git a/shell/ev-view.c b/shell/ev-view.c index 29c85f4..2db1317 100644 --- a/shell/ev-view.c +++ b/shell/ev-view.c @@ -18,6 +18,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ +#include <math.h> #include <gtk/gtkalignment.h> #include <glib/gi18n.h> #include <gtk/gtkbindings.h> @@ -94,7 +95,7 @@ struct _EvView { gboolean pressed_button; gboolean has_selection; GdkPoint selection_start; - GdkRectangle selection; + EvRectangle selection; EvViewCursor cursor; GtkAdjustment *hadjustment; @@ -257,27 +258,27 @@ ev_view_get_offsets (EvView *view, int *x_offset, int *y_offset) } static void -view_rect_to_doc_rect (EvView *view, GdkRectangle *view_rect, GdkRectangle *doc_rect) +view_rect_to_doc_rect (EvView *view, GdkRectangle *view_rect, EvRectangle *doc_rect) { int x_offset, y_offset; ev_view_get_offsets (view, &x_offset, &y_offset); - doc_rect->x = (view_rect->x - x_offset) / view->scale; - doc_rect->y = (view_rect->y - y_offset) / view->scale; - doc_rect->width = view_rect->width / view->scale; - doc_rect->height = view_rect->height / view->scale; + doc_rect->x1 = (double) (view_rect->x - x_offset) / view->scale; + doc_rect->y1 = (double) (view_rect->y - y_offset) / view->scale; + doc_rect->x2 = doc_rect->x1 + (double) view_rect->width / view->scale; + doc_rect->y2 = doc_rect->y1 + (double) view_rect->height / view->scale; } static void -doc_rect_to_view_rect (EvView *view, GdkRectangle *doc_rect, GdkRectangle *view_rect) +doc_rect_to_view_rect (EvView *view, EvRectangle *doc_rect, GdkRectangle *view_rect) { int x_offset, y_offset; ev_view_get_offsets (view, &x_offset, &y_offset); - view_rect->x = doc_rect->x * view->scale + x_offset; - view_rect->y = doc_rect->y * view->scale + y_offset; - view_rect->width = doc_rect->width * view->scale; - view_rect->height = doc_rect->height * view->scale; + view_rect->x = floor (doc_rect->x1 * view->scale) + x_offset; + view_rect->y = floor (doc_rect->y1 * view->scale) + y_offset; + view_rect->width = ceil (doc_rect->x2 * view->scale) + x_offset - view_rect->x; + view_rect->height = ceil (doc_rect->y2 * view->scale) + y_offset - view_rect->y; } @@ -436,9 +437,6 @@ draw_rubberband (GtkWidget *widget, GdkWindow *window, GdkPixbuf *pixbuf; GdkColor *fill_color_gdk; guint fill_color; - int x_offset, y_offset; - - ev_view_get_offsets (EV_VIEW (widget), &x_offset, &y_offset); fill_color_gdk = gdk_color_copy (>K_WIDGET (widget)->style->base[GTK_STATE_SELECTED]); fill_color = ev_gdk_color_to_rgb (fill_color_gdk) << 8 | alpha; @@ -449,7 +447,7 @@ draw_rubberband (GtkWidget *widget, GdkWindow *window, gdk_draw_pixbuf (window, NULL, pixbuf, 0, 0, - rect->x + x_offset, rect->y + y_offset, + rect->x, rect->y, rect->width, rect->height, GDK_RGB_DITHER_NONE, 0, 0); @@ -459,7 +457,7 @@ draw_rubberband (GtkWidget *widget, GdkWindow *window, gc = gdk_gc_new (window); gdk_gc_set_rgb_fg_color (gc, fill_color_gdk); gdk_draw_rectangle (window, gc, FALSE, - rect->x + x_offset, rect->y + y_offset, + rect->x, rect->y, rect->width - 1, rect->height - 1); g_object_unref (gc); @@ -478,19 +476,22 @@ highlight_find_results (EvView *view) find = EV_DOCUMENT_FIND (view->document); g_mutex_lock (EV_DOC_MUTEX); - results = ev_document_find_get_n_results (find); + results = ev_document_find_get_n_results (find, view->current_page); g_mutex_unlock (EV_DOC_MUTEX); for (i = 0; i < results; i++) { - GdkRectangle rectangle; + EvRectangle rectangle; + GdkRectangle view_rectangle; guchar alpha; alpha = (i == view->find_result) ? 0x90 : 0x20; g_mutex_lock (EV_DOC_MUTEX); - ev_document_find_get_result (find, i, &rectangle); + ev_document_find_get_result (find, view->current_page, + i, &rectangle); g_mutex_unlock (EV_DOC_MUTEX); + doc_rect_to_view_rect (view, &rectangle, &view_rectangle); draw_rubberband (GTK_WIDGET (view), view->bin_window, - &rectangle, alpha); + &view_rectangle, alpha); } } @@ -617,12 +618,12 @@ void ev_view_copy (EvView *ev_view) { GtkClipboard *clipboard; - GdkRectangle selection; char *text; - doc_rect_to_view_rect (ev_view, &ev_view->selection, &selection); g_mutex_lock (EV_DOC_MUTEX); - text = ev_document_get_text (ev_view->document, &selection); + text = ev_document_get_text (ev_view->document, + ev_view->current_page, + &ev_view->selection); g_mutex_unlock (EV_DOC_MUTEX); clipboard = gtk_widget_get_clipboard (GTK_WIDGET (ev_view), @@ -638,12 +639,12 @@ ev_view_primary_get_cb (GtkClipboard *clipboard, gpointer data) { EvView *ev_view = EV_VIEW (data); - GdkRectangle selection; char *text; - doc_rect_to_view_rect (ev_view, &ev_view->selection, &selection); g_mutex_lock (EV_DOC_MUTEX); - text = ev_document_get_text (ev_view->document, &selection); + text = ev_document_get_text (ev_view->document, + ev_view->current_page, + &ev_view->selection); g_mutex_unlock (EV_DOC_MUTEX); gtk_selection_data_set_text (selection_data, text, -1); } @@ -1207,12 +1208,13 @@ update_find_status_message (EvView *view) char *message; // g_mutex_lock (EV_DOC_MUTEX); - if (ev_document_get_page (view->document) == view->find_page) { + if (view->current_page == view->find_page) { int results; // g_mutex_lock (EV_DOC_MUTEX); results = ev_document_find_get_n_results - (EV_DOCUMENT_FIND (view->document)); + (EV_DOCUMENT_FIND (view->document), + view->current_page); // g_mutex_unlock (EV_DOC_MUTEX); /* TRANS: Sometimes this could be better translated as "%d hit(s) on this page". Therefore this string @@ -1280,20 +1282,22 @@ static void jump_to_find_result (EvView *view) { EvDocumentFind *find = EV_DOCUMENT_FIND (view->document); - GdkRectangle rect; + EvRectangle rect; + GdkRectangle view_rect; int n_results; g_mutex_lock (EV_DOC_MUTEX); - n_results = ev_document_find_get_n_results (find); + n_results = ev_document_find_get_n_results (find, view->current_page); 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); + (find, view->current_page, view->find_result, &rect); g_mutex_unlock (EV_DOC_MUTEX); - ensure_rectangle_is_visible (view, &rect); + doc_rect_to_view_rect (view, &rect, &view_rect); + ensure_rectangle_is_visible (view, &view_rect); } } @@ -1334,12 +1338,8 @@ find_changed_cb (EvDocument *document, int page, EvView *view) jump_to_find_result (view); update_find_status_message (view); -#if 0 - /* FIXME: */ - if (ev_document_get_page (document) == page) { + if (view->current_page == page) gtk_widget_queue_draw (GTK_WIDGET (view)); - } -#endif } /*** Public API ***/ @@ -1443,6 +1443,12 @@ ev_view_set_document (EvView *view, } } +int +ev_view_get_page (EvView *view) +{ + return view->current_page; +} + static void go_to_link (EvView *view, EvLink *link) { @@ -1593,7 +1599,7 @@ ev_view_find_next (EvView *view) page_cache = ev_document_get_page_cache (view->document); g_mutex_lock (EV_DOC_MUTEX); - n_results = ev_document_find_get_n_results (find); + n_results = ev_document_find_get_n_results (find, view->current_page); g_mutex_unlock (EV_DOC_MUTEX); n_pages = ev_page_cache_get_n_pages (page_cache); @@ -1625,7 +1631,7 @@ ev_view_find_previous (EvView *view) page_cache = ev_document_get_page_cache (view->document); g_mutex_lock (EV_DOC_MUTEX); - n_results = ev_document_find_get_n_results (find); + n_results = ev_document_find_get_n_results (find, view->current_page); g_mutex_unlock (EV_DOC_MUTEX); n_pages = ev_page_cache_get_n_pages (page_cache); diff --git a/shell/ev-view.h b/shell/ev-view.h index 00b92ea..8ba79f1 100644 --- a/shell/ev-view.h +++ b/shell/ev-view.h @@ -38,6 +38,7 @@ GType ev_view_get_type (void) G_GNUC_CONST; GtkWidget* ev_view_new (void); void ev_view_set_document (EvView *view, EvDocument *document); +int ev_view_get_page (EvView *view); /* Clipboard */ void ev_view_copy (EvView *view); diff --git a/shell/ev-window.c b/shell/ev-window.c index e606aed..64b072e 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -1876,7 +1876,10 @@ find_bar_search_changed_cb (EggFindBar *find_bar, EV_IS_DOCUMENT_FIND (ev_window->priv->document)) { if (visible && search_string && search_string[0]) { g_mutex_lock (EV_DOC_MUTEX); - ev_document_find_begin (EV_DOCUMENT_FIND (ev_window->priv->document), search_string, case_sensitive); + ev_document_find_begin (EV_DOCUMENT_FIND (ev_window->priv->document), + ev_view_get_page (EV_VIEW (ev_window->priv->view)), + search_string, + case_sensitive); g_mutex_unlock (EV_DOC_MUTEX); } else { g_mutex_lock (EV_DOC_MUTEX); |