tdf#118699 sw_redlinehide: need some more changes to use the last node

... as property node for the merged frame.

This would assert in SwContentNode::DelFrames() during tdf#126627
and also in crashtesting, e.g. fdo66302-1.odt.

(regression from fa5eb82b398e29ae033f7b7c8c8195dfc10cf5b0)

Change-Id: Ia6d52287ed42f41d16ebf12bc61d7f4a6d7c5b03
Reviewed-on: https://gerrit.libreoffice.org/77212
Tested-by: Jenkins
Reviewed-by: Michael Stahl <Michael.Stahl@cib.de>
diff --git a/sw/source/core/docnode/node.cxx b/sw/source/core/docnode/node.cxx
index db564ae..206fcda 100644
--- a/sw/source/core/docnode/node.cxx
+++ b/sw/source/core/docnode/node.cxx
@@ -1371,8 +1371,24 @@ void SwContentNode::DelFrames(SwRootFrame const*const pLayout)
                    // because that would access deleted wrong-lists
                    sw::UpdateMergedParaForDelete(*pMerged, true,
                            *static_cast<SwTextNode*>(this), 0, Len());
                    // pointer should have been updated to a different node
                    assert(this != pMerged->pParaPropsNode);
                    if (this == pMerged->pParaPropsNode)
                    {
                        // otherwise pointer should have been updated to a different node
                        assert(this == pMerged->pLastNode);
                        assert(pMerged->extents.empty());
                        for (sal_uLong i = pMerged->pLastNode->GetIndex() - 1;;
                                --i)
                        {
                            assert(pMerged->pFirstNode->GetIndex() <= i);
                            SwNode *const pNode(GetNodes()[i]);
                            if (pNode->IsTextNode()
                                && pNode->GetRedlineMergeFlag() != Merge::Hidden)
                            {
                                pMerged->pParaPropsNode = pNode->GetTextNode();
                                break;
                            }
                        }
                    }
                    if (this == pMerged->pLastNode)
                    {
                        pMerged->pLastNode = GetNodes()[GetIndex()-1]->GetTextNode();
diff --git a/sw/source/core/text/txtfrm.cxx b/sw/source/core/text/txtfrm.cxx
index a2f62d3..a626453 100644
--- a/sw/source/core/text/txtfrm.cxx
+++ b/sw/source/core/text/txtfrm.cxx
@@ -1014,8 +1014,9 @@ static TextFrameIndex UpdateMergedParaForInsert(MergedPara & rMerged,
        rMerged.extents.emplace(itInsert, const_cast<SwTextNode*>(&rNode), nIndex, nIndex + nLen);
        text.insert(nTFIndex, rNode.GetText().copy(nIndex, nLen));
        nInserted = nLen;
        if (rNode.GetIndex() < rMerged.pParaPropsNode->GetIndex())
        {   // text inserted before current para-props node
        if (rMerged.extents.size() == 1 // also if it was empty!
            || rMerged.pParaPropsNode->GetIndex() < rNode.GetIndex())
        {   // text inserted after current para-props node
            rMerged.pParaPropsNode->RemoveFromListRLHidden();
            rMerged.pParaPropsNode = &const_cast<SwTextNode&>(rNode);
            rMerged.pParaPropsNode->AddToListRLHidden();
@@ -1147,7 +1148,7 @@ TextFrameIndex UpdateMergedParaForDelete(MergedPara & rMerged,
        {
            rMerged.pParaPropsNode->RemoveFromListRLHidden();
            rMerged.pParaPropsNode = rMerged.extents.empty()
                ? rMerged.pFirstNode
                ? const_cast<SwTextNode*>(rMerged.pLastNode)
                : rMerged.extents.front().pNode;
            rMerged.pParaPropsNode->AddToListRLHidden();
        }