diff options
author | Miklos Vajna <vmiklos@suse.cz> | 2012-09-25 08:57:48 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@suse.cz> | 2012-09-25 09:58:42 +0200 |
commit | 73bd937420b9a99e1e35950e3f9dcbcfd874876d (patch) | |
tree | 94ff1f5781d55017b505a6c76f61134b882d1241 /writerfilter | |
parent | Be more consistent (diff) | |
download | core-73bd937420b9a99e1e35950e3f9dcbcfd874876d.tar.gz core-73bd937420b9a99e1e35950e3f9dcbcfd874876d.zip |
n#780853 fix DOCX import of w:sdtContent in table cell
The problem was that the framePr token made the table import fail. Given
that frames inside w:sdtContent are invisible anway, just ignore them.
Change-Id: I88ab9d5dd6cf362c629de74bc079c3108725f0a1
Diffstat (limited to 'writerfilter')
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper.cxx | 8 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper_Impl.cxx | 13 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper_Impl.hxx | 6 | ||||
-rw-r--r-- | writerfilter/source/ooxml/OOXMLFastContextHandler.cxx | 26 | ||||
-rw-r--r-- | writerfilter/source/ooxml/OOXMLFastContextHandler.hxx | 2 | ||||
-rw-r--r-- | writerfilter/source/ooxml/model.xml | 3 |
6 files changed, 57 insertions, 1 deletions
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx index cd4a17c09d9a..9bcccf3a6ced 100644 --- a/writerfilter/source/dmapper/DomainMapper.cxx +++ b/writerfilter/source/dmapper/DomainMapper.cxx @@ -1419,6 +1419,12 @@ void DomainMapper::lcl_attribute(Id nName, Value & val) } } break; + case NS_ooxml::LN_CT_SdtBlock_sdtContent: + m_pImpl->SetSdt(true); + break; + case NS_ooxml::LN_CT_SdtBlock_sdtEndContent: + m_pImpl->SetSdt(false); + break; default: { #if OSL_DEBUG_LEVEL > 0 @@ -2878,6 +2884,8 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, PropertyMapPtr rContext, SprmType } break; case NS_ooxml::LN_CT_PPrBase_framePr: + // Avoid frames if we're inside a structured document tag, would just cause outher tables fail to create. + if (!m_pImpl->GetSdt()) { PropertyMapPtr pContext = m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH); if( pContext.get() ) diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index 112b8378471e..d9dee507e29c 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -201,7 +201,8 @@ DomainMapper_Impl::DomainMapper_Impl( m_bIsFirstParaInSection( true ), m_bIsLastParaInSection( false ), m_bParaSectpr( false ), - m_bUsingEnhancedFields( false ) + m_bUsingEnhancedFields( false ), + m_bSdt(false) { appendTableManager( ); GetBodyText(); @@ -325,6 +326,16 @@ bool DomainMapper_Impl::GetParaSectpr() return m_bParaSectpr; } +void DomainMapper_Impl::SetSdt(bool bSdt) +{ + m_bSdt = bSdt; +} + +bool DomainMapper_Impl::GetSdt() +{ + return m_bSdt; +} + bool DomainMapper_Impl::GetParaChanged() { return m_bParaChanged; diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx index 845d04dd659c..5f722f807ebc 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx @@ -355,6 +355,8 @@ private: /// If the current paragraph contains section property definitions. bool m_bParaSectpr; bool m_bUsingEnhancedFields; + /// If the current paragraph is inside a structured document element. + bool m_bSdt; //annotation import uno::Reference< beans::XPropertySet > m_xAnnotationField; @@ -417,6 +419,10 @@ public: bool GetIsFirstParagraphInSection(); void SetParaSectpr(bool bParaSectpr); bool GetParaSectpr(); + /// Setter method for m_bSdt. + void SetSdt(bool bSdt); + /// Getter method for m_bSdt. + bool GetSdt(); bool GetParaChanged(); void deferBreak( BreakType deferredBreakType ); diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx index a8112d66815c..09dee9314975 100644 --- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx +++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx @@ -617,6 +617,32 @@ void OOXMLFastContextHandler::endParagraphGroup() } } +void OOXMLFastContextHandler::startSdt() +{ +#ifdef DEBUG_CONTEXT_HANDLER + debug_logger->element("contexthandler.startSdt"); +#endif + + OOXMLPropertySet * pProps = new OOXMLPropertySetImpl(); + OOXMLValue::Pointer_t pVal(new OOXMLIntegerValue(1)); + OOXMLProperty::Pointer_t pProp(new OOXMLPropertyImpl(NS_ooxml::LN_CT_SdtBlock_sdtContent, pVal, OOXMLPropertyImpl::ATTRIBUTE)); + pProps->add(pProp); + mpStream->props(writerfilter::Reference<Properties>::Pointer_t(pProps)); +} + +void OOXMLFastContextHandler::endSdt() +{ +#ifdef DEBUG_CONTEXT_HANDLER + debug_logger->element("contexthandler.endSdt"); +#endif + + OOXMLPropertySet * pProps = new OOXMLPropertySetImpl(); + OOXMLValue::Pointer_t pVal(new OOXMLIntegerValue(1)); + OOXMLProperty::Pointer_t pProp(new OOXMLPropertyImpl(NS_ooxml::LN_CT_SdtBlock_sdtEndContent, pVal, OOXMLPropertyImpl::ATTRIBUTE)); + pProps->add(pProp); + mpStream->props(writerfilter::Reference<Properties>::Pointer_t(pProps)); +} + void OOXMLFastContextHandler::startSectionGroup() { #ifdef DEBUG_CONTEXT_HANDLER diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx index 688a476c9b24..b47f611046a8 100644 --- a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx +++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx @@ -184,6 +184,8 @@ public: void endParagraphGroup(); void startCharacterGroup(); void endCharacterGroup(); + void startSdt(); + void endSdt(); void startField(); void fieldSeparator(); diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml index 54f4b201de2f..bf25aa3c3b31 100644 --- a/writerfilter/source/ooxml/model.xml +++ b/writerfilter/source/ooxml/model.xml @@ -22748,6 +22748,9 @@ <element name="sdtPr" tokenid="ooxml:CT_SdtBlock_sdtPr"/> <element name="sdtEndPr" tokenid="ooxml:CT_SdtBlock_sdtEndPr"/> <element name="sdtContent" tokenid="ooxml:CT_SdtBlock_sdtContent"/> + <element name="sdtEndContent" tokenid="ooxml:CT_SdtBlock_sdtEndContent"/> + <action name="start" action="startSdt"/> + <action name="end" action="endSdt"/> </resource> <resource name="CT_SdtRun" resource="Stream" tag="field"> <element name="sdtPr" tokenid="ooxml:CT_SdtRun_sdtPr"/> |