xref: /AOO41X/main/sw/source/core/doc/docnew.cxx (revision ff0525f24f03981d56b7579b645949f111420994)
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     mbContainsAtPageObjWithContentAnchor( false ),
296     // i#78591#
297     mbProtectForm(false),
298     mbLastBrowseMode( false ),
299     n32DummyCompatabilityOptions1(0),
300     n32DummyCompatabilityOptions2(0),
301     mbStartIdleTimer(sal_False),
302     mbSetDrawDefaults(false),
303     meDocType( DOCTYPE_NATIVE )
304 {
305     RTL_LOGFILE_CONTEXT_AUTHOR( aLog, "SW", "JP93722",  "SwDoc::SwDoc" );
306 
307     mbGlossDoc =
308     mbModified =
309     mbDtor =
310     mbPageNums =
311     mbLoaded =
312     mbUpdateExpFld =
313     mbNewDoc =
314     mbCopyIsMove =
315     mbInReading =
316     mbInXMLImport =
317     mbUpdateTOX =
318     mbInLoadAsynchron =
319     mbHTMLMode =
320     mbInCallModified =
321     mbIsGlobalDoc =
322     mbGlblDocSaveLinks =
323     mbIsLabelDoc =
324     mbIsAutoFmtRedline =
325     mbOLEPrtNotifyPending =
326     mbAllOLENotify =
327     mbIsRedlineMove =
328     mbInsOnlyTxtGlssry =
329     mbContains_MSVBasic =
330     mbKernAsianPunctuation =
331 #ifdef DBG_UTIL
332     mbXMLExport =
333 #endif
334     // --> OD 2006-03-21 #b6375613#
335     mbApplyWorkaroundForB6375613 =
336     // <--
337                             false;
338 
339     mbNewFldLst =
340     mbVisibleLinks =
341     mbPurgeOLE =
342                             true;
343 
344     //
345     // COMPATIBILITY FLAGS START
346     //
347 
348     // Note: Any non-hidden compatibility flag should obtain its default
349     // by asking SvtCompatibilityOptions, see below.
350     //
351     const SvtCompatibilityOptions aOptions;
352     mbParaSpaceMax                      = aOptions.IsAddSpacing();
353     mbParaSpaceMaxAtPages               = aOptions.IsAddSpacingAtPages();
354     mbTabCompat                         = !aOptions.IsUseOurTabStops();
355     mbUseVirtualDevice                  = !aOptions.IsUsePrtDevice();
356     mbAddExternalLeading                = !aOptions.IsNoExtLeading();
357     mbOldLineSpacing                    = aOptions.IsUseLineSpacing();
358     mbAddParaSpacingToTableCells        = aOptions.IsAddTableSpacing();
359     mbUseFormerObjectPos                = aOptions.IsUseObjectPositioning();
360     mbUseFormerTextWrapping             = aOptions.IsUseOurTextWrapping();
361     mbConsiderWrapOnObjPos              = aOptions.IsConsiderWrappingStyle();
362     mbMathBaselineAlignment                 = false;        // default for *old* documents is 'off'
363     mbAddFlyOffsets                         = false;        // hidden
364     mbOldNumbering                          = false;        // hidden
365     mbUseHiResolutionVirtualDevice          = true;         // hidden
366     mbIgnoreFirstLineIndentInNumbering      = false;        // hidden
367     mbDoNotJustifyLinesWithManualBreak      = !aOptions.IsExpandWordSpace();
368     mbDoNotResetParaAttrsForNumFont         = false;        // hidden
369     mbOutlineLevelYieldsOutlineRule         = false;        // hidden
370     mbTableRowKeep                          = false;        // hidden
371     mbIgnoreTabsAndBlanksForLineCalculation = false;        // hidden
372     mbDoNotCaptureDrawObjsOnPage            = false;        // hidden
373     mbClipAsCharacterAnchoredWriterFlyFrames= false;        // hidden
374     mbUnixForceZeroExtLeading               = false;        // hidden
375     mbOldPrinterMetrics                     = false;        // hidden
376     mbTabRelativeToIndent                   = true;         // hidden
377     // --> OD 2008-06-05 #i89181#
378     mbTabAtLeftIndentForParagraphsInList    = false;        // hidden
379     // <--
380 
381     //
382     // COMPATIBILITY FLAGS END
383     //
384 
385     pMacroTable = new SvxMacroTableDtor;
386 
387     mpGrammarContact = ::createGrammarContact();
388 
389     /*
390      * Defaultformate und DefaultFormatsammlungen (FmtColl)
391      * werden an der Position 0 in das jeweilige Array eingetragen.
392      * Die Formate der FmtColls sind von den Defaultformaten
393      * abgeleitet und stehen auch in der Liste.
394      */
395     /* Formate */
396     pFrmFmtTbl->Insert(pDfltFrmFmt, 0 );
397     pCharFmtTbl->Insert(pDfltCharFmt, 0 );
398 
399     /* FmtColls */
400     // TXT
401     pTxtFmtCollTbl->Insert(pDfltTxtFmtColl, 0 );
402     // GRF
403     pGrfFmtCollTbl->Insert(pDfltGrfFmtColl, 0 );
404 
405     // PageDesc, EmptyPageFmt und ColumnFmt anlegen
406     if ( !aPageDescs.Count() )
407         GetPageDescFromPool( RES_POOLPAGE_STANDARD );
408 
409         //Leere Seite Einstellen.
410     pEmptyPageFmt->SetFmtAttr( SwFmtFrmSize( ATT_FIX_SIZE ) );
411         //BodyFmt fuer Spalten Einstellen.
412     pColumnContFmt->SetFmtAttr( SwFmtFillOrder( ATT_LEFT_TO_RIGHT ) );
413 
414     _InitFieldTypes();
415 
416     // lege (fuer die Filter) eine Default-OutlineNumRule an
417     // --> OD 2008-02-11 #newlistlevelattrs#
418     pOutlineRule = new SwNumRule( String::CreateFromAscii( SwNumRule::GetOutlineRuleName() ),
419                                   // --> OD 2008-06-06 #i89178#
420                                   numfunc::GetDefaultPositionAndSpaceMode(),
421                                   // <--
422                                   OUTLINE_RULE );
423     // <--
424     // #115901#
425     AddNumRule(pOutlineRule);
426     // --> OD 2005-10-21 - counting of phantoms depends on <IsOldNumbering()>
427     pOutlineRule->SetCountPhantoms( !get(IDocumentSettingAccess::OLD_NUMBERING) );
428     // <--
429 
430     new SwTxtNode(
431             SwNodeIndex(GetUndoManager().GetUndoNodes().GetEndOfContent()),
432             pDfltTxtFmtColl );
433     new SwTxtNode( SwNodeIndex( GetNodes().GetEndOfContent() ),
434                     GetTxtCollFromPool( RES_POOLCOLL_STANDARD ));
435 
436     // den eigenen IdleTimer setzen
437     aIdleTimer.SetTimeout( 600 );
438     aIdleTimer.SetTimeoutHdl( LINK(this, SwDoc, DoIdleJobs) );
439 
440     aOLEModifiedTimer.SetTimeout( 1000 );
441     aOLEModifiedTimer.SetTimeoutHdl( LINK( this, SwDoc, DoUpdateModifiedOLE ));
442 
443     // DBMgr anlegen
444     pNewDBMgr = new SwNewDBMgr;
445 
446     // create TOXTypes
447     InitTOXTypes();
448 
449     // --> OD 2008-03-07 #refactorlists#
450     // pass empty item set containing the paragraph's list attributes
451     // as ignorable items to the stype manager.
452     {
453         SfxItemSet aIgnorableParagraphItems( GetAttrPool(),
454                                              RES_PARATR_LIST_BEGIN, RES_PARATR_LIST_END-1,
455                                              0 );
456         pStyleAccess = createStyleManager( &aIgnorableParagraphItems );
457     }
458     // <--
459 
460     ResetModified();
461 }
462 
463 /*
464  * Besonderheiten: an der Position 0 des Arrays der Formate und
465  * der GDI-Objekte befindet sich ein Member der Klasse SwDoc.
466  * Dieser darf also keinesfalls durch delete geloescht
467  * werden!!!!!!!!!!
468  */
469 
470 
471 SwDoc::~SwDoc()
472 {
473     // nothing here should create Undo actions!
474     GetIDocumentUndoRedo().DoUndo(false);
475 
476     if (pDocShell)
477     {
478         pDocShell->SetUndoManager(0);
479     }
480 
481     // --> OD 2007-03-16 #i73788#
482     SwPauseThreadStarting aPauseThreadStarting;
483     // <--
484 
485     // --> OD 2007-11-01 #i83479#
486     delete mpListItemsList;
487     mpListItemsList = 0;
488     // <--
489 
490     // clean up chart related structures...
491     // Note: the chart data provider gets already diposed in ~SwDocShell
492     // since all UNO API related functionality requires an existing SwDocShell
493     // this assures that dipose gets called if there is need for it.
494     aChartDataProviderImplRef.reset();
495     delete pChartControllerHelper;
496 
497     delete mpGrammarContact;
498     mpGrammarContact = 0;
499 
500     //!! needs to be done to destroy a possible SwFmtDrop format that may
501     //!! be connected to a char format which may not otherwise be removed
502     //!! and thus would leave a unremoved SwFmt object. (TL)
503     //!! (this is case is not possible via UI but via API...)
504     SwFmtDrop aDrop;
505     SetDefault(aDrop);
506     //!! same for SwFmtCharFmt
507     SwFmtCharFmt aCharFmt(NULL);
508     SetDefault(aCharFmt);
509 
510     StopIdling();   // stop idle timer
511 
512     delete pUnoCallBack, pUnoCallBack = 0;
513     delete pURLStateChgd;
514 
515     delete pLayouter;
516     // --> OD 2005-09-05 #125370#
517     pLayouter = 0L;
518     // <--
519 
520     // Undo-Benachrichtigung vom Draw abschalten
521     if( pDrawModel )
522     {
523         DrawNotifyUndoHdl();
524         ClrContourCache();
525     }
526 
527     delete pPgPViewPrtData;
528 
529     mbDtor = sal_True;
530     pLayoutPtr.reset();
531 
532     delete pRedlineTbl;
533     delete pUnoCrsrTbl;
534     delete pAutoFmtRedlnComment;
535 
536     if( pUpdtFlds )
537         delete pUpdtFlds;
538 
539     if( pACEWord )
540         delete pACEWord;
541 
542     // die BaseLinks freigeben.
543     {
544         for( sal_uInt16 n = pLinkMgr->GetServers().Count(); n; )
545             pLinkMgr->GetServers()[ --n ]->Closed();
546 
547         if( pLinkMgr->GetLinks().Count() )
548             pLinkMgr->Remove( 0, pLinkMgr->GetLinks().Count() );
549     }
550 
551     // die KapitelNummern / Nummern muessen vor den Vorlage geloescht werden
552     // ansonsten wird noch staendig geupdatet !!!
553     m_pNodes->pOutlineNds->Remove(sal_uInt16(0), m_pNodes->pOutlineNds->Count());
554     SwNodes & rUndoNodes( GetUndoManager().GetUndoNodes() );
555     rUndoNodes.pOutlineNds->Remove(sal_uInt16(0), rUndoNodes.pOutlineNds->Count());
556 
557     pFtnIdxs->Remove( sal_uInt16(0), pFtnIdxs->Count() );
558 
559     // indices could be registered in attributes
560     m_pUndoManager->DelAllUndoObj();
561 
562     // in den BookMarks sind Indizies auf den Content. Diese muessen vorm
563     // loesche der Nodes geloescht werden.
564     pMarkManager->clearAllMarks();
565     DELETEZ( pMacroTable );
566 
567     if( pExtInputRing )
568     {
569         Ring* pTmp = pExtInputRing;
570         pExtInputRing = 0;
571         while( pTmp->GetNext() != pTmp )
572             delete pTmp->GetNext();
573         delete pTmp;
574     }
575 
576 //JP: alt - loeschen ohne Flag ist teuer; Modify wird verschickt!
577 //  aTOXTypes.DeleteAndDestroy( 0, aTOXTypes.Count() );
578     {
579         for( sal_uInt16 n = pTOXTypes->Count(); n; )
580         {
581             (*pTOXTypes)[ --n ]->SetInDocDTOR();
582             delete (*pTOXTypes)[ n ];
583         }
584         pTOXTypes->Remove( 0, pTOXTypes->Count() );
585     }
586     delete pDefTOXBases;
587 
588     //Im einen oder anderen FrmFormat koennen noch Indizes angemeldet sein,
589     //Diese muessen spaetestens jetzt zerstoert werden.
590     pFrmFmtTbl->ForEach( &lcl_DelFmtIndizes, this );
591     pSpzFrmFmtTbl->ForEach( &lcl_DelFmtIndizes, this );
592     ((SwFrmFmts&)*pSectionFmtTbl).ForEach( &lcl_DelFmtIndizes, this );
593 
594     //Die Formate, die hier hinter stehen sind von den DefaultFormaten
595     //abhaengig. Erst nach dem Loeschen der FmtIndizes weil der Inhalt von
596     //Kopf-/Fussbereichen geloescht wird. Wenn dort noch Indizes von Flys
597     //angemeldet sind gibts was an die Ohren.
598     aPageDescs.DeleteAndDestroy( 0, aPageDescs.Count() );
599 
600     // Inhaltssections loeschen
601     // nicht erst durch den SwNodes-DTOR, damit Formate
602     // keine Abhaengigen mehr haben.
603     m_pNodes->DelNodes( SwNodeIndex(*m_pNodes), m_pNodes->Count() );
604     rUndoNodes.DelNodes( SwNodeIndex( rUndoNodes ), rUndoNodes.Count() );
605 
606     // Formate loeschen, spaeter mal permanent machen.
607 
608     // Delete fuer Collections
609     // damit die Abhaengigen wech sind
610     pFtnInfo->ReleaseCollection();
611     pEndNoteInfo->ReleaseCollection();
612 
613     ASSERT( pDfltTxtFmtColl == (*pTxtFmtCollTbl)[0],
614             "Default-Text-Collection muss immer am Anfang stehen" );
615 
616     // JP 27.01.98: opt.: ausgehend davon, das Standard als 2. im Array
617     //              steht, sollte das als letztes geloescht werden, damit
618     //              die ganze Umhaengerei der Formate vermieden wird!
619     if( 2 < pTxtFmtCollTbl->Count() )
620         pTxtFmtCollTbl->DeleteAndDestroy( 2, pTxtFmtCollTbl->Count()-2 );
621     pTxtFmtCollTbl->DeleteAndDestroy( 1, pTxtFmtCollTbl->Count()-1 );
622     delete pTxtFmtCollTbl;
623 
624     ASSERT( pDfltGrfFmtColl == (*pGrfFmtCollTbl)[0],
625             "Default-Grf-Collection muss immer am Anfang stehen" );
626 
627     pGrfFmtCollTbl->DeleteAndDestroy( 1, pGrfFmtCollTbl->Count()-1 );
628 // ergibt sich automatisch - kein _DEL Array!
629 //  pGrfFmtCollTbl->Remove( 0, n );
630     delete pGrfFmtCollTbl;
631 
632     /*
633      * Defaultformate und DefaultFormatsammlungen (FmtColl)
634      * sind an der Position 0 der jeweiligen Arrays eingetragen.
635      * Damit sie nicht vom DTOR der Array's zum 2.mal geloescht werden,
636      * nehme sie aus dem Array.
637      */
638     pFrmFmtTbl->Remove( 0 );
639     pCharFmtTbl->Remove( 0 );
640 
641     // Delete fuer pPrt
642     DELETEZ( pPrt );
643     DELETEZ( pNewDBMgr );
644 
645     // Alle Flys muessen vor dem Drawing Model zerstoert werden,
646     // da Flys noch DrawContacts enthalten koennen, wenn wegen
647     // eines Lesefehlers kein Layout aufgebaut wurde.
648     pSpzFrmFmtTbl->DeleteAndDestroy( 0, pSpzFrmFmtTbl->Count() );
649 
650     //Erst jetzt das Model zerstoeren, die Zeichenobjekte - die ja auch
651     //im Undo herumlungern - wollen noch ihre Attribute beim Model entfernen.
652     //Ausserdem koennen vorher noch DrawContacts existieren.
653     ReleaseDrawModel();
654     //JP 28.01.99: DrawModel vorm LinkManager zerstoeren, da am DrawModel
655     //          dieser immer gesetzt ist.
656     DELETEZ( pLinkMgr );
657 
658     //Tables vor dem loeschen der Defaults leeren, sonst GPF wegen Def-Abhaengigen.
659     //Die Arrays sollten (wegen includes) bei Gelegenheit auch zu Pointern werden.
660     delete pFrmFmtTbl;
661     delete pSpzFrmFmtTbl;
662 
663     delete pStyleAccess;
664 
665     delete pCharFmtTbl;
666     delete pSectionFmtTbl;
667     delete pTblFrmFmtTbl;
668     delete pDfltTxtFmtColl;
669     delete pDfltGrfFmtColl;
670     delete pNumRuleTbl;
671 
672     // --> OD 2008-03-26 #refactorlists#
673     {
674         for ( std::hash_map< String, SwList*, StringHash >::iterator
675                                                     aListIter = maLists.begin();
676               aListIter != maLists.end();
677               ++aListIter )
678         {
679             delete (*aListIter).second;
680         }
681         maLists.clear();
682     }
683     maListStyleLists.clear();
684     // <--
685 
686     disposeXForms(); // #i113606#, dispose the XForms objects
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