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.stahl@allotropia.de>
(cherry picked from commit 70ac13eecfa620e94770a64110eeaa05f8c266e6)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127317
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
diff --git a/sw/source/core/doc/DocumentContentOperationsManager.cxx b/sw/source/core/doc/DocumentContentOperationsManager.cxx
index 3634841..d8cc98d 100644
--- a/sw/source/core/doc/DocumentContentOperationsManager.cxx
+++ b/sw/source/core/doc/DocumentContentOperationsManager.cxx
@@ -3545,21 +3545,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