40 using namespace ::boost;
48 const int BEFORE_NODE = 0;
49 const int BEFORE_SAME_NODE = 1;
50 const int SAME_POSITION = 2;
51 const int BEHIND_SAME_NODE = 3;
52 const int BEHIND_NODE = 4;
57 int nReturn = BEFORE_NODE;
61 if( nCntIdx < nContent )
62 nReturn = BEFORE_SAME_NODE;
63 else if( nCntIdx == nContent )
64 nReturn = SAME_POSITION;
66 nReturn = BEHIND_SAME_NODE;
68 else if( nIndex > nNode )
69 nReturn = BEHIND_NODE;
81 SAL_INFO(
"sw.core",
"Index: " << m_nIdx <<
"\tOther: " << m_bOther <<
"\tContent: " << m_nContent);
94 const sal_Int32 m_nOffset;
95 OffsetUpdater(
SwContentNode const * pNewContentNode, sal_Int32 nOffset)
96 : m_pNewContentNode(pNewContentNode), m_nOffset(nOffset) {};
97 void operator()(
SwPosition& rPos, sal_Int32 nContent)
const
99 rPos.
nNode = *m_pNewContentNode;
100 rPos.
nContent.
Assign(const_cast<SwContentNode*>(m_pNewContentNode), nContent + m_nOffset);
107 const sal_Int32 m_nCorrLen;
109 : m_pNewContentNode(pNewContentNode), m_nLen(nLen), m_nCorrLen(nCorrLen) {};
110 void operator()(
SwPosition& rPos, sal_Int32 nContent)
const
112 rPos.
nNode = *m_pNewContentNode;
113 if( nContent < m_nCorrLen )
115 rPos.
nContent.
Assign(const_cast<SwContentNode*>(m_pNewContentNode), std::min( nContent, static_cast<sal_Int32>(m_nLen) ) );
125 std::vector<MarkEntry> m_aBkmkEntries;
126 std::vector<MarkEntry> m_aRedlineEntries;
127 std::vector<MarkEntry> m_aFlyEntries;
128 std::vector<PaMEntry> m_aUnoCursorEntries;
129 std::vector<PaMEntry> m_aShellCursorEntries;
130 typedef std::function<void (SwPosition& rPos, sal_Int32 nContent)> updater_t;
131 virtual void Clear()
override
133 m_aBkmkEntries.clear();
134 m_aRedlineEntries.clear();
135 m_aFlyEntries.clear();
136 m_aUnoCursorEntries.clear();
137 m_aShellCursorEntries.clear();
139 virtual bool Empty()
override
141 return m_aBkmkEntries.empty() && m_aRedlineEntries.empty() && m_aFlyEntries.empty() && m_aUnoCursorEntries.empty() && m_aShellCursorEntries.empty();
143 virtual void Save(
SwDoc& rDoc,
sal_uLong nNode, sal_Int32 nContent,
bool bSaveFlySplit=
false)
override
145 SaveBkmks(rDoc, nNode, nContent);
146 SaveRedlines(rDoc, nNode, nContent);
147 SaveFlys(rDoc, nNode, nContent, bSaveFlySplit);
148 SaveUnoCursors(rDoc, nNode, nContent);
149 SaveShellCursors(rDoc, nNode, nContent);
154 updater_t aUpdater = OffsetUpdater(pCNd, nOffset);
155 if (eMode & RestoreMode::NonFlys)
157 RestoreBkmks(rDoc, aUpdater);
158 RestoreRedlines(rDoc, aUpdater);
159 RestoreUnoCursors(aUpdater);
160 RestoreShellCursors(aUpdater);
162 if (eMode & RestoreMode::Flys)
164 RestoreFlys(rDoc, aUpdater, bAuto);
167 virtual void Restore(
SwNode& rNd, sal_Int32 nLen, sal_Int32 nCorrLen,
RestoreMode eMode = RestoreMode::All)
override
171 updater_t aUpdater = LimitUpdater(pCNd, nLen, nCorrLen);
172 if (eMode & RestoreMode::NonFlys)
174 RestoreBkmks(rDoc, aUpdater);
175 RestoreRedlines(rDoc, aUpdater);
176 RestoreUnoCursors(aUpdater);
177 RestoreShellCursors(aUpdater);
179 if (eMode & RestoreMode::Flys)
181 RestoreFlys(rDoc, aUpdater,
false);
187 void RestoreBkmks(
SwDoc& rDoc, updater_t
const & rUpdater);
188 void SaveRedlines(
SwDoc& rDoc,
sal_uLong nNode, sal_Int32 nContent);
189 void RestoreRedlines(
SwDoc& rDoc, updater_t
const & rUpdater);
190 void SaveFlys(
SwDoc& rDoc,
sal_uLong nNode, sal_Int32 nContent,
bool bSaveFlySplit);
191 void RestoreFlys(
SwDoc& rDoc, updater_t
const & rUpdater,
bool bAuto);
192 void SaveUnoCursors(
SwDoc& rDoc,
sal_uLong nNode, sal_Int32 nContent);
193 void RestoreUnoCursors(updater_t
const & rUpdater);
194 void SaveShellCursors(
SwDoc& rDoc,
sal_uLong nNode, sal_Int32 nContent);
195 void RestoreShellCursors(updater_t
const & rUpdater);
198 static void SetRightMarkPos(MarkBase* pMark,
bool bOther,
const SwPosition*
const pPos)
199 { bOther ? pMark->SetOtherMarkPos(*pPos) : pMark->SetMarkPos(*pPos); };
201 void lcl_ChkPaM( std::vector<PaMEntry>& rPaMEntries,
const sal_uLong nNode,
const sal_Int32 nContent,
SwPaM& rPaM,
const bool bGetPoint,
bool bSetMark)
207 rPaMEntries.push_back(aEntry);
210 void lcl_ChkPaMBoth( std::vector<PaMEntry>& rPaMEntries,
const sal_uLong nNode,
const sal_Int32 nContent,
SwPaM& rPaM)
212 lcl_ChkPaM(rPaMEntries, nNode, nContent, rPaM,
true,
true);
213 lcl_ChkPaM(rPaMEntries, nNode, nContent, rPaM,
false,
false);
215 void lcl_ChkUnoCrsrPaMBoth(std::vector<PaMEntry>& rPaMEntries,
const sal_uLong nNode,
const sal_Int32 nContent,
SwPaM& rPaM)
217 lcl_ChkPaM(rPaMEntries, nNode, nContent, rPaM,
true,
false);
218 lcl_ChkPaM(rPaMEntries, nNode, nContent, rPaM,
false,
true);
222 static void DumpEntries(std::vector<MarkEntry>* pEntries)
224 for (MarkEntry& aEntry : *pEntries)
230 void ContentIdxStoreImpl::SaveBkmks(
SwDoc& rDoc,
sal_uLong nNode, sal_Int32 nContent)
239 const ::sw::mark::IMark* pBkmk = *ppBkmk;
240 bool bMarkPosEqual =
false;
241 if(pBkmk->GetMarkPos().nNode.GetIndex() == nNode
242 && pBkmk->GetMarkPos().nContent.GetIndex() <= nContent)
244 if(pBkmk->GetMarkPos().nContent.GetIndex() < nContent)
246 const MarkEntry aEntry = {
static_cast<tools::Long>(ppBkmk - pMarkAccess->
getAllMarksBegin()),
false, pBkmk->GetMarkPos().nContent.GetIndex() };
247 m_aBkmkEntries.push_back(aEntry);
250 bMarkPosEqual =
true;
252 if(pBkmk->IsExpanded()
253 && pBkmk->GetOtherMarkPos().nNode.GetIndex() == nNode
254 && pBkmk->GetOtherMarkPos().nContent.GetIndex() <= nContent)
258 const MarkEntry aEntry = {
static_cast<tools::Long>(ppBkmk - pMarkAccess->
getAllMarksBegin()),
false, pBkmk->GetMarkPos().nContent.GetIndex() };
259 m_aBkmkEntries.push_back(aEntry);
261 const MarkEntry aEntry = {
static_cast<tools::Long>(ppBkmk - pMarkAccess->
getAllMarksBegin()),
true, pBkmk->GetOtherMarkPos().nContent.GetIndex() };
262 m_aBkmkEntries.push_back(aEntry);
267 void ContentIdxStoreImpl::RestoreBkmks(
SwDoc& rDoc, updater_t
const & rUpdater)
270 for (
const MarkEntry& aEntry : m_aBkmkEntries)
274 SwPosition aNewPos(GetRightMarkPos(pMark, aEntry.m_bOther));
275 rUpdater(aNewPos, aEntry.m_nContent);
276 SetRightMarkPos(pMark, aEntry.m_bOther, &aNewPos);
279 if (!m_aBkmkEntries.empty())
286 void ContentIdxStoreImpl::SaveRedlines(
SwDoc& rDoc,
sal_uLong nNode, sal_Int32 nContent)
292 int nPointPos = lcl_RelativePosition( *pRdl->GetPoint(), nNode, nContent );
293 int nMarkPos = pRdl->HasMark() ? lcl_RelativePosition( *pRdl->GetMark(), nNode, nContent ) :
298 if( nPointPos == BEFORE_SAME_NODE ||
299 ( nPointPos == SAME_POSITION && nMarkPos < SAME_POSITION ) )
301 const MarkEntry aEntry = { nIdx,
false, pRdl->GetPoint()->nContent.GetIndex() };
302 m_aRedlineEntries.push_back(aEntry);
304 if( pRdl->HasMark() && ( nMarkPos == BEFORE_SAME_NODE ||
305 ( nMarkPos == SAME_POSITION && nPointPos < SAME_POSITION ) ) )
307 const MarkEntry aEntry = { nIdx,
true, pRdl->GetMark()->nContent.GetIndex() };
308 m_aRedlineEntries.push_back(aEntry);
314 void ContentIdxStoreImpl::RestoreRedlines(
SwDoc& rDoc, updater_t
const & rUpdater)
317 for (
const MarkEntry& aEntry : m_aRedlineEntries)
320 ? rRedlTable[ aEntry.m_nIdx ]->GetMark()
321 : rRedlTable[ aEntry.m_nIdx ]->GetPoint();
322 rUpdater(*pPos, aEntry.m_nContent);
326 void ContentIdxStoreImpl::SaveFlys(
SwDoc& rDoc,
sal_uLong nNode, sal_Int32 nContent,
bool bSaveFlySplit)
340 MarkEntry aSave = { 0,
false, 0 };
348 ( RndStdIds::FLY_AT_PARA == rAnchor.
GetAnchorId() ||
349 RndStdIds::FLY_AT_CHAR == rAnchor.
GetAnchorId() ) )
352 aSave.m_bOther =
false;
354 if ( RndStdIds::FLY_AT_CHAR == rAnchor.
GetAnchorId() )
356 if( nContent <= aSave.m_nContent )
359 aSave.m_bOther =
true;
365 m_aFlyEntries.push_back(aSave);
372 void ContentIdxStoreImpl::RestoreFlys(
SwDoc& rDoc, updater_t
const & rUpdater,
bool bAuto)
375 for (
const MarkEntry& aEntry : m_aFlyEntries)
385 rUpdater(aNewPos, aEntry.m_nContent);
386 if ( RndStdIds::FLY_AT_CHAR != rFlyAnchor.
GetAnchorId() )
388 aNewPos.nContent.Assign(
nullptr, 0 );
390 aNew.SetAnchor( &aNewPos );
403 void ContentIdxStoreImpl::SaveUnoCursors(
SwDoc& rDoc,
sal_uLong nNode, sal_Int32 nContent)
408 auto pUnoCursor(pWeakUnoCursor.lock());
413 lcl_ChkUnoCrsrPaMBoth(m_aUnoCursorEntries, nNode, nContent, rPaM);
416 if( pUnoTableCursor )
420 lcl_ChkUnoCrsrPaMBoth(m_aUnoCursorEntries, nNode, nContent, rPaM);
426 void ContentIdxStoreImpl::RestoreUnoCursors(updater_t
const & rUpdater)
428 for (
const PaMEntry& aEntry : m_aUnoCursorEntries)
430 rUpdater(aEntry.m_pPaM->GetBound(!aEntry.m_isMark), aEntry.m_nContent);
434 void ContentIdxStoreImpl::SaveShellCursors(
SwDoc& rDoc,
sal_uLong nNode, sal_Int32 nContent)
441 if(
auto pCursorShell = dynamic_cast<SwCursorShell *>(&rCurShell) )
443 SwPaM *_pStackCursor = pCursorShell->GetStackCursor();
447 lcl_ChkPaMBoth( m_aShellCursorEntries, nNode, nContent, *_pStackCursor);
450 _pStackCursor = _pStackCursor->
GetNext();
451 if (_pStackCursor == pCursorShell->GetStackCursor())
457 lcl_ChkPaMBoth( m_aShellCursorEntries, nNode, nContent, rPaM);
463 void ContentIdxStoreImpl::RestoreShellCursors(updater_t
const & rUpdater)
465 for (
const PaMEntry& aEntry : m_aShellCursorEntries)
467 rUpdater(aEntry.m_pPaM->GetBound(aEntry.m_isMark), aEntry.m_nContent);
474 return std::make_shared<ContentIdxStoreImpl>();
Base class of the Writer layout elements.
Represents the visualization of a paragraph.
const SwSortedObjs * GetDrawObjs() const
Marks a position in the document model.
virtual const SwRootFrame * GetCurrentLayout() const =0
wrapper iterator: wraps iterator of implementation while hiding MarkBase class; only IMark instances ...
SwContentFrame * getLayoutFrame(const SwRootFrame *, const SwPosition *pPos=nullptr, std::pair< Point, bool > const *pViewPosAndCalcFrame=nullptr) const
Provides access to the marks of a document.
virtual const SwPosition & GetMarkPos() const =0
virtual void assureSortedMarkContainers() const =0
SwPosition & GetBound(bool bOne=true)
IDocumentMarkAccess * getIDocumentMarkAccess()
const SwFrameFormats * GetSpzFrameFormats() const
void cleanupUnoCursorTable() const
sal_uLong GetIndex() const
virtual const_iterator_t getAllMarksBegin() const =0
returns a STL-like random access iterator to the begin of the sequence of marks.
PaM is Point and Mark: a selection of the document model.
virtual const_iterator_t getAllMarksEnd() const =0
returns a STL-like random access iterator to the end of the sequence of marks.
SwIndex & Assign(SwIndexReg *, sal_Int32)
SwEditShell const * GetEditShell() const
std::vector< std::weak_ptr< SwUnoCursor > > mvUnoCursorTable
Takes care of storing relevant attributes of an SwTextNode before split, then restore them on the new...
SwContentNode * GetContentNode()
ring_container GetRingContainer()
IDocumentLayoutAccess const & getIDocumentLayoutAccess() const
virtual void Save(SwDoc &rDoc, sal_uLong nNode, sal_Int32 nContent, bool bSaveFlySplit=false)=0
IDocumentRedlineAccess const & getIDocumentRedlineAccess() const
virtual void Restore(SwDoc &rDoc, sal_uLong nNode, sal_Int32 nOffset=0, bool bAuto=false, RestoreMode=RestoreMode::All)=0
static std::shared_ptr< ContentIdxStore > Create()
#define SAL_INFO(area, stream)
sal_Int32 GetIndex() const
constexpr TypedWhichId< SwDrawFrameFormat > RES_DRAWFRMFMT(157)
constexpr TypedWhichId< SwFlyFrameFormat > RES_FLYFRMFMT(154)
virtual void CallSwClientNotify(const SfxHint &rHint) const override
virtual const SwRedlineTable & GetRedlineTable() const =0
std::vector<::sw::mark::MarkBase * >::const_iterator const & get() const
virtual const SwPosition & GetOtherMarkPos() const =0
Base class of the Writer document model elements.