X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=shell%2Fev-view.c;h=eb8f3292455d8e56dfa2552c918481c0d26bbaa2;hb=30668ba1c42ab4facb9794e7706bec3ace58725f;hp=311504b147e4116a9e6b844ad92bfbbe709d11d6;hpb=eb3d8c8e3df570e32e2591eeb650de55dba2f613;p=evince.git diff --git a/shell/ev-view.c b/shell/ev-view.c index 311504b1..eb8f3292 100644 --- a/shell/ev-view.c +++ b/shell/ev-view.c @@ -113,10 +113,8 @@ static void ev_view_set_scroll_adjustments (EvView GtkAdjustment *vadjustment); static void add_scroll_binding_keypad (GtkBindingSet *binding_set, guint keyval, - GtkScrollType scroll, - gboolean horizontal); -static void ev_view_binding_activated (EvView *view, - GtkScrollType scroll, + GdkModifierType modifiers, + EvScrollType scroll, gboolean horizontal); static void ensure_rectangle_is_visible (EvView *view, GdkRectangle *rect); @@ -208,6 +206,9 @@ static void draw_one_page (EvView GdkRectangle *page_area, GtkBorder *border, GdkRectangle *expose_area); +static void draw_loading_text (EvView *view, + GdkRectangle *page_area, + GdkRectangle *expose_area); /*** Callbacks ***/ static void find_changed_cb (EvDocument *document, @@ -283,13 +284,15 @@ static void ev_view_set_cursor (EvView /*** Status messages ***/ static void ev_view_set_status (EvView *view, const char *message); -static void update_find_status_message (EvView *view); +static void update_find_status_message (EvView *view, + gboolean this_page); static void ev_view_set_find_status (EvView *view, const char *message); /*** Find ***/ static void jump_to_find_result (EvView *view); static void jump_to_find_page (EvView *view, - EvViewFindDirection direction); + EvViewFindDirection direction, + gint shift); /*** Selection ***/ static void compute_selections (EvView *view, @@ -461,14 +464,14 @@ view_update_range_and_current_page (EvView *view) } else { if (view->dual_page) { - if (view->current_page % 2 == DUAL_EVEN_LEFT) { + if (view->current_page % 2 == ev_page_cache_get_dual_even_left (view->page_cache)) { view->start_page = view->current_page; if (view->current_page + 1 < ev_page_cache_get_n_pages (view->page_cache)) view->end_page = view->start_page + 1; else view->end_page = view->start_page; } else { - if (view->current_page - 1 < 0) + if (view->current_page < 1) view->start_page = view->current_page; else view->start_page = view->current_page - 1; @@ -541,32 +544,52 @@ ev_view_set_scroll_adjustments (EvView *view, static void add_scroll_binding_keypad (GtkBindingSet *binding_set, guint keyval, - GtkScrollType scroll, + GdkModifierType modifiers, + EvScrollType scroll, gboolean horizontal) { guint keypad_keyval = keyval - GDK_Left + GDK_KP_Left; - gtk_binding_entry_add_signal (binding_set, keyval, 0, + gtk_binding_entry_add_signal (binding_set, keyval, modifiers, "binding_activated", 2, - GTK_TYPE_SCROLL_TYPE, scroll, + EV_TYPE_SCROLL_TYPE, scroll, G_TYPE_BOOLEAN, horizontal); - gtk_binding_entry_add_signal (binding_set, keypad_keyval, 0, + gtk_binding_entry_add_signal (binding_set, keypad_keyval, modifiers, "binding_activated", 2, - GTK_TYPE_SCROLL_TYPE, scroll, + EV_TYPE_SCROLL_TYPE, scroll, G_TYPE_BOOLEAN, horizontal); } void ev_view_scroll (EvView *view, - EvScrollType scroll) + EvScrollType scroll, + gboolean horizontal) { GtkAdjustment *adjustment; double value, increment; gboolean first_page = FALSE; gboolean last_page = FALSE; + view->jump_to_find_result = FALSE; + + if (view->presentation) { + switch (scroll) { + case EV_SCROLL_PAGE_BACKWARD: + case EV_SCROLL_STEP_BACKWARD: + ev_view_previous_page (view); + break; + case EV_SCROLL_PAGE_FORWARD: + case EV_SCROLL_STEP_FORWARD: + ev_view_next_page (view); + break; + default: + break; + } + return; + } + /* Assign values for increment and vertical adjustment */ - adjustment = view->vadjustment; + adjustment = horizontal ? view->hadjustment : view->vadjustment; increment = adjustment->page_size * 0.75; value = adjustment->value; @@ -603,58 +626,27 @@ ev_view_scroll (EvView *view, value = MIN (value + increment, adjustment->upper - adjustment->page_size); } break; - default: - break; - } - - gtk_adjustment_set_value (adjustment, value); -} - -static void -ev_view_binding_activated (EvView *view, - GtkScrollType scroll, - gboolean horizontal) -{ - GtkAdjustment *adjustment; - double value; - - if (view->presentation) { - switch (scroll) { - case GTK_SCROLL_STEP_BACKWARD: - ev_view_previous_page (view); - break; - case GTK_SCROLL_STEP_FORWARD: - ev_view_next_page (view); - break; - default: - break; - } - return; - } - - if (horizontal) { - adjustment = view->hadjustment; - } else { - adjustment = view->vadjustment; - } - - value = adjustment->value; - - switch (scroll) { - case GTK_SCROLL_STEP_BACKWARD: + case EV_SCROLL_STEP_BACKWARD: value -= adjustment->step_increment; break; - case GTK_SCROLL_STEP_FORWARD: + case EV_SCROLL_STEP_FORWARD: value += adjustment->step_increment; break; - default: + case EV_SCROLL_STEP_DOWN: + value -= adjustment->step_increment / 10; + break; + case EV_SCROLL_STEP_UP: + value += adjustment->step_increment / 10; + break; + default: break; } value = CLAMP (value, adjustment->lower, - adjustment->upper - adjustment->page_size); + adjustment->upper - adjustment->page_size); gtk_adjustment_set_value (adjustment, value); + } #define MARGIN 5 @@ -723,7 +715,7 @@ get_page_y_offset (EvView *view, int page, double zoom, int *y_offset) if (view->dual_page) { ev_page_cache_get_height_to_page (view->page_cache, page, view->rotation, zoom, NULL, &offset); - offset += ((page + DUAL_EVEN_LEFT) / 2 + 1) * view->spacing + ((page + DUAL_EVEN_LEFT) / 2 ) * (border.top + border.bottom); + offset += ((page + ev_page_cache_get_dual_even_left (view->page_cache)) / 2 + 1) * view->spacing + ((page + ev_page_cache_get_dual_even_left (view->page_cache)) / 2 ) * (border.top + border.bottom); } else { ev_page_cache_get_height_to_page (view->page_cache, page, view->rotation, zoom, &offset, NULL); @@ -766,9 +758,9 @@ get_page_extents (EvView *view, max_width = max_width + border->left + border->right; /* Get the location of the bounding box */ if (view->dual_page) { - x = view->spacing + ((page % 2 == DUAL_EVEN_LEFT) ? 0 : 1) * (max_width + view->spacing); + x = view->spacing + ((page % 2 == ev_page_cache_get_dual_even_left (view->page_cache)) ? 0 : 1) * (max_width + view->spacing); x = x + MAX (0, widget->allocation.width - (max_width * 2 + view->spacing * 3)) / 2; - if (page % 2 == DUAL_EVEN_LEFT) + if (page % 2 == ev_page_cache_get_dual_even_left (view->page_cache)) x = x + (max_width - width - border->left - border->right); } else { x = view->spacing; @@ -788,7 +780,7 @@ get_page_extents (EvView *view, GtkBorder overall_border; gint other_page; - other_page = (page % 2 == DUAL_EVEN_LEFT) ? page + 1: page - 1; + other_page = (page % 2 == ev_page_cache_get_dual_even_left (view->page_cache)) ? page + 1: page - 1; /* First, we get the bounding box of the two pages */ if (other_page < ev_page_cache_get_n_pages (view->page_cache) @@ -810,7 +802,7 @@ get_page_extents (EvView *view, y = view->spacing; /* Adjust for being the left or right page */ - if (page % 2 == DUAL_EVEN_LEFT) + if (page % 2 == ev_page_cache_get_dual_even_left (view->page_cache)) x = x + max_width - width; else x = x + (max_width + overall_border.left + overall_border.right) + view->spacing; @@ -1553,6 +1545,7 @@ ev_view_scroll_event (GtkWidget *widget, GdkEventScroll *event) return TRUE; } + view->jump_to_find_result = FALSE; /* Shift+Wheel scrolls the in the perpendicular direction */ if (state & GDK_SHIFT_MASK) { if (event->direction == GDK_SCROLL_UP) @@ -1611,6 +1604,17 @@ ev_view_expose_event (GtkWidget *widget, EvView *view = EV_VIEW (widget); int i; + if (view->loading) { + GdkRectangle area = {0}; + + area.width = widget->allocation.width; + area.height = widget->allocation.height; + + draw_loading_text (view, + &area, + &(event->area)); + } + if (view->document == NULL) return FALSE; @@ -2057,7 +2061,7 @@ highlight_find_results (EvView *view, int page) GdkRectangle view_rectangle; guchar alpha; - if (i == view->find_result && page == view->find_page) { + if (i == view->find_result && page == view->current_page) { alpha = 0x90; } else { alpha = 0x20; @@ -2127,11 +2131,14 @@ draw_one_page (EvView *view, GdkRectangle overlap; GdkRectangle real_page_area; EvViewSelection *selection; + gint current_page; g_assert (view->document); + if (! gdk_rectangle_intersect (page_area, expose_area, &overlap)) return; - + + current_page = ev_page_cache_get_current_page (view->page_cache); selection = find_selection_for_page (view, page); ev_page_cache_get_size (view->page_cache, page, view->rotation, @@ -2147,7 +2154,8 @@ draw_one_page (EvView *view, ev_document_misc_paint_one_page (GTK_WIDGET(view)->window, GTK_WIDGET (view), - page_area, border); + page_area, border, + page == current_page); if (gdk_rectangle_intersect (&real_page_area, expose_area, &overlap)) { GdkPixbuf *selection_pixbuf = NULL; @@ -2414,7 +2422,7 @@ ev_view_class_init (EvViewClass *class) gtk_object_class->destroy = ev_view_destroy; class->set_scroll_adjustments = ev_view_set_scroll_adjustments; - class->binding_activated = ev_view_binding_activated; + class->binding_activated = ev_view_scroll; widget_class->set_scroll_adjustments_signal = g_signal_new ("set-scroll-adjustments", @@ -2544,10 +2552,14 @@ ev_view_class_init (EvViewClass *class) binding_set = gtk_binding_set_by_class (class); - add_scroll_binding_keypad (binding_set, GDK_Left, GTK_SCROLL_STEP_BACKWARD, TRUE); - add_scroll_binding_keypad (binding_set, GDK_Right, GTK_SCROLL_STEP_FORWARD, TRUE); - add_scroll_binding_keypad (binding_set, GDK_Up, GTK_SCROLL_STEP_BACKWARD, FALSE); - add_scroll_binding_keypad (binding_set, GDK_Down, GTK_SCROLL_STEP_FORWARD, FALSE); + add_scroll_binding_keypad (binding_set, GDK_Left, 0, EV_SCROLL_STEP_BACKWARD, TRUE); + add_scroll_binding_keypad (binding_set, GDK_Right, 0, EV_SCROLL_STEP_FORWARD, TRUE); + add_scroll_binding_keypad (binding_set, GDK_Left, GDK_MOD1_MASK, EV_SCROLL_STEP_DOWN, TRUE); + add_scroll_binding_keypad (binding_set, GDK_Right, GDK_MOD1_MASK, EV_SCROLL_STEP_UP, TRUE); + add_scroll_binding_keypad (binding_set, GDK_Up, 0, EV_SCROLL_STEP_BACKWARD, FALSE); + add_scroll_binding_keypad (binding_set, GDK_Down, 0, EV_SCROLL_STEP_FORWARD, FALSE); + add_scroll_binding_keypad (binding_set, GDK_Up, GDK_MOD1_MASK, EV_SCROLL_STEP_DOWN, FALSE); + add_scroll_binding_keypad (binding_set, GDK_Down, GDK_MOD1_MASK, EV_SCROLL_STEP_UP, FALSE); } static void @@ -2571,6 +2583,7 @@ ev_view_init (EvView *view) view->fullscreen = FALSE; view->sizing_mode = EV_SIZING_FIT_WIDTH; view->pending_scroll = SCROLL_TO_KEEP_POSITION; + view->jump_to_find_result = TRUE; } /*** Callbacks ***/ @@ -2578,10 +2591,18 @@ ev_view_init (EvView *view) static void find_changed_cb (EvDocument *document, int page, EvView *view) { - jump_to_find_page (view, EV_VIEW_FIND_NEXT); - jump_to_find_result (view); - update_find_status_message (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)); } @@ -2599,16 +2620,16 @@ page_changed_cb (EvPageCache *page_cache, EvView *view) { if (view->current_page != new_page) { - view->current_page = new_page; view->pending_scroll = SCROLL_TO_PAGE_POSITION; gtk_widget_queue_resize (GTK_WIDGET (view)); + } else { + gtk_widget_queue_draw (GTK_WIDGET (view)); + } - if (EV_IS_DOCUMENT_FIND (view->document)) { - view->find_page = new_page; - view->find_result = 0; - update_find_status_message (view); - } + if (EV_IS_DOCUMENT_FIND (view->document)) { + view->find_result = 0; + update_find_status_message (view, TRUE); } } @@ -2677,12 +2698,22 @@ clear_caches (EvView *view) } } +void +ev_view_set_loading (EvView *view, + gboolean loading) +{ + view->loading = loading; + gtk_widget_queue_draw (GTK_WIDGET (view)); +} + void ev_view_set_document (EvView *view, EvDocument *document) { g_return_if_fail (EV_IS_VIEW (view)); + view->loading = FALSE; + if (document != view->document) { clear_caches (view); @@ -2696,7 +2727,6 @@ ev_view_set_document (EvView *view, } view->document = document; - view->find_page = 0; view->find_result = 0; if (view->document) { @@ -3245,11 +3275,11 @@ ev_view_set_status (EvView *view, const char *message) } static void -update_find_status_message (EvView *view) +update_find_status_message (EvView *view, gboolean this_page) { char *message; - if (view->current_page == view->find_page) { + if (this_page) { int results; results = ev_document_find_get_n_results @@ -3267,13 +3297,9 @@ update_find_status_message (EvView *view) percent = ev_document_find_get_progress (EV_DOCUMENT_FIND (view->document)); - if (percent >= (1.0 - 1e-10)) { - message = g_strdup (_("Not found")); - } else { - message = g_strdup_printf (_("%3d%% remaining to search"), - (int) ((1.0 - percent) * 100)); - } - + message = g_strdup_printf (_("%3d%% remaining to search"), + (int) ((1.0 - percent) * 100)); + } ev_view_set_find_status (view, message); g_free (message); @@ -3306,7 +3332,7 @@ jump_to_find_result (EvView *view) EvRectangle rect; GdkRectangle view_rect; int n_results; - int page = view->find_page; + int page = view->current_page; n_results = ev_document_find_get_n_results (find, page); @@ -3319,8 +3345,18 @@ jump_to_find_result (EvView *view) } } +/** + * jump_to_find_page + * @view: #EvView instance + * @direction: Direction to look + * @shift: Shift from current page + * + * Jumps to the first page that has occurences of searched word. + * Uses a direction where to look and a shift from current page. + * + */ static void -jump_to_find_page (EvView *view, EvViewFindDirection direction) +jump_to_find_page (EvView *view, EvViewFindDirection direction, gint shift) { int n_pages, i; @@ -3331,11 +3367,11 @@ jump_to_find_page (EvView *view, EvViewFindDirection direction) int page; if (direction == EV_VIEW_FIND_NEXT) - page = view->find_page + i; + page = view->current_page + i; else - page = view->find_page - i; - - + page = view->current_page - i; + page += shift; + if (page >= n_pages) { page = page - n_pages; } @@ -3345,7 +3381,6 @@ jump_to_find_page (EvView *view, EvViewFindDirection direction) 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) { ev_page_cache_set_current_page (view->page_cache, page); @@ -3387,12 +3422,7 @@ ev_view_find_next (EvView *view) if (view->find_result >= n_results) { view->find_result = 0; - view->find_page++; - if (view->find_page >= n_pages) { - view->find_page = 0; - } - - jump_to_find_page (view, EV_VIEW_FIND_NEXT); + jump_to_find_page (view, EV_VIEW_FIND_NEXT, 1); jump_to_find_result (view); } else { jump_to_find_result (view); @@ -3400,6 +3430,23 @@ 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) { @@ -3417,12 +3464,7 @@ ev_view_find_previous (EvView *view) if (view->find_result < 0) { - view->find_page--; - if (view->find_page < 0) { - view->find_page = n_pages - 1; - } - - jump_to_find_page (view, EV_VIEW_FIND_PREV); + jump_to_find_page (view, EV_VIEW_FIND_PREV, -1); view->find_result = ev_document_find_get_n_results (find, view->current_page) - 1; jump_to_find_result (view); } else { @@ -3431,6 +3473,12 @@ ev_view_find_previous (EvView *view) } } +void ev_view_search_changed (EvView *view) +{ + /* search string has changed, focus on new search result */ + view->jump_to_find_result = TRUE; +} + /*** Selections ***/ /* compute_new_selection_rect/text calculates the area currently selected by @@ -3940,7 +3988,11 @@ ev_view_next_page (EvView *view) g_return_val_if_fail (EV_IS_VIEW (view), FALSE); page = ev_page_cache_get_current_page (view->page_cache); - page = ev_view_get_dual_page (view) ? page + 2 : page + 1; + + if (view->dual_page && !view->presentation) + page = page + 2; + else + page = page + 1; if (page < ev_page_cache_get_n_pages (view->page_cache)) { ev_page_cache_set_current_page (view->page_cache, page); @@ -3961,7 +4013,11 @@ ev_view_previous_page (EvView *view) g_return_val_if_fail (EV_IS_VIEW (view), FALSE); page = ev_page_cache_get_current_page (view->page_cache); - page = ev_view_get_dual_page (view) ? page - 2 : page - 1; + + if (view->dual_page && !view->presentation) + page = page - 2; + else + page = page - 1; if (page >= 0) { ev_page_cache_set_current_page (view->page_cache, page); @@ -3991,3 +4047,22 @@ ev_sizing_mode_get_type (void) } return etype; } + +GType +ev_scroll_type_get_type (void) +{ + static GType etype = 0; + if (etype == 0) { + static const GEnumValue values[] = { + { EV_SCROLL_PAGE_FORWARD, "EV_SCROLL_PAGE_FORWARD", "scroll-page-forward" }, + { EV_SCROLL_PAGE_BACKWARD, "EV_SCROLL_PAGE_BACKWARD", "scroll-page-backward" }, + { EV_SCROLL_STEP_FORWARD, "EV_SCROLL_STEP_FORWARD", "scroll-step-forward" }, + { EV_SCROLL_STEP_FORWARD, "EV_SCROLL_STEP_FORWARD", "scroll-step-forward" }, + { EV_SCROLL_STEP_UP, "EV_SCROLL_STEP_UP", "scroll-step-up" }, + { EV_SCROLL_STEP_DOWN, "EV_SCROLL_STEP_DOWN", "scroll-step-down" }, + { 0, NULL, NULL } + }; + etype = g_enum_register_static ("EvScrollType", values); + } + return etype; +}