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