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