summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGülşah Köse <gulsah.kose@collabora.com>2020-08-01 01:39:26 +0300
committerAndras Timar <andras.timar@collabora.com>2020-08-06 10:47:28 +0200
commitad48ab32a3a083741bc003da7d6b3115f7f6cd33 (patch)
treebb43a186b895c1d4303abb6ec11f24b6a08a3932
parent1e93cdd1e29b82eb5bd01a12eb5d564f3b6953ac (diff)
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 <gulsah.kose@collabora.com> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/100097 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com> Reviewed-by: Andras Timar <andras.timar@collabora.com>
-rw-r--r--oox/source/ppt/pptshapecontext.cxx21
-rw-r--r--sd/qa/unit/data/ppt/placeholder-priority.pptxbin0 -> 26091 bytes
-rw-r--r--sd/qa/unit/import-tests.cxx20
3 files changed, 39 insertions, 2 deletions
diff --git a/oox/source/ppt/pptshapecontext.cxx b/oox/source/ppt/pptshapecontext.cxx
index c0c81effba0c..44dbac4d8994 100644
--- a/oox/source/ppt/pptshapecontext.cxx
+++ b/oox/source/ppt/pptshapecontext.cxx
@@ -77,10 +77,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() );
@@ -137,7 +155,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.get() )
{
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
--- /dev/null
+++ b/sd/qa/unit/data/ppt/placeholder-priority.pptx
Binary files differ
diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx
index bd719567104c..793f99c6cd8f 100644
--- a/sd/qa/unit/import-tests.cxx
+++ b/sd/qa/unit/import-tests.cxx
@@ -129,6 +129,7 @@ public:
void testN828390_2();
void testN828390_3();
void testFdo68594();
+ void testPlaceholderPriority();
void testFdo72998();
void testFdo77027();
void testStrictOOXML();
@@ -236,6 +237,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);
@@ -683,6 +685,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