34#include <bookmark.hxx>
43 sal_Int32 m_nFieldPos;
46 explicit FieldResult(sal_Int32
const nPos)
54 bool operator()(
const FieldResult &rOne,
const FieldResult &rTwo)
const
56 return rOne.m_nFieldPos < rTwo.m_nFieldPos;
70 block(sal_Int32 nStart, sal_Int32 nLen,
bool bVisible)
71 : m_nStart(nStart), m_nLen(nLen), m_bVisible(
bVisible)
79 explicit containsPos(
const sal_Int32 nPos)
83 bool operator() (
const block& rIn)
const
85 return m_nPos >= rIn.m_nStart &&
m_nPos < rIn.m_nStart + rIn.m_nLen;
94 const OUString& rNodeText = rNode.
GetText();
100 Range aRange( 0, rNodeText.isEmpty() ? 0 : rNodeText.getLength() - 1);
113 ::std::deque<::std::pair<sw::mark::IFieldmark const*, bool>> startedFields;
114 SwPaM cursor(rNode, 0);
121 if (pFieldMark ==
nullptr
128 pFieldMark =
nullptr;
144 startedFields.emplace_front(pFieldMark, sepPos.
nNode < rNode);
152 ::std::optional<sal_Int32> oStartHidden;
153 if (!::std::all_of(startedFields.begin(), startedFields.end(),
154 [](
auto const& it) { return it.second; }))
156 oStartHidden.emplace(0);
166 startedFields.emplace_back(pFieldMark,
false);
169 oStartHidden.emplace(
i);
175 assert(startedFields.back().first->IsCoveringPosition(
SwPosition(
const_cast<SwTextNode&
>(rNode),
i)));
176 startedFields.back().second =
true;
177 assert(oStartHidden);
178 if (::std::all_of(startedFields.begin(), startedFields.end(),
179 [](
auto const& it) { return it.second; }))
182#if defined __GNUC__ && !defined __clang_ && __GNUC__ >= 11 && __GNUC__ <= 12
183#pragma GCC diagnostic push
184#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
187 aHiddenMulti.
Select({*oStartHidden,
i},
true);
188 oStartHidden.reset();
189#if defined __GNUC__ && !defined __clang_ && __GNUC__ >= 11 && __GNUC__ <= 12
190#pragma GCC diagnostic pop
198 startedFields.pop_back();
204 if (oStartHidden && rNode.
Len() != 0)
206 aHiddenMulti.
Select({*oStartHidden, rNode.
Len() - 1},
true);
210 std::vector<block> aBlocks;
212 sal_Int32 nShownStart = 0;
216 const sal_Int32 nHiddenStart = rRange.
Min();
217 const sal_Int32 nHiddenEnd = rRange.
Max() + 1;
218 const sal_Int32 nHiddenLen = nHiddenEnd - nHiddenStart;
220 const sal_Int32 nShownEnd = nHiddenStart;
221 const sal_Int32 nShownLen = nShownEnd - nShownStart;
224 aBlocks.emplace_back(nShownStart, nShownLen,
true);
227 aBlocks.emplace_back(nHiddenStart, nHiddenLen,
false);
229 nShownStart = nHiddenEnd;
232 sal_Int32 nTrailingShownLen = rNodeText.getLength() - nShownStart;
233 if (nTrailingShownLen)
234 aBlocks.emplace_back(nShownStart, nTrailingShownLen,
true);
241 for (
size_t i = 0; pSwpHints2 &&
i < pSwpHints2->
Count(); ++
i )
246 const sal_Int32 nDummyCharPos = pAttr->
GetStart();
249 std::vector<block>::iterator aFind = std::find_if(aBlocks.begin(),
250 aBlocks.end(), containsPos(nDummyCharPos));
251 if (aFind != aBlocks.end())
253 FieldResult aFieldResult(nDummyCharPos);
254 switch (pAttr->
Which())
260 aFieldResult.m_eType = FieldResult::FIELD;
269 static_txtattr_cast<SwTextField const*>(pAttr)->
270 GetFormatField().GetField()->ExpandField(
true, pLayout);
271 aFieldResult.m_eType = FieldResult::FIELD;
282 aFieldResult.m_eType = FieldResult::FOOTNOTE;
288 aFind->m_aAttrs.insert(aFieldResult);
297 SwPaM aPaM(rNode, 0, rNode, rNode.
Len());
298 std::vector<sw::mark::IFieldmark*> aNoTextFieldmarks =
303 const sal_Int32 nDummyCharPos = pMark->GetMarkStart().nContent.GetIndex();
306 std::vector<block>::iterator aFind = std::find_if(aBlocks.begin(), aBlocks.end(),
307 containsPos(nDummyCharPos));
308 if (aFind != aBlocks.end())
310 FieldResult aFieldResult(nDummyCharPos);
314 aFieldResult.m_eType = FieldResult::FIELD;
315 aFind->m_aAttrs.insert(aFieldResult);
323 sal_Int32 nOffset = 0;
324 for (
const auto& rBlock : aBlocks)
326 const sal_Int32 nBlockLen = rBlock.m_nLen;
329 const sal_Int32 nBlockStart = rBlock.m_nStart;
330 const sal_Int32 nBlockEnd = nBlockStart + nBlockLen;
332 if (!rBlock.m_bVisible)
334 sal_Int32
const modelBlockPos(nBlockEnd);
335 sal_Int32
const viewBlockPos(nBlockStart + nOffset);
336 m_aMap.emplace_back(modelBlockPos, viewBlockPos,
false);
339 nOffset -= nBlockLen;
343 for (
const auto& rAttr : rBlock.m_aAttrs)
345 sal_Int32
const modelFieldPos(rAttr.m_nFieldPos);
346 sal_Int32
const viewFieldPos(rAttr.m_nFieldPos + nOffset);
347 m_aMap.emplace_back(modelFieldPos, viewFieldPos,
true );
350 nOffset += rAttr.m_sExpand.getLength() - 1;
352 switch (rAttr.m_eType)
354 case FieldResult::FIELD:
357 case FieldResult::FOOTNOTE:
365 sal_Int32
const modelEndBlock(nBlockEnd);
366 sal_Int32
const viewFieldPos(nBlockEnd + nOffset);
367 m_aMap.emplace_back(modelEndBlock, viewFieldPos,
true);
378 [nModelPos](
const ConversionMapEntry& rEntry) { return rEntry.m_nModelPos >= nModelPos; });
379 if (aIter !=
m_aMap.end())
383 if (!aIter->m_bVisible)
384 return aIter->m_nViewPos;
389 const sal_Int32 nOffsetFromEnd = aIter->m_nModelPos - nModelPos;
390 return aIter->m_nViewPos - nOffsetFromEnd;
401 aRet.
mnPos = nViewPos;
405 [nViewPos](
const ConversionMapEntry& rEntry) { return rEntry.m_nViewPos > nViewPos; });
410 const sal_Int32 nPosModel = aIter->m_nModelPos;
411 const sal_Int32 nPosExpand = aIter->m_nViewPos;
416 const sal_Int32 nPrevPosModel = aIter->m_nModelPos;
417 const sal_Int32 nPrevPosExpand = aIter->m_nViewPos;
419 const sal_Int32 nLengthModel = nPosModel - nPrevPosModel;
420 const sal_Int32 nLengthExpand = nPosExpand - nPrevPosExpand;
422 const sal_Int32 nFieldLengthExpand = nLengthExpand - nLengthModel + 1;
423 const sal_Int32 nFieldEndExpand = nPrevPosExpand + nFieldLengthExpand;
426 if ( nFieldEndExpand <= nViewPos )
429 const sal_Int32 nDistToField = nViewPos - nFieldEndExpand + 1;
430 aRet.
mnPos = nPrevPosModel + nDistToField;
435 aRet.
mnPos = nPrevPosModel;
436 aRet.
mnSubPos = nViewPos - nPrevPosExpand;
Provides access to the marks of a document.
virtual std::vector<::sw::mark::IFieldmark * > getNoTextFieldmarksIn(const SwPaM &rPaM) const =0
virtual ::sw::mark::IFieldmark * getFieldmarkAt(const SwPosition &rPos) const =0
get Fieldmark for CH_TXT_ATR_FIELDSTART/CH_TXT_ATR_FIELDEND at rPos
virtual ::sw::mark::IFieldmark * getFieldmarkFor(const SwPosition &pos) const =0
ModelPosition ConvertToModelPosition(sal_Int32 nViewPos) const
Converts a view position into a model position.
std::vector< sal_Int32 > m_FieldPositions
store positions of fields and footnotes for grammar checkers
sal_Int32 ConvertToViewPosition(sal_Int32 nModelPos) const
Converts a model position into a view position.
std::vector< sal_Int32 > m_FootnotePositions
const Range & GetRange(sal_Int32 nRange) const
sal_Int32 GetRangeCount() const
bool Select(sal_Int32 nIndex, bool bSelect=true)
bool IsSelected(sal_Int32 nIndex) const
IDocumentMarkAccess * getIDocumentMarkAccess()
sal_Int32 GetIndex() const
SwTextNode * GetTextNode()
Inline methods from Node.hxx.
PaM is Point and Mark: a selection of the document model.
bool Move(SwMoveFnCollection const &fnMove=fnMoveForward, SwGoInDoc fnGo=GoInContent)
Movement of cursor.
const SwPosition * GetPoint() const
The root element of a Writer document layout.
static void selectHiddenTextProperty(const SwTextNode &rNode, MultiSelection &rHiddenMulti, std::vector< std::pair< sw::mark::IBookmark const *, MarkKind > > *pBookmarks)
static void selectRedLineDeleted(const SwTextNode &rNode, MultiSelection &rHiddenMulti, bool bSelect=true)
A wrapper around SfxPoolItem to store the start position of (usually) a text portion,...
sal_Int32 GetStart() const
bool HasDummyChar() const
SwTextNode is a paragraph in the document model.
virtual sal_Int32 Len() const override
SwpHints * GetpSwpHints()
const OUString & GetText() const
An SwTextAttr container, stores all directly formatted text portions for a text node.
SwTextAttr * Get(size_t nPos) const
virtual const SwPosition & GetMarkStart() const =0
const EnumerationType m_eType
#define CH_TXT_ATR_FIELDSEP
#define CH_TXT_ATR_FORMELEMENT
constexpr TypedWhichId< SwFormatFootnote > RES_TXTATR_FTN(59)
constexpr TypedWhichId< SwFormatField > RES_TXTATR_ANNOTATION(60)
constexpr TypedWhichId< SwFormatField > RES_TXTATR_FIELD(RES_TXTATR_NOEND_BEGIN)
#define CH_TXT_ATR_FIELDEND
#define CH_TXT_ATR_FIELDSTART
ExpandMode
Some helpers for converting model strings to view strings.
@ ReplaceMode
do not expand to content, but replace with zwsp
double getLength(const B2DPolygon &rCandidate)
SwPosition FindFieldSep(IFieldmark const &rMark)
return position of the CH_TXT_ATR_FIELDSEP for rMark
OUString ExpandFieldmark(IFieldmark *pBM)
bool GoInContent(SwPaM &rPam, SwMoveFnCollection const &fnMove)
SwMoveFnCollection const & fnMoveBackward
For each expanded/hidden portion in the model string, there is an entry in the conversion map.
This struct defines a position in the model string.
Marks a position in the document model.