diff options
author | Michael Stahl <Michael.Stahl@cib.de> | 2018-10-09 11:11:07 +0200 |
---|---|---|
committer | Michael Stahl <Michael.Stahl@cib.de> | 2018-11-15 15:09:57 +0100 |
commit | 561980ac42693b9808b0dd0568d64392abd10c53 (patch) | |
tree | 7d1c27a41139760fd59244df4bd2bdd792d4f9dd | |
parent | 313d54a664e1489c2558431d86f204229aa85e21 (diff) |
sw_redlinehide_3: add another kind of WrongListIterator
This is not very efficient but should be good enough for a11y use.
Change-Id: Ibb00cf4ae18effb09673f3f7d9b9b2e1d72413b1
-rw-r--r-- | sw/source/core/inc/wrong.hxx | 29 | ||||
-rw-r--r-- | sw/source/core/text/wrong.cxx | 127 |
2 files changed, 152 insertions, 4 deletions
diff --git a/sw/source/core/inc/wrong.hxx b/sw/source/core/inc/wrong.hxx index 13f1f50507cf..8340d3337ca4 100644 --- a/sw/source/core/inc/wrong.hxx +++ b/sw/source/core/inc/wrong.hxx @@ -29,6 +29,8 @@ #include <vector> +#include <boost/optional.hpp> + #include <tools/color.hxx> #include <swtypes.hxx> #include <viewopt.hxx> @@ -346,9 +348,9 @@ namespace sw { struct MergedPara; -class WrongListIterator +class WrongListIteratorBase { -private: +protected: SwWrongList const* (SwTextNode::*const m_pGetWrongList)() const; sw::MergedPara const*const m_pMergedPara; size_t m_CurrentExtent; @@ -357,6 +359,17 @@ private: public: /// for the text frame + WrongListIteratorBase(SwTextFrame const& rFrame, + SwWrongList const* (SwTextNode::*pGetWrongList)() const); + /// for SwTextSlot + WrongListIteratorBase(SwWrongList const& rWrongList); +}; + +class WrongListIterator + : public WrongListIteratorBase +{ +public: + /// for the text frame WrongListIterator(SwTextFrame const& rFrame, SwWrongList const* (SwTextNode::*pGetWrongList)() const); /// for SwTextSlot @@ -371,6 +384,18 @@ public: } }; +class WrongListIteratorCounter + : public WrongListIteratorBase +{ +public: + WrongListIteratorCounter(SwTextFrame const& rFrame, + SwWrongList const* (SwTextNode::*pGetWrongList)() const); + WrongListIteratorCounter(SwWrongList const& rWrongList); + + sal_uInt16 GetElementCount(); + boost::optional<std::pair<TextFrameIndex, TextFrameIndex>> GetElementAt(sal_uInt16 nIndex); +}; + } // namespace sw #endif diff --git a/sw/source/core/text/wrong.cxx b/sw/source/core/text/wrong.cxx index 4e1668104f32..8e334a232e6c 100644 --- a/sw/source/core/text/wrong.cxx +++ b/sw/source/core/text/wrong.cxx @@ -639,7 +639,7 @@ void SwWrongList::Insert( const OUString& rType, namespace sw { -WrongListIterator::WrongListIterator(SwTextFrame const& rFrame, +WrongListIteratorBase::WrongListIteratorBase(SwTextFrame const& rFrame, SwWrongList const* (SwTextNode::*pGetWrongList)() const) : m_pGetWrongList(pGetWrongList) , m_pMergedPara(rFrame.GetMergedPara()) @@ -651,7 +651,7 @@ WrongListIterator::WrongListIterator(SwTextFrame const& rFrame, { } -WrongListIterator::WrongListIterator(SwWrongList const& rWrongList) +WrongListIteratorBase::WrongListIteratorBase(SwWrongList const& rWrongList) : m_pGetWrongList(nullptr) , m_pMergedPara(nullptr) , m_CurrentExtent(0) @@ -660,6 +660,17 @@ WrongListIterator::WrongListIterator(SwWrongList const& rWrongList) { } +WrongListIterator::WrongListIterator(SwTextFrame const& rFrame, + SwWrongList const* (SwTextNode::*pGetWrongList)() const) + : WrongListIteratorBase(rFrame, pGetWrongList) +{ +} + +WrongListIterator::WrongListIterator(SwWrongList const& rWrongList) + : WrongListIteratorBase(rWrongList) +{ +} + bool WrongListIterator::Check(TextFrameIndex & rStart, TextFrameIndex & rLen) { if (m_pMergedPara) @@ -813,6 +824,118 @@ WrongListIterator::GetWrongElement(TextFrameIndex const nStart) return nullptr; } +WrongListIteratorCounter::WrongListIteratorCounter(SwTextFrame const& rFrame, + SwWrongList const* (SwTextNode::*pGetWrongList)() const) + : WrongListIteratorBase(rFrame, pGetWrongList) +{ +} + +WrongListIteratorCounter::WrongListIteratorCounter(SwWrongList const& rWrongList) + : WrongListIteratorBase(rWrongList) +{ +} + +sal_uInt16 WrongListIteratorCounter::GetElementCount() +{ + if (m_pMergedPara) + { + sal_uInt16 nRet(0); + m_CurrentExtent = 0; + m_CurrentIndex = TextFrameIndex(0); + SwNode const* pNode(nullptr); + sal_uInt16 InCurrentNode(0); + while (m_CurrentExtent < m_pMergedPara->extents.size()) + { + sw::Extent const& rExtent(m_pMergedPara->extents[m_CurrentExtent]); + if (rExtent.pNode != pNode) + { + InCurrentNode = 0; + pNode = rExtent.pNode; + } + SwWrongList const*const pWrongList((rExtent.pNode->*m_pGetWrongList)()); + for (; pWrongList && InCurrentNode < pWrongList->Count(); ++InCurrentNode) + { + SwWrongArea const*const pWrong(pWrongList->GetElement(InCurrentNode)); + TextFrameIndex const nExtentEnd( + m_CurrentIndex + TextFrameIndex(rExtent.nEnd - rExtent.nStart)); + if (nExtentEnd <= TextFrameIndex(pWrong->mnPos)) + { + break; // continue outer loop + } + if (m_CurrentIndex < TextFrameIndex(pWrong->mnPos + pWrong->mnLen)) + { + ++nRet; + } + } + m_CurrentIndex += TextFrameIndex(rExtent.nEnd - rExtent.nStart); + ++m_CurrentExtent; + } + return nRet; + } + else if (m_pWrongList) + { + return m_pWrongList->Count(); + } + return 0; +} + +boost::optional<std::pair<TextFrameIndex, TextFrameIndex>> +WrongListIteratorCounter::GetElementAt(sal_uInt16 nIndex) +{ + if (m_pMergedPara) + { + m_CurrentExtent = 0; + m_CurrentIndex = TextFrameIndex(0); + SwNode const* pNode(nullptr); + sal_uInt16 InCurrentNode(0); + while (m_CurrentExtent < m_pMergedPara->extents.size()) + { + sw::Extent const& rExtent(m_pMergedPara->extents[m_CurrentExtent]); + if (rExtent.pNode != pNode) + { + InCurrentNode = 0; + pNode = rExtent.pNode; + } + SwWrongList const*const pWrongList((rExtent.pNode->*m_pGetWrongList)()); + for (; pWrongList && InCurrentNode < pWrongList->Count(); ++InCurrentNode) + { + SwWrongArea const*const pWrong(pWrongList->GetElement(InCurrentNode)); + TextFrameIndex const nExtentEnd( + m_CurrentIndex + TextFrameIndex(rExtent.nEnd - rExtent.nStart)); + if (nExtentEnd <= TextFrameIndex(pWrong->mnPos)) + { + break; // continue outer loop + } + if (m_CurrentIndex < TextFrameIndex(pWrong->mnPos + pWrong->mnLen)) + { + if (nIndex == 0) + { + return boost::optional<std::pair<TextFrameIndex, TextFrameIndex>>( + std::pair<TextFrameIndex, TextFrameIndex>( + m_CurrentIndex - TextFrameIndex(rExtent.nStart - + std::max(rExtent.nStart, pWrong->mnPos)), + m_CurrentIndex - TextFrameIndex(rExtent.nStart - + std::min(pWrong->mnPos + pWrong->mnLen, rExtent.nEnd)))); + } + --nIndex; + } + } + m_CurrentIndex += TextFrameIndex(rExtent.nEnd - rExtent.nStart); + ++m_CurrentExtent; + } + return boost::optional<std::pair<TextFrameIndex, TextFrameIndex>>(); + } + else if (m_pWrongList) + { + SwWrongArea const*const pWrong(m_pWrongList->GetElement(nIndex)); + return boost::optional<std::pair<TextFrameIndex, TextFrameIndex>>( + std::pair<TextFrameIndex, TextFrameIndex>( + TextFrameIndex(pWrong->mnPos), + TextFrameIndex(pWrong->mnPos + pWrong->mnLen))); + } + return boost::optional<std::pair<TextFrameIndex, TextFrameIndex>>(); +} + } // namespace sw /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |