X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-view.c;h=a5fc7ce636a351d9f9bd6420cd724be0e706ddf2;hb=8dbcee6be49013edc9821096288e2c078169e349;hp=79bb2dde0a2bca35f9a1d1a537322121c5db1075;hpb=ae6a79781ff5126c19c84570277376f43158ec86;p=evince.git diff --git a/shell/ev-view.c b/shell/ev-view.c index 79bb2dde..a5fc7ce6 100644 --- a/shell/ev-view.c +++ b/shell/ev-view.c @@ -83,9 +83,8 @@ struct _EvView { GtkAdjustment *hadjustment; GtkAdjustment *vadjustment; - int results_on_this_page; - int next_page_with_result; - double find_percent_complete; + int find_page; + int find_result; double scale; }; @@ -210,6 +209,7 @@ ev_view_size_request (GtkWidget *widget, if (GTK_WIDGET_REALIZED (widget)) { if (view->document) { ev_document_get_page_size (view->document, + -1, &requisition->width, &requisition->height); } else { @@ -328,7 +328,8 @@ ev_gdk_color_to_rgb (const GdkColor *color) } static void -draw_rubberband (GtkWidget *widget, GdkWindow *window, const GdkRectangle *rect) +draw_rubberband (GtkWidget *widget, GdkWindow *window, + const GdkRectangle *rect, guchar alpha) { GdkGC *gc; GdkPixbuf *pixbuf; @@ -336,7 +337,7 @@ draw_rubberband (GtkWidget *widget, GdkWindow *window, const GdkRectangle *rect) guint fill_color; 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 | 0x40; + fill_color = ev_gdk_color_to_rgb (fill_color_gdk) << 8 | alpha; pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, rect->width, rect->height); @@ -372,10 +373,12 @@ highlight_find_results (EvView *view) for (i = 0; i < results; i++) { GdkRectangle rectangle; + guchar alpha; + alpha = (i == view->find_result) ? 0x90 : 0x20; ev_document_find_get_result (find, i, &rectangle); - draw_rubberband (GTK_WIDGET (view), - view->bin_window, &rectangle); + draw_rubberband (GTK_WIDGET (view), view->bin_window, + &rectangle, alpha); } } @@ -409,10 +412,13 @@ expose_bin_window (GtkWidget *widget, event->area.x, event->area.y, event->area.width, event->area.height); - highlight_find_results (view); + if (EV_IS_DOCUMENT_FIND (view->document)) { + highlight_find_results (view); + } if (view->has_selection) { - draw_rubberband (widget, view->bin_window, &view->selection); + draw_rubberband (widget, view->bin_window, + &view->selection, 0x40); } } @@ -625,6 +631,8 @@ ev_view_motion_notify_event (GtkWidget *widget, view->selection.y = MIN (view->selection_start.y, event->y); view->selection.width = ABS (view->selection_start.x - event->x) + 1; view->selection.height = ABS (view->selection_start.y - event->y) + 1; + + gtk_widget_queue_draw (widget); } else if (view->document) { EvLink *link; @@ -646,8 +654,6 @@ ev_view_motion_notify_event (GtkWidget *widget, } } - gtk_widget_queue_draw (widget); - return TRUE; } @@ -903,36 +909,161 @@ ev_view_init (EvView *view) view->scale = 1.0; view->pressed_button = -1; view->cursor = EV_VIEW_CURSOR_NORMAL; - view->results_on_this_page = 0; - view->next_page_with_result = 0; } -static char * -ev_view_get_find_status_message (EvView *view) +static void +update_find_status_message (EvView *view) { -/* - if (view->find_results->len == 0) { - if (view->find_percent_complete >= (1.0 - 1e-10)) { - return g_strdup (_("Not found")); + char *message; + + if (ev_document_get_page (view->document) == view->find_page) { + int results; + + results = ev_document_find_get_n_results + (EV_DOCUMENT_FIND (view->document)); + + message = g_strdup_printf (_("%d found on this page"), + results); + } else { + double percent; + + percent = ev_document_find_get_progress + (EV_DOCUMENT_FIND (view->document)); + + if (percent >= (1.0 - 1e-10)) { + message = g_strdup (_("Not found")); } else { - return g_strdup_printf (_("%3d%% remaining to search"), - (int) ((1.0 - view->find_percent_complete) * 100)); + message = g_strdup_printf (_("%3d%% remaining to search"), + (int) ((1.0 - percent) * 100)); } - } else if (view->results_on_this_page == 0) { - g_assert (view->next_page_with_result != 0); - return g_strdup_printf (_("Found on page %d"), - view->next_page_with_result); - } else { - return g_strdup_printf (_("%d found on this page"), - view->results_on_this_page); + } -*/ + + ev_view_set_find_status (view, message); + g_free (message); } static void -find_changed_cb (EvDocument *document, EvView *view) +set_document_page (EvView *view, int page) { - gtk_widget_queue_draw (GTK_WIDGET (view)); + 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)); + } } static void @@ -966,6 +1097,8 @@ ev_view_set_document (EvView *view, } view->document = document; + view->find_page = 1; + view->find_result = 0; if (view->document) { g_object_ref (view->document); @@ -989,35 +1122,6 @@ ev_view_set_document (EvView *view, } } -static void -set_document_page (EvView *view, int page) -{ - if (view->document) { - int old_page = ev_document_get_page (view->document); - int old_width, old_height; - - ev_document_get_page_size (view->document, - &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, - &width, &height); - if (width != old_width || height != old_height) - gtk_widget_queue_resize (GTK_WIDGET (view)); - } - } -} - static void go_to_link (EvView *view, EvLink *link) { @@ -1115,7 +1219,7 @@ ev_view_best_fit (EvView *view) int width, height; width = height = 0; - ev_document_get_page_size (view->document, &width, &height); + ev_document_get_page_size (view->document, -1, &width, &height); scale = 1.0; if (width != 0 && height != 0) { @@ -1137,7 +1241,7 @@ ev_view_fit_width (EvView *view) int width; width = 0; - ev_document_get_page_size (view->document, &width, NULL); + ev_document_get_page_size (view->document, -1, &width, NULL); scale = 1.0; if (width != 0) @@ -1162,4 +1266,54 @@ ev_view_get_find_status (EvView *view) return view->find_status; } +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); + n_pages = ev_document_get_n_pages (view->document); + + view->find_result++; + + if (view->find_result >= n_results) { + view->find_result = 0; + view->find_page++; + + if (view->find_page > n_pages) { + view->find_page = 1; + } + jump_to_find_page (view); + } else { + jump_to_find_result (view); + gtk_widget_queue_draw (GTK_WIDGET (view)); + } +} + +void +ev_view_find_previous (EvView *view) +{ + int n_results, n_pages; + EvDocumentFind *find = EV_DOCUMENT_FIND (view->document); + + n_results = ev_document_find_get_n_results (find); + n_pages = ev_document_get_n_pages (view->document); + + view->find_result--; + + if (view->find_result < 0) { + view->find_result = 0; + view->find_page--; + + if (view->find_page < 1) { + view->find_page = n_pages; + } + + jump_to_find_page (view); + } else { + jump_to_find_result (view); + gtk_widget_queue_draw (GTK_WIDGET (view)); + } +}