LCOV - code coverage report
Current view: top level - sc/source/core/data - documen2.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 503 701 71.8 %
Date: 2014-11-03 Functions: 52 62 83.9 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include "scitems.hxx"
      21             : #include <editeng/eeitem.hxx>
      22             : 
      23             : #include <editeng/editeng.hxx>
      24             : #include <editeng/forbiddencharacterstable.hxx>
      25             : #include <osl/thread.h>
      26             : #include <svx/xtable.hxx>
      27             : #include <sfx2/linkmgr.hxx>
      28             : #include <svx/svdpool.hxx>
      29             : #include <svx/svdobj.hxx>
      30             : #include <sfx2/bindings.hxx>
      31             : #include <sfx2/objsh.hxx>
      32             : #include <sfx2/docfile.hxx>
      33             : #include <sfx2/printer.hxx>
      34             : #include <svl/zforlist.hxx>
      35             : #include <svl/zformat.hxx>
      36             : #include <vcl/virdev.hxx>
      37             : #include <comphelper/processfactory.hxx>
      38             : #include <svl/PasswordHelper.hxx>
      39             : #include <svl/sharedstringpool.hxx>
      40             : #include <tools/tenccvt.hxx>
      41             : #include <tools/urlobj.hxx>
      42             : #include <rtl/crc.h>
      43             : #include <basic/basmgr.hxx>
      44             : 
      45             : #include "document.hxx"
      46             : #include "table.hxx"
      47             : #include "attrib.hxx"
      48             : #include "patattr.hxx"
      49             : #include "rangenam.hxx"
      50             : #include "dbdata.hxx"
      51             : #include "pivot.hxx"
      52             : #include "docpool.hxx"
      53             : #include "stlpool.hxx"
      54             : #include "stlsheet.hxx"
      55             : #include "globstr.hrc"
      56             : #include "chartarr.hxx"
      57             : #include "chartlock.hxx"
      58             : #include "rechead.hxx"
      59             : #include "global.hxx"
      60             : #include "brdcst.hxx"
      61             : #include "bcaslot.hxx"
      62             : #include "adiasync.hxx"
      63             : #include "addinlis.hxx"
      64             : #include "chartlis.hxx"
      65             : #include "markdata.hxx"
      66             : #include "conditio.hxx"
      67             : #include "colorscale.hxx"
      68             : #include "validat.hxx"
      69             : #include "progress.hxx"
      70             : #include "detdata.hxx"
      71             : #include "sc.hrc"
      72             : #include "ddelink.hxx"
      73             : #include "chgtrack.hxx"
      74             : #include "chgviset.hxx"
      75             : #include "editutil.hxx"
      76             : #include "hints.hxx"
      77             : #include "dpobject.hxx"
      78             : #include "scrdata.hxx"
      79             : #include "poolhelp.hxx"
      80             : #include "unoreflist.hxx"
      81             : #include "listenercalls.hxx"
      82             : #include "recursionhelper.hxx"
      83             : #include "lookupcache.hxx"
      84             : #include "externalrefmgr.hxx"
      85             : #include "appoptio.hxx"
      86             : #include "scmod.hxx"
      87             : #include "../../ui/inc/viewutil.hxx"
      88             : #include "tabprotection.hxx"
      89             : #include "formulaparserpool.hxx"
      90             : #include "clipparam.hxx"
      91             : #include "macromgr.hxx"
      92             : #include "formulacell.hxx"
      93             : #include "clipcontext.hxx"
      94             : #include "refupdatecontext.hxx"
      95             : #include "refreshtimerprotector.hxx"
      96             : #include "scopetools.hxx"
      97             : #include "formulagroup.hxx"
      98             : #include "documentlinkmgr.hxx"
      99             : #include "interpre.hxx"
     100             : #include <tokenstringcontext.hxx>
     101             : #include "docsh.hxx"
     102             : 
     103             : using namespace com::sun::star;
     104             : 
     105             : // pImpl because including lookupcache.hxx in document.hxx isn't wanted, and
     106             : // dtor plus helpers are convenient.
     107          12 : struct ScLookupCacheMapImpl
     108             : {
     109             :     ScLookupCacheMap aCacheMap;
     110          12 :     ~ScLookupCacheMapImpl()
     111          12 :     {
     112          12 :         freeCaches();
     113          12 :     }
     114          10 :     void clear()
     115             :     {
     116          10 :         freeCaches();
     117             :         // Zap map.
     118          10 :         ScLookupCacheMap aTmp;
     119          10 :         aCacheMap.swap( aTmp);
     120          10 :     }
     121             : private:
     122          22 :     void freeCaches()
     123             :     {
     124          34 :         for (ScLookupCacheMap::iterator it( aCacheMap.begin()); it != aCacheMap.end(); ++it)
     125          12 :             delete (*it).second;
     126          22 :     }
     127             : };
     128             : 
     129             : // STATIC DATA -----------------------------------------------------------
     130             : 
     131        4242 : ScDocument::ScDocument( ScDocumentMode eMode, SfxObjectShell* pDocShell ) :
     132        4242 :         mpCellStringPool(new svl::SharedStringPool(ScGlobal::pCharClass)),
     133             :         mpFormulaGroupCxt(NULL),
     134        4242 :         maCalcConfig( ScInterpreter::GetGlobalConfig()),
     135             :         mpUndoManager( NULL ),
     136             :         pEditEngine( NULL ),
     137             :         pNoteEngine( NULL ),
     138             :         pShell( pDocShell ),
     139             :         pPrinter( NULL ),
     140             :         pVirtualDevice_100th_mm( NULL ),
     141             :         pDrawLayer( NULL ),
     142             :         pValidationList( NULL ),
     143             :         pFormatExchangeList( NULL ),
     144             :         pRangeName(NULL),
     145             :         pDPCollection( NULL ),
     146             :         pFormulaTree( NULL ),
     147             :         pEOFormulaTree( NULL ),
     148             :         pFormulaTrack( NULL ),
     149             :         pEOFormulaTrack( NULL ),
     150             :         pClipData( NULL ),
     151             :         pDetOpList(NULL),
     152             :         pChangeTrack( NULL ),
     153             :         pUnoBroadcaster( NULL ),
     154             :         pUnoListenerCalls( NULL ),
     155             :         pUnoRefUndoList( NULL ),
     156             :         pChangeViewSettings( NULL ),
     157             :         pScriptTypeData( NULL ),
     158             :         pCacheFieldEditEngine( NULL ),
     159             :         pViewOptions( NULL ),
     160             :         pDocOptions( NULL ),
     161             :         pExtDocOptions( NULL ),
     162             :         pConsolidateDlgData( NULL ),
     163             :         pRecursionHelper( NULL ),
     164             :         pAutoNameCache( NULL ),
     165             :         pLookupCacheMapImpl( NULL ),
     166             :         pPreviewFont( NULL ),
     167             :         pPreviewCellStyle( NULL ),
     168             :         nUnoObjectId( 0 ),
     169             :         nRangeOverflowType( 0 ),
     170             :         aCurTextWidthCalcPos(MAXCOL,0,0),
     171             :         aTableOpList( 0 ),
     172             :         nFormulaCodeInTree(0),
     173             :         nXMLImportedFormulaCount( 0 ),
     174             :         nInterpretLevel(0),
     175             :         nMacroInterpretLevel(0),
     176             :         nInterpreterTableOpLevel(0),
     177             :         nSrcVer( SC_CURRENT_VERSION ),
     178             :         nSrcMaxRow( MAXROW ),
     179             :         nFormulaTrackCount(0),
     180             :         bHardRecalcState(false),
     181             :         nVisibleTab( 0 ),
     182             :         eLinkMode(LM_UNKNOWN),
     183        4242 :         bAutoCalc( eMode == SCDOCMODE_DOCUMENT ),
     184             :         bAutoCalcShellDisabled( false ),
     185             :         bForcedFormulaPending( false ),
     186             :         bCalculatingFormulaTree( false ),
     187        4242 :         bIsClip( eMode == SCDOCMODE_CLIP ),
     188        4242 :         bIsUndo( eMode == SCDOCMODE_UNDO ),
     189             :         bIsVisible( false ),
     190             :         bIsEmbedded( false ),
     191             :         bInsertingFromOtherDoc( false ),
     192             :         bLoadingMedium( false ),
     193             :         bImportingXML( false ),
     194             :         bCalcingAfterLoad( false ),
     195             :         bNoListening( false ),
     196             :         mbIdleEnabled(true),
     197             :         bInLinkUpdate( false ),
     198             :         bChartListenerCollectionNeedsUpdate( false ),
     199             :         bHasForcedFormulas( false ),
     200             :         bInDtorClear( false ),
     201             :         bExpandRefs( false ),
     202             :         bDetectiveDirty( false ),
     203             :         nMacroCallMode( SC_MACROCALL_ALLOWED ),
     204             :         bHasMacroFunc( false ),
     205             :         nVisSpellState( 0 ),
     206             :         nAsianCompression(SC_ASIANCOMPRESSION_INVALID),
     207             :         nAsianKerning(SC_ASIANKERNING_INVALID),
     208             :         bPastingDrawFromOtherDoc( false ),
     209             :         nInDdeLinkUpdate( 0 ),
     210             :         bInUnoBroadcast( false ),
     211             :         bInUnoListenerCall( false ),
     212             :         eGrammar( formula::FormulaGrammar::GRAM_NATIVE ),
     213             :         bStyleSheetUsageInvalid( true ),
     214             :         mbUndoEnabled( true ),
     215             :         mbAdjustHeightEnabled( true ),
     216             :         mbExecuteLinkEnabled( true ),
     217             :         mbChangeReadOnlyEnabled( false ),
     218             :         mbStreamValidLocked( false ),
     219             :         mbUserInteractionEnabled(true),
     220             :         mnNamedRangesLockCount(0),
     221       25452 :         mbUseEmbedFonts(false)
     222             : {
     223        4242 :     SetStorageGrammar( formula::FormulaGrammar::GRAM_STORAGE_DEFAULT);
     224             : 
     225        4242 :     eSrcSet = osl_getThreadTextEncoding();
     226             : 
     227        4242 :     if ( eMode == SCDOCMODE_DOCUMENT )
     228             :     {
     229        2258 :         xPoolHelper = new ScPoolHelper( this );
     230             : 
     231        2258 :         pBASM = new ScBroadcastAreaSlotMachine( this );
     232        2258 :         pChartListenerCollection = new ScChartListenerCollection( this );
     233        2258 :         pRefreshTimerControl = new ScRefreshTimerControl;
     234             :     }
     235             :     else
     236             :     {
     237        1984 :         pBASM       = NULL;
     238        1984 :         pChartListenerCollection = NULL;
     239        1984 :         pRefreshTimerControl = NULL;
     240             :     }
     241        4242 :     pDBCollection = new ScDBCollection(this);
     242        4242 :     pSelectionAttr = NULL;
     243        4242 :     pChartCollection = new ScChartCollection;
     244        4242 :     apTemporaryChartLock.reset( new ScTemporaryChartLock(this) );
     245        4242 :     xColNameRanges = new ScRangePairList;
     246        4242 :     xRowNameRanges = new ScRangePairList;
     247        4242 :     ImplCreateOptions();
     248             :     // languages for a visible document are set by docshell later (from options)
     249        4242 :     SetLanguage( ScGlobal::eLnge, ScGlobal::eLnge, ScGlobal::eLnge );
     250             : 
     251        4242 :     aTrackTimer.SetTimeoutHdl( LINK( this, ScDocument, TrackTimeHdl ) );
     252        4242 :     aTrackTimer.SetTimeout( 100 );
     253        4242 : }
     254             : 
     255        1464 : sfx2::LinkManager* ScDocument::GetLinkManager()
     256             : {
     257        1464 :     return GetDocLinkManager().getLinkManager(true);
     258             : }
     259             : 
     260          26 : const sfx2::LinkManager* ScDocument::GetLinkManager() const
     261             : {
     262          26 :     return GetDocLinkManager().getExistingLinkManager();
     263             : }
     264             : 
     265        5793 : sc::DocumentLinkManager& ScDocument::GetDocLinkManager()
     266             : {
     267        5793 :     if (!mpDocLinkMgr)
     268        1390 :         mpDocLinkMgr.reset(new sc::DocumentLinkManager(*this, pShell));
     269        5793 :     return *mpDocLinkMgr;
     270             : }
     271             : 
     272         570 : const sc::DocumentLinkManager& ScDocument::GetDocLinkManager() const
     273             : {
     274         570 :     return const_cast<ScDocument*>(this)->GetDocLinkManager();
     275             : }
     276             : 
     277        4740 : void ScDocument::SetStorageGrammar( formula::FormulaGrammar::Grammar eGram )
     278             : {
     279             :     OSL_PRECOND(
     280             :         eGram == formula::FormulaGrammar::GRAM_ODFF ||
     281             :             eGram == formula::FormulaGrammar::GRAM_PODF,
     282             :             "ScDocument::SetStorageGrammar: wrong storage grammar");
     283             : 
     284        4740 :     eStorageGrammar = eGram;
     285             : 
     286             :     // FIXME: the XML import shouldn't strip brackets, the compiler should
     287             :     // digest them instead, which could also speedup reference recognition
     288             :     // during import.
     289             : 
     290             :     eXmlImportGrammar = formula::FormulaGrammar::mergeToGrammar( eGram,
     291        4740 :             formula::FormulaGrammar::CONV_OOO);
     292        4740 : }
     293             : 
     294         544 : void ScDocument::SetDocVisible( bool bSet )
     295             : {
     296             :     //  called from view ctor - only for a visible document,
     297             :     //  each new sheet's RTL flag is initialized from the locale
     298         544 :     bIsVisible = bSet;
     299         544 : }
     300             : 
     301          54 : sal_uInt32 ScDocument::GetDocumentID() const
     302             : {
     303          54 :     const ScDocument* pThis = this;
     304          54 :     sal_uInt32 nCrc = rtl_crc32( 0, &pThis, sizeof(ScDocument*) );
     305             :     // the this pointer only might not be sufficient
     306          54 :     nCrc = rtl_crc32( nCrc, &pShell, sizeof(SfxObjectShell*) );
     307          54 :     return nCrc;
     308             : }
     309             : 
     310           0 : void ScDocument::StartChangeTracking()
     311             : {
     312           0 :     if (!pChangeTrack)
     313           0 :         pChangeTrack = new ScChangeTrack( this );
     314           0 : }
     315             : 
     316          12 : void ScDocument::EndChangeTracking()
     317             : {
     318          12 :     delete pChangeTrack;
     319          12 :     pChangeTrack = NULL;
     320          12 : }
     321             : 
     322          12 : void ScDocument::SetChangeTrack( ScChangeTrack* pTrack )
     323             : {
     324             :     OSL_ENSURE( pTrack->GetDocument() == this, "SetChangeTrack: different documents" );
     325          12 :     if ( !pTrack || pTrack == pChangeTrack || pTrack->GetDocument() != this )
     326          12 :         return ;
     327          12 :     EndChangeTracking();
     328          12 :     pChangeTrack = pTrack;
     329             : }
     330             : 
     331           0 : IMPL_LINK_NOARG(ScDocument, TrackTimeHdl)
     332             : {
     333           0 :     if ( ScDdeLink::IsInUpdate() )      // nicht verschachteln
     334             :     {
     335           0 :         aTrackTimer.Start();            // spaeter nochmal versuchen
     336             :     }
     337           0 :     else if (pShell)                    // ausfuehren
     338             :     {
     339           0 :         TrackFormulas();
     340           0 :         pShell->Broadcast( SfxSimpleHint( FID_DATACHANGED ) );
     341             : 
     342             :             //  modified...
     343             : 
     344           0 :         if (!pShell->IsModified())
     345             :         {
     346           0 :             pShell->SetModified( true );
     347           0 :             SfxBindings* pBindings = GetViewBindings();
     348           0 :             if (pBindings)
     349             :             {
     350           0 :                 pBindings->Invalidate( SID_SAVEDOC );
     351           0 :                 pBindings->Invalidate( SID_DOC_MODIFIED );
     352             :             }
     353             :         }
     354             :     }
     355             : 
     356           0 :     return 0;
     357             : }
     358             : 
     359        1324 : void ScDocument::SetExpandRefs( bool bVal )
     360             : {
     361        1324 :     bExpandRefs = bVal;
     362        1324 : }
     363             : 
     364           4 : void ScDocument::StartTrackTimer()
     365             : {
     366           4 :     if (!aTrackTimer.IsActive())        // nicht ewig aufschieben
     367           2 :         aTrackTimer.Start();
     368           4 : }
     369             : 
     370        8384 : ScDocument::~ScDocument()
     371             : {
     372             :     OSL_PRECOND( !bInLinkUpdate, "bInLinkUpdate in dtor" );
     373             : 
     374        4192 :     bInDtorClear = true;
     375             : 
     376             :     // first of all disable all refresh timers by deleting the control
     377        4192 :     if ( pRefreshTimerControl )
     378             :     {   // To be sure there isn't anything running do it with a protector,
     379             :         // this ensures also that nothing needs the control anymore.
     380        2212 :         ScRefreshTimerProtector aProt( GetRefreshTimerControlAddress() );
     381        2212 :         delete pRefreshTimerControl, pRefreshTimerControl = NULL;
     382             :     }
     383             : 
     384        4192 :     mxFormulaParserPool.reset();
     385             :     // Destroy the external ref mgr instance here because it has a timer
     386             :     // which needs to be stopped before the app closes.
     387        4192 :     pExternalRefMgr.reset();
     388             : 
     389        4192 :     ScAddInAsync::RemoveDocument( this );
     390        4192 :     ScAddInListener::RemoveDocument( this );
     391        4192 :     DELETEZ( pChartListenerCollection);   // vor pBASM wg. evtl. Listener!
     392        4192 :     DELETEZ( pLookupCacheMapImpl);  // before pBASM because of listeners
     393             :     // BroadcastAreas vor allen Zellen zerstoeren um unnoetige
     394             :     // Einzel-EndListenings der Formelzellen zu vermeiden
     395        4192 :     delete pBASM;       // BroadcastAreaSlotMachine
     396        4192 :     pBASM = NULL;
     397             : 
     398        4192 :     delete pUnoBroadcaster;     // broadcasted nochmal SFX_HINT_DYING
     399        4192 :     pUnoBroadcaster = NULL;
     400             : 
     401        4192 :     delete pUnoRefUndoList;
     402        4192 :     delete pUnoListenerCalls;
     403             : 
     404        4192 :     Clear( true );              // true = from destructor (needed for SdrModel::ClearModel)
     405             : 
     406        4192 :     if (pValidationList)
     407             :     {
     408          74 :         for( ScValidationDataList::iterator it = pValidationList->begin(); it != pValidationList->end(); ++it )
     409          56 :             delete *it;
     410          18 :         pValidationList->clear();
     411          18 :         DELETEZ(pValidationList);
     412             :     }
     413        4192 :     delete pRangeName;
     414        4192 :     delete pDBCollection;
     415        4192 :     delete pSelectionAttr;
     416        4192 :     apTemporaryChartLock.reset();
     417        4192 :     delete pChartCollection;
     418        4192 :     DeleteDrawLayer();
     419        4192 :     delete pFormatExchangeList;
     420        4192 :     delete pPrinter;
     421        4192 :     ImplDeleteOptions();
     422        4192 :     delete pConsolidateDlgData;
     423        4192 :     delete pClipData;
     424        4192 :     delete pDetOpList;                  // loescht auch die Eintraege
     425        4192 :     delete pChangeTrack;
     426        4192 :     delete pEditEngine;
     427        4192 :     delete pNoteEngine;
     428        4192 :     delete pChangeViewSettings;         // und weg damit
     429        4192 :     delete pVirtualDevice_100th_mm;
     430             : 
     431        4192 :     delete pDPCollection;
     432             : 
     433             :     // delete the EditEngine before destroying the xPoolHelper
     434        4192 :     delete pCacheFieldEditEngine;
     435             : 
     436        4192 :     if ( xPoolHelper.is() && !bIsClip )
     437        4060 :         xPoolHelper->SourceDocumentGone();
     438        4192 :     xPoolHelper.clear();
     439             : 
     440        4192 :     delete pScriptTypeData;
     441        4192 :     delete pRecursionHelper;
     442             : 
     443        4192 :     delete pPreviewFont;
     444             :     SAL_WARN_IF( pAutoNameCache, "sc.core", "AutoNameCache still set in dtor" );
     445             : 
     446        4192 :     mpFormulaGroupCxt.reset();
     447        4192 :     mpCellStringPool.reset();
     448        4192 : }
     449             : 
     450         146 : void ScDocument::InitClipPtrs( ScDocument* pSourceDoc )
     451             : {
     452             :     OSL_ENSURE(bIsClip, "InitClipPtrs and not bIsClip");
     453             : 
     454         146 :     if (pValidationList)
     455             :     {
     456           0 :         for(ScValidationDataList::iterator it = pValidationList->begin(); it != pValidationList->end(); ++it )
     457           0 :             delete *it;
     458           0 :         pValidationList->clear();
     459           0 :         DELETEZ(pValidationList);
     460             :     }
     461             : 
     462         146 :     Clear();
     463             : 
     464         146 :     SharePooledResources(pSourceDoc);
     465             : 
     466             :     //  bedingte Formate / Gueltigkeiten
     467             :     //! Vorlagen kopieren?
     468         146 :     const ScValidationDataList* pSourceValid = pSourceDoc->pValidationList;
     469         146 :     if ( pSourceValid )
     470           4 :         pValidationList = new ScValidationDataList(this, *pSourceValid);
     471             : 
     472             :                         // Links in Stream speichern
     473         146 :     delete pClipData;
     474         146 :     if (pSourceDoc->GetDocLinkManager().hasDdeLinks())
     475             :     {
     476           0 :         pClipData = new SvMemoryStream;
     477           0 :         pSourceDoc->SaveDdeLinks(*pClipData);
     478             :     }
     479             :     else
     480         146 :         pClipData = NULL;
     481             : 
     482             :     // Options pointers exist (ImplCreateOptions) for any document.
     483             :     // Must be copied for correct results in OLE objects (#i42666#).
     484         146 :     SetDocOptions( pSourceDoc->GetDocOptions() );
     485         146 :     SetViewOptions( pSourceDoc->GetViewOptions() );
     486         146 : }
     487             : 
     488     1571603 : SvNumberFormatter* ScDocument::GetFormatTable() const
     489             : {
     490     1571603 :     return xPoolHelper->GetFormTable();
     491             : }
     492             : 
     493           0 : SvNumberFormatter* ScDocument::CreateFormatTable() const
     494             : {
     495           0 :     return xPoolHelper->CreateNumberFormatter();
     496             : }
     497             : 
     498        2715 : SfxItemPool* ScDocument::GetEditPool() const
     499             : {
     500        2715 :     return xPoolHelper->GetEditPool();
     501             : }
     502             : 
     503        2639 : SfxItemPool* ScDocument::GetEnginePool() const
     504             : {
     505        2639 :     return xPoolHelper->GetEnginePool();
     506             : }
     507             : 
     508         524 : ScFieldEditEngine& ScDocument::GetEditEngine()
     509             : {
     510         524 :     if ( !pEditEngine )
     511             :     {
     512          62 :         pEditEngine = new ScFieldEditEngine(this, GetEnginePool(), GetEditPool());
     513          62 :         pEditEngine->SetUpdateMode( false );
     514          62 :         pEditEngine->EnableUndo( false );
     515          62 :         pEditEngine->SetRefMapMode( MAP_100TH_MM );
     516          62 :         ApplyAsianEditSettings( *pEditEngine );
     517             :     }
     518         524 :     return *pEditEngine;
     519             : }
     520             : 
     521          10 : ScNoteEditEngine& ScDocument::GetNoteEngine()
     522             : {
     523          10 :     if ( !pNoteEngine )
     524             :     {
     525           4 :         pNoteEngine = new ScNoteEditEngine( GetEnginePool(), GetEditPool() );
     526           4 :         pNoteEngine->SetUpdateMode( false );
     527           4 :         pNoteEngine->EnableUndo( false );
     528           4 :         pNoteEngine->SetRefMapMode( MAP_100TH_MM );
     529           4 :         ApplyAsianEditSettings( *pNoteEngine );
     530           4 :         const SfxItemSet& rItemSet = GetDefPattern()->GetItemSet();
     531           4 :         SfxItemSet* pEEItemSet = new SfxItemSet( pNoteEngine->GetEmptyItemSet() );
     532           4 :         ScPatternAttr::FillToEditItemSet( *pEEItemSet, rItemSet );
     533           4 :         pNoteEngine->SetDefaults( pEEItemSet );      // edit engine takes ownership
     534             :     }
     535          10 :     return *pNoteEngine;
     536             : }
     537             : 
     538         110 : void ScDocument::ResetClip( ScDocument* pSourceDoc, const ScMarkData* pMarks )
     539             : {
     540         110 :     if (bIsClip)
     541             :     {
     542         110 :         InitClipPtrs(pSourceDoc);
     543             : 
     544         302 :         for (SCTAB i = 0; i < static_cast<SCTAB>(pSourceDoc->maTabs.size()); i++)
     545         192 :             if (pSourceDoc->maTabs[i])
     546         192 :                 if (!pMarks || pMarks->GetTableSelect(i))
     547             :                 {
     548         108 :                     OUString aString;
     549         108 :                     pSourceDoc->maTabs[i]->GetName(aString);
     550         108 :                     if ( i < static_cast<SCTAB>(maTabs.size()) )
     551             :                     {
     552           0 :                         maTabs[i] = new ScTable(this, i, aString);
     553             : 
     554             :                     }
     555             :                     else
     556             :                     {
     557         108 :                         if( i > static_cast<SCTAB>(maTabs.size()) )
     558             :                         {
     559           0 :                             maTabs.resize(i, NULL );
     560             :                         }
     561         108 :                         maTabs.push_back(new ScTable(this, i, aString));
     562             :                     }
     563         108 :                     maTabs[i]->SetLayoutRTL( pSourceDoc->maTabs[i]->IsLayoutRTL() );
     564             :                 }
     565             :     }
     566             :     else
     567             :     {
     568             :         OSL_FAIL("ResetClip");
     569             :     }
     570         110 : }
     571             : 
     572          36 : void ScDocument::ResetClip( ScDocument* pSourceDoc, SCTAB nTab )
     573             : {
     574          36 :     if (bIsClip)
     575             :     {
     576          36 :         InitClipPtrs(pSourceDoc);
     577          36 :         if (nTab >= static_cast<SCTAB>(maTabs.size()))
     578             :         {
     579          36 :             maTabs.resize(nTab+1, NULL );
     580             :         }
     581          36 :         maTabs[nTab] = new ScTable(this, nTab,
     582          72 :                             OUString("baeh"));
     583          36 :         if (nTab < static_cast<SCTAB>(pSourceDoc->maTabs.size()) && pSourceDoc->maTabs[nTab])
     584          36 :             maTabs[nTab]->SetLayoutRTL( pSourceDoc->maTabs[nTab]->IsLayoutRTL() );
     585             :     }
     586             :     else
     587             :     {
     588             :         OSL_FAIL("ResetClip");
     589             :     }
     590          36 : }
     591             : 
     592        9332 : void ScDocument::EnsureTable( SCTAB nTab )
     593             : {
     594        9332 :     bool bExtras = !bIsUndo;        // Spaltenbreiten, Zeilenhoehen, Flags
     595        9332 :     if (static_cast<size_t>(nTab) >= maTabs.size())
     596           0 :         maTabs.resize(nTab+1, NULL);
     597             : 
     598        9332 :     if (!maTabs[nTab])
     599           0 :         maTabs[nTab] = new ScTable(this, nTab, "temp", bExtras, bExtras);
     600        9332 : }
     601             : 
     602      147200 : ScRefCellValue ScDocument::GetRefCellValue( const ScAddress& rPos )
     603             : {
     604      147200 :     if (!TableExists(rPos.Tab()))
     605           0 :         return ScRefCellValue(); // empty
     606             : 
     607      147200 :     return maTabs[rPos.Tab()]->GetRefCellValue(rPos.Col(), rPos.Row());
     608             : }
     609             : 
     610       93341 : svl::SharedStringPool& ScDocument::GetSharedStringPool()
     611             : {
     612       93341 :     return *mpCellStringPool;
     613             : }
     614             : 
     615           0 : const svl::SharedStringPool& ScDocument::GetSharedStringPool() const
     616             : {
     617           0 :     return *mpCellStringPool;
     618             : }
     619             : 
     620        3572 : bool ScDocument::GetPrintArea( SCTAB nTab, SCCOL& rEndCol, SCROW& rEndRow,
     621             :                                 bool bNotes ) const
     622             : {
     623        3572 :     if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
     624             :     {
     625        3572 :         bool bAny = maTabs[nTab]->GetPrintArea( rEndCol, rEndRow, bNotes );
     626        3572 :         if (pDrawLayer)
     627             :         {
     628        2672 :             ScRange aDrawRange(0,0,nTab, MAXCOL,MAXROW,nTab);
     629        2672 :             if (DrawGetPrintArea( aDrawRange, true, true ))
     630             :             {
     631         972 :                 if (aDrawRange.aEnd.Col()>rEndCol) rEndCol=aDrawRange.aEnd.Col();
     632         972 :                 if (aDrawRange.aEnd.Row()>rEndRow) rEndRow=aDrawRange.aEnd.Row();
     633         972 :                 bAny = true;
     634             :             }
     635             :         }
     636        3572 :         return bAny;
     637             :     }
     638             : 
     639           0 :     rEndCol = 0;
     640           0 :     rEndRow = 0;
     641           0 :     return false;
     642             : }
     643             : 
     644           0 : bool ScDocument::GetPrintAreaHor( SCTAB nTab, SCROW nStartRow, SCROW nEndRow,
     645             :                                         SCCOL& rEndCol, bool bNotes ) const
     646             : {
     647           0 :     if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
     648             :     {
     649           0 :         bool bAny = maTabs[nTab]->GetPrintAreaHor( nStartRow, nEndRow, rEndCol, bNotes );
     650           0 :         if (pDrawLayer)
     651             :         {
     652           0 :             ScRange aDrawRange(0,nStartRow,nTab, MAXCOL,nEndRow,nTab);
     653           0 :             if (DrawGetPrintArea( aDrawRange, true, false ))
     654             :             {
     655           0 :                 if (aDrawRange.aEnd.Col()>rEndCol) rEndCol=aDrawRange.aEnd.Col();
     656           0 :                 bAny = true;
     657             :             }
     658             :         }
     659           0 :         return bAny;
     660             :     }
     661             : 
     662           0 :     rEndCol = 0;
     663           0 :     return false;
     664             : }
     665             : 
     666          80 : bool ScDocument::GetPrintAreaVer( SCTAB nTab, SCCOL nStartCol, SCCOL nEndCol,
     667             :                                         SCROW& rEndRow, bool bNotes ) const
     668             : {
     669          80 :     if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
     670             :     {
     671          80 :         bool bAny = maTabs[nTab]->GetPrintAreaVer( nStartCol, nEndCol, rEndRow, bNotes );
     672          80 :         if (pDrawLayer)
     673             :         {
     674          68 :             ScRange aDrawRange(nStartCol,0,nTab, nEndCol,MAXROW,nTab);
     675          68 :             if (DrawGetPrintArea( aDrawRange, false, true ))
     676             :             {
     677           8 :                 if (aDrawRange.aEnd.Row()>rEndRow) rEndRow=aDrawRange.aEnd.Row();
     678           8 :                 bAny = true;
     679             :             }
     680             :         }
     681          80 :         return bAny;
     682             :     }
     683             : 
     684           0 :     rEndRow = 0;
     685           0 :     return false;
     686             : }
     687             : 
     688        2988 : bool ScDocument::GetDataStart( SCTAB nTab, SCCOL& rStartCol, SCROW& rStartRow ) const
     689             : {
     690        2988 :     if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab])
     691             :     {
     692        2988 :         bool bAny = maTabs[nTab]->GetDataStart( rStartCol, rStartRow );
     693        2988 :         if (pDrawLayer)
     694             :         {
     695        2452 :             ScRange aDrawRange(0,0,nTab, MAXCOL,MAXROW,nTab);
     696        2452 :             if (DrawGetPrintArea( aDrawRange, true, true ))
     697             :             {
     698        1016 :                 if (aDrawRange.aStart.Col()<rStartCol) rStartCol=aDrawRange.aStart.Col();
     699        1016 :                 if (aDrawRange.aStart.Row()<rStartRow) rStartRow=aDrawRange.aStart.Row();
     700        1016 :                 bAny = true;
     701             :             }
     702             :         }
     703        2988 :         return bAny;
     704             :     }
     705             : 
     706           0 :     rStartCol = 0;
     707           0 :     rStartRow = 0;
     708           0 :     return false;
     709             : }
     710             : 
     711          28 : bool ScDocument::MoveTab( SCTAB nOldPos, SCTAB nNewPos, ScProgress* pProgress )
     712             : {
     713          28 :     if (nOldPos == nNewPos)
     714           0 :         return false;
     715             : 
     716          28 :     SCTAB nTabCount = static_cast<SCTAB>(maTabs.size());
     717          28 :     if(nTabCount < 2)
     718           0 :         return false;
     719             : 
     720          28 :     bool bValid = false;
     721          28 :     if (ValidTab(nOldPos) && nOldPos < nTabCount )
     722             :     {
     723          28 :         if (maTabs[nOldPos])
     724             :         {
     725          28 :             sc::AutoCalcSwitch aACSwitch(*this, false);
     726             : 
     727          28 :             SetNoListening( true );
     728          28 :             if (nNewPos == SC_TAB_APPEND || nNewPos >= nTabCount)
     729           0 :                 nNewPos = nTabCount-1;
     730             : 
     731             :             //  Referenz-Updaterei
     732             :             //! mit UpdateReference zusammenfassen!
     733             : 
     734          56 :             sc::RefUpdateMoveTabContext aCxt(nOldPos, nNewPos);
     735             : 
     736          28 :             SCsTAB nDz = ((SCsTAB)nNewPos) - (SCsTAB)nOldPos;
     737          28 :             ScRange aSourceRange( 0,0,nOldPos, MAXCOL,MAXROW,nOldPos );
     738          28 :             if (pRangeName)
     739           2 :                 pRangeName->UpdateMoveTab(aCxt);
     740             : 
     741          28 :             pDBCollection->UpdateMoveTab( nOldPos, nNewPos );
     742          28 :             xColNameRanges->UpdateReference( URM_REORDER, this, aSourceRange, 0,0,nDz );
     743          28 :             xRowNameRanges->UpdateReference( URM_REORDER, this, aSourceRange, 0,0,nDz );
     744          28 :             if (pDPCollection)
     745           4 :                 pDPCollection->UpdateReference( URM_REORDER, aSourceRange, 0,0,nDz );
     746          28 :             if (pDetOpList)
     747           0 :                 pDetOpList->UpdateReference( this, URM_REORDER, aSourceRange, 0,0,nDz );
     748             :             UpdateChartRef( URM_REORDER,
     749          28 :                     0,0,nOldPos, MAXCOL,MAXROW,nOldPos, 0,0,nDz );
     750          28 :             UpdateRefAreaLinks( URM_REORDER, aSourceRange, 0,0,nDz );
     751          28 :             if ( pValidationList )
     752           0 :                 pValidationList->UpdateMoveTab(aCxt);
     753          28 :             if ( pUnoBroadcaster )
     754             :                 pUnoBroadcaster->Broadcast( ScUpdateRefHint( URM_REORDER,
     755          28 :                             aSourceRange, 0,0,nDz ) );
     756             : 
     757          28 :             ScTable* pSaveTab = maTabs[nOldPos];
     758          28 :             maTabs.erase(maTabs.begin()+nOldPos);
     759          28 :             maTabs.insert(maTabs.begin()+nNewPos, pSaveTab);
     760          28 :             TableContainer::iterator it = maTabs.begin();
     761         106 :             for (SCTAB i = 0; i < nTabCount; i++)
     762          78 :                 if (maTabs[i])
     763          78 :                     maTabs[i]->UpdateMoveTab(aCxt, i, pProgress);
     764          28 :             it = maTabs.begin();
     765         106 :             for (; it != maTabs.end(); ++it)
     766          78 :                 if (*it)
     767          78 :                     (*it)->UpdateCompile();
     768          28 :             SetNoListening( false );
     769          28 :             it = maTabs.begin();
     770         106 :             for (; it != maTabs.end(); ++it)
     771          78 :                 if (*it)
     772          78 :                     (*it)->StartAllListeners();
     773             :             // sheet names of references may not be valid until sheet is moved
     774          28 :             pChartListenerCollection->UpdateScheduledSeriesRanges();
     775             : 
     776          28 :             sc::SetFormulaDirtyContext aFormulaDirtyCxt;
     777          28 :             SetAllFormulasDirty(aFormulaDirtyCxt);
     778             : 
     779          28 :             if (pDrawLayer)
     780           2 :                 DrawMovePage( static_cast<sal_uInt16>(nOldPos), static_cast<sal_uInt16>(nNewPos) );
     781             : 
     782          56 :             bValid = true;
     783             :         }
     784             :     }
     785          28 :     return bValid;
     786             : }
     787             : 
     788          12 : bool ScDocument::CopyTab( SCTAB nOldPos, SCTAB nNewPos, const ScMarkData* pOnlyMarked )
     789             : {
     790          12 :     if (SC_TAB_APPEND == nNewPos  || nNewPos >= static_cast<SCTAB>(maTabs.size()))
     791          10 :         nNewPos = static_cast<SCTAB>(maTabs.size());
     792          12 :     OUString aName;
     793          12 :     GetName(nOldPos, aName);
     794             : 
     795             :     //  vorneweg testen, ob der Prefix als gueltig erkannt wird
     796             :     //  wenn nicht, nur doppelte vermeiden
     797          12 :     bool bPrefix = ValidTabName( aName );
     798             :     OSL_ENSURE(bPrefix, "invalid table name");
     799             :     SCTAB nDummy;
     800             : 
     801          12 :     CreateValidTabName(aName);
     802             : 
     803             :     bool bValid;
     804          12 :     if (bPrefix)
     805          12 :         bValid = ValidNewTabName(aName);
     806             :     else
     807           0 :         bValid = !GetTable( aName, nDummy );
     808             : 
     809          24 :     sc::AutoCalcSwitch aACSwitch(*this, false);
     810          24 :     sc::RefUpdateInsertTabContext aCxt(nNewPos, 1);
     811             : 
     812          12 :     if (bValid)
     813             :     {
     814          12 :         if (nNewPos >= static_cast<SCTAB>(maTabs.size()))
     815             :         {
     816          10 :             nNewPos = static_cast<SCTAB>(maTabs.size());
     817          10 :             maTabs.push_back(new ScTable(this, nNewPos, aName));
     818             :         }
     819             :         else
     820             :         {
     821           2 :             if (ValidTab(nNewPos) && (nNewPos < static_cast<SCTAB>(maTabs.size())))
     822             :             {
     823           2 :                 SetNoListening( true );
     824             : 
     825           2 :                 ScRange aRange( 0,0,nNewPos, MAXCOL,MAXROW,MAXTAB );
     826           2 :                 xColNameRanges->UpdateReference( URM_INSDEL, this, aRange, 0,0,1 );
     827           2 :                 xRowNameRanges->UpdateReference( URM_INSDEL, this, aRange, 0,0,1 );
     828           2 :                 if (pRangeName)
     829           0 :                     pRangeName->UpdateInsertTab(aCxt);
     830             : 
     831             :                 pDBCollection->UpdateReference(
     832           2 :                                     URM_INSDEL, 0,0,nNewPos, MAXCOL,MAXROW,MAXTAB, 0,0,1 );
     833           2 :                 if (pDPCollection)
     834           0 :                     pDPCollection->UpdateReference( URM_INSDEL, aRange, 0,0,1 );
     835           2 :                 if (pDetOpList)
     836           0 :                     pDetOpList->UpdateReference( this, URM_INSDEL, aRange, 0,0,1 );
     837           2 :                 UpdateChartRef( URM_INSDEL, 0,0,nNewPos, MAXCOL,MAXROW,MAXTAB, 0,0,1 );
     838           2 :                 UpdateRefAreaLinks( URM_INSDEL, aRange, 0,0,1 );
     839           2 :                 if ( pUnoBroadcaster )
     840           2 :                     pUnoBroadcaster->Broadcast( ScUpdateRefHint( URM_INSDEL, aRange, 0,0,1 ) );
     841             : 
     842             :                 SCTAB i;
     843           6 :                 for (TableContainer::iterator it = maTabs.begin(); it != maTabs.end(); ++it)
     844           4 :                     if (*it && it != (maTabs.begin() + nOldPos))
     845           2 :                         (*it)->UpdateInsertTab(aCxt);
     846           2 :                 maTabs.push_back(NULL);
     847           6 :                 for (i = static_cast<SCTAB>(maTabs.size())-1; i > nNewPos; i--)
     848           4 :                     maTabs[i] = maTabs[i - 1];
     849           2 :                 if (nNewPos <= nOldPos)
     850           2 :                     nOldPos++;
     851           2 :                 maTabs[nNewPos] = new ScTable(this, nNewPos, aName);
     852           2 :                 bValid = true;
     853           8 :                 for (TableContainer::iterator it = maTabs.begin(); it != maTabs.end(); ++it)
     854           6 :                     if (*it && it != maTabs.begin()+nOldPos && it != maTabs.begin() + nNewPos)
     855           2 :                         (*it)->UpdateCompile();
     856           2 :                 SetNoListening( false );
     857           8 :                 for (TableContainer::iterator it = maTabs.begin(); it != maTabs.end(); ++it)
     858           6 :                     if (*it && it != maTabs.begin()+nOldPos && it != maTabs.begin()+nNewPos)
     859           2 :                         (*it)->StartAllListeners();
     860             : 
     861           2 :                 if (pValidationList)
     862           0 :                     pValidationList->UpdateInsertTab(aCxt);
     863             : 
     864             :                 // sheet names of references may not be valid until sheet is copied
     865           2 :                 pChartListenerCollection->UpdateScheduledSeriesRanges();
     866             :             }
     867             :             else
     868           0 :                 bValid = false;
     869             :         }
     870             :     }
     871             : 
     872          12 :     if (bValid)
     873             :     {
     874          12 :         SetNoListening( true );     // noch nicht bei CopyToTable/Insert
     875          12 :         sc::CopyToDocContext aCopyDocCxt(*this);
     876          12 :         maTabs[nOldPos]->CopyToTable(aCopyDocCxt, 0, 0, MAXCOL, MAXROW, IDF_ALL, (pOnlyMarked != NULL),
     877          24 :                                         maTabs[nNewPos], pOnlyMarked );
     878          12 :         maTabs[nNewPos]->SetTabBgColor(maTabs[nOldPos]->GetTabBgColor());
     879             : 
     880          12 :         SCTAB nDz = nNewPos - nOldPos;
     881          24 :         sc::RefUpdateContext aRefCxt(*this);
     882          12 :         aRefCxt.meMode = URM_COPY;
     883          12 :         aRefCxt.maRange = ScRange(0, 0, nNewPos, MAXCOL, MAXROW, nNewPos);
     884          12 :         aRefCxt.mnTabDelta = nDz;
     885          12 :         maTabs[nNewPos]->UpdateReference(aRefCxt, NULL);
     886             : 
     887          24 :         sc::RefUpdateInsertTabContext aInsTabCxt(nNewPos, 1);
     888          12 :         maTabs[nNewPos]->UpdateInsertTabAbs(nNewPos); // alle abs. um eins hoch!!
     889          12 :         maTabs[nOldPos]->UpdateInsertTab(aInsTabCxt);
     890             : 
     891          12 :         maTabs[nOldPos]->UpdateCompile();
     892          12 :         maTabs[nNewPos]->UpdateCompile( true ); //  maybe already compiled in Clone, but used names need recompilation
     893          12 :         SetNoListening( false );
     894          12 :         maTabs[nOldPos]->StartAllListeners();
     895          12 :         maTabs[nNewPos]->StartAllListeners();
     896             : 
     897          12 :         sc::SetFormulaDirtyContext aFormulaDirtyCxt;
     898          12 :         SetAllFormulasDirty(aFormulaDirtyCxt);
     899             : 
     900          12 :         if (pDrawLayer)
     901           4 :             DrawCopyPage( static_cast<sal_uInt16>(nOldPos), static_cast<sal_uInt16>(nNewPos) );
     902             : 
     903          12 :         if (pDPCollection)
     904           0 :             pDPCollection->CopyToTab(nOldPos, nNewPos);
     905             : 
     906          12 :         maTabs[nNewPos]->SetPageStyle( maTabs[nOldPos]->GetPageStyle() );
     907          12 :         maTabs[nNewPos]->SetPendingRowHeights( maTabs[nOldPos]->IsPendingRowHeights() );
     908             : 
     909             :         // Copy the custom print range if exists.
     910          12 :         maTabs[nNewPos]->CopyPrintRange(*maTabs[nOldPos]);
     911             : 
     912             :         // Copy the RTL settings
     913          12 :         maTabs[nNewPos]->SetLayoutRTL(maTabs[nOldPos]->IsLayoutRTL());
     914          24 :         maTabs[nNewPos]->SetLoadingRTL(maTabs[nOldPos]->IsLoadingRTL());
     915             :     }
     916             : 
     917          24 :     return bValid;
     918             : }
     919             : 
     920          26 : sal_uLong ScDocument::TransferTab( ScDocument* pSrcDoc, SCTAB nSrcPos,
     921             :                                 SCTAB nDestPos, bool bInsertNew,
     922             :                                 bool bResultsOnly )
     923             : {
     924          26 :     sal_uLong nRetVal = 1;                      // 0 => Fehler 1 = ok
     925             :                                             // 3 => NameBox
     926             :                                             // 4 => beides
     927             : 
     928          26 :     if (pSrcDoc->pShell->GetMedium())
     929             :     {
     930          26 :         pSrcDoc->maFileURL = pSrcDoc->pShell->GetMedium()->GetURLObject().GetMainURL(INetURLObject::DECODE_TO_IURI);
     931             :         // for unsaved files use the title name and adjust during save of file
     932          26 :         if (pSrcDoc->maFileURL.isEmpty())
     933           2 :             pSrcDoc->maFileURL = pSrcDoc->pShell->GetName();
     934             :     }
     935             :     else
     936             :     {
     937           0 :         pSrcDoc->maFileURL = pSrcDoc->pShell->GetName();
     938             :     }
     939             : 
     940          26 :     bool bValid = true;
     941          26 :     if (bInsertNew)             // neu einfuegen
     942             :     {
     943          22 :         OUString aName;
     944          22 :         pSrcDoc->GetName(nSrcPos, aName);
     945          22 :         CreateValidTabName(aName);
     946          22 :         bValid = InsertTab(nDestPos, aName);
     947             : 
     948             :         // Copy the RTL settings
     949          22 :         maTabs[nDestPos]->SetLayoutRTL(pSrcDoc->maTabs[nSrcPos]->IsLayoutRTL());
     950          22 :         maTabs[nDestPos]->SetLoadingRTL(pSrcDoc->maTabs[nSrcPos]->IsLoadingRTL());
     951             :     }
     952             :     else                        // bestehende Tabelle ersetzen
     953             :     {
     954           4 :         if (ValidTab(nDestPos) && nDestPos < static_cast<SCTAB>(maTabs.size()) && maTabs[nDestPos])
     955             :         {
     956           4 :             maTabs[nDestPos]->DeleteArea( 0,0, MAXCOL,MAXROW, IDF_ALL );
     957             :         }
     958             :         else
     959           0 :             bValid = false;
     960             :     }
     961             : 
     962          26 :     if (bValid)
     963             :     {
     964          26 :         bool bOldAutoCalcSrc = false;
     965          26 :         bool bOldAutoCalc = GetAutoCalc();
     966          26 :         SetAutoCalc( false );   // Mehrfachberechnungen vermeiden
     967          26 :         SetNoListening( true );
     968          26 :         if ( bResultsOnly )
     969             :         {
     970           4 :             bOldAutoCalcSrc = pSrcDoc->GetAutoCalc();
     971           4 :             pSrcDoc->SetAutoCalc( true );   // falls was berechnet werden muss
     972             :         }
     973             : 
     974             :         {
     975          26 :             NumFmtMergeHandler aNumFmtMergeHdl(this, pSrcDoc);
     976             : 
     977          52 :             sc::CopyToDocContext aCxt(*this);
     978          26 :             nDestPos = std::min(nDestPos, (SCTAB)(GetTableCount() - 1));
     979             :             {   // scope for bulk broadcast
     980          26 :                 ScBulkBroadcast aBulkBroadcast( pBASM);
     981          26 :                 pSrcDoc->maTabs[nSrcPos]->CopyToTable(aCxt, 0, 0, MAXCOL, MAXROW,
     982          34 :                         ( bResultsOnly ? IDF_ALL & ~IDF_FORMULA : IDF_ALL),
     983         104 :                         false, maTabs[nDestPos] );
     984          26 :             }
     985             :         }
     986          26 :         maTabs[nDestPos]->SetTabNo(nDestPos);
     987          26 :         maTabs[nDestPos]->SetTabBgColor(pSrcDoc->maTabs[nSrcPos]->GetTabBgColor());
     988             : 
     989          26 :         if ( !bResultsOnly )
     990             :         {
     991          22 :             sc::RefUpdateContext aRefCxt(*this);
     992          22 :             aRefCxt.meMode = URM_COPY;
     993          22 :             aRefCxt.maRange = ScRange(0, 0, nDestPos, MAXCOL, MAXROW, nDestPos);
     994          22 :             aRefCxt.mnTabDelta = nDestPos - nSrcPos;
     995          22 :             maTabs[nDestPos]->UpdateReference(aRefCxt, NULL);
     996             : 
     997             :             // Readjust self-contained absolute references to this sheet
     998          22 :             maTabs[nDestPos]->TestTabRefAbs(nSrcPos);
     999          44 :             sc::CompileFormulaContext aFormulaCxt(this);
    1000          44 :             maTabs[nDestPos]->CompileAll(aFormulaCxt);
    1001             :         }
    1002             : 
    1003          26 :         SetNoListening( false );
    1004          26 :         if ( !bResultsOnly )
    1005          22 :             maTabs[nDestPos]->StartAllListeners();
    1006          26 :         SetDirty( ScRange( 0, 0, nDestPos, MAXCOL, MAXROW, nDestPos));
    1007             : 
    1008          26 :         if ( bResultsOnly )
    1009           4 :             pSrcDoc->SetAutoCalc( bOldAutoCalcSrc );
    1010          26 :         SetAutoCalc( bOldAutoCalc );
    1011             : 
    1012             :         //  Drawing kopieren
    1013             : 
    1014          26 :         if (bInsertNew)
    1015          22 :             TransferDrawPage( pSrcDoc, nSrcPos, nDestPos );
    1016             : 
    1017          26 :         maTabs[nDestPos]->SetPendingRowHeights( pSrcDoc->maTabs[nSrcPos]->IsPendingRowHeights() );
    1018             :     }
    1019          26 :     if (!bValid)
    1020           0 :         nRetVal = 0;
    1021          26 :     bool bVbaEnabled = IsInVBAMode();
    1022             : 
    1023          26 :     if ( bVbaEnabled  )
    1024             :     {
    1025           0 :         SfxObjectShell* pSrcShell = pSrcDoc->GetDocumentShell();
    1026           0 :         if ( pSrcShell )
    1027             :         {
    1028           0 :             OUString aLibName("Standard");
    1029           0 :             const BasicManager *pBasicManager = pSrcShell->GetBasicManager();
    1030           0 :             if (pBasicManager && !pBasicManager->GetName().isEmpty())
    1031             :             {
    1032           0 :                 aLibName = pSrcShell->GetBasicManager()->GetName();
    1033             :             }
    1034           0 :             OUString sCodeName;
    1035           0 :             OUString sSource;
    1036           0 :             uno::Reference< script::XLibraryContainer > xLibContainer = pSrcShell->GetBasicContainer();
    1037           0 :             uno::Reference< container::XNameContainer > xLib;
    1038           0 :             if( xLibContainer.is() )
    1039             :             {
    1040           0 :                 uno::Any aLibAny = xLibContainer->getByName(aLibName);
    1041           0 :                 aLibAny >>= xLib;
    1042             :             }
    1043             : 
    1044           0 :             if( xLib.is() )
    1045             :             {
    1046           0 :                 OUString sSrcCodeName;
    1047           0 :                 pSrcDoc->GetCodeName( nSrcPos, sSrcCodeName );
    1048           0 :                 OUString sRTLSource;
    1049           0 :                 xLib->getByName( sSrcCodeName ) >>= sRTLSource;
    1050           0 :                 sSource = sRTLSource;
    1051             :             }
    1052           0 :             VBA_InsertModule( *this, nDestPos, sCodeName, sSource );
    1053             :         }
    1054             :     }
    1055             : 
    1056          26 :     return nRetVal;
    1057             : }
    1058             : 
    1059           2 : void ScDocument::SetError( SCCOL nCol, SCROW nRow, SCTAB nTab, const sal_uInt16 nError)
    1060             : {
    1061           2 :     if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()))
    1062           2 :         if (maTabs[nTab])
    1063           2 :             maTabs[nTab]->SetError( nCol, nRow, nError );
    1064           2 : }
    1065             : 
    1066           0 : void ScDocument::SetFormula(
    1067             :     const ScAddress& rPos, const ScTokenArray& rArray, formula::FormulaGrammar::Grammar eGram )
    1068             : {
    1069           0 :     if (!TableExists(rPos.Tab()))
    1070           0 :         return;
    1071             : 
    1072           0 :     maTabs[rPos.Tab()]->SetFormula(rPos.Col(), rPos.Row(), rArray, eGram);
    1073             : }
    1074             : 
    1075           0 : void ScDocument::SetFormula(
    1076             :     const ScAddress& rPos, const OUString& rFormula, formula::FormulaGrammar::Grammar eGram )
    1077             : {
    1078           0 :     if (!TableExists(rPos.Tab()))
    1079           0 :         return;
    1080             : 
    1081           0 :     maTabs[rPos.Tab()]->SetFormula(rPos.Col(), rPos.Row(), rFormula, eGram);
    1082             : }
    1083             : 
    1084         594 : ScFormulaCell* ScDocument::SetFormulaCell( const ScAddress& rPos, ScFormulaCell* pCell )
    1085             : {
    1086         594 :     if (!TableExists(rPos.Tab()))
    1087             :     {
    1088           0 :         delete pCell;
    1089           0 :         return NULL;
    1090             :     }
    1091             : 
    1092         594 :     return maTabs[rPos.Tab()]->SetFormulaCell(rPos.Col(), rPos.Row(), pCell);
    1093             : }
    1094             : 
    1095           6 : bool ScDocument::SetFormulaCells( const ScAddress& rPos, std::vector<ScFormulaCell*>& rCells )
    1096             : {
    1097           6 :     if (rCells.empty())
    1098           0 :         return false;
    1099             : 
    1100           6 :     ScTable* pTab = FetchTable(rPos.Tab());
    1101           6 :     if (!pTab)
    1102           0 :         return false;
    1103             : 
    1104           6 :     return pTab->SetFormulaCells(rPos.Col(), rPos.Row(), rCells);
    1105             : }
    1106             : 
    1107           2 : void ScDocument::SetConsolidateDlgData( const ScConsolidateParam* pData )
    1108             : {
    1109           2 :     delete pConsolidateDlgData;
    1110             : 
    1111           2 :     if ( pData )
    1112           2 :         pConsolidateDlgData = new ScConsolidateParam( *pData );
    1113             :     else
    1114           0 :         pConsolidateDlgData = NULL;
    1115           2 : }
    1116             : 
    1117           8 : void ScDocument::SetChangeViewSettings(const ScChangeViewSettings& rNew)
    1118             : {
    1119           8 :     if (pChangeViewSettings==NULL)
    1120           8 :         pChangeViewSettings = new ScChangeViewSettings;
    1121             : 
    1122             :     OSL_ENSURE( pChangeViewSettings, "Oops. No ChangeViewSettings :-( by!" );
    1123             : 
    1124           8 :     *pChangeViewSettings=rNew;
    1125           8 : }
    1126             : 
    1127        2088 : ScFieldEditEngine* ScDocument::CreateFieldEditEngine()
    1128             : {
    1129        2088 :     ScFieldEditEngine* pNewEditEngine = NULL;
    1130        2088 :     if (!pCacheFieldEditEngine)
    1131             :     {
    1132             :         pNewEditEngine = new ScFieldEditEngine(
    1133         116 :             this, GetEnginePool(), GetEditPool(), false);
    1134             :     }
    1135             :     else
    1136             :     {
    1137        1972 :         if ( !bImportingXML )
    1138             :         {
    1139             :             // #i66209# previous use might not have restored update mode,
    1140             :             // ensure same state as for a new EditEngine (UpdateMode = true)
    1141        1972 :             if ( !pCacheFieldEditEngine->GetUpdateMode() )
    1142           0 :                 pCacheFieldEditEngine->SetUpdateMode(true);
    1143             :         }
    1144             : 
    1145        1972 :         pNewEditEngine = pCacheFieldEditEngine;
    1146        1972 :         pCacheFieldEditEngine = NULL;
    1147             :     }
    1148        2088 :     return pNewEditEngine;
    1149             : }
    1150             : 
    1151        2017 : void ScDocument::DisposeFieldEditEngine(ScFieldEditEngine*& rpEditEngine)
    1152             : {
    1153        2017 :     if (!pCacheFieldEditEngine && rpEditEngine)
    1154             :     {
    1155        1997 :         pCacheFieldEditEngine = rpEditEngine;
    1156        1997 :         pCacheFieldEditEngine->Clear();
    1157             :     }
    1158             :     else
    1159          20 :         delete rpEditEngine;
    1160        2017 :     rpEditEngine = NULL;
    1161        2017 : }
    1162             : 
    1163         388 : ScRecursionHelper* ScDocument::CreateRecursionHelperInstance()
    1164             : {
    1165         388 :     return new ScRecursionHelper;
    1166             : }
    1167             : 
    1168         126 : ScLookupCache & ScDocument::GetLookupCache( const ScRange & rRange )
    1169             : {
    1170         126 :     ScLookupCache* pCache = 0;
    1171         126 :     if (!pLookupCacheMapImpl)
    1172          12 :         pLookupCacheMapImpl = new ScLookupCacheMapImpl;
    1173         126 :     ScLookupCacheMap::iterator it( pLookupCacheMapImpl->aCacheMap.find( rRange));
    1174         126 :     if (it == pLookupCacheMapImpl->aCacheMap.end())
    1175             :     {
    1176          20 :         pCache = new ScLookupCache( this, rRange);
    1177          20 :         AddLookupCache( *pCache);
    1178             :     }
    1179             :     else
    1180         106 :         pCache = (*it).second;
    1181         126 :     return *pCache;
    1182             : }
    1183             : 
    1184          20 : void ScDocument::AddLookupCache( ScLookupCache & rCache )
    1185             : {
    1186          40 :     if (!pLookupCacheMapImpl->aCacheMap.insert( ::std::pair< const ScRange,
    1187          40 :                 ScLookupCache*>( rCache.getRange(), &rCache)).second)
    1188             :     {
    1189             :         OSL_FAIL( "ScDocument::AddLookupCache: couldn't add to hash map");
    1190             :     }
    1191             :     else
    1192          20 :         StartListeningArea( rCache.getRange(), &rCache);
    1193          20 : }
    1194             : 
    1195           8 : void ScDocument::RemoveLookupCache( ScLookupCache & rCache )
    1196             : {
    1197             :     ScLookupCacheMap::iterator it( pLookupCacheMapImpl->aCacheMap.find(
    1198           8 :                 rCache.getRange()));
    1199           8 :     if (it == pLookupCacheMapImpl->aCacheMap.end())
    1200             :     {
    1201             :         OSL_FAIL( "ScDocument::RemoveLookupCache: range not found in hash map");
    1202             :     }
    1203             :     else
    1204             :     {
    1205           8 :         ScLookupCache* pCache = (*it).second;
    1206           8 :         pLookupCacheMapImpl->aCacheMap.erase( it);
    1207           8 :         EndListeningArea( pCache->getRange(), &rCache);
    1208             :     }
    1209           8 : }
    1210             : 
    1211         478 : void ScDocument::ClearLookupCaches()
    1212             : {
    1213         478 :     if( pLookupCacheMapImpl )
    1214          10 :         pLookupCacheMapImpl->clear();
    1215         478 : }
    1216             : 
    1217           0 : bool ScDocument::IsCellInChangeTrack(const ScAddress &cell,Color *pColCellBoder)
    1218             : {
    1219           0 :     ScChangeTrack* pTrack = GetChangeTrack();
    1220           0 :     ScChangeViewSettings* pSettings = GetChangeViewSettings();
    1221           0 :     if ( !pTrack || !pTrack->GetFirst() || !pSettings || !pSettings->ShowChanges() )
    1222           0 :         return false;           // nix da oder abgeschaltet
    1223           0 :     ScActionColorChanger aColorChanger(*pTrack);
    1224             :     //  Clipping passiert von aussen
    1225             :     //! ohne Clipping, nur betroffene Zeilen painten ??!??!?
    1226           0 :     const ScChangeAction* pAction = pTrack->GetFirst();
    1227           0 :     while (pAction)
    1228             :     {
    1229             :         ScChangeActionType eType;
    1230           0 :         if ( pAction->IsVisible() )
    1231             :         {
    1232           0 :             eType = pAction->GetType();
    1233           0 :             const ScBigRange& rBig = pAction->GetBigRange();
    1234           0 :             if ( rBig.aStart.Tab() == cell.Tab())
    1235             :             {
    1236           0 :                 ScRange aRange = rBig.MakeRange();
    1237           0 :                 if ( eType == SC_CAT_DELETE_ROWS )
    1238           0 :                     aRange.aEnd.SetRow( aRange.aStart.Row() );
    1239           0 :                 else if ( eType == SC_CAT_DELETE_COLS )
    1240           0 :                     aRange.aEnd.SetCol( aRange.aStart.Col() );
    1241           0 :                 if (ScViewUtil::IsActionShown( *pAction, *pSettings, *this ) )
    1242             :                 {
    1243           0 :                     if (aRange.In(cell))
    1244             :                     {
    1245           0 :                         if (pColCellBoder != NULL)
    1246             :                         {
    1247           0 :                             aColorChanger.Update( *pAction );
    1248           0 :                             Color aColor( aColorChanger.GetColor() );
    1249           0 :                             *pColCellBoder = aColor;
    1250             :                         }
    1251           0 :                         return true;
    1252             :                     }
    1253             :                 }
    1254             :             }
    1255           0 :             if ( eType == SC_CAT_MOVE &&
    1256             :                 static_cast<const ScChangeActionMove*>(pAction)->
    1257           0 :                 GetFromRange().aStart.Tab() == cell.Col() )
    1258             :             {
    1259             :                 ScRange aRange = static_cast<const ScChangeActionMove*>(pAction)->
    1260           0 :                     GetFromRange().MakeRange();
    1261           0 :                 if (ScViewUtil::IsActionShown( *pAction, *pSettings, *this ) )
    1262             :                 {
    1263           0 :                     if (aRange.In(cell))
    1264             :                     {
    1265           0 :                         if (pColCellBoder != NULL)
    1266             :                         {
    1267           0 :                             aColorChanger.Update( *pAction );
    1268           0 :                             Color aColor( aColorChanger.GetColor() );
    1269           0 :                             *pColCellBoder = aColor;
    1270             :                         }
    1271           0 :                         return true;
    1272             :                     }
    1273             :                 }
    1274             :             }
    1275             :         }
    1276           0 :         pAction = pAction->GetNext();
    1277             :     }
    1278           0 :     return false;
    1279             : }
    1280             : 
    1281           0 : void ScDocument::GetCellChangeTrackNote( const ScAddress &aCellPos, OUString &aTrackText,bool &bLeftEdge)
    1282             : {
    1283           0 :     aTrackText = OUString();
    1284             :     //  Change-Tracking
    1285           0 :     ScChangeTrack* pTrack = GetChangeTrack();
    1286           0 :     ScChangeViewSettings* pSettings = GetChangeViewSettings();
    1287           0 :     if ( pTrack && pTrack->GetFirst() && pSettings && pSettings->ShowChanges())
    1288             :     {
    1289           0 :         const ScChangeAction* pFound = NULL;
    1290           0 :         const ScChangeAction* pFoundContent = NULL;
    1291           0 :         const ScChangeAction* pFoundMove = NULL;
    1292           0 :         long nModified = 0;
    1293           0 :         const ScChangeAction* pAction = pTrack->GetFirst();
    1294           0 :         while (pAction)
    1295             :         {
    1296           0 :             if ( pAction->IsVisible() &&
    1297           0 :                  ScViewUtil::IsActionShown( *pAction, *pSettings, *this ) )
    1298             :             {
    1299           0 :                 ScChangeActionType eType = pAction->GetType();
    1300           0 :                 const ScBigRange& rBig = pAction->GetBigRange();
    1301           0 :                 if ( rBig.aStart.Tab() == aCellPos.Tab())
    1302             :                 {
    1303           0 :                     ScRange aRange = rBig.MakeRange();
    1304           0 :                     if ( eType == SC_CAT_DELETE_ROWS )
    1305           0 :                         aRange.aEnd.SetRow( aRange.aStart.Row() );
    1306           0 :                     else if ( eType == SC_CAT_DELETE_COLS )
    1307           0 :                         aRange.aEnd.SetCol( aRange.aStart.Col() );
    1308           0 :                     if ( aRange.In( aCellPos ) )
    1309             :                     {
    1310           0 :                         pFound = pAction;       // der letzte gewinnt
    1311           0 :                         switch ( eType )
    1312             :                         {
    1313             :                             case SC_CAT_CONTENT :
    1314           0 :                                 pFoundContent = pAction;
    1315           0 :                             break;
    1316             :                             case SC_CAT_MOVE :
    1317           0 :                                 pFoundMove = pAction;
    1318           0 :                             break;
    1319             :                             default:
    1320           0 :                                 break;
    1321             :                         }
    1322           0 :                         ++nModified;
    1323             :                     }
    1324             :                 }
    1325           0 :                 if ( eType == SC_CAT_MOVE )
    1326             :                 {
    1327             :                     ScRange aRange =
    1328             :                         static_cast<const ScChangeActionMove*>(pAction)->
    1329           0 :                         GetFromRange().MakeRange();
    1330           0 :                     if ( aRange.In( aCellPos ) )
    1331             :                     {
    1332           0 :                         pFound = pAction;
    1333           0 :                         ++nModified;
    1334             :                     }
    1335             :                 }
    1336             :             }
    1337           0 :             pAction = pAction->GetNext();
    1338             :         }
    1339           0 :         if ( pFound )
    1340             :         {
    1341           0 :             if ( pFoundContent && pFound->GetType() != SC_CAT_CONTENT )
    1342           0 :                 pFound = pFoundContent;     // Content gewinnt
    1343           0 :             if ( pFoundMove && pFound->GetType() != SC_CAT_MOVE &&
    1344           0 :                     pFoundMove->GetActionNumber() >
    1345           0 :                     pFound->GetActionNumber() )
    1346           0 :                 pFound = pFoundMove;        // Move gewinnt
    1347             :             //  bei geloeschten Spalten: Pfeil auf die linke Seite der Zelle
    1348           0 :             if ( pFound->GetType() == SC_CAT_DELETE_COLS )
    1349           0 :                 bLeftEdge = true;
    1350           0 :             DateTime aDT = pFound->GetDateTime();
    1351           0 :             aTrackText  = pFound->GetUser();
    1352           0 :             aTrackText += ", ";
    1353           0 :             aTrackText += ScGlobal::pLocaleData->getDate(aDT);
    1354           0 :             aTrackText += " ";
    1355           0 :             aTrackText += ScGlobal::pLocaleData->getTime(aDT);
    1356           0 :             aTrackText += ":\n";
    1357           0 :             OUString aComStr = pFound->GetComment();
    1358           0 :             if(!aComStr.isEmpty())
    1359             :             {
    1360           0 :                 aTrackText += aComStr;
    1361           0 :                 aTrackText += "\n( ";
    1362             :             }
    1363           0 :             pFound->GetDescription( aTrackText, this );
    1364           0 :             if (!aComStr.isEmpty())
    1365             :             {
    1366           0 :                 aTrackText += ")";
    1367           0 :             }
    1368             :         }
    1369             :     }
    1370           0 : }
    1371             : 
    1372         232 : void ScDocument::SetPreviewFont( SfxItemSet* pFont )
    1373             : {
    1374         232 :     delete pPreviewFont;
    1375         232 :     pPreviewFont = pFont;
    1376         232 : }
    1377             : 
    1378         232 : void  ScDocument::SetPreviewSelection( ScMarkData& rSel )
    1379             : {
    1380         232 :     maPreviewSelection = rSel;
    1381         232 : }
    1382             : 
    1383       14018 : SfxItemSet* ScDocument::GetPreviewFont( SCCOL nCol, SCROW nRow, SCTAB nTab )
    1384             : {
    1385       14018 :     SfxItemSet* pRet = NULL;
    1386       14018 :     if ( pPreviewFont )
    1387             :     {
    1388       13896 :         ScMarkData aSel = GetPreviewSelection();
    1389       13896 :         if ( aSel.IsCellMarked( nCol, nRow ) && aSel.GetFirstSelected() == nTab )
    1390         572 :             pRet = pPreviewFont;
    1391             :     }
    1392       14018 :     return pRet;
    1393             : }
    1394             : 
    1395     4930563 : ScStyleSheet* ScDocument::GetPreviewCellStyle( SCCOL nCol, SCROW nRow, SCTAB nTab )
    1396             : {
    1397     4930563 :     ScStyleSheet* pRet = NULL;
    1398     4930563 :     ScMarkData aSel = GetPreviewSelection();
    1399     4930563 :     if ( pPreviewCellStyle && aSel.IsCellMarked( nCol, nRow ) && aSel.GetFirstSelected() == nTab  )
    1400           0 :         pRet = pPreviewCellStyle;
    1401     4930563 :     return pRet;
    1402         228 : }
    1403             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10