[Libreoffice-commits] core.git: Branch 'private/mst/sw_redlinehide_2' - 2 commits - sw/source
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Thu Sep 6 16:10:21 UTC 2018
sw/source/core/layout/wsfrm.cxx | 8 ----
sw/source/core/text/redlnitr.cxx | 70 ++++++++++++++++++++++++++++++++++-----
2 files changed, 62 insertions(+), 16 deletions(-)
New commits:
commit 917e8996e4d665f3727a15bbbb02ca5e43cceacc
Author: Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Thu Sep 6 17:54:46 2018 +0200
Commit: Michael Stahl <Michael.Stahl at cib.de>
CommitDate: Thu Sep 6 17:54:46 2018 +0200
sw_redlinehide_2: tweak CheckParaRedlineMerge() next-node flag update
If there's a table or section affected by the editing operation, then
it has to be ensured that the table node / section node has its flag
reset on Undo; also the next text node following the table, as
CheckParaRedlineMerge() isn't called for table nodes.
Change-Id: Ic1b085619adbeba69fa641a3a7492b71966fee6e
diff --git a/sw/source/core/text/redlnitr.cxx b/sw/source/core/text/redlnitr.cxx
index 920960d835e1..10c25b074415 100644
--- a/sw/source/core/text/redlnitr.cxx
+++ b/sw/source/core/text/redlnitr.cxx
@@ -135,11 +135,43 @@ CheckParaRedlineMerge(SwTextFrame & rFrame, SwTextNode & rTextNode,
rTextNode.SetRedlineMergeFlag(SwNode::Merge::None);
}
}
- {
- SwNode *const pNextNode(pNode->GetNodes()[pNode->GetIndex() + 1]);
- if (!pNextNode->IsCreateFrameWhenHidingRedlines())
+ // Reset flag of the following text node since we know it's not merged;
+ // also any table/sections in between.
+ // * the following SwTextNode is in same nodes section as pNode (nLevel=0)
+ // * the start nodes that don't have a SwTextNode before them
+ // on their level, and their corresponding end nodes
+ // * the first SwTextNode inside each start node of the previous point
+ // Other (non-first) SwTextNodes in nested sections shouldn't be reset!
+ int nLevel(0);
+ for (sal_uLong j = pNode->GetIndex() + 1; j < pNode->GetNodes().Count(); ++j)
+ {
+ SwNode *const pTmp(pNode->GetNodes()[j]);
+ if (!pTmp->IsCreateFrameWhenHidingRedlines())
{ // clear stale flag caused by editing with redlines shown
- pNextNode->SetRedlineMergeFlag(SwNode::Merge::None);
+ pTmp->SetRedlineMergeFlag(SwNode::Merge::None);
+ }
+ if (pTmp->IsStartNode())
+ {
+ ++nLevel;
+ }
+ else if (pTmp->IsEndNode())
+ {
+ if (nLevel == 0)
+ {
+ break; // there is no following text node; avoid leaving section
+ }
+ --nLevel;
+ }
+ else if (pTmp->IsTextNode())
+ {
+ if (nLevel == 0)
+ {
+ break; // done
+ }
+ else
+ { // skip everything other than 1st text node in section!
+ j = pTmp->EndOfSectionIndex() - 1; // will be incremented again
+ }
}
}
if (!bHaveRedlines)
commit d88a669f2e0ea50bf0bb1b1466a4f113e6d9877b
Author: Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Thu Sep 6 17:51:46 2018 +0200
Commit: Michael Stahl <Michael.Stahl at cib.de>
CommitDate: Thu Sep 6 17:53:58 2018 +0200
sw_redlinehide_2: do all frame deletion in CheckParaRedlineMerge()
Other callers need this too, particularly Undo, so move this into the
function so it's done once.
Change-Id: I58e89899127650157fe2889929c1c6b47c00649b
diff --git a/sw/source/core/layout/wsfrm.cxx b/sw/source/core/layout/wsfrm.cxx
index e6fbd7c553dc..aef1673deada 100644
--- a/sw/source/core/layout/wsfrm.cxx
+++ b/sw/source/core/layout/wsfrm.cxx
@@ -4368,14 +4368,6 @@ static void UnHideRedlines(SwRootFrame & rLayout,
auto const pFrame(static_cast<SwContentNode&>(rNode).getLayoutFrame(&rLayout));
assert(!pFrame || static_cast<SwTextFrame*>(pFrame)->GetMergedPara()->pFirstNode != &rNode);
}
- else if (rNode.IsTableNode())
- {
- static_cast<SwTableNode&>(rNode).DelFrames(&rLayout);
- }
- else if (rNode.IsSectionNode())
- {
- static_cast<SwSectionNode&>(rNode).DelFrames(&rLayout);
- }
}
else
{
diff --git a/sw/source/core/text/redlnitr.cxx b/sw/source/core/text/redlnitr.cxx
index f63aed9f9e1b..920960d835e1 100644
--- a/sw/source/core/text/redlnitr.cxx
+++ b/sw/source/core/text/redlnitr.cxx
@@ -58,6 +58,8 @@ CheckParaRedlineMerge(SwTextFrame & rFrame, SwTextNode & rTextNode,
}
bool bHaveRedlines(false);
std::vector<SwTextNode *> nodes{ &rTextNode };
+ std::vector<SwTableNode *> tables;
+ std::vector<SwSectionNode *> sections;
std::vector<sw::Extent> extents;
OUStringBuffer mergedText;
SwTextNode const* pParaPropsNode(nullptr);
@@ -94,6 +96,21 @@ CheckParaRedlineMerge(SwTextFrame & rFrame, SwTextNode & rTextNode,
for (sal_uLong j = pNode->GetIndex() + 1; j < pEnd->nNode.GetIndex(); ++j)
{
SwNode *const pTmp(pNode->GetNodes()[j]);
+ if (nLevel == 0)
+ {
+ if (pTmp->IsTextNode())
+ {
+ nodes.push_back(pTmp->GetTextNode());
+ }
+ else if (pTmp->IsTableNode())
+ {
+ tables.push_back(pTmp->GetTableNode());
+ }
+ else if (pTmp->IsSectionNode())
+ {
+ sections.push_back(pTmp->GetSectionNode());
+ }
+ }
if (pTmp->IsStartNode())
{
++nLevel;
@@ -102,10 +119,6 @@ CheckParaRedlineMerge(SwTextFrame & rFrame, SwTextNode & rTextNode,
{
--nLevel;
}
- else if (nLevel == 0 && pTmp->IsTextNode())
- {
- nodes.push_back(pTmp->GetTextNode());
- }
pTmp->SetRedlineMergeFlag(SwNode::Merge::Hidden);
}
pNode = pEnd->nNode.GetNode().GetTextNode();
@@ -180,6 +193,15 @@ CheckParaRedlineMerge(SwTextFrame & rFrame, SwTextNode & rTextNode,
{
(**iter).DelFrames(rFrame.getRootFrame());
}
+ // also delete tables & sections here; not necessary, but convenient
+ for (auto const pTableNode : tables)
+ {
+ pTableNode->DelFrames(rFrame.getRootFrame());
+ }
+ for (auto const pSectionNode : sections)
+ {
+ pSectionNode->DelFrames(rFrame.getRootFrame());
+ }
}
auto pRet(o3tl::make_unique<sw::MergedPara>(rFrame, std::move(extents),
mergedText.makeStringAndClear(), pParaPropsNode, &rTextNode,
More information about the Libreoffice-commits
mailing list