diff options
author | Michael Stahl <michael.stahl@allotropia.de> | 2021-12-21 15:29:12 +0100 |
---|---|---|
committer | Xisco Fauli <xiscofauli@libreoffice.org> | 2021-12-29 09:36:58 +0100 |
commit | f977eaba713067f2980573850366e81ddd50541b (patch) | |
tree | 6ad955545fab87e487e735cc3c60ceff047e828c /sw | |
parent | 7378537a68a97ea555d24c5d7991863b50c1687d (diff) |
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>
Signed-off-by: Xisco Fauli <xiscofauli@libreoffice.org>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127351
Reviewed-by: Thorsten Behrens <thorsten.behrens@allotropia.de>
Reviewed-by: Hossein <hossein@libreoffice.org>
Diffstat (limited to 'sw')
-rw-r--r-- | sw/source/core/doc/DocumentContentOperationsManager.cxx | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/sw/source/core/doc/DocumentContentOperationsManager.cxx b/sw/source/core/doc/DocumentContentOperationsManager.cxx index 363484191849..d8cc98d66680 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 |