sw/qa/extras/layout/data/tdf151954.docx |binary sw/qa/extras/layout/layout2.cxx | 18 ++++++++++++++++++ writerfilter/source/dmapper/DomainMapper.cxx | 4 ++++ writerfilter/source/dmapper/DomainMapper_Impl.cxx | 14 +++++++++++++- writerfilter/source/dmapper/DomainMapper_Impl.hxx | 3 +++ writerfilter/source/ooxml/model.xml | 2 ++ 6 files changed, 40 insertions(+), 1 deletion(-)
New commits: commit 386402ded6db4614c943c94f6e68bc1de1a38fe6 Author: László Németh <nem...@numbertext.org> AuthorDate: Thu Nov 24 13:28:34 2022 +0100 Commit: László Németh <nem...@numbertext.org> CommitDate: Thu Nov 24 16:57:54 2022 +0100 tdf#151954 DOCX import: fix text moving before paragraph end Tracked text moving before paragraph end was extended to the paragraph end, too. Follow-up to commit 11071d95f4f3cbe578c3393729c42b7cce011b45 "tdf#149711 sw_redlinenum DOCX: import moveTo paragraph mark" and commit d32d9a2b3c5e3963f4a18f6c7bbf50fab2e9b2be "tdf#123460 DOCX track changes: moveFrom completely". Change-Id: I668a3ef83482bded9ab94dcd0111f8ed05e8471c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/143231 Tested-by: Jenkins Reviewed-by: László Németh <nem...@numbertext.org> diff --git a/sw/qa/extras/layout/data/tdf151954.docx b/sw/qa/extras/layout/data/tdf151954.docx new file mode 100644 index 000000000000..64e4782f7ab9 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf151954.docx differ diff --git a/sw/qa/extras/layout/layout2.cxx b/sw/qa/extras/layout/layout2.cxx index 14a03999b091..259a6ea66292 100644 --- a/sw/qa/extras/layout/layout2.cxx +++ b/sw/qa/extras/layout/layout2.cxx @@ -635,6 +635,24 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf149711_importDOCXMoveToParagraphMar assertXPath(pXmlDoc, "/root/page[1]/body/txt", 5); } +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf151954) +{ + createSwDoc("tdf151954.docx"); + SwDoc* pDoc = getSwDoc(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/txt", 2); + + // accept tracked insertion (moveTo) + SwEditShell* const pEditShell(pDoc->GetEditShell()); + CPPUNIT_ASSERT_EQUAL(static_cast<SwRedlineTable::size_type>(3), pEditShell->GetRedlineCount()); + pEditShell->AcceptRedline(0); + + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + // This was 1 (moveFrom was extended to the paragraph mark) + assertXPath(pXmlDoc, "/root/page[1]/body/txt", 2); +} + CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testRedlineNumberInFootnote) { createSwDoc("tdf85610.fodt"); diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx index 3521f705fdf8..93cb36cb8e55 100644 --- a/writerfilter/source/dmapper/DomainMapper.cxx +++ b/writerfilter/source/dmapper/DomainMapper.cxx @@ -2604,6 +2604,10 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const PropertyMapPtr& rContext ) if (m_pImpl->hasTableManager()) m_pImpl->getTableManager().setMoved( OUString() ); break; + case NS_ooxml::LN_CT_ParaRPr_moveFrom: + case NS_ooxml::LN_CT_ParaRPr_moveTo: + m_pImpl->StartParaMarkerMove( ); + break; case NS_ooxml::LN_paratrackchange: m_pImpl->StartParaMarkerChange( ); [[fallthrough]]; diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index ec0861caa4e3..3e17187b40fa 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -359,6 +359,7 @@ DomainMapper_Impl::DomainMapper_Impl( m_bLineNumberingSet( false ), m_bIsInFootnoteProperties( false ), m_bIsParaMarkerChange( false ), + m_bIsParaMarkerMove( false ), m_bRedlineImageInPreviousRun( false ), m_bParaChanged( false ), m_bIsFirstParaInSection( true ), @@ -3439,7 +3440,7 @@ void DomainMapper_Impl::CheckParaMarkerRedline( uno::Reference< text::XTextRange m_currentRedline.clear(); } } - else if ( m_pParaMarkerRedlineMove ) + else if ( m_pParaMarkerRedlineMove && m_bIsParaMarkerMove ) { // terminating moveFrom/moveTo redline removes also the paragraph mark CreateRedline( xRange, m_pParaMarkerRedlineMove ); @@ -3447,6 +3448,7 @@ void DomainMapper_Impl::CheckParaMarkerRedline( uno::Reference< text::XTextRange if ( m_pParaMarkerRedlineMove ) { m_pParaMarkerRedlineMove.clear(); + EndParaMarkerMove(); } } @@ -3493,6 +3495,16 @@ void DomainMapper_Impl::EndParaMarkerChange( ) m_currentRedline.clear(); } +void DomainMapper_Impl::StartParaMarkerMove( ) +{ + m_bIsParaMarkerMove = true; +} + +void DomainMapper_Impl::EndParaMarkerMove( ) +{ + m_bIsParaMarkerMove = false; +} + void DomainMapper_Impl::StartCustomFootnote(const PropertyMapPtr pContext) { if (pContext == m_pFootnoteContext) diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx index 32a657ce16d0..247c40fae621 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx @@ -577,6 +577,7 @@ private: RedlineParamsPtr m_previousRedline; RedlineParamsPtr m_pParaMarkerRedline; bool m_bIsParaMarkerChange; + bool m_bIsParaMarkerMove; // redline data of the terminating run, if it's a moveFrom deletion or a moveTo insertion RedlineParamsPtr m_pParaMarkerRedlineMove; // This is for removing workaround (double ZWSPs around the anchoring point) for track @@ -680,6 +681,8 @@ public: void StartParaMarkerChange( ); void EndParaMarkerChange( ); + void StartParaMarkerMove( ); + void EndParaMarkerMove( ); void ChainTextFrames(); void PushTextBoxContent(); diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml index bff00b41a925..134726d644af 100644 --- a/writerfilter/source/ooxml/model.xml +++ b/writerfilter/source/ooxml/model.xml @@ -18191,6 +18191,8 @@ <resource name="CT_ParaRPr" resource="Properties"> <element name="ins" tokenid="ooxml:CT_ParaRPr_ins"/> <element name="del" tokenid="ooxml:CT_ParaRPr_del"/> + <element name="moveFrom" tokenid="ooxml:CT_ParaRPr_moveFrom"/> + <element name="moveTo" tokenid="ooxml:CT_ParaRPr_moveTo"/> <element name="rPrChange" tokenid="ooxml:CT_ParaRPr_rPrChange"/> </resource> <resource name="CT_ParaTrackChange" resource="Properties">