diff options
author | Tibor Nagy <nagy.tibor2@nisz.hu> | 2022-05-13 08:12:17 +0200 |
---|---|---|
committer | László Németh <nemeth@numbertext.org> | 2022-05-27 18:32:38 +0200 |
commit | 855a56fea4561135a63cb729d7a625a950b210e7 (patch) | |
tree | 96dd057f2ab6917041ee43e943c321880e57a5bf /oox | |
parent | b3c965ccaa896b12b33ff5b7ccea0eb20d560116 (diff) |
tdf#148965 PPTX import: fix internal hyperlinks on shapes
Locale dependent code path resulted broken hyperlinks
on shapes in a non-English build.
Change-Id: I045bbe4246ab5336e2b967bf252b5fbca5b17706
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134266
Tested-by: László Németh <nemeth@numbertext.org>
Reviewed-by: László Németh <nemeth@numbertext.org>
Diffstat (limited to 'oox')
-rw-r--r-- | oox/source/ppt/pptshape.cxx | 23 | ||||
-rw-r--r-- | oox/source/ppt/presentationfragmenthandler.cxx | 46 | ||||
-rw-r--r-- | oox/source/ppt/slidepersist.cxx | 2 |
3 files changed, 53 insertions, 18 deletions
diff --git a/oox/source/ppt/pptshape.cxx b/oox/source/ppt/pptshape.cxx index d83737250550..2ec4a3fbe327 100644 --- a/oox/source/ppt/pptshape.cxx +++ b/oox/source/ppt/pptshape.cxx @@ -613,27 +613,14 @@ void PPTShape::addShape( // so check here if it's a bookmark or a document if (meClickAction == ClickAction_BOOKMARK) { + sal_Int32 nSplitPos; if (!sURL.startsWith("#")) meClickAction = ClickAction_DOCUMENT; - else + else if (-1 != (nSplitPos = sURL.indexOf( ' ' ))) { - sURL = sURL.copy(1); - sal_Int32 nPageNumber = 0; - static const OUStringLiteral sSlide = u"Slide "; - if (sURL.match(sSlide)) - nPageNumber = o3tl::toInt32(sURL.subView(sSlide.getLength())); - Reference<drawing::XDrawPagesSupplier> xDPS(rFilterBase.getModel(), - uno::UNO_QUERY_THROW); - Reference<drawing::XDrawPages> xDrawPages(xDPS->getDrawPages(), - uno::UNO_SET_THROW); - sal_Int32 nMaxPages = xDrawPages->getCount(); - if (nPageNumber && nPageNumber <= nMaxPages) - { - Reference<XDrawPage> xDrawPage; - xDrawPages->getByIndex(nPageNumber - 1) >>= xDrawPage; - Reference<container::XNamed> xNamed(xDrawPage, UNO_QUERY); - sURL = xNamed->getName(); - } + setBookmark(true); + // reuse slide number from '#Slide [Num]' or "#Notes [Num]" + sURL = OUString::Concat("#page") + sURL.subView(nSplitPos); } nPropertyCount += 1; } diff --git a/oox/source/ppt/presentationfragmenthandler.cxx b/oox/source/ppt/presentationfragmenthandler.cxx index 64aaf62f9a71..c9deec076edc 100644 --- a/oox/source/ppt/presentationfragmenthandler.cxx +++ b/oox/source/ppt/presentationfragmenthandler.cxx @@ -106,6 +106,51 @@ PresentationFragmentHandler::~PresentationFragmentHandler() noexcept { } +static void lcl_setBookmark(uno::Reference<drawing::XShape>& rShape, + std::vector<SlidePersistPtr>& rSlidePersist) +{ + OUString aBookmark; + sal_Int32 nPageNumber; + static const OUStringLiteral sSlideName = u"#page"; + uno::Reference<beans::XPropertySet> xPropSet(rShape, uno::UNO_QUERY); + xPropSet->getPropertyValue("Bookmark") >>= aBookmark; + nPageNumber = o3tl::toInt32(aBookmark.subView(sSlideName.getLength())); + Reference<XDrawPage> xDrawPage(rSlidePersist[nPageNumber - 1]->getPage()); + Reference<container::XNamed> xNamed(xDrawPage, UNO_QUERY_THROW); + aBookmark = xNamed->getName(); + xPropSet->setPropertyValue("Bookmark", Any(aBookmark)); +} + +static void ResolveShapeBookmark(std::vector<SlidePersistPtr>& rSlidePersist) +{ + sal_Int32 nPageCount = rSlidePersist.size(); + for (sal_Int32 nPage = 0; nPage < nPageCount; ++nPage) + { + if (!rSlidePersist[nPage]->getURLShapeId().empty()) + { + auto aShapeMap = rSlidePersist[nPage]->getShapeMap(); + sal_Int32 nCount = rSlidePersist[nPage]->getURLShapeId().size(); + for (sal_Int32 i = 0; i < nCount; i++) + { + OUString sId = rSlidePersist[nPage]->getURLShapeId()[i]; + uno::Reference<drawing::XShape> xShape(aShapeMap[sId]->getXShape(), uno::UNO_QUERY); + Reference<XShapes> xShapes(xShape, UNO_QUERY); + if (xShapes.is()) // group shape + { + for (sal_Int32 j = 0; j < xShapes->getCount(); j++) + { + uno::Reference<drawing::XShape> xGroupedShape(xShapes->getByIndex(j), + uno::UNO_QUERY); + lcl_setBookmark(xGroupedShape, rSlidePersist); + } + } + else + lcl_setBookmark(xShape, rSlidePersist); + } + } + } +} + static void ResolveTextFields( XmlFilterBase const & rFilter ) { const oox::core::TextFieldStack& rTextFields = rFilter.getTextFieldStack(); @@ -551,6 +596,7 @@ void PresentationFragmentHandler::finalizeImport() nPagesImported++; } ResolveTextFields( rFilter ); + ResolveShapeBookmark(rFilter.getDrawPages()); if (!maCustomShowList.empty()) importCustomSlideShow(maCustomShowList); } diff --git a/oox/source/ppt/slidepersist.cxx b/oox/source/ppt/slidepersist.cxx index 24ce2f9da464..8d45bcdb7947 100644 --- a/oox/source/ppt/slidepersist.cxx +++ b/oox/source/ppt/slidepersist.cxx @@ -158,6 +158,8 @@ void SlidePersist::createXShapes( XmlFilterBase& rFilterBase ) maConnectorShapeId.push_back(pPPTShape->getChildren()[i]->getId()); } } + if (pPPTShape->hasBookmark()) + addURLShapeId(pPPTShape->getId()); } else child->addShape( rFilterBase, getTheme().get(), xShapes, aTransformation, maShapesPtr->getFillProperties(), &getShapeMap() ); |