xref: /aoo41x/main/sc/source/core/data/documen2.cxx (revision 611fcdab)
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
10b3f79822SAndrew Rist  *
11b3f79822SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12b3f79822SAndrew Rist  *
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.
19b3f79822SAndrew Rist  *
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*611fcdabSJim Jagielski 		{
233*611fcdabSJim Jagielski 			pLinkManager = new sfx2::LinkManager(pDocShell);
234*611fcdabSJim Jagielski 			pLinkManager->SetAutoAskUpdateAllLinks();
235*611fcdabSJim Jagielski 		}
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*611fcdabSJim Jagielski 		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 
988045bbc1cSAriel Constenla-Haile         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