summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stahl <Michael.Stahl@cib.de>2020-11-03 16:40:45 +0100
committerMichael Stahl <michael.stahl@cib.de>2020-11-17 22:18:35 +0100
commit4fccc66345dcedff735a2e918858b12fb1044c01 (patch)
treedbe45a3dcb759e96a7b206865a5dc8f483aa4062
parent0fef9628547c6132b165a478a9320262304f2435 (diff)
sw_fieldmarkhide: SwRedlineItr assumption that Show means no MergedPara
... in SwRedlineItr::CheckLine() and also SwRedlineItr::Seek() Change-Id: I711ec37bd345cbf5f5f5339b8d792bcb56c425c7 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105980 Tested-by: Michael Stahl <michael.stahl@cib.de> Reviewed-by: Michael Stahl <michael.stahl@cib.de>
-rw-r--r--sw/source/core/text/redlnitr.cxx52
1 files changed, 34 insertions, 18 deletions
diff --git a/sw/source/core/text/redlnitr.cxx b/sw/source/core/text/redlnitr.cxx
index 3286661251af..6727751c3576 100644
--- a/sw/source/core/text/redlnitr.cxx
+++ b/sw/source/core/text/redlnitr.cxx
@@ -463,7 +463,9 @@ void SwAttrIter::CtorInitAttrIter(SwTextNode & rTextNode,
}
// TODO this is true initially but after delete ops it may be false... need to delete m_pMerged somewhere?
// assert(SwRedlineTable::npos != nRedlPos);
- assert(SwRedlineTable::npos != nRedlPos || m_pMergedPara->extents.size() <= 1);
+ // false now with fieldmarks
+ assert(pRootFrame->GetFieldmarkMode() != sw::FieldmarkMode::ShowBoth
+ || SwRedlineTable::npos != nRedlPos || m_pMergedPara->extents.size() <= 1);
}
if (!(pExtInp || m_pMergedPara || SwRedlineTable::npos != nRedlPos))
return;
@@ -476,7 +478,7 @@ void SwAttrIter::CtorInitAttrIter(SwTextNode & rTextNode,
}
m_pRedline.reset(new SwRedlineItr( rTextNode, *m_pFont, m_aAttrHandler, nRedlPos,
- m_pMergedPara
+ (pRootFrame && pRootFrame->IsHideRedlines())
? SwRedlineItr::Mode::Hide
: bShow
? SwRedlineItr::Mode::Show
@@ -539,7 +541,6 @@ short SwRedlineItr::Seek(SwFont& rFnt,
if( ExtOn() )
return 0; // Abbreviation: if we're within an ExtendTextInputs
// there can't be other changes of attributes (not even by redlining)
- assert(m_eMode == Mode::Hide || m_nNdIdx == nNode);
if (m_eMode == Mode::Show)
{
if (m_bOn)
@@ -570,7 +571,7 @@ short SwRedlineItr::Seek(SwFont& rFnt,
for ( ; m_nAct < m_rDoc.getIDocumentRedlineAccess().GetRedlineTable().size() ; ++m_nAct)
{
- m_rDoc.getIDocumentRedlineAccess().GetRedlineTable()[ m_nAct ]->CalcStartEnd(m_nNdIdx, m_nStart, m_nEnd);
+ m_rDoc.getIDocumentRedlineAccess().GetRedlineTable()[ m_nAct ]->CalcStartEnd(nNode, m_nStart, m_nEnd);
if (nNew < m_nEnd)
{
@@ -811,7 +812,6 @@ bool SwRedlineItr::CheckLine(
// case, but surely that was a bug?
if (m_nFirst == SwRedlineTable::npos || m_eMode != Mode::Show)
return false;
- assert(nStartNode == nEndNode); (void) nStartNode; (void) nEndNode;
if( nChkEnd == nChkStart ) // empty lines look one char further
++nChkEnd;
sal_Int32 nOldStart = m_nStart;
@@ -820,28 +820,44 @@ bool SwRedlineItr::CheckLine(
bool bRet = bRedlineEnd = false;
eRedlineEnd = RedlineType::None;
+ SwPosition const start(*m_rDoc.GetNodes()[nStartNode]->GetContentNode(), nChkStart);
+ SwPosition const end(*m_rDoc.GetNodes()[nEndNode]->GetContentNode(), nChkEnd);
for (m_nAct = m_nFirst; m_nAct < m_rDoc.getIDocumentRedlineAccess().GetRedlineTable().size(); ++m_nAct)
{
SwRangeRedline const*const pRedline(
m_rDoc.getIDocumentRedlineAccess().GetRedlineTable()[ m_nAct ] );
- pRedline->CalcStartEnd( m_nNdIdx, m_nStart, m_nEnd );
- if (nChkEnd < m_nStart)
- break;
- if (nChkStart <= m_nEnd && (nChkEnd >= m_nStart || COMPLETE_STRING == m_nEnd))
+ bool isBreak(false);
+ switch (ComparePosition(*pRedline->Start(), *pRedline->End(), start, end))
{
- bRet = true;
- if ( rRedlineText.isEmpty() && pRedline->GetType() == RedlineType::Delete )
- rRedlineText = const_cast<SwRangeRedline*>(pRedline)->GetDescr(/*bSimplified=*/true);
- // store redlining at paragraph break
- if ( COMPLETE_STRING == m_nEnd )
- {
+ case SwComparePosition::Behind:
+ isBreak = true;
+ break;
+ case SwComparePosition::OverlapBehind:
+ case SwComparePosition::CollideStart:
+ case SwComparePosition::Outside:
+ case SwComparePosition::Equal:
+ // store redlining at line end (for line break formatting)
eRedlineEnd = pRedline->GetType();
bRedlineEnd = true;
+ isBreak = true;
+ [[fallthrough]];
+ case SwComparePosition::OverlapBefore:
+ case SwComparePosition::CollideEnd:
+ case SwComparePosition::Inside:
+ {
+ bRet = true;
+ if (rRedlineText.isEmpty() && pRedline->GetType() == RedlineType::Delete)
+ {
+ rRedlineText = const_cast<SwRangeRedline*>(pRedline)->GetDescr(/*bSimplified=*/true);
+ }
break;
}
- // store redlining at line end (for line break formatting)
- else if ( nChkEnd <= m_nEnd )
- eRedlineEnd = pRedline->GetType();
+ case SwComparePosition::Before:
+ break; // -Werror=switch
+ }
+ if (isBreak)
+ {
+ break;
}
}