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 (!SwTOXBase::GetRegisteredIn()->HasWriterListeners() ||
775  !GetFormat())
776  {
777  return;
778  }
779  SwSectionNode const*const pSectNd(GetFormat()->GetSectionNode());
780  if (nullptr == pSectNd ||
781  !pSectNd->GetNodes().IsDocNodes() ||
782  IsHiddenFlag() ||
783  (pLayout->IsHideRedlines() && pSectNd->GetRedlineMergeFlag() == SwNode::Merge::Hidden))
784  {
785  return;
786  }
787 
788  if ( !mbKeepExpression )
789  {
790  maMSTOCExpression.clear();
791  }
792 
793  SwDoc* pDoc = const_cast<SwDoc*>(pSectNd->GetDoc());
794 
795  assert(pDoc); //Where is the document?
796 
797  if (pAttr && GetFormat())
798  pDoc->ChgFormat(*GetFormat(), *pAttr);
799 
800  // determine default page description, which will be used by the content nodes,
801  // if no appropriate one is found.
802  const SwPageDesc* pDefaultPageDesc;
803  {
804  pDefaultPageDesc =
805  pSectNd->GetSection().GetFormat()->GetPageDesc().GetPageDesc();
806  if ( !_bNewTOX && !pDefaultPageDesc )
807  {
808  // determine page description of table-of-content
809  size_t nPgDescNdIdx = pSectNd->GetIndex() + 1;
810  size_t* pPgDescNdIdx = &nPgDescNdIdx;
811  pDefaultPageDesc = pSectNd->FindPageDesc( pPgDescNdIdx );
812  if ( nPgDescNdIdx < pSectNd->GetIndex() )
813  {
814  pDefaultPageDesc = nullptr;
815  }
816  }
817  // consider end node of content section in the node array.
818  if ( !pDefaultPageDesc &&
819  ( pSectNd->EndOfSectionNode()->GetIndex() <
820  (pSectNd->GetNodes().GetEndOfContent().GetIndex() - 1) )
821  )
822  {
823  // determine page description of content after table-of-content
824  SwNodeIndex aIdx( *(pSectNd->EndOfSectionNode()) );
825  const SwContentNode* pNdAfterTOX = pSectNd->GetNodes().GoNext( &aIdx );
826  const SwAttrSet& aNdAttrSet = pNdAfterTOX->GetSwAttrSet();
827  const SvxBreak eBreak = aNdAttrSet.GetBreak().GetBreak();
828  if ( eBreak != SvxBreak::PageBefore && eBreak != SvxBreak::PageBoth )
829  {
830  pDefaultPageDesc = pNdAfterTOX->FindPageDesc();
831  }
832  }
833  // consider start node of content section in the node array.
834  if ( !pDefaultPageDesc &&
835  ( pSectNd->GetIndex() >
836  (pSectNd->GetNodes().GetEndOfContent().StartOfSectionIndex() + 1) )
837  )
838  {
839  // determine page description of content before table-of-content
840  SwNodeIndex aIdx( *pSectNd );
841  pDefaultPageDesc =
842  SwNodes::GoPrevious( &aIdx )->FindPageDesc();
843 
844  }
845  if ( !pDefaultPageDesc )
846  {
847  // determine default page description
848  pDefaultPageDesc = &pDoc->GetPageDesc( 0 );
849  }
850  }
851 
852  pDoc->getIDocumentState().SetModified();
853 
854  // get current Language
856  TOX_INDEX == GetTOXType()->GetType() ?
858  GetSortAlgorithm() );
859 
860  m_aSortArr.clear();
861 
862  // find the first layout node for this TOX, if it only find the content
863  // in his own chapter
864  const SwTextNode* pOwnChapterNode = IsFromChapter()
865  ? ::lcl_FindChapterNode( *pSectNd, pLayout )
866  : nullptr;
867 
868  SwNode2LayoutSaveUpperFrames aN2L(*pSectNd);
869  const_cast<SwSectionNode*>(pSectNd)->DelFrames();
870 
871  // This would be a good time to update the Numbering
872  pDoc->UpdateNumRule();
873 
875  UpdateMarks( aIntl, pOwnChapterNode, pLayout );
876 
878  UpdateOutline( pOwnChapterNode, pLayout );
879 
881  UpdateTemplate( pOwnChapterNode, pLayout );
882 
885  UpdateContent( SwTOXElement::Ole, pOwnChapterNode, pLayout );
886 
889  UpdateTable( pOwnChapterNode, pLayout );
890 
893  UpdateContent( SwTOXElement::Graphic, pOwnChapterNode, pLayout );
894 
895  if( !GetSequenceName().isEmpty() && !IsFromObjectNames() &&
898  UpdateSequence( pOwnChapterNode, pLayout );
899 
901  UpdateContent( SwTOXElement::Frame, pOwnChapterNode, pLayout );
902 
904  UpdateAuthorities( aIntl, pLayout );
905 
906  // Insert AlphaDelimiters if needed (just for keywords)
907  if( TOX_INDEX == SwTOXBase::GetType() &&
909  InsertAlphaDelimiter( aIntl );
910 
911  // remove old content an insert one empty textnode (to hold the layout!)
912  SwTextNode* pFirstEmptyNd;
913 
914  SwUndoUpdateIndex * pUndo(nullptr);
915  {
916  pDoc->getIDocumentRedlineAccess().DeleteRedline( *pSectNd, true, RedlineType::Any );
917 
918  SwNodeIndex aSttIdx( *pSectNd, +1 );
919  SwNodeIndex aEndIdx( *pSectNd->EndOfSectionNode() );
920  pFirstEmptyNd = pDoc->GetNodes().MakeTextNode( aEndIdx,
922 
923  {
924  // Task 70995 - save and restore PageDesc and Break Attributes
925  SwNodeIndex aNxtIdx( aSttIdx );
926  const SwContentNode* pCNd = aNxtIdx.GetNode().GetContentNode();
927  if( !pCNd )
928  pCNd = pDoc->GetNodes().GoNext( &aNxtIdx );
929  assert(pCNd != pFirstEmptyNd);
930  assert(pCNd->GetIndex() < pFirstEmptyNd->GetIndex());
931  if( pCNd->HasSwAttrSet() )
932  {
933  SfxItemSet aBrkSet( pDoc->GetAttrPool(), aBreakSetRange );
934  aBrkSet.Put( *pCNd->GetpSwAttrSet() );
935  if( aBrkSet.Count() )
936  pFirstEmptyNd->SetAttr( aBrkSet );
937  }
938  }
939 
940  if (pDoc->GetIDocumentUndoRedo().DoesUndo())
941  {
942  // note: this will first append a SwUndoDelSection from the ctor...
943  pUndo = new SwUndoUpdateIndex(*this);
944  // tdf#123313 insert Undo *after* all CrossRefBookmark Undos have
945  // been inserted by the Update*() functions
946  pDoc->GetIDocumentUndoRedo().AppendUndo(std::unique_ptr<SwUndoUpdateIndex>(pUndo));
947  }
948  else
949  {
950  --aEndIdx;
951  SwPosition aPos( aEndIdx, SwIndex( pFirstEmptyNd, 0 ));
952  SwDoc::CorrAbs( aSttIdx, aEndIdx, aPos, true );
953 
954  // delete flys in whole range including start node which requires
955  // giving the node before start node as Mark parameter, hence -1.
956  // (flys must be deleted because the anchor nodes are removed)
957  DelFlyInRange( SwNodeIndex(aSttIdx, -1), aEndIdx );
958 
959  pDoc->GetNodes().Delete( aSttIdx, aEndIdx.GetIndex() - aSttIdx.GetIndex() );
960  }
961  }
962 
963  // insert title of TOX
964  if ( !GetTitle().isEmpty() )
965  {
966  // then insert the headline section
967  SwNodeIndex aIdx( *pSectNd, +1 );
968 
969  SwTextNode* pHeadNd = pDoc->GetNodes().MakeTextNode( aIdx,
971  pHeadNd->InsertText( GetTitle(), SwIndex( pHeadNd ) );
972 
973  SwSectionData headerData( SectionType::ToxHeader, GetTOXName()+"_Head" );
974 
975  SwNodeIndex aStt( *pHeadNd ); --aIdx;
976  SwSectionFormat* pSectFormat = pDoc->MakeSectionFormat();
977  pDoc->GetNodes().InsertTextSection(
978  aStt, *pSectFormat, headerData, nullptr, &aIdx, true, false);
979 
980  if (pUndo)
981  {
982  pUndo->TitleSectionInserted(*pSectFormat);
983  }
984  }
985 
986  // Sort the List of all TOC Marks and TOC Sections
987  std::vector<SwTextFormatColl*> aCollArr( GetTOXForm().GetFormMax(), nullptr );
988  SwNodeIndex aInsPos( *pFirstEmptyNd, 1 );
989  for( size_t nCnt = 0; nCnt < m_aSortArr.size(); ++nCnt )
990  {
991  ::SetProgressState( 0, pDoc->GetDocShell() );
992 
993  // Put the Text into the TOC
994  sal_uInt16 nLvl = m_aSortArr[ nCnt ]->GetLevel();
995  SwTextFormatColl* pColl = aCollArr[ nLvl ];
996  if( !pColl )
997  {
998  pColl = GetTextFormatColl( nLvl );
999  aCollArr[ nLvl ] = pColl;
1000  }
1001 
1002  // Generate: Set dynamic TabStops
1003  SwTextNode* pTOXNd = pDoc->GetNodes().MakeTextNode( aInsPos , pColl );
1004  m_aSortArr[ nCnt ]->pTOXNd = pTOXNd;
1005 
1006  // Generate: Evaluate Form and insert the place holder for the
1007  // page number. If it is a TOX_INDEX and the SwForm IsCommaSeparated()
1008  // then a range of entries must be generated into one paragraph
1009  size_t nRange = 1;
1010  if(TOX_INDEX == SwTOXBase::GetType() &&
1011  GetTOXForm().IsCommaSeparated() &&
1012  m_aSortArr[nCnt]->GetType() == TOX_SORT_INDEX)
1013  {
1014  const SwTOXMark& rMark = m_aSortArr[nCnt]->pTextMark->GetTOXMark();
1015  const OUString& sPrimKey = rMark.GetPrimaryKey();
1016  const OUString& sSecKey = rMark.GetSecondaryKey();
1017  const SwTOXMark* pNextMark = nullptr;
1018  while(m_aSortArr.size() > (nCnt + nRange) &&
1019  m_aSortArr[nCnt + nRange]->GetType() == TOX_SORT_INDEX )
1020  {
1021  pNextMark = &(m_aSortArr[nCnt + nRange]->pTextMark->GetTOXMark());
1022  if( !pNextMark ||
1023  pNextMark->GetPrimaryKey() != sPrimKey ||
1024  pNextMark->GetSecondaryKey() != sSecKey)
1025  break;
1026  nRange++;
1027  }
1028  }
1029  // pass node index of table-of-content section and default page description
1030  // to method <GenerateText(..)>.
1031  ::SetProgressState( 0, pDoc->GetDocShell() );
1032 
1033  std::shared_ptr<sw::ToxTabStopTokenHandler> tabStopTokenHandler =
1034  std::make_shared<sw::DefaultToxTabStopTokenHandler>(
1035  pSectNd->GetIndex(), *pDefaultPageDesc, GetTOXForm().IsRelTabPos(),
1039  sw::ToxTextGenerator ttgn(GetTOXForm(), tabStopTokenHandler);
1040  ttgn.GenerateText(GetFormat()->GetDoc(), m_aSortArr, nCnt, nRange, pLayout);
1041  nCnt += nRange - 1;
1042  }
1043 
1044  // delete the first dummy node and remove all Cursor into the previous node
1045  aInsPos = *pFirstEmptyNd;
1046  {
1047  SwPaM aCorPam( *pFirstEmptyNd );
1048  aCorPam.GetPoint()->nContent.Assign( pFirstEmptyNd, 0 );
1049  if( !aCorPam.Move( fnMoveForward ) )
1050  aCorPam.Move( fnMoveBackward );
1051  SwNodeIndex aEndIdx( aInsPos, 1 );
1052  SwDoc::CorrAbs( aInsPos, aEndIdx, *aCorPam.GetPoint(), true );
1053 
1054  // Task 70995 - save and restore PageDesc and Break Attributes
1055  if( pFirstEmptyNd->HasSwAttrSet() )
1056  {
1057  if( !GetTitle().isEmpty() )
1058  aEndIdx = *pSectNd;
1059  else
1060  aEndIdx = *pFirstEmptyNd;
1061  SwContentNode* pCNd = pDoc->GetNodes().GoNext( &aEndIdx );
1062  if( pCNd ) // Robust against defect documents, e.g. i60336
1063  pCNd->SetAttr( *pFirstEmptyNd->GetpSwAttrSet() );
1064  }
1065  }
1066 
1067  // now create the new Frames
1068  sal_uLong nIdx = pSectNd->GetIndex();
1069  // don't delete if index is empty
1070  if(nIdx + 2 < pSectNd->EndOfSectionIndex())
1071  pDoc->GetNodes().Delete( aInsPos );
1072 
1073  aN2L.RestoreUpperFrames( pDoc->GetNodes(), nIdx, nIdx + 1 );
1074  o3tl::sorted_vector<SwRootFrame*> aAllLayouts = pDoc->GetAllLayouts();
1075  for ( const auto& rpLayout : aAllLayouts )
1076  {
1077  SwFrame::CheckPageDescs( static_cast<SwPageFrame*>(rpLayout->Lower()) );
1078  }
1079 
1081 }
1082 
1084 {
1085  SwDoc* pDoc = GetFormat()->GetDoc();
1086  OUString sLastDeli;
1087  size_t i = 0;
1088  while( i < m_aSortArr.size() )
1089  {
1090  ::SetProgressState( 0, pDoc->GetDocShell() );
1091 
1092  sal_uInt16 nLevel = m_aSortArr[i]->GetLevel();
1093 
1094  // Skip AlphaDelimiter
1095  if( nLevel == FORM_ALPHA_DELIMITER )
1096  continue;
1097 
1098  const OUString sDeli = rIntl.GetIndexKey( m_aSortArr[i]->GetText(),
1099  m_aSortArr[i]->GetLocale() );
1100 
1101  // Do we already have a Delimiter?
1102  if( !sDeli.isEmpty() && sLastDeli != sDeli )
1103  {
1104  // We skip all that are less than a small Blank (these are special characters)
1105  if( ' ' <= sDeli[0] )
1106  {
1107  std::unique_ptr<SwTOXCustom> pCst(
1108  MakeSwTOXSortTabBase<SwTOXCustom>(nullptr,
1109  TextAndReading(sDeli, OUString()),
1111  rIntl, m_aSortArr[i]->GetLocale() ));
1112  m_aSortArr.insert( m_aSortArr.begin() + i, std::move(pCst));
1113  i++;
1114  }
1115  sLastDeli = sDeli;
1116  }
1117 
1118  // Skip until we get to the same or a lower Level
1119  do {
1120  i++;
1121  } while (i < m_aSortArr.size() && m_aSortArr[i]->GetLevel() > nLevel);
1122  }
1123 }
1124 
1127 {
1128  SwDoc* pDoc = GetFormat()->GetDoc();
1129  const OUString& rName = GetTOXForm().GetTemplate( nLevel );
1130  SwTextFormatColl* pColl = !rName.isEmpty() ? pDoc->FindTextFormatCollByName(rName) :nullptr;
1131  if( !pColl )
1132  {
1133  sal_uInt16 nPoolFormat = 0;
1134  const TOXTypes eMyType = SwTOXBase::GetType();
1135  switch( eMyType )
1136  {
1137  case TOX_INDEX: nPoolFormat = RES_POOLCOLL_TOX_IDXH; break;
1138  case TOX_USER:
1139  if( nLevel < 6 )
1140  nPoolFormat = RES_POOLCOLL_TOX_USERH;
1141  else
1142  nPoolFormat = RES_POOLCOLL_TOX_USER6 - 6;
1143  break;
1144  case TOX_ILLUSTRATIONS: nPoolFormat = RES_POOLCOLL_TOX_ILLUSH; break;
1145  case TOX_OBJECTS: nPoolFormat = RES_POOLCOLL_TOX_OBJECTH; break;
1146  case TOX_TABLES: nPoolFormat = RES_POOLCOLL_TOX_TABLESH; break;
1147  case TOX_AUTHORITIES:
1148  case TOX_BIBLIOGRAPHY:
1149  nPoolFormat = RES_POOLCOLL_TOX_AUTHORITIESH; break;
1150  case TOX_CITATION: break;
1151  case TOX_CONTENT:
1152  // There's a jump in the ContentArea!
1153  if( nLevel < 6 )
1154  nPoolFormat = RES_POOLCOLL_TOX_CNTNTH;
1155  else
1156  nPoolFormat = RES_POOLCOLL_TOX_CNTNT6 - 6;
1157  break;
1158  }
1159 
1160  if(eMyType == TOX_AUTHORITIES && nLevel)
1161  nPoolFormat = nPoolFormat + 1;
1162  else if(eMyType == TOX_INDEX && nLevel)
1163  {
1164  // pool: Level 1,2,3, Delimiter
1165  // SwForm: Delimiter, Level 1,2,3
1166  nPoolFormat += 1 == nLevel ? nLevel + 3 : nLevel - 1;
1167  }
1168  else
1169  nPoolFormat = nPoolFormat + nLevel;
1170  pColl = pDoc->getIDocumentStylePoolAccess().GetTextCollFromPool( nPoolFormat );
1171  }
1172  return pColl;
1173 }
1174 
1177  const SwTextNode* pOwnChapterNode,
1178  SwRootFrame const*const pLayout)
1179 {
1180  const SwTOXType* pType = static_cast<SwTOXType*>( SwTOXBase::GetRegisteredIn() );
1181  if( !pType->HasWriterListeners() )
1182  return;
1183 
1184  SwDoc* pDoc = GetFormat()->GetDoc();
1185  TOXTypes eTOXTyp = GetTOXType()->GetType();
1186  SwIterator<SwTOXMark,SwTOXType> aIter( *pType );
1187 
1188  for (SwTOXMark* pMark = aIter.First(); pMark; pMark = aIter.Next())
1189  {
1190  ::SetProgressState( 0, pDoc->GetDocShell() );
1191 
1192  if (pMark->GetTOXType()->GetType() == eTOXTyp)
1193  {
1194  SwTextTOXMark *const pTextMark(pMark->GetTextTOXMark());
1195  if (nullptr == pTextMark)
1196  continue;
1197  const SwTextNode* pTOXSrc = pTextMark->GetpTextNd();
1198  // Only insert TOXMarks from the Doc, not from the
1199  // UNDO.
1200 
1201  // If selected use marks from the same chapter only
1202  if( pTOXSrc->GetNodes().IsDocNodes() &&
1203  pTOXSrc->GetText().getLength() && pTOXSrc->HasWriterListeners() &&
1205  (!IsFromChapter() || ::lcl_FindChapterNode(*pTOXSrc, pLayout) == pOwnChapterNode) &&
1206  !pTOXSrc->IsHiddenByParaField() &&
1207  !SwScriptInfo::IsInHiddenRange(*pTOXSrc, pTextMark->GetStart()) &&
1208  (!pLayout || !pLayout->IsHideRedlines()
1209  || !sw::IsMarkHintHidden(*pLayout, *pTOXSrc, *pTextMark)))
1210  {
1211  if(TOX_INDEX == eTOXTyp)
1212  {
1213  // index entry mark
1214  assert(g_pBreakIt);
1215  lang::Locale aLocale = g_pBreakIt->GetLocale(pTOXSrc->GetLang(pTextMark->GetStart()));
1216 
1217  InsertSorted(MakeSwTOXSortTabBase<SwTOXIndex>(pLayout, *pTOXSrc, pTextMark,
1218  GetOptions(), FORM_ENTRY, rIntl, aLocale ));
1220  !pTextMark->GetTOXMark().GetPrimaryKey().isEmpty())
1221  {
1222  InsertSorted(MakeSwTOXSortTabBase<SwTOXIndex>(pLayout, *pTOXSrc, pTextMark,
1223  GetOptions(), FORM_PRIMARY_KEY, rIntl, aLocale ));
1224  if (!pTextMark->GetTOXMark().GetSecondaryKey().isEmpty())
1225  {
1226  InsertSorted(MakeSwTOXSortTabBase<SwTOXIndex>(pLayout, *pTOXSrc, pTextMark,
1227  GetOptions(), FORM_SECONDARY_KEY, rIntl, aLocale ));
1228  }
1229  }
1230  }
1231  else if( TOX_USER == eTOXTyp ||
1232  pMark->GetLevel() <= GetLevel())
1233  { // table of content mark
1234  // also used for user marks
1235  InsertSorted(MakeSwTOXSortTabBase<SwTOXContent>(pLayout, *pTOXSrc, pTextMark, rIntl));
1236  }
1237  }
1238  }
1239  }
1240 }
1241 
1243 void SwTOXBaseSection::UpdateOutline( const SwTextNode* pOwnChapterNode,
1244  SwRootFrame const*const pLayout)
1245 {
1246  SwDoc* pDoc = GetFormat()->GetDoc();
1247  SwNodes& rNds = pDoc->GetNodes();
1248 
1249  const SwOutlineNodes& rOutlNds = rNds.GetOutLineNds();
1250  for( auto pOutlineNode : rOutlNds )
1251  {
1252  ::SetProgressState( 0, pDoc->GetDocShell() );
1253  SwTextNode* pTextNd = pOutlineNode->GetTextNode();
1254  if( pTextNd && pTextNd->Len() && pTextNd->HasWriterListeners() &&
1255  o3tl::make_unsigned( pTextNd->GetAttrOutlineLevel()) <= GetLevel() &&
1256  pTextNd->getLayoutFrame(pLayout) &&
1257  !pTextNd->IsHiddenByParaField() &&
1258  !pTextNd->HasHiddenCharAttribute( true ) &&
1259  (!pLayout || !pLayout->IsHideRedlines()
1260  || static_cast<SwTextFrame*>(pTextNd->getLayoutFrame(pLayout))->GetTextNodeForParaProps() == pTextNd) &&
1261  ( !IsFromChapter() ||
1262  ::lcl_FindChapterNode(*pTextNd, pLayout) == pOwnChapterNode ))
1263  {
1264  InsertSorted(MakeSwTOXSortTabBase<SwTOXPara>(pLayout, *pTextNd, SwTOXElement::OutlineLevel));
1265  }
1266  }
1267 }
1268 
1270 void SwTOXBaseSection::UpdateTemplate(const SwTextNode* pOwnChapterNode,
1271  SwRootFrame const*const pLayout)
1272 {
1273  SwDoc* pDoc = GetFormat()->GetDoc();
1274  for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
1275  {
1276  const OUString sTmpStyleNames = GetStyleNames(i);
1277  if (sTmpStyleNames.isEmpty())
1278  continue;
1279 
1280  sal_Int32 nIndex = 0;
1281  while (nIndex >= 0)
1282  {
1284  sTmpStyleNames.getToken( 0, TOX_STYLE_DELIMITER, nIndex ));
1285  //TODO: no outline Collections in content indexes if OutlineLevels are already included
1286  if( !pColl ||
1290  continue;
1291 
1292  SwIterator<SwTextNode,SwFormatColl> aIter( *pColl );
1293  for( SwTextNode* pTextNd = aIter.First(); pTextNd; pTextNd = aIter.Next() )
1294  {
1295  ::SetProgressState( 0, pDoc->GetDocShell() );
1296 
1297  if (pTextNd->GetText().getLength() &&
1298  pTextNd->getLayoutFrame(pLayout) &&
1299  pTextNd->GetNodes().IsDocNodes() &&
1300  (!pLayout || !pLayout->IsHideRedlines()
1301  || static_cast<SwTextFrame*>(pTextNd->getLayoutFrame(pLayout))->GetTextNodeForParaProps() == pTextNd) &&
1302  (!IsFromChapter() || pOwnChapterNode ==
1303  ::lcl_FindChapterNode(*pTextNd, pLayout)))
1304  {
1305  InsertSorted(MakeSwTOXSortTabBase<SwTOXPara>(pLayout, *pTextNd, SwTOXElement::Template, i + 1));
1306  }
1307  }
1308  }
1309  }
1310 }
1311 
1313 void SwTOXBaseSection::UpdateSequence(const SwTextNode* pOwnChapterNode,
1314  SwRootFrame const*const pLayout)
1315 {
1316  SwDoc* pDoc = GetFormat()->GetDoc();
1318  if(!pSeqField)
1319  return;
1320 
1321  std::vector<SwFormatField*> vFields;
1322  pSeqField->GatherFields(vFields);
1323  for(auto pFormatField: vFields)
1324  {
1325  const SwTextField* pTextField = pFormatField->GetTextField();
1326  SwTextNode& rTextNode = pTextField->GetTextNode();
1327  ::SetProgressState( 0, pDoc->GetDocShell() );
1328 
1329  if (rTextNode.GetText().getLength() &&
1330  rTextNode.getLayoutFrame(pLayout) &&
1331  ( !IsFromChapter() ||
1332  ::lcl_FindChapterNode(rTextNode, pLayout) == pOwnChapterNode)
1333  && (!pLayout || !pLayout->IsHideRedlines()
1334  || !sw::IsFieldDeletedInModel(pDoc->getIDocumentRedlineAccess(), *pTextField)))
1335  {
1336  const SwSetExpField& rSeqField = dynamic_cast<const SwSetExpField&>(*(pFormatField->GetField()));
1337  const OUString sName = GetSequenceName()
1338  + OUStringChar(cSequenceMarkSeparator)
1339  + OUString::number( rSeqField.GetSeqNumber() );
1340  std::unique_ptr<SwTOXPara> pNew(new SwTOXPara( rTextNode, SwTOXElement::Sequence, 1, sName ));
1341  // set indexes if the number or the reference text are to be displayed
1342  if( GetCaptionDisplay() == CAPTION_TEXT )
1343  {
1344  pNew->SetStartIndex(
1345  SwGetExpField::GetReferenceTextPos( *pFormatField, *pDoc ));
1346  }
1347  else if(GetCaptionDisplay() == CAPTION_NUMBER)
1348  {
1349  pNew->SetEndIndex(pTextField->GetStart() + 1);
1350  }
1351  pNew->InitText(pLayout);
1352  InsertSorted(std::move(pNew));
1353  }
1354  }
1355 }
1356 
1358  SwRootFrame const*const pLayout)
1359 {
1360  SwDoc* pDoc = GetFormat()->GetDoc();
1361  SwFieldType* pAuthField = pDoc->getIDocumentFieldsAccess().GetFieldType(SwFieldIds::TableOfAuthorities, OUString(), false);
1362  if(!pAuthField)
1363  return;
1364 
1365  std::vector<SwFormatField*> vFields;
1366  pAuthField->GatherFields(vFields);
1367  for(auto pFormatField: vFields)
1368  {
1369  const auto pTextField = pFormatField->GetTextField();
1370  const SwTextNode& rTextNode = pFormatField->GetTextField()->GetTextNode();
1371  ::SetProgressState( 0, pDoc->GetDocShell() );
1372 
1373  if (rTextNode.GetText().getLength() &&
1374  rTextNode.getLayoutFrame(pLayout) &&
1375  (!pLayout || !pLayout->IsHideRedlines()
1376  || !sw::IsFieldDeletedInModel(pDoc->getIDocumentRedlineAccess(), *pTextField)))
1377  {
1378  //#106485# the body node has to be used!
1379  SwContentFrame *const pFrame = rTextNode.getLayoutFrame(pLayout);
1380  SwPosition aFieldPos(rTextNode);
1381  const SwTextNode* pTextNode = nullptr;
1382  if(pFrame && !pFrame->IsInDocBody())
1383  pTextNode = GetBodyTextNode( *pDoc, aFieldPos, *pFrame );
1384  if(!pTextNode)
1385  pTextNode = &rTextNode;
1386 
1387  InsertSorted(MakeSwTOXSortTabBase<SwTOXAuthority>(pLayout, *pTextNode, *pFormatField, rIntl));
1388  }
1389  }
1390 }
1391 
1392 static SwTOOElements lcl_IsSOObject( const SvGlobalName& rFactoryNm )
1393 {
1394  static const struct SoObjType {
1395  SwTOOElements nFlag;
1396  // GlobalNameId
1397  struct {
1398  sal_uInt32 n1;
1399  sal_uInt16 n2, n3;
1400  sal_uInt8 b8, b9, b10, b11, b12, b13, b14, b15;
1401  } aGlNmIds[4];
1402  } aArr[] = {
1417  };
1418 
1419  for( SoObjType const & rArr : aArr )
1420  for (auto & rId : rArr.aGlNmIds)
1421  {
1422  if( !rId.n1 )
1423  break;
1424  SvGlobalName aGlbNm( rId.n1, rId.n2, rId.n3,
1425  rId.b8, rId.b9, rId.b10, rId.b11,
1426  rId.b12, rId.b13, rId.b14, rId.b15 );
1427  if( rFactoryNm == aGlbNm )
1428  {
1429  return rArr.nFlag;
1430  }
1431  }
1432 
1433  return SwTOOElements::NONE;
1434 }
1435 
1437  const SwTextNode* pOwnChapterNode,
1438  SwRootFrame const*const pLayout)
1439 {
1440  SwDoc* pDoc = GetFormat()->GetDoc();
1441  SwNodes& rNds = pDoc->GetNodes();
1442  // on the 1st Node of the 1st Section
1443  sal_uLong nIdx = rNds.GetEndOfAutotext().StartOfSectionIndex() + 2,
1444  nEndIdx = rNds.GetEndOfAutotext().GetIndex();
1445 
1446  while( nIdx < nEndIdx )
1447  {
1448  ::SetProgressState( 0, pDoc->GetDocShell() );
1449 
1450  SwNode* pNd = rNds[ nIdx ];
1451  SwContentNode* pCNd = nullptr;
1452  switch( eMyType )
1453  {
1454  case SwTOXElement::Frame:
1455  if( !pNd->IsNoTextNode() )
1456  {
1457  pCNd = pNd->GetContentNode();
1458  if( !pCNd )
1459  {
1460  SwNodeIndex aTmp( *pNd );
1461  pCNd = rNds.GoNext( &aTmp );
1462  }
1463  }
1464  break;
1465  case SwTOXElement::Graphic:
1466  if( pNd->IsGrfNode() )
1467  pCNd = static_cast<SwContentNode*>(pNd);
1468  break;
1469  case SwTOXElement::Ole:
1470  if( pNd->IsOLENode() )
1471  {
1472  bool bInclude = true;
1474  {
1475  SwOLENode* pOLENode = pNd->GetOLENode();
1476  SwTOOElements nMyOLEOptions = GetOLEOptions();
1477  SwOLEObj& rOLEObj = pOLENode->GetOLEObj();
1478 
1479  if( rOLEObj.IsOleRef() ) // Not yet loaded
1480  {
1481  SvGlobalName aTmpName( rOLEObj.GetOleRef()->getClassID() );
1482  SwTOOElements nObj = ::lcl_IsSOObject( aTmpName );
1483  bInclude = ( (nMyOLEOptions & SwTOOElements::Other) && SwTOOElements::NONE == nObj )
1484  || (nMyOLEOptions & nObj);
1485  }
1486  else
1487  {
1488  OSL_FAIL("OLE Object no loaded?");
1489  bInclude = false;
1490  }
1491  }
1492 
1493  if(bInclude)
1494  pCNd = static_cast<SwContentNode*>(pNd);
1495  }
1496  break;
1497  default: break;
1498  }
1499 
1500  if( pCNd )
1501  {
1502  // find node in body text
1503  int nSetLevel = USHRT_MAX;
1504 
1505  //#111105# tables of tables|illustrations|objects don't support hierarchies
1506  if( IsLevelFromChapter() &&
1510  {
1511  const SwTextNode* pOutlNd = ::lcl_FindChapterNode( *pCNd,
1512  pLayout, MAXLEVEL - 1);
1513  if( pOutlNd )
1514  {
1516  {
1517  nSetLevel = pOutlNd->GetTextColl()->GetAttrOutlineLevel();
1518  }
1519  }
1520  }
1521 
1522  if (pCNd->getLayoutFrame(pLayout)
1523  && (!pLayout || !pLayout->IsHideRedlines()
1525  && ( !IsFromChapter() ||
1526  ::lcl_FindChapterNode(*pCNd, pLayout) == pOwnChapterNode ))
1527  {
1528  std::unique_ptr<SwTOXPara> pNew( MakeSwTOXSortTabBase<SwTOXPara>(
1529  pLayout, *pCNd, eMyType,
1530  ( USHRT_MAX != nSetLevel )
1531  ? static_cast<sal_uInt16>(nSetLevel)
1532  : FORM_ALPHA_DELIMITER ) );
1533  InsertSorted( std::move(pNew) );
1534  }
1535  }
1536 
1537  nIdx = pNd->StartOfSectionNode()->EndOfSectionIndex() + 2; // 2 == End/Start Node
1538  }
1539 }
1540 
1542 void SwTOXBaseSection::UpdateTable(const SwTextNode* pOwnChapterNode,
1543  SwRootFrame const*const pLayout)
1544 {
1545  SwDoc* pDoc = GetFormat()->GetDoc();
1546  SwNodes& rNds = pDoc->GetNodes();
1547  const SwFrameFormats& rArr = *pDoc->GetTableFrameFormats();
1548 
1549  for( auto pFrameFormat : rArr )
1550  {
1551  ::SetProgressState( 0, pDoc->GetDocShell() );
1552 
1553  SwTable* pTmpTable = SwTable::FindTable( pFrameFormat );
1554  SwTableBox* pFBox;
1555  if( pTmpTable && nullptr != (pFBox = pTmpTable->GetTabSortBoxes()[0] ) &&
1556  pFBox->GetSttNd() && pFBox->GetSttNd()->GetNodes().IsDocNodes() )
1557  {
1558  const SwTableNode* pTableNd = pFBox->GetSttNd()->FindTableNode();
1559  SwNodeIndex aContentIdx( *pTableNd, 1 );
1560 
1561  SwContentNode* pCNd;
1562  while( nullptr != ( pCNd = rNds.GoNext( &aContentIdx ) ) &&
1563  aContentIdx.GetIndex() < pTableNd->EndOfSectionIndex() )
1564  {
1565  if (pCNd->getLayoutFrame(pLayout)
1566  && (!pLayout || !pLayout->IsHideRedlines()
1568  && (!IsFromChapter()
1569  || ::lcl_FindChapterNode(*pCNd, pLayout) == pOwnChapterNode))
1570  {
1571  std::unique_ptr<SwTOXTable> pNew(new SwTOXTable( *pCNd ));
1573  {
1574  const SwTextNode* pOutlNd =
1575  ::lcl_FindChapterNode(*pCNd, pLayout, MAXLEVEL - 1);
1576  if( pOutlNd )
1577  {
1579  {
1580  const int nTmp = pOutlNd->GetTextColl()->GetAttrOutlineLevel();
1581  pNew->SetLevel(static_cast<sal_uInt16>(nTmp));
1582  }
1583  }
1584  }
1585  pNew->InitText(pLayout);
1586  InsertSorted(std::move(pNew));
1587  break;
1588  }
1589  }
1590  }
1591  }
1592 }
1593 
1596 {
1597  if( m_aSortArr.empty() )
1598  return ;
1599 
1600  // Insert the current PageNumber into the TOC
1601  SwPageFrame* pCurrentPage = nullptr;
1602  sal_uInt16 nPage = 0;
1603  SwDoc* pDoc = GetFormat()->GetDoc();
1604 
1606  TOX_INDEX == GetTOXType()->GetType() ?
1608  GetSortAlgorithm() );
1609 
1610  for( size_t nCnt = 0; nCnt < m_aSortArr.size(); ++nCnt )
1611  {
1612  // Loop over all SourceNodes
1613 
1614  // process run in lines
1615  size_t nRange = 0;
1616  if(GetTOXForm().IsCommaSeparated() &&
1617  m_aSortArr[nCnt]->GetType() == TOX_SORT_INDEX)
1618  {
1619  const SwTOXMark& rMark = m_aSortArr[nCnt]->pTextMark->GetTOXMark();
1620  const OUString& sPrimKey = rMark.GetPrimaryKey();
1621  const OUString& sSecKey = rMark.GetSecondaryKey();
1622  const SwTOXMark* pNextMark = nullptr;
1623  while(m_aSortArr.size() > (nCnt + nRange)&&
1624  m_aSortArr[nCnt + nRange]->GetType() == TOX_SORT_INDEX &&
1625  nullptr != (pNextMark = &(m_aSortArr[nCnt + nRange]->pTextMark->GetTOXMark())) &&
1626  pNextMark->GetPrimaryKey() == sPrimKey &&
1627  pNextMark->GetSecondaryKey() == sSecKey)
1628  nRange++;
1629  }
1630  else
1631  nRange = 1;
1632 
1633  for(size_t nRunInEntry = nCnt; nRunInEntry < nCnt + nRange; ++nRunInEntry)
1634  {
1635  std::vector<sal_uInt16> aNums; // the PageNumber
1636  std::vector<SwPageDesc*> aDescs; // The PageDescriptors matching the PageNumbers
1637  std::vector<sal_uInt16> aMainNums; // contains page numbers of main entries
1638  SwTOXSortTabBase* pSortBase = m_aSortArr[nRunInEntry].get();
1639  size_t nSize = pSortBase->aTOXSources.size();
1640  for (size_t j = 0; j < nSize; ++j)
1641  {
1642  ::SetProgressState( 0, pDoc->GetDocShell() );
1643 
1644  SwTOXSource& rTOXSource = pSortBase->aTOXSources[j];
1645  if( rTOXSource.pNd )
1646  {
1647  SwContentFrame* pFrame = rTOXSource.pNd->getLayoutFrame( pDoc->getIDocumentLayoutAccess().GetCurrentLayout() );
1648  OSL_ENSURE( pFrame || pDoc->IsUpdateTOX(), "TOX, no Frame found");
1649  if( !pFrame )
1650  continue;
1651  if( pFrame->IsTextFrame() && static_cast<SwTextFrame*>(pFrame)->HasFollow() )
1652  {
1653  // find the right one
1654  SwTextFrame* pNext;
1655  TextFrameIndex const nPos(static_cast<SwTextFrame*>(pFrame)
1656  ->MapModelToView(static_cast<SwTextNode const*>(rTOXSource.pNd),
1657  rTOXSource.nPos));
1658  for (;;)
1659  {
1660  pNext = static_cast<SwTextFrame*>(pFrame->GetFollow());
1661  if (!pNext || nPos < pNext->GetOffset())
1662  break;
1663  pFrame = pNext;
1664  }
1665  }
1666 
1667  SwPageFrame* pTmpPage = pFrame->FindPageFrame();
1668  if( pTmpPage != pCurrentPage )
1669  {
1670  nPage = pTmpPage->GetVirtPageNum();
1671  pCurrentPage = pTmpPage;
1672  }
1673 
1674  // Insert as sorted
1675  std::vector<sal_uInt16>::size_type i;
1676  for( i = 0; i < aNums.size() && aNums[i] < nPage; ++i )
1677  ;
1678 
1679  if( i >= aNums.size() || aNums[ i ] != nPage )
1680  {
1681  aNums.insert(aNums.begin() + i, nPage);
1682  aDescs.insert(aDescs.begin() + i, pCurrentPage->GetPageDesc() );
1683  }
1684  // is it a main entry?
1685  if(TOX_SORT_INDEX == pSortBase->GetType() &&
1686  rTOXSource.bMainEntry)
1687  {
1688  aMainNums.push_back(nPage);
1689  }
1690  }
1691  }
1692  // Insert the PageNumber into the TOC TextNode
1693  const SwTOXSortTabBase* pBase = m_aSortArr[ nCnt ].get();
1694  if(pBase->pTOXNd)
1695  {
1696  const SwTextNode* pTextNd = pBase->pTOXNd->GetTextNode();
1697  OSL_ENSURE( pTextNd, "no TextNode, wrong TOC" );
1698 
1699  UpdatePageNum_( const_cast<SwTextNode*>(pTextNd), aNums, aDescs, &aMainNums,
1700  aIntl );
1701  }
1702  }
1703  }
1704  // Delete the mapping array after setting the right PageNumber
1705  m_aSortArr.clear();
1706 }
1707 
1710 static bool lcl_HasMainEntry( const std::vector<sal_uInt16>* pMainEntryNums, sal_uInt16 nToFind )
1711 {
1712  if (!pMainEntryNums)
1713  return false;
1714 
1715  for( auto nMainEntry : *pMainEntryNums )
1716  if (nToFind == nMainEntry)
1717  return true;
1718  return false;
1719 }
1720 
1722  const std::vector<sal_uInt16>& rNums,
1723  const std::vector<SwPageDesc*>& rDescs,
1724  const std::vector<sal_uInt16>* pMainEntryNums,
1725  const SwTOXInternational& rIntl )
1726 {
1727  // collect starts end ends of main entry character style
1728  std::unique_ptr< std::vector<sal_uInt16> > xCharStyleIdx(pMainEntryNums ? new std::vector<sal_uInt16> : nullptr);
1729 
1730  OUString sSrchStr = OUStringChar(C_NUM_REPL) + S_PAGE_DELI + OUStringChar(C_NUM_REPL);
1731  sal_Int32 nStartPos = pNd->GetText().indexOf(sSrchStr);
1732  sSrchStr = OUStringChar(C_NUM_REPL) + OUStringChar(C_END_PAGE_NUM);
1733  sal_Int32 nEndPos = pNd->GetText().indexOf(sSrchStr);
1734 
1735  if (-1 == nEndPos || rNums.empty())
1736  return;
1737 
1738  if (-1 == nStartPos || nStartPos > nEndPos)
1739  nStartPos = nEndPos;
1740 
1741  sal_uInt16 nOld = rNums[0],
1742  nBeg = nOld,
1743  nCount = 0;
1744  OUString aNumStr( rDescs[0]->GetNumType().GetNumStr( nBeg ) );
1745  if( xCharStyleIdx && lcl_HasMainEntry( pMainEntryNums, nBeg ))
1746  {
1747  xCharStyleIdx->push_back( 0 );
1748  }
1749 
1750  // Delete place holder
1751  SwIndex aPos(pNd, nStartPos);
1752  SwCharFormat* pPageNoCharFormat = nullptr;
1753  SwpHints* pHints = pNd->GetpSwpHints();
1754  if(pHints)
1755  for(size_t nHintIdx = 0; nHintIdx < pHints->Count(); ++nHintIdx)
1756  {
1757  const SwTextAttr* pAttr = pHints->Get(nHintIdx);
1758  const sal_Int32 nTmpEnd = pAttr->End() ? *pAttr->End() : 0;
1759  if( nStartPos >= pAttr->GetStart() &&
1760  (nStartPos + 2) <= nTmpEnd &&
1761  pAttr->Which() == RES_TXTATR_CHARFMT)
1762  {
1763  pPageNoCharFormat = pAttr->GetCharFormat().GetCharFormat();
1764  break;
1765  }
1766  }
1767  pNd->EraseText(aPos, nEndPos - nStartPos + 2);
1768 
1769  std::vector<sal_uInt16>::size_type i;
1770  for( i = 1; i < rNums.size(); ++i)
1771  {
1772  SvxNumberType aType( rDescs[i]->GetNumType() );
1773  if( TOX_INDEX == SwTOXBase::GetType() )
1774  { // Summarize for the following
1775  // Add up all following
1776  // break up if main entry starts or ends and
1777  // insert a char style index
1778  bool bMainEntryChanges = lcl_HasMainEntry(pMainEntryNums, nOld)
1779  != lcl_HasMainEntry(pMainEntryNums, rNums[i]);
1780 
1781  if(nOld == rNums[i]-1 && !bMainEntryChanges &&
1783  nCount++;
1784  else
1785  {
1786  // Flush for the following old values
1788  {
1789  if ( nCount >= 1 )
1790  aNumStr += rIntl.GetFollowingText( nCount > 1 );
1791  }
1792  else if (nCount) //#58127# If nCount == 0, then the only PageNumber is already in aNumStr!
1793  {
1794  if (nCount == 1 )
1795  aNumStr += S_PAGE_DELI;
1796  else
1797  aNumStr += "-";
1798 
1799  aNumStr += aType.GetNumStr( nBeg + nCount );
1800  }
1801 
1802  // Create new String
1803  nBeg = rNums[i];
1804  aNumStr += S_PAGE_DELI;
1805  //the change of the character style must apply after sPageDeli is appended
1806  if (xCharStyleIdx && bMainEntryChanges)
1807  {
1808  xCharStyleIdx->push_back(aNumStr.getLength());
1809  }
1810  aNumStr += aType.GetNumStr( nBeg );
1811  nCount = 0;
1812  }
1813  nOld = rNums[i];
1814  }
1815  else
1816  { // Insert all Numbers
1817  aNumStr += aType.GetNumStr( rNums[i] );
1818  if (i+1 != rNums.size())
1819  aNumStr += S_PAGE_DELI;
1820  }
1821  }
1822  // Flush when ending and the following old values
1823  if( TOX_INDEX == SwTOXBase::GetType() )
1824  {
1826  {
1827  if( nCount >= 1 )
1828  aNumStr += rIntl.GetFollowingText( nCount > 1 );
1829  }
1830  else
1831  {
1832  if(nCount >= 2)
1833  aNumStr += "-";
1834  else if(nCount == 1)
1835  aNumStr += S_PAGE_DELI;
1836  //#58127# If nCount == 0, then the only PageNumber is already in aNumStr!
1837  if(nCount)
1838  aNumStr += rDescs[i-1]->GetNumType().GetNumStr( nBeg+nCount );
1839  }
1840  }
1842  if(pPageNoCharFormat)
1843  {
1844  SwFormatCharFormat aCharFormat( pPageNoCharFormat );
1845  pNd->InsertItem(aCharFormat, nStartPos, nStartPos + aNumStr.getLength(), SetAttrMode::DONTEXPAND);
1846  }
1847 
1848  // The main entries should get their character style
1849  if (xCharStyleIdx && !xCharStyleIdx->empty() && !GetMainEntryCharStyle().isEmpty())
1850  {
1851  // eventually the last index must me appended
1852  if (xCharStyleIdx->size()&0x01)
1853  xCharStyleIdx->push_back(aNumStr.getLength());
1854 
1855  // search by name
1856  SwDoc* pDoc = pNd->GetDoc();
1858  SwCharFormat* pCharFormat = nullptr;
1859  if(USHRT_MAX != nPoolId)
1860  pCharFormat = pDoc->getIDocumentStylePoolAccess().GetCharFormatFromPool(nPoolId);
1861  else
1862  pCharFormat = pDoc->FindCharFormatByName( GetMainEntryCharStyle() );
1863  if(!pCharFormat)
1864  pCharFormat = pDoc->MakeCharFormat(GetMainEntryCharStyle(), nullptr);
1865 
1866  // find the page numbers in aNumStr and set the character style
1867  sal_Int32 nOffset = pNd->GetText().getLength() - aNumStr.getLength();
1868  SwFormatCharFormat aCharFormat(pCharFormat);
1869  for (size_t j = 0; j < xCharStyleIdx->size(); j += 2)
1870  {
1871  sal_Int32 nStartIdx = (*xCharStyleIdx)[j] + nOffset;
1872  sal_Int32 nEndIdx = (*xCharStyleIdx)[j + 1] + nOffset;
1873  pNd->InsertItem(aCharFormat, nStartIdx, nEndIdx, SetAttrMode::DONTEXPAND);
1874  }
1875 
1876  }
1877 }
1878 
1879 void SwTOXBaseSection::InsertSorted(std::unique_ptr<SwTOXSortTabBase> pNew)
1880 {
1881  Range aRange(0, m_aSortArr.size());
1882  if( TOX_INDEX == SwTOXBase::GetType() && pNew->pTextMark )
1883  {
1884  const SwTOXMark& rMark = pNew->pTextMark->GetTOXMark();
1885  // Evaluate Key
1886  // Calculate the range where to insert
1887  if( !(GetOptions() & SwTOIOptions::KeyAsEntry) &&
1888  !rMark.GetPrimaryKey().isEmpty() )
1889  {
1890  aRange = GetKeyRange( rMark.GetPrimaryKey(),
1891  rMark.GetPrimaryKeyReading(),
1892  *pNew, FORM_PRIMARY_KEY, aRange );
1893 
1894  if( !rMark.GetSecondaryKey().isEmpty() )
1895  aRange = GetKeyRange( rMark.GetSecondaryKey(),
1896  rMark.GetSecondaryKeyReading(),
1897  *pNew, FORM_SECONDARY_KEY, aRange );
1898  }
1899  }
1900  // Search for identical entries and remove the trailing one
1902  {
1903  for(short i = static_cast<short>(aRange.Min()); i < static_cast<short>(aRange.Max()); ++i)
1904  {
1905  SwTOXSortTabBase* pOld = m_aSortArr[i].get();
1906  if (pOld->equivalent(*pNew))
1907  {
1908  if (pOld->sort_lt(*pNew))
1909  {
1910  return;
1911  }
1912  else
1913  {
1914  // remove the old content
1915  m_aSortArr.erase( m_aSortArr.begin() + i );
1916  aRange.Max()--;
1917  break;
1918  }
1919  }
1920  }
1921  }
1922 
1923  // find position and insert
1924  long i;
1925 
1926  for( i = aRange.Min(); i < aRange.Max(); ++i)
1927  { // Only check for same level
1928  SwTOXSortTabBase* pOld = m_aSortArr[i].get();
1929  if (pOld->equivalent(*pNew))
1930  {
1932  {
1933  // Own entry for double entries or keywords
1934  if( pOld->GetType() == TOX_SORT_CUSTOM &&
1936  continue;
1937 
1939  { // Own entry
1940  m_aSortArr.insert(m_aSortArr.begin() + i, std::move(pNew));
1941  return;
1942  }
1943  // If the own entry is already present, add it to the references list
1944  pOld->aTOXSources.push_back(pNew->aTOXSources[0]);
1945 
1946  return;
1947  }
1948 #if OSL_DEBUG_LEVEL > 0
1949  else
1950  OSL_FAIL("Bibliography entries cannot be found here");
1951 #endif
1952  }
1953  if (pNew->sort_lt(*pOld))
1954  break;
1955  }
1956  // Skip SubLevel
1957  while( TOX_INDEX == SwTOXBase::GetType() && i < aRange.Max() &&
1958  m_aSortArr[i]->GetLevel() > pNew->GetLevel() )
1959  i++;
1960 
1961  // Insert at position i
1962  m_aSortArr.insert(m_aSortArr.begin()+i, std::move(pNew));
1963 }
1964 
1966 Range SwTOXBaseSection::GetKeyRange(const OUString& rStr, const OUString& rStrReading,
1967  const SwTOXSortTabBase& rNew,
1968  sal_uInt16 nLevel, const Range& rRange )
1969 {
1970  const SwTOXInternational& rIntl = *rNew.pTOXIntl;
1971  TextAndReading aToCompare(rStr, rStrReading);
1972 
1974  {
1975  aToCompare.sText = rIntl.ToUpper( aToCompare.sText, 0 )
1976  + aToCompare.sText.copy(1);
1977  }
1978 
1979  OSL_ENSURE(rRange.Min() >= 0 && rRange.Max() >= 0, "Min Max < 0");
1980 
1981  const long nMin = rRange.Min();
1982  const long nMax = rRange.Max();
1983 
1984  long i;
1985 
1986  for( i = nMin; i < nMax; ++i)
1987  {
1988  SwTOXSortTabBase* pBase = m_aSortArr[i].get();
1989 
1990  if( rIntl.IsEqual( pBase->GetText(), pBase->GetLocale(),
1991  aToCompare, rNew.GetLocale() ) &&
1992  pBase->GetLevel() == nLevel )
1993  break;
1994  }
1995  if(i == nMax)
1996  { // If not already present, create and insert
1997  std::unique_ptr<SwTOXCustom> pKey(MakeSwTOXSortTabBase<SwTOXCustom>(
1998  nullptr, aToCompare, nLevel, rIntl, rNew.GetLocale() ));
1999  for(i = nMin; i < nMax; ++i)
2000  {
2001  if (nLevel == m_aSortArr[i]->GetLevel() && pKey->sort_lt(*m_aSortArr[i]))
2002  break;
2003  }
2004  m_aSortArr.insert(m_aSortArr.begin() + i, std::move(pKey));
2005  }
2006  const long nStart = i+1;
2007  const long nEnd = m_aSortArr.size();
2008 
2009  // Find end of range
2010  for(i = nStart; i < nEnd; ++i)
2011  {
2012  if(m_aSortArr[i]->GetLevel() <= nLevel)
2013  {
2014  return Range(nStart, i);
2015  }
2016  }
2017  return Range(nStart, nEnd);
2018 }
2019 
2021 {
2022  const SwTOXBaseSection *pSect = dynamic_cast<const SwTOXBaseSection*>(this);
2023  if (!pSect || !pSect->GetFormat())
2024  return false;
2025 
2026  const SwSectionNode* pSectNode = pSect->GetFormat()->GetSectionNode();
2027  if (!pSectNode)
2028  return false;
2029 
2030  const SwDocShell* pDocSh = pSectNode->GetDoc()->GetDocShell();
2031  if (!pDocSh)
2032  return false;
2033 
2034  if (pDocSh->IsReadOnly())
2035  return true;
2036 
2037  pSectNode = pSectNode->StartOfSectionNode()->FindSectionNode();
2038  if (!pSectNode)
2039  return false;
2040 
2041  return pSectNode->GetSection().IsProtectFlag();
2042 }
2043 
2045 {
2046  const SwTOXBaseSection *pSect = dynamic_cast<const SwTOXBaseSection*>(this);
2047  if(pSect && pSect->GetFormat())
2048  return &pSect->GetFormat()->GetAttrSet();
2049  return nullptr;
2050 }
2051 
2053 {
2054  SwTOXBaseSection *pSect = dynamic_cast<SwTOXBaseSection*>(this);
2055  if( pSect && pSect->GetFormat() )
2056  pSect->GetFormat()->SetFormatAttr( rSet );
2057 }
2058 
2059 /* 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:961
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:43
Represents the visualization of a paragraph.
Definition: txtfrm.hxx:151
const SfxItemSet * GetAttrSet() const
Definition: doctxm.cxx:2044
TOXTypes
Definition: toxe.hxx:39
bool IsMarkHintHidden(SwRootFrame const &rLayout, SwTextNode const &rNode, SwTextAttrEnd const &rHint)
Definition: reffld.cxx:1103
void SetAttrSet(const SfxItemSet &)
Definition: doctxm.cxx:2052
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:632
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:675
bool IsInDocBody() const
Definition: frame.hxx:921
SwTOIOptions GetOptions() const
Definition: tox.hxx:714
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:608
SwDocShell * GetDocShell()
Definition: doc.hxx:1348
bool IsProtected() const
Definition: tox.hxx:505
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:515
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:378
Definition: tox.hxx:281
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:1083
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:1710
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:43
Subgroup user indices.
Definition: poolfmt.hxx:382
OUString const & GetTemplate(sal_uInt16 nLevel) const
Definition: tox.hxx:646
#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:162
#define SO3_SCH_CLASSID_30
css::uno::Reference< css::embed::XEmbeddedObject > const & GetOleRef()
Definition: ndole.cxx:913
#define TOX_STYLE_DELIMITER
Definition: tox.hxx:391
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:868
#define SO3_SDRAW_CLASSID_50
bool IsHiddenByParaField() const
is the paragraph visible?
Definition: ndtxt.hxx:709
bool IsUpdateTOX() const
Definition: doc.hxx:946
virtual void DeleteRange(SwPaM &)=0
Delete a range SwFlyFrameFormat.
static SwContentNode * GoPrevious(SwNodeIndex *)
Definition: nodes.cxx:1298
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:1270
SwSectionFormat * GetFormat()
Definition: section.hxx:336
bool operator<=(const BigInt &rVal1, const BigInt &rVal2)
bool IsTOXBaseInReadonly() const
Definition: doctxm.cxx:2020
IDocumentUndoRedo & GetIDocumentUndoRedo()
Definition: doc.cxx:143
#define SO3_SC_CLASSID_40
const SwTOXType * GetTOXType() const
Definition: tox.hxx:546
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:411
#define FORM_SECONDARY_KEY
Definition: tox.hxx:177
IDocumentContentOperations const & getIDocumentContentOperations() const
Definition: doc.cxx:314
bool HasWriterListeners() const
Definition: calbck.hxx:208
The root element of a Writer document layout.
Definition: rootfrm.hxx:79
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:356
#define SO3_SCH_CLASSID_40
void Delete(const SwNodeIndex &rPos, sal_uLong nNodes=1)
delete nodes
Definition: nodes.cxx:1069
OUString const & GetPrimaryKeyReading() const
Definition: tox.hxx:626
bool IsAssignedToListLevelOfOutlineStyle() const
Definition: fmtcol.hxx:109
static SwTOOElements lcl_IsSOObject(const SvGlobalName &rFactoryNm)
Definition: doctxm.cxx:1392
const SwTOXType * GetTOXType() const
Definition: tox.hxx:672
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:1003
const OUString S_PAGE_DELI
IDocumentStylePoolAccess const & getIDocumentStylePoolAccess() const
Definition: doc.cxx:425
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:389
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:1670
const OUString & GetSequenceName() const
Definition: tox.hxx:508
#define SO3_SC_CLASSID_60
SwSectionFormat * MakeSectionFormat()
Definition: ndsect.cxx:508
OUString ToUpper(const OUString &rStr, sal_Int32 nPos) const
Definition: txmsrt.cxx:96
#define SO3_SCH_CLASSID_60
SwTOOElements GetOLEOptions() const
Definition: tox.hxx:481
virtual bool DoesUndo() const =0
Is Undo enabled?
const char * sName
OUString maMSTOCExpression
Definition: tox.hxx:427
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:1804
object index.
Definition: poolfmt.hxx:400
void UpdatePageNum()
Calculate PageNumber and insert after formatting.
Definition: doctxm.cxx:1595
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:1966
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:333
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:1243
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:378
SwPageFrame * FindPageFrame()
Definition: frame.hxx:660
Text body.
Definition: poolfmt.hxx:251
TextFrameIndex MapModelToView(MergedPara const &, SwTextNode const *pNode, sal_Int32 nIndex)
Definition: txtfrm.cxx:1170
TElementType * First()
Definition: calbck.hxx:343
bool IsFromObjectNames() const
Definition: tox.hxx:499
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:2589
OUString GetText(SwRootFrame const *pLayout) const
Definition: tox.cxx:170
Marks a character position inside a document model node.
Definition: index.hxx:37
void UpdateTable(const SwTextNode *pOwnChapterNode, SwRootFrame const *pLayout)
Collect table entries.
Definition: doctxm.cxx:1542
const OUString & GetTypeName() const
Definition: tox.hxx:664
const SwTextNode * GetpTextNd() const
Definition: txttxmrk.hxx:44
IDocumentState const & getIDocumentState() const
Definition: doc.cxx:393
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:1126
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:1357
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:496
sal_uInt16 GetLevel() const
Definition: tox.hxx:708
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:785
const SwTOXMark & GotoTOXMark(const SwTOXMark &rCurTOXMark, SwTOXSearch eDir, bool bInReadOnly)
Definition: doctxm.cxx:228
const OUString & GetTitle() const
Definition: tox.hxx:678
virtual ~SwTOXBaseSection() override
Definition: doctxm.cxx:751
bool IsInReading() const
Definition: doc.hxx:951
IDocumentLayoutAccess const & getIDocumentLayoutAccess() const
Definition: doc.cxx:404
SwCaptionDisplay GetCaptionDisplay() const
Definition: tox.hxx:511
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:44
bool operator!=(const ScCsvLayoutData &rData1, const ScCsvLayoutData &rData2)
void UpdateSequence(const SwTextNode *pOwnChapterNode, SwRootFrame const *pLayout)
Generate content from sequence fields.
Definition: doctxm.cxx:1313
const OUString & GetSortAlgorithm() const
Definition: tox.hxx:522
void DeleteAttribute(SwTextAttr *const pTextAttr)
delete the attribute pTextAttr
Definition: thints.cxx:1666
user index 6..10.
Definition: poolfmt.hxx:412
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:396
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:2660
OUString InsertText(const OUString &rStr, const SwIndex &rIdx, const SwInsertFlags nMode=SwInsertFlags::DEFAULT)
insert text content
Definition: ndtxt.cxx:2277
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
OUString sText
Definition: txmsrt.hxx:60
IDocumentRedlineAccess const & getIDocumentRedlineAccess() const
Definition: doc.cxx:334
bool IsRelTabPos() const
Definition: tox.hxx:312
#define SO3_SIMPRESS_CLASSID_50
void SetTOXName(const OUString &rSet)
Definition: tox.hxx:445
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:1879
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:614
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:699
const o3tl::enumarray< SvxAdjust, unsigned short > aSvxToUnoAdjust USHRT_MAX
Definition: unosett.cxx:253
SwMoveFnCollection const & fnMoveForward
SwPam::Move()/Find() default argument.
Definition: paminit.cxx:59
OUString const & GetStyleNames(sal_uInt16 nLevel) const
Definition: tox.hxx:486
#define SO3_SM_CLASSID_40
bool mbKeepExpression
Definition: tox.hxx:428
OUString aName
sal_Int32 GetIndex() const
Definition: index.hxx:95
OString DateTimeToOString(const DateTime &rDateTime)
LanguageType GetLanguage() const
Definition: tox.hxx:519
bool IsCommaSeparated() const
Definition: tox.hxx:315
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:185
LanguageType GetLang(const sal_Int32 nBegin, const sal_Int32 nLen=0, sal_uInt16 nScript=0) const
Definition: thints.cxx:3402
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:175
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:178
tables index.
Definition: poolfmt.hxx:404
bool IsHideRedlines() const
Replacement for sw::DocumentRedlineManager::GetRedlineFlags() (this is layout-level redline hiding)...
Definition: rootfrm.hxx:416
virtual bool AppendTextNode(SwPosition &rPos)=0
const OUString & GetMainEntryCharStyle() const
Definition: tox.hxx:465
TOXTypes GetType() const
Definition: tox.hxx:667
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:135
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:1721
SwTableNode * FindTableNode()
Search table node, in which it is.
Definition: node.cxx:352
void ChgFormat(SwFormat &rFormat, const SfxItemSet &rSet)
Definition: docfmt.cxx:1858
void UpdateMarks(const SwTOXInternational &rIntl, const SwTextNode *pOwnChapterNode, SwRootFrame const *pLayout)
Create from Marks.
Definition: doctxm.cxx:1176
static bool IsInHiddenRange(const SwTextNode &rNode, sal_Int32 nPos)
Definition: porlay.cxx:1877
static SwTOIOptions GetOptions()
Definition: txmsrt.hxx:143
#define FORM_PRIMARY_KEY
Definition: tox.hxx:176
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:2317
Subgroup index tables.
Definition: poolfmt.hxx:367
Subgroup table of contents.
Definition: poolfmt.hxx:374
SwSectionNode * GetSectionNode()
Definition: node.hxx:607
const SwTextTOXMark * GetTextTOXMark() const
Definition: tox.hxx:141
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:690
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:174
index of authorities.
Definition: poolfmt.hxx:408
sal_uInt16 const aBreakSetRange[]
Definition: init.cxx:142
void GetChildSections(SwSections &rArr, SectionSort eSort=SectionSort::Not, bool bAllSections=true) const
Definition: section.cxx:883
#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:1281
void UpdateContent(SwTOXElement eType, const SwTextNode *pOwnChapterNode, SwRootFrame const *pLayout)
Definition: doctxm.cxx:1436
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:502
const SwAttrPool & GetAttrPool() const
Definition: doc.hxx:1315
const OUString & GetTOXName() const
Definition: tox.hxx:444
SwTextNode * GetTextNode()
Inline methods from Node.hxx.
Definition: ndtxt.hxx:836
SwTextNode * MakeTextNode(const SwNodeIndex &rWhere, SwTextFormatColl *pColl, bool bNewFrames=true)
Implementations of "Make...Node" are in the given .cxx-files.
Definition: ndtxt.cxx:104
bool IsProtected() const
Is the Frame or rather the Section in which it lies protected?
Definition: trvlfrm.cxx:1626
Base class of the Writer document model elements.
Definition: node.hxx:79
SwTextFormatColl * GetTextColl() const
Definition: ndtxt.hxx:830