diff options
author | Michael Stahl <Michael.Stahl@cib.de> | 2018-05-15 11:37:23 +0200 |
---|---|---|
committer | Michael Stahl <Michael.Stahl@cib.de> | 2018-06-08 21:51:27 +0200 |
commit | dccaa8e6e6a6fa022aa33ed22e297c5e1c988bee (patch) | |
tree | 134e6a68a4ae622cb3562960dcc28f98e4876a0a /sw | |
parent | 4b3d1e7d4060b1bc8ff87e2935a209557cb7b41d (diff) |
sw_redlinehide: more work on SwRedlineItr::GetNextRedln()
Change-Id: I9f79a3f6ace1914f516e89c7ddb16835a63ddc00
Diffstat (limited to 'sw')
-rw-r--r-- | sw/source/core/text/itratr.cxx | 15 | ||||
-rw-r--r-- | sw/source/core/text/redlnitr.cxx | 64 | ||||
-rw-r--r-- | sw/source/core/text/redlnitr.hxx | 3 |
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); |