diff options
author | Miklos Vajna <vmiklos@suse.cz> | 2013-07-17 15:32:03 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@suse.cz> | 2013-07-17 17:57:36 +0200 |
commit | 7c0a1557406ffffbb8145f8035ce86d31e927667 (patch) | |
tree | c4a4f63b1a0b234ac8aea2d84697784956b6208f | |
parent | 3bbcae718be74a2e47effeec99655f53f97bed90 (diff) |
Related: fdo#65632 DOCX filter: fix import of non-redlined footnote
Change-Id: Ie1a86e6b59c43c3ee54076d5d68aa3fca0d6a515
-rwxr-xr-x | sw/qa/extras/ooxmlimport/data/fdo65632.docx | bin | 0 -> 12862 bytes | |||
-rw-r--r-- | sw/qa/extras/ooxmlimport/ooxmlimport.cxx | 13 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper_Impl.cxx | 23 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper_Impl.hxx | 2 |
4 files changed, 29 insertions, 9 deletions
diff --git a/sw/qa/extras/ooxmlimport/data/fdo65632.docx b/sw/qa/extras/ooxmlimport/data/fdo65632.docx Binary files differnew file mode 100755 index 000000000000..8c336c20fdfc --- /dev/null +++ b/sw/qa/extras/ooxmlimport/data/fdo65632.docx diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx index 6d036a816e90..34e41b5e6ad8 100644 --- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx +++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx @@ -124,6 +124,7 @@ public: void testFdo43641(); void testTableAutoColumnFixedSize(); void testFdo46361(); + void testFdo65632(); CPPUNIT_TEST_SUITE(Test); #if !defined(MACOSX) && !defined(WNT) @@ -213,6 +214,7 @@ void Test::run() {"fdo43641.docx", &Test::testFdo43641}, {"table-auto-column-fixed-size.docx", &Test::testTableAutoColumnFixedSize}, {"fdo46361.docx", &Test::testFdo46361}, + {"fdo65632.docx", &Test::testFdo65632}, }; header(); for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i) @@ -1503,6 +1505,17 @@ void Test::testFdo46361() CPPUNIT_ASSERT_EQUAL(OUString("text\ntext\n"), uno::Reference<text::XTextRange>(xGroupShape->getByIndex(2), uno::UNO_QUERY)->getString()); } +void Test::testFdo65632() +{ + // The problem was that the footnote text had fake redline: only the body + // text has redline in fact. + uno::Reference<text::XFootnotesSupplier> xFootnotesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xFootnotes(xFootnotesSupplier->getFootnotes(), uno::UNO_QUERY); + uno::Reference<text::XText> xText(xFootnotes->getByIndex(0), uno::UNO_QUERY); + //uno::Reference<text::XTextRange> xParagraph = getParagraphOfText(1, xText); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty<OUString>(getRun(getParagraphOfText(1, xText), 1), "TextPortionType")); +} + CPPUNIT_TEST_SUITE_REGISTRATION(Test); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index badcb445a4ca..cc1dfba29550 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -209,6 +209,8 @@ DomainMapper_Impl::DomainMapper_Impl( m_bUsingEnhancedFields = lcl_IsUsingEnhancedFields( m_xComponentContext ); m_pSdtHelper = new SdtHelper(*this); + + m_aRedlines.push(std::vector<RedlineParamsPtr>()); } @@ -1482,6 +1484,9 @@ void DomainMapper_Impl::PushFootOrEndnote( bool bIsFootnote ) { try { + // Redlines outside the footnote should not affect footnote content + m_aRedlines.push(std::vector< RedlineParamsPtr >()); + PropertyMapPtr pTopContext = GetTopContext(); uno::Reference< text::XText > xFootnoteText; if (GetTextFactory().is()) @@ -1573,9 +1578,9 @@ void DomainMapper_Impl::CheckParaRedline( uno::Reference< text::XTextRange > xRa void DomainMapper_Impl::CheckRedline( uno::Reference< text::XTextRange > xRange ) { - vector<RedlineParamsPtr>::iterator pIt = m_aRedlines.begin( ); + vector<RedlineParamsPtr>::iterator pIt = m_aRedlines.top().begin( ); vector< RedlineParamsPtr > aCleaned; - for (; pIt != m_aRedlines.end( ); ++pIt ) + for (; pIt != m_aRedlines.top().end( ); ++pIt ) { CreateRedline( xRange, *pIt ); @@ -1586,7 +1591,7 @@ void DomainMapper_Impl::CheckRedline( uno::Reference< text::XTextRange > xRange } } - m_aRedlines.swap( aCleaned ); + m_aRedlines.top().swap( aCleaned ); } void DomainMapper_Impl::StartParaChange( ) @@ -1629,6 +1634,8 @@ void DomainMapper_Impl::PopFootOrEndnote() RemoveLastParagraph(); if (!m_aTextAppendStack.empty()) m_aTextAppendStack.pop(); + + m_aRedlines.pop(); } @@ -3760,7 +3767,7 @@ void DomainMapper_Impl::AddNewRedline( ) pNew->m_nToken = ooxml::OOXML_mod; if ( !m_bIsParaChange ) { - m_aRedlines.push_back( pNew ); + m_aRedlines.top().push_back( pNew ); } else { @@ -3771,8 +3778,8 @@ void DomainMapper_Impl::AddNewRedline( ) RedlineParamsPtr DomainMapper_Impl::GetTopRedline( ) { RedlineParamsPtr pResult; - if ( !m_bIsParaChange && m_aRedlines.size( ) > 0 ) - pResult = m_aRedlines.back( ); + if ( !m_bIsParaChange && m_aRedlines.top().size( ) > 0 ) + pResult = m_aRedlines.top().back( ); else if ( m_bIsParaChange ) pResult = m_pParaRedline; return pResult; @@ -3835,9 +3842,9 @@ void DomainMapper_Impl::SetCurrentRedlineToken( sal_Int32 nToken ) void DomainMapper_Impl::RemoveCurrentRedline( ) { - if ( m_aRedlines.size( ) > 0 ) + if ( m_aRedlines.top().size( ) > 0 ) { - m_aRedlines.pop_back( ); + m_aRedlines.top().pop_back( ); } } diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx index 374cdf5cb0c6..e342ebe3c60e 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx @@ -356,7 +356,7 @@ private: ::com::sun::star::uno::Reference< text::XTextRange > m_xFrameEndRange; // Redline stack - std::vector< RedlineParamsPtr > m_aRedlines; + std::stack< std::vector< RedlineParamsPtr > > m_aRedlines; RedlineParamsPtr m_pParaRedline; bool m_bIsParaChange; |