Kaydet (Commit) 7c0a1557 authored tarafından Miklos Vajna's avatar Miklos Vajna

Related: fdo#65632 DOCX filter: fix import of non-redlined footnote

Change-Id: Ie1a86e6b59c43c3ee54076d5d68aa3fca0d6a515
üst 3bbcae71
...@@ -124,6 +124,7 @@ public: ...@@ -124,6 +124,7 @@ public:
void testFdo43641(); void testFdo43641();
void testTableAutoColumnFixedSize(); void testTableAutoColumnFixedSize();
void testFdo46361(); void testFdo46361();
void testFdo65632();
CPPUNIT_TEST_SUITE(Test); CPPUNIT_TEST_SUITE(Test);
#if !defined(MACOSX) && !defined(WNT) #if !defined(MACOSX) && !defined(WNT)
...@@ -213,6 +214,7 @@ void Test::run() ...@@ -213,6 +214,7 @@ void Test::run()
{"fdo43641.docx", &Test::testFdo43641}, {"fdo43641.docx", &Test::testFdo43641},
{"table-auto-column-fixed-size.docx", &Test::testTableAutoColumnFixedSize}, {"table-auto-column-fixed-size.docx", &Test::testTableAutoColumnFixedSize},
{"fdo46361.docx", &Test::testFdo46361}, {"fdo46361.docx", &Test::testFdo46361},
{"fdo65632.docx", &Test::testFdo65632},
}; };
header(); header();
for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i) for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i)
...@@ -1503,6 +1505,17 @@ void Test::testFdo46361() ...@@ -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()); 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_TEST_SUITE_REGISTRATION(Test);
CPPUNIT_PLUGIN_IMPLEMENT(); CPPUNIT_PLUGIN_IMPLEMENT();
......
...@@ -209,6 +209,8 @@ DomainMapper_Impl::DomainMapper_Impl( ...@@ -209,6 +209,8 @@ DomainMapper_Impl::DomainMapper_Impl(
m_bUsingEnhancedFields = lcl_IsUsingEnhancedFields( m_xComponentContext ); m_bUsingEnhancedFields = lcl_IsUsingEnhancedFields( m_xComponentContext );
m_pSdtHelper = new SdtHelper(*this); m_pSdtHelper = new SdtHelper(*this);
m_aRedlines.push(std::vector<RedlineParamsPtr>());
} }
...@@ -1482,6 +1484,9 @@ void DomainMapper_Impl::PushFootOrEndnote( bool bIsFootnote ) ...@@ -1482,6 +1484,9 @@ void DomainMapper_Impl::PushFootOrEndnote( bool bIsFootnote )
{ {
try try
{ {
// Redlines outside the footnote should not affect footnote content
m_aRedlines.push(std::vector< RedlineParamsPtr >());
PropertyMapPtr pTopContext = GetTopContext(); PropertyMapPtr pTopContext = GetTopContext();
uno::Reference< text::XText > xFootnoteText; uno::Reference< text::XText > xFootnoteText;
if (GetTextFactory().is()) if (GetTextFactory().is())
...@@ -1573,9 +1578,9 @@ void DomainMapper_Impl::CheckParaRedline( uno::Reference< text::XTextRange > xRa ...@@ -1573,9 +1578,9 @@ void DomainMapper_Impl::CheckParaRedline( uno::Reference< text::XTextRange > xRa
void DomainMapper_Impl::CheckRedline( uno::Reference< text::XTextRange > xRange ) 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; vector< RedlineParamsPtr > aCleaned;
for (; pIt != m_aRedlines.end( ); ++pIt ) for (; pIt != m_aRedlines.top().end( ); ++pIt )
{ {
CreateRedline( xRange, *pIt ); CreateRedline( xRange, *pIt );
...@@ -1586,7 +1591,7 @@ void DomainMapper_Impl::CheckRedline( uno::Reference< text::XTextRange > xRange ...@@ -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( ) void DomainMapper_Impl::StartParaChange( )
...@@ -1629,6 +1634,8 @@ void DomainMapper_Impl::PopFootOrEndnote() ...@@ -1629,6 +1634,8 @@ void DomainMapper_Impl::PopFootOrEndnote()
RemoveLastParagraph(); RemoveLastParagraph();
if (!m_aTextAppendStack.empty()) if (!m_aTextAppendStack.empty())
m_aTextAppendStack.pop(); m_aTextAppendStack.pop();
m_aRedlines.pop();
} }
...@@ -3760,7 +3767,7 @@ void DomainMapper_Impl::AddNewRedline( ) ...@@ -3760,7 +3767,7 @@ void DomainMapper_Impl::AddNewRedline( )
pNew->m_nToken = ooxml::OOXML_mod; pNew->m_nToken = ooxml::OOXML_mod;
if ( !m_bIsParaChange ) if ( !m_bIsParaChange )
{ {
m_aRedlines.push_back( pNew ); m_aRedlines.top().push_back( pNew );
} }
else else
{ {
...@@ -3771,8 +3778,8 @@ void DomainMapper_Impl::AddNewRedline( ) ...@@ -3771,8 +3778,8 @@ void DomainMapper_Impl::AddNewRedline( )
RedlineParamsPtr DomainMapper_Impl::GetTopRedline( ) RedlineParamsPtr DomainMapper_Impl::GetTopRedline( )
{ {
RedlineParamsPtr pResult; RedlineParamsPtr pResult;
if ( !m_bIsParaChange && m_aRedlines.size( ) > 0 ) if ( !m_bIsParaChange && m_aRedlines.top().size( ) > 0 )
pResult = m_aRedlines.back( ); pResult = m_aRedlines.top().back( );
else if ( m_bIsParaChange ) else if ( m_bIsParaChange )
pResult = m_pParaRedline; pResult = m_pParaRedline;
return pResult; return pResult;
...@@ -3835,9 +3842,9 @@ void DomainMapper_Impl::SetCurrentRedlineToken( sal_Int32 nToken ) ...@@ -3835,9 +3842,9 @@ void DomainMapper_Impl::SetCurrentRedlineToken( sal_Int32 nToken )
void DomainMapper_Impl::RemoveCurrentRedline( ) void DomainMapper_Impl::RemoveCurrentRedline( )
{ {
if ( m_aRedlines.size( ) > 0 ) if ( m_aRedlines.top().size( ) > 0 )
{ {
m_aRedlines.pop_back( ); m_aRedlines.top().pop_back( );
} }
} }
......
...@@ -356,7 +356,7 @@ private: ...@@ -356,7 +356,7 @@ private:
::com::sun::star::uno::Reference< text::XTextRange > m_xFrameEndRange; ::com::sun::star::uno::Reference< text::XTextRange > m_xFrameEndRange;
// Redline stack // Redline stack
std::vector< RedlineParamsPtr > m_aRedlines; std::stack< std::vector< RedlineParamsPtr > > m_aRedlines;
RedlineParamsPtr m_pParaRedline; RedlineParamsPtr m_pParaRedline;
bool m_bIsParaChange; bool m_bIsParaChange;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment