From b9aef17e3af39e3b9364a3e2a8d7fa56d735fc4c Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Mon, 19 Sep 2005 14:34:15 +0000 Subject: [PATCH] Implement FIT and FITH links 2005-09-19 Marco Pesenti Gritti * backend/ev-link.c: (ev_link_type_get_type), (ev_link_new_page_xyz), (ev_link_new_page_fit), (ev_link_new_page_fith): * backend/ev-link.h: * pdf/ev-poppler.cc: * shell/ev-view.c: (goto_fith_link), (ev_view_goto_link): Implement FIT and FITH links --- ChangeLog | 11 +++++++++++ backend/ev-link.c | 26 ++++++++++++++++++++++++++ backend/ev-link.h | 7 +++++++ pdf/ev-poppler.cc | 7 +++++-- shell/ev-view.c | 27 +++++++++++++++++++++++++++ 5 files changed, 76 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1316b8d3..4a1f7eaa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2005-09-19 Marco Pesenti Gritti + + * backend/ev-link.c: (ev_link_type_get_type), + (ev_link_new_page_xyz), (ev_link_new_page_fit), + (ev_link_new_page_fith): + * backend/ev-link.h: + * pdf/ev-poppler.cc: + * shell/ev-view.c: (goto_fith_link), (ev_view_goto_link): + + Implement FIT and FITH links + 2005-09-19 Marco Pesenti Gritti * pdf/ev-poppler.cc: diff --git a/backend/ev-link.c b/backend/ev-link.c index e1eb91ee..071d6af5 100644 --- a/backend/ev-link.c +++ b/backend/ev-link.c @@ -70,6 +70,8 @@ ev_link_type_get_type (void) { EV_LINK_TYPE_TITLE, "EV_LINK_TYPE_TITLE", "title" }, { EV_LINK_TYPE_PAGE, "EV_LINK_TYPE_PAGE", "page" }, { EV_LINK_TYPE_PAGE_XYZ, "EV_LINK_TYPE_PAGE_XYZ", "page-xyz" }, + { EV_LINK_TYPE_PAGE_FIT, "EV_LINK_TYPE_PAGE_FIT", "page-fit" }, + { EV_LINK_TYPE_PAGE_FITH, "EV_LINK_TYPE_PAGE_FITH", "page-fith" }, { EV_LINK_TYPE_EXTERNAL_URI, "EV_LINK_TYPE_EXTERNAL_URI", "external" }, { 0, NULL, NULL } }; @@ -356,6 +358,30 @@ ev_link_new_page_xyz (const char *title, NULL)); } +EvLink * +ev_link_new_page_fit (const char *title, + int page) +{ + return EV_LINK (g_object_new (EV_TYPE_LINK, + "title", title, + "page", page, + "type", EV_LINK_TYPE_PAGE_FIT, + NULL)); +} + +EvLink * +ev_link_new_page_fith (const char *title, + int page, + double top) +{ + return EV_LINK (g_object_new (EV_TYPE_LINK, + "title", title, + "page", page, + "type", EV_LINK_TYPE_PAGE_FITH, + "top", top, + NULL)); +} + EvLink * ev_link_new_external (const char *title, const char *uri) { diff --git a/backend/ev-link.h b/backend/ev-link.h index 8ee84294..508e89de 100644 --- a/backend/ev-link.h +++ b/backend/ev-link.h @@ -44,6 +44,8 @@ typedef enum EV_LINK_TYPE_TITLE, EV_LINK_TYPE_PAGE, EV_LINK_TYPE_PAGE_XYZ, + EV_LINK_TYPE_PAGE_FIT, + EV_LINK_TYPE_PAGE_FITH, EV_LINK_TYPE_EXTERNAL_URI, /* We'll probably fill this in more as we support the other types of * links */ @@ -60,6 +62,11 @@ EvLink *ev_link_new_page_xyz (const char *title, double top, double left, double zoom); +EvLink *ev_link_new_page_fith (const char *title, + int page, + double top); +EvLink *ev_link_new_page_fit (const char *title, + int page); EvLink *ev_link_new_external (const char *title, const char *uri); diff --git a/pdf/ev-poppler.cc b/pdf/ev-poppler.cc index 03a27a69..5633840e 100644 --- a/pdf/ev-poppler.cc +++ b/pdf/ev-poppler.cc @@ -720,10 +720,13 @@ ev_link_from_dest (PopplerAction *action) action->goto_dest.dest->zoom); break; case POPPLER_DEST_FIT: - unimplemented_dest = "POPPLER_DEST_FIT"; + link = ev_link_new_page_fit (action->any.title, + action->goto_dest.dest->page_num - 1); break; case POPPLER_DEST_FITH: - unimplemented_dest = "POPPLER_DEST_FITH"; + link = ev_link_new_page_fith (action->any.title, + action->goto_dest.dest->page_num - 1, + action->goto_dest.dest->top); break; case POPPLER_DEST_FITV: unimplemented_dest = "POPPLER_DEST_FITV"; diff --git a/shell/ev-view.c b/shell/ev-view.c index 78266944..fa2df5b0 100644 --- a/shell/ev-view.c +++ b/shell/ev-view.c @@ -1096,6 +1096,25 @@ get_link_at_location (EvView *view, return NULL; } +static void +goto_fith_link (EvView *view, EvLink *link) +{ + GdkPoint view_point; + EvPoint doc_point; + int height, page; + + page = ev_link_get_page (link); + ev_page_cache_get_size (view->page_cache, page, 0, 1.0, NULL, &height); + + ev_view_set_sizing_mode (view, EV_SIZING_BEST_FIT); + + doc_point.x = 0; + doc_point.y = height - ev_link_get_top (link); + doc_point_to_view_point (view, page, &doc_point, &view_point); + + gtk_adjustment_set_value (view->vadjustment, view_point.y); +} + static void goto_xyz_link (EvView *view, EvLink *link) { @@ -1137,6 +1156,14 @@ ev_view_goto_link (EvView *view, EvLink *link) page = ev_link_get_page (link); ev_page_cache_set_current_page (view->page_cache, page); break; + case EV_LINK_TYPE_PAGE_FIT: + page = ev_link_get_page (link); + ev_page_cache_set_current_page (view->page_cache, page); + ev_view_set_sizing_mode (view, EV_SIZING_BEST_FIT); + break; + case EV_LINK_TYPE_PAGE_FITH: + goto_fith_link (view, link); + break; case EV_LINK_TYPE_PAGE_XYZ: goto_xyz_link (view, link); break; -- 2.43.5