oox/source/ppt/pptshapecontext.cxx | 21 +++++++++++++++++++-- sd/qa/unit/data/ppt/placeholder-priority.pptx |binary sd/qa/unit/import-tests.cxx | 20 ++++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-)
New commits: commit 802fa332fc05a119c525f20a46ac3aaea7900602 Author: Gülşah Köse <[email protected]> AuthorDate: Sat Aug 1 01:39:26 2020 +0300 Commit: Xisco Fauli <[email protected]> CommitDate: Wed Aug 5 10:23:32 2020 +0200 tdf#133687 Fix the placeholders priority order. When we don't have type attribute on slide but have on slidelayout we have to use it instead of default type. Change-Id: Ibb874b5ee39c48641484fe1a8686f66c31695f76 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/99904 Tested-by: Jenkins Reviewed-by: Gülşah Köse <[email protected]> (cherry picked from commit e0018be102edd6e376e0622e0a9384176d2f119c) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/100052 Reviewed-by: Xisco Fauli <[email protected]> diff --git a/oox/source/ppt/pptshapecontext.cxx b/oox/source/ppt/pptshapecontext.cxx index 25bcc9200bef..72c96dd8d9c2 100644 --- a/oox/source/ppt/pptshapecontext.cxx +++ b/oox/source/ppt/pptshapecontext.cxx @@ -65,10 +65,28 @@ ContextHandlerRef PPTShapeContext::onCreateContext( sal_Int32 aElementToken, con } case PPT_TOKEN( ph ): { + SlidePersistPtr pMasterPersist( mpSlidePersistPtr->getMasterPersist() ); + OptValue< sal_Int32 > oSubType( rAttribs.getToken( XML_type) ); sal_Int32 nSubType( rAttribs.getToken( XML_type, XML_obj ) ); + sal_Int32 nSubTypeIndex; + oox::drawingml::ShapePtr pTmpPlaceholder; + mpShapePtr->setSubType( nSubType ); + if( rAttribs.hasAttribute( XML_idx ) ) - mpShapePtr->setSubTypeIndex( rAttribs.getString( XML_idx ).get().toInt32() ); + { + nSubTypeIndex = rAttribs.getString( XML_idx ).get().toInt32(); + mpShapePtr->setSubTypeIndex( nSubTypeIndex ); + + if(!oSubType.has() && pMasterPersist) + { + pTmpPlaceholder = PPTShape::findPlaceholderByIndex( nSubTypeIndex, pMasterPersist->getShapes()->getChildren() ); + + if(pTmpPlaceholder) + nSubType = pTmpPlaceholder->getSubType(); // When we don't have type attribute on slide but have on slidelayout we have to use it instead of default type + } + } + if ( nSubType ) { PPTShape* pPPTShapePtr = dynamic_cast< PPTShape* >( mpShapePtr.get() ); @@ -125,7 +143,6 @@ ContextHandlerRef PPTShapeContext::onCreateContext( sal_Int32 aElementToken, con } else if ( eShapeLocation == Slide ) // normal slide shapes have to search within the corresponding master tree for referenced objects { - SlidePersistPtr pMasterPersist( mpSlidePersistPtr->getMasterPersist() ); if ( pMasterPersist ) { pPlaceholder = PPTShape::findPlaceholder( nFirstPlaceholder, nSecondPlaceholder, diff --git a/sd/qa/unit/data/ppt/placeholder-priority.pptx b/sd/qa/unit/data/ppt/placeholder-priority.pptx new file mode 100644 index 000000000000..d11dc4785f54 Binary files /dev/null and b/sd/qa/unit/data/ppt/placeholder-priority.pptx differ diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx index bc80fb5e3ca3..cec91cfb6387 100644 --- a/sd/qa/unit/import-tests.cxx +++ b/sd/qa/unit/import-tests.cxx @@ -133,6 +133,7 @@ public: void testN828390_2(); void testN828390_3(); void testFdo68594(); + void testPlaceholderPriority(); void testFdo72998(); void testFdo77027(); void testStrictOOXML(); @@ -240,6 +241,7 @@ public: CPPUNIT_TEST(testN828390_2); CPPUNIT_TEST(testN828390_3); CPPUNIT_TEST(testFdo68594); + CPPUNIT_TEST(testPlaceholderPriority); CPPUNIT_TEST(testFdo72998); CPPUNIT_TEST(testFdo77027); CPPUNIT_TEST(testStrictOOXML); @@ -686,6 +688,24 @@ void SdImportTest::testFdo68594() xDocShRef->DoClose(); } +void SdImportTest::testPlaceholderPriority() +{ + sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc("/sd/qa/unit/data/ppt/placeholder-priority.pptx"), PPTX); + + const SdrPage* pPage = GetPage( 1, xDocShRef ); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Missing placeholder", sal_uInt32(2), sal_uInt32(pPage->GetObjCount())); + + tools::Rectangle pObj1Rect(9100, 3500, 29619, 4038); + SdrObject *pObj1 = pPage->GetObj(0); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Placeholder position is wrong, check the placeholder priority", pObj1Rect, pObj1->GetCurrentBoundRect()); + + tools::Rectangle pObj2Rect(9102, 8643, 29619, 12642); + SdrObject *pObj2 = pPage->GetObj(1); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Placeholder position is wrong, check the placeholder priority", pObj2Rect, pObj2->GetCurrentBoundRect()); + + // If the placeholder positions are wrong, please check placeholder priority in Placeholders class. +} + void SdImportTest::testPptCrop() { sd::DrawDocShellRef xDocShRef _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
