diff --git a/src/gui/sidebar/indextree/SidebarIndexPage.cpp b/src/gui/sidebar/indextree/SidebarIndexPage.cpp index d496bc01..8e70a82d 100644 --- a/src/gui/sidebar/indextree/SidebarIndexPage.cpp +++ b/src/gui/sidebar/indextree/SidebarIndexPage.cpp @@ -353,6 +353,7 @@ bool SidebarIndexPage::selectPageNr(size_t page, size_t pdfPage, GtkTreeIter* pa doc->unlock(); return false; } + g_object_ref(model); doc->unlock(); @@ -378,7 +379,7 @@ bool SidebarIndexPage::selectPageNr(size_t page, size_t pdfPage, GtkTreeIter* pa g_object_unref(model); g_object_unref(link); - // already bookmak from this page selected + // already a bookmark from this page selected return true; } } diff --git a/src/pdf/popplerapi/PopplerGlibAction.cpp b/src/pdf/popplerapi/PopplerGlibAction.cpp index bd6f3549..a08dd09a 100644 --- a/src/pdf/popplerapi/PopplerGlibAction.cpp +++ b/src/pdf/popplerapi/PopplerGlibAction.cpp @@ -1,9 +1,11 @@ #include "PopplerGlibAction.h" -PopplerGlibAction::PopplerGlibAction(PopplerAction* action) - : action(action) +PopplerGlibAction::PopplerGlibAction(PopplerAction* action, PopplerDocument* document) + : action(action), + document(document) { XOJ_INIT_TYPE(PopplerGlibAction); + g_object_ref(document); } PopplerGlibAction::~PopplerGlibAction() @@ -13,6 +15,12 @@ PopplerGlibAction::~PopplerGlibAction() poppler_action_free(action); action = NULL; + if (document) + { + g_object_unref(document); + document = NULL; + } + XOJ_RELEASE_TYPE(PopplerGlibAction); } @@ -48,62 +56,84 @@ void PopplerGlibAction::linkFromDest(LinkDestination* link, PopplerDest* pDest) switch(pDest->type) { case POPPLER_DEST_UNKNOWN: + g_warning("PDF Contains unknown link destination"); break; case POPPLER_DEST_XYZ: { -// int page_num; -// double left; -// double bottom; -// double right; -// double top; -// double zoom; -// -// -// XojPopplerPage* popplerPage = doc.getPage(MAX(0, pageNum)); -// if (!popplerPage) -// { -// return; -// } -// double height = popplerPage->getHeight(); -// -// if (dest->getChangeLeft()) -// { -// link->setChangeLeft(dest->getLeft()); -// } -// -// if (dest->getChangeTop()) -// { -// link->setChangeTop(height - MIN(height, dest->getTop())); -// } -// -// if (dest->getChangeZoom()) -// { -// link->setChangeZoom(dest->getZoom()); -// } + PopplerPage* page = poppler_document_get_page(document, pDest->page_num); + if (page == NULL) + { + return; + } + + double pageWidth = 0; + double pageHeight = 0; + poppler_page_get_size(page, &pageWidth, &pageHeight); + + if (pDest->left) + { + link->setChangeLeft(pDest->left); + } + else if (pDest->right) + { + link->setChangeLeft(pageWidth - pDest->right); + } + + if (pDest->top) + { + link->setChangeTop(pDest->top); + } + else if (pDest->bottom) + { + link->setChangeTop(pageHeight - pDest->bottom); + } + + if (pDest->zoom != 0) + { + link->setChangeZoom(pDest->zoom); + } + + g_object_unref(page); } break; case POPPLER_DEST_FIT: + g_warning("Unimplemented link type: POPPLER_DEST_FIT"); break; case POPPLER_DEST_FITH: + g_warning("Unimplemented link type: POPPLER_DEST_FITH"); break; case POPPLER_DEST_FITV: + g_warning("Unimplemented link type: POPPLER_DEST_FITV"); break; case POPPLER_DEST_FITR: + g_warning("Unimplemented link type: POPPLER_DEST_FITR"); break; case POPPLER_DEST_FITB: + g_warning("Unimplemented link type: POPPLER_DEST_FITB"); break; case POPPLER_DEST_FITBH: + g_warning("Unimplemented link type: POPPLER_DEST_FITBH"); break; case POPPLER_DEST_FITBV: + g_warning("Unimplemented link type: POPPLER_DEST_FITBV"); break; case POPPLER_DEST_NAMED: + { + PopplerDest* pDest2 = poppler_document_find_dest(document, pDest->named_dest); + if (pDest2 != NULL) + { + linkFromDest(link, pDest2); + poppler_dest_free(pDest2); + return; + } + } break; default: break; } - link->setPdfPage(pDest->page_num); + link->setPdfPage(pDest->page_num - 1); } string PopplerGlibAction::getTitle() diff --git a/src/pdf/popplerapi/PopplerGlibAction.h b/src/pdf/popplerapi/PopplerGlibAction.h index 7accc517..68c4682d 100644 --- a/src/pdf/popplerapi/PopplerGlibAction.h +++ b/src/pdf/popplerapi/PopplerGlibAction.h @@ -27,7 +27,7 @@ class LinkDestination; class PopplerGlibAction : public XojPdfAction { public: - PopplerGlibAction(PopplerAction* action); + PopplerGlibAction(PopplerAction* action, PopplerDocument* document); virtual ~PopplerGlibAction(); public: @@ -41,5 +41,6 @@ private: XOJ_TYPE_ATTRIB; PopplerAction* action; + PopplerDocument* document; }; diff --git a/src/pdf/popplerapi/PopplerGlibDocument.cpp b/src/pdf/popplerapi/PopplerGlibDocument.cpp index 3b6a61f3..a7737a34 100644 --- a/src/pdf/popplerapi/PopplerGlibDocument.cpp +++ b/src/pdf/popplerapi/PopplerGlibDocument.cpp @@ -17,7 +17,6 @@ PopplerGlibDocument::PopplerGlibDocument(const PopplerGlibDocument& doc) if (document) { g_object_ref(document); - document = NULL; } } @@ -133,7 +132,7 @@ XojPdfBookmarkIterator* PopplerGlibDocument::getContentsIter() return NULL; } - return new PopplerGlibPageBookmarkIterator(iter); + return new PopplerGlibPageBookmarkIterator(iter, document); } diff --git a/src/pdf/popplerapi/PopplerGlibPageBookmarkIterator.cpp b/src/pdf/popplerapi/PopplerGlibPageBookmarkIterator.cpp index 3d310ad0..18380d3f 100644 --- a/src/pdf/popplerapi/PopplerGlibPageBookmarkIterator.cpp +++ b/src/pdf/popplerapi/PopplerGlibPageBookmarkIterator.cpp @@ -1,9 +1,11 @@ #include "PopplerGlibPageBookmarkIterator.h" -PopplerGlibPageBookmarkIterator::PopplerGlibPageBookmarkIterator(PopplerIndexIter* iter) - : iter(iter) +PopplerGlibPageBookmarkIterator::PopplerGlibPageBookmarkIterator(PopplerIndexIter* iter, PopplerDocument* document) + : iter(iter), + document(document) { XOJ_INIT_TYPE(PopplerGlibPageBookmarkIterator); + g_object_ref(document); } PopplerGlibPageBookmarkIterator::~PopplerGlibPageBookmarkIterator() @@ -13,6 +15,12 @@ PopplerGlibPageBookmarkIterator::~PopplerGlibPageBookmarkIterator() poppler_index_iter_free(iter); iter = NULL; + if (document) + { + g_object_unref(document); + document = NULL; + } + XOJ_RELEASE_TYPE(PopplerGlibPageBookmarkIterator); } @@ -40,7 +48,7 @@ XojPdfBookmarkIterator* PopplerGlibPageBookmarkIterator::getChildIter() return NULL; } - return new PopplerGlibPageBookmarkIterator(child); + return new PopplerGlibPageBookmarkIterator(child, document); } XojPdfAction* PopplerGlibPageBookmarkIterator::getAction() @@ -54,5 +62,5 @@ XojPdfAction* PopplerGlibPageBookmarkIterator::getAction() return NULL; } - return new PopplerGlibAction(action); + return new PopplerGlibAction(action, document); } diff --git a/src/pdf/popplerapi/PopplerGlibPageBookmarkIterator.h b/src/pdf/popplerapi/PopplerGlibPageBookmarkIterator.h index b272e487..0cedbd73 100644 --- a/src/pdf/popplerapi/PopplerGlibPageBookmarkIterator.h +++ b/src/pdf/popplerapi/PopplerGlibPageBookmarkIterator.h @@ -22,7 +22,7 @@ class PopplerGlibPageBookmarkIterator : public XojPdfBookmarkIterator { public: - PopplerGlibPageBookmarkIterator(PopplerIndexIter* iter); + PopplerGlibPageBookmarkIterator(PopplerIndexIter* iter, PopplerDocument* document); virtual ~PopplerGlibPageBookmarkIterator(); public: @@ -35,5 +35,6 @@ private: XOJ_TYPE_ATTRIB; PopplerIndexIter* iter; + PopplerDocument* document; };