summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stahl <Michael.Stahl@cib.de>2018-05-04 16:47:19 +0200
committerMichael Stahl <Michael.Stahl@cib.de>2018-06-08 21:51:21 +0200
commit8e1c04d071b21f08eeeed0800eae7ce5fa04f3d0 (patch)
tree5d78c6637bc06095f55c206efa59eb114609dc45
parente320722f1ac20a053e81278cf67f40b10105d509 (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.hxx18
-rw-r--r--sw/source/core/text/txtfrm.cxx68
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()
{