xref: /aoo42x/main/sw/source/core/doc/docnew.cxx (revision ca2e0b95)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 #define ROLBCK_HISTORY_ONLY 	// Der Kampf gegen die CLOOK's
27 #include <doc.hxx>
28 #include <dcontact.hxx>
29 #include <com/sun/star/document/PrinterIndependentLayout.hpp>
30 #include <com/sun/star/document/UpdateDocMode.hpp>
31 #include <com/sun/star/text/XTextDocument.hpp>
32 #include <com/sun/star/linguistic2/XProofreadingIterator.hpp>
33 #include <com/sun/star/text/XFlatParagraphIteratorProvider.hpp>
34 
35 #include <unotools/processfactory.hxx>
36 #include <vcl/svapp.hxx>
37 #include <vcl/virdev.hxx>
38 #include <rtl/logfile.hxx>
39 #include <sfx2/printer.hxx>
40 #include <sfx2/docfile.hxx>
41 #include <sfx2/frame.hxx>
42 #include <sfx2/viewfrm.hxx>
43 
44 #include <svl/macitem.hxx>
45 #include <svx/svxids.hrc>
46 #include <svx/svdogrp.hxx>
47 #include <sfx2/linkmgr.hxx>
48 #include <editeng/forbiddencharacterstable.hxx>
49 #include <svl/zforlist.hxx>
50 #include <unotools/compatibility.hxx>
51 #include <unotools/lingucfg.hxx>
52 #include <svx/svdpage.hxx>
53 #include <paratr.hxx>
54 #include <fchrfmt.hxx>
55 #include <fmtcntnt.hxx>
56 #include <fmtanchr.hxx>
57 #include <fmtfsize.hxx>
58 #include <fmtfordr.hxx>
59 #include <fmtpdsc.hxx>
60 #include <pvprtdat.hxx>
61 #include <rootfrm.hxx>  //Damit der RootDtor gerufen wird.
62 #include <layouter.hxx>
63 #include <pagedesc.hxx> //Damit die PageDescs zerstoert werden koennen.
64 #include <ndtxt.hxx>
65 #include <printdata.hxx>
66 #include <docfld.hxx>
67 #include <ftninfo.hxx>
68 #include <ftnidx.hxx>
69 #include <docstat.hxx>
70 #include <charfmt.hxx>
71 #include <frmfmt.hxx>
72 #include <rolbck.hxx>           // Undo-Attr, SwHistory
73 #include <poolfmt.hxx>          // fuer die Pool-Vorlage
74 #include <dbmgr.hxx>
75 #include <docsh.hxx>
76 #include <acorrect.hxx>			// fuer die autom. Aufnahme von Ausnahmen
77 #include <visiturl.hxx>			// fuer die URL-Change Benachrichtigung
78 #include <docary.hxx>
79 #include <lineinfo.hxx>
80 #include <drawdoc.hxx>
81 #include <linkenum.hxx>
82 #include <fldupde.hxx>
83 #include <extinput.hxx>
84 #include <viewsh.hxx>
85 #include <doctxm.hxx>
86 #include <shellres.hxx>
87 #include <breakit.hxx>
88 #include <laycache.hxx>
89 #include <mvsave.hxx>
90 #include <istyleaccess.hxx>
91 #include <swstylemanager.hxx>
92 #include <IGrammarContact.hxx>
93 #include <tblsel.hxx>
94 #include <MarkManager.hxx>
95 #include <UndoManager.hxx>
96 #include <unochart.hxx>
97 
98 #include <cmdid.h>              // fuer den dflt - Printer in SetJob
99 
100 
101 // --> OD 2006-04-19 #b6375613#
102 #include <com/sun/star/document/XDocumentInfoSupplier.hpp>
103 #include <com/sun/star/beans/XPropertyContainer.hpp>
104 #include <com/sun/star/beans/PropertyAttribute.hpp>
105 
106 // <--
107 
108 // --> OD 2007-03-16 #i73788#
109 #include <pausethreadstarting.hxx>
110 // <--
111 #include <numrule.hxx>
112 // --> OD 2008-03-13 #refactorlists#
113 #include <list.hxx>
114 #include <listfunc.hxx>
115 // <--
116 
117 #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
118 
119 #include <sfx2/Metadatable.hxx>
120 #include <fmtmeta.hxx> // MetaFieldManager
121 
122 
123 using namespace ::com::sun::star;
124 using namespace ::com::sun::star::document;
125 
126 const sal_Char __FAR_DATA sFrmFmtStr[] = "Frameformat";
127 const sal_Char __FAR_DATA sEmptyPageStr[] = "Empty Page";
128 const sal_Char __FAR_DATA sColumnCntStr[] = "Columncontainer";
129 const sal_Char __FAR_DATA sCharFmtStr[] = "Zeichenformat";
130 const sal_Char __FAR_DATA sTxtCollStr[] = "Textformatvorlage";
131 const sal_Char __FAR_DATA sGrfCollStr[] = "Graphikformatvorlage";
132 
133 SV_IMPL_PTRARR( SwNumRuleTbl, SwNumRulePtr)
134 SV_IMPL_PTRARR( SwTxtFmtColls, SwTxtFmtCollPtr)
135 SV_IMPL_PTRARR( SwGrfFmtColls, SwGrfFmtCollPtr)
136 
137 /*
138  * global functions...
139  */
140 
141  uno::Reference< linguistic2::XProofreadingIterator > SwDoc::GetGCIterator() const
142 {
143     if (!m_xGCIterator.is() && SvtLinguConfig().HasGrammarChecker())
144     {
145         uno::Reference< lang::XMultiServiceFactory >  xMgr( utl::getProcessServiceFactory() );
146         if (xMgr.is())
147         {
148             try
149             {
150                 rtl::OUString aServiceName( rtl::OUString::createFromAscii("com.sun.star.linguistic2.ProofreadingIterator") );
151                 m_xGCIterator = uno::Reference< linguistic2::XProofreadingIterator >
152                     ( xMgr->createInstance( aServiceName ), uno::UNO_QUERY_THROW );
153             }
154             catch (uno::Exception &)
155             {
156                 DBG_ERROR( "No GCIterator" );
157             }
158         }
159     }
160 
161     return m_xGCIterator;
162 }
163 
164 void StartGrammarChecking( SwDoc &rDoc )
165 {
166     // check for a visible view
167     bool bVisible = false;
168     const SwDocShell *pDocShell = rDoc.GetDocShell();
169     SfxViewFrame    *pFrame = SfxViewFrame::GetFirst( pDocShell, sal_False );
170     while (pFrame && !bVisible)
171     {
172         if (pFrame->IsVisible())
173             bVisible = true;
174         pFrame = SfxViewFrame::GetNext( *pFrame, pDocShell, sal_False );
175     }
176 
177     //!! only documents with visible views need to be checked
178     //!! (E.g. don't check temporary documents created for printing, see printing of notes and selections.
179     //!! Those get created on the fly and get hard deleted a bit later as well, and no one should have
180     //!! a uno reference to them)
181     if (bVisible)
182     {
183         uno::Reference< linguistic2::XProofreadingIterator > xGCIterator( rDoc.GetGCIterator() );
184         if ( xGCIterator.is() )
185         {
186             uno::Reference< lang::XComponent >  xDoc( rDoc.GetDocShell()->GetBaseModel(), uno::UNO_QUERY );
187             uno::Reference< text::XFlatParagraphIteratorProvider >  xFPIP( xDoc, uno::UNO_QUERY );
188 
189             // start automatic background checking if not active already
190             if ( xFPIP.is() && !xGCIterator->isProofreading( xDoc ) )
191                 xGCIterator->startProofreading( xDoc, xFPIP );
192         }
193     }
194 }
195 
196 /*
197  * interne Funktionen
198  */
199 
200 
201 
202 sal_Bool lcl_DelFmtIndizes( const SwFrmFmtPtr& rpFmt, void* )
203 {
204 	SwFmtCntnt &rFmtCntnt = (SwFmtCntnt&)rpFmt->GetCntnt();
205 	if ( rFmtCntnt.GetCntntIdx() )
206 		rFmtCntnt.SetNewCntntIdx( 0 );
207 	SwFmtAnchor &rFmtAnchor = (SwFmtAnchor&)rpFmt->GetAnchor();
208 	if ( rFmtAnchor.GetCntntAnchor() )
209 		rFmtAnchor.SetAnchor( 0 );
210 	return sal_True;
211 }
212 
213 /*
214  * exportierte Methoden
215  */
216 
217 SwDoc::SwDoc()
218     : m_pNodes( new SwNodes(this) )
219     ,
220 	mpAttrPool(new SwAttrPool(this)),
221     pMarkManager(new ::sw::mark::MarkManager(*this)),
222     m_pMetaFieldManager(new ::sw::MetaFieldManager()),
223     m_pUndoManager(new ::sw::UndoManager(
224             ::std::auto_ptr<SwNodes>(new SwNodes(this)), *this, *this, *this)),
225 	pDfltFrmFmt( new SwFrmFmt( GetAttrPool(), sFrmFmtStr, 0 ) ),
226 	pEmptyPageFmt( new SwFrmFmt( GetAttrPool(), sEmptyPageStr, pDfltFrmFmt ) ),
227 	pColumnContFmt( new SwFrmFmt( GetAttrPool(), sColumnCntStr, pDfltFrmFmt ) ),
228 	pDfltCharFmt( new SwCharFmt( GetAttrPool(), sCharFmtStr, 0 ) ),
229 	pDfltTxtFmtColl( new SwTxtFmtColl( GetAttrPool(), sTxtCollStr ) ),
230 	pDfltGrfFmtColl( new SwGrfFmtColl( GetAttrPool(), sGrfCollStr ) ),
231 	pFrmFmtTbl( new SwFrmFmts() ),
232 	pCharFmtTbl( new SwCharFmts() ),
233 	pSpzFrmFmtTbl( new SwSpzFrmFmts() ),
234 	pSectionFmtTbl( new SwSectionFmts() ),
235 	pTblFrmFmtTbl( new SwFrmFmts() ),
236 	pTxtFmtCollTbl( new SwTxtFmtColls() ),
237 	pGrfFmtCollTbl( new SwGrfFmtColls() ),
238 	pTOXTypes( new SwTOXTypes() ),
239 	pDefTOXBases( new SwDefTOXBase_Impl() ),
240 	pCurrentView( 0 ),	//swmod 071225
241 	pDrawModel( 0 ),
242 	pUpdtFlds( new SwDocUpdtFld() ),
243 	pFldTypes( new SwFldTypes() ),
244     pVirDev( 0 ),
245 	pPrt( 0 ),
246     pPrtData( 0 ),
247 	pGlossaryDoc( 0 ),
248 	pOutlineRule( 0 ),
249 	pFtnInfo( new SwFtnInfo ),
250 	pEndNoteInfo( new SwEndNoteInfo ),
251 	pLineNumberInfo( new SwLineNumberInfo ),
252 	pFtnIdxs( new SwFtnIdxs ),
253 	pDocStat( new SwDocStat ),
254 	pDocShell( 0 ),
255 	pLinkMgr( new sfx2::LinkManager( 0 ) ),
256 	pACEWord( 0 ),
257 	pURLStateChgd( 0 ),
258 	pNumberFormatter( 0 ),
259 	pNumRuleTbl( new SwNumRuleTbl ),
260     // --> OD 2008-03-26 #refactorlists#
261     maLists(),
262     maListStyleLists(),
263     // <--
264     pRedlineTbl( new SwRedlineTbl ),
265 	pAutoFmtRedlnComment( 0 ),
266 	pUnoCrsrTbl( new SwUnoCrsrTbl( 0, 16 ) ),
267 	pPgPViewPrtData( 0 ),
268 	pExtInputRing( 0 ),
269 	pLayouter( 0 ),
270     // --> OD 2008-03-07 #refactorlists#
271     pStyleAccess( 0 ),
272     // <--
273     pLayoutCache( 0 ),
274     pUnoCallBack(new SwModify(0)),
275     mpGrammarContact( 0 ),
276     aChartDataProviderImplRef(),
277     pChartControllerHelper( 0 ),
278     // --> OD 2007-10-31 #i83479#
279     mpListItemsList( new tImplSortedNodeNumList() ),
280     // <--
281     m_pXmlIdRegistry(),
282 	nAutoFmtRedlnCommentNo( 0 ),
283 	nLinkUpdMode( GLOBALSETTING ),
284  	eFldUpdMode( AUTOUPD_GLOBALSETTING ),
285 	eRedlineMode((RedlineMode_t)(nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE)),
286 	eChrCmprType( CHARCOMPRESS_NONE ),
287     mReferenceCount(0),
288     mIdleBlockCount(0),
289     nLockExpFld( 0 ),
290 	mbReadlineChecked(false),
291 	meDocType( DOCTYPE_NATIVE ),
292     // --> OD 2005-02-11 #i38810#
293     mbLinksUpdated( sal_False ),
294     mbClipBoard( false ),
295     mbColumnSelection( false ),
296     mbContainsAtPageObjWithContentAnchor( false ),
297     // i#78591#
298 	mbProtectForm(false),
299     mbLastBrowseMode( false ),
300     n32DummyCompatabilityOptions1(0),
301     n32DummyCompatabilityOptions2(0),
302     mbStartIdleTimer(sal_False),
303 	mbSetDrawDefaults(false)
304 {
305 	RTL_LOGFILE_CONTEXT_AUTHOR( aLog, "SW", "JP93722",  "SwDoc::SwDoc" );
306 
307 	mbGlossDoc =
308 	mbModified =
309 	mbDtor =
310 	mbPageNums =
311 	mbLoaded =
312 	mbUpdateExpFld =
313 	mbNewDoc =
314 	mbCopyIsMove =
315 	mbInReading =
316     mbInXMLImport =
317 	mbUpdateTOX =
318 	mbInLoadAsynchron =
319 	mbHTMLMode =
320 	mbInCallModified =
321 	mbIsGlobalDoc =
322 	mbGlblDocSaveLinks =
323 	mbIsLabelDoc =
324 	mbIsAutoFmtRedline =
325 	mbOLEPrtNotifyPending =
326 	mbAllOLENotify =
327 	mbIsRedlineMove =
328 	mbInsOnlyTxtGlssry =
329 	mbContains_MSVBasic =
330 	mbKernAsianPunctuation =
331 #ifdef DBG_UTIL
332 	mbXMLExport =
333 #endif
334     // --> OD 2006-03-21 #b6375613#
335     mbApplyWorkaroundForB6375613 =
336     // <--
337                             false;
338 
339 	mbNewFldLst =
340 	mbVisibleLinks =
341     mbPurgeOLE =
342                             true;
343 
344     //
345     // COMPATIBILITY FLAGS START
346     //
347 
348     // Note: Any non-hidden compatibility flag should obtain its default
349     // by asking SvtCompatibilityOptions, see below.
350     //
351     const SvtCompatibilityOptions aOptions;
352     mbParaSpaceMax                      = aOptions.IsAddSpacing();
353     mbParaSpaceMaxAtPages               = aOptions.IsAddSpacingAtPages();
354     mbTabCompat                         = !aOptions.IsUseOurTabStops();
355     mbUseVirtualDevice                  = !aOptions.IsUsePrtDevice();
356     mbAddExternalLeading                = !aOptions.IsNoExtLeading();
357     mbOldLineSpacing                    = aOptions.IsUseLineSpacing();
358     mbAddParaSpacingToTableCells        = aOptions.IsAddTableSpacing();
359     mbUseFormerObjectPos                = aOptions.IsUseObjectPositioning();
360     mbUseFormerTextWrapping             = aOptions.IsUseOurTextWrapping();
361     mbConsiderWrapOnObjPos              = aOptions.IsConsiderWrappingStyle();
362     mbMathBaselineAlignment                 = false;        // default for *old* documents is 'off'
363     mbAddFlyOffsets                         = false;        // hidden
364     mbOldNumbering                          = false;        // hidden
365     mbUseHiResolutionVirtualDevice          = true;         // hidden
366     mbIgnoreFirstLineIndentInNumbering      = false;        // hidden
367     mbDoNotJustifyLinesWithManualBreak      = !aOptions.IsExpandWordSpace();
368     mbDoNotResetParaAttrsForNumFont         = false;        // hidden
369     mbOutlineLevelYieldsOutlineRule         = false;        // hidden
370     mbTableRowKeep                          = false;        // hidden
371     mbIgnoreTabsAndBlanksForLineCalculation = false;        // hidden
372     mbDoNotCaptureDrawObjsOnPage            = false;        // hidden
373     mbClipAsCharacterAnchoredWriterFlyFrames= false;        // hidden
374     mbUnixForceZeroExtLeading               = false;        // hidden
375     mbOldPrinterMetrics                     = false;        // hidden
376     mbTabRelativeToIndent                   = true;         // hidden
377     // --> OD 2008-06-05 #i89181#
378     mbTabAtLeftIndentForParagraphsInList    = false;        // hidden
379     // <--
380 
381     //
382     // COMPATIBILITY FLAGS END
383     //
384 
385 	pMacroTable = new SvxMacroTableDtor;
386 
387     mpGrammarContact = ::createGrammarContact();
388 
389 	/*
390 	 * Defaultformate und DefaultFormatsammlungen (FmtColl)
391 	 * werden an der Position 0 in das jeweilige Array eingetragen.
392 	 * Die Formate der FmtColls sind von den Defaultformaten
393 	 * abgeleitet und stehen auch in der Liste.
394 	 */
395 	/* Formate */
396 	pFrmFmtTbl->Insert(pDfltFrmFmt, 0 );
397 	pCharFmtTbl->Insert(pDfltCharFmt, 0 );
398 
399 	/* FmtColls */
400 	// TXT
401 	pTxtFmtCollTbl->Insert(pDfltTxtFmtColl, 0 );
402     // GRF
403 	pGrfFmtCollTbl->Insert(pDfltGrfFmtColl, 0 );
404 
405 	// PageDesc, EmptyPageFmt und ColumnFmt anlegen
406 	if ( !aPageDescs.Count() )
407 		GetPageDescFromPool( RES_POOLPAGE_STANDARD );
408 
409 		//Leere Seite Einstellen.
410     pEmptyPageFmt->SetFmtAttr( SwFmtFrmSize( ATT_FIX_SIZE ) );
411 		//BodyFmt fuer Spalten Einstellen.
412     pColumnContFmt->SetFmtAttr( SwFmtFillOrder( ATT_LEFT_TO_RIGHT ) );
413 
414 	_InitFieldTypes();
415 
416     // lege (fuer die Filter) eine Default-OutlineNumRule an
417     // --> OD 2008-02-11 #newlistlevelattrs#
418     pOutlineRule = new SwNumRule( String::CreateFromAscii( SwNumRule::GetOutlineRuleName() ),
419                                   // --> OD 2008-06-06 #i89178#
420                                   numfunc::GetDefaultPositionAndSpaceMode(),
421                                   // <--
422                                   OUTLINE_RULE );
423     // <--
424     // #115901#
425     AddNumRule(pOutlineRule);
426     // --> OD 2005-10-21 - counting of phantoms depends on <IsOldNumbering()>
427     pOutlineRule->SetCountPhantoms( !get(IDocumentSettingAccess::OLD_NUMBERING) );
428     // <--
429 
430     new SwTxtNode(
431             SwNodeIndex(GetUndoManager().GetUndoNodes().GetEndOfContent()),
432             pDfltTxtFmtColl );
433     new SwTxtNode( SwNodeIndex( GetNodes().GetEndOfContent() ),
434 					GetTxtCollFromPool( RES_POOLCOLL_STANDARD ));
435 
436 	// den eigenen IdleTimer setzen
437 	aIdleTimer.SetTimeout( 600 );
438 	aIdleTimer.SetTimeoutHdl( LINK(this, SwDoc, DoIdleJobs) );
439 
440 	aOLEModifiedTimer.SetTimeout( 1000 );
441 	aOLEModifiedTimer.SetTimeoutHdl( LINK( this, SwDoc, DoUpdateModifiedOLE ));
442 
443 	// DBMgr anlegen
444 	pNewDBMgr = new SwNewDBMgr;
445 
446 	// create TOXTypes
447     InitTOXTypes();
448 
449     // --> OD 2008-03-07 #refactorlists#
450     // pass empty item set containing the paragraph's list attributes
451     // as ignorable items to the stype manager.
452     {
453         SfxItemSet aIgnorableParagraphItems( GetAttrPool(),
454                                              RES_PARATR_LIST_BEGIN, RES_PARATR_LIST_END-1,
455                                              0 );
456         pStyleAccess = createStyleManager( &aIgnorableParagraphItems );
457     }
458     // <--
459 
460     ResetModified();
461 }
462 
463 /*
464  * Besonderheiten: an der Position 0 des Arrays der Formate und
465  * der GDI-Objekte befindet sich ein Member der Klasse SwDoc.
466  * Dieser darf also keinesfalls durch delete geloescht
467  * werden!!!!!!!!!!
468  */
469 
470 
471 SwDoc::~SwDoc()
472 {
473     // nothing here should create Undo actions!
474     GetIDocumentUndoRedo().DoUndo(false);
475 
476     if (pDocShell)
477     {
478         pDocShell->SetUndoManager(0);
479     }
480 
481     // --> OD 2007-03-16 #i73788#
482     SwPauseThreadStarting aPauseThreadStarting;
483     // <--
484 
485     // --> OD 2007-11-01 #i83479#
486     delete mpListItemsList;
487     mpListItemsList = 0;
488     // <--
489 
490     // clean up chart related structures...
491     // Note: the chart data provider gets already diposed in ~SwDocShell
492     // since all UNO API related functionality requires an existing SwDocShell
493     // this assures that dipose gets called if there is need for it.
494     aChartDataProviderImplRef.reset();
495     delete pChartControllerHelper;
496 
497     delete mpGrammarContact;
498     mpGrammarContact = 0;
499 
500     //!! needs to be done to destroy a possible SwFmtDrop format that may
501     //!! be connected to a char format which may not otherwise be removed
502     //!! and thus would leave a unremoved SwFmt object. (TL)
503     //!! (this is case is not possible via UI but via API...)
504     SwFmtDrop aDrop;
505     SetDefault(aDrop);
506     //!! same for SwFmtCharFmt
507     SwFmtCharFmt aCharFmt(NULL);
508     SetDefault(aCharFmt);
509 
510 	StopIdling();	// stop idle timer
511 
512 	delete pUnoCallBack, pUnoCallBack = 0;
513 	delete pURLStateChgd;
514 
515 	delete pLayouter;
516     // --> OD 2005-09-05 #125370#
517     pLayouter = 0L;
518     // <--
519 
520 	// Undo-Benachrichtigung vom Draw abschalten
521 	if( pDrawModel )
522 	{
523 		DrawNotifyUndoHdl();
524 		ClrContourCache();
525 	}
526 
527 	delete pPgPViewPrtData;
528 
529 	mbDtor = sal_True;
530 	pLayoutPtr.reset();
531 
532 	delete pRedlineTbl;
533 	delete pUnoCrsrTbl;
534 	delete pAutoFmtRedlnComment;
535 
536 	if( pUpdtFlds )
537 		delete pUpdtFlds;
538 
539 	if( pACEWord )
540 		delete pACEWord;
541 
542 	// die BaseLinks freigeben.
543 	{
544 		for( sal_uInt16 n = pLinkMgr->GetServers().Count(); n; )
545 			pLinkMgr->GetServers()[ --n ]->Closed();
546 
547 		if( pLinkMgr->GetLinks().Count() )
548 			pLinkMgr->Remove( 0, pLinkMgr->GetLinks().Count() );
549 	}
550 
551 	// die KapitelNummern / Nummern muessen vor den Vorlage geloescht werden
552 	// ansonsten wird noch staendig geupdatet !!!
553     m_pNodes->pOutlineNds->Remove(sal_uInt16(0), m_pNodes->pOutlineNds->Count());
554     SwNodes & rUndoNodes( GetUndoManager().GetUndoNodes() );
555     rUndoNodes.pOutlineNds->Remove(sal_uInt16(0), rUndoNodes.pOutlineNds->Count());
556 
557 	pFtnIdxs->Remove( sal_uInt16(0), pFtnIdxs->Count() );
558 
559     // indices could be registered in attributes
560     m_pUndoManager->DelAllUndoObj();
561 
562 	// in den BookMarks sind Indizies auf den Content. Diese muessen vorm
563 	// loesche der Nodes geloescht werden.
564     pMarkManager->clearAllMarks();
565 	DELETEZ( pMacroTable );
566 
567 	if( pExtInputRing )
568 	{
569 		Ring* pTmp = pExtInputRing;
570 		pExtInputRing = 0;
571 		while( pTmp->GetNext() != pTmp )
572 			delete pTmp->GetNext();
573 		delete pTmp;
574 	}
575 
576 //JP: alt - loeschen ohne Flag ist teuer; Modify wird verschickt!
577 //	aTOXTypes.DeleteAndDestroy( 0, aTOXTypes.Count() );
578 	{
579 		for( sal_uInt16 n = pTOXTypes->Count(); n; )
580 		{
581 			(*pTOXTypes)[ --n ]->SetInDocDTOR();
582 			delete (*pTOXTypes)[ n ];
583 		}
584 		pTOXTypes->Remove( 0, pTOXTypes->Count() );
585 	}
586 	delete pDefTOXBases;
587 
588 	//Im einen oder anderen FrmFormat koennen noch Indizes angemeldet sein,
589 	//Diese muessen spaetestens jetzt zerstoert werden.
590 	pFrmFmtTbl->ForEach( &lcl_DelFmtIndizes, this );
591 	pSpzFrmFmtTbl->ForEach( &lcl_DelFmtIndizes, this );
592 	((SwFrmFmts&)*pSectionFmtTbl).ForEach( &lcl_DelFmtIndizes, this );
593 
594 	//Die Formate, die hier hinter stehen sind von den DefaultFormaten
595 	//abhaengig. Erst nach dem Loeschen der FmtIndizes weil der Inhalt von
596 	//Kopf-/Fussbereichen geloescht wird. Wenn dort noch Indizes von Flys
597 	//angemeldet sind gibts was an die Ohren.
598 	aPageDescs.DeleteAndDestroy( 0, aPageDescs.Count() );
599 
600 	// Inhaltssections loeschen
601 	// nicht erst durch den SwNodes-DTOR, damit Formate
602 	// keine Abhaengigen mehr haben.
603     m_pNodes->DelNodes( SwNodeIndex(*m_pNodes), m_pNodes->Count() );
604     rUndoNodes.DelNodes( SwNodeIndex( rUndoNodes ), rUndoNodes.Count() );
605 
606 	// Formate loeschen, spaeter mal permanent machen.
607 
608 	// Delete fuer Collections
609 	// damit die Abhaengigen wech sind
610     pFtnInfo->ReleaseCollection();
611     pEndNoteInfo->ReleaseCollection();
612 
613 	ASSERT( pDfltTxtFmtColl == (*pTxtFmtCollTbl)[0],
614 			"Default-Text-Collection muss immer am Anfang stehen" );
615 
616 	// JP 27.01.98: opt.: ausgehend davon, das Standard als 2. im Array
617 	// 				steht, sollte das als letztes geloescht werden, damit
618 	//				die ganze Umhaengerei der Formate vermieden wird!
619 	if( 2 < pTxtFmtCollTbl->Count() )
620 		pTxtFmtCollTbl->DeleteAndDestroy( 2, pTxtFmtCollTbl->Count()-2 );
621 	pTxtFmtCollTbl->DeleteAndDestroy( 1, pTxtFmtCollTbl->Count()-1 );
622 	delete pTxtFmtCollTbl;
623 
624 	ASSERT( pDfltGrfFmtColl == (*pGrfFmtCollTbl)[0],
625 			"Default-Grf-Collection muss immer am Anfang stehen" );
626 
627 	pGrfFmtCollTbl->DeleteAndDestroy( 1, pGrfFmtCollTbl->Count()-1 );
628 // ergibt sich automatisch - kein _DEL Array!
629 //	pGrfFmtCollTbl->Remove( 0, n );
630 	delete pGrfFmtCollTbl;
631 
632 	/*
633 	 * Defaultformate und DefaultFormatsammlungen (FmtColl)
634 	 * sind an der Position 0 der jeweiligen Arrays eingetragen.
635 	 * Damit sie nicht vom DTOR der Array's zum 2.mal geloescht werden,
636 	 * nehme sie aus dem Array.
637 	 */
638 	pFrmFmtTbl->Remove( 0 );
639 	pCharFmtTbl->Remove( 0 );
640 
641 	// Delete fuer pPrt
642 	DELETEZ( pPrt );
643 	DELETEZ( pNewDBMgr );
644 
645 	// Alle Flys muessen vor dem Drawing Model zerstoert werden,
646 	// da Flys noch DrawContacts enthalten koennen, wenn wegen
647 	// eines Lesefehlers kein Layout aufgebaut wurde.
648 	pSpzFrmFmtTbl->DeleteAndDestroy( 0, pSpzFrmFmtTbl->Count() );
649 
650 	//Erst jetzt das Model zerstoeren, die Zeichenobjekte - die ja auch
651 	//im Undo herumlungern - wollen noch ihre Attribute beim Model entfernen.
652 	//Ausserdem koennen vorher noch DrawContacts existieren.
653 	ReleaseDrawModel();
654 	//JP 28.01.99: DrawModel vorm LinkManager zerstoeren, da am DrawModel
655 	// 			dieser immer gesetzt ist.
656 	DELETEZ( pLinkMgr );
657 
658 	//Tables vor dem loeschen der Defaults leeren, sonst GPF wegen Def-Abhaengigen.
659 	//Die Arrays sollten (wegen includes) bei Gelegenheit auch zu Pointern werden.
660 	delete pFrmFmtTbl;
661 	delete pSpzFrmFmtTbl;
662 
663     delete pStyleAccess;
664 
665 	delete pCharFmtTbl;
666 	delete pSectionFmtTbl;
667 	delete pTblFrmFmtTbl;
668 	delete pDfltTxtFmtColl;
669 	delete pDfltGrfFmtColl;
670 	delete pNumRuleTbl;
671 
672     // --> OD 2008-03-26 #refactorlists#
673     {
674         for ( std::hash_map< String, SwList*, StringHash >::iterator
675                                                     aListIter = maLists.begin();
676               aListIter != maLists.end();
677               ++aListIter )
678         {
679             delete (*aListIter).second;
680         }
681         maLists.clear();
682     }
683     maListStyleLists.clear();
684     // <--
685 
686 	delete pPrtData;
687 	delete pNumberFormatter;
688 	delete pFtnInfo;
689 	delete pEndNoteInfo;
690 	delete pLineNumberInfo;
691 	delete pFtnIdxs;
692 	delete pFldTypes;
693 	delete pTOXTypes;
694 	delete pDocStat;
695 	delete pEmptyPageFmt;
696 	delete pColumnContFmt;
697 	delete pDfltCharFmt;
698 	delete pDfltFrmFmt;
699     delete pLayoutCache;
700     delete pVirDev;
701 
702     SfxItemPool::Free(mpAttrPool);
703 }
704 
705 //---------------------------------------------------
706 
707 VirtualDevice& SwDoc::CreateVirtualDevice_() const
708 {
709     VirtualDevice* pNewVir = new VirtualDevice( 1 );
710 
711     // <--
712     pNewVir->SetReferenceDevice( VirtualDevice::REFDEV_MODE_MSO1 );
713 
714     // --> FME 2006-10-09 #i60945# External leading compatibility for unix systems.
715     if ( get(IDocumentSettingAccess::UNIX_FORCE_ZERO_EXT_LEADING ) )
716         pNewVir->Compat_ZeroExtleadBug();
717     // <--
718 
719     MapMode aMapMode( pNewVir->GetMapMode() );
720     aMapMode.SetMapUnit( MAP_TWIP );
721     pNewVir->SetMapMode( aMapMode );
722 
723     const_cast<SwDoc*>(this)->setVirtualDevice( pNewVir, true, true );
724     return *pVirDev;
725 }
726 
727 //---------------------------------------------------
728 
729 SfxPrinter& SwDoc::CreatePrinter_() const
730 {
731     ASSERT( ! pPrt, "Do not call CreatePrinter_(), call getPrinter() instead" )
732 
733 #if OSL_DEBUG_LEVEL > 1
734     OSL_TRACE( "Printer will be created!" );
735 #endif
736 
737     // wir erzeugen einen default SfxPrinter.
738 	// Das ItemSet wird vom Sfx geloescht!
739 	SfxItemSet *pSet = new SfxItemSet( ((SwDoc*)this)->GetAttrPool(),
740 					FN_PARAM_ADDPRINTER, FN_PARAM_ADDPRINTER,
741 					SID_HTML_MODE,	SID_HTML_MODE,
742 					SID_PRINTER_NOTFOUND_WARN, SID_PRINTER_NOTFOUND_WARN,
743 					SID_PRINTER_CHANGESTODOC, SID_PRINTER_CHANGESTODOC,
744 					0 );
745 
746     SfxPrinter* pNewPrt = new SfxPrinter( pSet );
747     const_cast<SwDoc*>(this)->setPrinter( pNewPrt, true, true );
748     return *pPrt;
749 }
750 //---------------------------------------------------
751 
752 void SwDoc::SetDocShell( SwDocShell* pDSh )
753 {
754 	if( pDocShell != pDSh )
755 	{
756         if (pDocShell)
757         {
758             pDocShell->SetUndoManager(0);
759         }
760 		pDocShell = pDSh;
761         if (pDocShell)
762         {
763             pDocShell->SetUndoManager(& GetUndoManager());
764         }
765 
766 		pLinkMgr->SetPersist( pDocShell );
767 		//JP 27.08.98: Bug 55570 - DocShell Pointer auch am DrawModel setzen
768 		if( pDrawModel )
769 		{
770 			((SwDrawDocument*)pDrawModel)->SetObjectShell( pDocShell );
771 			pDrawModel->SetPersist( pDocShell );
772 			ASSERT( pDrawModel->GetPersist() == GetPersist(),
773 					"draw model's persist is out of sync" );
774 		}
775 	}
776 }
777 
778 
779 // Convenience-Methode, um uebermaessige Includes von docsh.hxx
780 // zu vermeiden
781 
782 
783 
784 uno::Reference < embed::XStorage > SwDoc::GetDocStorage()
785 {
786 	if( pDocShell )
787 		return pDocShell->GetStorage();
788 	if( pLinkMgr->GetPersist() )
789 		return pLinkMgr->GetPersist()->GetStorage();
790 	return NULL;
791 }
792 
793 
794 
795 SfxObjectShell* SwDoc::GetPersist() const
796 {
797 	return pDocShell ? pDocShell : pLinkMgr->GetPersist();
798 }
799 
800 
801 void SwDoc::ClearDoc()
802 {
803     GetIDocumentUndoRedo().DelAllUndoObj();
804     ::sw::UndoGuard const undoGuard(GetIDocumentUndoRedo());
805 
806 	// Undo-Benachrichtigung vom Draw abschalten
807 	if( pDrawModel )
808 	{
809 		DrawNotifyUndoHdl();
810 		ClrContourCache();
811 	}
812 
813 	// stehen noch FlyFrames rum, loesche auch diese
814 	sal_uInt16 n;
815 	while ( 0 != (n = GetSpzFrmFmts()->Count()) )
816 		DelLayoutFmt((*pSpzFrmFmtTbl)[n-1]);
817 	ASSERT( !pDrawModel || !pDrawModel->GetPage(0)->GetObjCount(),
818 				"not all DrawObjects removed from the page" );
819 
820 	pRedlineTbl->DeleteAndDestroy( 0, pRedlineTbl->Count() );
821 
822 	if( pACEWord )
823 		delete pACEWord;
824 
825 	// in den BookMarks sind Indizies auf den Content. Diese muessen vorm
826 	// loesche der Nodes geloescht werden.
827     pMarkManager->clearAllMarks();
828     InitTOXTypes();
829 
830 	// create a dummy pagedesc for the layout
831 	sal_uInt16 nDummyPgDsc = MakePageDesc( String::CreateFromAscii( "?DUMMY?" ));
832 	SwPageDesc* pDummyPgDsc = aPageDescs[ nDummyPgDsc ];
833 
834 	SwNodeIndex aSttIdx( *GetNodes().GetEndOfContent().StartOfSectionNode(), 1 );
835 	// den ersten immer wieder neu anlegen (ohne Attribute/Vorlagen/...)
836 	SwTxtNode* pFirstNd = GetNodes().MakeTxtNode( aSttIdx, pDfltTxtFmtColl );
837 
838 	if( pCurrentView )	//swmod 071029//swmod 071225
839 	{
840 		// set the layout to the dummy pagedesc
841         pFirstNd->SetAttr( SwFmtPageDesc( pDummyPgDsc ));
842 
843 		SwPosition aPos( *pFirstNd, SwIndex( pFirstNd ));
844         SwPaM const tmpPaM(aSttIdx, SwNodeIndex(GetNodes().GetEndOfContent()));
845         ::PaMCorrAbs(tmpPaM, aPos);
846 	}
847 
848 	GetNodes().Delete( aSttIdx,
849 			GetNodes().GetEndOfContent().GetIndex() - aSttIdx.GetIndex() );
850 
851     // --> OD 2006-02-28 #i62440#
852     // destruction of numbering rules and creation of new outline rule
853     // *after* the document nodes are deleted.
854     pOutlineRule = NULL;
855     pNumRuleTbl->DeleteAndDestroy( 0, pNumRuleTbl->Count() );
856     // --> OD #i114725#,#i115828#
857     {
858         for ( std::hash_map< String, SwList*, StringHash >::iterator
859                                                     aListIter = maLists.begin();
860               aListIter != maLists.end();
861               ++aListIter )
862         {
863             delete (*aListIter).second;
864         }
865         maLists.clear();
866     }
867     maListStyleLists.clear();
868     // <--
869     // creation of new outline numbering rule
870     // --> OD 2008-02-11 #newlistlevelattrs#
871     pOutlineRule = new SwNumRule( String::CreateFromAscii( SwNumRule::GetOutlineRuleName() ),
872                                   // --> OD 2008-06-06 #i89178#
873                                   numfunc::GetDefaultPositionAndSpaceMode(),
874                                   // <--
875                                   OUTLINE_RULE );
876     // <--
877     AddNumRule(pOutlineRule);
878     // --> OD 2005-10-21 - counting of phantoms depends on <IsOldNumbering()>
879     pOutlineRule->SetCountPhantoms( !get(IDocumentSettingAccess::OLD_NUMBERING) );
880     // <--
881     // <--
882 
883 	//remove the dummy pagedec from the array and delete all the old ones
884 	aPageDescs.Remove( nDummyPgDsc );
885 	aPageDescs.DeleteAndDestroy( 0, aPageDescs.Count() );
886 
887 	// Delete fuer Collections
888 	// damit die Abhaengigen wech sind
889     pFtnInfo->ReleaseCollection();
890     pEndNoteInfo->ReleaseCollection();
891 
892 	// JP 27.01.98: opt.: ausgehend davon, das Standard als 2. im Array
893 	// 				steht, sollte das als letztes geloescht werden, damit
894 	//				die ganze Umhaengerei der Formate vermieden wird!
895 	if( 2 < pTxtFmtCollTbl->Count() )
896 		pTxtFmtCollTbl->DeleteAndDestroy( 2, pTxtFmtCollTbl->Count()-2 );
897 	pTxtFmtCollTbl->DeleteAndDestroy( 1, pTxtFmtCollTbl->Count()-1 );
898 	pGrfFmtCollTbl->DeleteAndDestroy( 1, pGrfFmtCollTbl->Count()-1 );
899 	pCharFmtTbl->DeleteAndDestroy( 1, pCharFmtTbl->Count()-1 );
900 
901 	if( pCurrentView )
902 	{
903 		// search the FrameFormat of the root frm. This is not allowed to delete
904 		pFrmFmtTbl->Remove( pFrmFmtTbl->GetPos( pCurrentView->GetLayout()->GetFmt() ) );
905 		pFrmFmtTbl->DeleteAndDestroy( 1, pFrmFmtTbl->Count()-1 );
906 		pFrmFmtTbl->Insert( pCurrentView->GetLayout()->GetFmt(), pFrmFmtTbl->Count() );
907 	}
908 	else	//swmod 071029//swmod 071225
909 		pFrmFmtTbl->DeleteAndDestroy( 1, pFrmFmtTbl->Count()-1 );
910 
911 	xForbiddenCharsTable.unbind();
912 
913 	pFldTypes->DeleteAndDestroy( INIT_FLDTYPES,
914 								pFldTypes->Count() - INIT_FLDTYPES );
915 
916 	delete pNumberFormatter, pNumberFormatter = 0;
917 
918 	GetPageDescFromPool( RES_POOLPAGE_STANDARD );
919 	pFirstNd->ChgFmtColl( GetTxtCollFromPool( RES_POOLCOLL_STANDARD ));
920 	nDummyPgDsc = aPageDescs.Count();
921 	aPageDescs.Insert( pDummyPgDsc, nDummyPgDsc );
922 	// set the layout back to the new standard pagedesc
923 	pFirstNd->ResetAllAttr();
924 	// delete now the dummy pagedesc
925 	DelPageDesc( nDummyPgDsc );
926 }
927 
928 void SwDoc::SetPreViewPrtData( const SwPagePreViewPrtData* pNew )
929 {
930 	if( pNew )
931 	{
932 		if( pPgPViewPrtData )
933 			*pPgPViewPrtData = *pNew;
934 		else
935 			pPgPViewPrtData = new SwPagePreViewPrtData( *pNew );
936 	}
937 	else if( pPgPViewPrtData )
938 		DELETEZ( pPgPViewPrtData );
939 	SetModified();
940 }
941 /* -----------------------------06.01.00 14:03--------------------------------
942 
943  ---------------------------------------------------------------------------*/
944 SwModify*	SwDoc::GetUnoCallBack() const
945 {
946 	return pUnoCallBack;
947 }
948 
949 /*-----------------28.5.2001 10:06------------------
950  * SwDoc:
951  *  Reading and writing of the layout cache.
952  *--------------------------------------------------*/
953 
954 void SwDoc::ReadLayoutCache( SvStream& rStream )
955 {
956     if( !pLayoutCache )
957         pLayoutCache = new SwLayoutCache();
958     if( !pLayoutCache->IsLocked() )
959     {
960         pLayoutCache->GetLockCount() |= 0x8000;
961         pLayoutCache->Read( rStream );
962         pLayoutCache->GetLockCount() &= 0x7fff;
963     }
964 }
965 
966 void SwDoc::WriteLayoutCache( SvStream& rStream )
967 {
968     pLayoutCache->Write( rStream, *this );
969 }
970 
971 IGrammarContact* getGrammarContact( const SwTxtNode& rTxtNode )
972 {
973     const SwDoc* pDoc = rTxtNode.GetDoc();
974     if( !pDoc || pDoc->IsInDtor() )
975         return 0;
976     return pDoc->getGrammarContact();
977 }
978 
979 // --> FME 2005-02-25 #i42634# Moved common code of SwReader::Read() and
980 // SwDocShell::UpdateLinks() to new SwDoc::UpdateLinks():
981 void SwDoc::UpdateLinks( sal_Bool bUI )
982 {
983     SfxObjectCreateMode eMode;
984     sal_uInt16 nLinkMode = getLinkUpdateMode( true );
985     sal_uInt16 nUpdateDocMode = GetDocShell()->GetUpdateDocMode();
986     if( GetDocShell() &&
987             (nLinkMode != NEVER ||  document::UpdateDocMode::FULL_UPDATE == nUpdateDocMode) &&
988         GetLinkManager().GetLinks().Count() &&
989         SFX_CREATE_MODE_INTERNAL !=
990                     ( eMode = GetDocShell()->GetCreateMode()) &&
991         SFX_CREATE_MODE_ORGANIZER != eMode &&
992         SFX_CREATE_MODE_PREVIEW != eMode &&
993         !GetDocShell()->IsPreview() )
994     {
995         ViewShell* pVSh = 0;
996         sal_Bool bAskUpdate = nLinkMode == MANUAL;
997         sal_Bool bUpdate = sal_True;
998         switch(nUpdateDocMode)
999         {
1000             case document::UpdateDocMode::NO_UPDATE:   bUpdate = sal_False;break;
1001             case document::UpdateDocMode::QUIET_UPDATE:bAskUpdate = sal_False; break;
1002             case document::UpdateDocMode::FULL_UPDATE: bAskUpdate = sal_True; break;
1003         }
1004         if( bUpdate && (bUI || !bAskUpdate) )
1005         {
1006             SfxMedium* pMedium = GetDocShell()->GetMedium();
1007             SfxFrame* pFrm = pMedium ? pMedium->GetLoadTargetFrame() : 0;
1008             Window* pDlgParent = pFrm ? &pFrm->GetWindow() : 0;
1009             if( GetCurrentViewShell() && !GetEditShell( &pVSh ) && !pVSh )	//swmod 071108//swmod 071225
1010             {
1011                 ViewShell aVSh( *this, 0, 0 );
1012 
1013                 SET_CURR_SHELL( &aVSh );
1014                 GetLinkManager().UpdateAllLinks( bAskUpdate , sal_True, sal_False, pDlgParent );
1015             }
1016             else
1017                 GetLinkManager().UpdateAllLinks( bAskUpdate, sal_True, sal_False, pDlgParent );
1018         }
1019     }
1020 
1021 }
1022 // <--
1023 // --> OD 2006-04-19 #b6375613#
1024 void SwDoc::SetApplyWorkaroundForB6375613( bool p_bApplyWorkaroundForB6375613 )
1025 {
1026     if ( mbApplyWorkaroundForB6375613 != p_bApplyWorkaroundForB6375613 )
1027     {
1028         mbApplyWorkaroundForB6375613 = p_bApplyWorkaroundForB6375613;
1029 
1030         uno::Reference< document::XDocumentInfoSupplier > xDoc(
1031                                                 GetDocShell()->GetBaseModel(),
1032                                                 uno::UNO_QUERY);
1033         if ( xDoc.is() )
1034         {
1035             uno::Reference< beans::XPropertyContainer > xDocInfo(
1036                                                         xDoc->getDocumentInfo(),
1037                                                         uno::UNO_QUERY );
1038             if ( xDocInfo.is() )
1039             {
1040                 try
1041                 {
1042                     if ( mbApplyWorkaroundForB6375613 )
1043                     {
1044                         xDocInfo->addProperty(
1045                             rtl::OUString::createFromAscii("WorkaroundForB6375613Applied"),
1046                             beans::PropertyAttribute::TRANSIENT | beans::PropertyAttribute::REMOVABLE,
1047                             uno::makeAny( false ) );
1048                     }
1049                     else
1050                     {
1051                         xDocInfo->removeProperty( rtl::OUString::createFromAscii("WorkaroundForB6375613Applied") );
1052                     }
1053                 }
1054                 catch( uno::Exception& )
1055                 {
1056                 }
1057             }
1058         }
1059     }
1060 }
1061 // <--
1062 
1063 ::sfx2::IXmlIdRegistry&
1064 SwDoc::GetXmlIdRegistry()
1065 {
1066     // UGLY: this relies on SetClipBoard being called before GetXmlIdRegistry!
1067     if (!m_pXmlIdRegistry.get())
1068     {
1069         m_pXmlIdRegistry.reset( ::sfx2::createXmlIdRegistry( IsClipBoard() ) );
1070     }
1071     return *m_pXmlIdRegistry;
1072 }
1073 
1074 ::sw::MetaFieldManager &
1075 SwDoc::GetMetaFieldManager()
1076 {
1077     return *m_pMetaFieldManager;
1078 }
1079 
1080 ::sw::UndoManager &
1081 SwDoc::GetUndoManager()
1082 {
1083     return *m_pUndoManager;
1084 }
1085 
1086 ::sw::UndoManager const&
1087 SwDoc::GetUndoManager() const
1088 {
1089     return *m_pUndoManager;
1090 }
1091 
1092 IDocumentUndoRedo &
1093 SwDoc::GetIDocumentUndoRedo()
1094 {
1095     return *m_pUndoManager;
1096 }
1097 
1098 IDocumentUndoRedo const&
1099 SwDoc::GetIDocumentUndoRedo() const
1100 {
1101     return *m_pUndoManager;
1102 }
1103 
1104 void SwDoc::InitTOXTypes()
1105 {
1106    ShellResource* pShellRes = ViewShell::GetShellRes();
1107    SwTOXType * pNew = new SwTOXType(TOX_CONTENT,   pShellRes->aTOXContentName        );
1108    pTOXTypes->Insert( pNew, pTOXTypes->Count() );
1109    pNew = new SwTOXType(TOX_INDEX,                 pShellRes->aTOXIndexName  );
1110    pTOXTypes->Insert( pNew, pTOXTypes->Count() );
1111    pNew = new SwTOXType(TOX_USER,                  pShellRes->aTOXUserName  );
1112    pTOXTypes->Insert( pNew, pTOXTypes->Count() );
1113    pNew = new SwTOXType(TOX_ILLUSTRATIONS,         pShellRes->aTOXIllustrationsName );
1114    pTOXTypes->Insert( pNew, pTOXTypes->Count() );
1115    pNew = new SwTOXType(TOX_OBJECTS,               pShellRes->aTOXObjectsName       );
1116    pTOXTypes->Insert( pNew, pTOXTypes->Count() );
1117    pNew = new SwTOXType(TOX_TABLES,                pShellRes->aTOXTablesName        );
1118    pTOXTypes->Insert( pNew, pTOXTypes->Count() );
1119    pNew = new SwTOXType(TOX_AUTHORITIES,           pShellRes->aTOXAuthoritiesName   );
1120    pTOXTypes->Insert( pNew, pTOXTypes->Count() );
1121 }
1122 
1123 /*-- 08.05.2009 10:07:57---------------------------------------------------
1124 
1125   -----------------------------------------------------------------------*/
1126 SfxObjectShell* SwDoc::CreateCopy(bool bCallInitNew ) const
1127 {
1128     SwDoc* pRet = new SwDoc;
1129     //copy settings
1130     sal_uInt16 __FAR_DATA aRangeOfDefaults[] = {
1131         RES_FRMATR_BEGIN, RES_FRMATR_END-1,
1132         RES_CHRATR_BEGIN, RES_CHRATR_END-1,
1133         RES_PARATR_BEGIN, RES_PARATR_END-1,
1134         // --> OD 2008-02-25 #refactorlists##
1135         RES_PARATR_LIST_BEGIN, RES_PARATR_LIST_END-1,
1136         // <--
1137         RES_UNKNOWNATR_BEGIN, RES_UNKNOWNATR_END-1,
1138         0
1139     };
1140 
1141     SfxItemSet aNewDefaults( pRet->GetAttrPool(), aRangeOfDefaults );
1142 
1143     sal_uInt16 nWhich;
1144     sal_uInt16 nRange = 0;
1145     while( aRangeOfDefaults[nRange] != 0)
1146     {
1147         for( nWhich = aRangeOfDefaults[nRange]; nWhich < aRangeOfDefaults[nRange + 1]; ++nWhich )
1148         {
1149             const SfxPoolItem& rSourceAttr = mpAttrPool->GetDefaultItem( nWhich );
1150             if( rSourceAttr != pRet->mpAttrPool->GetDefaultItem( nWhich ) )
1151                 aNewDefaults.Put( rSourceAttr );
1152         }
1153         nRange += 2;
1154     }
1155     if( aNewDefaults.Count() )
1156         pRet->SetDefault( aNewDefaults );
1157 
1158     pRet->n32DummyCompatabilityOptions1 = n32DummyCompatabilityOptions1;
1159     pRet->n32DummyCompatabilityOptions2 = n32DummyCompatabilityOptions2;
1160     pRet->mbParaSpaceMax                          = mbParaSpaceMax                          ;
1161     pRet->mbParaSpaceMaxAtPages                   = mbParaSpaceMaxAtPages                   ;
1162     pRet->mbTabCompat                             = mbTabCompat                             ;
1163     pRet->mbUseVirtualDevice                      = mbUseVirtualDevice                      ;
1164     pRet->mbAddExternalLeading                    = mbAddExternalLeading                    ;
1165     pRet->mbOldLineSpacing                        = mbOldLineSpacing                        ;
1166     pRet->mbAddParaSpacingToTableCells            = mbAddParaSpacingToTableCells            ;
1167     pRet->mbUseFormerObjectPos                    = mbUseFormerObjectPos                    ;
1168     pRet->mbUseFormerTextWrapping                 = mbUseFormerTextWrapping                 ;
1169     pRet->mbConsiderWrapOnObjPos                  = mbConsiderWrapOnObjPos                  ;
1170     pRet->mbAddFlyOffsets                         = mbAddFlyOffsets                         ;
1171     pRet->mbOldNumbering                          = mbOldNumbering                          ;
1172     pRet->mbUseHiResolutionVirtualDevice          = mbUseHiResolutionVirtualDevice          ;
1173     pRet->mbIgnoreFirstLineIndentInNumbering      = mbIgnoreFirstLineIndentInNumbering      ;
1174     pRet->mbDoNotJustifyLinesWithManualBreak      = mbDoNotJustifyLinesWithManualBreak      ;
1175     pRet->mbDoNotResetParaAttrsForNumFont         = mbDoNotResetParaAttrsForNumFont         ;
1176     pRet->mbOutlineLevelYieldsOutlineRule         = mbOutlineLevelYieldsOutlineRule         ;
1177     pRet->mbTableRowKeep                          = mbTableRowKeep                          ;
1178     pRet->mbIgnoreTabsAndBlanksForLineCalculation = mbIgnoreTabsAndBlanksForLineCalculation ;
1179     pRet->mbDoNotCaptureDrawObjsOnPage            = mbDoNotCaptureDrawObjsOnPage            ;
1180     pRet->mbClipAsCharacterAnchoredWriterFlyFrames= mbClipAsCharacterAnchoredWriterFlyFrames;
1181     pRet->mbUnixForceZeroExtLeading               = mbUnixForceZeroExtLeading               ;
1182     pRet->mbOldPrinterMetrics                     = mbOldPrinterMetrics                     ;
1183     pRet->mbTabRelativeToIndent                   = mbTabRelativeToIndent                   ;
1184     pRet->mbTabAtLeftIndentForParagraphsInList    = mbTabAtLeftIndentForParagraphsInList    ;
1185 
1186     //
1187     // COMPATIBILITY FLAGS END
1188     //
1189     pRet->ReplaceStyles( * const_cast< SwDoc*>( this ));
1190 
1191     // we have to use pointer here, since the callee has to decide whether SfxObjectShellLock or SfxObjectShellRef should be used
1192     // sometimes the object will be returned with refcount set to 0 ( if no DoInitNew is done )
1193     SfxObjectShell* pRetShell = new SwDocShell( pRet, SFX_CREATE_MODE_STANDARD );
1194     if( bCallInitNew )
1195     {
1196         // it could happen that DoInitNew creates model, that increases the refcount of the object
1197         pRetShell->DoInitNew();
1198     }
1199 
1200     //copy content
1201     pRet->Paste( *this );
1202 
1203     // remove the temporary shell if it is there as it was done before
1204     pRet->SetTmpDocShell( (SfxObjectShell*)NULL );
1205 
1206     return pRetShell;
1207 }
1208 /*-- 08.05.2009 10:52:40---------------------------------------------------
1209     copy document content - code from SwFEShell::Paste( SwDoc* , sal_Bool  )
1210   -----------------------------------------------------------------------*/
1211 void SwDoc::Paste( const SwDoc& rSource )
1212 {
1213 //  this has to be empty const sal_uInt16 nStartPageNumber = GetPhyPageNum();
1214     // until the end of the NodesArray
1215     SwNodeIndex aSourceIdx( rSource.GetNodes().GetEndOfExtras(), 2 );
1216     SwPaM aCpyPam( aSourceIdx ); //DocStart
1217     SwNodeIndex aTargetIdx( GetNodes().GetEndOfExtras(), 2 );
1218     SwPaM aInsertPam( aTargetIdx ); //replaces PCURCRSR from SwFEShell::Paste()
1219 
1220 
1221     aCpyPam.SetMark();
1222     aCpyPam.Move( fnMoveForward, fnGoDoc );
1223 
1224     this->GetIDocumentUndoRedo().StartUndo( UNDO_INSGLOSSARY, NULL );
1225     this->LockExpFlds();
1226 
1227     {
1228         SwPosition& rInsPos = *aInsertPam.GetPoint();
1229         //find out if the clipboard document starts with a table
1230         bool bStartWithTable = 0 != aCpyPam.Start()->nNode.GetNode().FindTableNode();
1231         SwPosition aInsertPosition( rInsPos );
1232 
1233         {
1234             SwNodeIndex aIndexBefore(rInsPos.nNode);
1235 
1236             aIndexBefore--;
1237 
1238             rSource.CopyRange( aCpyPam, rInsPos, true );
1239 
1240             {
1241                 aIndexBefore++;
1242                 SwPaM aPaM(SwPosition(aIndexBefore),
1243                            SwPosition(rInsPos.nNode));
1244 
1245                 MakeUniqueNumRules(aPaM);
1246             }
1247         }
1248 
1249         //TODO: Is this necessary here? SaveTblBoxCntnt( &rInsPos );
1250         if(/*bIncludingPageFrames && */bStartWithTable)
1251         {
1252             //remove the paragraph in front of the table
1253             SwPaM aPara(aInsertPosition);
1254             this->DelFullPara(aPara);
1255         }
1256         //additionally copy page bound frames
1257         if( /*bIncludingPageFrames && */rSource.GetSpzFrmFmts()->Count() )
1258         {
1259             for ( sal_uInt16 i = 0; i < rSource.GetSpzFrmFmts()->Count(); ++i )
1260             {
1261                 sal_Bool bInsWithFmt = sal_True;
1262                 const SwFrmFmt& rCpyFmt = *(*rSource.GetSpzFrmFmts())[i];
1263                 if( bInsWithFmt  )
1264                 {
1265                     SwFmtAnchor aAnchor( rCpyFmt.GetAnchor() );
1266                     if (FLY_AT_PAGE == aAnchor.GetAnchorId())
1267                     {
1268                         aAnchor.SetPageNum( aAnchor.GetPageNum() /*+ nStartPageNumber - */);
1269                     }
1270                     else
1271                         continue;
1272                     this->CopyLayoutFmt( rCpyFmt, aAnchor, true, true );
1273                 }
1274             }
1275         }
1276     }
1277 
1278     this->GetIDocumentUndoRedo().EndUndo( UNDO_INSGLOSSARY, NULL );
1279 
1280     UnlockExpFlds();
1281     UpdateFlds(NULL, false);
1282 }
1283