summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@suse.cz>2013-07-17 15:32:03 +0200
committerMiklos Vajna <vmiklos@suse.cz>2013-07-17 17:57:36 +0200
commit7c0a1557406ffffbb8145f8035ce86d31e927667 (patch)
treec4a4f63b1a0b234ac8aea2d84697784956b6208f
parent3bbcae718be74a2e47effeec99655f53f97bed90 (diff)
Related: fdo#65632 DOCX filter: fix import of non-redlined footnote
Change-Id: Ie1a86e6b59c43c3ee54076d5d68aa3fca0d6a515
-rwxr-xr-xsw/qa/extras/ooxmlimport/data/fdo65632.docxbin0 -> 12862 bytes
-rw-r--r--sw/qa/extras/ooxmlimport/ooxmlimport.cxx13
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.cxx23
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.hxx2
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
new file mode 100755
index 000000000000..8c336c20fdfc
--- /dev/null
+++ b/sw/qa/extras/ooxmlimport/data/fdo65632.docx
Binary files differ
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;