From adc042f95d3dbd65b778260025d59283146916e5 Mon Sep 17 00:00:00 2001 From: Tünde Tóth Date: Tue, 13 Sep 2022 10:29:03 +0200 Subject: tdf#124333 PPTX import: fix Z-order of embedded OLE objects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: László Németh --- oox/qa/unit/vml.cxx | 15 +++++---------- oox/source/drawingml/graphicshapecontext.cxx | 3 ++- oox/source/drawingml/shape.cxx | 17 +++++++++++++++++ 3 files changed, 24 insertions(+), 11 deletions(-) (limited to 'oox') 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 xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), uno::UNO_QUERY); - uno::Reference xShape; - for (sal_Int32 i = 0; i < xDrawPage->getCount(); ++i) - { - uno::Reference 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 xShape; + uno::Reference 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()) -- cgit