oox/source/token/tokens.txt | 1 sw/qa/extras/ooxmlimport/data/n780853.docx |binary sw/qa/extras/ooxmlimport/ooxmlimport.cxx | 15 ++++++++++ writerfilter/source/dmapper/DomainMapper.cxx | 8 +++++ writerfilter/source/dmapper/DomainMapper_Impl.cxx | 13 ++++++++- writerfilter/source/dmapper/DomainMapper_Impl.hxx | 6 ++++ writerfilter/source/ooxml/OOXMLFastContextHandler.cxx | 26 ++++++++++++++++++ writerfilter/source/ooxml/OOXMLFastContextHandler.hxx | 2 + writerfilter/source/ooxml/model.xml | 3 ++ 9 files changed, 73 insertions(+), 1 deletion(-)
New commits: commit 7ea71eb8a28c4b41949299ff7d4b391486c90eea Author: Miklos Vajna <[email protected]> Date: Tue Sep 25 08:58:18 2012 +0100 n#780853 testcase Change-Id: I5b5d5c16722d66cd3a583f9cc5d6d6bdc6da5047 diff --git a/sw/qa/extras/ooxmlimport/data/n780853.docx b/sw/qa/extras/ooxmlimport/data/n780853.docx new file mode 100644 index 0000000..fed8276 Binary files /dev/null and b/sw/qa/extras/ooxmlimport/data/n780853.docx differ diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx index 34581e5..f7c75c5 100644 --- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx +++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx @@ -93,6 +93,7 @@ public: void testN779627(); void testFdo55187(); void testN780563(); + void testN780853(); CPPUNIT_TEST_SUITE(Test); #if !defined(MACOSX) && !defined(WNT) @@ -132,6 +133,7 @@ public: CPPUNIT_TEST(testN779627); CPPUNIT_TEST(testFdo55187); CPPUNIT_TEST(testN780563); + CPPUNIT_TEST(testN780853); #endif CPPUNIT_TEST_SUITE_END(); @@ -907,6 +909,19 @@ void Test::testN780563() CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount( )); } +void Test::testN780853() +{ + /* + * The problem was that the table was not imported. + * + * xray ThisComponent.TextTables.Count 'was 0 + */ + load("n780853.docx"); + uno::Reference<text::XTextTablesSupplier> xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xIndexAccess(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); +} + CPPUNIT_TEST_SUITE_REGISTRATION(Test); CPPUNIT_PLUGIN_IMPLEMENT(); commit 73bd937420b9a99e1e35950e3f9dcbcfd874876d Author: Miklos Vajna <[email protected]> Date: Tue Sep 25 08:57:48 2012 +0100 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 diff --git a/oox/source/token/tokens.txt b/oox/source/token/tokens.txt index 64979d5..94644b4 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 cd4a17c..9bcccf3 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 112b837..d9dee50 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 845d04d..5f722f8 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 a8112d6..09dee93 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 688a476..b47f611 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 54f4b20..bf25aa3 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"/> _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
