diff options
Diffstat (limited to 'oox')
-rw-r--r-- | oox/source/drawingml/shape.cxx | 42 | ||||
-rw-r--r-- | oox/source/shape/WpgContext.hxx | 2 | ||||
-rw-r--r-- | oox/source/shape/WpsContext.cxx | 43 | ||||
-rw-r--r-- | oox/source/shape/WpsContext.hxx | 1 |
4 files changed, 87 insertions, 1 deletions
diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx index f7161e01291f..b13000035add 100644 --- a/oox/source/drawingml/shape.cxx +++ b/oox/source/drawingml/shape.cxx @@ -134,6 +134,7 @@ Shape::Shape( const char* pServiceName, bool bDefaultHeight ) , mbHidden( false ) , mbHiddenMasterShape( false ) , mbLocked( false ) +, mbWPGChild(false) , mbLockedCanvas( false ) , mbWps( false ) , mbTextBox( false ) @@ -176,6 +177,7 @@ Shape::Shape( const ShapePtr& pSourceShape ) , mbHidden( pSourceShape->mbHidden ) , mbHiddenMasterShape( pSourceShape->mbHiddenMasterShape ) , mbLocked( pSourceShape->mbLocked ) +, mbWPGChild( pSourceShape->mbWPGChild ) , mbLockedCanvas( pSourceShape->mbLockedCanvas ) , mbWps( pSourceShape->mbWps ) , mbTextBox( pSourceShape->mbTextBox ) @@ -292,6 +294,41 @@ void Shape::addShape( if ( xShapes.is() ) addChildren( rFilterBase, *this, pTheme, xShapes, pShapeMap, aMatrix ); + if (isWPGChild() && xShape) + { + // This is a wps shape and it is the child of the WPG, now copy the + // the text body properties to the xshape. + Reference<XPropertySet> xChildWPSProperties(xShape, uno::UNO_QUERY); + + if (getTextBody() && xChildWPSProperties) + { + xChildWPSProperties->setPropertyValue( + UNO_NAME_TEXT_VERTADJUST, + uno::Any(getTextBody()->getTextProperties().meVA)); + + xChildWPSProperties->setPropertyValue( + UNO_NAME_TEXT_LEFTDIST, + uno::Any(getTextBody()->getTextProperties().moInsets[0].has_value() + ? *getTextBody()->getTextProperties().moInsets[0] + : 0)); + xChildWPSProperties->setPropertyValue( + UNO_NAME_TEXT_UPPERDIST, + uno::Any(getTextBody()->getTextProperties().moInsets[1].has_value() + ? *getTextBody()->getTextProperties().moInsets[1] + : 0)); + xChildWPSProperties->setPropertyValue( + UNO_NAME_TEXT_RIGHTDIST, + uno::Any(getTextBody()->getTextProperties().moInsets[2].has_value() + ? *getTextBody()->getTextProperties().moInsets[2] + : 0)); + xChildWPSProperties->setPropertyValue( + UNO_NAME_TEXT_LOWERDIST, + uno::Any(getTextBody()->getTextProperties().moInsets[3].has_value() + ? *getTextBody()->getTextProperties().moInsets[3] + : 0)); + } + } + if( meFrameType == FRAMETYPE_DIAGRAM ) { keepDiagramCompatibilityInfo(); @@ -332,6 +369,11 @@ void Shape::setLockedCanvas(bool bLockedCanvas) mbLockedCanvas = bLockedCanvas; } +void Shape::setWPGChild(bool bWPG) +{ + mbWPGChild = bWPG; +} + void Shape::setWps(bool bWps) { mbWps = bWps; diff --git a/oox/source/shape/WpgContext.hxx b/oox/source/shape/WpgContext.hxx index 6da13d9663be..414e5f819bfe 100644 --- a/oox/source/shape/WpgContext.hxx +++ b/oox/source/shape/WpgContext.hxx @@ -28,7 +28,7 @@ public: const oox::drawingml::ShapePtr& getShape() const { return mpShape; } - const bool& isFullWPGSupport() { return m_bFullWPGSupport; }; + const bool& isFullWPGSupport() const { return m_bFullWPGSupport; }; void setFullWPGSupport(const bool& rbUse) { m_bFullWPGSupport = rbUse; }; private: diff --git a/oox/source/shape/WpsContext.cxx b/oox/source/shape/WpsContext.cxx index 5eaff0abe6e0..d39f93fc8402 100644 --- a/oox/source/shape/WpsContext.cxx +++ b/oox/source/shape/WpsContext.cxx @@ -8,6 +8,7 @@ */ #include "WpsContext.hxx" +#include "WpgContext.hxx" #include <basegfx/matrix/b2dhommatrix.hxx> #include <basegfx/tuple/b2dtuple.hxx> #include <comphelper/sequenceashashmap.hxx> @@ -24,6 +25,9 @@ #include <oox/token/namespaces.hxx> #include <oox/token/tokens.hxx> #include <oox/drawingml/shape.hxx> +#include <oox/drawingml/drawingmltypes.hxx> +#include <drawingml/textbody.hxx> +#include <drawingml/textbodyproperties.hxx> #include <optional> @@ -39,6 +43,11 @@ WpsContext::WpsContext(ContextHandler2Helper const& rParent, uno::Reference<draw { if (mpShapePtr) mpShapePtr->setWps(true); + + if (const auto pParent = dynamic_cast<const WpgContext*>(&rParent)) + m_bHasWPGParent = pParent->isFullWPGSupport(); + else + m_bHasWPGParent = false; } WpsContext::~WpsContext() = default; @@ -169,6 +178,40 @@ oox::core::ContextHandlerRef WpsContext::onCreateContext(sal_Int32 nElementToken return this; } + else if (m_bHasWPGParent && mpShapePtr) + { + // this WPS context has to be inside a WPG shape, so the <BodyPr> element + // cannot be applied to mxShape member, use mpShape instead, and after the + // the parent shape finished, apply it for its children. + mpShapePtr->setWPGChild(true); + oox::drawingml::TextBodyPtr pTextBody; + pTextBody.reset(new oox::drawingml::TextBody()); + + if (rAttribs.hasAttribute(XML_anchor)) + { + drawing::TextVerticalAdjust eAdjust + = drawingml::GetTextVerticalAdjust(rAttribs.getToken(XML_anchor, XML_t)); + pTextBody->getTextProperties().meVA = eAdjust; + } + + sal_Int32 aInsets[] = { XML_lIns, XML_tIns, XML_rIns, XML_bIns }; + for (int i = 0; i < 4; ++i) + { + if (rAttribs.hasAttribute(XML_lIns)) + { + OptValue<OUString> oValue = rAttribs.getString(aInsets[i]); + if (oValue.has()) + pTextBody->getTextProperties().moInsets[i] + = oox::drawingml::GetCoordinate(oValue.get()); + else + // Defaults from the spec: left/right: 91440 EMU, top/bottom: 45720 EMU + pTextBody->getTextProperties().moInsets[i] + = (aInsets[i] == XML_lIns || aInsets[i] == XML_rIns) ? 254 : 127; + } + } + + mpShapePtr->setTextBody(pTextBody); + } break; case XML_noAutofit: case XML_spAutoFit: diff --git a/oox/source/shape/WpsContext.hxx b/oox/source/shape/WpsContext.hxx index 1cb6106324da..29110b6fbf8e 100644 --- a/oox/source/shape/WpsContext.hxx +++ b/oox/source/shape/WpsContext.hxx @@ -36,6 +36,7 @@ public: private: css::uno::Reference<css::drawing::XShape> mxShape; + bool m_bHasWPGParent; }; } |