LibreOffice Module sw (master)  1
doctxm.cxx
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  * Licensed to the Apache Software Foundation (ASF) under one or more
12  * contributor license agreements. See the NOTICE file distributed
13  * with this work for additional information regarding copyright
14  * ownership. The ASF licenses this file to you under the Apache
15  * License, Version 2.0 (the "License"); you may not use this file
16  * except in compliance with the License. You may obtain a copy of
17  * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #include <limits.h>
21 #include <hintids.hxx>
23 #include <comphelper/classids.hxx>
24 #include <docsh.hxx>
25 #include <ndole.hxx>
26 #include <txttxmrk.hxx>
27 #include <fmtpdsc.hxx>
28 #include <frmatr.hxx>
29 #include <pagedesc.hxx>
30 #include <doc.hxx>
31 #include <IDocumentUndoRedo.hxx>
35 #include <IDocumentState.hxx>
38 #include <pagefrm.hxx>
39 #include <ndtxt.hxx>
40 #include <swtable.hxx>
41 #include <doctxm.hxx>
42 #include <txmsrt.hxx>
43 #include <rolbck.hxx>
44 #include <poolfmt.hxx>
45 #include <txtfrm.hxx>
46 #include <rootfrm.hxx>
47 #include <UndoAttribute.hxx>
48 #include <UndoSection.hxx>
49 #include <swundo.hxx>
50 #include <mdiexp.hxx>
51 #include <docary.hxx>
52 #include <charfmt.hxx>
53 #include <fchrfmt.hxx>
54 #include <fldbas.hxx>
55 #include <fmtfld.hxx>
56 #include <txtfld.hxx>
57 #include <expfld.hxx>
58 #include <mvsave.hxx>
59 #include <node2lay.hxx>
60 #include <SwStyleNameMapper.hxx>
61 #include <breakit.hxx>
62 #include <scriptinfo.hxx>
63 #include <calbck.hxx>
64 #include <ToxTextGenerator.hxx>
66 #include <frameformats.hxx>
67 #include <tools/datetimeutils.hxx>
68 #include <tools/globname.hxx>
69 #include <com/sun/star/embed/XEmbeddedObject.hpp>
70 #include <o3tl/safeint.hxx>
71 
72 #include <memory>
73 
74 using namespace ::com::sun::star;
75 
76 template<typename T, typename... Args> static
77 typename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T>>::type
78 MakeSwTOXSortTabBase(SwRootFrame const*const pLayout, Args&& ... args)
79 {
80  std::unique_ptr<T> pRet(new T(std::forward<Args>(args)...));
81  pRet->InitText(pLayout); // ensure it's expanded with the layout
82  return pRet;
83 }
84 
85 void SwDoc::GetTOIKeys(SwTOIKeyType eTyp, std::vector<OUString>& rArr,
86  SwRootFrame const& rLayout) const
87 {
88  rArr.clear();
89 
90  // Look up all Primary and Secondary via the Pool
91  for (const SfxPoolItem* pPoolItem : GetAttrPool().GetItemSurrogates(RES_TXTATR_TOXMARK))
92  {
93  const SwTOXMark* pItem = dynamic_cast<const SwTOXMark*>(pPoolItem);
94  if( !pItem )
95  continue;
96  const SwTOXType* pTOXType = pItem->GetTOXType();
97  if ( !pTOXType || pTOXType->GetType()!=TOX_INDEX )
98  continue;
99  const SwTextTOXMark* pMark = pItem->GetTextTOXMark();
100  if ( pMark && pMark->GetpTextNd() &&
101  pMark->GetpTextNd()->GetNodes().IsDocNodes() &&
102  (!rLayout.IsHideRedlines()
103  || !sw::IsMarkHintHidden(rLayout, *pMark->GetpTextNd(), *pMark)))
104  {
105  const OUString sStr = TOI_PRIMARY == eTyp
106  ? pItem->GetPrimaryKey()
107  : pItem->GetSecondaryKey();
108 
109  if( !sStr.isEmpty() )
110  rArr.push_back( sStr );
111  }
112  }
113 }
114 
116 sal_uInt16 SwDoc::GetCurTOXMark( const SwPosition& rPos,
117  SwTOXMarks& rArr )
118 {
119  // search on Position rPos for all SwTOXMarks
120  SwTextNode *const pTextNd = rPos.nNode.GetNode().GetTextNode();
121  if( !pTextNd || !pTextNd->GetpSwpHints() )
122  return 0;
123 
124  const SwpHints & rHts = *pTextNd->GetpSwpHints();
125  sal_Int32 nSttIdx;
126  const sal_Int32 *pEndIdx;
127 
128  const sal_Int32 nCurrentPos = rPos.nContent.GetIndex();
129 
130  for( size_t n = 0; n < rHts.Count(); ++n )
131  {
132  const SwTextAttr* pHt = rHts.Get(n);
133  if( RES_TXTATR_TOXMARK != pHt->Which() )
134  continue;
135  if( ( nSttIdx = pHt->GetStart() ) < nCurrentPos )
136  {
137  // also check the end
138  pEndIdx = pHt->End();
139  if( nullptr == pEndIdx || *pEndIdx <= nCurrentPos )
140  continue; // keep searching
141  }
142  else if( nSttIdx > nCurrentPos )
143  // If Hint's Start is greater than rPos, break, because
144  // the attributes are sorted by Start!
145  break;
146 
147  SwTOXMark* pTMark = const_cast<SwTOXMark*>(&pHt->GetTOXMark());
148  rArr.push_back( pTMark );
149  }
150  return rArr.size();
151 }
152 
154 void SwDoc::DeleteTOXMark( const SwTOXMark* pTOXMark )
155 {
156  const SwTextTOXMark* pTextTOXMark = pTOXMark->GetTextTOXMark();
157  assert(pTextTOXMark);
158 
159  SwTextNode& rTextNd = const_cast<SwTextNode&>(pTextTOXMark->GetTextNode());
160  assert(rTextNd.GetpSwpHints());
161 
162  if (pTextTOXMark->HasDummyChar())
163  {
164  // tdf#106377 don't use SwUndoResetAttr, it uses NOTXTATRCHR
165  SwPaM tmp(rTextNd, pTextTOXMark->GetStart(),
166  rTextNd, pTextTOXMark->GetStart()+1);
167  assert(rTextNd.GetText()[pTextTOXMark->GetStart()] == CH_TXTATR_INWORD);
169  }
170  else
171  {
172  std::unique_ptr<SwRegHistory> aRHst;
173  if (GetIDocumentUndoRedo().DoesUndo())
174  {
175  // save attributes for Undo
176  SwUndoResetAttr* pUndo = new SwUndoResetAttr(
177  SwPosition( rTextNd, SwIndex( &rTextNd, pTextTOXMark->GetStart() ) ),
179  GetIDocumentUndoRedo().AppendUndo( std::unique_ptr<SwUndo>(pUndo) );
180 
181  aRHst.reset(new SwRegHistory(rTextNd, &pUndo->GetHistory()));
182  rTextNd.GetpSwpHints()->Register(aRHst.get());
183  }
184 
185  rTextNd.DeleteAttribute( const_cast<SwTextTOXMark*>(pTextTOXMark) );
186 
187  if (GetIDocumentUndoRedo().DoesUndo())
188  {
189  if( rTextNd.GetpSwpHints() )
190  rTextNd.GetpSwpHints()->DeRegister();
191  }
192  }
193 
195 }
196 
197 namespace {
198 
200 class CompareNodeContent
201 {
202  sal_uLong m_nNode;
203  sal_Int32 m_nContent;
204 public:
205  CompareNodeContent( sal_uLong nNd, sal_Int32 nCnt )
206  : m_nNode( nNd ), m_nContent( nCnt ) {}
207 
208  bool operator==( const CompareNodeContent& rCmp ) const
209  { return m_nNode == rCmp.m_nNode && m_nContent == rCmp.m_nContent; }
210  bool operator!=( const CompareNodeContent& rCmp ) const
211  { return m_nNode != rCmp.m_nNode || m_nContent != rCmp.m_nContent; }
212  bool operator< ( const CompareNodeContent& rCmp ) const
213  { return m_nNode < rCmp.m_nNode ||
214  ( m_nNode == rCmp.m_nNode && m_nContent < rCmp.m_nContent); }
215  bool operator<=( const CompareNodeContent& rCmp ) const
216  { return m_nNode < rCmp.m_nNode ||
217  ( m_nNode == rCmp.m_nNode && m_nContent <= rCmp.m_nContent); }
218  bool operator> ( const CompareNodeContent& rCmp ) const
219  { return m_nNode > rCmp.m_nNode ||
220  ( m_nNode == rCmp.m_nNode && m_nContent > rCmp.m_nContent); }
221  bool operator>=( const CompareNodeContent& rCmp ) const
222  { return m_nNode > rCmp.m_nNode ||
223  ( m_nNode == rCmp.m_nNode && m_nContent >= rCmp.m_nContent); }
224 };
225 
226 }
227 
228 const SwTOXMark& SwDoc::GotoTOXMark( const SwTOXMark& rCurTOXMark,
229  SwTOXSearch eDir, bool bInReadOnly )
230 {
231  const SwTextTOXMark* pMark = rCurTOXMark.GetTextTOXMark();
232  OSL_ENSURE(pMark, "pMark==0 invalid TextTOXMark");
233 
234  const SwTextNode *pTOXSrc = pMark->GetpTextNd();
235 
236  CompareNodeContent aAbsIdx( pTOXSrc->GetIndex(), pMark->GetStart() );
237  CompareNodeContent aPrevPos( 0, 0 );
238  CompareNodeContent aNextPos( ULONG_MAX, SAL_MAX_INT32 );
239  CompareNodeContent aMax( 0, 0 );
240  CompareNodeContent aMin( ULONG_MAX, SAL_MAX_INT32 );
241 
242  const SwTOXMark* pNew = nullptr;
243  const SwTOXMark* pMax = &rCurTOXMark;
244  const SwTOXMark* pMin = &rCurTOXMark;
245 
246  const SwTOXType* pType = rCurTOXMark.GetTOXType();
247  SwTOXMarks aMarks;
248  pType->CollectTextMarks(aMarks);
249 
250  for(SwTOXMark* pTOXMark : aMarks)
251  {
252  if ( pTOXMark == &rCurTOXMark )
253  continue;
254 
255  pMark = pTOXMark->GetTextTOXMark();
256  if (!pMark)
257  continue;
258 
259  pTOXSrc = pMark->GetpTextNd();
260  if (!pTOXSrc)
261  continue;
262 
263  Point aPt;
264  std::pair<Point, bool> const tmp(aPt, false);
265  const SwContentFrame* pCFrame = pTOXSrc->getLayoutFrame(
266  getIDocumentLayoutAccess().GetCurrentLayout(), nullptr, &tmp);
267  if (!pCFrame)
268  continue;
269 
270  if ( bInReadOnly || !pCFrame->IsProtected() )
271  {
272  CompareNodeContent aAbsNew( pTOXSrc->GetIndex(), pMark->GetStart() );
273  switch( eDir )
274  {
275  // The following (a bit more complicated) statements make it
276  // possible to also travel across Entries on the same (!)
277  // position. If someone has time, please feel free to optimize.
278  case TOX_SAME_PRV:
279  if (pTOXMark->GetText(nullptr) != rCurTOXMark.GetText(nullptr))
280  break;
281  [[fallthrough]];
282  case TOX_PRV:
283  if ( (aAbsNew < aAbsIdx && aAbsNew > aPrevPos) ||
284  (aAbsIdx == aAbsNew &&
285  (reinterpret_cast<sal_uLong>(&rCurTOXMark) > reinterpret_cast<sal_uLong>(pTOXMark) &&
286  (!pNew || aPrevPos < aAbsIdx || reinterpret_cast<sal_uLong>(pNew) < reinterpret_cast<sal_uLong>(pTOXMark) ) )) ||
287  (aPrevPos == aAbsNew && aAbsIdx != aAbsNew &&
288  reinterpret_cast<sal_uLong>(pTOXMark) > reinterpret_cast<sal_uLong>(pNew)) )
289  {
290  pNew = pTOXMark;
291  aPrevPos = aAbsNew;
292  if ( aAbsNew >= aMax )
293  {
294  aMax = aAbsNew;
295  pMax = pTOXMark;
296  }
297  }
298  break;
299 
300  case TOX_SAME_NXT:
301  if (pTOXMark->GetText(nullptr) != rCurTOXMark.GetText(nullptr))
302  break;
303  [[fallthrough]];
304  case TOX_NXT:
305  if ( (aAbsNew > aAbsIdx && aAbsNew < aNextPos) ||
306  (aAbsIdx == aAbsNew &&
307  (reinterpret_cast<sal_uLong>(&rCurTOXMark) < reinterpret_cast<sal_uLong>(pTOXMark) &&
308  (!pNew || aNextPos > aAbsIdx || reinterpret_cast<sal_uLong>(pNew) > reinterpret_cast<sal_uLong>(pTOXMark)) )) ||
309  (aNextPos == aAbsNew && aAbsIdx != aAbsNew &&
310  reinterpret_cast<sal_uLong>(pTOXMark) < reinterpret_cast<sal_uLong>(pNew)) )
311  {
312  pNew = pTOXMark;
313  aNextPos = aAbsNew;
314  if ( aAbsNew <= aMin )
315  {
316  aMin = aAbsNew;
317  pMin = pTOXMark;
318  }
319  }
320  break;
321  }
322  }
323  }
324 
325  // We couldn't find a successor
326  // Use minimum or maximum
327  if(!pNew)
328  {
329  switch(eDir)
330  {
331  case TOX_PRV:
332  case TOX_SAME_PRV:
333  pNew = pMax;
334  break;
335  case TOX_NXT:
336  case TOX_SAME_NXT:
337  pNew = pMin;
338  break;
339  default:
340  pNew = &rCurTOXMark;
341  }
342  }
343  return *pNew;
344 }
345 
347  const SwTOXBase& rTOX,
348  const SfxItemSet* pSet,
349  bool bExpand,
350  SwRootFrame const*const pLayout)
351 {
352  SwPaM aPam( rPos );
353  return InsertTableOf( aPam, rTOX, pSet, bExpand, pLayout );
354 }
355 
357  const SwTOXBase& rTOX,
358  const SfxItemSet* pSet,
359  bool bExpand,
360  SwRootFrame const*const pLayout )
361 {
362  assert(!bExpand || pLayout != nullptr);
364 
365  OUString sSectNm = GetUniqueTOXBaseName( *rTOX.GetTOXType(), rTOX.GetTOXName() );
366  SwSectionData aSectionData( SectionType::ToxContent, sSectNm );
367 
368  std::pair<SwTOXBase const*, sw::RedlineMode> const tmp(&rTOX,
369  pLayout && pLayout->IsHideRedlines()
372  SwTOXBaseSection *const pNewSection = dynamic_cast<SwTOXBaseSection *>(
373  InsertSwSection(aPam, aSectionData, & tmp, pSet, false));
374  if (pNewSection)
375  {
376  SwSectionNode *const pSectNd = pNewSection->GetFormat()->GetSectionNode();
377  pNewSection->SetTOXName(sSectNm); // rTOX may have had no name...
378 
379  if( bExpand )
380  {
381  // add value for 2nd parameter = true to
382  // indicate, that a creation of a new table of content has to be performed.
383  // Value of 1st parameter = default value.
384  pNewSection->Update( nullptr, pLayout, true );
385  }
386  else if( rTOX.GetTitle().getLength()==1 && IsInReading() )
387  // insert title of TOX
388  {
389  // then insert the headline section
390  SwNodeIndex aIdx( *pSectNd, +1 );
391 
392  SwTextNode* pHeadNd = GetNodes().MakeTextNode( aIdx,
393  getIDocumentStylePoolAccess().GetTextCollFromPool( RES_POOLCOLL_STANDARD ) );
394 
395  SwSectionData headerData( SectionType::ToxHeader, pNewSection->GetTOXName()+"_Head" );
396 
397  SwNodeIndex aStt( *pHeadNd ); --aIdx;
398  SwSectionFormat* pSectFormat = MakeSectionFormat();
400  aStt, *pSectFormat, headerData, nullptr, &aIdx, true, false);
401  }
402  }
403 
405 
406  return pNewSection;
407 }
408 
410  const SwTOXBase& rTOX,
411  const SfxItemSet* pSet )
412 {
413  // check for recursive TOX
414  SwNode* pNd = GetNodes()[ nSttNd ];
415  SwSectionNode* pSectNd = pNd->FindSectionNode();
416  while( pSectNd )
417  {
418  SectionType eT = pSectNd->GetSection().GetType();
420  return;
421  pSectNd = pSectNd->StartOfSectionNode()->FindSectionNode();
422  }
423 
424  const OUString sSectNm = GetUniqueTOXBaseName(*rTOX.GetTOXType(), rTOX.GetTOXName());
425 
426  SwSectionData aSectionData( SectionType::ToxContent, sSectNm );
427 
428  SwNodeIndex aStt( GetNodes(), nSttNd ), aEnd( GetNodes(), nEndNd );
429  SwSectionFormat* pFormat = MakeSectionFormat();
430  if(pSet)
431  pFormat->SetFormatAttr(*pSet);
432 
433  SwSectionNode *const pNewSectionNode =
434  GetNodes().InsertTextSection(aStt, *pFormat, aSectionData, &rTOX, &aEnd);
435  if (!pNewSectionNode)
436  {
437  DelSectionFormat( pFormat );
438  return;
439  }
440 
441  SwTOXBaseSection *const pNewSection(
442  dynamic_cast<SwTOXBaseSection*>(& pNewSectionNode->GetSection()));
443  if (pNewSection)
444  pNewSection->SetTOXName(sSectNm); // rTOX may have had no name...
445 }
446 
449 {
450  SwNode& rNd = rPos.nNode.GetNode();
451  SwSectionNode* pSectNd = rNd.FindSectionNode();
452  while( pSectNd )
453  {
454  SectionType eT = pSectNd->GetSection().GetType();
455  if( SectionType::ToxContent == eT )
456  {
457  OSL_ENSURE( dynamic_cast< const SwTOXBaseSection *>( &pSectNd->GetSection()) != nullptr,
458  "no TOXBaseSection!" );
459  SwTOXBaseSection& rTOXSect = static_cast<SwTOXBaseSection&>(
460  pSectNd->GetSection());
461  return &rTOXSect;
462  }
463  pSectNd = pSectNd->StartOfSectionNode()->FindSectionNode();
464  }
465  return nullptr;
466 }
467 
469 {
470  OSL_ENSURE( dynamic_cast<const SwTOXBaseSection*>( &rTOXBase) != nullptr, "no TOXBaseSection!" );
471  const SwTOXBaseSection& rTOXSect = static_cast<const SwTOXBaseSection&>(rTOXBase);
472  SwSectionFormat const * pFormat = rTOXSect.GetFormat();
473  OSL_ENSURE( pFormat, "invalid TOXBaseSection!" );
474  return pFormat->GetAttrSet();
475 }
476 
477 const SwTOXBase* SwDoc::GetDefaultTOXBase( TOXTypes eTyp, bool bCreate )
478 {
479  std::unique_ptr<SwTOXBase>* prBase = nullptr;
480  switch(eTyp)
481  {
482  case TOX_CONTENT: prBase = &mpDefTOXBases->pContBase; break;
483  case TOX_INDEX: prBase = &mpDefTOXBases->pIdxBase; break;
484  case TOX_USER: prBase = &mpDefTOXBases->pUserBase; break;
485  case TOX_TABLES: prBase = &mpDefTOXBases->pTableBase; break;
486  case TOX_OBJECTS: prBase = &mpDefTOXBases->pObjBase; break;
487  case TOX_ILLUSTRATIONS: prBase = &mpDefTOXBases->pIllBase; break;
488  case TOX_AUTHORITIES: prBase = &mpDefTOXBases->pAuthBase; break;
489  case TOX_BIBLIOGRAPHY: prBase = &mpDefTOXBases->pBiblioBase; break;
490  case TOX_CITATION: break;
491  }
492  if (!prBase)
493  return nullptr;
494  if(!(*prBase) && bCreate)
495  {
496  SwForm aForm(eTyp);
497  const SwTOXType* pType = GetTOXType(eTyp, 0);
498  prBase->reset(new SwTOXBase(pType, aForm, SwTOXElement::NONE, pType->GetTypeName()));
499  }
500  return prBase->get();
501 }
502 
504 {
505  std::unique_ptr<SwTOXBase>* prBase = nullptr;
506  switch(rBase.GetType())
507  {
508  case TOX_CONTENT: prBase = &mpDefTOXBases->pContBase; break;
509  case TOX_INDEX: prBase = &mpDefTOXBases->pIdxBase; break;
510  case TOX_USER: prBase = &mpDefTOXBases->pUserBase; break;
511  case TOX_TABLES: prBase = &mpDefTOXBases->pTableBase; break;
512  case TOX_OBJECTS: prBase = &mpDefTOXBases->pObjBase; break;
513  case TOX_ILLUSTRATIONS: prBase = &mpDefTOXBases->pIllBase; break;
514  case TOX_AUTHORITIES: prBase = &mpDefTOXBases->pAuthBase; break;
515  case TOX_BIBLIOGRAPHY: prBase = &mpDefTOXBases->pBiblioBase; break;
516  case TOX_CITATION: break;
517  }
518  if (!prBase)
519  return;
520  prBase->reset(new SwTOXBase(rBase));
521 }
522 
524 bool SwDoc::DeleteTOX( const SwTOXBase& rTOXBase, bool bDelNodes )
525 {
526  // We only delete the TOX, not the Nodes
527  bool bRet = false;
528  OSL_ENSURE( dynamic_cast<const SwTOXBaseSection*>( &rTOXBase) != nullptr, "no TOXBaseSection!" );
529 
530  const SwTOXBaseSection& rTOXSect = static_cast<const SwTOXBaseSection&>(rTOXBase);
531  SwSectionFormat const * pFormat = rTOXSect.GetFormat();
532  /* Save the start node of the TOX' section. */
533  SwSectionNode const * pMyNode = pFormat ? pFormat->GetSectionNode() : nullptr;
534  if (pMyNode)
535  {
537 
538  /* Save start node of section's surrounding. */
539  SwNode const * pStartNd = pMyNode->StartOfSectionNode();
540 
541  /* Look for the point where to move the cursors in the area to
542  delete to. This is done by first searching forward from the
543  end of the TOX' section. If no content node is found behind
544  the TOX one is searched before it. If this is not
545  successful, too, insert new text node behind the end of
546  the TOX' section. The cursors from the TOX' section will be
547  moved to the content node found or the new text node. */
548 
549  /* Set PaM to end of TOX' section and search following content node.
550  aSearchPam will contain the point where to move the cursors
551  to. */
552  SwPaM aSearchPam(*pMyNode->EndOfSectionNode());
553  SwPosition aEndPos(*pStartNd->EndOfSectionNode());
554  if (! aSearchPam.Move() /* no content node found */
555  || *aSearchPam.GetPoint() >= aEndPos /* content node found
556  outside surrounding */
557  )
558  {
559  /* Set PaM to beginning of TOX' section and search previous
560  content node */
561  SwPaM aTmpPam(*pMyNode);
562  aSearchPam = aTmpPam;
563  SwPosition aStartPos(*pStartNd);
564 
565  if ( ! aSearchPam.Move(fnMoveBackward) /* no content node found */
566  || *aSearchPam.GetPoint() <= aStartPos /* content node
567  found outside
568  surrounding */
569  )
570  {
571  /* There is no content node in the surrounding of
572  TOX'. Append text node behind TOX' section. */
573 
574  SwPosition aInsPos(*pMyNode->EndOfSectionNode());
576 
577  SwPaM aTmpPam1(aInsPos);
578  aSearchPam = aTmpPam1;
579  }
580  }
581 
582  /* PaM containing the TOX. */
583  SwPaM aPam(*pMyNode->EndOfSectionNode(), *pMyNode);
584 
585  /* Move cursors contained in TOX to the above calculated point. */
586  PaMCorrAbs(aPam, *aSearchPam.GetPoint());
587 
588  if( !bDelNodes )
589  {
590  SwSections aArr( 0 );
591  pFormat->GetChildSections( aArr, SectionSort::Not, false );
592  for( const auto pSect : aArr )
593  {
594  if( SectionType::ToxHeader == pSect->GetType() )
595  {
596  DelSectionFormat( pSect->GetFormat(), bDelNodes );
597  }
598  }
599  }
600 
601  DelSectionFormat( const_cast<SwSectionFormat *>(pFormat), bDelNodes );
602 
604  bRet = true;
605  }
606 
607  return bRet;
608 }
609 
611 sal_uInt16 SwDoc::GetTOXTypeCount(TOXTypes eTyp) const
612 {
613  sal_uInt16 nCnt = 0;
614  for( auto const & pTOXType : *mpTOXTypes )
615  if( eTyp == pTOXType->GetType() )
616  ++nCnt;
617  return nCnt;
618 }
619 
620 const SwTOXType* SwDoc::GetTOXType( TOXTypes eTyp, sal_uInt16 nId ) const
621 {
622  sal_uInt16 nCnt = 0;
623  for( auto const & pTOXType : *mpTOXTypes )
624  if( eTyp == pTOXType->GetType() && nCnt++ == nId )
625  return pTOXType.get();
626  return nullptr;
627 }
628 
630 {
631  SwTOXType * pNew = new SwTOXType( rTyp );
632  mpTOXTypes->emplace_back( pNew );
633  return pNew;
634 }
635 
636 OUString SwDoc::GetUniqueTOXBaseName( const SwTOXType& rType,
637  const OUString& sChkStr ) const
638 {
639  if( IsInMailMerge())
640  {
641  OUString newName = "MailMergeTOX"
642  + OStringToOUString( DateTimeToOString( DateTime( DateTime::SYSTEM )), RTL_TEXTENCODING_ASCII_US )
643  + OUString::number( mpSectionFormatTable->size() + 1 );
644  if( !sChkStr.isEmpty())
645  newName += sChkStr;
646  return newName;
647  }
648 
649  bool bUseChkStr = !sChkStr.isEmpty();
650  const OUString& aName( rType.GetTypeName() );
651  const sal_Int32 nNmLen = aName.getLength();
652 
654  const SwSectionFormats::size_type nFlagSize = ( mpSectionFormatTable->size() / 8 ) +2;
655  std::unique_ptr<sal_uInt8[]> pSetFlags(new sal_uInt8[ nFlagSize ]);
656  memset( pSetFlags.get(), 0, nFlagSize );
657 
658  for( auto pSectionFormat : *mpSectionFormatTable )
659  {
660  const SwSectionNode *pSectNd = pSectionFormat->GetSectionNode();
661  if ( !pSectNd )
662  continue;
663 
664  const SwSection& rSect = pSectNd->GetSection();
665  if (rSect.GetType()==SectionType::ToxContent)
666  {
667  const OUString& rNm = rSect.GetSectionName();
668  if ( rNm.startsWith(aName) )
669  {
670  // Calculate number and set the Flag
671  nNum = rNm.copy( nNmLen ).toInt32();
672  if( nNum-- && nNum < mpSectionFormatTable->size() )
673  pSetFlags[ nNum / 8 ] |= (0x01 << ( nNum & 0x07 ));
674  }
675  if ( bUseChkStr && sChkStr==rNm )
676  bUseChkStr = false;
677  }
678  }
679 
680  if( !bUseChkStr )
681  {
682  // All Numbers have been flagged accordingly, so get the right Number
683  nNum = mpSectionFormatTable->size();
684  for( SwSectionFormats::size_type n = 0; n < nFlagSize; ++n )
685  {
686  sal_uInt8 nTmp = pSetFlags[ n ];
687  if( nTmp != 0xff )
688  {
689  // so get the Number
690  nNum = n * 8;
691  while( nTmp & 1 )
692  {
693  ++nNum;
694  nTmp >>= 1;
695  }
696  break;
697  }
698  }
699  }
700  if ( bUseChkStr )
701  return sChkStr;
702  return aName + OUString::number( ++nNum );
703 }
704 
705 bool SwDoc::SetTOXBaseName(const SwTOXBase& rTOXBase, const OUString& rName)
706 {
707  OSL_ENSURE( dynamic_cast<const SwTOXBaseSection*>( &rTOXBase) != nullptr,
708  "no TOXBaseSection!" );
709  SwTOXBaseSection* pTOX = const_cast<SwTOXBaseSection*>(static_cast<const SwTOXBaseSection*>(&rTOXBase));
710 
711  if (GetUniqueTOXBaseName(*rTOXBase.GetTOXType(), rName) == rName)
712  {
713  pTOX->SetTOXName(rName);
714  pTOX->SetSectionName(rName);
716  return true;
717  }
718  return false;
719 }
720 
721 static const SwTextNode* lcl_FindChapterNode( const SwNode& rNd,
722  SwRootFrame const*const pLayout, sal_uInt8 const nLvl = 0 )
723 {
724  const SwNode* pNd = &rNd;
725  if( pNd->GetNodes().GetEndOfExtras().GetIndex() > pNd->GetIndex() )
726  {
727  // then find the "Anchor" (Body) position
728  Point aPt;
729  SwNode2Layout aNode2Layout( *pNd, pNd->GetIndex() );
730  const SwFrame* pFrame = aNode2Layout.GetFrame( &aPt );
731 
732  if( pFrame )
733  {
734  SwPosition aPos( *pNd );
735  pNd = GetBodyTextNode( *pNd->GetDoc(), aPos, *pFrame );
736  OSL_ENSURE( pNd, "Where's the paragraph?" );
737  }
738  }
739  return pNd ? pNd->FindOutlineNodeOfLevel(nLvl, pLayout) : nullptr;
740 }
741 
742 // Table of contents class
744  : SwTOXBase( rBase )
745  , SwSection( SectionType::ToxContent, OUString(), rFormat )
746 {
747  SetProtect( rBase.IsProtected() );
749 }
750 
752 {
753 }
754 
756 {
757  bool bRet = false;
758  const SwSectionNode* pSectNd = GetFormat()->GetSectionNode();
759  if( pSectNd )
760  {
761  rPos.nNode = *pSectNd;
762  SwContentNode* pCNd = pSectNd->GetDoc()->GetNodes().GoNext( &rPos.nNode );
763  rPos.nContent.Assign( pCNd, 0 );
764  bRet = true;
765  }
766  return bRet;
767 }
768 
771  SwRootFrame const*const pLayout,
772  const bool _bNewTOX)
773 {
774  if (!GetFormat())
775  return;
776  SwSectionNode const*const pSectNd(GetFormat()->GetSectionNode());
777  if (nullptr == pSectNd ||
778  !pSectNd->GetNodes().IsDocNodes() ||
779  IsHiddenFlag() ||
780  (pLayout->IsHideRedlines() && pSectNd->GetRedlineMergeFlag() == SwNode::Merge::Hidden))
781  {
782  return;
783  }
784 
785  if ( !mbKeepExpression )
786  {
787  maMSTOCExpression.clear();
788  }
789 
790  SwDoc* pDoc = const_cast<SwDoc*>(pSectNd->GetDoc());
791 
792  assert(pDoc); //Where is the document?
793 
794  if (pAttr && GetFormat())
795  pDoc->ChgFormat(*GetFormat(), *pAttr);
796 
797  // determine default page description, which will be used by the content nodes,
798  // if no appropriate one is found.
799  const SwPageDesc* pDefaultPageDesc;
800  {
801  pDefaultPageDesc =
802  pSectNd->GetSection().GetFormat()->GetPageDesc().GetPageDesc();
803  if ( !_bNewTOX && !pDefaultPageDesc )
804  {
805  // determine page description of table-of-content
806  size_t nPgDescNdIdx = pSectNd->GetIndex() + 1;
807  size_t* pPgDescNdIdx = &nPgDescNdIdx;
808  pDefaultPageDesc = pSectNd->FindPageDesc( pPgDescNdIdx );
809  if ( nPgDescNdIdx < pSectNd->GetIndex() )
810  {
811  pDefaultPageDesc = nullptr;
812  }
813  }
814  // consider end node of content section in the node array.
815  if ( !pDefaultPageDesc &&
816  ( pSectNd->EndOfSectionNode()->GetIndex() <
817  (pSectNd->GetNodes().GetEndOfContent().GetIndex() - 1) )
818  )
819  {
820  // determine page description of content after table-of-content
821  SwNodeIndex aIdx( *(pSectNd->EndOfSectionNode()) );
822  const SwContentNode* pNdAfterTOX = pSectNd->GetNodes().GoNext( &aIdx );
823  const SwAttrSet& aNdAttrSet = pNdAfterTOX->GetSwAttrSet();
824  const SvxBreak eBreak = aNdAttrSet.GetBreak().GetBreak();
825  if ( eBreak != SvxBreak::PageBefore && eBreak != SvxBreak::PageBoth )
826  {
827  pDefaultPageDesc = pNdAfterTOX->FindPageDesc();
828  }
829  }
830  // consider start node of content section in the node array.
831  if ( !pDefaultPageDesc &&
832  ( pSectNd->GetIndex() >
833  (pSectNd->GetNodes().GetEndOfContent().StartOfSectionIndex() + 1) )
834  )
835  {
836  // determine page description of content before table-of-content
837  SwNodeIndex aIdx( *pSectNd );
838  pDefaultPageDesc =
839  SwNodes::GoPrevious( &aIdx )->FindPageDesc();
840 
841  }
842  if ( !pDefaultPageDesc )
843  {
844  // determine default page description
845  pDefaultPageDesc = &pDoc->GetPageDesc( 0 );
846  }
847  }
848 
849  pDoc->getIDocumentState().SetModified();
850 
851  // get current Language
853  TOX_INDEX == GetTOXType()->GetType() ?
855  GetSortAlgorithm() );
856 
857  m_aSortArr.clear();
858 
859  // find the first layout node for this TOX, if it only find the content
860  // in his own chapter
861  const SwTextNode* pOwnChapterNode = IsFromChapter()
862  ? ::lcl_FindChapterNode( *pSectNd, pLayout )
863  : nullptr;
864 
865  SwNode2LayoutSaveUpperFrames aN2L(*pSectNd);
866  const_cast<SwSectionNode*>(pSectNd)->DelFrames();
867 
868  // This would be a good time to update the Numbering
869  pDoc->UpdateNumRule();
870 
872  UpdateMarks( aIntl, pOwnChapterNode, pLayout );
873 
875  UpdateOutline( pOwnChapterNode, pLayout );
876 
878  UpdateTemplate( pOwnChapterNode, pLayout );
879 
882  UpdateContent( SwTOXElement::Ole, pOwnChapterNode, pLayout );
883 
886  UpdateTable( pOwnChapterNode, pLayout );
887 
890  UpdateContent( SwTOXElement::Graphic, pOwnChapterNode, pLayout );
891 
892  if( !GetSequenceName().isEmpty() && !IsFromObjectNames() &&
895  UpdateSequence( pOwnChapterNode, pLayout );
896 
898  UpdateContent( SwTOXElement::Frame, pOwnChapterNode, pLayout );
899 
901  UpdateAuthorities( aIntl, pLayout );
902 
903  // Insert AlphaDelimiters if needed (just for keywords)
904  if( TOX_INDEX == SwTOXBase::GetType() &&
906  InsertAlphaDelimiter( aIntl );
907 
908  // remove old content an insert one empty textnode (to hold the layout!)
909  SwTextNode* pFirstEmptyNd;
910 
911  SwUndoUpdateIndex * pUndo(nullptr);
912  {
913  pDoc->getIDocumentRedlineAccess().DeleteRedline( *pSectNd, true, RedlineType::Any );
914 
915  SwNodeIndex aSttIdx( *pSectNd, +1 );
916  SwNodeIndex aEndIdx( *pSectNd->EndOfSectionNode() );
917  pFirstEmptyNd = pDoc->GetNodes().MakeTextNode( aEndIdx,
919 
920  {
921  // Task 70995 - save and restore PageDesc and Break Attributes
922  SwNodeIndex aNxtIdx( aSttIdx );
923  const SwContentNode* pCNd = aNxtIdx.GetNode().GetContentNode();
924  if( !pCNd )
925  pCNd = pDoc->GetNodes().GoNext( &aNxtIdx );
926  assert(pCNd != pFirstEmptyNd);
927  assert(pCNd->GetIndex() < pFirstEmptyNd->GetIndex());
928  if( pCNd->HasSwAttrSet() )
929  {
930  SfxItemSet aBrkSet( pDoc->GetAttrPool(), aBreakSetRange );
931  aBrkSet.Put( *pCNd->GetpSwAttrSet() );
932  if( aBrkSet.Count() )
933  pFirstEmptyNd->SetAttr( aBrkSet );
934  }
935  }
936 
937  if (pDoc->GetIDocumentUndoRedo().DoesUndo())
938  {
939  // note: this will first append a SwUndoDelSection from the ctor...
940  pUndo = new SwUndoUpdateIndex(*this);
941  // tdf#123313 insert Undo *after* all CrossRefBookmark Undos have
942  // been inserted by the Update*() functions
943  pDoc->GetIDocumentUndoRedo().AppendUndo(std::unique_ptr<SwUndoUpdateIndex>(pUndo));
944  }
945  else
946  {
947  --aEndIdx;
948  SwPosition aPos( aEndIdx, SwIndex( pFirstEmptyNd, 0 ));
949  SwDoc::CorrAbs( aSttIdx, aEndIdx, aPos, true );
950 
951  // delete flys in whole range including start node which requires
952  // giving the node before start node as Mark parameter, hence -1.
953  // (flys must be deleted because the anchor nodes are removed)
954  DelFlyInRange( SwNodeIndex(aSttIdx, -1), aEndIdx );
955 
956  pDoc->GetNodes().Delete( aSttIdx, aEndIdx.GetIndex() - aSttIdx.GetIndex() );
957  }
958  }
959 
960  // insert title of TOX
961  if ( !GetTitle().isEmpty() )
962  {
963  // then insert the headline section
964  SwNodeIndex aIdx( *pSectNd, +1 );
965 
966  SwTextNode* pHeadNd = pDoc->GetNodes().MakeTextNode( aIdx,
968  pHeadNd->InsertText( GetTitle(), SwIndex( pHeadNd ) );
969 
970  SwSectionData headerData( SectionType::ToxHeader, GetTOXName()+"_Head" );
971 
972  SwNodeIndex aStt( *pHeadNd ); --aIdx;
973  SwSectionFormat* pSectFormat = pDoc->MakeSectionFormat();
974  pDoc->GetNodes().InsertTextSection(
975  aStt, *pSectFormat, headerData, nullptr, &aIdx, true, false);
976 
977  if (pUndo)
978  {
979  pUndo->TitleSectionInserted(*pSectFormat);
980  }
981  }
982 
983  // Sort the List of all TOC Marks and TOC Sections
984  std::vector<SwTextFormatColl*> aCollArr( GetTOXForm().GetFormMax(), nullptr );
985  SwNodeIndex aInsPos( *pFirstEmptyNd, 1 );
986  for( size_t nCnt = 0; nCnt < m_aSortArr.size(); ++nCnt )
987  {
988  ::SetProgressState( 0, pDoc->GetDocShell() );
989 
990  // Put the Text into the TOC
991  sal_uInt16 nLvl = m_aSortArr[ nCnt ]->GetLevel();
992  SwTextFormatColl* pColl = aCollArr[ nLvl ];
993  if( !pColl )
994  {
995  pColl = GetTextFormatColl( nLvl );
996  aCollArr[ nLvl ] = pColl;
997  }
998 
999  // Generate: Set dynamic TabStops
1000  SwTextNode* pTOXNd = pDoc->GetNodes().MakeTextNode( aInsPos , pColl );
1001  m_aSortArr[ nCnt ]->pTOXNd = pTOXNd;
1002 
1003  // Generate: Evaluate Form and insert the place holder for the
1004  // page number. If it is a TOX_INDEX and the SwForm IsCommaSeparated()
1005  // then a range of entries must be generated into one paragraph
1006  size_t nRange = 1;
1007  if(TOX_INDEX == SwTOXBase::GetType() &&
1008  GetTOXForm().IsCommaSeparated() &&
1009  m_aSortArr[nCnt]->GetType() == TOX_SORT_INDEX)
1010  {
1011  const SwTOXMark& rMark = m_aSortArr[nCnt]->pTextMark->GetTOXMark();
1012  const OUString& sPrimKey = rMark.GetPrimaryKey();
1013  const OUString& sSecKey = rMark.GetSecondaryKey();
1014  const SwTOXMark* pNextMark = nullptr;
1015  while(m_aSortArr.size() > (nCnt + nRange) &&
1016  m_aSortArr[nCnt + nRange]->GetType() == TOX_SORT_INDEX )
1017  {
1018  pNextMark = &(m_aSortArr[nCnt + nRange]->pTextMark->GetTOXMark());
1019  if( !pNextMark ||
1020  pNextMark->GetPrimaryKey() != sPrimKey ||
1021  pNextMark->GetSecondaryKey() != sSecKey)
1022  break;
1023  nRange++;
1024  }
1025  }
1026  // pass node index of table-of-content section and default page description
1027  // to method <GenerateText(..)>.
1028  ::SetProgressState( 0, pDoc->GetDocShell() );
1029 
1030  std::shared_ptr<sw::ToxTabStopTokenHandler> tabStopTokenHandler =
1031  std::make_shared<sw::DefaultToxTabStopTokenHandler>(
1032  pSectNd->GetIndex(), *pDefaultPageDesc, GetTOXForm().IsRelTabPos(),
1036  sw::ToxTextGenerator ttgn(GetTOXForm(), tabStopTokenHandler);
1037  ttgn.GenerateText(GetFormat()->GetDoc(), m_aSortArr, nCnt, nRange, pLayout);
1038  nCnt += nRange - 1;
1039  }
1040 
1041  // delete the first dummy node and remove all Cursor into the previous node
1042  aInsPos = *pFirstEmptyNd;
1043  {
1044  SwPaM aCorPam( *pFirstEmptyNd );
1045  aCorPam.GetPoint()->nContent.Assign( pFirstEmptyNd, 0 );
1046  if( !aCorPam.Move( fnMoveForward ) )
1047  aCorPam.Move( fnMoveBackward );
1048  SwNodeIndex aEndIdx( aInsPos, 1 );
1049  SwDoc::CorrAbs( aInsPos, aEndIdx, *aCorPam.GetPoint(), true );
1050 
1051  // Task 70995 - save and restore PageDesc and Break Attributes
1052  if( pFirstEmptyNd->HasSwAttrSet() )
1053  {
1054  if( !GetTitle().isEmpty() )
1055  aEndIdx = *pSectNd;
1056  else
1057  aEndIdx = *pFirstEmptyNd;
1058  SwContentNode* pCNd = pDoc->GetNodes().GoNext( &aEndIdx );
1059  if( pCNd ) // Robust against defect documents, e.g. i60336
1060  pCNd->SetAttr( *pFirstEmptyNd->GetpSwAttrSet() );
1061  }
1062  }
1063 
1064  // now create the new Frames
1065  sal_uLong nIdx = pSectNd->GetIndex();
1066  // don't delete if index is empty
1067  if(nIdx + 2 < pSectNd->EndOfSectionIndex())
1068  pDoc->GetNodes().Delete( aInsPos );
1069 
1070  aN2L.RestoreUpperFrames( pDoc->GetNodes(), nIdx, nIdx + 1 );
1071  o3tl::sorted_vector<SwRootFrame*> aAllLayouts = pDoc->GetAllLayouts();
1072  for ( const auto& rpLayout : aAllLayouts )
1073  {
1074  SwFrame::CheckPageDescs( static_cast<SwPageFrame*>(rpLayout->Lower()) );
1075  }
1076 
1078 }
1079 
1081 {
1082  SwDoc* pDoc = GetFormat()->GetDoc();
1083  OUString sLastDeli;
1084  size_t i = 0;
1085  while( i < m_aSortArr.size() )
1086  {
1087  ::SetProgressState( 0, pDoc->GetDocShell() );
1088 
1089  sal_uInt16 nLevel = m_aSortArr[i]->GetLevel();
1090 
1091  // Skip AlphaDelimiter
1092  if( nLevel == FORM_ALPHA_DELIMITER )
1093  continue;
1094 
1095  const OUString sDeli = rIntl.GetIndexKey( m_aSortArr[i]->GetText(),
1096  m_aSortArr[i]->GetLocale() );
1097 
1098  // Do we already have a Delimiter?
1099  if( !sDeli.isEmpty() && sLastDeli != sDeli )
1100  {
1101  // We skip all that are less than a small Blank (these are special characters)
1102  if( ' ' <= sDeli[0] )
1103  {
1104  std::unique_ptr<SwTOXCustom> pCst(
1105  MakeSwTOXSortTabBase<SwTOXCustom>(nullptr,
1106  TextAndReading(sDeli, OUString()),
1108  rIntl, m_aSortArr[i]->GetLocale() ));
1109  m_aSortArr.insert( m_aSortArr.begin() + i, std::move(pCst));
1110  i++;
1111  }
1112  sLastDeli = sDeli;
1113  }
1114 
1115  // Skip until we get to the same or a lower Level
1116  do {
1117  i++;
1118  } while (i < m_aSortArr.size() && m_aSortArr[i]->GetLevel() > nLevel);
1119  }
1120 }
1121 
1124 {
1125  SwDoc* pDoc = GetFormat()->GetDoc();
1126  const OUString& rName = GetTOXForm().GetTemplate( nLevel );
1127  SwTextFormatColl* pColl = !rName.isEmpty() ? pDoc->FindTextFormatCollByName(rName) :nullptr;
1128  if( !pColl )
1129  {
1130  sal_uInt16 nPoolFormat = 0;
1131  const TOXTypes eMyType = SwTOXBase::GetType();
1132  switch( eMyType )
1133  {
1134  case TOX_INDEX: nPoolFormat = RES_POOLCOLL_TOX_IDXH; break;
1135  case TOX_USER:
1136  if( nLevel < 6 )
1137  nPoolFormat = RES_POOLCOLL_TOX_USERH;
1138  else
1139  nPoolFormat = RES_POOLCOLL_TOX_USER6 - 6;
1140  break;
1141  case TOX_ILLUSTRATIONS: nPoolFormat = RES_POOLCOLL_TOX_ILLUSH; break;
1142  case TOX_OBJECTS: nPoolFormat = RES_POOLCOLL_TOX_OBJECTH; break;
1143  case TOX_TABLES: nPoolFormat = RES_POOLCOLL_TOX_TABLESH; break;
1144  case TOX_AUTHORITIES:
1145  case TOX_BIBLIOGRAPHY:
1146  nPoolFormat = RES_POOLCOLL_TOX_AUTHORITIESH; break;
1147  case TOX_CITATION: break;
1148  case TOX_CONTENT:
1149  // There's a jump in the ContentArea!
1150  if( nLevel < 6 )
1151  nPoolFormat = RES_POOLCOLL_TOX_CNTNTH;
1152  else
1153  nPoolFormat = RES_POOLCOLL_TOX_CNTNT6 - 6;
1154  break;
1155  }
1156 
1157  if(eMyType == TOX_AUTHORITIES && nLevel)
1158  nPoolFormat = nPoolFormat + 1;
1159  else if(eMyType == TOX_INDEX && nLevel)
1160  {
1161  // pool: Level 1,2,3, Delimiter
1162  // SwForm: Delimiter, Level 1,2,3
1163  nPoolFormat += 1 == nLevel ? nLevel + 3 : nLevel - 1;
1164  }
1165  else
1166  nPoolFormat = nPoolFormat + nLevel;
1167  pColl = pDoc->getIDocumentStylePoolAccess().GetTextCollFromPool( nPoolFormat );
1168  }
1169  return pColl;
1170 }
1171 
1172 void SwTOXBaseSection::SwClientNotify(const SwModify& rModify, const SfxHint& rHint)
1173 {
1174  if (auto pFindHint = dynamic_cast<const sw::FindContentFrameHint*>(&rHint))
1175  {
1176  if(pFindHint->m_rpContentFrame)
1177  return;
1178  auto pSectFormat = GetFormat();
1179  if(!pSectFormat)
1180  return;
1181  const SwSectionNode* pSectNd = pSectFormat->GetSectionNode();
1182  if(!pSectNd)
1183  return;
1184  SwNodeIndex aIdx(*pSectNd, 1);
1185  SwContentNode* pCNd = aIdx.GetNode().GetContentNode();
1186  if(!pCNd)
1187  pCNd = pFindHint->m_rDoc.GetNodes().GoNext(&aIdx);
1188  if(!pCNd)
1189  return;
1190  if(pCNd->EndOfSectionIndex() >= pSectNd->EndOfSectionIndex())
1191  return;
1192  pFindHint->m_rpContentFrame = pCNd->getLayoutFrame(&pFindHint->m_rLayout);
1193  } else
1194  SwTOXBase::SwClientNotify(rModify, rHint);
1195 }
1196 
1199  const SwTextNode* pOwnChapterNode,
1200  SwRootFrame const*const pLayout)
1201 {
1202  const auto pType = static_cast<SwTOXType*>(SwTOXBase::GetRegisteredIn());
1203  auto pShell = GetFormat()->GetDoc()->GetDocShell();
1204  const TOXTypes eTOXTyp = GetTOXType()->GetType();
1205  std::vector<std::reference_wrapper<SwTextTOXMark>> vMarks;
1206  pType->CollectTextTOXMarksForLayout(vMarks, pLayout);
1207  for(auto& rMark: vMarks)
1208  {
1209  ::SetProgressState(0, pShell);
1210  auto& rNode = rMark.get().GetTextNode();
1211  if(IsFromChapter() && ::lcl_FindChapterNode(rNode, pLayout) != pOwnChapterNode)
1212  continue;
1213  auto rTOXMark = rMark.get().GetTOXMark();
1214  if(TOX_INDEX == eTOXTyp)
1215  {
1216  // index entry mark
1217  assert(g_pBreakIt);
1218  lang::Locale aLocale = g_pBreakIt->GetLocale(rNode.GetLang(rMark.get().GetStart()));
1219  InsertSorted(MakeSwTOXSortTabBase<SwTOXIndex>(pLayout, rNode, &rMark.get(), GetOptions(), FORM_ENTRY, rIntl, aLocale));
1220  if(GetOptions() & SwTOIOptions::KeyAsEntry && !rTOXMark.GetPrimaryKey().isEmpty())
1221  {
1222  InsertSorted(MakeSwTOXSortTabBase<SwTOXIndex>(pLayout, rNode, &rMark.get(), GetOptions(), FORM_PRIMARY_KEY, rIntl, aLocale));
1223  if (!rTOXMark.GetSecondaryKey().isEmpty())
1224  {
1225  InsertSorted(MakeSwTOXSortTabBase<SwTOXIndex>(pLayout, rNode, &rMark.get(), GetOptions(), FORM_SECONDARY_KEY, rIntl, aLocale));
1226  }
1227  }
1228  }
1229  else if(TOX_USER == eTOXTyp || rTOXMark.GetLevel() <= GetLevel())
1230  { // table of content mark, also used for user marks
1231  InsertSorted(MakeSwTOXSortTabBase<SwTOXContent>(pLayout, rNode, &rMark.get(), rIntl));
1232  }
1233  }
1234 }
1235 
1237 void SwTOXBaseSection::UpdateOutline( const SwTextNode* pOwnChapterNode,
1238  SwRootFrame const*const pLayout)
1239 {
1240  SwDoc* pDoc = GetFormat()->GetDoc();
1241  SwNodes& rNds = pDoc->GetNodes();
1242 
1243  const SwOutlineNodes& rOutlNds = rNds.GetOutLineNds();
1244  for( auto pOutlineNode : rOutlNds )
1245  {
1246  ::SetProgressState( 0, pDoc->GetDocShell() );
1247  SwTextNode* pTextNd = pOutlineNode->GetTextNode();
1248  if( pTextNd && pTextNd->Len() && pTextNd->HasWriterListeners() &&
1249  o3tl::make_unsigned( pTextNd->GetAttrOutlineLevel()) <= GetLevel() &&
1250  pTextNd->getLayoutFrame(pLayout) &&
1251  !pTextNd->IsHiddenByParaField() &&
1252  !pTextNd->HasHiddenCharAttribute( true ) &&
1253  (!pLayout || !pLayout->IsHideRedlines()
1254  || static_cast<SwTextFrame*>(pTextNd->getLayoutFrame(pLayout))->GetTextNodeForParaProps() == pTextNd) &&
1255  ( !IsFromChapter() ||
1256  ::lcl_FindChapterNode(*pTextNd, pLayout) == pOwnChapterNode ))
1257  {
1258  InsertSorted(MakeSwTOXSortTabBase<SwTOXPara>(pLayout, *pTextNd, SwTOXElement::OutlineLevel));
1259  }
1260  }
1261 }
1262 
1264 void SwTOXBaseSection::UpdateTemplate(const SwTextNode* pOwnChapterNode,
1265  SwRootFrame const*const pLayout)
1266 {
1267  SwDoc* pDoc = GetFormat()->GetDoc();
1268  for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
1269  {
1270  const OUString sTmpStyleNames = GetStyleNames(i);
1271  if (sTmpStyleNames.isEmpty())
1272  continue;
1273 
1274  sal_Int32 nIndex = 0;
1275  while (nIndex >= 0)
1276  {
1278  sTmpStyleNames.getToken( 0, TOX_STYLE_DELIMITER, nIndex ));
1279  //TODO: no outline Collections in content indexes if OutlineLevels are already included
1280  if( !pColl ||
1284  continue;
1285 
1286  SwIterator<SwTextNode,SwFormatColl> aIter( *pColl );
1287  for( SwTextNode* pTextNd = aIter.First(); pTextNd; pTextNd = aIter.Next() )
1288  {
1289  ::SetProgressState( 0, pDoc->GetDocShell() );
1290 
1291  if (pTextNd->GetText().getLength() &&
1292  pTextNd->getLayoutFrame(pLayout) &&
1293  pTextNd->GetNodes().IsDocNodes() &&
1294  (!pLayout || !pLayout->IsHideRedlines()
1295  || static_cast<SwTextFrame*>(pTextNd->getLayoutFrame(pLayout))->GetTextNodeForParaProps() == pTextNd) &&
1296  (!IsFromChapter() || pOwnChapterNode ==
1297  ::lcl_FindChapterNode(*pTextNd, pLayout)))
1298  {
1299  InsertSorted(MakeSwTOXSortTabBase<SwTOXPara>(pLayout, *pTextNd, SwTOXElement::Template, i + 1));
1300  }
1301  }
1302  }
1303  }
1304 }
1305 
1307 void SwTOXBaseSection::UpdateSequence(const SwTextNode* pOwnChapterNode,
1308  SwRootFrame const*const pLayout)
1309 {
1310  SwDoc* pDoc = GetFormat()->GetDoc();
1312  if(!pSeqField)
1313  return;
1314 
1315  std::vector<SwFormatField*> vFields;
1316  pSeqField->GatherFields(vFields);
1317  for(auto pFormatField: vFields)
1318  {
1319  const SwTextField* pTextField = pFormatField->GetTextField();
1320  SwTextNode& rTextNode = pTextField->GetTextNode();
1321  ::SetProgressState( 0, pDoc->GetDocShell() );
1322 
1323  if (rTextNode.GetText().getLength() &&
1324  rTextNode.getLayoutFrame(pLayout) &&
1325  ( !IsFromChapter() ||
1326  ::lcl_FindChapterNode(rTextNode, pLayout) == pOwnChapterNode)
1327  && (!pLayout || !pLayout->IsHideRedlines()
1328  || !sw::IsFieldDeletedInModel(pDoc->getIDocumentRedlineAccess(), *pTextField)))
1329  {
1330  const SwSetExpField& rSeqField = dynamic_cast<const SwSetExpField&>(*(pFormatField->GetField()));
1331  const OUString sName = GetSequenceName()
1332  + OUStringChar(cSequenceMarkSeparator)
1333  + OUString::number( rSeqField.GetSeqNumber() );
1334  std::unique_ptr<SwTOXPara> pNew(new SwTOXPara( rTextNode, SwTOXElement::Sequence, 1, sName ));
1335  // set indexes if the number or the reference text are to be displayed
1336  if( GetCaptionDisplay() == CAPTION_TEXT )
1337  {
1338  pNew->SetStartIndex(
1339  SwGetExpField::GetReferenceTextPos( *pFormatField, *pDoc ));
1340  }
1341  else if(GetCaptionDisplay() == CAPTION_NUMBER)
1342  {
1343  pNew->SetEndIndex(pTextField->GetStart() + 1);
1344  }
1345  pNew->InitText(pLayout);
1346  InsertSorted(std::move(pNew));
1347  }
1348  }
1349 }
1350 
1352  SwRootFrame const*const pLayout)
1353 {
1354  SwDoc* pDoc = GetFormat()->GetDoc();
1355  SwFieldType* pAuthField = pDoc->getIDocumentFieldsAccess().GetFieldType(SwFieldIds::TableOfAuthorities, OUString(), false);
1356  if(!pAuthField)
1357  return;
1358 
1359  std::vector<SwFormatField*> vFields;
1360  pAuthField->GatherFields(vFields);
1361  for(auto pFormatField: vFields)
1362  {
1363  const auto pTextField = pFormatField->GetTextField();
1364  const SwTextNode& rTextNode = pFormatField->GetTextField()->GetTextNode();
1365  ::SetProgressState( 0, pDoc->GetDocShell() );
1366 
1367  if (rTextNode.GetText().getLength() &&
1368  rTextNode.getLayoutFrame(pLayout) &&
1369  (!pLayout || !pLayout->IsHideRedlines()
1370  || !sw::IsFieldDeletedInModel(pDoc->getIDocumentRedlineAccess(), *pTextField)))
1371  {
1372  //#106485# the body node has to be used!
1373  SwContentFrame *const pFrame = rTextNode.getLayoutFrame(pLayout);
1374  SwPosition aFieldPos(rTextNode);
1375  const SwTextNode* pTextNode = nullptr;
1376  if(pFrame && !pFrame->IsInDocBody())
1377  pTextNode = GetBodyTextNode( *pDoc, aFieldPos, *pFrame );
1378  if(!pTextNode)
1379  pTextNode = &rTextNode;
1380 
1381  InsertSorted(MakeSwTOXSortTabBase<SwTOXAuthority>(pLayout, *pTextNode, *pFormatField, rIntl));
1382  }
1383  }
1384 }
1385 
1386 static SwTOOElements lcl_IsSOObject( const SvGlobalName& rFactoryNm )
1387 {
1388  static const struct SoObjType {
1389  SwTOOElements nFlag;
1390  // GlobalNameId
1391  struct {
1392  sal_uInt32 n1;
1393  sal_uInt16 n2, n3;
1394  sal_uInt8 b8, b9, b10, b11, b12, b13, b14, b15;
1395  } aGlNmIds[4];
1396  } aArr[] = {
1411  };
1412 
1413  for( SoObjType const & rArr : aArr )
1414  for (auto & rId : rArr.aGlNmIds)
1415  {
1416  if( !rId.n1 )
1417  break;
1418  SvGlobalName aGlbNm( rId.n1, rId.n2, rId.n3,
1419  rId.b8, rId.b9, rId.b10, rId.b11,
1420  rId.b12, rId.b13, rId.b14, rId.b15 );
1421  if( rFactoryNm == aGlbNm )
1422  {
1423  return rArr.nFlag;
1424  }
1425  }
1426 
1427  return SwTOOElements::NONE;
1428 }
1429 
1431  const SwTextNode* pOwnChapterNode,
1432  SwRootFrame const*const pLayout)
1433 {
1434  SwDoc* pDoc = GetFormat()->GetDoc();
1435  SwNodes& rNds = pDoc->GetNodes();
1436  // on the 1st Node of the 1st Section
1437  sal_uLong nIdx = rNds.GetEndOfAutotext().StartOfSectionIndex() + 2,
1438  nEndIdx = rNds.GetEndOfAutotext().GetIndex();
1439 
1440  while( nIdx < nEndIdx )
1441  {
1442  ::SetProgressState( 0, pDoc->GetDocShell() );
1443 
1444  SwNode* pNd = rNds[ nIdx ];
1445  SwContentNode* pCNd = nullptr;
1446  switch( eMyType )
1447  {
1448  case SwTOXElement::Frame:
1449  if( !pNd->IsNoTextNode() )
1450  {
1451  pCNd = pNd->GetContentNode();
1452  if( !pCNd )
1453  {
1454  SwNodeIndex aTmp( *pNd );
1455  pCNd = rNds.GoNext( &aTmp );
1456  }
1457  }
1458  break;
1459  case SwTOXElement::Graphic:
1460  if( pNd->IsGrfNode() )
1461  pCNd = static_cast<SwContentNode*>(pNd);
1462  break;
1463  case SwTOXElement::Ole:
1464  if( pNd->IsOLENode() )
1465  {
1466  bool bInclude = true;
1468  {
1469  SwOLENode* pOLENode = pNd->GetOLENode();
1470  SwTOOElements nMyOLEOptions = GetOLEOptions();
1471  SwOLEObj& rOLEObj = pOLENode->GetOLEObj();
1472 
1473  if( rOLEObj.IsOleRef() ) // Not yet loaded
1474  {
1475  SvGlobalName aTmpName( rOLEObj.GetOleRef()->getClassID() );
1476  SwTOOElements nObj = ::lcl_IsSOObject( aTmpName );
1477  bInclude = ( (nMyOLEOptions & SwTOOElements::Other) && SwTOOElements::NONE == nObj )
1478  || (nMyOLEOptions & nObj);
1479  }
1480  else
1481  {
1482  OSL_FAIL("OLE Object no loaded?");
1483  bInclude = false;
1484  }
1485  }
1486 
1487  if(bInclude)
1488  pCNd = static_cast<SwContentNode*>(pNd);
1489  }
1490  break;
1491  default: break;
1492  }
1493 
1494  if( pCNd )
1495  {
1496  // find node in body text
1497  int nSetLevel = USHRT_MAX;
1498 
1499  //#111105# tables of tables|illustrations|objects don't support hierarchies
1500  if( IsLevelFromChapter() &&
1504  {
1505  const SwTextNode* pOutlNd = ::lcl_FindChapterNode( *pCNd,
1506  pLayout, MAXLEVEL - 1);
1507  if( pOutlNd )
1508  {
1510  {
1511  nSetLevel = pOutlNd->GetTextColl()->GetAttrOutlineLevel();
1512  }
1513  }
1514  }
1515 
1516  if (pCNd->getLayoutFrame(pLayout)
1517  && (!pLayout || !pLayout->IsHideRedlines()
1519  && ( !IsFromChapter() ||
1520  ::lcl_FindChapterNode(*pCNd, pLayout) == pOwnChapterNode ))
1521  {
1522  std::unique_ptr<SwTOXPara> pNew( MakeSwTOXSortTabBase<SwTOXPara>(
1523  pLayout, *pCNd, eMyType,
1524  ( USHRT_MAX != nSetLevel )
1525  ? static_cast<sal_uInt16>(nSetLevel)
1526  : FORM_ALPHA_DELIMITER ) );
1527  InsertSorted( std::move(pNew) );
1528  }
1529  }
1530 
1531  nIdx = pNd->StartOfSectionNode()->EndOfSectionIndex() + 2; // 2 == End/Start Node
1532  }
1533 }
1534 
1536 void SwTOXBaseSection::UpdateTable(const SwTextNode* pOwnChapterNode,
1537  SwRootFrame const*const pLayout)
1538 {
1539  SwDoc* pDoc = GetFormat()->GetDoc();
1540  SwNodes& rNds = pDoc->GetNodes();
1541  const SwFrameFormats& rArr = *pDoc->GetTableFrameFormats();
1542 
1543  for( auto pFrameFormat : rArr )
1544  {
1545  ::SetProgressState( 0, pDoc->GetDocShell() );
1546 
1547  SwTable* pTmpTable = SwTable::FindTable( pFrameFormat );
1548  SwTableBox* pFBox;
1549  if( pTmpTable && nullptr != (pFBox = pTmpTable->GetTabSortBoxes()[0] ) &&
1550  pFBox->GetSttNd() && pFBox->GetSttNd()->GetNodes().IsDocNodes() )
1551  {
1552  const SwTableNode* pTableNd = pFBox->GetSttNd()->FindTableNode();
1553  SwNodeIndex aContentIdx( *pTableNd, 1 );
1554 
1555  SwContentNode* pCNd;
1556  while( nullptr != ( pCNd = rNds.GoNext( &aContentIdx ) ) &&
1557  aContentIdx.GetIndex() < pTableNd->EndOfSectionIndex() )
1558  {
1559  if (pCNd->getLayoutFrame(pLayout)
1560  && (!pLayout || !pLayout->IsHideRedlines()
1562  && (!IsFromChapter()
1563  || ::lcl_FindChapterNode(*pCNd, pLayout) == pOwnChapterNode))
1564  {
1565  std::unique_ptr<SwTOXTable> pNew(new SwTOXTable( *pCNd ));
1567  {
1568  const SwTextNode* pOutlNd =
1569  ::lcl_FindChapterNode(*pCNd, pLayout, MAXLEVEL - 1);
1570  if( pOutlNd )
1571  {
1573  {
1574  const int nTmp = pOutlNd->GetTextColl()->GetAttrOutlineLevel();
1575  pNew->SetLevel(static_cast<sal_uInt16>(nTmp));
1576  }
1577  }
1578  }
1579  pNew->InitText(pLayout);
1580  InsertSorted(std::move(pNew));
1581  break;
1582  }
1583  }
1584  }
1585  }
1586 }
1587 
1590 {
1591  if( m_aSortArr.empty() )
1592  return ;
1593 
1594  // Insert the current PageNumber into the TOC
1595  SwPageFrame* pCurrentPage = nullptr;
1596  sal_uInt16 nPage = 0;
1597  SwDoc* pDoc = GetFormat()->GetDoc();
1598 
1600  TOX_INDEX == GetTOXType()->GetType() ?
1602  GetSortAlgorithm() );
1603 
1604  for( size_t nCnt = 0; nCnt < m_aSortArr.size(); ++nCnt )
1605  {
1606  // Loop over all SourceNodes
1607 
1608  // process run in lines
1609  size_t nRange = 0;
1610  if(GetTOXForm().IsCommaSeparated() &&
1611  m_aSortArr[nCnt]->GetType() == TOX_SORT_INDEX)
1612  {
1613  const SwTOXMark& rMark = m_aSortArr[nCnt]->pTextMark->GetTOXMark();
1614  const OUString& sPrimKey = rMark.GetPrimaryKey();
1615  const OUString& sSecKey = rMark.GetSecondaryKey();
1616  const SwTOXMark* pNextMark = nullptr;
1617  while(m_aSortArr.size() > (nCnt + nRange)&&
1618  m_aSortArr[nCnt + nRange]->GetType() == TOX_SORT_INDEX &&
1619  nullptr != (pNextMark = &(m_aSortArr[nCnt + nRange]->pTextMark->GetTOXMark())) &&
1620  pNextMark->GetPrimaryKey() == sPrimKey &&
1621  pNextMark->GetSecondaryKey() == sSecKey)
1622  nRange++;
1623  }
1624  else
1625  nRange = 1;
1626 
1627  for(size_t nRunInEntry = nCnt; nRunInEntry < nCnt + nRange; ++nRunInEntry)
1628  {
1629  std::vector<sal_uInt16> aNums; // the PageNumber
1630  std::vector<SwPageDesc*> aDescs; // The PageDescriptors matching the PageNumbers
1631  std::vector<sal_uInt16> aMainNums; // contains page numbers of main entries
1632  SwTOXSortTabBase* pSortBase = m_aSortArr[nRunInEntry].get();
1633  size_t nSize = pSortBase->aTOXSources.size();
1634  for (size_t j = 0; j < nSize; ++j)
1635  {
1636  ::SetProgressState( 0, pDoc->GetDocShell() );
1637 
1638  SwTOXSource& rTOXSource = pSortBase->aTOXSources[j];
1639  if( rTOXSource.pNd )
1640  {
1641  SwContentFrame* pFrame = rTOXSource.pNd->getLayoutFrame( pDoc->getIDocumentLayoutAccess().GetCurrentLayout() );
1642  OSL_ENSURE( pFrame || pDoc->IsUpdateTOX(), "TOX, no Frame found");
1643  if( !pFrame )
1644  continue;
1645  if( pFrame->IsTextFrame() && static_cast<SwTextFrame*>(pFrame)->HasFollow() )
1646  {
1647  // find the right one
1648  SwTextFrame* pNext;
1649  TextFrameIndex const nPos(static_cast<SwTextFrame*>(pFrame)
1650  ->MapModelToView(static_cast<SwTextNode const*>(rTOXSource.pNd),
1651  rTOXSource.nPos));
1652  for (;;)
1653  {
1654  pNext = static_cast<SwTextFrame*>(pFrame->GetFollow());
1655  if (!pNext || nPos < pNext->GetOffset())
1656  break;
1657  pFrame = pNext;
1658  }
1659  }
1660 
1661  SwPageFrame* pTmpPage = pFrame->FindPageFrame();
1662  if( pTmpPage != pCurrentPage )
1663  {
1664  nPage = pTmpPage->GetVirtPageNum();
1665  pCurrentPage = pTmpPage;
1666  }
1667 
1668  // Insert as sorted
1669  std::vector<sal_uInt16>::size_type i;
1670  for( i = 0; i < aNums.size() && aNums[i] < nPage; ++i )
1671  ;
1672 
1673  if( i >= aNums.size() || aNums[ i ] != nPage )
1674  {
1675  aNums.insert(aNums.begin() + i, nPage);
1676  aDescs.insert(aDescs.begin() + i, pCurrentPage->GetPageDesc() );
1677  }
1678  // is it a main entry?
1679  if(TOX_SORT_INDEX == pSortBase->GetType() &&
1680  rTOXSource.bMainEntry)
1681  {
1682  aMainNums.push_back(nPage);
1683  }
1684  }
1685  }
1686  // Insert the PageNumber into the TOC TextNode
1687  const SwTOXSortTabBase* pBase = m_aSortArr[ nCnt ].get();
1688  if(pBase->pTOXNd)
1689  {
1690  const SwTextNode* pTextNd = pBase->pTOXNd->GetTextNode();
1691  OSL_ENSURE( pTextNd, "no TextNode, wrong TOC" );
1692 
1693  UpdatePageNum_( const_cast<SwTextNode*>(pTextNd), aNums, aDescs, &aMainNums,
1694  aIntl );
1695  }
1696  }
1697  }
1698  // Delete the mapping array after setting the right PageNumber
1699  m_aSortArr.clear();
1700 }
1701 
1704 static bool lcl_HasMainEntry( const std::vector<sal_uInt16>* pMainEntryNums, sal_uInt16 nToFind )
1705 {
1706  if (!pMainEntryNums)
1707  return false;
1708 
1709  for( auto nMainEntry : *pMainEntryNums )
1710  if (nToFind == nMainEntry)
1711  return true;
1712  return false;
1713 }
1714 
1716  const std::vector<sal_uInt16>& rNums,
1717  const std::vector<SwPageDesc*>& rDescs,
1718  const std::vector<sal_uInt16>* pMainEntryNums,
1719  const SwTOXInternational& rIntl )
1720 {
1721  // collect starts end ends of main entry character style
1722  std::unique_ptr< std::vector<sal_uInt16> > xCharStyleIdx(pMainEntryNums ? new std::vector<sal_uInt16> : nullptr);
1723 
1724  OUString sSrchStr
1725  = OUStringChar(C_NUM_REPL) + SwTOXMark::S_PAGE_DELI + OUStringChar(C_NUM_REPL);
1726  sal_Int32 nStartPos = pNd->GetText().indexOf(sSrchStr);
1727  sSrchStr = OUStringChar(C_NUM_REPL) + OUStringChar(C_END_PAGE_NUM);
1728  sal_Int32 nEndPos = pNd->GetText().indexOf(sSrchStr);
1729 
1730  if (-1 == nEndPos || rNums.empty())
1731  return;
1732 
1733  if (-1 == nStartPos || nStartPos > nEndPos)
1734  nStartPos = nEndPos;
1735 
1736  sal_uInt16 nOld = rNums[0],
1737  nBeg = nOld,
1738  nCount = 0;
1739  OUString aNumStr( rDescs[0]->GetNumType().GetNumStr( nBeg ) );
1740  if( xCharStyleIdx && lcl_HasMainEntry( pMainEntryNums, nBeg ))
1741  {
1742  xCharStyleIdx->push_back( 0 );
1743  }
1744 
1745  // Delete place holder
1746  SwIndex aPos(pNd, nStartPos);
1747  SwCharFormat* pPageNoCharFormat = nullptr;
1748  SwpHints* pHints = pNd->GetpSwpHints();
1749  if(pHints)
1750  for(size_t nHintIdx = 0; nHintIdx < pHints->Count(); ++nHintIdx)
1751  {
1752  const SwTextAttr* pAttr = pHints->Get(nHintIdx);
1753  const sal_Int32 nTmpEnd = pAttr->End() ? *pAttr->End() : 0;
1754  if( nStartPos >= pAttr->GetStart() &&
1755  (nStartPos + 2) <= nTmpEnd &&
1756  pAttr->Which() == RES_TXTATR_CHARFMT)
1757  {
1758  pPageNoCharFormat = pAttr->GetCharFormat().GetCharFormat();
1759  break;
1760  }
1761  }
1762  pNd->EraseText(aPos, nEndPos - nStartPos + 2);
1763 
1764  std::vector<sal_uInt16>::size_type i;
1765  for( i = 1; i < rNums.size(); ++i)
1766  {
1767  SvxNumberType aType( rDescs[i]->GetNumType() );
1768  if( TOX_INDEX == SwTOXBase::GetType() )
1769  { // Summarize for the following
1770  // Add up all following
1771  // break up if main entry starts or ends and
1772  // insert a char style index
1773  bool bMainEntryChanges = lcl_HasMainEntry(pMainEntryNums, nOld)
1774  != lcl_HasMainEntry(pMainEntryNums, rNums[i]);
1775 
1776  if(nOld == rNums[i]-1 && !bMainEntryChanges &&
1778  nCount++;
1779  else
1780  {
1781  // Flush for the following old values
1783  {
1784  if ( nCount >= 1 )
1785  aNumStr += rIntl.GetFollowingText( nCount > 1 );
1786  }
1787  else if (nCount) //#58127# If nCount == 0, then the only PageNumber is already in aNumStr!
1788  {
1789  if (nCount == 1 )
1790  aNumStr += SwTOXMark::S_PAGE_DELI;
1791  else
1792  aNumStr += "-";
1793 
1794  aNumStr += aType.GetNumStr( nBeg + nCount );
1795  }
1796 
1797  // Create new String
1798  nBeg = rNums[i];
1799  aNumStr += SwTOXMark::S_PAGE_DELI;
1800  //the change of the character style must apply after sPageDeli is appended
1801  if (xCharStyleIdx && bMainEntryChanges)
1802  {
1803  xCharStyleIdx->push_back(aNumStr.getLength());
1804  }
1805  aNumStr += aType.GetNumStr( nBeg );
1806  nCount = 0;
1807  }
1808  nOld = rNums[i];
1809  }
1810  else
1811  { // Insert all Numbers
1812  aNumStr += aType.GetNumStr( rNums[i] );
1813  if (i+1 != rNums.size())
1814  aNumStr += SwTOXMark::S_PAGE_DELI;
1815  }
1816  }
1817  // Flush when ending and the following old values
1818  if( TOX_INDEX == SwTOXBase::GetType() )
1819  {
1821  {
1822  if( nCount >= 1 )
1823  aNumStr += rIntl.GetFollowingText( nCount > 1 );
1824  }
1825  else
1826  {
1827  if(nCount >= 2)
1828  aNumStr += "-";
1829  else if(nCount == 1)
1830  aNumStr += SwTOXMark::S_PAGE_DELI;
1831  //#58127# If nCount == 0, then the only PageNumber is already in aNumStr!
1832  if(nCount)
1833  aNumStr += rDescs[i-1]->GetNumType().GetNumStr( nBeg+nCount );
1834  }
1835  }
1837  if(pPageNoCharFormat)
1838  {
1839  SwFormatCharFormat aCharFormat( pPageNoCharFormat );
1840  pNd->InsertItem(aCharFormat, nStartPos, nStartPos + aNumStr.getLength(), SetAttrMode::DONTEXPAND);
1841  }
1842 
1843  // The main entries should get their character style
1844  if (!xCharStyleIdx || xCharStyleIdx->empty() || GetMainEntryCharStyle().isEmpty())
1845  return;
1846 
1847  // eventually the last index must me appended
1848  if (xCharStyleIdx->size()&0x01)
1849  xCharStyleIdx->push_back(aNumStr.getLength());
1850 
1851  // search by name
1852  SwDoc* pDoc = pNd->GetDoc();
1854  SwCharFormat* pCharFormat = nullptr;
1855  if(USHRT_MAX != nPoolId)
1856  pCharFormat = pDoc->getIDocumentStylePoolAccess().GetCharFormatFromPool(nPoolId);
1857  else
1858  pCharFormat = pDoc->FindCharFormatByName( GetMainEntryCharStyle() );
1859  if(!pCharFormat)
1860  pCharFormat = pDoc->MakeCharFormat(GetMainEntryCharStyle(), nullptr);
1861 
1862  // find the page numbers in aNumStr and set the character style
1863  sal_Int32 nOffset = pNd->GetText().getLength() - aNumStr.getLength();
1864  SwFormatCharFormat aCharFormat(pCharFormat);
1865  for (size_t j = 0; j < xCharStyleIdx->size(); j += 2)
1866  {
1867  sal_Int32 nStartIdx = (*xCharStyleIdx)[j] + nOffset;
1868  sal_Int32 nEndIdx = (*xCharStyleIdx)[j + 1] + nOffset;
1869  pNd->InsertItem(aCharFormat, nStartIdx, nEndIdx, SetAttrMode::DONTEXPAND);
1870  }
1871 }
1872 
1873 void SwTOXBaseSection::InsertSorted(std::unique_ptr<SwTOXSortTabBase> pNew)
1874 {
1875  Range aRange(0, m_aSortArr.size());
1876  if( TOX_INDEX == SwTOXBase::GetType() && pNew->pTextMark )
1877  {
1878  const SwTOXMark& rMark = pNew->pTextMark->GetTOXMark();
1879  // Evaluate Key
1880  // Calculate the range where to insert
1881  if( !(GetOptions() & SwTOIOptions::KeyAsEntry) &&
1882  !rMark.GetPrimaryKey().isEmpty() )
1883  {
1884  aRange = GetKeyRange( rMark.GetPrimaryKey(),
1885  rMark.GetPrimaryKeyReading(),
1886  *pNew, FORM_PRIMARY_KEY, aRange );
1887 
1888  if( !rMark.GetSecondaryKey().isEmpty() )
1889  aRange = GetKeyRange( rMark.GetSecondaryKey(),
1890  rMark.GetSecondaryKeyReading(),
1891  *pNew, FORM_SECONDARY_KEY, aRange );
1892  }
1893  }
1894  // Search for identical entries and remove the trailing one
1896  {
1897  for(short i = static_cast<short>(aRange.Min()); i < static_cast<short>(aRange.Max()); ++i)
1898  {
1899  SwTOXSortTabBase* pOld = m_aSortArr[i].get();
1900  if (pOld->equivalent(*pNew))
1901  {
1902  if (pOld->sort_lt(*pNew))
1903  {
1904  return;
1905  }
1906  else
1907  {
1908  // remove the old content
1909  m_aSortArr.erase( m_aSortArr.begin() + i );
1910  aRange.Max()--;
1911  break;
1912  }
1913  }
1914  }
1915  }
1916 
1917  // find position and insert
1918  long i;
1919 
1920  for( i = aRange.Min(); i < aRange.Max(); ++i)
1921  { // Only check for same level
1922  SwTOXSortTabBase* pOld = m_aSortArr[i].get();
1923  if (pOld->equivalent(*pNew))
1924  {
1926  {
1927  // Own entry for double entries or keywords
1928  if( pOld->GetType() == TOX_SORT_CUSTOM &&
1930  continue;
1931 
1933  { // Own entry
1934  m_aSortArr.insert(m_aSortArr.begin() + i, std::move(pNew));
1935  return;
1936  }
1937  // If the own entry is already present, add it to the references list
1938  pOld->aTOXSources.push_back(pNew->aTOXSources[0]);
1939 
1940  return;
1941  }
1942 #if OSL_DEBUG_LEVEL > 0
1943  else
1944  OSL_FAIL("Bibliography entries cannot be found here");
1945 #endif
1946  }
1947  if (pNew->sort_lt(*pOld))
1948  break;
1949  }
1950  // Skip SubLevel
1951  while( TOX_INDEX == SwTOXBase::GetType() && i < aRange.Max() &&
1952  m_aSortArr[i]->GetLevel() > pNew->GetLevel() )
1953  i++;
1954 
1955  // Insert at position i
1956  m_aSortArr.insert(m_aSortArr.begin()+i, std::move(pNew));
1957 }
1958 
1960 Range SwTOXBaseSection::GetKeyRange(const OUString& rStr, const OUString& rStrReading,
1961  const SwTOXSortTabBase& rNew,
1962  sal_uInt16 nLevel, const Range& rRange )
1963 {
1964  const SwTOXInternational& rIntl = *rNew.pTOXIntl;
1965  TextAndReading aToCompare(rStr, rStrReading);
1966 
1968  {
1969  aToCompare.sText = rIntl.ToUpper( aToCompare.sText, 0 )
1970  + aToCompare.sText.copy(1);
1971  }
1972 
1973  OSL_ENSURE(rRange.Min() >= 0 && rRange.Max() >= 0, "Min Max < 0");
1974 
1975  const long nMin = rRange.Min();
1976  const long nMax = rRange.Max();
1977 
1978  long i;
1979 
1980  for( i = nMin; i < nMax; ++i)
1981  {
1982  SwTOXSortTabBase* pBase = m_aSortArr[i].get();
1983 
1984  if( rIntl.IsEqual( pBase->GetText(), pBase->GetLocale(),
1985  aToCompare, rNew.GetLocale() ) &&
1986  pBase->GetLevel() == nLevel )
1987  break;
1988  }
1989  if(i == nMax)
1990  { // If not already present, create and insert
1991  std::unique_ptr<SwTOXCustom> pKey(MakeSwTOXSortTabBase<SwTOXCustom>(
1992  nullptr, aToCompare, nLevel, rIntl, rNew.GetLocale() ));
1993  for(i = nMin; i < nMax; ++i)
1994  {
1995  if (nLevel == m_aSortArr[i]->GetLevel() && pKey->sort_lt(*m_aSortArr[i]))
1996  break;
1997  }
1998  m_aSortArr.insert(m_aSortArr.begin() + i, std::move(pKey));
1999  }
2000  const long nStart = i+1;
2001  const long nEnd = m_aSortArr.size();
2002 
2003  // Find end of range
2004  for(i = nStart; i < nEnd; ++i)
2005  {
2006  if(m_aSortArr[i]->GetLevel() <= nLevel)
2007  {
2008  return Range(nStart, i);
2009  }
2010  }
2011  return Range(nStart, nEnd);
2012 }
2013 
2015 {
2016  const SwTOXBaseSection *pSect = dynamic_cast<const SwTOXBaseSection*>(this);
2017  if (!pSect || !pSect->GetFormat())
2018  return false;
2019 
2020  const SwSectionNode* pSectNode = pSect->GetFormat()->GetSectionNode();
2021  if (!pSectNode)
2022  return false;
2023 
2024  const SwDocShell* pDocSh = pSectNode->GetDoc()->GetDocShell();
2025  if (!pDocSh)
2026  return false;
2027 
2028  if (pDocSh->IsReadOnly())
2029  return true;
2030 
2031  pSectNode = pSectNode->StartOfSectionNode()->FindSectionNode();
2032  if (!pSectNode)
2033  return false;
2034 
2035  return pSectNode->GetSection().IsProtectFlag();
2036 }
2037 
2039 {
2040  const SwTOXBaseSection *pSect = dynamic_cast<const SwTOXBaseSection*>(this);
2041  if(pSect && pSect->GetFormat())
2042  return &pSect->GetFormat()->GetAttrSet();
2043  return nullptr;
2044 }
2045 
2047 {
2048  SwTOXBaseSection *pSect = dynamic_cast<SwTOXBaseSection*>(this);
2049  if( pSect && pSect->GetFormat() )
2050  pSect->GetFormat()->SetFormatAttr( rSet );
2051 }
2052 
2053 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
virtual SwCharFormat * GetCharFormatFromPool(sal_uInt16 nId)=0
OUString GetNumStr(sal_Int32 nNo) const
SwSectionNode * FindSectionNode()
Search section node, in which it is.
Definition: ndsect.cxx:962
Instances of SwFields and those derived from it occur 0 to n times.
Definition: fldbas.hxx:240
#define SO3_SM_CLASSID_60
const SwEndNode * EndOfSectionNode() const
Definition: node.hxx:682
SvxBreak
const css::lang::Locale & GetLocale() const
Definition: txmsrt.hxx:182
OUString GetIndexKey(const TextAndReading &rTaR, const css::lang::Locale &rLcl) const
Definition: txmsrt.cxx:115
Base class of the Writer layout elements.
Definition: frame.hxx:297
const sal_Unicode C_NUM_REPL
Definition: tox.cxx:46
Represents the visualization of a paragraph.
Definition: txtfrm.hxx:151
const SfxItemSet * GetAttrSet() const
Definition: doctxm.cxx:2038
TOXTypes
Definition: toxe.hxx:39
bool IsMarkHintHidden(SwRootFrame const &rLayout, SwTextNode const &rNode, SwTextAttrEnd const &rHint)
Definition: reffld.cxx:1104
void SetAttrSet(const SfxItemSet &)
Definition: doctxm.cxx:2046
std::vector< SwSection * > SwSections
Definition: section.hxx:41
bool IsInMailMerge() const
Definition: doc.hxx:957
sal_uLong GetIndex() const
Definition: node.hxx:282
bool operator<(const SwTextGlyphsKey &l, const SwTextGlyphsKey &r)
Definition: fntcache.cxx:128
bool operator>=(const BigInt &rVal1, const BigInt &rVal2)
OUString const & GetSecondaryKeyReading() const
Definition: tox.hxx:664
SwNode & GetEndOfAutotext() const
Section for all Flys/Header/Footers.
Definition: ndarr.hxx:156
sal_Int32 nIndex
Represents the style of a paragraph.
Definition: fmtcol.hxx:55
std::unique_ptr< SwDefTOXBase_Impl > mpDefTOXBases
Definition: doc.hxx:245
Marks a position in the document model.
Definition: pam.hxx:35
SwTOXElement GetCreateType() const
Definition: tox.hxx:707
bool IsInDocBody() const
Definition: frame.hxx:921
SwTOIOptions GetOptions() const
Definition: tox.hxx:746
SwOLENode * GetOLENode()
Inline methods from Node.hxx.
Definition: ndole.hxx:161
sal_uLong StartOfSectionIndex() const
Definition: node.hxx:673
SwPageDesc * GetPageDesc()
Definition: fmtpdsc.hxx:62
const SwOLEObj & GetOLEObj() const
Definition: ndole.hxx:112
SwCharFormat * MakeCharFormat(const OUString &rFormatName, SwCharFormat *pDerivedFrom, bool bBroadcast=false)
Definition: docfmt.cxx:843
const OUString & GetText() const
Definition: ndtxt.hxx:211
virtual const SwRootFrame * GetCurrentLayout() const =0
static void CheckPageDescs(SwPageFrame *pStart, bool bNotifyFields=true, SwPageFrame **ppPrev=nullptr)
Check all pages (starting from the given one) if they use the appropriate frame format.
Definition: pagechg.cxx:1003
virtual bool get(DocumentSettingId id) const override
Return the specified document setting.
OUString const & GetPrimaryKey() const
Definition: tox.hxx:640
SwDocShell * GetDocShell()
Definition: doc.hxx:1348
bool IsProtected() const
Definition: tox.hxx:537
SwpHints * GetpSwpHints()
Definition: ndtxt.hxx:219
Definition: toxe.hxx:25
const SwFrameFormats * GetTableFrameFormats() const
Definition: doc.hxx:808
void DelSectionFormat(SwSectionFormat *pFormat, bool bDelNodes=false)
Definition: ndsect.cxx:516
virtual SwFieldType * GetFieldType(SwFieldIds nResId, const OUString &rName, bool bDbFieldMatching) const =0
static SwTOXBase * GetCurTOX(const SwPosition &rPos)
Get current table of contents.
Definition: doctxm.cxx:448
SwTOOElements
Definition: tox.hxx:410
Definition: tox.hxx:313
SwNodeIndex nNode
Definition: pam.hxx:37
const SwTOXType * InsertTOXType(const SwTOXType &rTyp)
Definition: doctxm.cxx:629
int n1
void InsertAlphaDelimiter(const SwTOXInternational &rIntl)
Definition: doctxm.cxx:1080
SvxBreak GetBreak() const
SwTextFormatColl * FindTextFormatCollByName(const OUString &rName) const
Definition: doc.hxx:796
void SetSectionName(OUString const &rName)
Definition: section.hxx:169
const SwTextNode * GetBodyTextNode(const SwDoc &rDoc, SwPosition &rPos, const SwFrame &rFrame)
Forward declaration: get "BodyTextNode" for exp.fld in Fly's headers/footers/footnotes.
Definition: expfld.cxx:163
static bool lcl_HasMainEntry(const std::vector< sal_uInt16 > *pMainEntryNums, sal_uInt16 nToFind)
Replace the PageNumber place holders.
Definition: doctxm.cxx:1704
SwHistory & GetHistory()
virtual void SetModified()=0
Must be called manually at changes of format.
sal_uInt16 GetType() const
Definition: txmsrt.hxx:142
sal_uIntPtr sal_uLong
std::vector< SwTOXMark * > SwTOXMarks
Definition: tox.hxx:45
Subgroup user indices.
Definition: poolfmt.hxx:381
OUString const & GetTemplate(sal_uInt16 nLevel) const
Definition: tox.hxx:678
#define SO3_SIMPRESS_CLASSID_30
#define SO3_SIMPRESS_CLASSID_60
const SwPageDesc * FindPageDesc(size_t *pPgDescNdIdx=nullptr) const
Search PageDesc with which this node is formatted.
Definition: node.cxx:469
virtual sal_uInt16 GetLevel() const =0
void CollectTextMarks(SwTOXMarks &rMarks) const
Definition: tox.hxx:185
#define SO3_SCH_CLASSID_30
css::uno::Reference< css::embed::XEmbeddedObject > const & GetOleRef()
Definition: ndole.cxx:913
#define TOX_STYLE_DELIMITER
Definition: tox.hxx:423
SwContentFrame * getLayoutFrame(const SwRootFrame *, const SwPosition *pPos=nullptr, std::pair< Point, bool > const *pViewPosAndCalcFrame=nullptr) const
Definition: node.cxx:1190
sal_Int64 n
virtual SwUndoId EndUndo(SwUndoId const eUndoId, SwRewriter const *const pRewriter)=0
Closes undo block.
Definition: doc.hxx:184
void TitleSectionInserted(SwSectionFormat &rSectionFormat)
Definition: unsect.cxx:545
TElementType * Next()
Definition: calbck.hxx:351
This class generates text for the entries of a table of x.
tuple args
WW8LvlType GetNumType(sal_uInt8 nWwLevelNo)
Definition: ww8par2.cxx:871
#define SO3_SDRAW_CLASSID_50
bool IsUpdateTOX() const
Definition: doc.hxx:946
virtual void DeleteRange(SwPaM &)=0
Delete a range SwFlyFrameFormat.
static SwContentNode * GoPrevious(SwNodeIndex *)
Definition: nodes.cxx:1305
bool HasDummyChar() const
Definition: txatbase.hxx:101
SwNode & GetNode() const
Definition: ndindex.hxx:119
void UpdateTemplate(const SwTextNode *pOwnChapterNode, SwRootFrame const *pLayout)
Generate table of contents from template areas.
Definition: doctxm.cxx:1264
SwSectionFormat * GetFormat()
Definition: section.hxx:336
bool operator<=(const BigInt &rVal1, const BigInt &rVal2)
bool IsTOXBaseInReadonly() const
Definition: doctxm.cxx:2014
IDocumentUndoRedo & GetIDocumentUndoRedo()
Definition: doc.cxx:144
#define SO3_SC_CLASSID_40
virtual void SwClientNotify(const SwModify &, const SfxHint &rHint) override
Definition: calbck.cxx:108
const SwTOXType * GetTOXType() const
Definition: tox.hxx:578
sal_uInt16 Which() const
Definition: txatbase.hxx:110
static const SwAttrSet & GetTOXBaseAttrSet(const SwTOXBase &rTOX)
Definition: doctxm.cxx:468
sal_uInt16 nLevel
Definition: tox.hxx:443
#define FORM_SECONDARY_KEY
Definition: tox.hxx:209
IDocumentContentOperations const & getIDocumentContentOperations() const
Definition: doc.cxx:315
The root element of a Writer document layout.
Definition: rootfrm.hxx:80
OUString GetFollowingText(bool bMorePages) const
Definition: txmsrt.cxx:121
bool SetTOXBaseName(const SwTOXBase &rTOXBase, const OUString &rName)
Definition: doctxm.cxx:705
void GatherFields(std::vector< SwFormatField * > &rvFormatFields, bool bCollectOnlyInDocNodes=true) const
Definition: fldbas.cxx:193
const SwSection & GetSection() const
Definition: node.hxx:541
IDocumentFieldsAccess const & getIDocumentFieldsAccess() const
Definition: doc.cxx:357
#define SO3_SCH_CLASSID_40
void Delete(const SwNodeIndex &rPos, sal_uLong nNodes=1)
delete nodes
Definition: nodes.cxx:1076
OUString const & GetPrimaryKeyReading() const
Definition: tox.hxx:658
bool IsAssignedToListLevelOfOutlineStyle() const
Definition: fmtcol.hxx:109
static SwTOOElements lcl_IsSOObject(const SvGlobalName &rFactoryNm)
Definition: doctxm.cxx:1386
const SwTOXType * GetTOXType() const
Definition: tox.hxx:704
const SvxFormatBreakItem & GetBreak(bool=true) const
Definition: frmatr.hxx:62
#define CH_TXTATR_INWORD
Definition: hintids.hxx:171
SwTOXBaseSection * InsertTableOf(const SwPosition &rPos, const SwTOXBase &rTOX, const SfxItemSet *pSet=nullptr, bool bExpand=false, SwRootFrame const *pLayout=nullptr)
Definition: doctxm.cxx:346
int n2
const SwTOXMark & GetTOXMark() const
Definition: txatbase.hxx:212
SwIndex nContent
Definition: pam.hxx:38
#define SO3_SC_CLASSID_30
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
SwSectionNode * GetSectionNode()
Definition: section.cxx:1004
IDocumentStylePoolAccess const & getIDocumentStylePoolAccess() const
Definition: doc.cxx:426
SwTOXSearch
Definition: toxe.hxx:22
virtual bool equivalent(const SwTOXSortTabBase &)
Definition: txmsrt.cxx:197
SwBreakIt * g_pBreakIt
Definition: breakit.cxx:33
SwTOIKeyType
Definition: toxe.hxx:30
int nCount
bool IsEqual(const TextAndReading &rTaR1, const css::lang::Locale &rLocale1, const TextAndReading &rTaR2, const css::lang::Locale &rLocale2) const
Definition: txmsrt.hxx:92
sal_uLong GetIndex() const
Definition: ndindex.hxx:152
Content 6th level.
Definition: poolfmt.hxx:388
bool IsTextFrame() const
Definition: frame.hxx:1212
sal_Int32 GetStart() const
Definition: txatbase.hxx:82
const sal_uInt8 MAXLEVEL
Definition: swtypes.hxx:95
static SW_DLLPUBLIC sal_uInt16 GetPoolIdFromUIName(const OUString &rName, SwGetPoolIdFromName)
const SwTextNode * pTOXNd
Definition: txmsrt.hxx:127
SwTextAttr * InsertItem(SfxPoolItem &rAttr, const sal_Int32 nStart, const sal_Int32 nEnd, const SetAttrMode nMode=SetAttrMode::DEFAULT)
create new text attribute from rAttr and insert it
Definition: thints.cxx:1255
SwSection * InsertSwSection(SwPaM const &rRange, SwSectionData &, std::pair< SwTOXBase const *, sw::RedlineMode > const *pTOXBase, SfxItemSet const *const pAttr, bool const bUpdate=true)
Definition: ndsect.cxx:151
bool DeleteTOX(const SwTOXBase &rTOXBase, bool bDelNodes)
Delete table of contents.
Definition: doctxm.cxx:524
sal_uInt16 GetTOXTypeCount(TOXTypes eTyp) const
Manage table of content types.
Definition: doctxm.cxx:611
constexpr TypedWhichId< SwFormatCharFormat > RES_TXTATR_CHARFMT(52)
bool IsProtectFlag() const
Definition: section.hxx:188
o3tl::sorted_vector< SwRootFrame * > GetAllLayouts()
Definition: doclay.cxx:1668
const OUString & GetSequenceName() const
Definition: tox.hxx:540
#define SO3_SC_CLASSID_60
SwSectionFormat * MakeSectionFormat()
Definition: ndsect.cxx:509
OUString ToUpper(const OUString &rStr, sal_Int32 nPos) const
Definition: txmsrt.cxx:96
#define SO3_SCH_CLASSID_60
SwTOOElements GetOLEOptions() const
Definition: tox.hxx:513
virtual bool DoesUndo() const =0
Is Undo enabled?
const char * sName
OUString maMSTOCExpression
Definition: tox.hxx:459
void SetProgressState(long nPosition, SwDocShell const *pDocShell)
Definition: mainwn.cxx:82
Specific frame formats (frames, DrawObjects).
sal_uInt16 GetSeqNumber() const
Definition: expfld.hxx:244
SwNode & GetEndOfContent() const
Regular ContentSection (i.e. the BodyText).
Definition: ndarr.hxx:163
#define SO3_SC_CLASSID_50
sal_uInt16 GetVirtPageNum() const
Definition: trvlfrm.cxx:1805
object index.
Definition: poolfmt.hxx:399
void UpdatePageNum()
Calculate PageNumber and insert after formatting.
Definition: doctxm.cxx:1589
PaM is Point and Mark: a selection of the document model.
Definition: pam.hxx:136
Range GetKeyRange(const OUString &rStr, const OUString &rStrReading, const SwTOXSortTabBase &rNew, sal_uInt16 nLevel, const Range &rRange)
Find Key Range and insert if possible.
Definition: doctxm.cxx:1960
const SwAttrSet * GetpSwAttrSet() const
Definition: node.hxx:443
bool Move(SwMoveFnCollection const &fnMove=fnMoveForward, SwGoInDoc fnGo=GoInContent)
Movement of cursor.
Definition: pam.cxx:501
static sal_Int32 GetReferenceTextPos(const SwFormatField &rFormat, SwDoc &rDoc, sal_Int32 nHint=0)
Find the index of the reference text following the current field.
Definition: expfld.cxx:968
#define SO3_SM_CLASSID_50
#define SO3_SCH_CLASSID_50
static SwTable * FindTable(SwFrameFormat const *const pFormat)
Definition: swtable.cxx:1922
virtual void AppendUndo(std::unique_ptr< SwUndo > pUndo)=0
Add new Undo action.
std::vector< std::unique_ptr< SwTOXSortTabBase > > m_aSortArr
Definition: doctxm.hxx:37
size_t Count() const
Definition: ndhints.hxx:142
void DeRegister()
deregister the currently registered History
Definition: ndhints.hxx:197
virtual SwUndoId StartUndo(SwUndoId const eUndoId, SwRewriter const *const pRewriter)=0
Opens undo block.
#define SAL_MAX_INT32
const SwContentFrame * GetFollow() const
Definition: cntfrm.hxx:114
SwTextAttr * Get(size_t nPos) const
Definition: ndhints.hxx:144
SwTOXBaseSection(SwTOXBase const &rBase, SwSectionFormat &rFormat)
Definition: doctxm.cxx:743
std::unique_ptr< SwTOXTypes > mpTOXTypes
Definition: doc.hxx:244
int i
SwTOXElement
Definition: tox.hxx:365
const SwStartNode * StartOfSectionNode() const
Definition: node.hxx:131
const OUString & GetSectionName() const
Definition: section.hxx:168
const SwPosition * GetPoint() const
Definition: pam.hxx:207
std::vector< SwSectionFormat * >::size_type size_type
Definition: docary.hxx:63
void UpdateOutline(const SwTextNode *pOwnChapterNode, SwRootFrame const *pLayout)
Generate table of contents from outline.
Definition: doctxm.cxx:1237
SwIndex & Assign(SwIndexReg *, sal_Int32)
Definition: index.cxx:206
const SwPageDesc & GetPageDesc(const size_t i) const
Definition: doc.hxx:878
void SetProtect(bool const bFlag=true)
Definition: section.cxx:379
virtual void SwClientNotify(const SwModify &rModify, const SfxHint &rHint) override
Definition: doctxm.cxx:1172
SwPageFrame * FindPageFrame()
Definition: frame.hxx:660
Text body.
Definition: poolfmt.hxx:250
TextFrameIndex MapModelToView(MergedPara const &, SwTextNode const *pNode, sal_Int32 nIndex)
Definition: txtfrm.cxx:1175
TElementType * First()
Definition: calbck.hxx:343
bool IsFromObjectNames() const
Definition: tox.hxx:531
bool IsHiddenFlag() const
Definition: section.hxx:187
virtual bool DeleteRedline(const SwPaM &rPam, bool bSaveInUndo, RedlineType nDelType)=0
SwPageDesc * GetPageDesc()
Definition: pagefrm.hxx:130
bool SetPosAtStartEnd(SwPosition &rPos) const
Definition: doctxm.cxx:755
SwContentNode * GetContentNode()
Definition: node.hxx:615
const SvxPageUsage aArr[]
#define SO3_SIMPRESS_CLASSID_40
SwDoc * GetDoc()
Definition: node.hxx:702
constexpr std::enable_if_t< std::is_signed_v< T >, std::make_unsigned_t< T > > make_unsigned(T value)
void UpdateNumRule()
Definition: docnum.cxx:2590
OUString GetText(SwRootFrame const *pLayout) const
Definition: tox.cxx:193
Marks a character position inside a document model node.
Definition: index.hxx:33
void UpdateTable(const SwTextNode *pOwnChapterNode, SwRootFrame const *pLayout)
Collect table entries.
Definition: doctxm.cxx:1536
const OUString & GetTypeName() const
Definition: tox.hxx:696
const SwTextNode * GetpTextNd() const
Definition: txttxmrk.hxx:44
IDocumentState const & getIDocumentState() const
Definition: doc.cxx:394
Definition: toxe.hxx:24
size
void GetTOIKeys(SwTOIKeyType eTyp, std::vector< OUString > &rArr, SwRootFrame const &rLayout) const
Definition: doctxm.cxx:85
const SwTOXInternational * pTOXIntl
Definition: txmsrt.hxx:129
Marks a node in the document model.
Definition: ndindex.hxx:31
const SwOutlineNodes & GetOutLineNds() const
Array of all OutlineNodes.
Definition: ndarr.hxx:231
SwNodes & GetNodes()
Node is in which nodes-array/doc?
Definition: node.hxx:693
SwTextFormatColl * GetTextFormatColl(sal_uInt16 nLevel)
Evaluate Template.
Definition: doctxm.cxx:1123
static std::enable_if<!std::is_array< T >::value, std::unique_ptr< T > >::type MakeSwTOXSortTabBase(SwRootFrame const *const pLayout, Args &&...args)
Definition: doctxm.cxx:78
OUString newName(const OUString &aNewPrefix, const OUString &aOldPrefix, const OUString &old_Name)
bool HasSwAttrSet() const
Definition: node.hxx:444
void Register(SwRegHistory *pHist)
register a History, which receives all attribute changes (for Undo)
Definition: ndhints.hxx:195
SectionType
Definition: section.hxx:45
void UpdateAuthorities(const SwTOXInternational &rIntl, SwRootFrame const *pLayout)
Definition: doctxm.cxx:1351
const SwDoc * GetDoc() const
The document is set in SwAttrPool now, therefore you always can access it.
Definition: format.hxx:119
bool IsFromChapter() const
Definition: tox.hxx:528
sal_uInt16 GetLevel() const
Definition: tox.hxx:740
A page of the document layout.
Definition: pagefrm.hxx:41
SwSectionNode * InsertTextSection(SwNodeIndex const &rNdIdx, SwSectionFormat &rSectionFormat, SwSectionData const &, SwTOXBase const *const pTOXBase, SwNodeIndex const *const pEnd, bool const bInsAtStart=true, bool const bCreateFrames=true)
Insert a new SwSection.
Definition: ndsect.cxx:786
const SwTOXMark & GotoTOXMark(const SwTOXMark &rCurTOXMark, SwTOXSearch eDir, bool bInReadOnly)
Definition: doctxm.cxx:228
const OUString & GetTitle() const
Definition: tox.hxx:710
virtual ~SwTOXBaseSection() override
Definition: doctxm.cxx:751
bool IsInReading() const
Definition: doc.hxx:951
IDocumentLayoutAccess const & getIDocumentLayoutAccess() const
Definition: doc.cxx:405
SwCaptionDisplay GetCaptionDisplay() const
Definition: tox.hxx:543
SwTable is one table in the document model, containing rows (which contain cells).
Definition: swtable.hxx:110
bool IsReadOnly() const
const sal_Unicode C_END_PAGE_NUM
Definition: tox.cxx:47
bool operator!=(const ScCsvLayoutData &rData1, const ScCsvLayoutData &rData2)
void UpdateSequence(const SwTextNode *pOwnChapterNode, SwRootFrame const *pLayout)
Generate content from sequence fields.
Definition: doctxm.cxx:1307
const OUString & GetSortAlgorithm() const
Definition: tox.hxx:554
void DeleteAttribute(SwTextAttr *const pTextAttr)
delete the attribute pTextAttr
Definition: thints.cxx:1666
user index 6..10.
Definition: poolfmt.hxx:411
virtual bool SetFormatAttr(const SfxPoolItem &rAttr)
Definition: format.cxx:458
std::unique_ptr< SwSectionFormats > mpSectionFormatTable
Definition: doc.hxx:239
void RestoreUpperFrames(SwNodes &rNds, sal_uLong nStt, sal_uLong nEnd)
Definition: node2lay.cxx:438
bool IsOleRef() const
To avoid unnecessary loading of object.
Definition: ndole.cxx:908
const SwTextNode & GetTextNode() const
Definition: txttxmrk.hxx:49
illustrations index.
Definition: poolfmt.hxx:395
void EraseText(const SwIndex &rIdx, const sal_Int32 nCount=SAL_MAX_INT32, const SwInsertFlags nMode=SwInsertFlags::DEFAULT)
delete text content ATTENTION: must not be called with a range that overlaps the start of an attribut...
Definition: ndtxt.cxx:2663
OUString InsertText(const OUString &rStr, const SwIndex &rIdx, const SwInsertFlags nMode=SwInsertFlags::DEFAULT)
insert text content
Definition: ndtxt.cxx:2280
SwCharFormat * FindCharFormatByName(const OUString &rName) const
Definition: doc.hxx:768
long Max() const
const css::lang::Locale & GetLocale(const LanguageType aLang)
Definition: breakit.hxx:67
sal_uLong EndOfSectionIndex() const
Definition: node.hxx:677
SwTextNode is a paragraph in the document model.
Definition: ndtxt.hxx:80
void DeleteTOXMark(const SwTOXMark *pTOXMark)
Delete table of contents Mark.
Definition: doctxm.cxx:154
static constexpr OUStringLiteral S_PAGE_DELI
Definition: tox.hxx:171
OUString sText
Definition: txmsrt.hxx:60
IDocumentRedlineAccess const & getIDocumentRedlineAccess() const
Definition: doc.cxx:335
bool IsRelTabPos() const
Definition: tox.hxx:344
#define SO3_SIMPRESS_CLASSID_50
void SetTOXName(const OUString &rSet)
Definition: tox.hxx:477
SwCharFormat * GetCharFormat() const
Definition: fchrfmt.hxx:70
const SwStartNode * GetSttNd() const
Definition: swtable.hxx:439
const SwTextNode * FindOutlineNodeOfLevel(sal_uInt8 nLvl, SwRootFrame const *pLayout=nullptr) const
Definition: node.cxx:768
virtual bool SetAttr(const SfxPoolItem &)
made virtual
Definition: node.cxx:1540
An SwTextAttr container, stores all directly formatted text portions for a text node.
Definition: ndhints.hxx:67
void InsertSorted(std::unique_ptr< SwTOXSortTabBase > pBase)
Definition: doctxm.cxx:1873
void Update(const SfxItemSet *pAttr=nullptr, SwRootFrame const *pLayout=nullptr, const bool _bNewTOX=false)
Collect table of contents content.
Definition: doctxm.cxx:770
OUString GetUniqueTOXBaseName(const SwTOXType &rType, const OUString &sChkStr) const
Definition: doctxm.cxx:636
void CorrAbs(const SwNodeIndex &rOldNode, const SwPosition &rNewPos, const sal_Int32 nOffset=0, bool bMoveCursor=false)
Definition: doccorr.cxx:167
bool IsFieldDeletedInModel(IDocumentRedlineAccess const &rIDRA, SwTextField const &rTextField)
OUString const & GetSecondaryKey() const
Definition: tox.hxx:646
static const SwTextNode * lcl_FindChapterNode(const SwNode &rNd, SwRootFrame const *const pLayout, sal_uInt8 const nLvl=0)
Definition: doctxm.cxx:721
unsigned char sal_uInt8
static sal_uInt16 GetCurTOXMark(const SwPosition &rPos, SwTOXMarks &)
Get current table of contents Mark.
Definition: doctxm.cxx:116
TOXTypes GetType() const
Definition: tox.hxx:731
const o3tl::enumarray< SvxAdjust, unsigned short > aSvxToUnoAdjust USHRT_MAX
Definition: unosett.cxx:254
SwMoveFnCollection const & fnMoveForward
SwPam::Move()/Find() default argument.
Definition: paminit.cxx:59
OUString const & GetStyleNames(sal_uInt16 nLevel) const
Definition: tox.hxx:518
#define SO3_SM_CLASSID_40
bool mbKeepExpression
Definition: tox.hxx:460
OUString aName
sal_Int32 GetIndex() const
Definition: index.hxx:91
OString DateTimeToOString(const DateTime &rDateTime)
LanguageType GetLanguage() const
Definition: tox.hxx:551
bool IsCommaSeparated() const
Definition: tox.hxx:347
SwNodes & GetNodes()
Definition: doc.hxx:403
virtual SwTextFormatColl * GetTextCollFromPool(sal_uInt16 nId, bool bRegardLanguage=true)=0
Return "Auto-Collection with ID.
::sw::DocumentSettingManager & GetDocumentSettingManager()
Definition: doc.cxx:186
const SwModify * GetRegisteredIn() const
Definition: calbck.hxx:157
const sal_Int32 * End() const
Definition: txatbase.hxx:148
SwTableBox is one table cell in the document model.
Definition: swtable.hxx:386
#define FORM_ALPHA_DELIMITER
Definition: tox.hxx:207
void PaMCorrAbs(const SwPaM &rRange, const SwPosition &rNewPos)
Function declarations so that everything below the CursorShell can move the Cursor once in a while...
Definition: doccorr.cxx:85
constexpr TypedWhichId< SwTOXMark > RES_TXTATR_TOXMARK(47)
#define FORM_ENTRY
Definition: tox.hxx:210
tables index.
Definition: poolfmt.hxx:403
bool IsHideRedlines() const
Replacement for sw::DocumentRedlineManager::GetRedlineFlags() (this is layout-level redline hiding)...
Definition: rootfrm.hxx:417
virtual bool AppendTextNode(SwPosition &rPos)=0
const OUString & GetMainEntryCharStyle() const
Definition: tox.hxx:497
TOXTypes GetType() const
Definition: tox.hxx:699
const SwAttrSet & GetSwAttrSet() const
Does node has already its own auto-attributes? Access to SwAttrSet.
Definition: node.hxx:723
SwMoveFnCollection const & fnMoveBackward
Definition: paminit.cxx:58
const char cSequenceMarkSeparator
Definition: swtypes.hxx:131
void UpdatePageNum_(SwTextNode *pNd, const std::vector< sal_uInt16 > &rNums, const std::vector< SwPageDesc * > &rDescs, const std::vector< sal_uInt16 > *pMainEntryNums, const SwTOXInternational &rIntl)
Definition: doctxm.cxx:1715
SwTableNode * FindTableNode()
Search table node, in which it is.
Definition: node.cxx:352
void ChgFormat(SwFormat &rFormat, const SfxItemSet &rSet)
Definition: docfmt.cxx:1860
void UpdateMarks(const SwTOXInternational &rIntl, const SwTextNode *pOwnChapterNode, SwRootFrame const *pLayout)
Create from Marks.
Definition: doctxm.cxx:1198
static SwTOIOptions GetOptions()
Definition: txmsrt.hxx:143
#define FORM_PRIMARY_KEY
Definition: tox.hxx:208
void DelFlyInRange(const SwNodeIndex &rMkNdIdx, const SwNodeIndex &rPtNdIdx, SwIndex const *const pMkIdx, SwIndex const *const pPtIdx)
Delete and move all Flys at the paragraph, that are within the selection.
Definition: docedt.cxx:203
bool IsDocNodes() const
Is the NodesArray the regular one of Doc? (and not the UndoNds, ...) Implementation in doc...
Definition: nodes.cxx:2324
Subgroup index tables.
Definition: poolfmt.hxx:366
Subgroup table of contents.
Definition: poolfmt.hxx:373
SwSectionNode * GetSectionNode()
Definition: node.hxx:607
const SwTextTOXMark * GetTextTOXMark() const
Definition: tox.hxx:162
long Min() const
SectionType GetType() const
Definition: section.hxx:170
const SwTOXType * GetTOXType(TOXTypes eTyp, sal_uInt16 nId) const
Definition: doctxm.cxx:620
const SwAttrSet & GetAttrSet() const
For querying the attribute array.
Definition: format.hxx:116
const SwFormatPageDesc & GetPageDesc(bool=true) const
Definition: fmtpdsc.hxx:79
const SwForm & GetTOXForm() const
Definition: tox.hxx:722
SwTextNode & GetTextNode() const
Definition: txtfld.hxx:53
const SwFormatCharFormat & GetCharFormat() const
Definition: txatbase.hxx:179
#define SO3_SDRAW_CLASSID_60
int GetAttrOutlineLevel() const
Definition: fmtcol.cxx:582
SwNode & GetEndOfExtras() const
This is the last EndNode of a special section.
Definition: ndarr.hxx:161
void SetDefaultTOXBase(const SwTOXBase &rBase)
Definition: doctxm.cxx:503
TextAndReading const & GetText() const
Definition: txmsrt.hxx:176
#define FORM_TITLE
Definition: tox.hxx:206
index of authorities.
Definition: poolfmt.hxx:407
sal_uInt16 const aBreakSetRange[]
Definition: init.cxx:141
void GetChildSections(SwSections &rArr, SectionSort eSort=SectionSort::Not, bool bAllSections=true) const
Definition: section.cxx:884
#define SO3_SM_CLASSID_30
virtual bool sort_lt(const SwTOXSortTabBase &)
Definition: txmsrt.cxx:223
Class for sorting directories.
Definition: txmsrt.hxx:120
bool operator==(const ScCsvLayoutData &rData1, const ScCsvLayoutData &rData2)
Merge GetRedlineMergeFlag() const
Definition: node.hxx:97
SwContentNode * GoNext(SwNodeIndex *) const
Definition: nodes.cxx:1288
void UpdateContent(SwTOXElement eType, const SwTextNode *pOwnChapterNode, SwRootFrame const *pLayout)
Definition: doctxm.cxx:1430
std::vector< SwTOXSource > aTOXSources
Definition: txmsrt.hxx:125
const SwTOXBase * GetDefaultTOXBase(TOXTypes eTyp, bool bCreate)
Definition: doctxm.cxx:477
sal_uInt16 nPos
bool IsLevelFromChapter() const
Definition: tox.hxx:534
const SwAttrPool & GetAttrPool() const
Definition: doc.hxx:1315
const OUString & GetTOXName() const
Definition: tox.hxx:476
SwTextNode * GetTextNode()
Inline methods from Node.hxx.
Definition: ndtxt.hxx:844
SwTextNode * MakeTextNode(const SwNodeIndex &rWhere, SwTextFormatColl *pColl, bool bNewFrames=true)
Implementations of "Make...Node" are in the given .cxx-files.
Definition: ndtxt.cxx:105
bool IsProtected() const
Is the Frame or rather the Section in which it lies protected?
Definition: trvlfrm.cxx:1627
Base class of the Writer document model elements.
Definition: node.hxx:79
SwTextFormatColl * GetTextColl() const
Definition: ndtxt.hxx:838