summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stahl <Michael.Stahl@cib.de>2018-10-09 11:11:07 +0200
committerMichael Stahl <Michael.Stahl@cib.de>2018-11-15 15:09:57 +0100
commit561980ac42693b9808b0dd0568d64392abd10c53 (patch)
tree7d1c27a41139760fd59244df4bd2bdd792d4f9dd
parent313d54a664e1489c2558431d86f204229aa85e21 (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.hxx29
-rw-r--r--sw/source/core/text/wrong.cxx127
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: */