[Libreoffice-commits] core.git: Branch 'private/mst/sw_redlinehide_2' - 7 commits - sw/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Mon Sep 10 15:18:15 UTC 2018


 sw/source/core/doc/docedt.cxx    |    5 +
 sw/source/core/inc/txtfrm.hxx    |    3 
 sw/source/core/layout/ssfrm.cxx  |    4 -
 sw/source/core/layout/wsfrm.cxx  |   10 ---
 sw/source/core/text/txtfrm.cxx   |   19 +++--
 sw/source/core/txtnode/ndtxt.cxx |   59 ++++++++++++-----
 sw/source/core/undo/undel.cxx    |  129 ++++++++++++++++++++++++++++++++++++++-
 7 files changed, 191 insertions(+), 38 deletions(-)

New commits:
commit 9b787ce44bb010ce560903992bfe2394fc07392d
Author:     Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Mon Sep 10 17:16:06 2018 +0200
Commit:     Michael Stahl <Michael.Stahl at cib.de>
CommitDate: Mon Sep 10 17:16:06 2018 +0200

    disable assert in UpdateMergedParaForMove that isn't always valid
    
    Change-Id: I30caa029d8cfea7609d2b9db9f98dd5365d4da86

diff --git a/sw/source/core/text/txtfrm.cxx b/sw/source/core/text/txtfrm.cxx
index ef792d95d9ea..56bbc10111f2 100644
--- a/sw/source/core/text/txtfrm.cxx
+++ b/sw/source/core/text/txtfrm.cxx
@@ -1707,14 +1707,17 @@ void UpdateMergedParaForMove(sw::MergedPara & rMerged,
             sal_Int32 const nStart(it.first - nSourceStart + nDestStart);
             TextFrameIndex const nDeleted = UpdateMergedParaForDelete(rMerged, false,
                 rDestNode, nStart, it.second - it.first);
-            assert(nDeleted == it.second - it.first);
-            assert(nDeleted);
-            // InvalidateRange/lcl_SetScriptInval was called sufficiently for SwInsText
-            lcl_SetWrong(rTextFrame, rDestNode, nStart, -nDeleted, false);
-            if (rTextFrame.HasFollow())
-            {
-                TextFrameIndex const nIndex(sw::MapModelToView(rMerged, &rDestNode, nStart));
-                lcl_ModifyOfst(&rTextFrame, nIndex, nDeleted); // FIXME why positive?
+//FIXME asserts valid for join - but if called from split, the new node isn't there yet and it will be added later...       assert(nDeleted);
+//            assert(nDeleted == it.second - it.first);
+            if(nDeleted)
+            {
+                // InvalidateRange/lcl_SetScriptInval was called sufficiently for SwInsText
+                lcl_SetWrong(rTextFrame, rDestNode, nStart, -nDeleted, false);
+                if (rTextFrame.HasFollow())
+                {
+                    TextFrameIndex const nIndex(sw::MapModelToView(rMerged, &rDestNode, nStart));
+                    lcl_ModifyOfst(&rTextFrame, nIndex, nDeleted); // FIXME why positive?
+                }
             }
         }
     }
commit ac7d4544eff9b338dbab41a0294b9758c8cb57b7
Author:     Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Mon Sep 10 17:11:19 2018 +0200
Commit:     Michael Stahl <Michael.Stahl at cib.de>
CommitDate: Mon Sep 10 17:11:19 2018 +0200

    temp. node undo states ...
    
    Change-Id: If21828c7d03ed4d7127c103117ccdb7051ce8cf8

diff --git a/sw/source/core/txtnode/ndtxt.cxx b/sw/source/core/txtnode/ndtxt.cxx
index 60c66e529fe4..7302a168c840 100644
--- a/sw/source/core/txtnode/ndtxt.cxx
+++ b/sw/source/core/txtnode/ndtxt.cxx
@@ -771,7 +771,10 @@ SwTextNode *SwTextNode::SplitContentNode(const SwPosition & rPos,
             break;
             case Merge::Hidden:
                 assert((eFirst == Merge::Hidden && eSecond == Merge::Hidden)
-                    || (eFirst == Merge::NonFirst && eSecond == Merge::First));
+                    || (eFirst == Merge::NonFirst && eSecond == Merge::First)
+                        // next ones can happen temp. in UndoDelete :(
+                    || (eFirst == Merge::Hidden && eSecond == Merge::NonFirst)
+                    || (eFirst == Merge::NonFirst && eSecond == Merge::None));
             break;
             case Merge::NonFirst:
                 assert((eFirst == Merge::NonFirst && eSecond == Merge::First)
commit a9b880a41bb0425db3f6d54f9f6a7dcacd3a459c
Author:     Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Mon Sep 10 17:10:05 2018 +0200
Commit:     Michael Stahl <Michael.Stahl at cib.de>
CommitDate: Mon Sep 10 17:10:05 2018 +0200

    optimse loop UnHideRedlines
    
    Change-Id: I46ed51d7620d5c86f4140e11ed768f98cf3bee18

diff --git a/sw/source/core/layout/wsfrm.cxx b/sw/source/core/layout/wsfrm.cxx
index aef1673deada..2282fe6e346e 100644
--- a/sw/source/core/layout/wsfrm.cxx
+++ b/sw/source/core/layout/wsfrm.cxx
@@ -4323,20 +4323,16 @@ static void UnHideRedlines(SwRootFrame & rLayout,
                             // iterate over nodes, not extents: if a node has
                             // no extents now but did have extents initially,
                             // its flys need their frames deleted too!
-                            int nLevel(0);
                             for (sal_uLong j = rTextNode.GetIndex() + 1;
                                  j <= pMergedPara->pLastNode->GetIndex(); ++j)
                             {
                                 SwNode *const pNode(rTextNode.GetNodes()[j]);
+                                assert(!pNode->IsEndNode());
                                 if (pNode->IsStartNode())
                                 {
-                                    ++nLevel;
+                                    j = pNode->EndOfSectionIndex();
                                 }
-                                else if (pNode->IsEndNode())
-                                {
-                                    --nLevel;
-                                }
-                                else if (nLevel == 0 && pNode->IsTextNode())
+                                else if (pNode->IsTextNode())
                                 {
                                     sw::RemoveFootnotesForNode(*pFrame, *pNode->GetTextNode(), nullptr);
                                     // similarly, remove the anchored flys
commit d7f5a9eda9cc7d262cd313c60d59ee46f8759bb6
Author:     Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Mon Sep 10 17:09:13 2018 +0200
Commit:     Michael Stahl <Michael.Stahl at cib.de>
CommitDate: Mon Sep 10 17:09:35 2018 +0200

    optimise loop MoveMergedFlysAndFootnotes
    
    Change-Id: I129eeff8b930645f6bcb1b65aa75371ae7e3f018

diff --git a/sw/source/core/txtnode/ndtxt.cxx b/sw/source/core/txtnode/ndtxt.cxx
index 80ae943eb130..60c66e529fe4 100644
--- a/sw/source/core/txtnode/ndtxt.cxx
+++ b/sw/source/core/txtnode/ndtxt.cxx
@@ -377,25 +377,19 @@ void MoveMergedFlysAndFootnotes(std::vector<SwTextFrame*> const& rFrames,
     {
         lcl_ChangeFootnoteRef(rSecondNode);
     }
-    int nLevel(0);
     for (sal_uLong nIndex = rSecondNode.GetIndex() + 1; ; ++nIndex)
     {
         SwNode *const pTmp(rSecondNode.GetNodes()[nIndex]);
-        if (pTmp->IsCreateFrameWhenHidingRedlines())
+        if (pTmp->IsCreateFrameWhenHidingRedlines() || pTmp->IsEndNode())
         {
             break;
         }
         else if (pTmp->IsStartNode())
         {
-            ++nLevel;
+            nIndex = pTmp->EndOfSectionIndex();
         }
-        else if (pTmp->IsEndNode())
-        {
-            --nLevel;
-        }
-        else if (nLevel == 0
-             && pTmp->GetRedlineMergeFlag() == SwNode::Merge::NonFirst
-             && pTmp->IsTextNode())
+        else if (pTmp->GetRedlineMergeFlag() == SwNode::Merge::NonFirst
+              && pTmp->IsTextNode())
         {
             lcl_ChangeFootnoteRef(*pTmp->GetTextNode());
         }
commit bdec7c29ad2775f1a1c2cfe24a2c85b5823d2e84
Author:     Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Mon Sep 10 17:08:17 2018 +0200
Commit:     Michael Stahl <Michael.Stahl at cib.de>
CommitDate: Mon Sep 10 17:08:17 2018 +0200

    tweak assert: can have cursors there, only redlines are problem
    
    Change-Id: I3dbdac093f29ee9b733e5d4ef28613b0dc9f3ac4

diff --git a/sw/source/core/layout/ssfrm.cxx b/sw/source/core/layout/ssfrm.cxx
index 8b8e7bd22610..99d187faa571 100644
--- a/sw/source/core/layout/ssfrm.cxx
+++ b/sw/source/core/layout/ssfrm.cxx
@@ -27,6 +27,7 @@
 #include <fmtfsize.hxx>
 #include <editeng/boxitem.hxx>
 #include <editeng/shaditem.hxx>
+#include <IDocumentRedlineAccess.hxx>
 #include <fmtclds.hxx>
 #include <viewimp.hxx>
 #include <sortedobjs.hxx>
@@ -445,7 +446,8 @@ void SwTextFrame::RegisterToNode(SwTextNode & rNode, bool const isForceNodeAsFir
     if (isForceNodeAsFirst && m_pMergedPara)
     {   // nothing registered here, in particular no redlines
         assert(m_pMergedPara->pFirstNode->GetIndex() + 1 == rNode.GetIndex());
-        assert(!m_pMergedPara->pFirstNode->HasAnyIndex());
+        assert(rNode.GetDoc()->getIDocumentRedlineAccess().GetRedlinePos(
+                *m_pMergedPara->pFirstNode, USHRT_MAX) == SwRedlineTable::npos);
     }
     assert(&rNode != GetDep());
     assert(!m_pMergedPara
commit 0893d968723226b2f7b292a26e24dc55ecb14781
Author:     Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Mon Sep 10 17:02:28 2018 +0200
Commit:     Michael Stahl <Michael.Stahl at cib.de>
CommitDate: Mon Sep 10 17:02:28 2018 +0200

    sw_redlinehide_2: adapt the SwUndoDelete DelFullPara path...
    
    This never splits or joins nodes, so it needs yet another different code
    to keep the merged text frames up to date.
    
    Change-Id: I151edcec9db34c64bf3a29ecad4396d95669d1c9

diff --git a/sw/source/core/undo/undel.cxx b/sw/source/core/undo/undel.cxx
index f4f6c5559d85..dbe885665edd 100644
--- a/sw/source/core/undo/undel.cxx
+++ b/sw/source/core/undo/undel.cxx
@@ -70,6 +70,84 @@ static void lcl_MakeAutoFrames( const SwFrameFormats& rSpzArr, sal_uLong nMovedI
     }
 }
 
+static SwTextNode * FindFirstAndNextNode(SwDoc & rDoc, SwUndRng const& rRange,
+        SwRedlineSaveDatas const& rRedlineSaveData,
+        SwTextNode *& o_rpFirstMergedDeletedTextNode)
+{
+    // redlines are corrected now to exclude the deleted node
+    assert(rRange.nEndContent == 0);
+    sal_uLong nEndOfRedline = 0;
+    for (size_t i = 0; i < rRedlineSaveData.size(); ++i)
+    {
+        auto const& rRedline(rRedlineSaveData[i]);
+        if (rRedline.nSttNode <= rRange.nSttNode
+            && rRedline.nSttNode < rRange.nEndNode
+            && rRange.nEndNode <= rRedline.nEndNode
+            && rRedline.GetType() == nsRedlineType_t::REDLINE_DELETE)
+        {
+            nEndOfRedline = rRedline.nEndNode;
+            o_rpFirstMergedDeletedTextNode = rDoc.GetNodes()[rRedline.nSttNode]->GetTextNode();
+            assert(rRange.nSttNode == rRange.nEndNode - 1); // otherwise this needs to iterate more RL to find the first node?
+            break;
+        }
+    }
+    if (nEndOfRedline)
+    {
+        assert(o_rpFirstMergedDeletedTextNode);
+        SwTextNode * pNextNode(nullptr);
+        for (sal_uLong i = rRange.nEndNode; /* i <= nEndOfRedline */; ++i)
+        {
+            SwNode *const pNode(rDoc.GetNodes()[i]);
+            assert(!pNode->IsEndNode()); // cannot be both leaving section here *and* overlapping redline
+            if (pNode->IsStartNode())
+            {
+                i = pNode->EndOfSectionIndex(); // will be incremented again
+            }
+            else if (pNode->IsTextNode())
+            {
+                pNextNode = pNode->GetTextNode();
+                break;
+            }
+        }
+        assert(pNextNode);
+        return pNextNode;
+    }
+    else
+    {
+        return nullptr;
+    }
+}
+
+static void DelFullParaMoveFrames(SwDoc & rDoc, SwUndRng const& rRange,
+        SwRedlineSaveDatas const& rRedlineSaveData)
+{
+    SwTextNode * pFirstMergedDeletedTextNode(nullptr);
+    SwTextNode *const pNextNode = FindFirstAndNextNode(rDoc, rRange,
+            rRedlineSaveData, pFirstMergedDeletedTextNode);
+    if (pNextNode)
+    {
+        std::vector<SwTextFrame*> frames;
+        SwIterator<SwTextFrame, SwTextNode, sw::IteratorMode::UnwrapMulti> aIter(*pFirstMergedDeletedTextNode);
+        for (SwTextFrame* pFrame = aIter.First(); pFrame; pFrame = aIter.Next())
+        {
+            if (pFrame->getRootFrame()->IsHideRedlines())
+            {
+                assert(pFrame->GetMergedPara());
+                assert(pFrame->GetMergedPara()->pFirstNode == pFirstMergedDeletedTextNode);
+                assert(pNextNode->GetIndex() <= pFrame->GetMergedPara()->pLastNode->GetIndex());
+                frames.push_back(pFrame);
+            }
+        }
+        for (SwTextFrame *const pFrame : frames)
+        {
+            // sw_redlinehide: don't need FrameMode::Existing here
+            // because everything from pNextNode onwards is already
+            // correctly hidden
+            pFrame->RegisterToNode(*pNextNode, true);
+        }
+    }
+}
+
 // SwUndoDelete has to perform a deletion and to record anything that is needed
 // to restore the situation before the deletion. Unfortunately a part of the
 // deletion will be done after calling this Ctor, this has to be kept in mind!
@@ -178,6 +256,10 @@ SwUndoDelete::SwUndoDelete(
                     ? pSttTextNd
                     : pEnd->nNode.GetNode().GetTextNode();
     }
+    else if (m_pRedlSaveData)
+    {
+        DelFullParaMoveFrames(*pDoc, *this, *m_pRedlSaveData);
+    }
 
     bool bMoveNds = *pStt != *pEnd      // any area still existent?
                 && ( SaveContent( pStt, pEnd, pSttTextNd, pEndTextNd ) || m_bFromTableCopy );
@@ -962,7 +1044,44 @@ void SwUndoDelete::UndoImpl(::sw::UndoRedoContext & rContext)
     if( m_pRedlSaveData )
         SetSaveData(rDoc, *m_pRedlSaveData);
 
-    if (m_aSttStr && (!m_bFromTableCopy || 0 != m_nNode))
+    sal_uLong delFullParaEndNode(nEndNode);
+    if (m_bDelFullPara && m_pRedlSaveData)
+    {
+        SwTextNode * pFirstMergedDeletedTextNode(nullptr);
+        SwTextNode *const pNextNode = FindFirstAndNextNode(rDoc, *this,
+                *m_pRedlSaveData, pFirstMergedDeletedTextNode);
+        if (pNextNode)
+        {
+            bool bNonMerged(false);
+            std::vector<SwTextFrame*> frames;
+            SwIterator<SwTextFrame, SwTextNode, sw::IteratorMode::UnwrapMulti> aIter(*pNextNode);
+            for (SwTextFrame* pFrame = aIter.First(); pFrame; pFrame = aIter.Next())
+            {
+                if (pFrame->getRootFrame()->IsHideRedlines())
+                {
+                    frames.push_back(pFrame);
+                }
+                else
+                {
+                    bNonMerged = true;
+                }
+            }
+            for (SwTextFrame *const pFrame : frames)
+            {
+                // could either destroy the text frames, or move them...
+                // destroying them would have the advantage that we don't
+                // need special code to *exclude* pFirstMergedDeletedTextNode
+                // from MakeFrames  for the layouts in Hide mode but not
+                // layouts in Show mode ...
+                // ... except that MakeFrames won't create them then :(
+                pFrame->RegisterToNode(*pFirstMergedDeletedTextNode);
+                assert(pFrame->GetMergedPara());
+                assert(!bNonMerged); // delFullParaEndNode is such an awful hack
+                delFullParaEndNode = pFirstMergedDeletedTextNode->GetIndex();
+            }
+        }
+    }
+    else if (m_aSttStr && (!m_bFromTableCopy || 0 != m_nNode))
     {
         // only now do we have redlines in the document again; fix up the split
         // frames
@@ -999,7 +1118,7 @@ void SwUndoDelete::UndoImpl(::sw::UndoRedoContext & rContext)
         // by the start node, or it may be merged by one of the moved nodes,
         // but if it isn't merged, its current frame(s) should be good...
         SwNodeIndex const start(rDoc.GetNodes(), nSttNode + (m_bDelFullPara ? 0 : 1));
-        SwNodeIndex const end(rDoc.GetNodes(), nEndNode);
+        SwNodeIndex const end(rDoc.GetNodes(), m_bDelFullPara ? delFullParaEndNode : nEndNode);
         ::MakeFrames(&rDoc, start, end);
     }
 
@@ -1074,6 +1193,11 @@ void SwUndoDelete::RedoImpl(::sw::UndoRedoContext & rContext)
 
     if( !m_aSttStr && !m_aEndStr )
     {
+        if (m_bDelFullPara && m_pRedlSaveData)
+        {
+            DelFullParaMoveFrames(rDoc, *this, *m_pRedlSaveData);
+        }
+
         SwNodeIndex aSttIdx = ( m_bDelFullPara || m_bJoinNext )
                                     ? rPam.GetMark()->nNode
                                     : rPam.GetPoint()->nNode;
@@ -1129,6 +1253,7 @@ void SwUndoDelete::RedoImpl(::sw::UndoRedoContext & rContext)
     }
     else if( m_bDelFullPara )
     {
+        assert(!"dead code");
         // The Pam was incremented by one at Point (== end) to provide space
         // for UNDO. This now needs to be reverted!
         --rPam.End()->nNode;
commit a77bc45cc72a16a8ffbca3786a2ab5c78d619d98
Author:     Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Mon Sep 10 14:38:13 2018 +0200
Commit:     Michael Stahl <Michael.Stahl at cib.de>
CommitDate: Mon Sep 10 14:38:13 2018 +0200

    sw_redlinehide_2: JoinPrev with NonFirst node
    
    This needs to recreate the frames on the node preceding the deleted one,
    in case the second node of the join wasn't merged like the first was,
    but is merged afterwards...
    
    Change-Id: I001ba3af118614c1cce891cf6faec7e829576d21

diff --git a/sw/source/core/doc/docedt.cxx b/sw/source/core/doc/docedt.cxx
index 54c6a1c56e74..5a1d2b7ab814 100644
--- a/sw/source/core/doc/docedt.cxx
+++ b/sw/source/core/doc/docedt.cxx
@@ -418,7 +418,10 @@ bool sw_JoinText( SwPaM& rPam, bool bJoinPrev )
                 sw::MoveDeletedPrevFrames(*pOldTextNd, *pTextNd);
             }
             pDoc->GetNodes().Delete( aOldIdx );
-            sw::CheckResetRedlineMergeFlag(*pTextNd, eOldMergeFlag == SwNode::Merge::NonFirst);
+            sw::CheckResetRedlineMergeFlag(*pTextNd,
+                    eOldMergeFlag == SwNode::Merge::NonFirst
+                        ? sw::Recreate::Predecessor
+                        : sw::Recreate::No);
         }
         else
         {
diff --git a/sw/source/core/inc/txtfrm.hxx b/sw/source/core/inc/txtfrm.hxx
index 0b19178734d2..a9d3a6dd1fe5 100644
--- a/sw/source/core/inc/txtfrm.hxx
+++ b/sw/source/core/inc/txtfrm.hxx
@@ -109,7 +109,8 @@ void MoveMergedFlysAndFootnotes(std::vector<SwTextFrame*> const& rFrames,
         SwTextNode const& rFirstNode, SwTextNode & rSecondNode, bool);
 
 void MoveDeletedPrevFrames(SwTextNode & rDeletedPrev, SwTextNode & rNode);
-void CheckResetRedlineMergeFlag(SwTextNode & rNode, bool bRecreateMerged);
+enum class Recreate { No, ThisNode, Predecessor };
+void CheckResetRedlineMergeFlag(SwTextNode & rNode, Recreate eRecreateMerged);
 
 void UpdateFramesForAddDeleteRedline(SwPaM const& rPam);
 void UpdateFramesForRemoveDeleteRedline(SwDoc & rDoc, SwPaM const& rPam);
diff --git a/sw/source/core/txtnode/ndtxt.cxx b/sw/source/core/txtnode/ndtxt.cxx
index 9c16f081eb69..80ae943eb130 100644
--- a/sw/source/core/txtnode/ndtxt.cxx
+++ b/sw/source/core/txtnode/ndtxt.cxx
@@ -880,21 +880,42 @@ void MoveDeletedPrevFrames(SwTextNode & rDeletedPrev, SwTextNode & rNode)
     /// not only fix the flag; if prev is First the frame is actually deleted!!!
     // if prev is First : must not delete frame but move it
     // if prev is NonFirst : must delete frame (if this is First/None) & merge into prev
-void CheckResetRedlineMergeFlag(SwTextNode & rNode, bool const bRecreateMerged)
+void CheckResetRedlineMergeFlag(SwTextNode & rNode, Recreate const eRecreateMerged)
 {
-    if (bRecreateMerged)
+    if (eRecreateMerged != sw::Recreate::No)
     {
+        SwTextNode * pMergeNode(&rNode);
+        if (eRecreateMerged == sw::Recreate::Predecessor)
+        {
+            for (sal_uLong i = rNode.GetIndex() - 1; ; --i)
+            {
+                SwNode *const pNode(rNode.GetNodes()[i]);
+                assert(!pNode->IsStartNode());
+                if (pNode->IsEndNode())
+                {
+                    i = pNode->StartOfSectionIndex();
+                }
+                else if (pNode->IsTextNode())
+                {
+                    pMergeNode = pNode->GetTextNode(); // use predecessor to merge
+                    break;
+                }
+            }
+        }
         std::vector<SwTextFrame*> frames;
-        SwIterator<SwTextFrame, SwTextNode, sw::IteratorMode::UnwrapMulti> aIter(rNode);
+        SwIterator<SwTextFrame, SwTextNode, sw::IteratorMode::UnwrapMulti> aIter(*pMergeNode);
         for (SwTextFrame* pFrame = aIter.First(); pFrame; pFrame = aIter.Next())
         {
-            frames.push_back(pFrame);
+            if (pFrame->getRootFrame()->IsHideRedlines())
+            {
+                frames.push_back(pFrame);
+            }
         }
         for (SwTextFrame * pFrame : frames)
         {
             SwTextNode & rFirstNode(pFrame->GetMergedPara()
                 ? *pFrame->GetMergedPara()->pFirstNode
-                : rNode);
+                : *pMergeNode);
             assert(rFirstNode.GetIndex() <= rNode.GetIndex());
             pFrame->SetMergedPara(sw::CheckParaRedlineMerge(
                         *pFrame, rFirstNode, sw::FrameMode::Existing));
@@ -1015,7 +1036,9 @@ SwContentNode *SwTextNode::JoinNext()
         SetGrammarCheck( pList3, false );
         SetSmartTags( pList2, false );
         InvalidateNumRule();
-        CheckResetRedlineMergeFlag(*this, eOldMergeFlag == SwNode::Merge::First);
+        CheckResetRedlineMergeFlag(*this, eOldMergeFlag == SwNode::Merge::First
+                                            ? sw::Recreate::ThisNode
+                                            : sw::Recreate::No);
     }
     else {
         OSL_FAIL( "No TextNode." );
@@ -1115,7 +1138,10 @@ void SwTextNode::JoinPrev()
         SetGrammarCheck( pList3, false );
         SetSmartTags( pList2, false );
         InvalidateNumRule();
-        CheckResetRedlineMergeFlag(*this, eOldMergeFlag == SwNode::Merge::NonFirst);
+        sw::CheckResetRedlineMergeFlag(*this,
+                eOldMergeFlag == SwNode::Merge::NonFirst
+                    ? sw::Recreate::Predecessor
+                    : sw::Recreate::No);
     }
     else {
         OSL_FAIL( "No TextNode." );


More information about the Libreoffice-commits mailing list