xref: /trunk/main/sc/source/core/data/documen2.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1b3f79822SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3b3f79822SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4b3f79822SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5b3f79822SAndrew Rist  * distributed with this work for additional information
6b3f79822SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7b3f79822SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8b3f79822SAndrew Rist  * "License"); you may not use this file except in compliance
9b3f79822SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11b3f79822SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13b3f79822SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14b3f79822SAndrew Rist  * software distributed under the License is distributed on an
15b3f79822SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16b3f79822SAndrew Rist  * KIND, either express or implied.  See the License for the
17b3f79822SAndrew Rist  * specific language governing permissions and limitations
18b3f79822SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20b3f79822SAndrew Rist  *************************************************************/
21b3f79822SAndrew Rist 
22b3f79822SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sc.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir // INCLUDE ---------------------------------------------------------------
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #define _ZFORLIST_DECLARE_TABLE
30cdf0e10cSrcweir #include "scitems.hxx"
31cdf0e10cSrcweir #include <editeng/eeitem.hxx>
32cdf0e10cSrcweir 
33cdf0e10cSrcweir #include <editeng/editeng.hxx>
34cdf0e10cSrcweir #include <editeng/forbiddencharacterstable.hxx>
35cdf0e10cSrcweir #include <sfx2/linkmgr.hxx>
36cdf0e10cSrcweir #include <svx/svdpool.hxx>
37cdf0e10cSrcweir #include <svx/svdobj.hxx>
38cdf0e10cSrcweir #include <sfx2/bindings.hxx>
39cdf0e10cSrcweir #include <sfx2/objsh.hxx>
40cdf0e10cSrcweir #include <sfx2/printer.hxx>
41cdf0e10cSrcweir #include <svl/zforlist.hxx>
42cdf0e10cSrcweir #include <svl/zformat.hxx>
43cdf0e10cSrcweir #include <vcl/virdev.hxx>
44cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
45cdf0e10cSrcweir #include <svl/PasswordHelper.hxx>
46cdf0e10cSrcweir #include <tools/tenccvt.hxx>
47cdf0e10cSrcweir #include <tools/list.hxx>
48cdf0e10cSrcweir #include <rtl/crc.h>
49cdf0e10cSrcweir #include <basic/basmgr.hxx>
50cdf0e10cSrcweir 
51cdf0e10cSrcweir #include "document.hxx"
52cdf0e10cSrcweir #include "table.hxx"
53cdf0e10cSrcweir #include "attrib.hxx"
54cdf0e10cSrcweir #include "patattr.hxx"
55cdf0e10cSrcweir #include "rangenam.hxx"
56cdf0e10cSrcweir #include "dbcolect.hxx"
57cdf0e10cSrcweir #include "pivot.hxx"
58cdf0e10cSrcweir #include "docpool.hxx"
59cdf0e10cSrcweir #include "stlpool.hxx"
60cdf0e10cSrcweir #include "stlsheet.hxx"
61cdf0e10cSrcweir #include "globstr.hrc"
62cdf0e10cSrcweir #include "chartarr.hxx"
63cdf0e10cSrcweir #include "chartlock.hxx"
64cdf0e10cSrcweir #include "rechead.hxx"
65cdf0e10cSrcweir #include "global.hxx"
66cdf0e10cSrcweir #include "brdcst.hxx"
67cdf0e10cSrcweir #include "bcaslot.hxx"
68cdf0e10cSrcweir #include "adiasync.hxx"
69cdf0e10cSrcweir #include "addinlis.hxx"
70cdf0e10cSrcweir #include "chartlis.hxx"
71cdf0e10cSrcweir #include "markdata.hxx"
72cdf0e10cSrcweir #include "conditio.hxx"
73cdf0e10cSrcweir #include "validat.hxx"
74cdf0e10cSrcweir #include "progress.hxx"
75cdf0e10cSrcweir #include "detdata.hxx"
76cdf0e10cSrcweir #include "sc.hrc"               // FID_DATACHANGED
77cdf0e10cSrcweir #include "ddelink.hxx"
78cdf0e10cSrcweir #include "chgtrack.hxx"
79cdf0e10cSrcweir #include "chgviset.hxx"
80cdf0e10cSrcweir #include "editutil.hxx"
81cdf0e10cSrcweir #include "hints.hxx"
82cdf0e10cSrcweir #include "dpobject.hxx"
83cdf0e10cSrcweir #include "scrdata.hxx"
84cdf0e10cSrcweir #include "poolhelp.hxx"
85cdf0e10cSrcweir #include "unoreflist.hxx"
86cdf0e10cSrcweir #include "listenercalls.hxx"
87cdf0e10cSrcweir #include "recursionhelper.hxx"
88cdf0e10cSrcweir #include "lookupcache.hxx"
89cdf0e10cSrcweir #include "externalrefmgr.hxx"
900deba7fbSSteve Yin #include "appoptio.hxx"
910deba7fbSSteve Yin #include "scmod.hxx"
920deba7fbSSteve Yin #include "../../ui/inc/viewutil.hxx"
93cdf0e10cSrcweir #include "tabprotection.hxx"
94cdf0e10cSrcweir #include "formulaparserpool.hxx"
95cdf0e10cSrcweir #include "clipparam.hxx"
96cdf0e10cSrcweir 
97cdf0e10cSrcweir using namespace com::sun::star;
98cdf0e10cSrcweir 
99cdf0e10cSrcweir // pImpl because including lookupcache.hxx in document.hxx isn't wanted, and
100cdf0e10cSrcweir // dtor plus helpers are convenient.
101cdf0e10cSrcweir struct ScLookupCacheMapImpl
102cdf0e10cSrcweir {
103cdf0e10cSrcweir     ScLookupCacheMap aCacheMap;
~ScLookupCacheMapImplScLookupCacheMapImpl104cdf0e10cSrcweir     ~ScLookupCacheMapImpl()
105cdf0e10cSrcweir     {
106cdf0e10cSrcweir         freeCaches();
107cdf0e10cSrcweir     }
clearScLookupCacheMapImpl108cdf0e10cSrcweir     void clear()
109cdf0e10cSrcweir     {
110cdf0e10cSrcweir         freeCaches();
111cdf0e10cSrcweir         // Zap map.
112cdf0e10cSrcweir         ScLookupCacheMap aTmp;
113cdf0e10cSrcweir         aCacheMap.swap( aTmp);
114cdf0e10cSrcweir     }
115cdf0e10cSrcweir private:
freeCachesScLookupCacheMapImpl116cdf0e10cSrcweir     void freeCaches()
117cdf0e10cSrcweir     {
118cdf0e10cSrcweir         for (ScLookupCacheMap::iterator it( aCacheMap.begin()); it != aCacheMap.end(); ++it)
119cdf0e10cSrcweir             delete (*it).second;
120cdf0e10cSrcweir     }
121cdf0e10cSrcweir };
122cdf0e10cSrcweir 
123cdf0e10cSrcweir // STATIC DATA -----------------------------------------------------------
124cdf0e10cSrcweir 
ScDocument(ScDocumentMode eMode,SfxObjectShell * pDocShell)125cdf0e10cSrcweir ScDocument::ScDocument( ScDocumentMode  eMode,
126cdf0e10cSrcweir                         SfxObjectShell* pDocShell ) :
127cdf0e10cSrcweir         xServiceManager( ::comphelper::getProcessServiceFactory() ),
128cdf0e10cSrcweir         mpUndoManager( NULL ),
129cdf0e10cSrcweir         pEditEngine( NULL ),
130cdf0e10cSrcweir         pNoteEngine( NULL ),
131cdf0e10cSrcweir         pNoteItemPool( NULL ),
132cdf0e10cSrcweir         pShell( pDocShell ),
133cdf0e10cSrcweir         pPrinter( NULL ),
134cdf0e10cSrcweir         pVirtualDevice_100th_mm( NULL ),
135cdf0e10cSrcweir         pDrawLayer( NULL ),
136c7be74b1SArmin Le Grand         maColorTable(),
137cdf0e10cSrcweir         pCondFormList( NULL ),
138cdf0e10cSrcweir         pValidationList( NULL ),
139cdf0e10cSrcweir         pFormatExchangeList( NULL ),
140cdf0e10cSrcweir         pDPCollection( NULL ),
141cdf0e10cSrcweir         pLinkManager( NULL ),
142cdf0e10cSrcweir         pFormulaTree( NULL ),
143cdf0e10cSrcweir         pEOFormulaTree( NULL ),
144cdf0e10cSrcweir         pFormulaTrack( NULL ),
145cdf0e10cSrcweir         pEOFormulaTrack( NULL ),
146cdf0e10cSrcweir         pOtherObjects( NULL ),
147cdf0e10cSrcweir         pClipData( NULL ),
148cdf0e10cSrcweir         pDetOpList(NULL),
149cdf0e10cSrcweir         pChangeTrack( NULL ),
150cdf0e10cSrcweir         pUnoBroadcaster( NULL ),
151cdf0e10cSrcweir         pUnoListenerCalls( NULL ),
152cdf0e10cSrcweir         pUnoRefUndoList( NULL ),
153cdf0e10cSrcweir         pChangeViewSettings( NULL ),
154cdf0e10cSrcweir         pScriptTypeData( NULL ),
155cdf0e10cSrcweir         pCacheFieldEditEngine( NULL ),
156cdf0e10cSrcweir         pDocProtection( NULL ),
157cdf0e10cSrcweir         mpClipParam( NULL),
158cdf0e10cSrcweir         pExternalRefMgr( NULL ),
159cdf0e10cSrcweir         pViewOptions( NULL ),
160cdf0e10cSrcweir         pDocOptions( NULL ),
161cdf0e10cSrcweir         pExtDocOptions( NULL ),
162cdf0e10cSrcweir         pConsolidateDlgData( NULL ),
163cdf0e10cSrcweir         pRecursionHelper( NULL ),
164cdf0e10cSrcweir         pAutoNameCache( NULL ),
165cdf0e10cSrcweir         pLookupCacheMapImpl( NULL ),
166cdf0e10cSrcweir         nUnoObjectId( 0 ),
167cdf0e10cSrcweir         nRangeOverflowType( 0 ),
168cdf0e10cSrcweir         aCurTextWidthCalcPos(MAXCOL,0,0),
169cdf0e10cSrcweir         nFormulaCodeInTree(0),
170cdf0e10cSrcweir         nXMLImportedFormulaCount( 0 ),
171cdf0e10cSrcweir         nInterpretLevel(0),
172cdf0e10cSrcweir         nMacroInterpretLevel(0),
173cdf0e10cSrcweir         nInterpreterTableOpLevel(0),
174cdf0e10cSrcweir         nMaxTableNumber( 0 ),
175cdf0e10cSrcweir         nSrcVer( SC_CURRENT_VERSION ),
176cdf0e10cSrcweir         nSrcMaxRow( MAXROW ),
177cdf0e10cSrcweir         nFormulaTrackCount(0),
178cdf0e10cSrcweir         nHardRecalcState(0),
179cdf0e10cSrcweir         nVisibleTab( 0 ),
180cdf0e10cSrcweir         eLinkMode(LM_UNKNOWN),
181cdf0e10cSrcweir         bAutoCalc( eMode == SCDOCMODE_DOCUMENT ),
182cdf0e10cSrcweir         bAutoCalcShellDisabled( sal_False ),
183cdf0e10cSrcweir         bForcedFormulaPending( sal_False ),
184cdf0e10cSrcweir         bCalculatingFormulaTree( sal_False ),
185cdf0e10cSrcweir         bIsClip( eMode == SCDOCMODE_CLIP ),
186cdf0e10cSrcweir         bIsUndo( eMode == SCDOCMODE_UNDO ),
187cdf0e10cSrcweir         bIsVisible( sal_False ),
188cdf0e10cSrcweir         bIsEmbedded( sal_False ),
189cdf0e10cSrcweir //      bNoSetDirty( sal_True ),
190cdf0e10cSrcweir         bNoSetDirty( sal_False ),
191cdf0e10cSrcweir         bInsertingFromOtherDoc( sal_False ),
192cdf0e10cSrcweir         bLoadingMedium( false ),
193cdf0e10cSrcweir         bImportingXML( false ),
194577c0052SWang Lei         mbImportingMSXML( false ),
195cdf0e10cSrcweir         bXMLFromWrapper( sal_False ),
196cdf0e10cSrcweir         bCalcingAfterLoad( sal_False ),
197cdf0e10cSrcweir         bNoListening( sal_False ),
198cdf0e10cSrcweir         bIdleDisabled( sal_False ),
199cdf0e10cSrcweir         bInLinkUpdate( sal_False ),
200cdf0e10cSrcweir         bChartListenerCollectionNeedsUpdate( sal_False ),
201cdf0e10cSrcweir         bHasForcedFormulas( sal_False ),
202cdf0e10cSrcweir         bInDtorClear( sal_False ),
203cdf0e10cSrcweir         bExpandRefs( sal_False ),
204cdf0e10cSrcweir         bDetectiveDirty( sal_False ),
205cdf0e10cSrcweir         nMacroCallMode( SC_MACROCALL_ALLOWED ),
206cdf0e10cSrcweir         bHasMacroFunc( sal_False ),
207cdf0e10cSrcweir         nVisSpellState( 0 ),
208cdf0e10cSrcweir         nAsianCompression(SC_ASIANCOMPRESSION_INVALID),
209cdf0e10cSrcweir         nAsianKerning(SC_ASIANKERNING_INVALID),
210cdf0e10cSrcweir         bPastingDrawFromOtherDoc( sal_False ),
211cdf0e10cSrcweir         nInDdeLinkUpdate( 0 ),
212cdf0e10cSrcweir         bInUnoBroadcast( sal_False ),
213cdf0e10cSrcweir         bInUnoListenerCall( sal_False ),
214cdf0e10cSrcweir         eGrammar( formula::FormulaGrammar::GRAM_NATIVE ),
215cdf0e10cSrcweir         bStyleSheetUsageInvalid( sal_True ),
216cdf0e10cSrcweir         mbUndoEnabled( true ),
217cdf0e10cSrcweir         mbAdjustHeightEnabled( true ),
218cdf0e10cSrcweir         mbExecuteLinkEnabled( true ),
219cdf0e10cSrcweir         mbChangeReadOnlyEnabled( false ),
220cdf0e10cSrcweir         mbStreamValidLocked( false ),
22196f862caSArmin Le Grand         mbIsTemporary(false), // #118840#
222cd54e8d3SPavel Janík         mnNamedRangesLockCount( 0 ),
223cd54e8d3SPavel Janík         bReadOnly(sal_False)
224cdf0e10cSrcweir {
225cdf0e10cSrcweir     SetStorageGrammar( formula::FormulaGrammar::GRAM_STORAGE_DEFAULT);
226cdf0e10cSrcweir 
227cdf0e10cSrcweir     eSrcSet = gsl_getSystemTextEncoding();
228cdf0e10cSrcweir 
229cdf0e10cSrcweir     if ( eMode == SCDOCMODE_DOCUMENT )
230cdf0e10cSrcweir     {
231cdf0e10cSrcweir         if ( pDocShell )
232*b0c1db7eSPatricia Shanahan         {
233cdf0e10cSrcweir             pLinkManager = new sfx2::LinkManager(pDocShell);
234*b0c1db7eSPatricia Shanahan             pLinkManager->SetAutoAskUpdateAllLinks();
235*b0c1db7eSPatricia Shanahan         }
236cdf0e10cSrcweir 
237cdf0e10cSrcweir         xPoolHelper = new ScPoolHelper( this );
238cdf0e10cSrcweir 
239cdf0e10cSrcweir         pTab[0]  = NULL;
240cdf0e10cSrcweir         pBASM = new ScBroadcastAreaSlotMachine( this );
241cdf0e10cSrcweir         pChartListenerCollection = new ScChartListenerCollection( this );
242cdf0e10cSrcweir         pRefreshTimerControl = new ScRefreshTimerControl;
243cdf0e10cSrcweir     }
244cdf0e10cSrcweir     else
245cdf0e10cSrcweir     {
246cdf0e10cSrcweir         pTab[0]     = NULL;
247cdf0e10cSrcweir         pBASM       = NULL;
248cdf0e10cSrcweir         pChartListenerCollection = NULL;
249cdf0e10cSrcweir         pRefreshTimerControl = NULL;
250cdf0e10cSrcweir     }
251cdf0e10cSrcweir 
252cdf0e10cSrcweir     for (SCTAB i=1; i<=MAXTAB; i++)
253cdf0e10cSrcweir         pTab[i] = NULL;
254cdf0e10cSrcweir 
255cdf0e10cSrcweir     pRangeName = new ScRangeName( 4, 4, sal_False, this );
256cdf0e10cSrcweir     pDBCollection = new ScDBCollection( 4, 4, sal_False, this );
257cdf0e10cSrcweir     pSelectionAttr = NULL;
258cdf0e10cSrcweir     pChartCollection = new ScChartCollection;
259cdf0e10cSrcweir     apTemporaryChartLock = std::auto_ptr< ScTemporaryChartLock >( new ScTemporaryChartLock(this) );
260cdf0e10cSrcweir     xColNameRanges = new ScRangePairList;
261cdf0e10cSrcweir     xRowNameRanges = new ScRangePairList;
262cdf0e10cSrcweir     ImplCreateOptions();
263cdf0e10cSrcweir     // languages for a visible document are set by docshell later (from options)
264cdf0e10cSrcweir     SetLanguage( ScGlobal::eLnge, ScGlobal::eLnge, ScGlobal::eLnge );
265cdf0e10cSrcweir 
266cdf0e10cSrcweir     aTrackTimer.SetTimeoutHdl( LINK( this, ScDocument, TrackTimeHdl ) );
267cdf0e10cSrcweir     aTrackTimer.SetTimeout( 100 );
268cdf0e10cSrcweir }
269cdf0e10cSrcweir 
GetLinkManager() const270cdf0e10cSrcweir sfx2::LinkManager*  ScDocument::GetLinkManager()  const
271cdf0e10cSrcweir {
272cdf0e10cSrcweir     if ( bAutoCalc && !pLinkManager && pShell)
273cdf0e10cSrcweir     {
274cdf0e10cSrcweir         pLinkManager = new sfx2::LinkManager( pShell );
275*b0c1db7eSPatricia Shanahan         pLinkManager->SetAutoAskUpdateAllLinks();
276cdf0e10cSrcweir     }
277cdf0e10cSrcweir     return pLinkManager;
278cdf0e10cSrcweir }
279cdf0e10cSrcweir 
280cdf0e10cSrcweir 
SetStorageGrammar(formula::FormulaGrammar::Grammar eGram)281cdf0e10cSrcweir void ScDocument::SetStorageGrammar( formula::FormulaGrammar::Grammar eGram )
282cdf0e10cSrcweir {
283cdf0e10cSrcweir     DBG_ASSERT(
284cdf0e10cSrcweir         eGram == formula::FormulaGrammar::GRAM_ODFF ||
285cdf0e10cSrcweir             eGram == formula::FormulaGrammar::GRAM_PODF,
286cdf0e10cSrcweir             "ScDocument::SetStorageGrammar: wrong storage grammar");
287cdf0e10cSrcweir 
288cdf0e10cSrcweir     eStorageGrammar = eGram;
289cdf0e10cSrcweir 
290cdf0e10cSrcweir     // FIXME: the XML import shouldn't strip brackets, the compiler should
291cdf0e10cSrcweir     // digest them instead, which could also speedup reference recognition
292cdf0e10cSrcweir     // during import.
293cdf0e10cSrcweir 
294cdf0e10cSrcweir     eXmlImportGrammar = formula::FormulaGrammar::mergeToGrammar( eGram,
295cdf0e10cSrcweir             formula::FormulaGrammar::CONV_OOO);
296cdf0e10cSrcweir }
297cdf0e10cSrcweir 
298cdf0e10cSrcweir 
SetDocVisible(sal_Bool bSet)299cdf0e10cSrcweir void ScDocument::SetDocVisible( sal_Bool bSet )
300cdf0e10cSrcweir {
301cdf0e10cSrcweir     //  called from view ctor - only for a visible document,
302cdf0e10cSrcweir     //  each new sheet's RTL flag is initialized from the locale
303cdf0e10cSrcweir     bIsVisible = bSet;
304cdf0e10cSrcweir }
305cdf0e10cSrcweir 
306cdf0e10cSrcweir 
GetDocumentID() const307cdf0e10cSrcweir sal_uInt32 ScDocument::GetDocumentID() const
308cdf0e10cSrcweir {
309cdf0e10cSrcweir     const ScDocument* pThis = this;
310cdf0e10cSrcweir     sal_uInt32 nCrc = rtl_crc32( 0, &pThis, sizeof(ScDocument*) );
311cdf0e10cSrcweir     // the this pointer only might not be sufficient
312cdf0e10cSrcweir     nCrc = rtl_crc32( nCrc, &pShell, sizeof(SfxObjectShell*) );
313cdf0e10cSrcweir     return nCrc;
314cdf0e10cSrcweir }
315cdf0e10cSrcweir 
316cdf0e10cSrcweir 
StartChangeTracking()317cdf0e10cSrcweir void ScDocument::StartChangeTracking()
318cdf0e10cSrcweir {
319cdf0e10cSrcweir     if (!pChangeTrack)
320cdf0e10cSrcweir         pChangeTrack = new ScChangeTrack( this );
321cdf0e10cSrcweir }
322cdf0e10cSrcweir 
EndChangeTracking()323cdf0e10cSrcweir void ScDocument::EndChangeTracking()
324cdf0e10cSrcweir {
325cdf0e10cSrcweir     delete pChangeTrack;
326cdf0e10cSrcweir     pChangeTrack = NULL;
327cdf0e10cSrcweir }
328cdf0e10cSrcweir 
SetChangeTrack(ScChangeTrack * pTrack)329cdf0e10cSrcweir void ScDocument::SetChangeTrack( ScChangeTrack* pTrack )
330cdf0e10cSrcweir {
331cdf0e10cSrcweir     DBG_ASSERT( pTrack->GetDocument() == this, "SetChangeTrack: different documents" );
332cdf0e10cSrcweir     if ( !pTrack || pTrack == pChangeTrack || pTrack->GetDocument() != this )
333cdf0e10cSrcweir         return ;
334cdf0e10cSrcweir     EndChangeTracking();
335cdf0e10cSrcweir     pChangeTrack = pTrack;
336cdf0e10cSrcweir }
337cdf0e10cSrcweir 
338cdf0e10cSrcweir 
IMPL_LINK(ScDocument,TrackTimeHdl,Timer *,EMPTYARG)339cdf0e10cSrcweir IMPL_LINK( ScDocument, TrackTimeHdl, Timer*, EMPTYARG )
340cdf0e10cSrcweir {
341cdf0e10cSrcweir     if ( ScDdeLink::IsInUpdate() )      // nicht verschachteln
342cdf0e10cSrcweir     {
343cdf0e10cSrcweir         aTrackTimer.Start();            // spaeter nochmal versuchen
344cdf0e10cSrcweir     }
345cdf0e10cSrcweir     else if (pShell)                    // ausfuehren
346cdf0e10cSrcweir     {
347cdf0e10cSrcweir         TrackFormulas();
348cdf0e10cSrcweir         pShell->Broadcast( SfxSimpleHint( FID_DATACHANGED ) );
349cdf0e10cSrcweir         ResetChanged( ScRange(0,0,0,MAXCOL,MAXROW,MAXTAB) );
350cdf0e10cSrcweir 
351cdf0e10cSrcweir             //  modified...
352cdf0e10cSrcweir 
353cdf0e10cSrcweir         if (!pShell->IsModified())
354cdf0e10cSrcweir         {
355cdf0e10cSrcweir             pShell->SetModified( sal_True );
356cdf0e10cSrcweir             SfxBindings* pBindings = GetViewBindings();
357cdf0e10cSrcweir             if (pBindings)
358cdf0e10cSrcweir             {
359cdf0e10cSrcweir                 pBindings->Invalidate( SID_SAVEDOC );
360cdf0e10cSrcweir                 pBindings->Invalidate( SID_DOC_MODIFIED );
361cdf0e10cSrcweir             }
362cdf0e10cSrcweir         }
363cdf0e10cSrcweir     }
364cdf0e10cSrcweir 
365cdf0e10cSrcweir     return 0;
366cdf0e10cSrcweir }
367cdf0e10cSrcweir 
StartTrackTimer()368cdf0e10cSrcweir void ScDocument::StartTrackTimer()
369cdf0e10cSrcweir {
370cdf0e10cSrcweir     if (!aTrackTimer.IsActive())        // nicht ewig aufschieben
371cdf0e10cSrcweir         aTrackTimer.Start();
372cdf0e10cSrcweir }
373cdf0e10cSrcweir 
~ScDocument()374cdf0e10cSrcweir ScDocument::~ScDocument()
375cdf0e10cSrcweir {
376cdf0e10cSrcweir     DBG_ASSERT( !bInLinkUpdate, "bInLinkUpdate in dtor" );
377cdf0e10cSrcweir 
378cdf0e10cSrcweir     bInDtorClear = sal_True;
379cdf0e10cSrcweir 
380cdf0e10cSrcweir     // first of all disable all refresh timers by deleting the control
381cdf0e10cSrcweir     if ( pRefreshTimerControl )
382cdf0e10cSrcweir     {   // To be sure there isn't anything running do it with a protector,
383cdf0e10cSrcweir         // this ensures also that nothing needs the control anymore.
384cdf0e10cSrcweir         ScRefreshTimerProtector aProt( GetRefreshTimerControlAddress() );
385cdf0e10cSrcweir         delete pRefreshTimerControl, pRefreshTimerControl = NULL;
386cdf0e10cSrcweir     }
387cdf0e10cSrcweir 
388cdf0e10cSrcweir     // Links aufrauemen
389cdf0e10cSrcweir 
390cdf0e10cSrcweir     if ( GetLinkManager() )
391cdf0e10cSrcweir     {
392cdf0e10cSrcweir         // BaseLinks freigeben
393cdf0e10cSrcweir         for ( sal_uInt16 n = pLinkManager->GetServers().Count(); n; )
394cdf0e10cSrcweir             pLinkManager->GetServers()[ --n ]->Closed();
395cdf0e10cSrcweir 
396cdf0e10cSrcweir         if ( pLinkManager->GetLinks().Count() )
397cdf0e10cSrcweir             pLinkManager->Remove( 0, pLinkManager->GetLinks().Count() );
398cdf0e10cSrcweir     }
399cdf0e10cSrcweir 
400cdf0e10cSrcweir     mxFormulaParserPool.reset();
401cdf0e10cSrcweir     // Destroy the external ref mgr instance here because it has a timer
402cdf0e10cSrcweir     // which needs to be stopped before the app closes.
403cdf0e10cSrcweir     pExternalRefMgr.reset();
404cdf0e10cSrcweir 
405cdf0e10cSrcweir     ScAddInAsync::RemoveDocument( this );
406cdf0e10cSrcweir     ScAddInListener::RemoveDocument( this );
407cdf0e10cSrcweir     DELETEZ( pChartListenerCollection);   // vor pBASM wg. evtl. Listener!
408cdf0e10cSrcweir     DELETEZ( pLookupCacheMapImpl);  // before pBASM because of listeners
409cdf0e10cSrcweir     // BroadcastAreas vor allen Zellen zerstoeren um unnoetige
410cdf0e10cSrcweir     // Einzel-EndListenings der Formelzellen zu vermeiden
411cdf0e10cSrcweir     delete pBASM;       // BroadcastAreaSlotMachine
412cdf0e10cSrcweir     pBASM = NULL;
413cdf0e10cSrcweir 
414cdf0e10cSrcweir     if (pUnoBroadcaster)
415cdf0e10cSrcweir     {
416cdf0e10cSrcweir         delete pUnoBroadcaster;     // broadcasted nochmal SFX_HINT_DYING
417cdf0e10cSrcweir         pUnoBroadcaster = NULL;
418cdf0e10cSrcweir     }
419cdf0e10cSrcweir 
420cdf0e10cSrcweir     delete pUnoRefUndoList;
421cdf0e10cSrcweir     delete pUnoListenerCalls;
422cdf0e10cSrcweir 
423cdf0e10cSrcweir     Clear( sal_True );              // sal_True = from destructor (needed for SdrModel::ClearModel)
424cdf0e10cSrcweir 
425cdf0e10cSrcweir     if (pCondFormList)
426cdf0e10cSrcweir     {
427cdf0e10cSrcweir         pCondFormList->DeleteAndDestroy( 0, pCondFormList->Count() );
428cdf0e10cSrcweir         DELETEZ(pCondFormList);
429cdf0e10cSrcweir     }
430cdf0e10cSrcweir     if (pValidationList)
431cdf0e10cSrcweir     {
432cdf0e10cSrcweir         pValidationList->DeleteAndDestroy( 0, pValidationList->Count() );
433cdf0e10cSrcweir         DELETEZ(pValidationList);
434cdf0e10cSrcweir     }
435cdf0e10cSrcweir     delete pRangeName;
436cdf0e10cSrcweir     delete pDBCollection;
437cdf0e10cSrcweir     delete pSelectionAttr;
438cdf0e10cSrcweir     apTemporaryChartLock.reset();
439cdf0e10cSrcweir     delete pChartCollection;
440cdf0e10cSrcweir     DeleteDrawLayer();
441cdf0e10cSrcweir     delete pFormatExchangeList;
442cdf0e10cSrcweir     delete pPrinter;
443cdf0e10cSrcweir     ImplDeleteOptions();
444cdf0e10cSrcweir     delete pConsolidateDlgData;
445cdf0e10cSrcweir     delete pLinkManager;
446cdf0e10cSrcweir     delete pClipData;
447cdf0e10cSrcweir     delete pDetOpList;                  // loescht auch die Eintraege
448cdf0e10cSrcweir     delete pChangeTrack;
449cdf0e10cSrcweir     delete pEditEngine;
450cdf0e10cSrcweir     delete pNoteEngine;
451cdf0e10cSrcweir     SfxItemPool::Free(pNoteItemPool);
452cdf0e10cSrcweir     delete pChangeViewSettings;         // und weg damit
453cdf0e10cSrcweir     delete pVirtualDevice_100th_mm;
454cdf0e10cSrcweir 
455cdf0e10cSrcweir     if (pDPCollection)
456cdf0e10cSrcweir     {
457cdf0e10cSrcweir         pDPCollection->FreeAll();
458cdf0e10cSrcweir         RemoveUnusedDPObjectCaches();
459cdf0e10cSrcweir         delete pDPCollection;
460cdf0e10cSrcweir     }
461cdf0e10cSrcweir 
462cdf0e10cSrcweir     // delete the EditEngine before destroying the xPoolHelper
463cdf0e10cSrcweir     delete pCacheFieldEditEngine;
464cdf0e10cSrcweir 
465cdf0e10cSrcweir     if ( xPoolHelper.isValid() && !bIsClip )
466cdf0e10cSrcweir         xPoolHelper->SourceDocumentGone();
467cdf0e10cSrcweir     xPoolHelper.unbind();
468cdf0e10cSrcweir 
469cdf0e10cSrcweir     delete pScriptTypeData;
470cdf0e10cSrcweir     delete pOtherObjects;
471cdf0e10cSrcweir     delete pRecursionHelper;
472cdf0e10cSrcweir 
473cdf0e10cSrcweir     DBG_ASSERT( !pAutoNameCache, "AutoNameCache still set in dtor" );
474cdf0e10cSrcweir }
475cdf0e10cSrcweir 
InitClipPtrs(ScDocument * pSourceDoc)476cdf0e10cSrcweir void ScDocument::InitClipPtrs( ScDocument* pSourceDoc )
477cdf0e10cSrcweir {
478cdf0e10cSrcweir     DBG_ASSERT(bIsClip, "InitClipPtrs und nicht bIsClip");
479cdf0e10cSrcweir 
480cdf0e10cSrcweir     if (pCondFormList)
481cdf0e10cSrcweir     {
482cdf0e10cSrcweir         pCondFormList->DeleteAndDestroy( 0, pCondFormList->Count() );
483cdf0e10cSrcweir         DELETEZ(pCondFormList);
484cdf0e10cSrcweir     }
485cdf0e10cSrcweir     if (pValidationList)
486cdf0e10cSrcweir     {
487cdf0e10cSrcweir         pValidationList->DeleteAndDestroy( 0, pValidationList->Count() );
488cdf0e10cSrcweir         DELETEZ(pValidationList);
489cdf0e10cSrcweir     }
490cdf0e10cSrcweir 
491cdf0e10cSrcweir     Clear();
492cdf0e10cSrcweir 
493cdf0e10cSrcweir     xPoolHelper = pSourceDoc->xPoolHelper;
494cdf0e10cSrcweir 
495cdf0e10cSrcweir     //  bedingte Formate / Gueltigkeiten
496cdf0e10cSrcweir     //! Vorlagen kopieren?
497cdf0e10cSrcweir     const ScConditionalFormatList* pSourceCond = pSourceDoc->pCondFormList;
498cdf0e10cSrcweir     if ( pSourceCond )
499cdf0e10cSrcweir         pCondFormList = new ScConditionalFormatList(this, *pSourceCond);
500cdf0e10cSrcweir     const ScValidationDataList* pSourceValid = pSourceDoc->pValidationList;
501cdf0e10cSrcweir     if ( pSourceValid )
502cdf0e10cSrcweir         pValidationList = new ScValidationDataList(this, *pSourceValid);
503cdf0e10cSrcweir 
504cdf0e10cSrcweir                         // Links in Stream speichern
505cdf0e10cSrcweir     delete pClipData;
506cdf0e10cSrcweir     if (pSourceDoc->HasDdeLinks())
507cdf0e10cSrcweir     {
508cdf0e10cSrcweir         pClipData = new SvMemoryStream;
509cdf0e10cSrcweir         pSourceDoc->SaveDdeLinks(*pClipData);
510cdf0e10cSrcweir     }
511cdf0e10cSrcweir     else
512cdf0e10cSrcweir         pClipData = NULL;
513cdf0e10cSrcweir 
514cdf0e10cSrcweir     // Options pointers exist (ImplCreateOptions) for any document.
515cdf0e10cSrcweir     // Must be copied for correct results in OLE objects (#i42666#).
516cdf0e10cSrcweir     SetDocOptions( pSourceDoc->GetDocOptions() );
517cdf0e10cSrcweir     SetViewOptions( pSourceDoc->GetViewOptions() );
518cdf0e10cSrcweir }
519cdf0e10cSrcweir 
GetFormatTable() const520cdf0e10cSrcweir SvNumberFormatter* ScDocument::GetFormatTable() const
521cdf0e10cSrcweir {
522cdf0e10cSrcweir     return xPoolHelper->GetFormTable();
523cdf0e10cSrcweir }
524cdf0e10cSrcweir 
GetEditPool() const525cdf0e10cSrcweir SfxItemPool* ScDocument::GetEditPool() const
526cdf0e10cSrcweir {
527cdf0e10cSrcweir     return xPoolHelper->GetEditPool();
528cdf0e10cSrcweir }
529cdf0e10cSrcweir 
GetEnginePool() const530cdf0e10cSrcweir SfxItemPool* ScDocument::GetEnginePool() const
531cdf0e10cSrcweir {
532cdf0e10cSrcweir     return xPoolHelper->GetEnginePool();
533cdf0e10cSrcweir }
534cdf0e10cSrcweir 
GetEditEngine()535cdf0e10cSrcweir ScFieldEditEngine& ScDocument::GetEditEngine()
536cdf0e10cSrcweir {
537cdf0e10cSrcweir     if ( !pEditEngine )
538cdf0e10cSrcweir     {
539cdf0e10cSrcweir         pEditEngine = new ScFieldEditEngine( GetEnginePool(), GetEditPool() );
540cdf0e10cSrcweir         pEditEngine->SetUpdateMode( sal_False );
541cdf0e10cSrcweir         pEditEngine->EnableUndo( sal_False );
542cdf0e10cSrcweir         pEditEngine->SetRefMapMode( MAP_100TH_MM );
543cdf0e10cSrcweir         ApplyAsianEditSettings( *pEditEngine );
544cdf0e10cSrcweir     }
545cdf0e10cSrcweir     return *pEditEngine;
546cdf0e10cSrcweir }
547cdf0e10cSrcweir 
GetNoteEngine()548cdf0e10cSrcweir ScNoteEditEngine& ScDocument::GetNoteEngine()
549cdf0e10cSrcweir {
550cdf0e10cSrcweir     if ( !pNoteEngine )
551cdf0e10cSrcweir     {
552cdf0e10cSrcweir         pNoteEngine = new ScNoteEditEngine( GetEnginePool(), GetEditPool() );
553cdf0e10cSrcweir         pNoteEngine->SetUpdateMode( sal_False );
554cdf0e10cSrcweir         pNoteEngine->EnableUndo( sal_False );
555cdf0e10cSrcweir         pNoteEngine->SetRefMapMode( MAP_100TH_MM );
556cdf0e10cSrcweir         ApplyAsianEditSettings( *pNoteEngine );
557cdf0e10cSrcweir         const SfxItemSet& rItemSet = GetDefPattern()->GetItemSet();
558cdf0e10cSrcweir         SfxItemSet* pEEItemSet = new SfxItemSet( pNoteEngine->GetEmptyItemSet() );
559cdf0e10cSrcweir         ScPatternAttr::FillToEditItemSet( *pEEItemSet, rItemSet );
560cdf0e10cSrcweir         pNoteEngine->SetDefaults( pEEItemSet );      // edit engine takes ownership
561cdf0e10cSrcweir     }
562cdf0e10cSrcweir     return *pNoteEngine;
563cdf0e10cSrcweir }
564cdf0e10cSrcweir 
ResetClip(ScDocument * pSourceDoc,const ScMarkData * pMarks)565cdf0e10cSrcweir void ScDocument::ResetClip( ScDocument* pSourceDoc, const ScMarkData* pMarks )
566cdf0e10cSrcweir {
567cdf0e10cSrcweir     if (bIsClip)
568cdf0e10cSrcweir     {
569cdf0e10cSrcweir         InitClipPtrs(pSourceDoc);
570cdf0e10cSrcweir 
571cdf0e10cSrcweir         for (SCTAB i = 0; i <= MAXTAB; i++)
572cdf0e10cSrcweir             if (pSourceDoc->pTab[i])
573cdf0e10cSrcweir                 if (!pMarks || pMarks->GetTableSelect(i))
574cdf0e10cSrcweir                 {
575cdf0e10cSrcweir                     String aString;
576cdf0e10cSrcweir                     pSourceDoc->pTab[i]->GetName(aString);
577cdf0e10cSrcweir                     pTab[i] = new ScTable(this, i, aString);
578cdf0e10cSrcweir                     pTab[i]->SetLayoutRTL( pSourceDoc->pTab[i]->IsLayoutRTL() );
579cdf0e10cSrcweir                     nMaxTableNumber = i+1;
580cdf0e10cSrcweir                 }
581cdf0e10cSrcweir     }
582cdf0e10cSrcweir     else
583cdf0e10cSrcweir     {
584cdf0e10cSrcweir         DBG_ERROR("ResetClip");
585cdf0e10cSrcweir     }
586cdf0e10cSrcweir }
587cdf0e10cSrcweir 
ResetClip(ScDocument * pSourceDoc,SCTAB nTab)588cdf0e10cSrcweir void ScDocument::ResetClip( ScDocument* pSourceDoc, SCTAB nTab )
589cdf0e10cSrcweir {
590cdf0e10cSrcweir     if (bIsClip)
591cdf0e10cSrcweir     {
592cdf0e10cSrcweir         InitClipPtrs(pSourceDoc);
593cdf0e10cSrcweir 
594cdf0e10cSrcweir         pTab[nTab] = new ScTable(this, nTab,
595cdf0e10cSrcweir                             String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("baeh")));
596cdf0e10cSrcweir         if (pSourceDoc->pTab[nTab])
597cdf0e10cSrcweir             pTab[nTab]->SetLayoutRTL( pSourceDoc->pTab[nTab]->IsLayoutRTL() );
598cdf0e10cSrcweir         nMaxTableNumber = nTab+1;
599cdf0e10cSrcweir     }
600cdf0e10cSrcweir     else
601cdf0e10cSrcweir     {
602cdf0e10cSrcweir         DBG_ERROR("ResetClip");
603cdf0e10cSrcweir     }
604cdf0e10cSrcweir }
605cdf0e10cSrcweir 
DeleteNumberFormat(const sal_uInt32 *,sal_uInt32)606cdf0e10cSrcweir void ScDocument::DeleteNumberFormat( const sal_uInt32* /* pDelKeys */, sal_uInt32 /* nCount */ )
607cdf0e10cSrcweir {
608cdf0e10cSrcweir /*
609cdf0e10cSrcweir     for (sal_uLong i = 0; i < nCount; i++)
610cdf0e10cSrcweir         xPoolHelper->GetFormTable()->DeleteEntry(pDelKeys[i]);
611cdf0e10cSrcweir */
612cdf0e10cSrcweir }
613cdf0e10cSrcweir 
PutCell(SCCOL nCol,SCROW nRow,SCTAB nTab,ScBaseCell * pCell,sal_uLong nFormatIndex,sal_Bool bForceTab)614cdf0e10cSrcweir void ScDocument::PutCell( SCCOL nCol, SCROW nRow, SCTAB nTab,
615cdf0e10cSrcweir                           ScBaseCell* pCell, sal_uLong nFormatIndex, sal_Bool bForceTab )
616cdf0e10cSrcweir {
617cdf0e10cSrcweir     if (VALIDTAB(nTab))
618cdf0e10cSrcweir     {
619cdf0e10cSrcweir         if ( bForceTab && !pTab[nTab] )
620cdf0e10cSrcweir         {
621cdf0e10cSrcweir             sal_Bool bExtras = !bIsUndo;        // Spaltenbreiten, Zeilenhoehen, Flags
622cdf0e10cSrcweir 
623cdf0e10cSrcweir             pTab[nTab] = new ScTable(this, nTab,
624cdf0e10cSrcweir                                 String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("temp")),
625cdf0e10cSrcweir                                 bExtras, bExtras);
626cdf0e10cSrcweir         }
627cdf0e10cSrcweir 
628cdf0e10cSrcweir         if (pTab[nTab])
629cdf0e10cSrcweir             pTab[nTab]->PutCell( nCol, nRow, nFormatIndex, pCell );
630cdf0e10cSrcweir     }
631cdf0e10cSrcweir }
632cdf0e10cSrcweir 
633cdf0e10cSrcweir //UNUSED2009-05 void ScDocument::PutCell( const ScAddress& rPos, ScBaseCell* pCell,
634cdf0e10cSrcweir //UNUSED2009-05                             sal_uLong nFormatIndex, sal_Bool bForceTab )
635cdf0e10cSrcweir //UNUSED2009-05 {
636cdf0e10cSrcweir //UNUSED2009-05     SCTAB nTab = rPos.Tab();
637cdf0e10cSrcweir //UNUSED2009-05     if ( bForceTab && !pTab[nTab] )
638cdf0e10cSrcweir //UNUSED2009-05     {
639cdf0e10cSrcweir //UNUSED2009-05         sal_Bool bExtras = !bIsUndo;        // Spaltenbreiten, Zeilenhoehen, Flags
640cdf0e10cSrcweir //UNUSED2009-05
641cdf0e10cSrcweir //UNUSED2009-05         pTab[nTab] = new ScTable(this, nTab,
642cdf0e10cSrcweir //UNUSED2009-05                             String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("temp")),
643cdf0e10cSrcweir //UNUSED2009-05                             bExtras, bExtras);
644cdf0e10cSrcweir //UNUSED2009-05     }
645cdf0e10cSrcweir //UNUSED2009-05
646cdf0e10cSrcweir //UNUSED2009-05     if (pTab[nTab])
647cdf0e10cSrcweir //UNUSED2009-05         pTab[nTab]->PutCell( rPos, nFormatIndex, pCell );
648cdf0e10cSrcweir //UNUSED2009-05 }
649cdf0e10cSrcweir 
GetPrintArea(SCTAB nTab,SCCOL & rEndCol,SCROW & rEndRow,sal_Bool bNotes) const650cdf0e10cSrcweir sal_Bool ScDocument::GetPrintArea( SCTAB nTab, SCCOL& rEndCol, SCROW& rEndRow,
651cdf0e10cSrcweir                                 sal_Bool bNotes ) const
652cdf0e10cSrcweir {
653cdf0e10cSrcweir     if (ValidTab(nTab) && pTab[nTab])
654cdf0e10cSrcweir     {
655cdf0e10cSrcweir         sal_Bool bAny = pTab[nTab]->GetPrintArea( rEndCol, rEndRow, bNotes );
656cdf0e10cSrcweir         if (pDrawLayer)
657cdf0e10cSrcweir         {
658cdf0e10cSrcweir             ScRange aDrawRange(0,0,nTab, MAXCOL,MAXROW,nTab);
659cdf0e10cSrcweir             if (DrawGetPrintArea( aDrawRange, sal_True, sal_True ))
660cdf0e10cSrcweir             {
661cdf0e10cSrcweir                 if (aDrawRange.aEnd.Col()>rEndCol) rEndCol=aDrawRange.aEnd.Col();
662cdf0e10cSrcweir                 if (aDrawRange.aEnd.Row()>rEndRow) rEndRow=aDrawRange.aEnd.Row();
663cdf0e10cSrcweir                 bAny = sal_True;
664cdf0e10cSrcweir             }
665cdf0e10cSrcweir         }
666cdf0e10cSrcweir         return bAny;
667cdf0e10cSrcweir     }
668cdf0e10cSrcweir 
669cdf0e10cSrcweir     rEndCol = 0;
670cdf0e10cSrcweir     rEndRow = 0;
671cdf0e10cSrcweir     return sal_False;
672cdf0e10cSrcweir }
673cdf0e10cSrcweir 
GetPrintAreaHor(SCTAB nTab,SCROW nStartRow,SCROW nEndRow,SCCOL & rEndCol,sal_Bool bNotes) const674cdf0e10cSrcweir sal_Bool ScDocument::GetPrintAreaHor( SCTAB nTab, SCROW nStartRow, SCROW nEndRow,
675cdf0e10cSrcweir                                         SCCOL& rEndCol, sal_Bool bNotes ) const
676cdf0e10cSrcweir {
677cdf0e10cSrcweir     if (ValidTab(nTab) && pTab[nTab])
678cdf0e10cSrcweir     {
679cdf0e10cSrcweir         sal_Bool bAny = pTab[nTab]->GetPrintAreaHor( nStartRow, nEndRow, rEndCol, bNotes );
680cdf0e10cSrcweir         if (pDrawLayer)
681cdf0e10cSrcweir         {
682cdf0e10cSrcweir             ScRange aDrawRange(0,nStartRow,nTab, MAXCOL,nEndRow,nTab);
683cdf0e10cSrcweir             if (DrawGetPrintArea( aDrawRange, sal_True, sal_False ))
684cdf0e10cSrcweir             {
685cdf0e10cSrcweir                 if (aDrawRange.aEnd.Col()>rEndCol) rEndCol=aDrawRange.aEnd.Col();
686cdf0e10cSrcweir                 bAny = sal_True;
687cdf0e10cSrcweir             }
688cdf0e10cSrcweir         }
689cdf0e10cSrcweir         return bAny;
690cdf0e10cSrcweir     }
691cdf0e10cSrcweir 
692cdf0e10cSrcweir     rEndCol = 0;
693cdf0e10cSrcweir     return sal_False;
694cdf0e10cSrcweir }
695cdf0e10cSrcweir 
GetPrintAreaVer(SCTAB nTab,SCCOL nStartCol,SCCOL nEndCol,SCROW & rEndRow,sal_Bool bNotes) const696cdf0e10cSrcweir sal_Bool ScDocument::GetPrintAreaVer( SCTAB nTab, SCCOL nStartCol, SCCOL nEndCol,
697cdf0e10cSrcweir                                         SCROW& rEndRow, sal_Bool bNotes ) const
698cdf0e10cSrcweir {
699cdf0e10cSrcweir     if (ValidTab(nTab) && pTab[nTab])
700cdf0e10cSrcweir     {
701cdf0e10cSrcweir         sal_Bool bAny = pTab[nTab]->GetPrintAreaVer( nStartCol, nEndCol, rEndRow, bNotes );
702cdf0e10cSrcweir         if (pDrawLayer)
703cdf0e10cSrcweir         {
704cdf0e10cSrcweir             ScRange aDrawRange(nStartCol,0,nTab, nEndCol,MAXROW,nTab);
705cdf0e10cSrcweir             if (DrawGetPrintArea( aDrawRange, sal_False, sal_True ))
706cdf0e10cSrcweir             {
707cdf0e10cSrcweir                 if (aDrawRange.aEnd.Row()>rEndRow) rEndRow=aDrawRange.aEnd.Row();
708cdf0e10cSrcweir                 bAny = sal_True;
709cdf0e10cSrcweir             }
710cdf0e10cSrcweir         }
711cdf0e10cSrcweir         return bAny;
712cdf0e10cSrcweir     }
713cdf0e10cSrcweir 
714cdf0e10cSrcweir     rEndRow = 0;
715cdf0e10cSrcweir     return sal_False;
716cdf0e10cSrcweir }
717cdf0e10cSrcweir 
GetDataStart(SCTAB nTab,SCCOL & rStartCol,SCROW & rStartRow) const718cdf0e10cSrcweir sal_Bool ScDocument::GetDataStart( SCTAB nTab, SCCOL& rStartCol, SCROW& rStartRow ) const
719cdf0e10cSrcweir {
720cdf0e10cSrcweir     if (ValidTab(nTab) && pTab[nTab])
721cdf0e10cSrcweir     {
722cdf0e10cSrcweir         sal_Bool bAny = pTab[nTab]->GetDataStart( rStartCol, rStartRow );
723cdf0e10cSrcweir         if (pDrawLayer)
724cdf0e10cSrcweir         {
725cdf0e10cSrcweir             ScRange aDrawRange(0,0,nTab, MAXCOL,MAXROW,nTab);
726cdf0e10cSrcweir             if (DrawGetPrintArea( aDrawRange, sal_True, sal_True ))
727cdf0e10cSrcweir             {
728cdf0e10cSrcweir                 if (aDrawRange.aStart.Col()<rStartCol) rStartCol=aDrawRange.aStart.Col();
729cdf0e10cSrcweir                 if (aDrawRange.aStart.Row()<rStartRow) rStartRow=aDrawRange.aStart.Row();
730cdf0e10cSrcweir                 bAny = sal_True;
731cdf0e10cSrcweir             }
732cdf0e10cSrcweir         }
733cdf0e10cSrcweir         return bAny;
734cdf0e10cSrcweir     }
735cdf0e10cSrcweir 
736cdf0e10cSrcweir     rStartCol = 0;
737cdf0e10cSrcweir     rStartRow = 0;
738cdf0e10cSrcweir     return sal_False;
739cdf0e10cSrcweir }
740cdf0e10cSrcweir 
MoveTab(SCTAB nOldPos,SCTAB nNewPos)741cdf0e10cSrcweir sal_Bool ScDocument::MoveTab( SCTAB nOldPos, SCTAB nNewPos )
742cdf0e10cSrcweir {
743cdf0e10cSrcweir     if (nOldPos == nNewPos) return sal_False;
744cdf0e10cSrcweir     sal_Bool bValid = sal_False;
745cdf0e10cSrcweir     if (VALIDTAB(nOldPos))
746cdf0e10cSrcweir     {
747cdf0e10cSrcweir         if (pTab[nOldPos])
748cdf0e10cSrcweir         {
749cdf0e10cSrcweir             SCTAB nTabCount = GetTableCount();
750cdf0e10cSrcweir             if (nTabCount > 1)
751cdf0e10cSrcweir             {
752cdf0e10cSrcweir                 sal_Bool bOldAutoCalc = GetAutoCalc();
753cdf0e10cSrcweir                 SetAutoCalc( sal_False );   // Mehrfachberechnungen vermeiden
754cdf0e10cSrcweir                 SetNoListening( sal_True );
755cdf0e10cSrcweir                 ScProgress* pProgress = new ScProgress( GetDocumentShell(),
756cdf0e10cSrcweir                     ScGlobal::GetRscString(STR_UNDO_MOVE_TAB), GetCodeCount() );
757cdf0e10cSrcweir                 if (nNewPos == SC_TAB_APPEND)
758cdf0e10cSrcweir                     nNewPos = nTabCount-1;
759cdf0e10cSrcweir 
760cdf0e10cSrcweir                 //  Referenz-Updaterei
761cdf0e10cSrcweir                 //! mit UpdateReference zusammenfassen!
762cdf0e10cSrcweir 
763cdf0e10cSrcweir                 SCsTAB nDz = ((SCsTAB)nNewPos) - (SCsTAB)nOldPos;
764cdf0e10cSrcweir                 ScRange aSourceRange( 0,0,nOldPos, MAXCOL,MAXROW,nOldPos );
765cdf0e10cSrcweir                 pRangeName->UpdateTabRef(nOldPos, 3, nNewPos);
766cdf0e10cSrcweir                 pDBCollection->UpdateMoveTab( nOldPos, nNewPos );
767cdf0e10cSrcweir                 xColNameRanges->UpdateReference( URM_REORDER, this, aSourceRange, 0,0,nDz );
768cdf0e10cSrcweir                 xRowNameRanges->UpdateReference( URM_REORDER, this, aSourceRange, 0,0,nDz );
769cdf0e10cSrcweir                 if (pDPCollection)
770cdf0e10cSrcweir                     pDPCollection->UpdateReference( URM_REORDER, aSourceRange, 0,0,nDz );
771cdf0e10cSrcweir                 if (pDetOpList)
772cdf0e10cSrcweir                     pDetOpList->UpdateReference( this, URM_REORDER, aSourceRange, 0,0,nDz );
773cdf0e10cSrcweir                 UpdateChartRef( URM_REORDER,
774cdf0e10cSrcweir                                     0,0,nOldPos, MAXCOL,MAXROW,nOldPos, 0,0,nDz );
775cdf0e10cSrcweir                 UpdateRefAreaLinks( URM_REORDER, aSourceRange, 0,0,nDz );
776cdf0e10cSrcweir                 if ( pCondFormList )
777cdf0e10cSrcweir                     pCondFormList->UpdateMoveTab( nOldPos, nNewPos );
778cdf0e10cSrcweir                 if ( pValidationList )
779cdf0e10cSrcweir                     pValidationList->UpdateMoveTab( nOldPos, nNewPos );
780cdf0e10cSrcweir                 if ( pUnoBroadcaster )
781cdf0e10cSrcweir                     pUnoBroadcaster->Broadcast( ScUpdateRefHint( URM_REORDER,
782cdf0e10cSrcweir                                     aSourceRange, 0,0,nDz ) );
783cdf0e10cSrcweir 
784cdf0e10cSrcweir                 ScTable* pSaveTab = pTab[nOldPos];
785cdf0e10cSrcweir                 SCTAB i;
786cdf0e10cSrcweir                 for (i = nOldPos + 1; i < nTabCount; i++)
787cdf0e10cSrcweir                     pTab[i - 1] = pTab[i];
788cdf0e10cSrcweir                 pTab[i-1] = NULL;
789cdf0e10cSrcweir                 for (i = nTabCount - 1; i > nNewPos; i--)
790cdf0e10cSrcweir                     pTab[i] = pTab[i - 1];
791cdf0e10cSrcweir                 pTab[nNewPos] = pSaveTab;
792cdf0e10cSrcweir                 for (i = 0; i <= MAXTAB; i++)
793cdf0e10cSrcweir                     if (pTab[i])
794cdf0e10cSrcweir                         pTab[i]->UpdateMoveTab( nOldPos, nNewPos, i, *pProgress );
795cdf0e10cSrcweir                 delete pProgress;   // freimachen fuer evtl. andere
796cdf0e10cSrcweir                 for (i = 0; i <= MAXTAB; i++)
797cdf0e10cSrcweir                     if (pTab[i])
798cdf0e10cSrcweir                         pTab[i]->UpdateCompile();
799cdf0e10cSrcweir                 SetNoListening( sal_False );
800cdf0e10cSrcweir                 for (i = 0; i <= MAXTAB; i++)
801cdf0e10cSrcweir                     if (pTab[i])
802cdf0e10cSrcweir                         pTab[i]->StartAllListeners();
803cdf0e10cSrcweir                 // #81844# sheet names of references may not be valid until sheet is moved
804cdf0e10cSrcweir                 pChartListenerCollection->UpdateScheduledSeriesRanges();
805cdf0e10cSrcweir                 SetDirty();
806cdf0e10cSrcweir                 SetAutoCalc( bOldAutoCalc );
807cdf0e10cSrcweir 
808cdf0e10cSrcweir                 if (pDrawLayer)
809cdf0e10cSrcweir                     DrawMovePage( static_cast<sal_uInt16>(nOldPos), static_cast<sal_uInt16>(nNewPos) );
810cdf0e10cSrcweir 
811cdf0e10cSrcweir                 bValid = sal_True;
812cdf0e10cSrcweir             }
813cdf0e10cSrcweir         }
814cdf0e10cSrcweir     }
815cdf0e10cSrcweir     return bValid;
816cdf0e10cSrcweir }
817cdf0e10cSrcweir 
CopyTab(SCTAB nOldPos,SCTAB nNewPos,const ScMarkData * pOnlyMarked)818cdf0e10cSrcweir sal_Bool ScDocument::CopyTab( SCTAB nOldPos, SCTAB nNewPos, const ScMarkData* pOnlyMarked )
819cdf0e10cSrcweir {
820cdf0e10cSrcweir     if (SC_TAB_APPEND == nNewPos ) nNewPos = nMaxTableNumber;
821cdf0e10cSrcweir     String aName;
822cdf0e10cSrcweir     GetName(nOldPos, aName);
823cdf0e10cSrcweir 
824cdf0e10cSrcweir     //  vorneweg testen, ob der Prefix als gueltig erkannt wird
825cdf0e10cSrcweir     //  wenn nicht, nur doppelte vermeiden
826cdf0e10cSrcweir     sal_Bool bPrefix = ValidTabName( aName );
827cdf0e10cSrcweir     DBG_ASSERT(bPrefix, "ungueltiger Tabellenname");
828cdf0e10cSrcweir     SCTAB nDummy;
829cdf0e10cSrcweir 
830cdf0e10cSrcweir     CreateValidTabName(aName);
831cdf0e10cSrcweir 
832cdf0e10cSrcweir     sal_Bool bValid;
833cdf0e10cSrcweir     if (bPrefix)
834cdf0e10cSrcweir         bValid = ( ValidNewTabName(aName) && (nMaxTableNumber <= MAXTAB) );
835cdf0e10cSrcweir     else
836cdf0e10cSrcweir         bValid = ( !GetTable( aName, nDummy ) && (nMaxTableNumber <= MAXTAB) );
837cdf0e10cSrcweir 
838cdf0e10cSrcweir     sal_Bool bOldAutoCalc = GetAutoCalc();
839cdf0e10cSrcweir     SetAutoCalc( sal_False );   // Mehrfachberechnungen vermeiden
840cdf0e10cSrcweir     if (bValid)
841cdf0e10cSrcweir     {
842cdf0e10cSrcweir         if (nNewPos == nMaxTableNumber)
843cdf0e10cSrcweir         {
844cdf0e10cSrcweir             pTab[nMaxTableNumber] = new ScTable(this, nMaxTableNumber, aName);
845dffa72deSWang Lei             pRangeName->UpdateTabRef(nNewPos, 4, nOldPos);//. 4 - copy table
846cdf0e10cSrcweir             ++nMaxTableNumber;
847cdf0e10cSrcweir         }
848cdf0e10cSrcweir         else
849cdf0e10cSrcweir         {
850cdf0e10cSrcweir             if (VALIDTAB(nNewPos) && (nNewPos < nMaxTableNumber))
851cdf0e10cSrcweir             {
852cdf0e10cSrcweir                 SetNoListening( sal_True );
853cdf0e10cSrcweir 
854cdf0e10cSrcweir                 ScRange aRange( 0,0,nNewPos, MAXCOL,MAXROW,MAXTAB );
855cdf0e10cSrcweir                 xColNameRanges->UpdateReference( URM_INSDEL, this, aRange, 0,0,1 );
856cdf0e10cSrcweir                 xRowNameRanges->UpdateReference( URM_INSDEL, this, aRange, 0,0,1 );
857dffa72deSWang Lei                 pRangeName->UpdateTabRef(nNewPos, 4, nOldPos);//  4 - copy table
858cdf0e10cSrcweir                 pDBCollection->UpdateReference(
859cdf0e10cSrcweir                                     URM_INSDEL, 0,0,nNewPos, MAXCOL,MAXROW,MAXTAB, 0,0,1 );
860cdf0e10cSrcweir                 if (pDPCollection)
861cdf0e10cSrcweir                     pDPCollection->UpdateReference( URM_INSDEL, aRange, 0,0,1 );
862cdf0e10cSrcweir                 if (pDetOpList)
863cdf0e10cSrcweir                     pDetOpList->UpdateReference( this, URM_INSDEL, aRange, 0,0,1 );
864cdf0e10cSrcweir                 UpdateChartRef( URM_INSDEL, 0,0,nNewPos, MAXCOL,MAXROW,MAXTAB, 0,0,1 );
865cdf0e10cSrcweir                 UpdateRefAreaLinks( URM_INSDEL, aRange, 0,0,1 );
866cdf0e10cSrcweir                 if ( pUnoBroadcaster )
867cdf0e10cSrcweir                     pUnoBroadcaster->Broadcast( ScUpdateRefHint( URM_INSDEL, aRange, 0,0,1 ) );
868cdf0e10cSrcweir 
869cdf0e10cSrcweir                 SCTAB i;
870cdf0e10cSrcweir                 for (i = 0; i <= MAXTAB; i++)
871cdf0e10cSrcweir                     if (pTab[i] && i != nOldPos)
872cdf0e10cSrcweir                         pTab[i]->UpdateInsertTab(nNewPos);
873cdf0e10cSrcweir                 for (i = nMaxTableNumber; i > nNewPos; i--)
874cdf0e10cSrcweir                     pTab[i] = pTab[i - 1];
875cdf0e10cSrcweir                 if (nNewPos <= nOldPos)
876cdf0e10cSrcweir                     nOldPos++;
877cdf0e10cSrcweir                 pTab[nNewPos] = new ScTable(this, nNewPos, aName);
878cdf0e10cSrcweir                 ++nMaxTableNumber;
879cdf0e10cSrcweir                 bValid = sal_True;
880cdf0e10cSrcweir                 for (i = 0; i <= MAXTAB; i++)
881cdf0e10cSrcweir                     if (pTab[i] && i != nOldPos && i != nNewPos)
882cdf0e10cSrcweir                         pTab[i]->UpdateCompile();
883cdf0e10cSrcweir                 SetNoListening( sal_False );
884cdf0e10cSrcweir                 for (i = 0; i <= MAXTAB; i++)
885cdf0e10cSrcweir                     if (pTab[i] && i != nOldPos && i != nNewPos)
886cdf0e10cSrcweir                         pTab[i]->StartAllListeners();
887cdf0e10cSrcweir 
888cdf0e10cSrcweir                 //  update conditional formats after table is inserted
889cdf0e10cSrcweir                 if ( pCondFormList )
890cdf0e10cSrcweir                     pCondFormList->UpdateReference( URM_INSDEL, aRange, 0,0,1 );
891cdf0e10cSrcweir                 if ( pValidationList )
892cdf0e10cSrcweir                     pValidationList->UpdateReference( URM_INSDEL, aRange, 0,0,1 );
893cdf0e10cSrcweir                 // #81844# sheet names of references may not be valid until sheet is copied
894cdf0e10cSrcweir                 pChartListenerCollection->UpdateScheduledSeriesRanges();
895cdf0e10cSrcweir             }
896cdf0e10cSrcweir             else
897cdf0e10cSrcweir                 bValid = sal_False;
898cdf0e10cSrcweir         }
899cdf0e10cSrcweir     }
900cdf0e10cSrcweir     if (bValid)
901cdf0e10cSrcweir     {
902cdf0e10cSrcweir         SetNoListening( sal_True );     // noch nicht bei CopyToTable/Insert
903cdf0e10cSrcweir         pTab[nOldPos]->CopyToTable(0, 0, MAXCOL, MAXROW, IDF_ALL, (pOnlyMarked != NULL),
904cdf0e10cSrcweir                                         pTab[nNewPos], pOnlyMarked );
905cdf0e10cSrcweir         pTab[nNewPos]->SetTabBgColor(pTab[nOldPos]->GetTabBgColor());
906cdf0e10cSrcweir 
907cdf0e10cSrcweir         SCsTAB nDz;
908cdf0e10cSrcweir /*      if (nNewPos < nOldPos)
909cdf0e10cSrcweir             nDz = ((short)nNewPos) - (short)nOldPos + 1;
910cdf0e10cSrcweir         else
911cdf0e10cSrcweir */          nDz = ((short)nNewPos) - (short)nOldPos;
912cdf0e10cSrcweir         pTab[nNewPos]->UpdateReference(URM_COPY, 0, 0, nNewPos , MAXCOL, MAXROW,
913cdf0e10cSrcweir                                         nNewPos, 0, 0, nDz, NULL);
914cdf0e10cSrcweir 
915cdf0e10cSrcweir         pTab[nNewPos]->UpdateInsertTabAbs(nNewPos); // alle abs. um eins hoch!!
916cdf0e10cSrcweir         pTab[nOldPos]->UpdateInsertTab(nNewPos);
917cdf0e10cSrcweir 
918cdf0e10cSrcweir         pTab[nOldPos]->UpdateCompile();
919cdf0e10cSrcweir         pTab[nNewPos]->UpdateCompile( sal_True );   // #67996# maybe already compiled in Clone, but used names need recompilation
920cdf0e10cSrcweir         SetNoListening( sal_False );
921cdf0e10cSrcweir         pTab[nOldPos]->StartAllListeners();
922cdf0e10cSrcweir         pTab[nNewPos]->StartAllListeners();
923cdf0e10cSrcweir         SetDirty();
924cdf0e10cSrcweir         SetAutoCalc( bOldAutoCalc );
925cdf0e10cSrcweir 
926cdf0e10cSrcweir         if (pDrawLayer)
927cdf0e10cSrcweir             DrawCopyPage( static_cast<sal_uInt16>(nOldPos), static_cast<sal_uInt16>(nNewPos) );
928cdf0e10cSrcweir 
929cdf0e10cSrcweir         pTab[nNewPos]->SetPageStyle( pTab[nOldPos]->GetPageStyle() );
930cdf0e10cSrcweir         pTab[nNewPos]->SetPendingRowHeights( pTab[nOldPos]->IsPendingRowHeights() );
931cdf0e10cSrcweir     }
932cdf0e10cSrcweir     else
933cdf0e10cSrcweir         SetAutoCalc( bOldAutoCalc );
934cdf0e10cSrcweir     return bValid;
935cdf0e10cSrcweir }
936cdf0e10cSrcweir 
937cdf0e10cSrcweir void VBA_InsertModule( ScDocument& rDoc, SCTAB nTab, String& sModuleName, String& sModuleSource );
938cdf0e10cSrcweir 
TransferTab(ScDocument * pSrcDoc,SCTAB nSrcPos,SCTAB nDestPos,sal_Bool bInsertNew,sal_Bool bResultsOnly)939cdf0e10cSrcweir sal_uLong ScDocument::TransferTab( ScDocument* pSrcDoc, SCTAB nSrcPos,
940cdf0e10cSrcweir                                 SCTAB nDestPos, sal_Bool bInsertNew,
941cdf0e10cSrcweir                                 sal_Bool bResultsOnly )
942cdf0e10cSrcweir {
943cdf0e10cSrcweir     sal_uLong nRetVal = 1;                      // 0 => Fehler 1 = ok
944cdf0e10cSrcweir                                             // 2 => RefBox, 3 => NameBox
945cdf0e10cSrcweir                                             // 4 => beides
946cdf0e10cSrcweir     sal_Bool bValid = sal_True;
947cdf0e10cSrcweir     if (bInsertNew)             // neu einfuegen
948cdf0e10cSrcweir     {
949cdf0e10cSrcweir         String aName;
950cdf0e10cSrcweir         pSrcDoc->GetName(nSrcPos, aName);
951cdf0e10cSrcweir         CreateValidTabName(aName);
952cdf0e10cSrcweir         bValid = InsertTab(nDestPos, aName);
953cdf0e10cSrcweir     }
954cdf0e10cSrcweir     else                        // bestehende Tabelle ersetzen
955cdf0e10cSrcweir     {
956cdf0e10cSrcweir         if (VALIDTAB(nDestPos) && pTab[nDestPos])
957cdf0e10cSrcweir         {
958cdf0e10cSrcweir             pTab[nDestPos]->DeleteArea( 0,0, MAXCOL,MAXROW, IDF_ALL );
959cdf0e10cSrcweir         }
960cdf0e10cSrcweir         else
961cdf0e10cSrcweir             bValid = sal_False;
962cdf0e10cSrcweir     }
963cdf0e10cSrcweir 
964cdf0e10cSrcweir     if (bValid)
965cdf0e10cSrcweir     {
966cdf0e10cSrcweir         sal_Bool bOldAutoCalcSrc = sal_False;
967cdf0e10cSrcweir         sal_Bool bOldAutoCalc = GetAutoCalc();
968cdf0e10cSrcweir         SetAutoCalc( sal_False );   // Mehrfachberechnungen vermeiden
969cdf0e10cSrcweir         SetNoListening( sal_True );
970cdf0e10cSrcweir         if ( bResultsOnly )
971cdf0e10cSrcweir         {
972cdf0e10cSrcweir             bOldAutoCalcSrc = pSrcDoc->GetAutoCalc();
973cdf0e10cSrcweir             pSrcDoc->SetAutoCalc( sal_True );   // falls was berechnet werden muss
974cdf0e10cSrcweir         }
975cdf0e10cSrcweir 
976cdf0e10cSrcweir         {
977cdf0e10cSrcweir             NumFmtMergeHandler aNumFmtMergeHdl(this, pSrcDoc);
978cdf0e10cSrcweir 
979cdf0e10cSrcweir             nDestPos = Min(nDestPos, (SCTAB)(GetTableCount() - 1));
980cdf0e10cSrcweir             {   // scope for bulk broadcast
981cdf0e10cSrcweir                 ScBulkBroadcast aBulkBroadcast( pBASM);
982cdf0e10cSrcweir                 pSrcDoc->pTab[nSrcPos]->CopyToTable(0, 0, MAXCOL, MAXROW,
983cdf0e10cSrcweir                         ( bResultsOnly ? IDF_ALL & ~IDF_FORMULA : IDF_ALL),
984cdf0e10cSrcweir                         sal_False, pTab[nDestPos] );
985cdf0e10cSrcweir             }
986cdf0e10cSrcweir         }
987045bbc1cSAriel Constenla-Haile 
988cdf0e10cSrcweir         pTab[nDestPos]->SetTabNo(nDestPos);
989045bbc1cSAriel Constenla-Haile         pTab[nDestPos]->SetTabBgColor(pSrcDoc->pTab[nSrcPos]->GetTabBgColor());
990cdf0e10cSrcweir 
991cdf0e10cSrcweir         if ( !bResultsOnly )
992cdf0e10cSrcweir         {
993cdf0e10cSrcweir             sal_Bool bNamesLost = sal_False;
994cdf0e10cSrcweir             sal_uInt16 nSrcRangeNames = pSrcDoc->pRangeName->GetCount();
995cdf0e10cSrcweir             // array containing range names which might need update of indices
996cdf0e10cSrcweir             ScRangeData** pSrcRangeNames = nSrcRangeNames ? new ScRangeData* [nSrcRangeNames] : NULL;
997cdf0e10cSrcweir             // the index mapping thereof
998cdf0e10cSrcweir             ScRangeData::IndexMap aSrcRangeMap;
999cdf0e10cSrcweir             sal_Bool bRangeNameReplace = sal_False;
1000cdf0e10cSrcweir 
1001cdf0e10cSrcweir             // find named ranges that are used in the source sheet
1002cdf0e10cSrcweir             std::set<sal_uInt16> aUsedNames;
1003cdf0e10cSrcweir             pSrcDoc->pTab[nSrcPos]->FindRangeNamesInUse( 0, 0, MAXCOL, MAXROW, aUsedNames );
1004cdf0e10cSrcweir 
1005cdf0e10cSrcweir             for (sal_uInt16 i = 0; i < nSrcRangeNames; i++)     //! DB-Bereiche Pivot-Bereiche auch !!!
1006cdf0e10cSrcweir             {
1007cdf0e10cSrcweir                 ScRangeData* pSrcData = (*pSrcDoc->pRangeName)[i];
1008cdf0e10cSrcweir                 sal_uInt16 nOldIndex = pSrcData->GetIndex();
1009cdf0e10cSrcweir                 bool bInUse = ( aUsedNames.find(nOldIndex) != aUsedNames.end() );
1010cdf0e10cSrcweir                 if (bInUse)
1011cdf0e10cSrcweir                 {
1012cdf0e10cSrcweir                     sal_uInt16 nExisting = 0;
1013cdf0e10cSrcweir                     if ( pRangeName->SearchName( pSrcData->GetName(), nExisting ) )
1014cdf0e10cSrcweir                     {
1015cdf0e10cSrcweir                         // the name exists already in the destination document
1016cdf0e10cSrcweir                         // -> use the existing name, but show a warning
1017cdf0e10cSrcweir                         // (when refreshing links, the existing name is used and the warning not shown)
1018cdf0e10cSrcweir 
1019cdf0e10cSrcweir                         ScRangeData* pExistingData = (*pRangeName)[nExisting];
1020cdf0e10cSrcweir                         sal_uInt16 nExistingIndex = pExistingData->GetIndex();
1021cdf0e10cSrcweir 
1022cdf0e10cSrcweir                         pSrcRangeNames[i] = NULL;       // don't modify the named range
1023cdf0e10cSrcweir                         aSrcRangeMap.insert(
1024cdf0e10cSrcweir                             ScRangeData::IndexMap::value_type(nOldIndex, nExistingIndex));
1025cdf0e10cSrcweir                         bRangeNameReplace = sal_True;
1026cdf0e10cSrcweir                         bNamesLost = sal_True;
1027cdf0e10cSrcweir                     }
1028cdf0e10cSrcweir                     else
1029cdf0e10cSrcweir                     {
1030cdf0e10cSrcweir                         ScRangeData* pData = new ScRangeData( *pSrcData );
1031cdf0e10cSrcweir                         pData->SetDocument(this);
1032cdf0e10cSrcweir                         if ( pRangeName->FindIndex( pData->GetIndex() ) )
1033cdf0e10cSrcweir                             pData->SetIndex(0);     // need new index, done in Insert
1034cdf0e10cSrcweir                         if (!pRangeName->Insert(pData))
1035cdf0e10cSrcweir                         {
1036cdf0e10cSrcweir                             DBG_ERROR("can't insert name");     // shouldn't happen
1037cdf0e10cSrcweir                             delete pData;
1038cdf0e10cSrcweir                         }
1039cdf0e10cSrcweir                         else
1040cdf0e10cSrcweir                         {
1041cdf0e10cSrcweir                             pData->TransferTabRef( nSrcPos, nDestPos );
1042cdf0e10cSrcweir                             pSrcRangeNames[i] = pData;
1043cdf0e10cSrcweir                             sal_uInt16 nNewIndex = pData->GetIndex();
1044cdf0e10cSrcweir                             aSrcRangeMap.insert(
1045cdf0e10cSrcweir                                 ScRangeData::IndexMap::value_type(nOldIndex, nNewIndex));
1046cdf0e10cSrcweir                             if ( !bRangeNameReplace )
1047cdf0e10cSrcweir                                 bRangeNameReplace = ( nOldIndex != nNewIndex );
1048cdf0e10cSrcweir                         }
1049cdf0e10cSrcweir                     }
1050cdf0e10cSrcweir                 }
1051cdf0e10cSrcweir                 else
1052cdf0e10cSrcweir                 {
1053cdf0e10cSrcweir                     pSrcRangeNames[i] = NULL;
1054cdf0e10cSrcweir                     //aSrcRangeMap.SetPair( i, 0, 0 );      // not needed, defaulted
1055cdf0e10cSrcweir                 }
1056cdf0e10cSrcweir             }
1057cdf0e10cSrcweir             if ( bRangeNameReplace )
1058cdf0e10cSrcweir             {
1059cdf0e10cSrcweir                 // first update all inserted named formulas if they contain other
1060cdf0e10cSrcweir                 // range names and used indices changed
1061cdf0e10cSrcweir                 for (sal_uInt16 i = 0; i < nSrcRangeNames; i++)     //! DB-Bereiche Pivot-Bereiche auch
1062cdf0e10cSrcweir                 {
1063cdf0e10cSrcweir                     if ( pSrcRangeNames[i] )
1064cdf0e10cSrcweir                         pSrcRangeNames[i]->ReplaceRangeNamesInUse( aSrcRangeMap );
1065cdf0e10cSrcweir                 }
1066cdf0e10cSrcweir                 // then update the formulas, they might need the just updated range names
1067cdf0e10cSrcweir                 pTab[nDestPos]->ReplaceRangeNamesInUse( 0, 0, MAXCOL, MAXROW, aSrcRangeMap );
1068cdf0e10cSrcweir             }
1069cdf0e10cSrcweir             if ( pSrcRangeNames )
1070cdf0e10cSrcweir                 delete [] pSrcRangeNames;
1071cdf0e10cSrcweir 
1072cdf0e10cSrcweir             SCsTAB nDz = ((SCsTAB)nDestPos) - (SCsTAB)nSrcPos;
1073cdf0e10cSrcweir             pTab[nDestPos]->UpdateReference(URM_COPY, 0, 0, nDestPos,
1074cdf0e10cSrcweir                                                      MAXCOL, MAXROW, nDestPos,
1075cdf0e10cSrcweir                                                      0, 0, nDz, NULL);
1076cdf0e10cSrcweir             // Test for outside absolute references for info box
1077cdf0e10cSrcweir             sal_Bool bIsAbsRef = pSrcDoc->pTab[nSrcPos]->TestTabRefAbs(nSrcPos);
1078cdf0e10cSrcweir             // Readjust self-contained absolute references to this sheet
1079cdf0e10cSrcweir             pTab[nDestPos]->TestTabRefAbs(nSrcPos);
1080cdf0e10cSrcweir             if (bIsAbsRef)
1081cdf0e10cSrcweir             {
1082cdf0e10cSrcweir                 nRetVal += 1;
1083cdf0e10cSrcweir                     // InfoBox AbsoluteRefs sind moeglicherweise nicht mehr korrekt!!
1084cdf0e10cSrcweir             }
1085cdf0e10cSrcweir             if (bNamesLost)
1086cdf0e10cSrcweir             {
1087cdf0e10cSrcweir                 nRetVal += 2;
1088cdf0e10cSrcweir                 // message: duplicate names
1089cdf0e10cSrcweir             }
1090cdf0e10cSrcweir             pTab[nDestPos]->CompileAll();
1091cdf0e10cSrcweir         }
1092cdf0e10cSrcweir 
1093cdf0e10cSrcweir         SetNoListening( sal_False );
1094cdf0e10cSrcweir         if ( !bResultsOnly )
1095cdf0e10cSrcweir             pTab[nDestPos]->StartAllListeners();
1096cdf0e10cSrcweir         SetDirty( ScRange( 0, 0, nDestPos, MAXCOL, MAXROW, nDestPos));
1097cdf0e10cSrcweir 
1098cdf0e10cSrcweir         if ( bResultsOnly )
1099cdf0e10cSrcweir             pSrcDoc->SetAutoCalc( bOldAutoCalcSrc );
1100cdf0e10cSrcweir         SetAutoCalc( bOldAutoCalc );
1101cdf0e10cSrcweir 
1102cdf0e10cSrcweir         //  Drawing kopieren
1103cdf0e10cSrcweir 
1104cdf0e10cSrcweir         if (bInsertNew)
1105cdf0e10cSrcweir             TransferDrawPage( pSrcDoc, nSrcPos, nDestPos );
1106cdf0e10cSrcweir 
1107cdf0e10cSrcweir         pTab[nDestPos]->SetPendingRowHeights( pSrcDoc->pTab[nSrcPos]->IsPendingRowHeights() );
1108cdf0e10cSrcweir     }
1109cdf0e10cSrcweir     if (!bValid)
1110cdf0e10cSrcweir         nRetVal = 0;
1111cdf0e10cSrcweir     sal_Bool bVbaEnabled = IsInVBAMode();
1112cdf0e10cSrcweir 
1113cdf0e10cSrcweir     if ( bVbaEnabled  )
1114cdf0e10cSrcweir     {
1115cdf0e10cSrcweir         SfxObjectShell* pSrcShell = pSrcDoc ? pSrcDoc->GetDocumentShell() : NULL;
1116cdf0e10cSrcweir         if ( pSrcShell )
1117cdf0e10cSrcweir         {
1118cdf0e10cSrcweir             StarBASIC* pStarBASIC = pSrcShell ? pSrcShell->GetBasic() : NULL;
1119cdf0e10cSrcweir             String aLibName( RTL_CONSTASCII_USTRINGPARAM( "Standard" ) );
1120cdf0e10cSrcweir             if ( pSrcShell && pSrcShell->GetBasicManager()->GetName().Len() > 0 )
1121cdf0e10cSrcweir             {
1122cdf0e10cSrcweir                 aLibName = pSrcShell->GetBasicManager()->GetName();
1123cdf0e10cSrcweir                 pStarBASIC = pSrcShell->GetBasicManager()->GetLib( aLibName );
1124cdf0e10cSrcweir             }
1125cdf0e10cSrcweir 
1126cdf0e10cSrcweir             String sCodeName;
1127cdf0e10cSrcweir             String sSource;
1128cdf0e10cSrcweir             uno::Reference< script::XLibraryContainer > xLibContainer = pSrcShell->GetBasicContainer();
1129cdf0e10cSrcweir             uno::Reference< container::XNameContainer > xLib;
1130cdf0e10cSrcweir             if( xLibContainer.is() )
1131cdf0e10cSrcweir             {
1132cdf0e10cSrcweir                 uno::Any aLibAny = xLibContainer->getByName( aLibName );
1133cdf0e10cSrcweir                 aLibAny >>= xLib;
1134cdf0e10cSrcweir             }
1135cdf0e10cSrcweir 
1136cdf0e10cSrcweir             if( xLib.is() )
1137cdf0e10cSrcweir             {
1138cdf0e10cSrcweir                 String sSrcCodeName;
1139cdf0e10cSrcweir                 pSrcDoc->GetCodeName( nSrcPos, sSrcCodeName );
1140cdf0e10cSrcweir                 rtl::OUString sRTLSource;
1141cdf0e10cSrcweir                 xLib->getByName( sSrcCodeName ) >>= sRTLSource;
1142cdf0e10cSrcweir                 sSource = sRTLSource;
1143cdf0e10cSrcweir             }
1144cdf0e10cSrcweir             VBA_InsertModule( *this, nDestPos, sCodeName, sSource );
1145cdf0e10cSrcweir         }
1146cdf0e10cSrcweir     }
1147cdf0e10cSrcweir 
1148cdf0e10cSrcweir     return nRetVal;
1149cdf0e10cSrcweir }
1150cdf0e10cSrcweir 
1151cdf0e10cSrcweir //  ----------------------------------------------------------------------------
1152cdf0e10cSrcweir 
SetError(SCCOL nCol,SCROW nRow,SCTAB nTab,const sal_uInt16 nError)1153cdf0e10cSrcweir void ScDocument::SetError( SCCOL nCol, SCROW nRow, SCTAB nTab, const sal_uInt16 nError)
1154cdf0e10cSrcweir {
1155cdf0e10cSrcweir     if (VALIDTAB(nTab))
1156cdf0e10cSrcweir         if (pTab[nTab])
1157cdf0e10cSrcweir             pTab[nTab]->SetError( nCol, nRow, nError );
1158cdf0e10cSrcweir }
1159cdf0e10cSrcweir 
EraseNonUsedSharedNames(sal_uInt16 nLevel)1160cdf0e10cSrcweir void ScDocument::EraseNonUsedSharedNames(sal_uInt16 nLevel)
1161cdf0e10cSrcweir {
1162cdf0e10cSrcweir     for (sal_uInt16 i = 0; i < pRangeName->GetCount(); i++)
1163cdf0e10cSrcweir     {
1164cdf0e10cSrcweir         ScRangeData* pRangeData = (*pRangeName)[i];
1165cdf0e10cSrcweir         if (pRangeData && pRangeData->HasType(RT_SHARED))
1166cdf0e10cSrcweir         {
1167cdf0e10cSrcweir             String aName;
1168cdf0e10cSrcweir             pRangeData->GetName(aName);
1169cdf0e10cSrcweir             aName.Erase(0, 6);                      // !!! vgl. Table4, FillFormula !!
1170cdf0e10cSrcweir             sal_uInt16 nInd = (sal_uInt16) aName.ToInt32();
1171cdf0e10cSrcweir             if (nInd <= nLevel)
1172cdf0e10cSrcweir             {
1173cdf0e10cSrcweir                 sal_uInt16 nIndex = pRangeData->GetIndex();
1174cdf0e10cSrcweir                 sal_Bool bInUse = sal_False;
1175cdf0e10cSrcweir                 for (SCTAB j = 0; !bInUse && (j <= MAXTAB); j++)
1176cdf0e10cSrcweir                 {
1177cdf0e10cSrcweir                     if (pTab[j])
1178cdf0e10cSrcweir                         bInUse = pTab[j]->IsRangeNameInUse(0, 0, MAXCOL-1, MAXROW-1,
1179cdf0e10cSrcweir                                                            nIndex);
1180cdf0e10cSrcweir                 }
1181cdf0e10cSrcweir                 if (!bInUse)
1182cdf0e10cSrcweir                     pRangeName->AtFree(i);
1183cdf0e10cSrcweir             }
1184cdf0e10cSrcweir         }
1185cdf0e10cSrcweir     }
1186cdf0e10cSrcweir }
1187cdf0e10cSrcweir 
1188cdf0e10cSrcweir //  ----------------------------------------------------------------------------
1189cdf0e10cSrcweir 
SetConsolidateDlgData(const ScConsolidateParam * pData)1190cdf0e10cSrcweir void ScDocument::SetConsolidateDlgData( const ScConsolidateParam* pData )
1191cdf0e10cSrcweir {
1192cdf0e10cSrcweir     delete pConsolidateDlgData;
1193cdf0e10cSrcweir 
1194cdf0e10cSrcweir     if ( pData )
1195cdf0e10cSrcweir         pConsolidateDlgData = new ScConsolidateParam( *pData );
1196cdf0e10cSrcweir     else
1197cdf0e10cSrcweir         pConsolidateDlgData = NULL;
1198cdf0e10cSrcweir }
1199cdf0e10cSrcweir 
SetChangeViewSettings(const ScChangeViewSettings & rNew)1200cdf0e10cSrcweir void ScDocument::SetChangeViewSettings(const ScChangeViewSettings& rNew)
1201cdf0e10cSrcweir {
1202cdf0e10cSrcweir     if (pChangeViewSettings==NULL)
1203cdf0e10cSrcweir         pChangeViewSettings = new ScChangeViewSettings;
1204cdf0e10cSrcweir 
1205cdf0e10cSrcweir     DBG_ASSERT( pChangeViewSettings, "Oops. No ChangeViewSettings :-( by!" );
1206cdf0e10cSrcweir 
1207cdf0e10cSrcweir     *pChangeViewSettings=rNew;
1208cdf0e10cSrcweir }
1209cdf0e10cSrcweir 
1210cdf0e10cSrcweir //  ----------------------------------------------------------------------------
1211cdf0e10cSrcweir 
CreateFieldEditEngine()1212cdf0e10cSrcweir ScFieldEditEngine* ScDocument::CreateFieldEditEngine()
1213cdf0e10cSrcweir {
1214cdf0e10cSrcweir     ScFieldEditEngine* pNewEditEngine = NULL;
1215cdf0e10cSrcweir     if (!pCacheFieldEditEngine)
1216cdf0e10cSrcweir     {
1217cdf0e10cSrcweir         pNewEditEngine = new ScFieldEditEngine( GetEnginePool(),
1218cdf0e10cSrcweir             GetEditPool(), sal_False );
1219cdf0e10cSrcweir     }
1220cdf0e10cSrcweir     else
1221cdf0e10cSrcweir     {
1222cdf0e10cSrcweir         if ( !bImportingXML )
1223cdf0e10cSrcweir         {
1224cdf0e10cSrcweir             // #i66209# previous use might not have restored update mode,
1225cdf0e10cSrcweir             // ensure same state as for a new EditEngine (UpdateMode = sal_True)
1226cdf0e10cSrcweir             if ( !pCacheFieldEditEngine->GetUpdateMode() )
1227cdf0e10cSrcweir                 pCacheFieldEditEngine->SetUpdateMode(sal_True);
1228cdf0e10cSrcweir         }
1229cdf0e10cSrcweir 
1230cdf0e10cSrcweir         pNewEditEngine = pCacheFieldEditEngine;
1231cdf0e10cSrcweir         pCacheFieldEditEngine = NULL;
1232cdf0e10cSrcweir     }
1233cdf0e10cSrcweir     return pNewEditEngine;
1234cdf0e10cSrcweir }
1235cdf0e10cSrcweir 
DisposeFieldEditEngine(ScFieldEditEngine * & rpEditEngine)1236cdf0e10cSrcweir void ScDocument::DisposeFieldEditEngine(ScFieldEditEngine*& rpEditEngine)
1237cdf0e10cSrcweir {
1238cdf0e10cSrcweir     if (!pCacheFieldEditEngine && rpEditEngine)
1239cdf0e10cSrcweir     {
1240cdf0e10cSrcweir         pCacheFieldEditEngine = rpEditEngine;
1241cdf0e10cSrcweir         pCacheFieldEditEngine->Clear();
1242cdf0e10cSrcweir     }
1243cdf0e10cSrcweir     else
1244cdf0e10cSrcweir         delete rpEditEngine;
1245cdf0e10cSrcweir     rpEditEngine = NULL;
1246cdf0e10cSrcweir }
1247cdf0e10cSrcweir 
1248cdf0e10cSrcweir //  ----------------------------------------------------------------------------
1249cdf0e10cSrcweir 
1250cdf0e10cSrcweir // static
CreateRecursionHelperInstance()1251cdf0e10cSrcweir ScRecursionHelper* ScDocument::CreateRecursionHelperInstance()
1252cdf0e10cSrcweir {
1253cdf0e10cSrcweir     return new ScRecursionHelper;
1254cdf0e10cSrcweir }
1255cdf0e10cSrcweir 
1256cdf0e10cSrcweir //  ----------------------------------------------------------------------------
1257cdf0e10cSrcweir 
GetLookupCache(const ScRange & rRange)1258cdf0e10cSrcweir ScLookupCache & ScDocument::GetLookupCache( const ScRange & rRange )
1259cdf0e10cSrcweir {
1260cdf0e10cSrcweir     ScLookupCache* pCache = 0;
1261cdf0e10cSrcweir     if (!pLookupCacheMapImpl)
1262cdf0e10cSrcweir         pLookupCacheMapImpl = new ScLookupCacheMapImpl;
1263cdf0e10cSrcweir     ScLookupCacheMap::iterator it( pLookupCacheMapImpl->aCacheMap.find( rRange));
1264cdf0e10cSrcweir     if (it == pLookupCacheMapImpl->aCacheMap.end())
1265cdf0e10cSrcweir     {
1266cdf0e10cSrcweir         pCache = new ScLookupCache( this, rRange);
1267cdf0e10cSrcweir         AddLookupCache( *pCache);
1268cdf0e10cSrcweir     }
1269cdf0e10cSrcweir     else
1270cdf0e10cSrcweir         pCache = (*it).second;
1271cdf0e10cSrcweir     return *pCache;
1272cdf0e10cSrcweir }
1273cdf0e10cSrcweir 
AddLookupCache(ScLookupCache & rCache)1274cdf0e10cSrcweir void ScDocument::AddLookupCache( ScLookupCache & rCache )
1275cdf0e10cSrcweir {
1276cdf0e10cSrcweir     if (!pLookupCacheMapImpl->aCacheMap.insert( ::std::pair< const ScRange,
1277cdf0e10cSrcweir                 ScLookupCache*>( rCache.getRange(), &rCache)).second)
1278cdf0e10cSrcweir     {
1279cdf0e10cSrcweir         DBG_ERRORFILE( "ScDocument::AddLookupCache: couldn't add to hash map");
1280cdf0e10cSrcweir     }
1281cdf0e10cSrcweir     else
1282cdf0e10cSrcweir         StartListeningArea( rCache.getRange(), &rCache);
1283cdf0e10cSrcweir }
1284cdf0e10cSrcweir 
RemoveLookupCache(ScLookupCache & rCache)1285cdf0e10cSrcweir void ScDocument::RemoveLookupCache( ScLookupCache & rCache )
1286cdf0e10cSrcweir {
1287cdf0e10cSrcweir     ScLookupCacheMap::iterator it( pLookupCacheMapImpl->aCacheMap.find(
1288cdf0e10cSrcweir                 rCache.getRange()));
1289cdf0e10cSrcweir     if (it == pLookupCacheMapImpl->aCacheMap.end())
1290cdf0e10cSrcweir     {
1291cdf0e10cSrcweir         DBG_ERRORFILE( "ScDocument::RemoveLookupCache: range not found in hash map");
1292cdf0e10cSrcweir     }
1293cdf0e10cSrcweir     else
1294cdf0e10cSrcweir     {
1295cdf0e10cSrcweir         ScLookupCache* pCache = (*it).second;
1296cdf0e10cSrcweir         pLookupCacheMapImpl->aCacheMap.erase( it);
1297cdf0e10cSrcweir         EndListeningArea( pCache->getRange(), &rCache);
1298cdf0e10cSrcweir     }
1299cdf0e10cSrcweir }
1300cdf0e10cSrcweir 
ClearLookupCaches()1301cdf0e10cSrcweir void ScDocument::ClearLookupCaches()
1302cdf0e10cSrcweir {
1303cdf0e10cSrcweir     if( pLookupCacheMapImpl )
1304cdf0e10cSrcweir         pLookupCacheMapImpl->clear();
1305cdf0e10cSrcweir }
IsCellInChangeTrack(const ScAddress & cell,Color * pColCellBoder)13060deba7fbSSteve Yin sal_Bool ScDocument::IsCellInChangeTrack(const ScAddress &cell,Color *pColCellBoder)
13070deba7fbSSteve Yin {
13080deba7fbSSteve Yin     ScChangeTrack* pTrack = GetChangeTrack();
13090deba7fbSSteve Yin     ScChangeViewSettings* pSettings = GetChangeViewSettings();
13100deba7fbSSteve Yin     if ( !pTrack || !pTrack->GetFirst() || !pSettings || !pSettings->ShowChanges() )
13110deba7fbSSteve Yin         return sal_False;           // nix da oder abgeschaltet
13120deba7fbSSteve Yin     ScActionColorChanger aColorChanger(*pTrack);
13130deba7fbSSteve Yin     //  Clipping passiert von aussen
13140deba7fbSSteve Yin     //! ohne Clipping, nur betroffene Zeilen painten ??!??!?
13150deba7fbSSteve Yin     const ScChangeAction* pAction = pTrack->GetFirst();
13160deba7fbSSteve Yin     while (pAction)
13170deba7fbSSteve Yin     {
13180deba7fbSSteve Yin         ScChangeActionType eType;
13190deba7fbSSteve Yin         if ( pAction->IsVisible() )
13200deba7fbSSteve Yin         {
13210deba7fbSSteve Yin             eType = pAction->GetType();
13220deba7fbSSteve Yin             const ScBigRange& rBig = pAction->GetBigRange();
13230deba7fbSSteve Yin             if ( rBig.aStart.Tab() == cell.Tab())
13240deba7fbSSteve Yin             {
13250deba7fbSSteve Yin                 ScRange aRange = rBig.MakeRange();
13260deba7fbSSteve Yin                 if ( eType == SC_CAT_DELETE_ROWS )
13270deba7fbSSteve Yin                     aRange.aEnd.SetRow( aRange.aStart.Row() );
13280deba7fbSSteve Yin                 else if ( eType == SC_CAT_DELETE_COLS )
13290deba7fbSSteve Yin                     aRange.aEnd.SetCol( aRange.aStart.Col() );
13300deba7fbSSteve Yin                 if (ScViewUtil::IsActionShown( *pAction, *pSettings, *this ) )
13310deba7fbSSteve Yin                 {
13320deba7fbSSteve Yin                     if (aRange.In(cell))
13330deba7fbSSteve Yin                     {
13340deba7fbSSteve Yin                         if (pColCellBoder != NULL)
13350deba7fbSSteve Yin                         {
13360deba7fbSSteve Yin                             aColorChanger.Update( *pAction );
13370deba7fbSSteve Yin                             Color aColor( aColorChanger.GetColor() );
13380deba7fbSSteve Yin                             *pColCellBoder = aColor;
13390deba7fbSSteve Yin                         }
13400deba7fbSSteve Yin                         return sal_True;
13410deba7fbSSteve Yin                     }
13420deba7fbSSteve Yin                 }
13430deba7fbSSteve Yin             }
13440deba7fbSSteve Yin             if ( eType == SC_CAT_MOVE &&
13450deba7fbSSteve Yin                 ((const ScChangeActionMove*)pAction)->
13460deba7fbSSteve Yin                 GetFromRange().aStart.Tab() == cell.Col() )
13470deba7fbSSteve Yin             {
13480deba7fbSSteve Yin                 ScRange aRange = ((const ScChangeActionMove*)pAction)->
13490deba7fbSSteve Yin                     GetFromRange().MakeRange();
13500deba7fbSSteve Yin                 if (ScViewUtil::IsActionShown( *pAction, *pSettings, *this ) )
13510deba7fbSSteve Yin                 {
13520deba7fbSSteve Yin                     if (aRange.In(cell))
13530deba7fbSSteve Yin                     {
13540deba7fbSSteve Yin                         if (pColCellBoder != NULL)
13550deba7fbSSteve Yin                         {
13560deba7fbSSteve Yin                             aColorChanger.Update( *pAction );
13570deba7fbSSteve Yin                             Color aColor( aColorChanger.GetColor() );
13580deba7fbSSteve Yin                             *pColCellBoder = aColor;
13590deba7fbSSteve Yin                         }
13600deba7fbSSteve Yin                         return sal_True;
13610deba7fbSSteve Yin                     }
13620deba7fbSSteve Yin                 }
13630deba7fbSSteve Yin             }
13640deba7fbSSteve Yin         }
13650deba7fbSSteve Yin         pAction = pAction->GetNext();
13660deba7fbSSteve Yin     }
13670deba7fbSSteve Yin     return sal_False;
13680deba7fbSSteve Yin }
GetCellChangeTrackNote(const ScAddress & aCellPos,String & aTrackText,sal_Bool & bLeftEdge)13690deba7fbSSteve Yin void ScDocument::GetCellChangeTrackNote( const ScAddress &aCellPos,String &aTrackText,sal_Bool &bLeftEdge)
13700deba7fbSSteve Yin {
13710deba7fbSSteve Yin     aTrackText=String();
13720deba7fbSSteve Yin     //  Change-Tracking
13730deba7fbSSteve Yin     ScChangeTrack* pTrack = GetChangeTrack();
13740deba7fbSSteve Yin     ScChangeViewSettings* pSettings = GetChangeViewSettings();
13750deba7fbSSteve Yin     if ( pTrack && pTrack->GetFirst() && pSettings && pSettings->ShowChanges())
13760deba7fbSSteve Yin     {
13770deba7fbSSteve Yin         const ScChangeAction* pFound = NULL;
13780deba7fbSSteve Yin         const ScChangeAction* pFoundContent = NULL;
13790deba7fbSSteve Yin         const ScChangeAction* pFoundMove = NULL;
13800deba7fbSSteve Yin         long nModified = 0;
13810deba7fbSSteve Yin         const ScChangeAction* pAction = pTrack->GetFirst();
13820deba7fbSSteve Yin         while (pAction)
13830deba7fbSSteve Yin         {
13840deba7fbSSteve Yin             if ( pAction->IsVisible() &&
13850deba7fbSSteve Yin                  ScViewUtil::IsActionShown( *pAction, *pSettings, *this ) )
13860deba7fbSSteve Yin             {
13870deba7fbSSteve Yin                 ScChangeActionType eType = pAction->GetType();
13880deba7fbSSteve Yin                 const ScBigRange& rBig = pAction->GetBigRange();
13890deba7fbSSteve Yin                 if ( rBig.aStart.Tab() == aCellPos.Tab())
13900deba7fbSSteve Yin                 {
13910deba7fbSSteve Yin                     ScRange aRange = rBig.MakeRange();
13920deba7fbSSteve Yin                     if ( eType == SC_CAT_DELETE_ROWS )
13930deba7fbSSteve Yin                         aRange.aEnd.SetRow( aRange.aStart.Row() );
13940deba7fbSSteve Yin                     else if ( eType == SC_CAT_DELETE_COLS )
13950deba7fbSSteve Yin                         aRange.aEnd.SetCol( aRange.aStart.Col() );
13960deba7fbSSteve Yin                     if ( aRange.In( aCellPos ) )
13970deba7fbSSteve Yin                     {
13980deba7fbSSteve Yin                         pFound = pAction;       // der letzte gewinnt
13990deba7fbSSteve Yin                         switch ( eType )
14000deba7fbSSteve Yin                         {
14010deba7fbSSteve Yin                             case SC_CAT_CONTENT :
14020deba7fbSSteve Yin                                 pFoundContent = pAction;
14030deba7fbSSteve Yin                             break;
14040deba7fbSSteve Yin                             case SC_CAT_MOVE :
14050deba7fbSSteve Yin                                 pFoundMove = pAction;
14060deba7fbSSteve Yin                             break;
14070deba7fbSSteve Yin                             default:
14080deba7fbSSteve Yin                                 break;
14090deba7fbSSteve Yin                         }
14100deba7fbSSteve Yin                         ++nModified;
14110deba7fbSSteve Yin                     }
14120deba7fbSSteve Yin                 }
14130deba7fbSSteve Yin                 if ( eType == SC_CAT_MOVE )
14140deba7fbSSteve Yin                 {
14150deba7fbSSteve Yin                     ScRange aRange =
14160deba7fbSSteve Yin                         ((const ScChangeActionMove*)pAction)->
14170deba7fbSSteve Yin                         GetFromRange().MakeRange();
14180deba7fbSSteve Yin                     if ( aRange.In( aCellPos ) )
14190deba7fbSSteve Yin                     {
14200deba7fbSSteve Yin                         pFound = pAction;
14210deba7fbSSteve Yin                         ++nModified;
14220deba7fbSSteve Yin                     }
14230deba7fbSSteve Yin                 }
14240deba7fbSSteve Yin             }
14250deba7fbSSteve Yin             pAction = pAction->GetNext();
14260deba7fbSSteve Yin         }
14270deba7fbSSteve Yin         if ( pFound )
14280deba7fbSSteve Yin         {
14290deba7fbSSteve Yin             if ( pFoundContent && pFound->GetType() != SC_CAT_CONTENT )
14300deba7fbSSteve Yin                 pFound = pFoundContent;     // Content gewinnt
14310deba7fbSSteve Yin             if ( pFoundMove && pFound->GetType() != SC_CAT_MOVE &&
14320deba7fbSSteve Yin                     pFoundMove->GetActionNumber() >
14330deba7fbSSteve Yin                     pFound->GetActionNumber() )
14340deba7fbSSteve Yin                 pFound = pFoundMove;        // Move gewinnt
14350deba7fbSSteve Yin             //  bei geloeschten Spalten: Pfeil auf die linke Seite der Zelle
14360deba7fbSSteve Yin             if ( pFound->GetType() == SC_CAT_DELETE_COLS )
14370deba7fbSSteve Yin                 bLeftEdge = sal_True;
14380deba7fbSSteve Yin             DateTime aDT = pFound->GetDateTime();
14390deba7fbSSteve Yin             aTrackText  = pFound->GetUser();
14400deba7fbSSteve Yin             aTrackText.AppendAscii(RTL_CONSTASCII_STRINGPARAM( ", " ));
14410deba7fbSSteve Yin             aTrackText += ScGlobal::pLocaleData->getDate(aDT);
14420deba7fbSSteve Yin             aTrackText += ' ';
14430deba7fbSSteve Yin             aTrackText += ScGlobal::pLocaleData->getTime(aDT);
14440deba7fbSSteve Yin             aTrackText.AppendAscii(RTL_CONSTASCII_STRINGPARAM( ":\n" ));
14450deba7fbSSteve Yin             String aComStr=pFound->GetComment();
14460deba7fbSSteve Yin             if(aComStr.Len()>0)
14470deba7fbSSteve Yin             {
14480deba7fbSSteve Yin                 aTrackText += aComStr;
14490deba7fbSSteve Yin                 aTrackText.AppendAscii(RTL_CONSTASCII_STRINGPARAM( "\n( " ));
14500deba7fbSSteve Yin             }
14510deba7fbSSteve Yin             pFound->GetDescription( aTrackText, this );
14520deba7fbSSteve Yin             if(aComStr.Len()>0)
14530deba7fbSSteve Yin             {
14540deba7fbSSteve Yin                 aTrackText +=')';
14550deba7fbSSteve Yin             }
14560deba7fbSSteve Yin         }
14570deba7fbSSteve Yin     }
14580deba7fbSSteve Yin }
1459