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 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 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 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 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 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 710 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 732 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 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 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 798 SfxObjectShell* SwDoc::GetPersist() const 799 { 800 return pDocShell ? pDocShell : pLinkMgr->GetPersist(); 801 } 802 803 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 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 ---------------------------------------------------------------------------*/ 947 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 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 969 void SwDoc::WriteLayoutCache( SvStream& rStream ) 970 { 971 pLayoutCache->Write( rStream, *this ); 972 } 973 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(): 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# 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& 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 & 1085 SwDoc::GetMetaFieldManager() 1086 { 1087 return *m_pMetaFieldManager; 1088 } 1089 1090 ::sw::UndoManager & 1091 SwDoc::GetUndoManager() 1092 { 1093 return *m_pUndoManager; 1094 } 1095 1096 ::sw::UndoManager const& 1097 SwDoc::GetUndoManager() const 1098 { 1099 return *m_pUndoManager; 1100 } 1101 1102 IDocumentUndoRedo & 1103 SwDoc::GetIDocumentUndoRedo() 1104 { 1105 return *m_pUndoManager; 1106 } 1107 1108 IDocumentUndoRedo const& 1109 SwDoc::GetIDocumentUndoRedo() const 1110 { 1111 return *m_pUndoManager; 1112 } 1113 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 -----------------------------------------------------------------------*/ 1136 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 -----------------------------------------------------------------------*/ 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