41 sal_Int32 m_nFieldPos;
44 explicit FieldResult(sal_Int32
const nPos)
49 class sortfieldresults
52 bool operator()(
const FieldResult &rOne,
const FieldResult &rTwo)
const
54 return rOne.m_nFieldPos < rTwo.m_nFieldPos;
68 block(sal_Int32 nStart, sal_Int32 nLen,
bool bVisible)
69 : m_nStart(nStart), m_nLen(nLen), m_bVisible(bVisible)
77 explicit containsPos(
const sal_Int32 nPos)
81 bool operator() (
const block& rIn)
const
83 return m_nPos >= rIn.m_nStart && m_nPos < rIn.m_nStart + rIn.m_nLen;
92 const OUString& rNodeText = rNode.
GetText();
98 Range aRange( 0, rNodeText.isEmpty() ? 0 : rNodeText.getLength() - 1);
107 std::vector<block> aBlocks;
109 sal_Int32 nShownStart = 0;
110 for (sal_Int32
i = 0;
i < aHiddenMulti.GetRangeCount(); ++
i)
112 const Range& rRange = aHiddenMulti.GetRange(
i);
113 const sal_Int32 nHiddenStart = rRange.
Min();
114 const sal_Int32 nHiddenEnd = rRange.
Max() + 1;
115 const sal_Int32 nHiddenLen = nHiddenEnd - nHiddenStart;
117 const sal_Int32 nShownEnd = nHiddenStart;
118 const sal_Int32 nShownLen = nShownEnd - nShownStart;
121 aBlocks.emplace_back(nShownStart, nShownLen,
true);
124 aBlocks.emplace_back(nHiddenStart, nHiddenLen,
false);
126 nShownStart = nHiddenEnd;
129 sal_Int32 nTrailingShownLen = rNodeText.getLength() - nShownStart;
130 if (nTrailingShownLen)
131 aBlocks.emplace_back(nShownStart, nTrailingShownLen,
true);
138 for (
size_t i = 0; pSwpHints2 &&
i < pSwpHints2->
Count(); ++
i )
143 const sal_Int32 nDummyCharPos = pAttr->
GetStart();
144 if (aHiddenMulti.IsSelected(nDummyCharPos))
146 std::vector<block>::iterator aFind = std::find_if(aBlocks.begin(),
147 aBlocks.end(), containsPos(nDummyCharPos));
148 if (aFind != aBlocks.end())
150 FieldResult aFieldResult(nDummyCharPos);
151 switch (pAttr->
Which())
160 static_txtattr_cast<SwTextField const*>(pAttr)->
161 GetFormatField().GetField()->ExpandField(
true, pLayout);
162 aFieldResult.m_eType = FieldResult::FIELD;
166 if (eMode & ExpandMode::ExpandFootnote)
173 aFieldResult.m_eType = FieldResult::FOOTNOTE;
179 aFind->m_aAttrs.insert(aFieldResult);
188 SwPaM aPaM(rNode, 0, rNode, rNode.
Len());
189 std::vector<sw::mark::IFieldmark*> aDropDowns =
194 const sal_Int32 nDummyCharPos = pMark->GetMarkPos().nContent.GetIndex()-1;
195 if (aHiddenMulti.IsSelected(nDummyCharPos))
197 std::vector<block>::iterator aFind = std::find_if(aBlocks.begin(), aBlocks.end(),
198 containsPos(nDummyCharPos));
199 if (aFind != aBlocks.end())
201 FieldResult aFieldResult(nDummyCharPos);
205 aFieldResult.m_eType = FieldResult::FIELD;
206 aFind->m_aAttrs.insert(aFieldResult);
214 sal_Int32 nOffset = 0;
215 for (
const auto& rBlock : aBlocks)
217 const sal_Int32 nBlockLen = rBlock.m_nLen;
220 const sal_Int32 nBlockStart = rBlock.m_nStart;
221 const sal_Int32 nBlockEnd = nBlockStart + nBlockLen;
223 if (!rBlock.m_bVisible)
225 sal_Int32
const modelBlockPos(nBlockEnd);
226 sal_Int32
const viewBlockPos(nBlockStart + nOffset);
227 m_aMap.emplace_back(modelBlockPos, viewBlockPos,
false);
230 nOffset -= nBlockLen;
234 for (
const auto& rAttr : rBlock.m_aAttrs)
236 sal_Int32
const modelFieldPos(rAttr.m_nFieldPos);
237 sal_Int32
const viewFieldPos(rAttr.m_nFieldPos + nOffset);
238 m_aMap.emplace_back(modelFieldPos, viewFieldPos,
true );
241 nOffset += rAttr.m_sExpand.getLength() - 1;
243 switch (rAttr.m_eType)
245 case FieldResult::FIELD:
248 case FieldResult::FOOTNOTE:
256 sal_Int32
const modelEndBlock(nBlockEnd);
257 sal_Int32
const viewFieldPos(nBlockEnd + nOffset);
258 m_aMap.emplace_back(modelEndBlock, viewFieldPos,
true);
269 [nModelPos](
const ConversionMapEntry& rEntry) {
return rEntry.m_nModelPos >= nModelPos; });
270 if (aIter !=
m_aMap.end())
274 if (!aIter->m_bVisible)
275 return aIter->m_nViewPos;
280 const sal_Int32 nOffsetFromEnd = aIter->m_nModelPos - nModelPos;
281 return aIter->m_nViewPos - nOffsetFromEnd;
292 aRet.
mnPos = nViewPos;
296 [nViewPos](
const ConversionMapEntry& rEntry) {
return rEntry.m_nViewPos > nViewPos; });
301 const sal_Int32 nPosModel = aIter->m_nModelPos;
302 const sal_Int32 nPosExpand = aIter->m_nViewPos;
307 const sal_Int32 nPrevPosModel = aIter->m_nModelPos;
308 const sal_Int32 nPrevPosExpand = aIter->m_nViewPos;
310 const sal_Int32 nLengthModel = nPosModel - nPrevPosModel;
311 const sal_Int32 nLengthExpand = nPosExpand - nPrevPosExpand;
313 const sal_Int32 nFieldLengthExpand = nLengthExpand - nLengthModel + 1;
314 const sal_Int32 nFieldEndExpand = nPrevPosExpand + nFieldLengthExpand;
317 if ( nFieldEndExpand <= nViewPos )
320 const sal_Int32 nDistToField = nViewPos - nFieldEndExpand + 1;
321 aRet.
mnPos = nPrevPosModel + nDistToField;
326 aRet.
mnPos = nPrevPosModel;
327 aRet.
mnSubPos = nViewPos - nPrevPosExpand;
do not expand to content, but replace with zwsp
const OUString & GetText() const
SwpHints * GetpSwpHints()
virtual sal_Int32 Len() const override
bool HasDummyChar() const
IDocumentMarkAccess * getIDocumentMarkAccess()
This struct defines a position in the model string.
constexpr TypedWhichId< SwFormatField > RES_TXTATR_ANNOTATION(59)
The root element of a Writer document layout.
OUString ExpandFieldmark(IFieldmark *pBM)
static void selectHiddenTextProperty(const SwTextNode &rNode, MultiSelection &rHiddenMulti, std::vector< std::pair< sw::mark::IBookmark const *, MarkKind >> *pBookmarks)
sal_Int32 ConvertToViewPosition(sal_Int32 nModelPos) const
Converts a model position into a view position.
std::vector< sal_Int32 > m_FieldPositions
store positions of fields and footnotes for grammar checkers
A wrapper around SfxPoolItem to store the start position of (usually) a text portion, with an optional end.
virtual std::vector< ::sw::mark::IFieldmark * > getDropDownsFor(const SwPaM &rPaM) const =0
sal_Int32 GetStart() const
constexpr TypedWhichId< SwFormatFootnote > RES_TXTATR_FTN(58)
PaM is Point and Mark: a selection of the document model.
constexpr TypedWhichId< SwFormatField > RES_TXTATR_FIELD(RES_TXTATR_NOEND_BEGIN)
SwTextAttr * Get(size_t nPos) const
static void selectRedLineDeleted(const SwTextNode &rNode, MultiSelection &rHiddenMulti, bool bSelect=true)
For each expanded/hidden portion in the model string, there is an entry in the conversion map...
SwTextNode is a paragraph in the document model.
ExpandMode
Some helpers for converting model strings to view strings.
An SwTextAttr container, stores all directly formatted text portions for a text node.
std::vector< sal_Int32 > m_FootnotePositions
ModelPosition ConvertToModelPosition(sal_Int32 nViewPos) const
Converts a view position into a model position.
const EnumerationType m_eType