diff options
author | Miklos Vajna <vmiklos@suse.cz> | 2012-09-25 08:57:48 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@suse.cz> | 2012-09-28 15:41:10 +0200 |
commit | 7c95a98331dcd02e3820ff3c14e90480635a24f5 (patch) | |
tree | 63a964b6d3b60b72101d2379afb18a6419e8b06d | |
parent | d5529ab1e4d2c26c7e609251e2ef2530ab56be73 (diff) |
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
(cherry picked from commit 73bd937420b9a99e1e35950e3f9dcbcfd874876d)
-rw-r--r-- | oox/source/token/tokens.txt | 1 | ||||
-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 |
7 files changed, 58 insertions, 1 deletions
diff --git a/oox/source/token/tokens.txt b/oox/source/token/tokens.txt index fee78eea056e..b51b3cb829fb 100644 --- a/oox/source/token/tokens.txt +++ b/oox/source/token/tokens.txt @@ -4392,6 +4392,7 @@ sd sdt sdtContent sdtContentLocked +sdtEndContent sdtEndPr sdtLocked sdtPr diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx index 2078994070e4..e17216da1839 100644 --- a/writerfilter/source/dmapper/DomainMapper.cxx +++ b/writerfilter/source/dmapper/DomainMapper.cxx @@ -1476,6 +1476,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 @@ -2951,6 +2957,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 6a13eee91a70..1015af7a762f 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -210,7 +210,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(); @@ -335,6 +336,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 32e90bae168b..c8b68839b700 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx @@ -356,6 +356,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; @@ -415,6 +417,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 f062a264392c..cc02c627220e 100644 --- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx +++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx @@ -626,6 +626,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 31ca2f73281f..f89d4e696073 100644 --- a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx +++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx @@ -193,6 +193,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 8911049d2d45..f8feb4a1a172 100644 --- a/writerfilter/source/ooxml/model.xml +++ b/writerfilter/source/ooxml/model.xml @@ -22719,6 +22719,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"/> |