diff options
author | Michael Stahl <Michael.Stahl@cib.de> | 2018-09-10 14:38:13 +0200 |
---|---|---|
committer | Michael Stahl <Michael.Stahl@cib.de> | 2018-09-19 10:08:55 +0200 |
commit | d4bddd6fb424241eae907e1626a4fa449235edac (patch) | |
tree | 286ed18e17d251f77b7cdf6d5f42edf564820e70 | |
parent | bbe59a86a4fa082a9e5476e9f11843028402a5b3 (diff) |
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
-rw-r--r-- | sw/source/core/doc/docedt.cxx | 5 | ||||
-rw-r--r-- | sw/source/core/inc/txtfrm.hxx | 3 | ||||
-rw-r--r-- | sw/source/core/txtnode/ndtxt.cxx | 40 |
3 files changed, 39 insertions, 9 deletions
diff --git a/sw/source/core/doc/docedt.cxx b/sw/source/core/doc/docedt.cxx index 0a01b1f4beeb..74de269c36fb 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 04ebd2bd4b27..30cfed591c78 100644 --- a/sw/source/core/txtnode/ndtxt.cxx +++ b/sw/source/core/txtnode/ndtxt.cxx @@ -873,21 +873,42 @@ void MoveDeletedPrevFrames(SwTextNode & rDeletedPrev, SwTextNode & rNode) /// if first node is First, its frames may need to be moved, never deleted. /// if first node is NonFirst, second node's own frames (First/None) must be deleted -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)); @@ -1008,7 +1029,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." ); @@ -1108,7 +1131,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." ); |