xref: /aoo41x/main/sw/source/core/doc/docnew.cxx (revision 79aad27f)
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     // --> OD 2005-02-11 #i38810#
292     mbLinksUpdated( sal_False ),
293     mbClipBoard( false ),
294     mbColumnSelection( false ),
295     // i#78591#
296 	mbProtectForm(false),
297     mbLastBrowseMode( false ),
298     n32DummyCompatabilityOptions1(0),
299     n32DummyCompatabilityOptions2(0),
300     mbStartIdleTimer(sal_False),
301 	mbSetDrawDefaults(false)
302 {
303 	RTL_LOGFILE_CONTEXT_AUTHOR( aLog, "SW", "JP93722",  "SwDoc::SwDoc" );
304 
305 	mbGlossDoc =
306 	mbModified =
307 	mbDtor =
308 	mbPageNums =
309 	mbLoaded =
310 	mbUpdateExpFld =
311 	mbNewDoc =
312 	mbCopyIsMove =
313 	mbInReading =
314     mbInXMLImport =
315 	mbUpdateTOX =
316 	mbInLoadAsynchron =
317 	mbHTMLMode =
318 	mbInCallModified =
319 	mbIsGlobalDoc =
320 	mbGlblDocSaveLinks =
321 	mbIsLabelDoc =
322 	mbIsAutoFmtRedline =
323 	mbOLEPrtNotifyPending =
324 	mbAllOLENotify =
325 	mbIsRedlineMove =
326 	mbInsOnlyTxtGlssry =
327 	mbContains_MSVBasic =
328 	mbKernAsianPunctuation =
329 #ifdef DBG_UTIL
330 	mbXMLExport =
331 #endif
332     // --> OD 2006-03-21 #b6375613#
333     mbApplyWorkaroundForB6375613 =
334     // <--
335                             false;
336 
337 	mbNewFldLst =
338 	mbVisibleLinks =
339     mbPurgeOLE =
340                             true;
341 
342     //
343     // COMPATIBILITY FLAGS START
344     //
345 
346     // Note: Any non-hidden compatibility flag should obtain its default
347     // by asking SvtCompatibilityOptions, see below.
348     //
349     const SvtCompatibilityOptions aOptions;
350     mbParaSpaceMax                      = aOptions.IsAddSpacing();
351     mbParaSpaceMaxAtPages               = aOptions.IsAddSpacingAtPages();
352     mbTabCompat                         = !aOptions.IsUseOurTabStops();
353     mbUseVirtualDevice                  = !aOptions.IsUsePrtDevice();
354     mbAddExternalLeading                = !aOptions.IsNoExtLeading();
355     mbOldLineSpacing                    = aOptions.IsUseLineSpacing();
356     mbAddParaSpacingToTableCells        = aOptions.IsAddTableSpacing();
357     mbUseFormerObjectPos                = aOptions.IsUseObjectPositioning();
358     mbUseFormerTextWrapping             = aOptions.IsUseOurTextWrapping();
359     mbConsiderWrapOnObjPos              = aOptions.IsConsiderWrappingStyle();
360     mbMathBaselineAlignment                 = false;        // default for *old* documents is 'off'
361     mbAddFlyOffsets                         = false;        // hidden
362     mbOldNumbering                          = false;        // hidden
363     mbUseHiResolutionVirtualDevice          = true;         // hidden
364     mbIgnoreFirstLineIndentInNumbering      = false;        // hidden
365     mbDoNotJustifyLinesWithManualBreak      = !aOptions.IsExpandWordSpace();
366     mbDoNotResetParaAttrsForNumFont         = false;        // hidden
367     mbOutlineLevelYieldsOutlineRule         = false;        // hidden
368     mbTableRowKeep                          = false;        // hidden
369     mbIgnoreTabsAndBlanksForLineCalculation = false;        // hidden
370     mbDoNotCaptureDrawObjsOnPage            = false;        // hidden
371     mbClipAsCharacterAnchoredWriterFlyFrames= false;        // hidden
372     mbUnixForceZeroExtLeading               = false;        // hidden
373     mbOldPrinterMetrics                     = false;        // hidden
374     mbTabRelativeToIndent                   = true;         // hidden
375     // --> OD 2008-06-05 #i89181#
376     mbTabAtLeftIndentForParagraphsInList    = false;        // hidden
377     // <--
378 
379     //
380     // COMPATIBILITY FLAGS END
381     //
382 
383 	pMacroTable = new SvxMacroTableDtor;
384 
385     mpGrammarContact = ::createGrammarContact();
386 
387 	/*
388 	 * Defaultformate und DefaultFormatsammlungen (FmtColl)
389 	 * werden an der Position 0 in das jeweilige Array eingetragen.
390 	 * Die Formate der FmtColls sind von den Defaultformaten
391 	 * abgeleitet und stehen auch in der Liste.
392 	 */
393 	/* Formate */
394 	pFrmFmtTbl->Insert(pDfltFrmFmt, 0 );
395 	pCharFmtTbl->Insert(pDfltCharFmt, 0 );
396 
397 	/* FmtColls */
398 	// TXT
399 	pTxtFmtCollTbl->Insert(pDfltTxtFmtColl, 0 );
400     // GRF
401 	pGrfFmtCollTbl->Insert(pDfltGrfFmtColl, 0 );
402 
403 	// PageDesc, EmptyPageFmt und ColumnFmt anlegen
404 	if ( !aPageDescs.Count() )
405 		GetPageDescFromPool( RES_POOLPAGE_STANDARD );
406 
407 		//Leere Seite Einstellen.
408     pEmptyPageFmt->SetFmtAttr( SwFmtFrmSize( ATT_FIX_SIZE ) );
409 		//BodyFmt fuer Spalten Einstellen.
410     pColumnContFmt->SetFmtAttr( SwFmtFillOrder( ATT_LEFT_TO_RIGHT ) );
411 
412 	_InitFieldTypes();
413 
414     // lege (fuer die Filter) eine Default-OutlineNumRule an
415     // --> OD 2008-02-11 #newlistlevelattrs#
416     pOutlineRule = new SwNumRule( String::CreateFromAscii( SwNumRule::GetOutlineRuleName() ),
417                                   // --> OD 2008-06-06 #i89178#
418                                   numfunc::GetDefaultPositionAndSpaceMode(),
419                                   // <--
420                                   OUTLINE_RULE );
421     // <--
422     // #115901#
423     AddNumRule(pOutlineRule);
424     // --> OD 2005-10-21 - counting of phantoms depends on <IsOldNumbering()>
425     pOutlineRule->SetCountPhantoms( !get(IDocumentSettingAccess::OLD_NUMBERING) );
426     // <--
427 
428     new SwTxtNode(
429             SwNodeIndex(GetUndoManager().GetUndoNodes().GetEndOfContent()),
430             pDfltTxtFmtColl );
431     new SwTxtNode( SwNodeIndex( GetNodes().GetEndOfContent() ),
432 					GetTxtCollFromPool( RES_POOLCOLL_STANDARD ));
433 
434 	// den eigenen IdleTimer setzen
435 	aIdleTimer.SetTimeout( 600 );
436 	aIdleTimer.SetTimeoutHdl( LINK(this, SwDoc, DoIdleJobs) );
437 
438 	aOLEModifiedTimer.SetTimeout( 1000 );
439 	aOLEModifiedTimer.SetTimeoutHdl( LINK( this, SwDoc, DoUpdateModifiedOLE ));
440 
441 	// DBMgr anlegen
442 	pNewDBMgr = new SwNewDBMgr;
443 
444 	// create TOXTypes
445     InitTOXTypes();
446 
447     // --> OD 2008-03-07 #refactorlists#
448     // pass empty item set containing the paragraph's list attributes
449     // as ignorable items to the stype manager.
450     {
451         SfxItemSet aIgnorableParagraphItems( GetAttrPool(),
452                                              RES_PARATR_LIST_BEGIN, RES_PARATR_LIST_END-1,
453                                              0 );
454         pStyleAccess = createStyleManager( &aIgnorableParagraphItems );
455     }
456     // <--
457 
458     ResetModified();
459 }
460 
461 /*
462  * Besonderheiten: an der Position 0 des Arrays der Formate und
463  * der GDI-Objekte befindet sich ein Member der Klasse SwDoc.
464  * Dieser darf also keinesfalls durch delete geloescht
465  * werden!!!!!!!!!!
466  */
467 
468 
469 SwDoc::~SwDoc()
470 {
471     // nothing here should create Undo actions!
472     GetIDocumentUndoRedo().DoUndo(false);
473 
474     if (pDocShell)
475     {
476         pDocShell->SetUndoManager(0);
477     }
478 
479     // --> OD 2007-03-16 #i73788#
480     SwPauseThreadStarting aPauseThreadStarting;
481     // <--
482 
483     // --> OD 2007-11-01 #i83479#
484     delete mpListItemsList;
485     mpListItemsList = 0;
486     // <--
487 
488     // clean up chart related structures...
489     // Note: the chart data provider gets already diposed in ~SwDocShell
490     // since all UNO API related functionality requires an existing SwDocShell
491     // this assures that dipose gets called if there is need for it.
492     aChartDataProviderImplRef.reset();
493     delete pChartControllerHelper;
494 
495     delete mpGrammarContact;
496     mpGrammarContact = 0;
497 
498     //!! needs to be done to destroy a possible SwFmtDrop format that may
499     //!! be connected to a char format which may not otherwise be removed
500     //!! and thus would leave a unremoved SwFmt object. (TL)
501     //!! (this is case is not possible via UI but via API...)
502     SwFmtDrop aDrop;
503     SetDefault(aDrop);
504     //!! same for SwFmtCharFmt
505     SwFmtCharFmt aCharFmt(NULL);
506     SetDefault(aCharFmt);
507 
508 	StopIdling();	// stop idle timer
509 
510 	delete pUnoCallBack, pUnoCallBack = 0;
511 	delete pURLStateChgd;
512 
513 	delete pLayouter;
514     // --> OD 2005-09-05 #125370#
515     pLayouter = 0L;
516     // <--
517 
518 	// Undo-Benachrichtigung vom Draw abschalten
519 	if( pDrawModel )
520 	{
521 		DrawNotifyUndoHdl();
522 		ClrContourCache();
523 	}
524 
525 	delete pPgPViewPrtData;
526 
527 	mbDtor = sal_True;
528 	pLayoutPtr.reset();
529 
530 	delete pRedlineTbl;
531 	delete pUnoCrsrTbl;
532 	delete pAutoFmtRedlnComment;
533 
534 	if( pUpdtFlds )
535 		delete pUpdtFlds;
536 
537 	if( pACEWord )
538 		delete pACEWord;
539 
540 	// die BaseLinks freigeben.
541 	{
542 		for( sal_uInt16 n = pLinkMgr->GetServers().Count(); n; )
543 			pLinkMgr->GetServers()[ --n ]->Closed();
544 
545 		if( pLinkMgr->GetLinks().Count() )
546 			pLinkMgr->Remove( 0, pLinkMgr->GetLinks().Count() );
547 	}
548 
549 	// die KapitelNummern / Nummern muessen vor den Vorlage geloescht werden
550 	// ansonsten wird noch staendig geupdatet !!!
551     m_pNodes->pOutlineNds->Remove(sal_uInt16(0), m_pNodes->pOutlineNds->Count());
552     SwNodes & rUndoNodes( GetUndoManager().GetUndoNodes() );
553     rUndoNodes.pOutlineNds->Remove(sal_uInt16(0), rUndoNodes.pOutlineNds->Count());
554 
555 	pFtnIdxs->Remove( sal_uInt16(0), pFtnIdxs->Count() );
556 
557     // indices could be registered in attributes
558     m_pUndoManager->DelAllUndoObj();
559 
560 	// in den BookMarks sind Indizies auf den Content. Diese muessen vorm
561 	// loesche der Nodes geloescht werden.
562     pMarkManager->clearAllMarks();
563 	DELETEZ( pMacroTable );
564 
565 	if( pExtInputRing )
566 	{
567 		Ring* pTmp = pExtInputRing;
568 		pExtInputRing = 0;
569 		while( pTmp->GetNext() != pTmp )
570 			delete pTmp->GetNext();
571 		delete pTmp;
572 	}
573 
574 //JP: alt - loeschen ohne Flag ist teuer; Modify wird verschickt!
575 //	aTOXTypes.DeleteAndDestroy( 0, aTOXTypes.Count() );
576 	{
577 		for( sal_uInt16 n = pTOXTypes->Count(); n; )
578 		{
579 			(*pTOXTypes)[ --n ]->SetInDocDTOR();
580 			delete (*pTOXTypes)[ n ];
581 		}
582 		pTOXTypes->Remove( 0, pTOXTypes->Count() );
583 	}
584 	delete pDefTOXBases;
585 
586 	//Im einen oder anderen FrmFormat koennen noch Indizes angemeldet sein,
587 	//Diese muessen spaetestens jetzt zerstoert werden.
588 	pFrmFmtTbl->ForEach( &lcl_DelFmtIndizes, this );
589 	pSpzFrmFmtTbl->ForEach( &lcl_DelFmtIndizes, this );
590 	((SwFrmFmts&)*pSectionFmtTbl).ForEach( &lcl_DelFmtIndizes, this );
591 
592 	//Die Formate, die hier hinter stehen sind von den DefaultFormaten
593 	//abhaengig. Erst nach dem Loeschen der FmtIndizes weil der Inhalt von
594 	//Kopf-/Fussbereichen geloescht wird. Wenn dort noch Indizes von Flys
595 	//angemeldet sind gibts was an die Ohren.
596 	aPageDescs.DeleteAndDestroy( 0, aPageDescs.Count() );
597 
598 	// Inhaltssections loeschen
599 	// nicht erst durch den SwNodes-DTOR, damit Formate
600 	// keine Abhaengigen mehr haben.
601     m_pNodes->DelNodes( SwNodeIndex(*m_pNodes), m_pNodes->Count() );
602     rUndoNodes.DelNodes( SwNodeIndex( rUndoNodes ), rUndoNodes.Count() );
603 
604 	// Formate loeschen, spaeter mal permanent machen.
605 
606 	// Delete fuer Collections
607 	// damit die Abhaengigen wech sind
608     pFtnInfo->ReleaseCollection();
609     pEndNoteInfo->ReleaseCollection();
610 
611 	ASSERT( pDfltTxtFmtColl == (*pTxtFmtCollTbl)[0],
612 			"Default-Text-Collection muss immer am Anfang stehen" );
613 
614 	// JP 27.01.98: opt.: ausgehend davon, das Standard als 2. im Array
615 	// 				steht, sollte das als letztes geloescht werden, damit
616 	//				die ganze Umhaengerei der Formate vermieden wird!
617 	if( 2 < pTxtFmtCollTbl->Count() )
618 		pTxtFmtCollTbl->DeleteAndDestroy( 2, pTxtFmtCollTbl->Count()-2 );
619 	pTxtFmtCollTbl->DeleteAndDestroy( 1, pTxtFmtCollTbl->Count()-1 );
620 	delete pTxtFmtCollTbl;
621 
622 	ASSERT( pDfltGrfFmtColl == (*pGrfFmtCollTbl)[0],
623 			"Default-Grf-Collection muss immer am Anfang stehen" );
624 
625 	pGrfFmtCollTbl->DeleteAndDestroy( 1, pGrfFmtCollTbl->Count()-1 );
626 // ergibt sich automatisch - kein _DEL Array!
627 //	pGrfFmtCollTbl->Remove( 0, n );
628 	delete pGrfFmtCollTbl;
629 
630 	/*
631 	 * Defaultformate und DefaultFormatsammlungen (FmtColl)
632 	 * sind an der Position 0 der jeweiligen Arrays eingetragen.
633 	 * Damit sie nicht vom DTOR der Array's zum 2.mal geloescht werden,
634 	 * nehme sie aus dem Array.
635 	 */
636 	pFrmFmtTbl->Remove( 0 );
637 	pCharFmtTbl->Remove( 0 );
638 
639 	// Delete fuer pPrt
640 	DELETEZ( pPrt );
641 	DELETEZ( pNewDBMgr );
642 
643 	// Alle Flys muessen vor dem Drawing Model zerstoert werden,
644 	// da Flys noch DrawContacts enthalten koennen, wenn wegen
645 	// eines Lesefehlers kein Layout aufgebaut wurde.
646 	pSpzFrmFmtTbl->DeleteAndDestroy( 0, pSpzFrmFmtTbl->Count() );
647 
648 	//Erst jetzt das Model zerstoeren, die Zeichenobjekte - die ja auch
649 	//im Undo herumlungern - wollen noch ihre Attribute beim Model entfernen.
650 	//Ausserdem koennen vorher noch DrawContacts existieren.
651 	ReleaseDrawModel();
652 	//JP 28.01.99: DrawModel vorm LinkManager zerstoeren, da am DrawModel
653 	// 			dieser immer gesetzt ist.
654 	DELETEZ( pLinkMgr );
655 
656 	//Tables vor dem loeschen der Defaults leeren, sonst GPF wegen Def-Abhaengigen.
657 	//Die Arrays sollten (wegen includes) bei Gelegenheit auch zu Pointern werden.
658 	delete pFrmFmtTbl;
659 	delete pSpzFrmFmtTbl;
660 
661     delete pStyleAccess;
662 
663 	delete pCharFmtTbl;
664 	delete pSectionFmtTbl;
665 	delete pTblFrmFmtTbl;
666 	delete pDfltTxtFmtColl;
667 	delete pDfltGrfFmtColl;
668 	delete pNumRuleTbl;
669 
670     // --> OD 2008-03-26 #refactorlists#
671     {
672         for ( std::hash_map< String, SwList*, StringHash >::iterator
673                                                     aListIter = maLists.begin();
674               aListIter != maLists.end();
675               ++aListIter )
676         {
677             delete (*aListIter).second;
678         }
679         maLists.clear();
680     }
681     maListStyleLists.clear();
682     // <--
683 
684 	delete pPrtData;
685 	delete pNumberFormatter;
686 	delete pFtnInfo;
687 	delete pEndNoteInfo;
688 	delete pLineNumberInfo;
689 	delete pFtnIdxs;
690 	delete pFldTypes;
691 	delete pTOXTypes;
692 	delete pDocStat;
693 	delete pEmptyPageFmt;
694 	delete pColumnContFmt;
695 	delete pDfltCharFmt;
696 	delete pDfltFrmFmt;
697     delete pLayoutCache;
698     delete pVirDev;
699 
700     SfxItemPool::Free(mpAttrPool);
701 }
702 
703 //---------------------------------------------------
704 
705 VirtualDevice& SwDoc::CreateVirtualDevice_() const
706 {
707     VirtualDevice* pNewVir = new VirtualDevice( 1 );
708 
709     // <--
710     pNewVir->SetReferenceDevice( VirtualDevice::REFDEV_MODE_MSO1 );
711 
712     // --> FME 2006-10-09 #i60945# External leading compatibility for unix systems.
713     if ( get(IDocumentSettingAccess::UNIX_FORCE_ZERO_EXT_LEADING ) )
714         pNewVir->Compat_ZeroExtleadBug();
715     // <--
716 
717     MapMode aMapMode( pNewVir->GetMapMode() );
718     aMapMode.SetMapUnit( MAP_TWIP );
719     pNewVir->SetMapMode( aMapMode );
720 
721     const_cast<SwDoc*>(this)->setVirtualDevice( pNewVir, true, true );
722     return *pVirDev;
723 }
724 
725 //---------------------------------------------------
726 
727 SfxPrinter& SwDoc::CreatePrinter_() const
728 {
729     ASSERT( ! pPrt, "Do not call CreatePrinter_(), call getPrinter() instead" )
730 
731 #if OSL_DEBUG_LEVEL > 1
732     OSL_TRACE( "Printer will be created!" );
733 #endif
734 
735     // wir erzeugen einen default SfxPrinter.
736 	// Das ItemSet wird vom Sfx geloescht!
737 	SfxItemSet *pSet = new SfxItemSet( ((SwDoc*)this)->GetAttrPool(),
738 					FN_PARAM_ADDPRINTER, FN_PARAM_ADDPRINTER,
739 					SID_HTML_MODE,	SID_HTML_MODE,
740 					SID_PRINTER_NOTFOUND_WARN, SID_PRINTER_NOTFOUND_WARN,
741 					SID_PRINTER_CHANGESTODOC, SID_PRINTER_CHANGESTODOC,
742 					0 );
743 
744     SfxPrinter* pNewPrt = new SfxPrinter( pSet );
745     const_cast<SwDoc*>(this)->setPrinter( pNewPrt, true, true );
746     return *pPrt;
747 }
748 //---------------------------------------------------
749 
750 void SwDoc::SetDocShell( SwDocShell* pDSh )
751 {
752 	if( pDocShell != pDSh )
753 	{
754         if (pDocShell)
755         {
756             pDocShell->SetUndoManager(0);
757         }
758 		pDocShell = pDSh;
759         if (pDocShell)
760         {
761             pDocShell->SetUndoManager(& GetUndoManager());
762         }
763 
764 		pLinkMgr->SetPersist( pDocShell );
765 		//JP 27.08.98: Bug 55570 - DocShell Pointer auch am DrawModel setzen
766 		if( pDrawModel )
767 		{
768 			((SwDrawDocument*)pDrawModel)->SetObjectShell( pDocShell );
769 			pDrawModel->SetPersist( pDocShell );
770 			ASSERT( pDrawModel->GetPersist() == GetPersist(),
771 					"draw model's persist is out of sync" );
772 		}
773 	}
774 }
775 
776 
777 // Convenience-Methode, um uebermaessige Includes von docsh.hxx
778 // zu vermeiden
779 
780 
781 
782 uno::Reference < embed::XStorage > SwDoc::GetDocStorage()
783 {
784 	if( pDocShell )
785 		return pDocShell->GetStorage();
786 	if( pLinkMgr->GetPersist() )
787 		return pLinkMgr->GetPersist()->GetStorage();
788 	return NULL;
789 }
790 
791 
792 
793 SfxObjectShell* SwDoc::GetPersist() const
794 {
795 	return pDocShell ? pDocShell : pLinkMgr->GetPersist();
796 }
797 
798 
799 void SwDoc::ClearDoc()
800 {
801     GetIDocumentUndoRedo().DelAllUndoObj();
802     ::sw::UndoGuard const undoGuard(GetIDocumentUndoRedo());
803 
804 	// Undo-Benachrichtigung vom Draw abschalten
805 	if( pDrawModel )
806 	{
807 		DrawNotifyUndoHdl();
808 		ClrContourCache();
809 	}
810 
811 	// stehen noch FlyFrames rum, loesche auch diese
812 	sal_uInt16 n;
813 	while ( 0 != (n = GetSpzFrmFmts()->Count()) )
814 		DelLayoutFmt((*pSpzFrmFmtTbl)[n-1]);
815 	ASSERT( !pDrawModel || !pDrawModel->GetPage(0)->GetObjCount(),
816 				"not all DrawObjects removed from the page" );
817 
818 	pRedlineTbl->DeleteAndDestroy( 0, pRedlineTbl->Count() );
819 
820 	if( pACEWord )
821 		delete pACEWord;
822 
823 	// in den BookMarks sind Indizies auf den Content. Diese muessen vorm
824 	// loesche der Nodes geloescht werden.
825     pMarkManager->clearAllMarks();
826     InitTOXTypes();
827 
828 	// create a dummy pagedesc for the layout
829 	sal_uInt16 nDummyPgDsc = MakePageDesc( String::CreateFromAscii( "?DUMMY?" ));
830 	SwPageDesc* pDummyPgDsc = aPageDescs[ nDummyPgDsc ];
831 
832 	SwNodeIndex aSttIdx( *GetNodes().GetEndOfContent().StartOfSectionNode(), 1 );
833 	// den ersten immer wieder neu anlegen (ohne Attribute/Vorlagen/...)
834 	SwTxtNode* pFirstNd = GetNodes().MakeTxtNode( aSttIdx, pDfltTxtFmtColl );
835 
836 	if( pCurrentView )	//swmod 071029//swmod 071225
837 	{
838 		// set the layout to the dummy pagedesc
839         pFirstNd->SetAttr( SwFmtPageDesc( pDummyPgDsc ));
840 
841 		SwPosition aPos( *pFirstNd, SwIndex( pFirstNd ));
842         SwPaM const tmpPaM(aSttIdx, SwNodeIndex(GetNodes().GetEndOfContent()));
843         ::PaMCorrAbs(tmpPaM, aPos);
844 	}
845 
846 	GetNodes().Delete( aSttIdx,
847 			GetNodes().GetEndOfContent().GetIndex() - aSttIdx.GetIndex() );
848 
849     // --> OD 2006-02-28 #i62440#
850     // destruction of numbering rules and creation of new outline rule
851     // *after* the document nodes are deleted.
852     pOutlineRule = NULL;
853     pNumRuleTbl->DeleteAndDestroy( 0, pNumRuleTbl->Count() );
854     // --> OD #i114725#,#i115828#
855     {
856         for ( std::hash_map< String, SwList*, StringHash >::iterator
857                                                     aListIter = maLists.begin();
858               aListIter != maLists.end();
859               ++aListIter )
860         {
861             delete (*aListIter).second;
862         }
863         maLists.clear();
864     }
865     maListStyleLists.clear();
866     // <--
867     // creation of new outline numbering rule
868     // --> OD 2008-02-11 #newlistlevelattrs#
869     pOutlineRule = new SwNumRule( String::CreateFromAscii( SwNumRule::GetOutlineRuleName() ),
870                                   // --> OD 2008-06-06 #i89178#
871                                   numfunc::GetDefaultPositionAndSpaceMode(),
872                                   // <--
873                                   OUTLINE_RULE );
874     // <--
875     AddNumRule(pOutlineRule);
876     // --> OD 2005-10-21 - counting of phantoms depends on <IsOldNumbering()>
877     pOutlineRule->SetCountPhantoms( !get(IDocumentSettingAccess::OLD_NUMBERING) );
878     // <--
879     // <--
880 
881 	//remove the dummy pagedec from the array and delete all the old ones
882 	aPageDescs.Remove( nDummyPgDsc );
883 	aPageDescs.DeleteAndDestroy( 0, aPageDescs.Count() );
884 
885 	// Delete fuer Collections
886 	// damit die Abhaengigen wech sind
887     pFtnInfo->ReleaseCollection();
888     pEndNoteInfo->ReleaseCollection();
889 
890 	// JP 27.01.98: opt.: ausgehend davon, das Standard als 2. im Array
891 	// 				steht, sollte das als letztes geloescht werden, damit
892 	//				die ganze Umhaengerei der Formate vermieden wird!
893 	if( 2 < pTxtFmtCollTbl->Count() )
894 		pTxtFmtCollTbl->DeleteAndDestroy( 2, pTxtFmtCollTbl->Count()-2 );
895 	pTxtFmtCollTbl->DeleteAndDestroy( 1, pTxtFmtCollTbl->Count()-1 );
896 	pGrfFmtCollTbl->DeleteAndDestroy( 1, pGrfFmtCollTbl->Count()-1 );
897 	pCharFmtTbl->DeleteAndDestroy( 1, pCharFmtTbl->Count()-1 );
898 
899 	if( pCurrentView )
900 	{
901 		// search the FrameFormat of the root frm. This is not allowed to delete
902 		pFrmFmtTbl->Remove( pFrmFmtTbl->GetPos( pCurrentView->GetLayout()->GetFmt() ) );
903 		pFrmFmtTbl->DeleteAndDestroy( 1, pFrmFmtTbl->Count()-1 );
904 		pFrmFmtTbl->Insert( pCurrentView->GetLayout()->GetFmt(), pFrmFmtTbl->Count() );
905 	}
906 	else	//swmod 071029//swmod 071225
907 		pFrmFmtTbl->DeleteAndDestroy( 1, pFrmFmtTbl->Count()-1 );
908 
909 	xForbiddenCharsTable.unbind();
910 
911 	pFldTypes->DeleteAndDestroy( INIT_FLDTYPES,
912 								pFldTypes->Count() - INIT_FLDTYPES );
913 
914 	delete pNumberFormatter, pNumberFormatter = 0;
915 
916 	GetPageDescFromPool( RES_POOLPAGE_STANDARD );
917 	pFirstNd->ChgFmtColl( GetTxtCollFromPool( RES_POOLCOLL_STANDARD ));
918 	nDummyPgDsc = aPageDescs.Count();
919 	aPageDescs.Insert( pDummyPgDsc, nDummyPgDsc );
920 	// set the layout back to the new standard pagedesc
921 	pFirstNd->ResetAllAttr();
922 	// delete now the dummy pagedesc
923 	DelPageDesc( nDummyPgDsc );
924 }
925 
926 void SwDoc::SetPreViewPrtData( const SwPagePreViewPrtData* pNew )
927 {
928 	if( pNew )
929 	{
930 		if( pPgPViewPrtData )
931 			*pPgPViewPrtData = *pNew;
932 		else
933 			pPgPViewPrtData = new SwPagePreViewPrtData( *pNew );
934 	}
935 	else if( pPgPViewPrtData )
936 		DELETEZ( pPgPViewPrtData );
937 	SetModified();
938 }
939 /* -----------------------------06.01.00 14:03--------------------------------
940 
941  ---------------------------------------------------------------------------*/
942 SwModify*	SwDoc::GetUnoCallBack() const
943 {
944 	return pUnoCallBack;
945 }
946 
947 /*-----------------28.5.2001 10:06------------------
948  * SwDoc:
949  *  Reading and writing of the layout cache.
950  *--------------------------------------------------*/
951 
952 void SwDoc::ReadLayoutCache( SvStream& rStream )
953 {
954     if( !pLayoutCache )
955         pLayoutCache = new SwLayoutCache();
956     if( !pLayoutCache->IsLocked() )
957     {
958         pLayoutCache->GetLockCount() |= 0x8000;
959         pLayoutCache->Read( rStream );
960         pLayoutCache->GetLockCount() &= 0x7fff;
961     }
962 }
963 
964 void SwDoc::WriteLayoutCache( SvStream& rStream )
965 {
966     pLayoutCache->Write( rStream, *this );
967 }
968 
969 IGrammarContact* getGrammarContact( const SwTxtNode& rTxtNode )
970 {
971     const SwDoc* pDoc = rTxtNode.GetDoc();
972     if( !pDoc || pDoc->IsInDtor() )
973         return 0;
974     return pDoc->getGrammarContact();
975 }
976 
977 // --> FME 2005-02-25 #i42634# Moved common code of SwReader::Read() and
978 // SwDocShell::UpdateLinks() to new SwDoc::UpdateLinks():
979 void SwDoc::UpdateLinks( sal_Bool bUI )
980 {
981     SfxObjectCreateMode eMode;
982     sal_uInt16 nLinkMode = getLinkUpdateMode( true );
983     sal_uInt16 nUpdateDocMode = GetDocShell()->GetUpdateDocMode();
984     if( GetDocShell() &&
985             (nLinkMode != NEVER ||  document::UpdateDocMode::FULL_UPDATE == nUpdateDocMode) &&
986         GetLinkManager().GetLinks().Count() &&
987         SFX_CREATE_MODE_INTERNAL !=
988                     ( eMode = GetDocShell()->GetCreateMode()) &&
989         SFX_CREATE_MODE_ORGANIZER != eMode &&
990         SFX_CREATE_MODE_PREVIEW != eMode &&
991         !GetDocShell()->IsPreview() )
992     {
993         ViewShell* pVSh = 0;
994         sal_Bool bAskUpdate = nLinkMode == MANUAL;
995         sal_Bool bUpdate = sal_True;
996         switch(nUpdateDocMode)
997         {
998             case document::UpdateDocMode::NO_UPDATE:   bUpdate = sal_False;break;
999             case document::UpdateDocMode::QUIET_UPDATE:bAskUpdate = sal_False; break;
1000             case document::UpdateDocMode::FULL_UPDATE: bAskUpdate = sal_True; break;
1001         }
1002         if( bUpdate && (bUI || !bAskUpdate) )
1003         {
1004             SfxMedium* pMedium = GetDocShell()->GetMedium();
1005             SfxFrame* pFrm = pMedium ? pMedium->GetLoadTargetFrame() : 0;
1006             Window* pDlgParent = pFrm ? &pFrm->GetWindow() : 0;
1007             if( GetCurrentViewShell() && !GetEditShell( &pVSh ) && !pVSh )	//swmod 071108//swmod 071225
1008             {
1009                 ViewShell aVSh( *this, 0, 0 );
1010 
1011                 SET_CURR_SHELL( &aVSh );
1012                 GetLinkManager().UpdateAllLinks( bAskUpdate , sal_True, sal_False, pDlgParent );
1013             }
1014             else
1015                 GetLinkManager().UpdateAllLinks( bAskUpdate, sal_True, sal_False, pDlgParent );
1016         }
1017     }
1018 
1019 }
1020 // <--
1021 // --> OD 2006-04-19 #b6375613#
1022 void SwDoc::SetApplyWorkaroundForB6375613( bool p_bApplyWorkaroundForB6375613 )
1023 {
1024     if ( mbApplyWorkaroundForB6375613 != p_bApplyWorkaroundForB6375613 )
1025     {
1026         mbApplyWorkaroundForB6375613 = p_bApplyWorkaroundForB6375613;
1027 
1028         uno::Reference< document::XDocumentInfoSupplier > xDoc(
1029                                                 GetDocShell()->GetBaseModel(),
1030                                                 uno::UNO_QUERY);
1031         if ( xDoc.is() )
1032         {
1033             uno::Reference< beans::XPropertyContainer > xDocInfo(
1034                                                         xDoc->getDocumentInfo(),
1035                                                         uno::UNO_QUERY );
1036             if ( xDocInfo.is() )
1037             {
1038                 try
1039                 {
1040                     if ( mbApplyWorkaroundForB6375613 )
1041                     {
1042                         xDocInfo->addProperty(
1043                             rtl::OUString::createFromAscii("WorkaroundForB6375613Applied"),
1044                             beans::PropertyAttribute::TRANSIENT | beans::PropertyAttribute::REMOVABLE,
1045                             uno::makeAny( false ) );
1046                     }
1047                     else
1048                     {
1049                         xDocInfo->removeProperty( rtl::OUString::createFromAscii("WorkaroundForB6375613Applied") );
1050                     }
1051                 }
1052                 catch( uno::Exception& )
1053                 {
1054                 }
1055             }
1056         }
1057     }
1058 }
1059 // <--
1060 
1061 ::sfx2::IXmlIdRegistry&
1062 SwDoc::GetXmlIdRegistry()
1063 {
1064     // UGLY: this relies on SetClipBoard being called before GetXmlIdRegistry!
1065     if (!m_pXmlIdRegistry.get())
1066     {
1067         m_pXmlIdRegistry.reset( ::sfx2::createXmlIdRegistry( IsClipBoard() ) );
1068     }
1069     return *m_pXmlIdRegistry;
1070 }
1071 
1072 ::sw::MetaFieldManager &
1073 SwDoc::GetMetaFieldManager()
1074 {
1075     return *m_pMetaFieldManager;
1076 }
1077 
1078 ::sw::UndoManager &
1079 SwDoc::GetUndoManager()
1080 {
1081     return *m_pUndoManager;
1082 }
1083 
1084 ::sw::UndoManager const&
1085 SwDoc::GetUndoManager() const
1086 {
1087     return *m_pUndoManager;
1088 }
1089 
1090 IDocumentUndoRedo &
1091 SwDoc::GetIDocumentUndoRedo()
1092 {
1093     return *m_pUndoManager;
1094 }
1095 
1096 IDocumentUndoRedo const&
1097 SwDoc::GetIDocumentUndoRedo() const
1098 {
1099     return *m_pUndoManager;
1100 }
1101 
1102 void SwDoc::InitTOXTypes()
1103 {
1104    ShellResource* pShellRes = ViewShell::GetShellRes();
1105    SwTOXType * pNew = new SwTOXType(TOX_CONTENT,   pShellRes->aTOXContentName        );
1106    pTOXTypes->Insert( pNew, pTOXTypes->Count() );
1107    pNew = new SwTOXType(TOX_INDEX,                 pShellRes->aTOXIndexName  );
1108    pTOXTypes->Insert( pNew, pTOXTypes->Count() );
1109    pNew = new SwTOXType(TOX_USER,                  pShellRes->aTOXUserName  );
1110    pTOXTypes->Insert( pNew, pTOXTypes->Count() );
1111    pNew = new SwTOXType(TOX_ILLUSTRATIONS,         pShellRes->aTOXIllustrationsName );
1112    pTOXTypes->Insert( pNew, pTOXTypes->Count() );
1113    pNew = new SwTOXType(TOX_OBJECTS,               pShellRes->aTOXObjectsName       );
1114    pTOXTypes->Insert( pNew, pTOXTypes->Count() );
1115    pNew = new SwTOXType(TOX_TABLES,                pShellRes->aTOXTablesName        );
1116    pTOXTypes->Insert( pNew, pTOXTypes->Count() );
1117    pNew = new SwTOXType(TOX_AUTHORITIES,           pShellRes->aTOXAuthoritiesName   );
1118    pTOXTypes->Insert( pNew, pTOXTypes->Count() );
1119 }
1120 
1121 /*-- 08.05.2009 10:07:57---------------------------------------------------
1122 
1123   -----------------------------------------------------------------------*/
1124 SfxObjectShell* SwDoc::CreateCopy(bool bCallInitNew ) const
1125 {
1126     SwDoc* pRet = new SwDoc;
1127     //copy settings
1128     sal_uInt16 __FAR_DATA aRangeOfDefaults[] = {
1129         RES_FRMATR_BEGIN, RES_FRMATR_END-1,
1130         RES_CHRATR_BEGIN, RES_CHRATR_END-1,
1131         RES_PARATR_BEGIN, RES_PARATR_END-1,
1132         // --> OD 2008-02-25 #refactorlists##
1133         RES_PARATR_LIST_BEGIN, RES_PARATR_LIST_END-1,
1134         // <--
1135         RES_UNKNOWNATR_BEGIN, RES_UNKNOWNATR_END-1,
1136         0
1137     };
1138 
1139     SfxItemSet aNewDefaults( pRet->GetAttrPool(), aRangeOfDefaults );
1140 
1141     sal_uInt16 nWhich;
1142     sal_uInt16 nRange = 0;
1143     while( aRangeOfDefaults[nRange] != 0)
1144     {
1145         for( nWhich = aRangeOfDefaults[nRange]; nWhich < aRangeOfDefaults[nRange + 1]; ++nWhich )
1146         {
1147             const SfxPoolItem& rSourceAttr = mpAttrPool->GetDefaultItem( nWhich );
1148             if( rSourceAttr != pRet->mpAttrPool->GetDefaultItem( nWhich ) )
1149                 aNewDefaults.Put( rSourceAttr );
1150         }
1151         nRange += 2;
1152     }
1153     if( aNewDefaults.Count() )
1154         pRet->SetDefault( aNewDefaults );
1155 
1156     pRet->n32DummyCompatabilityOptions1 = n32DummyCompatabilityOptions1;
1157     pRet->n32DummyCompatabilityOptions2 = n32DummyCompatabilityOptions2;
1158     pRet->mbParaSpaceMax                          = mbParaSpaceMax                          ;
1159     pRet->mbParaSpaceMaxAtPages                   = mbParaSpaceMaxAtPages                   ;
1160     pRet->mbTabCompat                             = mbTabCompat                             ;
1161     pRet->mbUseVirtualDevice                      = mbUseVirtualDevice                      ;
1162     pRet->mbAddExternalLeading                    = mbAddExternalLeading                    ;
1163     pRet->mbOldLineSpacing                        = mbOldLineSpacing                        ;
1164     pRet->mbAddParaSpacingToTableCells            = mbAddParaSpacingToTableCells            ;
1165     pRet->mbUseFormerObjectPos                    = mbUseFormerObjectPos                    ;
1166     pRet->mbUseFormerTextWrapping                 = mbUseFormerTextWrapping                 ;
1167     pRet->mbConsiderWrapOnObjPos                  = mbConsiderWrapOnObjPos                  ;
1168     pRet->mbAddFlyOffsets                         = mbAddFlyOffsets                         ;
1169     pRet->mbOldNumbering                          = mbOldNumbering                          ;
1170     pRet->mbUseHiResolutionVirtualDevice          = mbUseHiResolutionVirtualDevice          ;
1171     pRet->mbIgnoreFirstLineIndentInNumbering      = mbIgnoreFirstLineIndentInNumbering      ;
1172     pRet->mbDoNotJustifyLinesWithManualBreak      = mbDoNotJustifyLinesWithManualBreak      ;
1173     pRet->mbDoNotResetParaAttrsForNumFont         = mbDoNotResetParaAttrsForNumFont         ;
1174     pRet->mbOutlineLevelYieldsOutlineRule         = mbOutlineLevelYieldsOutlineRule         ;
1175     pRet->mbTableRowKeep                          = mbTableRowKeep                          ;
1176     pRet->mbIgnoreTabsAndBlanksForLineCalculation = mbIgnoreTabsAndBlanksForLineCalculation ;
1177     pRet->mbDoNotCaptureDrawObjsOnPage            = mbDoNotCaptureDrawObjsOnPage            ;
1178     pRet->mbClipAsCharacterAnchoredWriterFlyFrames= mbClipAsCharacterAnchoredWriterFlyFrames;
1179     pRet->mbUnixForceZeroExtLeading               = mbUnixForceZeroExtLeading               ;
1180     pRet->mbOldPrinterMetrics                     = mbOldPrinterMetrics                     ;
1181     pRet->mbTabRelativeToIndent                   = mbTabRelativeToIndent                   ;
1182     pRet->mbTabAtLeftIndentForParagraphsInList    = mbTabAtLeftIndentForParagraphsInList    ;
1183 
1184     //
1185     // COMPATIBILITY FLAGS END
1186     //
1187     pRet->ReplaceStyles( * const_cast< SwDoc*>( this ));
1188 
1189     // we have to use pointer here, since the callee has to decide whether SfxObjectShellLock or SfxObjectShellRef should be used
1190     // sometimes the object will be returned with refcount set to 0 ( if no DoInitNew is done )
1191     SfxObjectShell* pRetShell = new SwDocShell( pRet, SFX_CREATE_MODE_STANDARD );
1192     if( bCallInitNew )
1193     {
1194         // it could happen that DoInitNew creates model, that increases the refcount of the object
1195         pRetShell->DoInitNew();
1196     }
1197 
1198     //copy content
1199     pRet->Paste( *this );
1200 
1201     // remove the temporary shell if it is there as it was done before
1202     pRet->SetTmpDocShell( (SfxObjectShell*)NULL );
1203 
1204     return pRetShell;
1205 }
1206 /*-- 08.05.2009 10:52:40---------------------------------------------------
1207     copy document content - code from SwFEShell::Paste( SwDoc* , sal_Bool  )
1208   -----------------------------------------------------------------------*/
1209 void SwDoc::Paste( const SwDoc& rSource )
1210 {
1211 //  this has to be empty const sal_uInt16 nStartPageNumber = GetPhyPageNum();
1212     // until the end of the NodesArray
1213     SwNodeIndex aSourceIdx( rSource.GetNodes().GetEndOfExtras(), 2 );
1214     SwPaM aCpyPam( aSourceIdx ); //DocStart
1215     SwNodeIndex aTargetIdx( GetNodes().GetEndOfExtras(), 2 );
1216     SwPaM aInsertPam( aTargetIdx ); //replaces PCURCRSR from SwFEShell::Paste()
1217 
1218 
1219     aCpyPam.SetMark();
1220     aCpyPam.Move( fnMoveForward, fnGoDoc );
1221 
1222     this->GetIDocumentUndoRedo().StartUndo( UNDO_INSGLOSSARY, NULL );
1223     this->LockExpFlds();
1224 
1225     {
1226         SwPosition& rInsPos = *aInsertPam.GetPoint();
1227         //find out if the clipboard document starts with a table
1228         bool bStartWithTable = 0 != aCpyPam.Start()->nNode.GetNode().FindTableNode();
1229         SwPosition aInsertPosition( rInsPos );
1230 
1231         {
1232             SwNodeIndex aIndexBefore(rInsPos.nNode);
1233 
1234             aIndexBefore--;
1235 
1236             rSource.CopyRange( aCpyPam, rInsPos, true );
1237 
1238             {
1239                 aIndexBefore++;
1240                 SwPaM aPaM(SwPosition(aIndexBefore),
1241                            SwPosition(rInsPos.nNode));
1242 
1243                 MakeUniqueNumRules(aPaM);
1244             }
1245         }
1246 
1247         //TODO: Is this necessary here? SaveTblBoxCntnt( &rInsPos );
1248         if(/*bIncludingPageFrames && */bStartWithTable)
1249         {
1250             //remove the paragraph in front of the table
1251             SwPaM aPara(aInsertPosition);
1252             this->DelFullPara(aPara);
1253         }
1254         //additionally copy page bound frames
1255         if( /*bIncludingPageFrames && */rSource.GetSpzFrmFmts()->Count() )
1256         {
1257             for ( sal_uInt16 i = 0; i < rSource.GetSpzFrmFmts()->Count(); ++i )
1258             {
1259                 sal_Bool bInsWithFmt = sal_True;
1260                 const SwFrmFmt& rCpyFmt = *(*rSource.GetSpzFrmFmts())[i];
1261                 if( bInsWithFmt  )
1262                 {
1263                     SwFmtAnchor aAnchor( rCpyFmt.GetAnchor() );
1264                     if (FLY_AT_PAGE == aAnchor.GetAnchorId())
1265                     {
1266                         aAnchor.SetPageNum( aAnchor.GetPageNum() /*+ nStartPageNumber - */);
1267                     }
1268                     else
1269                         continue;
1270                     this->CopyLayoutFmt( rCpyFmt, aAnchor, true, true );
1271                 }
1272             }
1273         }
1274     }
1275 
1276     this->GetIDocumentUndoRedo().EndUndo( UNDO_INSGLOSSARY, NULL );
1277 
1278     UnlockExpFlds();
1279     UpdateFlds(NULL, false);
1280 }
1281