summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorMichael Stahl <Michael.Stahl@cib.de>2018-05-15 11:37:23 +0200
committerMichael Stahl <Michael.Stahl@cib.de>2018-06-08 21:51:27 +0200
commitdccaa8e6e6a6fa022aa33ed22e297c5e1c988bee (patch)
tree134e6a68a4ae622cb3562960dcc28f98e4876a0a /sw
parent4b3d1e7d4060b1bc8ff87e2935a209557cb7b41d (diff)
sw_redlinehide: more work on SwRedlineItr::GetNextRedln()
Change-Id: I9f79a3f6ace1914f516e89c7ddb16835a63ddc00
Diffstat (limited to 'sw')
-rw-r--r--sw/source/core/text/itratr.cxx15
-rw-r--r--sw/source/core/text/redlnitr.cxx64
-rw-r--r--sw/source/core/text/redlnitr.hxx3
3 files changed, 56 insertions, 26 deletions
diff --git a/sw/source/core/text/itratr.cxx b/sw/source/core/text/itratr.cxx
index f997fd1a24a8..7dde1bcd0c9e 100644
--- a/sw/source/core/text/itratr.cxx
+++ b/sw/source/core/text/itratr.cxx
@@ -601,21 +601,22 @@ TextFrameIndex SwAttrIter::GetNextAttr() const
sal_Int32 nNext = GetNextAttrImpl(pTextNode, nStartIndex, nEndIndex, nPosition);
if( m_pRedline )
{
- std::pair<sal_Int32, SwRangeRedline const*> const redline(
+ std::pair<sal_Int32, std::pair<SwRangeRedline const*, size_t>> const redline(
m_pRedline->GetNextRedln(nNext, pTextNode, nActRedline));
- if (redline.second)
+ if (redline.second.first)
{
assert(m_pMergedPara);
- if (CanSkipOverRedline(*redline.second, nStartIndex, nEndIndex))
+ if (CanSkipOverRedline(*redline.second.first, nStartIndex, nEndIndex))
{
- if (&redline.second->End()->nNode.GetNode() != pTextNode)
+ nActRedline += redline.second.second;
+ if (&redline.second.first->End()->nNode.GetNode() != pTextNode)
{
- pTextNode = redline.second->End()->nNode.GetNode().GetTextNode();
- nPosition = redline.second->End()->nContent.GetIndex();
+ pTextNode = redline.second.first->End()->nNode.GetNode().GetTextNode();
+ nPosition = redline.second.first->End()->nContent.GetIndex();
}
else
{
- nPosition = redline.second->End()->nContent.GetIndex();
+ nPosition = redline.second.first->End()->nContent.GetIndex();
}
}
else
diff --git a/sw/source/core/text/redlnitr.cxx b/sw/source/core/text/redlnitr.cxx
index 8ee64aa2206b..49415ff4c27c 100644
--- a/sw/source/core/text/redlnitr.cxx
+++ b/sw/source/core/text/redlnitr.cxx
@@ -444,57 +444,85 @@ void SwRedlineItr::Clear_( SwFont* pFnt )
m_Hints.clear();
}
-// TODO this must be ITERABLE pass in members as parameter
-std::pair<sal_Int32, SwRangeRedline const*>
-SwRedlineItr::GetNextRedln(sal_Int32 nNext, SwTextNode const*const pNode, SwRedlineTable::size_type & rAct)
+/// Ignore mode: does nothing.
+/// Show mode: returns end of redline if currently in one, or start of next
+/// Hide mode: returns start of next redline in current node, plus (if it's a
+/// Delete) its end position and number of consecutive RLs
+std::pair<sal_Int32, std::pair<SwRangeRedline const*, size_t>>
+SwRedlineItr::GetNextRedln(sal_Int32 nNext, SwTextNode const*const pNode,
+ SwRedlineTable::size_type & rAct)
{
sal_Int32 nStart(m_nStart);
sal_Int32 nEnd(m_nEnd);
nNext = NextExtend(pNode->GetIndex(), nNext);
if (m_eMode == Mode::Ignore || SwRedlineTable::npos == m_nFirst)
- return std::make_pair(nNext, nullptr);
+ return std::make_pair(nNext, std::make_pair(nullptr, 0));
if (SwRedlineTable::npos == rAct)
{
- rAct = m_nFirst; // TODO???
- m_rDoc.getIDocumentRedlineAccess().GetRedlineTable()[rAct]->CalcStartEnd(pNode->GetIndex(), nStart, nEnd);
+ rAct = m_nFirst;
}
if (rAct != m_nAct)
{
- m_rDoc.getIDocumentRedlineAccess().GetRedlineTable()[rAct]->CalcStartEnd(pNode->GetIndex(), nStart, nEnd);
+ while (rAct < m_rDoc.getIDocumentRedlineAccess().GetRedlineTable().size())
+ {
+ SwRangeRedline const*const pRedline(
+ m_rDoc.getIDocumentRedlineAccess().GetRedlineTable()[rAct]);
+ pRedline->CalcStartEnd(pNode->GetIndex(), nStart, nEnd);
+ if (m_eMode != Mode::Hide
+ || pRedline->GetType() == nsRedlineType_t::REDLINE_DELETE)
+ {
+ break;
+ }
+ ++rAct; // Hide mode: search a Delete RL
+ }
}
- if (m_bOn || !nStart)
+ if (rAct == m_rDoc.getIDocumentRedlineAccess().GetRedlineTable().size())
{
+ return std::make_pair(nNext, std::make_pair(nullptr, 0)); // no Delete here
+ }
+ if (m_bOn || (m_eMode == Mode::Show && nStart == 0))
+ { // in Ignore mode, the end of redlines isn't relevant, except as returned in the second in the pair!
if (nEnd < nNext)
nNext = nEnd;
}
else if (nStart <= nNext)
{
- nNext = nStart;
- if (m_eMode == Mode::Hide)
+ if (m_eMode == Mode::Show)
+ {
+ nNext = nStart;
+ }
+ else
{
- SwRangeRedline const* pRedline = m_rDoc.getIDocumentRedlineAccess().GetRedlineTable()[rAct];
+ assert(m_eMode == Mode::Hide);
+ SwRangeRedline const* pRedline(
+ m_rDoc.getIDocumentRedlineAccess().GetRedlineTable()[rAct]);
+ assert(pRedline->GetType() == nsRedlineType_t::REDLINE_DELETE); //?
if (pRedline->GetType() == nsRedlineType_t::REDLINE_DELETE)
{
- ++rAct;
- while (rAct < m_rDoc.getIDocumentRedlineAccess().GetRedlineTable().size())
+ nNext = nStart;
+ size_t nSkipped(1); // (consecutive) candidates to be skipped
+ while (rAct + nSkipped <
+ m_rDoc.getIDocumentRedlineAccess().GetRedlineTable().size())
{
- SwRangeRedline *const pNext = m_rDoc.getIDocumentRedlineAccess().GetRedlineTable()[rAct];
+ SwRangeRedline const*const pNext =
+ m_rDoc.getIDocumentRedlineAccess().GetRedlineTable()[rAct + nSkipped];
if (pRedline->End() < pNext->Start())
{
break; // done for now
}
- else if (pNext->Start() == pRedline->End() && pNext->GetType() == nsRedlineType_t::REDLINE_DELETE)
+ else if (pNext->Start() == pRedline->End() &&
+ pNext->GetType() == nsRedlineType_t::REDLINE_DELETE)
{
// consecutive delete - continue
pRedline = pNext;
}
- ++rAct;
+ ++nSkipped;
}
- return std::make_pair(nNext, pRedline);
+ return std::make_pair(nNext, std::make_pair(pRedline, nSkipped));
}
}
}
- return std::make_pair(nNext, nullptr);
+ return std::make_pair(nNext, std::make_pair(nullptr, 0));
}
bool SwRedlineItr::ChkSpecialUnderline_() const
diff --git a/sw/source/core/text/redlnitr.hxx b/sw/source/core/text/redlnitr.hxx
index 0b9f1c940e24..75f975d4cd7a 100644
--- a/sw/source/core/text/redlnitr.hxx
+++ b/sw/source/core/text/redlnitr.hxx
@@ -118,7 +118,8 @@ public:
if (m_nAct != m_nFirst) m_nAct = SwRedlineTable::npos;
if (m_pExt) m_pExt->Reset();
}
- std::pair<sal_Int32, SwRangeRedline const*> GetNextRedln(sal_Int32 nNext, SwTextNode const* pNode, SwRedlineTable::size_type & rAct);
+ std::pair<sal_Int32, std::pair<SwRangeRedline const*, size_t>> GetNextRedln(
+ sal_Int32 nNext, SwTextNode const* pNode, SwRedlineTable::size_type & rAct);
bool ChkSpecialUnderline() const
{ return IsOn() && ChkSpecialUnderline_(); }
bool CheckLine(sal_uLong nStartNode, sal_Int32 nChkStart, sal_uLong nEndNode, sal_Int32 nChkEnd);