diff options
Diffstat (limited to 'writerfilter')
-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 |
5 files changed, 56 insertions, 21 deletions
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 089c0e2a8f26..abb7c522e586 100644 --- a/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx +++ b/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx @@ -66,6 +66,7 @@ OOXMLDocumentImpl::OOXMLDocumentImpl(OOXMLStream::Pointer_t const & pStream, con , m_rBaseURL(utl::MediaDescriptor(rDescriptor).getUnpackedValueOrDefault("DocumentBaseURL", OUString())) , maMediaDescriptor(rDescriptor) { + pushShapeContext(); } OOXMLDocumentImpl::~OOXMLDocumentImpl() @@ -909,12 +910,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 43bdeb651d78..17fde7c89079 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 @@ -43,7 +44,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 48f51b4df512..f10a633f6a64 100644 --- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx +++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx @@ -1551,29 +1551,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 @@ -1599,6 +1584,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 ba0ee9a3d66b..396dafd2b136 100644 --- a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx +++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx @@ -427,6 +427,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); |