diff options
author | Michael Stahl <Michael.Stahl@cib.de> | 2018-05-04 16:47:19 +0200 |
---|---|---|
committer | Michael Stahl <Michael.Stahl@cib.de> | 2018-06-08 21:51:21 +0200 |
commit | 8e1c04d071b21f08eeeed0800eae7ce5fa04f3d0 (patch) | |
tree | 5d78c6637bc06095f55c206efa59eb114609dc45 | |
parent | e320722f1ac20a053e81278cf67f40b10105d509 (diff) |
sw_redlinehide: add iterator for all the text attributes in merged...
paragraph, because one SwAttrIter isn't enough for everyone.
Change-Id: Iceff5c26a98bdcc09c0a810b9ac8ca77aa750c17
-rw-r--r-- | sw/source/core/inc/txtfrm.hxx | 18 | ||||
-rw-r--r-- | sw/source/core/text/txtfrm.cxx | 68 |
2 files changed, 86 insertions, 0 deletions
diff --git a/sw/source/core/inc/txtfrm.hxx b/sw/source/core/inc/txtfrm.hxx index 002d392e48ab..498ebbaee218 100644 --- a/sw/source/core/inc/txtfrm.hxx +++ b/sw/source/core/inc/txtfrm.hxx @@ -881,6 +881,24 @@ public: ~SwDigitModeModifier(); }; +namespace sw { + +struct MergedPara; + +/// iterate SwTextAttr in potentially merged text frame +class MergedAttrIter +{ + sw::MergedPara const*const m_pMerged; + SwTextNode const*const m_pNode; + size_t m_CurrentExtent; + size_t m_CurrentHint; +public: + MergedAttrIter(SwTextFrame const& rFrame); + SwTextAttr const* NextAttr(SwTextNode const** ppNode = nullptr); +}; + +} // namespace sw + #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/core/text/txtfrm.cxx b/sw/source/core/text/txtfrm.cxx index ae779da53bd0..32cbd1dcecb1 100644 --- a/sw/source/core/text/txtfrm.cxx +++ b/sw/source/core/text/txtfrm.cxx @@ -80,6 +80,74 @@ #include <ftnidx.hxx> +namespace sw { + + MergedAttrIter::MergedAttrIter(SwTextFrame const& rFrame) + : m_pMerged(rFrame.GetMergedPara()) + , m_pNode(m_pMerged ? nullptr : rFrame.GetTextNodeFirst()) + , m_CurrentExtent(0) + , m_CurrentHint(0) + { + } + + SwTextAttr const* MergedAttrIter::NextAttr(SwTextNode const** ppNode) + { + if (m_pMerged) + { + while (m_CurrentExtent < m_pMerged->extents.size()) + { + sw::Extent const& rExtent(m_pMerged->extents[m_CurrentExtent]); + if (SwpHints const*const pHints = rExtent.pNode->GetpSwpHints()) + { + while (m_CurrentHint < pHints->Count()) + { + SwTextAttr const*const pHint(pHints->Get(m_CurrentHint)); + if (rExtent.nEnd < pHint->GetStart()) + { + break; + } + ++m_CurrentHint; + if (rExtent.nStart <= pHint->GetStart()) + { + if (ppNode) + { + *ppNode = rExtent.pNode; + } + return pHint; + } + } + } + ++m_CurrentExtent; + if (m_CurrentExtent < m_pMerged->extents.size() && + rExtent.pNode != m_pMerged->extents[m_CurrentExtent].pNode) + { + m_CurrentHint = 0; // reset + } + } + return nullptr; + } + else + { + SwpHints const*const pHints(m_pNode->GetpSwpHints()); + if (pHints) + { + while (m_CurrentHint < pHints->Count()) + { + SwTextAttr const*const pHint(pHints->Get(m_CurrentHint)); + ++m_CurrentHint; + if (ppNode) + { + *ppNode = m_pNode; + } + return pHint; + } + } + return nullptr; + } + } + +} // namespace sw + /// Switches width and height of the text frame void SwTextFrame::SwapWidthAndHeight() { |