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