sw/source/core/doc/DocumentContentOperationsManager.cxx |   23 ++++++++++------
 1 file changed, 15 insertions(+), 8 deletions(-)

New commits:
commit 70ac13eecfa620e94770a64110eeaa05f8c266e6
Author:     Michael Stahl <michael.st...@allotropia.de>
AuthorDate: Tue Dec 21 15:29:12 2021 +0100
Commit:     Michael Stahl <michael.st...@allotropia.de>
CommitDate: Wed Dec 22 13:00:37 2021 +0100

    tdf#135061 sw_redlinehide: fix copy into delete redline following table
    
    When pasting, the entire document body is covered by a delete redline.
    
    The insert position is in the last node, whose SwTextFrame has a
    MergedPara, and the problem is that the MergedPara::pLastNode continues
    to point to the last node of the document, even when the delete redline
    is adjusted to end in a newly inserted node by
    SaveRedlEndPosForRestore::Restore().
    
    Thus afer the 2nd paste, SwDoc::SearchNumRule() goes into infinite loop
    from node 141 to 86 and then jump via the bad MergedPara back to 141.
    
    The reason is that in DocumentContentOperationsManager::CopyWithFlyInFly()
    the RecreateStartTextFrames() isn't called.
    
    This is because it only checks if the preceding node is a text node,
    while here it is a table node.
    
    Fix this by checking if the node at the insert position is merged to a
    node preceding the previous node.
    
    Change-Id: I103b60b2bec86af11006ed591cfda2feb5f575a3
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127273
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.st...@allotropia.de>

diff --git a/sw/source/core/doc/DocumentContentOperationsManager.cxx 
b/sw/source/core/doc/DocumentContentOperationsManager.cxx
index 3ddcf13c698e..e889a6bcd419 100644
--- a/sw/source/core/doc/DocumentContentOperationsManager.cxx
+++ b/sw/source/core/doc/DocumentContentOperationsManager.cxx
@@ -3663,21 +3663,28 @@ void DocumentContentOperationsManager::CopyWithFlyInFly(
         bool isRecreateEndNode(false);
         if (bMakeNewFrames) // tdf#130685 only after aRedlRest
         {   // recreate from previous node (could be merged now)
-            if (SwTextNode *const pNode = aSavePos.GetNode().GetTextNode())
+            o3tl::sorted_vector<SwTextFrame*> frames;
+            SwTextNode * pNode = aSavePos.GetNode().GetTextNode();
+            SwTextNode *const pEndNode = rInsPos.GetNode().GetTextNode();
+            if (pEndNode)
             {
-                o3tl::sorted_vector<SwTextFrame*> frames;
-                SwTextNode *const pEndNode = rInsPos.GetNode().GetTextNode();
-                if (pEndNode)
+                SwIterator<SwTextFrame, SwTextNode, 
sw::IteratorMode::UnwrapMulti> aIter(*pEndNode);
+                for (SwTextFrame* pFrame = aIter.First(); pFrame; pFrame = 
aIter.Next())
                 {
-                    SwIterator<SwTextFrame, SwTextNode, 
sw::IteratorMode::UnwrapMulti> aIter(*pEndNode);
-                    for (SwTextFrame* pFrame = aIter.First(); pFrame; pFrame = 
aIter.Next())
+                    if (pFrame->getRootFrame()->HasMergedParas())
                     {
-                        if (pFrame->getRootFrame()->HasMergedParas())
+                        frames.insert(pFrame);
+                        // tdf#135061 check if end node is merged to a 
preceding node
+                        if (pNode == nullptr && pFrame->GetMergedPara()
+                            && pFrame->GetMergedPara()->pFirstNode->GetIndex() 
< aSavePos.GetIndex())
                         {
-                            frames.insert(pFrame);
+                            pNode = pFrame->GetMergedPara()->pFirstNode;
                         }
                     }
                 }
+            }
+            if (pNode != nullptr)
+            {
                 sw::RecreateStartTextFrames(*pNode);
                 if (!frames.empty())
                 {   // tdf#132187 check if the end node needs new frames

Reply via email to