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">

Reply via email to