diff options
-rw-r--r-- | sw/qa/extras/ooxmlexport/data/tdf106132.docx | bin | 0 -> 5851 bytes | |||
-rw-r--r-- | sw/qa/extras/ooxmlexport/ooxmlexport9.cxx | 7 | ||||
-rw-r--r-- | writerfilter/inc/ooxml/OOXMLDocument.hxx | 4 | ||||
-rw-r--r-- | writerfilter/source/ooxml/OOXMLDocumentImpl.cxx | 20 | ||||
-rw-r--r-- | writerfilter/source/ooxml/OOXMLDocumentImpl.hxx | 6 | ||||
-rw-r--r-- | writerfilter/source/ooxml/OOXMLFastContextHandler.cxx | 45 | ||||
-rw-r--r-- | writerfilter/source/ooxml/OOXMLFastContextHandler.hxx | 2 |
7 files changed, 63 insertions, 21 deletions
diff --git a/sw/qa/extras/ooxmlexport/data/tdf106132.docx b/sw/qa/extras/ooxmlexport/data/tdf106132.docx Binary files differnew file mode 100644 index 000000000000..e342898141b1 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf106132.docx diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx index cf729eab49a1..76a567764806 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx @@ -439,6 +439,13 @@ DECLARE_OOXMLEXPORT_TEST(testTdf103573, "tdf103573.docx") CPPUNIT_ASSERT_EQUAL_MESSAGE("Not centered horizontally relatively to right page border", text::RelOrientation::PAGE_RIGHT, nValue); } +DECLARE_OOXMLEXPORT_TEST(testTdf106132, "tdf106132.docx") +{ + uno::Reference<beans::XPropertySet> xShape(getShape(1), uno::UNO_QUERY); + // This was 250, <wps:bodyPr ... rIns="0" ...> was ignored for an outer shape. + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), getProperty<sal_Int32>(xShape, "TextRightDistance")); +} + DECLARE_OOXMLEXPORT_TEST(testBnc519228OddBreaks, "bnc519228_odd-breaksB.docx") { // Check that all the normal styles are not set as right-only, those should be only those used after odd page breaks. diff --git a/writerfilter/inc/ooxml/OOXMLDocument.hxx b/writerfilter/inc/ooxml/OOXMLDocument.hxx index c7241f946311..8f0a12d3189c 100644 --- a/writerfilter/inc/ooxml/OOXMLDocument.hxx +++ b/writerfilter/inc/ooxml/OOXMLDocument.hxx @@ -221,6 +221,10 @@ public: virtual const OUString & getTarget() const = 0; virtual css::uno::Reference<css::xml::sax::XFastShapeContextHandler> getShapeContext( ) = 0; virtual void setShapeContext( css::uno::Reference<css::xml::sax::XFastShapeContextHandler> xContext ) = 0; + /// Push context of drawingML shapes, so nested shapes are handled separately. + virtual void pushShapeContext() = 0; + /// Pop context of a previously pushed drawingML shape. + virtual void popShapeContext() = 0; virtual css::uno::Reference<css::xml::dom::XDocument> getThemeDom( ) = 0; virtual css::uno::Reference<css::xml::dom::XDocument> getGlossaryDocDom( ) = 0; virtual css::uno::Sequence<css::uno::Sequence< css::uno::Any> > getGlossaryDomList() = 0; diff --git a/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx b/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx index f54a85b98d29..c32243636077 100644 --- a/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx +++ b/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx @@ -65,6 +65,7 @@ OOXMLDocumentImpl::OOXMLDocumentImpl(OOXMLStream::Pointer_t const & pStream, con , m_rBaseURL(utl::MediaDescriptor(rDescriptor).getUnpackedValueOrDefault("DocumentBaseURL", OUString())) , maMediaDescriptor(rDescriptor) { + pushShapeContext(); } OOXMLDocumentImpl::~OOXMLDocumentImpl() @@ -903,12 +904,27 @@ const uno::Sequence<beans::PropertyValue>& OOXMLDocumentImpl::getMediaDescriptor void OOXMLDocumentImpl::setShapeContext( uno::Reference<xml::sax::XFastShapeContextHandler> xContext ) { - mxShapeContext = xContext; + if (!maShapeContexts.empty()) + maShapeContexts.top() = xContext; } uno::Reference<xml::sax::XFastShapeContextHandler> OOXMLDocumentImpl::getShapeContext( ) { - return mxShapeContext; + if (!maShapeContexts.empty()) + return maShapeContexts.top(); + else + return uno::Reference<xml::sax::XFastShapeContextHandler>(); +} + +void OOXMLDocumentImpl::pushShapeContext() +{ + maShapeContexts.push(uno::Reference<xml::sax::XFastShapeContextHandler>()); +} + +void OOXMLDocumentImpl::popShapeContext() +{ + if (!maShapeContexts.empty()) + maShapeContexts.pop(); } uno::Reference<xml::dom::XDocument> OOXMLDocumentImpl::getThemeDom( ) diff --git a/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx b/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx index ff4b8263add6..adc834dd1146 100644 --- a/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx +++ b/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx @@ -27,6 +27,7 @@ #include "OOXMLPropertySet.hxx" #include <vector> +#include <stack> namespace writerfilter { namespace ooxml @@ -42,7 +43,8 @@ class OOXMLDocumentImpl : public OOXMLDocument css::uno::Reference<css::drawing::XDrawPage> mxDrawPage; css::uno::Reference<css::xml::dom::XDocument> mxGlossaryDocDom; css::uno::Sequence < css::uno::Sequence< css::uno::Any > > mxGlossaryDomList; - css::uno::Reference<css::xml::sax::XFastShapeContextHandler> mxShapeContext; + /// Stack of shape contexts, 1 element for VML, 1 element / nesting level for drawingML. + std::stack< css::uno::Reference<css::xml::sax::XFastShapeContextHandler> > maShapeContexts; css::uno::Reference<css::xml::dom::XDocument> mxThemeDom; css::uno::Sequence<css::uno::Reference<css::xml::dom::XDocument> > mxCustomXmlDomList; css::uno::Sequence<css::uno::Reference<css::xml::dom::XDocument> > mxCustomXmlDomPropsList; @@ -128,6 +130,8 @@ public: virtual const OUString & getTarget() const override; virtual css::uno::Reference<css::xml::sax::XFastShapeContextHandler> getShapeContext( ) override; virtual void setShapeContext( css::uno::Reference<css::xml::sax::XFastShapeContextHandler> xContext ) override; + void pushShapeContext() override; + void popShapeContext() override; virtual css::uno::Reference<css::xml::dom::XDocument> getThemeDom() override; virtual css::uno::Sequence<css::uno::Reference<css::xml::dom::XDocument> > getCustomXmlDomList() override; virtual css::uno::Sequence<css::uno::Reference<css::xml::dom::XDocument> > getCustomXmlDomPropsList() override; diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx index acb40f85e7d8..1bf94413caa6 100644 --- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx +++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx @@ -1587,29 +1587,14 @@ void OOXMLFastContextHandlerTextTable::lcl_endFastElement OOXMLFastContextHandlerShape::OOXMLFastContextHandlerShape (OOXMLFastContextHandler * pContext) : OOXMLFastContextHandlerProperties(pContext), m_bShapeSent( false ), - m_bShapeStarted(false) + m_bShapeStarted(false), m_bShapeContextPushed(false) { - mrShapeContext.set( getDocument( )->getShapeContext( ) ); - if ( !mrShapeContext.is( ) ) - { - // Define the shape context for the whole document - mrShapeContext = css::xml::sax::FastShapeContextHandler::create( - getComponentContext()); - getDocument()->setShapeContext( mrShapeContext ); - } - - mrShapeContext->setModel(getDocument()->getModel()); - uno::Reference<document::XDocumentPropertiesSupplier> xDocSupplier(getDocument()->getModel(), uno::UNO_QUERY_THROW); - mrShapeContext->setDocumentProperties(xDocSupplier->getDocumentProperties()); - mrShapeContext->setDrawPage(getDocument()->getDrawPage()); - mrShapeContext->setMediaDescriptor(getDocument()->getMediaDescriptor()); - - mrShapeContext->setRelationFragmentPath - (mpParserState->getTarget()); } OOXMLFastContextHandlerShape::~OOXMLFastContextHandlerShape() { + if (m_bShapeContextPushed) + getDocument()->popShapeContext(); } void OOXMLFastContextHandlerShape::lcl_startFastElement @@ -1635,6 +1620,30 @@ void SAL_CALL OOXMLFastContextHandlerShape::startUnknownElement void OOXMLFastContextHandlerShape::setToken(Token_t nToken) { + if (nToken == Token_t(NMSP_wps | XML_wsp) || nToken == Token_t(NMSP_dmlPicture | XML_pic)) + { + // drawingML shapes are independent, <wps:bodyPr> is not parsed after + // shape contents without pushing/popping the stack. + m_bShapeContextPushed = true; + getDocument()->pushShapeContext(); + } + + mrShapeContext.set(getDocument()->getShapeContext()); + if (!mrShapeContext.is()) + { + // Define the shape context for the whole document + mrShapeContext = css::xml::sax::FastShapeContextHandler::create(getComponentContext()); + getDocument()->setShapeContext(mrShapeContext); + } + + mrShapeContext->setModel(getDocument()->getModel()); + uno::Reference<document::XDocumentPropertiesSupplier> xDocSupplier(getDocument()->getModel(), uno::UNO_QUERY_THROW); + mrShapeContext->setDocumentProperties(xDocSupplier->getDocumentProperties()); + mrShapeContext->setDrawPage(getDocument()->getDrawPage()); + mrShapeContext->setMediaDescriptor(getDocument()->getMediaDescriptor()); + + mrShapeContext->setRelationFragmentPath(mpParserState->getTarget()); + OOXMLFastContextHandler::setToken(nToken); if (mrShapeContext.is()) diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx index b33f4749dedd..b980bbc3715f 100644 --- a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx +++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx @@ -432,6 +432,8 @@ class OOXMLFastContextHandlerShape: public OOXMLFastContextHandlerProperties private: bool m_bShapeSent; bool m_bShapeStarted; + /// Is it necessary to pop the stack in the dtor? + bool m_bShapeContextPushed; public: explicit OOXMLFastContextHandlerShape(OOXMLFastContextHandler * pContext); |