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