diff options
-rw-r--r-- | include/oox/drawingml/shape.hxx | 2 | ||||
-rw-r--r-- | oox/source/drawingml/shape.cxx | 17 | ||||
-rw-r--r-- | oox/source/ppt/pptshapegroupcontext.cxx | 23 | ||||
-rw-r--r-- | oox/source/shape/ShapeContextHandler.cxx | 19 | ||||
-rw-r--r-- | sd/qa/unit/import-tests-smartart.cxx | 1 |
5 files changed, 35 insertions, 27 deletions
diff --git a/include/oox/drawingml/shape.hxx b/include/oox/drawingml/shape.hxx index 4b25aa49e223..e7d06476656d 100644 --- a/include/oox/drawingml/shape.hxx +++ b/include/oox/drawingml/shape.hxx @@ -227,6 +227,8 @@ public: /// Changes reference semantics to value semantics for fill properties. void cloneFillProperties(); + void keepDiagramDrawing(::oox::core::XmlFilterBase& rFilterBase, const OUString& rFragmentPath); + protected: enum FrameType diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx index 0c522bdfe63e..3c84428389a5 100644 --- a/oox/source/drawingml/shape.cxx +++ b/oox/source/drawingml/shape.cxx @@ -64,6 +64,7 @@ #include <com/sun/star/beans/XMultiPropertySet.hpp> #include <com/sun/star/lang/XMultiServiceFactory.hpp> #include <com/sun/star/xml/AttributeData.hpp> +#include <com/sun/star/xml/dom/XDocument.hpp> #include <com/sun/star/xml/sax/XFastSAXSerializable.hpp> #include <com/sun/star/drawing/HomogenMatrix3.hpp> #include <com/sun/star/drawing/TextVerticalAdjust.hpp> @@ -1388,6 +1389,22 @@ Reference< XShape > const & Shape::createAndInsert( return mxShape; } +void Shape::keepDiagramDrawing(XmlFilterBase& rFilterBase, const OUString& rFragmentPath) +{ + uno::Sequence<uno::Any> diagramDrawing(2); + // drawingValue[0] => dom, drawingValue[1] => Sequence of associated relationships + + sal_Int32 length = maDiagramDoms.getLength(); + maDiagramDoms.realloc(length + 1); + + diagramDrawing[0] <<= rFilterBase.importFragment(rFragmentPath); + diagramDrawing[1] <<= resolveRelationshipsOfTypeFromOfficeDoc(rFilterBase, rFragmentPath, "image"); + + beans::PropertyValue* pValue = maDiagramDoms.getArray(); + pValue[length].Name = "OOXDrawing"; + pValue[length].Value <<= diagramDrawing; +} + void Shape::keepDiagramCompatibilityInfo() { try diff --git a/oox/source/ppt/pptshapegroupcontext.cxx b/oox/source/ppt/pptshapegroupcontext.cxx index c53b69823c9b..c2e5f2f2c9b4 100644 --- a/oox/source/ppt/pptshapegroupcontext.cxx +++ b/oox/source/ppt/pptshapegroupcontext.cxx @@ -134,16 +134,19 @@ void PPTShapeGroupContext::importExtDrawings( ) if( pGraphicShape ) { for (auto const& extDrawing : pGraphicShape->getExtDrawings()) - { - getFilter().importFragment( new ExtDrawingFragmentHandler( getFilter(), getFragmentPathFromRelId(extDrawing), - mpSlidePersistPtr, - meShapeLocation, - mpGroupShapePtr, - pGraphicShape ) ); - // Apply font color imported from color fragment - if( pGraphicShape->getFontRefColorForNodes().isUsed() ) - applyFontRefColor(mpGroupShapePtr, pGraphicShape->getFontRefColorForNodes()); - } + { + OUString aFragmentPath = getFragmentPathFromRelId(extDrawing); + getFilter().importFragment( new ExtDrawingFragmentHandler( getFilter(), aFragmentPath, + mpSlidePersistPtr, + meShapeLocation, + mpGroupShapePtr, + pGraphicShape ) ); + pGraphicShape->keepDiagramDrawing(getFilter(), aFragmentPath); + + // Apply font color imported from color fragment + if( pGraphicShape->getFontRefColorForNodes().isUsed() ) + applyFontRefColor(mpGroupShapePtr, pGraphicShape->getFontRefColorForNodes()); + } pGraphicShape = oox::drawingml::ShapePtr( nullptr ); } } diff --git a/oox/source/shape/ShapeContextHandler.cxx b/oox/source/shape/ShapeContextHandler.cxx index 4abd405c234e..32533eadf825 100644 --- a/oox/source/shape/ShapeContextHandler.cxx +++ b/oox/source/shape/ShapeContextHandler.cxx @@ -431,23 +431,8 @@ ShapeContextHandler::getShape() oox::drawingml::ShapePtr pShapePtr( new Shape( "com.sun.star.drawing.GroupShape" ) ); pShapePtr->setDiagramType(); mxFilterBase->importFragment(new ShapeDrawingFragmentHandler(*mxFilterBase, aFragmentPath, pShapePtr)); - - uno::Sequence<beans::PropertyValue> aValue(mpShape->getDiagramDoms()); - uno::Sequence < uno::Any > diagramDrawing(2); - // drawingValue[0] => dom, drawingValue[1] => Sequence of associated relationships - - sal_Int32 length = aValue.getLength(); - aValue.realloc(length+1); - - diagramDrawing[0] <<= mxFilterBase->importFragment( aFragmentPath ); - diagramDrawing[1] <<= pShapePtr->resolveRelationshipsOfTypeFromOfficeDoc( - *mxFilterBase, aFragmentPath, "image" ); - - beans::PropertyValue* pValue = aValue.getArray(); - pValue[length].Name = "OOXDrawing"; - pValue[length].Value <<= diagramDrawing; - - pShapePtr->setDiagramDoms( aValue ); + pShapePtr->setDiagramDoms(mpShape->getDiagramDoms()); + pShapePtr->keepDiagramDrawing(*mxFilterBase, aFragmentPath); pShapePtr->addShape( *mxFilterBase, mpThemePtr.get(), xShapes, aMatrix, pShapePtr->getFillProperties() ); xResult = pShapePtr->getXShape(); diff --git a/sd/qa/unit/import-tests-smartart.cxx b/sd/qa/unit/import-tests-smartart.cxx index 81474f2071ae..3d3194098b8b 100644 --- a/sd/qa/unit/import-tests-smartart.cxx +++ b/sd/qa/unit/import-tests-smartart.cxx @@ -1007,6 +1007,7 @@ void SdImportTestSmartArt::testInteropGrabBag() CPPUNIT_ASSERT(aGrabBag.find("OOXLayout") != aGrabBag.end()); CPPUNIT_ASSERT(aGrabBag.find("OOXStyle") != aGrabBag.end()); CPPUNIT_ASSERT(aGrabBag.find("OOXColor") != aGrabBag.end()); + CPPUNIT_ASSERT(aGrabBag.find("OOXDrawing") != aGrabBag.end()); xDocShRef->DoClose(); } |