Kaydet (Commit) 34b32f56 authored tarafından Michael Stahl's avatar Michael Stahl

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
üst 0e7dfa11
......@@ -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
{
......
......@@ -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);
......
......@@ -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." );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment