X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-view.c;h=757194d7800814c2f8adadf3d918145c5e48f829;hb=2ed9b1cb6b19debdaafdde18f901d9ef18269240;hp=0380e226f4aab36719cfc1d41730fd5bec2f6ef6;hpb=67297a0108ba18a69972c98ee1771c3dad41d55b;p=evince.git diff --git a/shell/ev-view.c b/shell/ev-view.c index 0380e226..757194d7 100644 --- a/shell/ev-view.c +++ b/shell/ev-view.c @@ -206,7 +206,8 @@ static void draw_one_page (EvView gint page, GdkRectangle *page_area, GtkBorder *border, - GdkRectangle *expose_area); + GdkRectangle *expose_area, + gboolean *page_ready); static void draw_loading_text (EvView *view, GdkRectangle *page_area, GdkRectangle *expose_area); @@ -438,7 +439,7 @@ view_update_range_and_current_page (EvView *view) GdkRectangle current_area, unused, page_area; GtkBorder border; gboolean found = FALSE; - gint area_max, area; + gint area_max = -1, area; int i; if (!(view->vadjustment && view->hadjustment)) @@ -1079,22 +1080,20 @@ static void goto_fitr_dest (EvView *view, EvLinkDest *dest) { EvPoint doc_point; - int page; double zoom; zoom = zoom_for_size_best_fit (ev_link_dest_get_right (dest) - ev_link_dest_get_left (dest), - ev_link_dest_get_top (dest) - ev_link_dest_get_bottom (dest), + ev_link_dest_get_bottom (dest) - ev_link_dest_get_top (dest), ev_view_get_width (view), ev_view_get_height (view), 0, 0); ev_view_set_sizing_mode (view, EV_SIZING_FREE); ev_view_set_zoom (view, zoom, FALSE); - page = ev_link_dest_get_page (dest); doc_point.x = ev_link_dest_get_left (dest); doc_point.y = ev_link_dest_get_top (dest); - view->current_page = page; + view->current_page = ev_link_dest_get_page (dest); view->pending_point = doc_point; view->pending_scroll = SCROLL_TO_PAGE_POSITION; @@ -1139,13 +1138,13 @@ goto_fith_dest (EvView *view, EvLinkDest *dest) ev_page_cache_get_size (view->page_cache, page, 0, 1.0, &doc_width, &doc_height); doc_point.x = 0; - doc_point.y = doc_height - ev_link_dest_get_top (dest); + doc_point.y = ev_link_dest_get_top (dest); zoom = zoom_for_size_fit_width (doc_width, ev_link_dest_get_top (dest), ev_view_get_width (view), ev_view_get_height (view), 0); - ev_view_set_sizing_mode (view, EV_SIZING_FREE); + ev_view_set_sizing_mode (view, EV_SIZING_FIT_WIDTH); ev_view_set_zoom (view, zoom, FALSE); view->current_page = page; @@ -1168,7 +1167,7 @@ goto_fit_dest (EvView *view, EvLinkDest *dest) zoom = zoom_for_size_best_fit (doc_width, doc_height, ev_view_get_width (view), ev_view_get_height (view), 0, 0); - ev_view_set_sizing_mode (view, EV_SIZING_FREE); + ev_view_set_sizing_mode (view, EV_SIZING_BEST_FIT); ev_view_set_zoom (view, zoom, FALSE); view->current_page = page; @@ -1181,20 +1180,19 @@ static void goto_xyz_dest (EvView *view, EvLinkDest *dest) { EvPoint doc_point; - int height, page; + gint page; double zoom; zoom = ev_link_dest_get_zoom (dest); page = ev_link_dest_get_page (dest); - ev_page_cache_get_size (view->page_cache, page, 0, 1.0, NULL, &height); - if (zoom != 0) { + if (zoom > 1) { ev_view_set_sizing_mode (view, EV_SIZING_FREE); ev_view_set_zoom (view, zoom, FALSE); } doc_point.x = ev_link_dest_get_left (dest); - doc_point.y = height - ev_link_dest_get_top (dest); + doc_point.y = ev_link_dest_get_top (dest); view->current_page = page; view->pending_point = doc_point; @@ -1236,6 +1234,9 @@ goto_dest (EvView *view, EvLinkDest *dest) case EV_LINK_DEST_TYPE_XYZ: goto_xyz_dest (view, dest); break; + case EV_LINK_DEST_TYPE_PAGE_LABEL: + ev_page_cache_set_page_label (view->page_cache, ev_link_dest_get_page_label (dest)); + break; default: g_assert_not_reached (); } @@ -1289,6 +1290,7 @@ ev_view_handle_link (EvView *view, EvLink *link) case EV_LINK_ACTION_TYPE_GOTO_REMOTE: case EV_LINK_ACTION_TYPE_EXTERNAL_URI: case EV_LINK_ACTION_TYPE_LAUNCH: + case EV_LINK_ACTION_TYPE_NAMED: g_signal_emit (view, signals[SIGNAL_EXTERNAL_LINK], 0, action); break; } @@ -1326,6 +1328,28 @@ page_label_from_dest (EvView *view, EvLinkDest *dest) return msg; } +static char * +tip_from_action_named (EvLinkAction *action) +{ + const gchar *name = ev_link_action_get_name (action); + + if (g_ascii_strcasecmp (name, "FirstPage") == 0) { + return g_strdup (_("Go to first page")); + } else if (g_ascii_strcasecmp (name, "PrevPage") == 0) { + return g_strdup (_("Go to previous page")); + } else if (g_ascii_strcasecmp (name, "NextPage") == 0) { + return g_strdup (_("Go to next page")); + } else if (g_ascii_strcasecmp (name, "LastPage") == 0) { + return g_strdup (_("Go to last page")); + } else if (g_ascii_strcasecmp (name, "GoToPage") == 0) { + return g_strdup (_("Go to page")); + } else if (g_ascii_strcasecmp (name, "Find") == 0) { + return g_strdup (_("Find")); + } + + return NULL; +} + static char * tip_from_link (EvView *view, EvLink *link) { @@ -1352,10 +1376,10 @@ tip_from_link (EvView *view, EvLink *link) break; case EV_LINK_ACTION_TYPE_GOTO_REMOTE: if (title) { - msg = g_strdup_printf (_("Go to %s on file %s"), title, + msg = g_strdup_printf (_("Go to %s on file “%s”"), title, ev_link_action_get_filename (action)); } else { - msg = g_strdup_printf (_("Go to file %s"), + msg = g_strdup_printf (_("Go to file “%s”"), ev_link_action_get_filename (action)); } @@ -1367,6 +1391,9 @@ tip_from_link (EvView *view, EvLink *link) msg = g_strdup_printf (_("Launch %s"), ev_link_action_get_filename (action)); break; + case EV_LINK_ACTION_TYPE_NAMED: + msg = tip_from_action_named (action); + break; default: if (title) msg = g_strdup (title); @@ -1735,6 +1762,7 @@ ev_view_expose_event (GtkWidget *widget, for (i = view->start_page; i <= view->end_page; i++) { GdkRectangle page_area; GtkBorder border; + gboolean page_ready = TRUE; if (!get_page_extents (view, i, &page_area, &border)) continue; @@ -1742,9 +1770,9 @@ ev_view_expose_event (GtkWidget *widget, page_area.x -= view->scroll_x; page_area.y -= view->scroll_y; - draw_one_page (view, i, &page_area, &border, &(event->area)); + draw_one_page (view, i, &page_area, &border, &(event->area), &page_ready); - if (EV_IS_DOCUMENT_FIND (view->document)) + if (page_ready && EV_IS_DOCUMENT_FIND (view->document)) highlight_find_results (view, i); } @@ -2238,7 +2266,8 @@ draw_one_page (EvView *view, gint page, GdkRectangle *page_area, GtkBorder *border, - GdkRectangle *expose_area) + GdkRectangle *expose_area, + gboolean *page_ready) { gint width, height; GdkPixbuf *current_pixbuf; @@ -2248,7 +2277,7 @@ draw_one_page (EvView *view, gint current_page; g_assert (view->document); - + if (! gdk_rectangle_intersect (page_area, expose_area, &overlap)) return; @@ -2265,6 +2294,7 @@ draw_one_page (EvView *view, real_page_area.y += border->top; real_page_area.width -= (border->left + border->right); real_page_area.height -= (border->top + border->bottom); + *page_ready = TRUE; ev_document_misc_paint_one_page (GTK_WIDGET(view)->window, GTK_WIDGET (view), @@ -2324,6 +2354,7 @@ draw_one_page (EvView *view, draw_loading_text (view, &real_page_area, expose_area); + *page_ready = FALSE; } if (scaled_selection) { @@ -2375,6 +2406,7 @@ ev_view_destroy (GtkObject *object) if (view->link_tooltip) { gtk_widget_destroy (view->link_tooltip); + view->link_tooltip = NULL; } if (view->selection_scroll_id) { @@ -4098,6 +4130,9 @@ ev_view_next_page (EvView *view) int page; g_return_val_if_fail (EV_IS_VIEW (view), FALSE); + + if (!view->page_cache) + return FALSE; page = ev_page_cache_get_current_page (view->page_cache); @@ -4124,6 +4159,9 @@ ev_view_previous_page (EvView *view) g_return_val_if_fail (EV_IS_VIEW (view), FALSE); + if (!view->page_cache) + return FALSE; + page = ev_page_cache_get_current_page (view->page_cache); if (view->dual_page && !view->presentation)