X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-view.c;h=51c7bb2085fdee38221b32ebb68f3d18d336d241;hb=a92004b77fc73fe7ac2a781b5207249b2288b8c9;hp=4e5db8b18b11ec5b4808e8c581c7abafb503fa1c;hpb=a521d16eb7f59cbda6881b66e0e7a00125377cd8;p=evince.git diff --git a/shell/ev-view.c b/shell/ev-view.c index 4e5db8b1..51c7bb20 100644 --- a/shell/ev-view.c +++ b/shell/ev-view.c @@ -29,6 +29,7 @@ #include "ev-marshal.h" #include "ev-view.h" #include "ev-document-find.h" +#include "ev-debug.h" #define EV_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EV_TYPE_VIEW, EvViewClass)) #define EV_IS_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EV_TYPE_VIEW)) @@ -182,6 +183,8 @@ ev_view_finalize (GObject *object) { EvView *view = EV_VIEW (object); + LOG ("Finalize") + if (view->document) g_object_unref (view->document); @@ -209,6 +212,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 +332,7 @@ ev_gdk_color_to_rgb (const GdkColor *color) static void draw_rubberband (GtkWidget *widget, GdkWindow *window, - const GdkRectangle *rect, gboolean dark) + const GdkRectangle *rect, guchar alpha) { GdkGC *gc; GdkPixbuf *pixbuf; @@ -336,8 +340,7 @@ draw_rubberband (GtkWidget *widget, GdkWindow *window, 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 | - (dark ? 0x90 : 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); @@ -373,12 +376,12 @@ highlight_find_results (EvView *view) for (i = 0; i < results; i++) { GdkRectangle rectangle; - gboolean current; + guchar alpha; - current = (i == view->find_result); + alpha = (i == view->find_result) ? 0x90 : 0x20; ev_document_find_get_result (find, i, &rectangle); draw_rubberband (GTK_WIDGET (view), view->bin_window, - &rectangle, current); + &rectangle, alpha); } } @@ -408,15 +411,20 @@ expose_bin_window (GtkWidget *widget, x_offset + 1, y_offset + 1); + LOG ("Render area %d %d %d %d", event->area.x, event->area.y, + event->area.width, event->area.height) + ev_document_render (view->document, 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, FALSE); + &view->selection, 0x40); } } @@ -629,6 +637,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; @@ -650,8 +660,6 @@ ev_view_motion_notify_event (GtkWidget *widget, } } - gtk_widget_queue_draw (widget); - return TRUE; } @@ -909,36 +917,53 @@ ev_view_init (EvView *view) view->cursor = EV_VIEW_CURSOR_NORMAL; } -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 -set_document_page (EvView *view, int page) +set_document_page (EvView *view, int new_page) { + int page; + int pages; + + pages = ev_document_get_n_pages (view->document); + page = CLAMP (new_page, 1, pages); + 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) { @@ -953,13 +978,21 @@ set_document_page (EvView *view, int page) 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; + + if (EV_IS_DOCUMENT_FIND (view->document)) { + update_find_status_message (view); + } } } @@ -1000,11 +1033,17 @@ ensure_rectangle_is_visible (EvView *view, GdkRectangle *rect) static void jump_to_find_result (EvView *view) { + EvDocumentFind *find = EV_DOCUMENT_FIND (view->document); GdkRectangle rect; + int n_results; + + n_results = ev_document_find_get_n_results (find); - ev_document_find_get_result (EV_DOCUMENT_FIND (view->document), - view->find_result, &rect); - ensure_rectangle_is_visible (view, &rect); + if (n_results > view->find_result) { + ev_document_find_get_result + (find, view->find_result, &rect); + ensure_rectangle_is_visible (view, &rect); + } } static void @@ -1041,8 +1080,7 @@ find_changed_cb (EvDocument *document, int page, EvView *view) { jump_to_find_page (view); jump_to_find_result (view); - - g_print ("Update for page %d\n", page); + update_find_status_message (view); if (ev_document_get_page (document) == page) { gtk_widget_queue_draw (GTK_WIDGET (view)); @@ -1073,9 +1111,8 @@ ev_view_set_document (EvView *view, if (document != view->document) { if (view->document) { - g_signal_handlers_disconnect_by_func (view->document, - find_changed_cb, - view); + g_signal_handlers_disconnect_by_func + (view->document, find_changed_cb, view); g_object_unref (view->document); } @@ -1085,11 +1122,12 @@ ev_view_set_document (EvView *view, if (view->document) { g_object_ref (view->document); - if (EV_IS_DOCUMENT_FIND (view->document)) + if (EV_IS_DOCUMENT_FIND (view->document)) { g_signal_connect (view->document, "find_changed", G_CALLBACK (find_changed_cb), view); + } g_signal_connect (view->document, "changed", G_CALLBACK (document_changed_callback), @@ -1202,7 +1240,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) { @@ -1224,7 +1262,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)