summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@suse.cz>2012-09-25 08:57:48 +0100
committerMiklos Vajna <vmiklos@suse.cz>2012-09-28 15:41:10 +0200
commit7c95a98331dcd02e3820ff3c14e90480635a24f5 (patch)
tree63a964b6d3b60b72101d2379afb18a6419e8b06d
parentd5529ab1e4d2c26c7e609251e2ef2530ab56be73 (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.txt1
-rw-r--r--writerfilter/source/dmapper/DomainMapper.cxx8
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.cxx13
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.hxx6
-rw-r--r--writerfilter/source/ooxml/OOXMLFastContextHandler.cxx26
-rw-r--r--writerfilter/source/ooxml/OOXMLFastContextHandler.hxx2
-rw-r--r--writerfilter/source/ooxml/model.xml3
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"/>