summaryrefslogtreecommitdiff
path: root/writerfilter
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@suse.cz>2012-09-25 08:57:48 +0100
committerMiklos Vajna <vmiklos@suse.cz>2012-09-25 09:58:42 +0200
commit73bd937420b9a99e1e35950e3f9dcbcfd874876d (patch)
tree94ff1f5781d55017b505a6c76f61134b882d1241 /writerfilter
parente13ee4d45d1b17e422e35dcd1446c73ad8bc920a (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
Diffstat (limited to 'writerfilter')
-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
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"/>