summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTünde Tóth <toth.tunde@nisz.hu>2022-09-13 10:29:03 +0200
committerLászló Németh <nemeth@numbertext.org>2022-09-28 14:16:50 +0200
commitadc042f95d3dbd65b778260025d59283146916e5 (patch)
treebe039e80dd6ca2d4b2d8d2baa4c5af0f5ae11ebd
parent36003e7644014cde9330bf45fee3815278a74035 (diff)
tdf#124333 PPTX import: fix Z-order of embedded OLE objects
Choose mc:Choice in a:graphicData element if the selected p:oleObj element has a shape id to avoid of shape duplication which created also bad layout/overlapping because of the different Z-order of the duplicated shape. Change-Id: Idecff4903c2d637bc82353f13352cac72413cec1 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/140041 Tested-by: László Németh <nemeth@numbertext.org> Reviewed-by: László Németh <nemeth@numbertext.org>
-rw-r--r--oox/qa/unit/vml.cxx15
-rw-r--r--oox/source/drawingml/graphicshapecontext.cxx3
-rw-r--r--oox/source/drawingml/shape.cxx17
-rw-r--r--sd/qa/unit/data/pptx/ole.pptxbin0 -> 41588 bytes
-rw-r--r--sd/qa/unit/export-tests-ooxml3.cxx21
5 files changed, 45 insertions, 11 deletions
diff --git a/oox/qa/unit/vml.cxx b/oox/qa/unit/vml.cxx
index 9dcaaef83cc4..61730c744220 100644
--- a/oox/qa/unit/vml.cxx
+++ b/oox/qa/unit/vml.cxx
@@ -192,18 +192,13 @@ CPPUNIT_TEST_FIXTURE(OoxVmlTest, testGraphicStroke)
uno::Reference<drawing::XDrawPage> xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
uno::UNO_QUERY);
- uno::Reference<beans::XPropertySet> xShape;
- for (sal_Int32 i = 0; i < xDrawPage->getCount(); ++i)
- {
- uno::Reference<lang::XServiceInfo> xInfo(xDrawPage->getByIndex(i), uno::UNO_QUERY);
- if (!xInfo->supportsService("com.sun.star.drawing.GraphicObjectShape"))
- {
- continue;
- }
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xDrawPage->getCount());
+ uno::Reference<beans::XPropertySet> xShape;
+ uno::Reference<lang::XServiceInfo> xInfo(xDrawPage->getByIndex(0), uno::UNO_QUERY);
+ if (xInfo->supportsService("com.sun.star.drawing.OLE2Shape"))
xShape.set(xInfo, uno::UNO_QUERY);
- break;
- }
+
CPPUNIT_ASSERT(xShape.is());
drawing::LineStyle eLineStyle{};
diff --git a/oox/source/drawingml/graphicshapecontext.cxx b/oox/source/drawingml/graphicshapecontext.cxx
index 6e4379c2e1ed..0f96d0a92d63 100644
--- a/oox/source/drawingml/graphicshapecontext.cxx
+++ b/oox/source/drawingml/graphicshapecontext.cxx
@@ -256,7 +256,8 @@ void OleObjectGraphicDataContext::onEndElement()
{
if( getCurrentElement() == PPT_TOKEN( oleObj ) && !isMCEStateEmpty() )
{
- if( getMCEState() == MCE_STATE::FoundChoice && !mrOleObjectInfo.mbHasPicture )
+ if (getMCEState() == MCE_STATE::FoundChoice && !mrOleObjectInfo.mbHasPicture
+ && mrOleObjectInfo.maShapeId.isEmpty())
setMCEState( MCE_STATE::Started );
}
}
diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx
index 2a46f93a440e..0369f5ff732c 100644
--- a/oox/source/drawingml/shape.cxx
+++ b/oox/source/drawingml/shape.cxx
@@ -1868,6 +1868,23 @@ Reference< XShape > const & Shape::createAndInsert(
propertySet->setPropertyValue(
"SoftEdgeRadius", Any(convertEmuToHmm(aEffectProperties.maSoftEdge.moRad.value())));
}
+
+ // Set the stroke and fill-color properties of the OLE shape
+ if (aServiceName == "com.sun.star.drawing.OLE2Shape" && mxOleObjectInfo
+ && !mxOleObjectInfo->maShapeId.isEmpty())
+ if (::oox::vml::Drawing* pVmlDrawing = rFilterBase.getVmlDrawing())
+ if (const ::oox::vml::ShapeBase* pVmlShape
+ = pVmlDrawing->getShapes().getShapeById(mxOleObjectInfo->maShapeId))
+ {
+ // Apply stroke props from the type model of the related VML shape.
+ ShapePropertyMap aPropMap(rFilterBase.getModelObjectHelper());
+ pVmlShape->getTypeModel().maStrokeModel.pushToPropMap(
+ aPropMap, rFilterBase.getGraphicHelper());
+ // And, fill-color properties as well...
+ pVmlShape->getTypeModel().maFillModel.pushToPropMap(
+ aPropMap, rFilterBase.getGraphicHelper());
+ PropertySet(xSet).setProperties(aPropMap);
+ }
}
if (mxShape.is())
diff --git a/sd/qa/unit/data/pptx/ole.pptx b/sd/qa/unit/data/pptx/ole.pptx
new file mode 100644
index 000000000000..b998e79e0d66
--- /dev/null
+++ b/sd/qa/unit/data/pptx/ole.pptx
Binary files differ
diff --git a/sd/qa/unit/export-tests-ooxml3.cxx b/sd/qa/unit/export-tests-ooxml3.cxx
index c12a1f0ec4bd..e2ef6928104f 100644
--- a/sd/qa/unit/export-tests-ooxml3.cxx
+++ b/sd/qa/unit/export-tests-ooxml3.cxx
@@ -122,6 +122,7 @@ public:
void testTdf149551_tbrl90();
void testTdf149551_btlr();
void testTdf94122_autoColor();
+ void testTdf124333();
CPPUNIT_TEST_SUITE(SdOOXMLExportTest3);
@@ -209,6 +210,7 @@ public:
CPPUNIT_TEST(testTdf149551_tbrl90);
CPPUNIT_TEST(testTdf149551_btlr);
CPPUNIT_TEST(testTdf94122_autoColor);
+ CPPUNIT_TEST(testTdf124333);
CPPUNIT_TEST_SUITE_END();
virtual void registerNamespaces(xmlXPathContextPtr& pXmlXPathCtx) override
@@ -2260,6 +2262,25 @@ void SdOOXMLExportTest3::testTdf94122_autoColor()
"val", "000000");
}
+void SdOOXMLExportTest3::testTdf124333()
+{
+ // Document contains one rectangle and one embedded OLE object.
+ ::sd::DrawDocShellRef xDocShRef
+ = loadURL(m_directories.getURLFromSrc(u"/sd/qa/unit/data/pptx/ole.pptx"), PPTX);
+
+ // Without the fix in place, the number of shapes was 3.
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("number of shapes is incorrect", sal_Int32(2),
+ getPage(0, xDocShRef)->getCount());
+
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX);
+
+ // Check number of shapes after export.
+ CPPUNIT_ASSERT_EQUAL_MESSAGE("number of shapes is incorrect after export", sal_Int32(2),
+ getPage(0, xDocShRef)->getCount());
+
+ xDocShRef->DoClose();
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(SdOOXMLExportTest3);
CPPUNIT_PLUGIN_IMPLEMENT();