Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #include "scitems.hxx"
30 : : #include <vcl/msgbox.hxx>
31 : : #include <vcl/waitobj.hxx>
32 : : #include <sfx2/app.hxx>
33 : : #include <sfx2/bindings.hxx>
34 : :
35 : : #include <com/sun/star/script/vba/XVBACompatibility.hpp>
36 : :
37 : : #include "docsh.hxx"
38 : : #include "global.hxx"
39 : : #include "globstr.hrc"
40 : : #include "globalnames.hxx"
41 : : #include "undodat.hxx"
42 : : #include "undotab.hxx"
43 : : #include "undoblk.hxx"
44 : : #include "dpobject.hxx"
45 : : #include "dpshttab.hxx"
46 : : #include "dbdocfun.hxx"
47 : : #include "consoli.hxx"
48 : : #include "dbdata.hxx"
49 : : #include "progress.hxx"
50 : : #include "olinetab.hxx"
51 : : #include "patattr.hxx"
52 : : #include "attrib.hxx"
53 : : #include "docpool.hxx"
54 : : #include "uiitems.hxx"
55 : : #include "sc.hrc"
56 : : #include "waitoff.hxx"
57 : : #include "sizedev.hxx"
58 : : #include "clipparam.hxx"
59 : :
60 : : // defined in docfunc.cxx
61 : : void VBA_InsertModule( ScDocument& rDoc, SCTAB nTab, const rtl::OUString& sModuleName, const rtl::OUString& sModuleSource );
62 : :
63 : : using com::sun::star::script::XLibraryContainer;
64 : : using com::sun::star::script::vba::XVBACompatibility;
65 : : using com::sun::star::container::XNameContainer;
66 : : using com::sun::star::uno::Reference;
67 : : using com::sun::star::uno::UNO_QUERY;
68 : :
69 : : using ::std::auto_ptr;
70 : : using ::std::vector;
71 : :
72 : : // ---------------------------------------------------------------------------
73 : :
74 : : //
75 : : // former viewfunc/dbfunc methods
76 : : //
77 : :
78 : 0 : void ScDocShell::ErrorMessage( sal_uInt16 nGlobStrId )
79 : : {
80 : : //! StopMarking an der (aktiven) View?
81 : :
82 [ # # ]: 0 : Window* pParent = GetActiveDialogParent();
83 [ # # ]: 0 : ScWaitCursorOff aWaitOff( pParent );
84 [ # # ][ # # ]: 0 : sal_Bool bFocus = pParent && pParent->HasFocus();
[ # # ]
85 : :
86 [ # # ]: 0 : if(nGlobStrId==STR_PROTECTIONERR)
87 : : {
88 [ # # ][ # # ]: 0 : if(IsReadOnly())
89 : : {
90 : 0 : nGlobStrId=STR_READONLYERR;
91 : : }
92 : : }
93 : :
94 [ # # ][ # # ]: 0 : InfoBox aBox( pParent, ScGlobal::GetRscString( nGlobStrId ) );
95 [ # # ]: 0 : aBox.Execute();
96 [ # # ]: 0 : if (bFocus)
97 [ # # ][ # # ]: 0 : pParent->GrabFocus();
[ # # ]
98 : 0 : }
99 : :
100 : 785 : sal_Bool ScDocShell::IsEditable() const
101 : : {
102 : : // import into read-only document is possible - must be extended if other filters use api
103 : : // #i108547# MSOOXML filter uses "IsChangeReadOnlyEnabled" property
104 : :
105 [ - + ][ # # ]: 785 : return !IsReadOnly() || aDocument.IsImportingXML() || aDocument.IsChangeReadOnlyEnabled();
[ # # ]
106 : : }
107 : :
108 : 4 : void ScDocShell::DBAreaDeleted( SCTAB nTab, SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW /* nY2 */ )
109 : : {
110 [ + - ]: 4 : ScDocShellModificator aModificator( *this );
111 [ + - ]: 4 : aDocument.RemoveFlagsTab( nX1, nY1, nX2, nY1, nTab, SC_MF_AUTO );
112 [ + - ]: 4 : PostPaint( nX1, nY1, nTab, nX2, nY1, nTab, PAINT_GRID );
113 : : // No SetDocumentModified, as the unnamed database range might have to be restored later.
114 : : // The UNO hint is broadcast directly instead, to keep UNO objects in valid state.
115 [ + - ][ + - ]: 4 : aDocument.BroadcastUno( SfxSimpleHint( SFX_HINT_DATACHANGED ) );
[ + - ][ + - ]
116 : 4 : }
117 : :
118 : 36 : ScDBData* ScDocShell::GetDBData( const ScRange& rMarked, ScGetDBMode eMode, ScGetDBSelection eSel )
119 : : {
120 : 36 : SCCOL nCol = rMarked.aStart.Col();
121 : 36 : SCROW nRow = rMarked.aStart.Row();
122 : 36 : SCTAB nTab = rMarked.aStart.Tab();
123 : :
124 : 36 : SCCOL nStartCol = nCol;
125 : 36 : SCROW nStartRow = nRow;
126 : 36 : SCTAB nStartTab = nTab;
127 : 36 : SCCOL nEndCol = rMarked.aEnd.Col();
128 : 36 : SCROW nEndRow = rMarked.aEnd.Row();
129 : 36 : SCTAB nEndTab = rMarked.aEnd.Tab();
130 : : // Nicht einfach GetDBAtCursor: Der zusammenhaengende Datenbereich
131 : : // fuer "unbenannt" (GetDataArea) kann neben dem Cursor legen, also muss auch ein
132 : : // benannter DB-Bereich dort gesucht werden.
133 [ + - ]: 36 : ScDBCollection* pColl = aDocument.GetDBCollection();
134 [ + - ]: 36 : ScDBData* pData = aDocument.GetDBAtArea( nTab, nStartCol, nStartRow, nEndCol, nEndRow );
135 [ + + ][ + - ]: 36 : if (!pData && pColl)
136 [ + - ]: 22 : pData = pColl->GetDBNearCursor(nCol, nRow, nTab );
137 : :
138 : : sal_Bool bSelected = ( eSel == SC_DBSEL_FORCE_MARK ||
139 [ - + ][ # # ]: 36 : (rMarked.aStart != rMarked.aEnd && eSel != SC_DBSEL_ROW_DOWN) );
[ # # ]
140 [ - + ][ # # ]: 36 : bool bOnlyDown = (!bSelected && eSel == SC_DBSEL_ROW_DOWN && rMarked.aStart.Row() == rMarked.aEnd.Row());
[ # # ]
141 : :
142 : 36 : sal_Bool bUseThis = false;
143 [ + + ]: 36 : if (pData)
144 : : {
145 : : // Bereich nehmen, wenn nichts anderes markiert
146 : :
147 : : SCTAB nDummy;
148 : : SCCOL nOldCol1;
149 : : SCROW nOldRow1;
150 : : SCCOL nOldCol2;
151 : : SCROW nOldRow2;
152 [ + - ]: 20 : pData->GetArea( nDummy, nOldCol1,nOldRow1, nOldCol2,nOldRow2 );
153 : 20 : sal_Bool bIsNoName = ( pData->GetName() == STR_DB_LOCAL_NONAME );
154 : :
155 [ - + ]: 20 : if (!bSelected)
156 : : {
157 : 0 : bUseThis = sal_True;
158 [ # # ][ # # ]: 0 : if ( bIsNoName && eMode == SC_DB_MAKE )
159 : : {
160 : : // If nothing marked or only one row marked, adapt
161 : : // "unbenannt"/"unnamed" to contiguous area.
162 : 0 : nStartCol = nCol;
163 : 0 : nStartRow = nRow;
164 [ # # ]: 0 : if (bOnlyDown)
165 : : {
166 : 0 : nEndCol = rMarked.aEnd.Col();
167 : 0 : nEndRow = rMarked.aEnd.Row();
168 : : }
169 : : else
170 : : {
171 : 0 : nEndCol = nStartCol;
172 : 0 : nEndRow = nStartRow;
173 : : }
174 [ # # ]: 0 : aDocument.GetDataArea( nTab, nStartCol, nStartRow, nEndCol, nEndRow, false, bOnlyDown );
175 [ # # ][ # # ]: 0 : if ( nOldCol1 != nStartCol || nOldCol2 != nEndCol || nOldRow1 != nStartRow )
[ # # ]
176 : 0 : bUseThis = false; // passt gar nicht
177 [ # # ]: 0 : else if ( nOldRow2 != nEndRow )
178 : : {
179 : : // Bereich auf neue End-Zeile erweitern
180 [ # # ]: 0 : pData->SetArea( nTab, nOldCol1,nOldRow1, nOldCol2,nEndRow );
181 : : }
182 : : }
183 : : }
184 : : else
185 : : {
186 [ + - ][ + - ]: 20 : if ( nOldCol1 == nStartCol && nOldRow1 == nStartRow &&
[ + + ][ + + ]
187 : : nOldCol2 == nEndCol && nOldRow2 == nEndRow ) // genau markiert?
188 : 14 : bUseThis = sal_True;
189 : : else
190 : 6 : bUseThis = false; // immer Markierung nehmen (Bug 11964)
191 : : }
192 : :
193 : : // fuer Import nie "unbenannt" nehmen
194 : :
195 [ + + ][ - + ]: 20 : if ( bUseThis && eMode == SC_DB_IMPORT && bIsNoName )
[ # # ]
196 : 20 : bUseThis = false;
197 : : }
198 : :
199 [ + + ]: 36 : if ( bUseThis )
200 : : {
201 [ + - ]: 14 : pData->GetArea( nStartTab, nStartCol,nStartRow, nEndCol,nEndRow );
202 : 14 : nEndTab = nStartTab;
203 : : }
204 [ + + ]: 22 : else if ( eMode == SC_DB_OLD )
205 : : {
206 : 8 : pData = NULL; // nichts gefunden
207 : 8 : nStartCol = nEndCol = nCol;
208 : 8 : nStartRow = nEndRow = nRow;
209 : 8 : nStartTab = nEndTab = nTab;
210 : : }
211 : : else
212 : : {
213 [ - + ]: 14 : if ( !bSelected )
214 : : { // zusammenhaengender Bereich
215 : 0 : nStartCol = nCol;
216 : 0 : nStartRow = nRow;
217 [ # # ]: 0 : if (bOnlyDown)
218 : : {
219 : 0 : nEndCol = rMarked.aEnd.Col();
220 : 0 : nEndRow = rMarked.aEnd.Row();
221 : : }
222 : : else
223 : : {
224 : 0 : nEndCol = nStartCol;
225 : 0 : nEndRow = nStartRow;
226 : : }
227 [ # # ]: 0 : aDocument.GetDataArea( nTab, nStartCol, nStartRow, nEndCol, nEndRow, false, bOnlyDown );
228 : : }
229 : :
230 [ + - ]: 14 : sal_Bool bHasHeader = aDocument.HasColHeader( nStartCol,nStartRow, nEndCol,nEndRow, nTab );
231 : :
232 [ + - ]: 14 : ScDBData* pNoNameData = aDocument.GetAnonymousDBData(nTab);
233 [ + - ][ + + ]: 14 : if ( eMode != SC_DB_IMPORT && pNoNameData)
234 : : {
235 : :
236 [ + - ]: 4 : if ( !pOldAutoDBRange )
237 : : {
238 : : // store the old unnamed database range with its settings for undo
239 : : // (store at the first change, get the state before all changes)
240 [ + - ][ + - ]: 4 : pOldAutoDBRange = new ScDBData( *pNoNameData );
241 : : }
242 : :
243 : : SCCOL nOldX1; // alten Bereich sauber wegnehmen
244 : : SCROW nOldY1; //! (UNDO ???)
245 : : SCCOL nOldX2;
246 : : SCROW nOldY2;
247 : : SCTAB nOldTab;
248 [ + - ]: 4 : pNoNameData->GetArea( nOldTab, nOldX1, nOldY1, nOldX2, nOldY2 );
249 [ + - ]: 4 : DBAreaDeleted( nOldTab, nOldX1, nOldY1, nOldX2, nOldY2 );
250 : :
251 [ + - ][ + - ]: 4 : pNoNameData->SetSortParam( ScSortParam() ); // Parameter zuruecksetzen
[ + - ]
252 [ + - ][ + - ]: 4 : pNoNameData->SetQueryParam( ScQueryParam() );
[ + - ]
253 [ + - ][ + - ]: 4 : pNoNameData->SetSubTotalParam( ScSubTotalParam() );
254 : :
255 [ + - ]: 4 : pNoNameData->SetArea( nTab, nStartCol,nStartRow, nEndCol,nEndRow ); // neu setzen
256 : 4 : pNoNameData->SetByRow( sal_True );
257 : 4 : pNoNameData->SetHeader( bHasHeader );
258 : 4 : pNoNameData->SetAutoFilter( false );
259 : : }
260 : : else
261 : : {
262 : 10 : ScDBCollection* pUndoColl = NULL;
263 : :
264 [ + - ]: 10 : String aNewName;
265 [ - + ]: 10 : if (eMode==SC_DB_IMPORT)
266 : : {
267 [ # # ]: 0 : aDocument.CompileDBFormula( sal_True ); // CreateFormulaString
268 [ # # ][ # # ]: 0 : pUndoColl = new ScDBCollection( *pColl ); // Undo fuer Import1-Bereich
269 : :
270 [ # # ][ # # ]: 0 : String aImport = ScGlobal::GetRscString( STR_DBNAME_IMPORT );
271 : 0 : long nCount = 0;
272 : 0 : const ScDBData* pDummy = NULL;
273 [ # # ]: 0 : ScDBCollection::NamedDBs& rDBs = pColl->getNamedDBs();
274 [ # # ]: 0 : do
275 : : {
276 : 0 : ++nCount;
277 [ # # ]: 0 : aNewName = aImport;
278 [ # # ][ # # ]: 0 : aNewName += String::CreateFromInt32( nCount );
[ # # ]
279 [ # # ][ # # ]: 0 : pDummy = rDBs.findByName(aNewName);
280 : : }
281 : : while (pDummy);
282 : : pNoNameData = new ScDBData( aNewName, nTab,
283 : : nStartCol,nStartRow, nEndCol,nEndRow,
284 [ # # ][ # # ]: 0 : sal_True, bHasHeader );
[ # # ]
285 [ # # ][ # # ]: 0 : rDBs.insert(pNoNameData);
286 : : }
287 : : else
288 : : {
289 [ + - ][ + - ]: 10 : aNewName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME));
290 : : pNoNameData = new ScDBData(aNewName , nTab,
291 : : nStartCol,nStartRow, nEndCol,nEndRow,
292 [ + - ][ + - ]: 10 : sal_True, bHasHeader );
[ + - ]
293 [ + - ]: 10 : aDocument.SetAnonymousDBData(nTab, pNoNameData);
294 : : }
295 : :
296 : :
297 : :
298 [ - + ]: 10 : if ( pUndoColl )
299 : : {
300 [ # # ]: 0 : aDocument.CompileDBFormula( false ); // CompileFormulaString
301 : :
302 [ # # ][ # # ]: 0 : ScDBCollection* pRedoColl = new ScDBCollection( *pColl );
303 [ # # ][ # # ]: 0 : GetUndoManager()->AddUndoAction( new ScUndoDBData( this, pUndoColl, pRedoColl ) );
[ # # ][ # # ]
304 : : }
305 : :
306 : : // neuen Bereich am Sba anmelden nicht mehr noetig
307 : :
308 : : // "Import1" etc am Navigator bekanntmachen
309 [ - + ]: 10 : if (eMode==SC_DB_IMPORT)
310 [ # # ][ # # ]: 10 : SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_DBAREAS_CHANGED ) );
[ # # ][ # # ]
[ + - ]
311 : : }
312 : 14 : pData = pNoNameData;
313 : : }
314 : :
315 : 36 : return pData;
316 : : }
317 : :
318 : 0 : ScDBData* ScDocShell::GetAnonymousDBData(const ScRange& rRange)
319 : : {
320 : : bool bHasHeader = aDocument.HasColHeader(
321 : 0 : rRange.aStart.Col(), rRange.aStart.Row(), rRange.aEnd.Col(), rRange.aEnd.Row(), rRange.aStart.Tab());
322 : :
323 : 0 : ScDBCollection* pColl = aDocument.GetDBCollection();
324 [ # # ]: 0 : if (!pColl)
325 : 0 : return NULL;
326 : :
327 : 0 : ScDBData* pData = pColl->getAnonDBs().getByRange(rRange);
328 [ # # ]: 0 : if (!pData)
329 : 0 : return NULL;
330 : :
331 : 0 : pData->SetHeader(bHasHeader);
332 : 0 : return pData;
333 : : }
334 : :
335 : 14 : ScDBData* ScDocShell::GetOldAutoDBRange()
336 : : {
337 : 14 : ScDBData* pRet = pOldAutoDBRange;
338 : 14 : pOldAutoDBRange = NULL;
339 : 14 : return pRet; // has to be deleted by caller!
340 : : }
341 : :
342 : 0 : void ScDocShell::CancelAutoDBRange()
343 : : {
344 : : // called when dialog is cancelled
345 : : //moggi:TODO
346 [ # # ]: 0 : if ( pOldAutoDBRange )
347 : : {
348 : 0 : SCTAB nTab = GetCurTab();
349 : 0 : ScDBData* pDBData = aDocument.GetAnonymousDBData(nTab);
350 [ # # ]: 0 : if ( pDBData )
351 : : {
352 : : SCCOL nRangeX1;
353 : : SCROW nRangeY1;
354 : : SCCOL nRangeX2;
355 : : SCROW nRangeY2;
356 : : SCTAB nRangeTab;
357 [ # # ]: 0 : pDBData->GetArea( nRangeTab, nRangeX1, nRangeY1, nRangeX2, nRangeY2 );
358 [ # # ]: 0 : DBAreaDeleted( nRangeTab, nRangeX1, nRangeY1, nRangeX2, nRangeY2 );
359 : :
360 [ # # ]: 0 : *pDBData = *pOldAutoDBRange; // restore old settings
361 : :
362 [ # # ]: 0 : if ( pOldAutoDBRange->HasAutoFilter() )
363 : : {
364 : : // restore AutoFilter buttons
365 [ # # ]: 0 : pOldAutoDBRange->GetArea( nRangeTab, nRangeX1, nRangeY1, nRangeX2, nRangeY2 );
366 [ # # ]: 0 : aDocument.ApplyFlagsTab( nRangeX1, nRangeY1, nRangeX2, nRangeY1, nRangeTab, SC_MF_AUTO );
367 [ # # ]: 0 : PostPaint( nRangeX1, nRangeY1, nRangeTab, nRangeX2, nRangeY1, nRangeTab, PAINT_GRID );
368 : : }
369 : : }
370 : :
371 [ # # ]: 0 : delete pOldAutoDBRange;
372 : 0 : pOldAutoDBRange = NULL;
373 : : }
374 : 0 : }
375 : :
376 : :
377 : : // Hoehen anpassen
378 : : //! mit docfunc zusammenfassen
379 : :
380 : 52 : sal_Bool ScDocShell::AdjustRowHeight( SCROW nStartRow, SCROW nEndRow, SCTAB nTab )
381 : : {
382 [ + - ]: 52 : ScSizeDeviceProvider aProv(this);
383 [ + - ]: 52 : Fraction aZoom(1,1);
384 : : sal_Bool bChange = aDocument.SetOptimalHeight( nStartRow,nEndRow, nTab, 0, aProv.GetDevice(),
385 [ + - ]: 52 : aProv.GetPPTX(),aProv.GetPPTY(), aZoom,aZoom, false );
386 [ + + ]: 52 : if (bChange)
387 [ + - ]: 32 : PostPaint( 0,nStartRow,nTab, MAXCOL,MAXROW,nTab, PAINT_GRID|PAINT_LEFT );
388 : :
389 [ + - ]: 52 : return bChange;
390 : : }
391 : :
392 : 0 : void ScDocShell::UpdateAllRowHeights( const ScMarkData* pTabMark )
393 : : {
394 : : // update automatic row heights
395 : :
396 [ # # ]: 0 : ScSizeDeviceProvider aProv(this);
397 [ # # ]: 0 : Fraction aZoom(1,1);
398 [ # # ][ # # ]: 0 : aDocument.UpdateAllRowHeights( aProv.GetDevice(), aProv.GetPPTX(), aProv.GetPPTY(), aZoom, aZoom, pTabMark );
399 : 0 : }
400 : :
401 : 4219 : void ScDocShell::UpdatePendingRowHeights( SCTAB nUpdateTab, bool bBefore )
402 : : {
403 : 4219 : sal_Bool bIsUndoEnabled = aDocument.IsUndoEnabled();
404 : 4219 : aDocument.EnableUndo( false );
405 : 4219 : aDocument.LockStreamValid( true ); // ignore draw page size (but not formula results)
406 [ + + ]: 4219 : if ( bBefore ) // check all sheets up to nUpdateTab
407 : : {
408 [ + - ]: 34 : SCTAB nTabCount = aDocument.GetTableCount();
409 [ - + ]: 34 : if ( nUpdateTab >= nTabCount )
410 : 0 : nUpdateTab = nTabCount-1; // nUpdateTab is inclusive
411 : :
412 [ + - ]: 34 : ScMarkData aUpdateSheets;
413 : : SCTAB nTab;
414 [ + + ]: 68 : for (nTab=0; nTab<=nUpdateTab; ++nTab)
415 [ + - ][ - + ]: 34 : if ( aDocument.IsPendingRowHeights( nTab ) )
416 [ # # ]: 0 : aUpdateSheets.SelectTable( nTab, sal_True );
417 : :
418 [ + - ][ - + ]: 34 : if (aUpdateSheets.GetSelectCount())
419 [ # # ]: 0 : UpdateAllRowHeights(&aUpdateSheets); // update with a single progress bar
420 : :
421 [ + + ]: 68 : for (nTab=0; nTab<=nUpdateTab; ++nTab)
422 [ + - ][ - + ]: 34 : if ( aUpdateSheets.GetTableSelect( nTab ) )
423 : : {
424 [ # # ]: 0 : aDocument.UpdatePageBreaks( nTab );
425 [ # # ]: 0 : aDocument.SetPendingRowHeights( nTab, false );
426 [ + - ]: 34 : }
427 : : }
428 : : else // only nUpdateTab
429 : : {
430 [ - + ]: 4185 : if ( aDocument.IsPendingRowHeights( nUpdateTab ) )
431 : : {
432 : 0 : AdjustRowHeight( 0, MAXROW, nUpdateTab );
433 : 0 : aDocument.UpdatePageBreaks( nUpdateTab );
434 : 0 : aDocument.SetPendingRowHeights( nUpdateTab, false );
435 : : }
436 : : }
437 : 4219 : aDocument.LockStreamValid( false );
438 : 4219 : aDocument.EnableUndo( bIsUndoEnabled );
439 : 4219 : }
440 : :
441 : 0 : void ScDocShell::RefreshPivotTables( const ScRange& rSource )
442 : : {
443 : : //! rename to RefreshDataPilotTables?
444 : :
445 : 0 : ScDPCollection* pColl = aDocument.GetDPCollection();
446 [ # # ]: 0 : if ( pColl )
447 : : {
448 : : // DataPilotUpdate doesn't modify the collection order like PivotUpdate did,
449 : : // so a simple loop can be used.
450 : :
451 : 0 : sal_uInt16 nCount = pColl->GetCount();
452 [ # # ]: 0 : for ( sal_uInt16 i=0; i<nCount; i++ )
453 : : {
454 : 0 : ScDPObject* pOld = (*pColl)[i];
455 [ # # ]: 0 : if ( pOld )
456 : : {
457 : 0 : const ScSheetSourceDesc* pSheetDesc = pOld->GetSheetDesc();
458 [ # # ][ # # ]: 0 : if ( pSheetDesc && pSheetDesc->GetSourceRange().Intersects( rSource ) )
[ # # ]
459 : : {
460 [ # # ][ # # ]: 0 : ScDPObject* pNew = new ScDPObject( *pOld );
461 : 0 : ScDBDocFunc aFunc( *this );
462 [ # # ]: 0 : aFunc.DataPilotUpdate( pOld, pNew, sal_True, false );
463 [ # # ][ # # ]: 0 : delete pNew; // DataPilotUpdate copies settings from "new" object
464 : : }
465 : : }
466 : : }
467 : : }
468 : 0 : }
469 : :
470 : 0 : rtl::OUString lcl_GetAreaName( ScDocument* pDoc, ScArea* pArea )
471 : : {
472 : 0 : rtl::OUString aName;
473 : 0 : sal_Bool bOk = false;
474 : : ScDBData* pData = pDoc->GetDBAtArea( pArea->nTab, pArea->nColStart, pArea->nRowStart,
475 [ # # ]: 0 : pArea->nColEnd, pArea->nRowEnd );
476 [ # # ]: 0 : if (pData)
477 : : {
478 : 0 : aName = pData->GetName();
479 : 0 : bOk = sal_True;
480 : : }
481 : :
482 [ # # ]: 0 : if (!bOk)
483 [ # # ]: 0 : pDoc->GetName( pArea->nTab, aName );
484 : :
485 : 0 : return aName;
486 : : }
487 : :
488 : 1 : void ScDocShell::DoConsolidate( const ScConsolidateParam& rParam, sal_Bool bRecord )
489 : : {
490 [ + - ]: 1 : ScConsData aData;
491 : :
492 : : sal_uInt16 nPos;
493 : 1 : SCCOL nColSize = 0;
494 : 1 : SCROW nRowSize = 0;
495 : 1 : sal_Bool bErr = false;
496 [ - + ]: 1 : for (nPos=0; nPos<rParam.nDataAreaCount; nPos++)
497 : : {
498 : 0 : ScArea* pArea = rParam.ppDataAreas[nPos];
499 : 0 : nColSize = Max( nColSize, SCCOL( pArea->nColEnd - pArea->nColStart + 1 ) );
500 : 0 : nRowSize = Max( nRowSize, SCROW( pArea->nRowEnd - pArea->nRowStart + 1 ) );
501 : :
502 : : // Test, ob Quelldaten verschoben wuerden
503 [ # # ]: 0 : if (rParam.bReferenceData)
504 [ # # ][ # # ]: 0 : if (pArea->nTab == rParam.nTab && pArea->nRowEnd >= rParam.nRow)
505 : 0 : bErr = sal_True;
506 : : }
507 : :
508 [ - + ]: 1 : if (bErr)
509 : : {
510 : : InfoBox aBox( GetActiveDialogParent(),
511 [ # # ][ # # ]: 0 : ScGlobal::GetRscString( STR_CONSOLIDATE_ERR1 ) );
[ # # ]
512 [ # # ]: 0 : aBox.Execute();
513 [ # # ]: 1 : return;
514 : : }
515 : :
516 : : // ausfuehren
517 : :
518 [ + - ][ + - ]: 1 : WaitObject aWait( GetActiveDialogParent() );
519 [ + - ]: 1 : ScDocShellModificator aModificator( *this );
520 : :
521 : 1 : ScRange aOldDest;
522 [ + - ]: 1 : ScDBData* pDestData = aDocument.GetDBAtCursor( rParam.nCol, rParam.nRow, rParam.nTab, true );
523 [ - + ]: 1 : if (pDestData)
524 [ # # ]: 0 : pDestData->GetArea(aOldDest);
525 : :
526 [ + - ]: 1 : aData.SetSize( nColSize, nRowSize );
527 [ + - ]: 1 : aData.SetFlags( rParam.eFunction, rParam.bByCol, rParam.bByRow, rParam.bReferenceData );
528 [ + - ][ - + ]: 1 : if ( rParam.bByCol || rParam.bByRow )
529 [ # # ]: 0 : for (nPos=0; nPos<rParam.nDataAreaCount; nPos++)
530 : : {
531 : 0 : ScArea* pArea = rParam.ppDataAreas[nPos];
532 : : aData.AddFields( &aDocument, pArea->nTab, pArea->nColStart, pArea->nRowStart,
533 [ # # ]: 0 : pArea->nColEnd, pArea->nRowEnd );
534 : : }
535 [ + - ]: 1 : aData.DoneFields();
536 [ - + ]: 1 : for (nPos=0; nPos<rParam.nDataAreaCount; nPos++)
537 : : {
538 : 0 : ScArea* pArea = rParam.ppDataAreas[nPos];
539 : : aData.AddData( &aDocument, pArea->nTab, pArea->nColStart, pArea->nRowStart,
540 [ # # ]: 0 : pArea->nColEnd, pArea->nRowEnd );
541 [ # # ][ # # ]: 0 : aData.AddName( lcl_GetAreaName(&aDocument,pArea) );
[ # # ][ # # ]
542 : : }
543 : :
544 [ + - ]: 1 : aData.GetSize( nColSize, nRowSize );
545 [ + - ][ - + ]: 1 : if (bRecord && nColSize > 0 && nRowSize > 0)
[ # # ]
546 : : {
547 [ # # ][ # # ]: 0 : ScDBData* pUndoData = pDestData ? new ScDBData(*pDestData) : NULL;
[ # # ]
548 : :
549 : 0 : SCTAB nDestTab = rParam.nTab;
550 : : ScArea aDestArea( rParam.nTab, rParam.nCol, rParam.nRow,
551 [ # # ]: 0 : rParam.nCol+nColSize-1, rParam.nRow+nRowSize-1 );
552 [ # # ]: 0 : if (rParam.bByCol) ++aDestArea.nColEnd;
553 [ # # ]: 0 : if (rParam.bByRow) ++aDestArea.nRowEnd;
554 : :
555 [ # # ]: 0 : if (rParam.bReferenceData)
556 : : {
557 [ # # ]: 0 : SCTAB nTabCount = aDocument.GetTableCount();
558 [ # # ]: 0 : SCROW nInsertCount = aData.GetInsertCount();
559 : :
560 : : // alte Outlines
561 [ # # ]: 0 : ScOutlineTable* pTable = aDocument.GetOutlineTable( nDestTab );
562 [ # # ][ # # ]: 0 : ScOutlineTable* pUndoTab = pTable ? new ScOutlineTable( *pTable ) : NULL;
[ # # ]
563 : :
564 [ # # ][ # # ]: 0 : ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
565 [ # # ]: 0 : pUndoDoc->InitUndo( &aDocument, 0, nTabCount-1, false, sal_True );
566 : :
567 : : // Zeilenstatus
568 : : aDocument.CopyToDocument( 0,0,nDestTab, MAXCOL,MAXROW,nDestTab,
569 [ # # ]: 0 : IDF_NONE, false, pUndoDoc );
570 : :
571 : : // alle Formeln
572 : : aDocument.CopyToDocument( 0,0,0, MAXCOL,MAXROW,nTabCount-1,
573 [ # # ]: 0 : IDF_FORMULA, false, pUndoDoc );
574 : :
575 : : // komplette Ausgangszeilen
576 : : aDocument.CopyToDocument( 0,aDestArea.nRowStart,nDestTab,
577 : : MAXCOL,aDestArea.nRowEnd,nDestTab,
578 [ # # ]: 0 : IDF_ALL, false, pUndoDoc );
579 : :
580 : : // alten Ausgabebereich
581 [ # # ]: 0 : if (pDestData)
582 [ # # ]: 0 : aDocument.CopyToDocument( aOldDest, IDF_ALL, false, pUndoDoc );
583 : :
584 [ # # ]: 0 : GetUndoManager()->AddUndoAction(
585 : : new ScUndoConsolidate( this, aDestArea, rParam, pUndoDoc,
586 [ # # ][ # # ]: 0 : sal_True, nInsertCount, pUndoTab, pUndoData ) );
[ # # ]
587 : : }
588 : : else
589 : : {
590 [ # # ][ # # ]: 0 : ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
591 [ # # ]: 0 : pUndoDoc->InitUndo( &aDocument, aDestArea.nTab, aDestArea.nTab );
592 : :
593 : : aDocument.CopyToDocument( aDestArea.nColStart, aDestArea.nRowStart, aDestArea.nTab,
594 : : aDestArea.nColEnd, aDestArea.nRowEnd, aDestArea.nTab,
595 [ # # ]: 0 : IDF_ALL, false, pUndoDoc );
596 : :
597 : : // alten Ausgabebereich
598 [ # # ]: 0 : if (pDestData)
599 [ # # ]: 0 : aDocument.CopyToDocument( aOldDest, IDF_ALL, false, pUndoDoc );
600 : :
601 [ # # ]: 0 : GetUndoManager()->AddUndoAction(
602 : : new ScUndoConsolidate( this, aDestArea, rParam, pUndoDoc,
603 [ # # ][ # # ]: 0 : false, 0, NULL, pUndoData ) );
[ # # ]
604 : : }
605 : : }
606 : :
607 [ - + ]: 1 : if (pDestData) // Zielbereich loeschen / anpassen
608 : : {
609 [ # # ]: 0 : aDocument.DeleteAreaTab(aOldDest, IDF_CONTENTS);
610 : : pDestData->SetArea( rParam.nTab, rParam.nCol, rParam.nRow,
611 [ # # ]: 0 : rParam.nCol + nColSize - 1, rParam.nRow + nRowSize - 1 );
612 : 0 : pDestData->SetHeader( rParam.bByRow );
613 : : }
614 : :
615 [ + - ]: 1 : aData.OutputToDocument( &aDocument, rParam.nCol, rParam.nRow, rParam.nTab );
616 : :
617 : 1 : SCCOL nPaintStartCol = rParam.nCol;
618 : 1 : SCROW nPaintStartRow = rParam.nRow;
619 : 1 : SCCOL nPaintEndCol = nPaintStartCol + nColSize - 1;
620 : 1 : SCROW nPaintEndRow = nPaintStartRow + nRowSize - 1;
621 : 1 : sal_uInt16 nPaintFlags = PAINT_GRID;
622 [ - + ]: 1 : if (rParam.bByCol)
623 : 0 : ++nPaintEndRow;
624 [ - + ]: 1 : if (rParam.bByRow)
625 : 0 : ++nPaintEndCol;
626 [ - + ]: 1 : if (rParam.bReferenceData)
627 : : {
628 : 0 : nPaintStartCol = 0;
629 : 0 : nPaintEndCol = MAXCOL;
630 : 0 : nPaintEndRow = MAXROW;
631 : 0 : nPaintFlags |= PAINT_LEFT | PAINT_SIZE;
632 : : }
633 [ - + ]: 1 : if (pDestData)
634 : : {
635 [ # # ]: 0 : if ( aOldDest.aEnd.Col() > nPaintEndCol )
636 : 0 : nPaintEndCol = aOldDest.aEnd.Col();
637 [ # # ]: 0 : if ( aOldDest.aEnd.Row() > nPaintEndRow )
638 : 0 : nPaintEndRow = aOldDest.aEnd.Row();
639 : : }
640 : : PostPaint( nPaintStartCol, nPaintStartRow, rParam.nTab,
641 [ + - ]: 1 : nPaintEndCol, nPaintEndRow, rParam.nTab, nPaintFlags );
642 [ + - ][ + - ]: 1 : aModificator.SetDocumentModified();
[ + - ][ + - ]
[ + - ]
643 : : }
644 : :
645 : 0 : void ScDocShell::UseScenario( SCTAB nTab, const String& rName, sal_Bool bRecord )
646 : : {
647 [ # # ]: 0 : if (!aDocument.IsScenario(nTab))
648 : : {
649 [ # # ]: 0 : SCTAB nTabCount = aDocument.GetTableCount();
650 : 0 : SCTAB nSrcTab = SCTAB_MAX;
651 : 0 : SCTAB nEndTab = nTab;
652 : 0 : rtl::OUString aCompare;
653 [ # # ][ # # ]: 0 : while ( nEndTab+1 < nTabCount && aDocument.IsScenario(nEndTab+1) )
[ # # ][ # # ]
654 : : {
655 : 0 : ++nEndTab;
656 [ # # ]: 0 : if (nSrcTab > MAXTAB) // noch auf der Suche nach dem Szenario?
657 : : {
658 [ # # ]: 0 : aDocument.GetName( nEndTab, aCompare );
659 [ # # ][ # # ]: 0 : if (aCompare.equals(rName))
660 : 0 : nSrcTab = nEndTab; // gefunden
661 : : }
662 : : }
663 [ # # ]: 0 : if (ValidTab(nSrcTab))
664 : : {
665 [ # # ][ # # ]: 0 : if ( aDocument.TestCopyScenario( nSrcTab, nTab ) ) // Zellschutz testen
666 : : {
667 [ # # ]: 0 : ScDocShellModificator aModificator( *this );
668 [ # # ]: 0 : ScMarkData aScenMark;
669 [ # # ]: 0 : aDocument.MarkScenario( nSrcTab, nTab, aScenMark );
670 : 0 : ScRange aMultiRange;
671 [ # # ]: 0 : aScenMark.GetMultiMarkArea( aMultiRange );
672 : 0 : SCCOL nStartCol = aMultiRange.aStart.Col();
673 : 0 : SCROW nStartRow = aMultiRange.aStart.Row();
674 : 0 : SCCOL nEndCol = aMultiRange.aEnd.Col();
675 : 0 : SCROW nEndRow = aMultiRange.aEnd.Row();
676 : :
677 [ # # ]: 0 : if (bRecord)
678 : : {
679 [ # # ][ # # ]: 0 : ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
680 [ # # ]: 0 : pUndoDoc->InitUndo( &aDocument, nTab,nEndTab ); // auch alle Szenarien
681 : : // angezeigte Tabelle:
682 : : aDocument.CopyToDocument( nStartCol,nStartRow,nTab,
683 [ # # ]: 0 : nEndCol,nEndRow,nTab, IDF_ALL,sal_True, pUndoDoc, &aScenMark );
684 : : // Szenarien
685 [ # # ]: 0 : for (SCTAB i=nTab+1; i<=nEndTab; i++)
686 : : {
687 [ # # ]: 0 : pUndoDoc->SetScenario( i, sal_True );
688 : 0 : rtl::OUString aComment;
689 : 0 : Color aColor;
690 : : sal_uInt16 nScenFlags;
691 [ # # ]: 0 : aDocument.GetScenarioData( i, aComment, aColor, nScenFlags );
692 [ # # ]: 0 : pUndoDoc->SetScenarioData( i, aComment, aColor, nScenFlags );
693 [ # # ]: 0 : sal_Bool bActive = aDocument.IsActiveScenario( i );
694 [ # # ]: 0 : pUndoDoc->SetActiveScenario( i, bActive );
695 : : // Bei Zurueckkopier-Szenarios auch Inhalte
696 [ # # ]: 0 : if ( nScenFlags & SC_SCENARIO_TWOWAY )
697 : : aDocument.CopyToDocument( 0,0,i, MAXCOL,MAXROW,i,
698 [ # # ]: 0 : IDF_ALL,false, pUndoDoc );
699 : 0 : }
700 : :
701 [ # # ]: 0 : GetUndoManager()->AddUndoAction(
702 : : new ScUndoUseScenario( this, aScenMark,
703 : : ScArea( nTab,nStartCol,nStartRow,nEndCol,nEndRow ),
704 [ # # ][ # # ]: 0 : pUndoDoc, rName ) );
[ # # ][ # # ]
705 : : }
706 : :
707 [ # # ]: 0 : aDocument.CopyScenario( nSrcTab, nTab );
708 [ # # ]: 0 : aDocument.SetDirty();
709 : :
710 : : // alles painten, weil in anderen Bereichen das aktive Szenario
711 : : // geaendert sein kann
712 : : //! nur, wenn sichtbare Rahmen vorhanden?
713 [ # # ]: 0 : PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PAINT_GRID );
714 [ # # ][ # # ]: 0 : aModificator.SetDocumentModified();
[ # # ]
715 : : }
716 : : else
717 : : {
718 : : InfoBox aBox(GetActiveDialogParent(),
719 [ # # ][ # # ]: 0 : ScGlobal::GetRscString( STR_PROTECTIONERR ) );
[ # # ]
720 [ # # ][ # # ]: 0 : aBox.Execute();
721 : : }
722 : : }
723 : : else
724 : : {
725 : : InfoBox aBox(GetActiveDialogParent(),
726 [ # # ][ # # ]: 0 : ScGlobal::GetRscString( STR_SCENARIO_NOTFOUND ) );
[ # # ]
727 [ # # ][ # # ]: 0 : aBox.Execute();
728 : 0 : }
729 : : }
730 : : else
731 : : {
732 : : OSL_FAIL( "UseScenario auf Szenario-Blatt" );
733 : : }
734 : 0 : }
735 : :
736 : 0 : void ScDocShell::ModifyScenario( SCTAB nTab, const String& rName, const String& rComment,
737 : : const Color& rColor, sal_uInt16 nFlags )
738 : : {
739 : : // Undo
740 : 0 : rtl::OUString aOldName;
741 [ # # ]: 0 : aDocument.GetName( nTab, aOldName );
742 : 0 : rtl::OUString aOldComment;
743 : 0 : Color aOldColor;
744 : : sal_uInt16 nOldFlags;
745 [ # # ]: 0 : aDocument.GetScenarioData( nTab, aOldComment, aOldColor, nOldFlags );
746 [ # # ]: 0 : GetUndoManager()->AddUndoAction(
747 : : new ScUndoScenarioFlags( this, nTab,
748 : : aOldName, rName, aOldComment, rComment,
749 [ # # ][ # # ]: 0 : aOldColor, rColor, nOldFlags, nFlags ) );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
750 : :
751 : : // ausfuehren
752 [ # # ]: 0 : ScDocShellModificator aModificator( *this );
753 [ # # ][ # # ]: 0 : aDocument.RenameTab( nTab, rName );
754 [ # # ][ # # ]: 0 : aDocument.SetScenarioData( nTab, rComment, rColor, nFlags );
755 [ # # ]: 0 : PostPaintGridAll();
756 [ # # ]: 0 : aModificator.SetDocumentModified();
757 : :
758 [ # # ][ # # ]: 0 : if (!aOldName.equals(rName))
759 [ # # ][ # # ]: 0 : SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
[ # # ][ # # ]
760 : :
761 [ # # ]: 0 : SfxBindings* pBindings = GetViewBindings();
762 [ # # ]: 0 : if (pBindings)
763 [ # # ][ # # ]: 0 : pBindings->Invalidate( SID_SELECT_SCENARIO );
764 : 0 : }
765 : :
766 : 1 : SCTAB ScDocShell::MakeScenario( SCTAB nTab, const String& rName, const String& rComment,
767 : : const Color& rColor, sal_uInt16 nFlags,
768 : : ScMarkData& rMark, sal_Bool bRecord )
769 : : {
770 : 1 : rMark.MarkToMulti();
771 [ + - ]: 1 : if (rMark.IsMultiMarked())
772 : : {
773 : 1 : SCTAB nNewTab = nTab + 1;
774 [ + - ][ - + ]: 1 : while (aDocument.IsScenario(nNewTab))
775 : 0 : ++nNewTab;
776 : :
777 : 1 : sal_Bool bCopyAll = ( (nFlags & SC_SCENARIO_COPYALL) != 0 );
778 : 1 : const ScMarkData* pCopyMark = NULL;
779 [ + - ]: 1 : if (!bCopyAll)
780 : 1 : pCopyMark = &rMark;
781 : :
782 [ + - ]: 1 : ScDocShellModificator aModificator( *this );
783 : :
784 [ + - ]: 1 : if (bRecord)
785 [ + - ]: 1 : aDocument.BeginDrawUndo(); // drawing layer must do its own undo actions
786 : :
787 [ + - ][ + - ]: 1 : if (aDocument.CopyTab( nTab, nNewTab, pCopyMark ))
788 : : {
789 [ + - ]: 1 : if (bRecord)
790 : : {
791 [ + - ]: 1 : GetUndoManager()->AddUndoAction(
792 : : new ScUndoMakeScenario( this, nTab, nNewTab,
793 [ + - ][ + - ]: 1 : rName, rComment, rColor, nFlags, rMark ));
[ + - ]
794 : : }
795 : :
796 [ + - ][ + - ]: 1 : aDocument.RenameTab( nNewTab, rName, false ); // ohne Formel-Update
797 [ + - ]: 1 : aDocument.SetScenario( nNewTab, sal_True );
798 [ + - ][ + - ]: 1 : aDocument.SetScenarioData( nNewTab, rComment, rColor, nFlags );
799 : :
800 [ + - ]: 1 : ScMarkData aDestMark = rMark;
801 [ + - ]: 1 : aDestMark.SelectOneTable( nNewTab );
802 : :
803 : : //! auf Filter / Buttons / Merging testen !
804 : :
805 [ + - ][ + - ]: 1 : ScPatternAttr aProtPattern( aDocument.GetPool() );
806 [ + - ][ + - ]: 1 : aProtPattern.GetItemSet().Put( ScProtectionAttr( sal_True ) );
[ + - ]
807 [ + - ]: 1 : aDocument.ApplyPatternAreaTab( 0,0, MAXCOL,MAXROW, nNewTab, aProtPattern );
808 : :
809 [ + - ][ + - ]: 1 : ScPatternAttr aPattern( aDocument.GetPool() );
810 [ + - ][ + - ]: 1 : aPattern.GetItemSet().Put( ScMergeFlagAttr( SC_MF_SCENARIO ) );
[ + - ]
811 [ + - ][ + - ]: 1 : aPattern.GetItemSet().Put( ScProtectionAttr( sal_True ) );
[ + - ]
812 [ + - ]: 1 : aDocument.ApplySelectionPattern( aPattern, aDestMark );
813 : :
814 [ + - ]: 1 : if (!bCopyAll)
815 [ + - ]: 1 : aDocument.SetVisible( nNewTab, false );
816 : :
817 : : // dies ist dann das aktive Szenario
818 [ + - ]: 1 : aDocument.CopyScenario( nNewTab, nTab, sal_True ); // sal_True - nicht aus Szenario kopieren
819 : :
820 [ + - ]: 1 : if (nFlags & SC_SCENARIO_SHOWFRAME)
821 [ + - ]: 1 : PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PAINT_GRID ); // Rahmen painten
822 [ + - ]: 1 : PostPaintExtras(); // Tabellenreiter
823 [ + - ]: 1 : aModificator.SetDocumentModified();
824 : :
825 [ + - ][ + - ]: 1 : SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
[ + - ][ + - ]
826 : :
827 [ + - ][ + - ]: 1 : return nNewTab;
[ + - ]
828 [ + - ][ - + ]: 1 : }
829 : : }
830 : 1 : return nTab;
831 : : }
832 : :
833 : 2 : sal_uLong ScDocShell::TransferTab( ScDocShell& rSrcDocShell, SCTAB nSrcPos,
834 : : SCTAB nDestPos, sal_Bool bInsertNew,
835 : : sal_Bool bNotifyAndPaint )
836 : : {
837 : 2 : ScDocument* pSrcDoc = rSrcDocShell.GetDocument();
838 : :
839 : : // set the transfered area to the copyparam to make adjusting formulas possible
840 [ + - ]: 2 : ScClipParam aParam;
841 : 2 : ScRange aRange(0, 0, nSrcPos, MAXCOL, MAXROW, nSrcPos);
842 [ + - ]: 2 : aParam.maRanges.Append(aRange);
843 [ + - ]: 2 : pSrcDoc->SetClipParam(aParam);
844 : :
845 : : sal_uLong nErrVal = aDocument.TransferTab( pSrcDoc, nSrcPos, nDestPos,
846 [ + - ]: 2 : bInsertNew ); // no insert
847 : :
848 : : // TransferTab doesn't copy drawing objects with bInsertNew=FALSE
849 [ + - ][ - + ]: 2 : if ( nErrVal > 0 && !bInsertNew)
850 [ # # ]: 0 : aDocument.TransferDrawPage( pSrcDoc, nSrcPos, nDestPos );
851 : :
852 [ + - ][ + - ]: 2 : if(nErrVal>0 && pSrcDoc->IsScenario( nSrcPos ))
[ - + ][ - + ]
853 : : {
854 : 0 : rtl::OUString aComment;
855 : 0 : Color aColor;
856 : : sal_uInt16 nFlags;
857 : :
858 [ # # ]: 0 : pSrcDoc->GetScenarioData( nSrcPos, aComment,aColor, nFlags);
859 [ # # ]: 0 : aDocument.SetScenario(nDestPos,true);
860 [ # # ]: 0 : aDocument.SetScenarioData(nDestPos,aComment,aColor,nFlags);
861 [ # # ]: 0 : sal_Bool bActive = pSrcDoc->IsActiveScenario(nSrcPos);
862 [ # # ]: 0 : aDocument.SetActiveScenario(nDestPos, bActive );
863 : :
864 [ # # ]: 0 : sal_Bool bVisible=pSrcDoc->IsVisible(nSrcPos);
865 [ # # ]: 0 : aDocument.SetVisible(nDestPos,bVisible );
866 : :
867 : : }
868 : :
869 [ + - ][ + - ]: 2 : if ( nErrVal > 0 && pSrcDoc->IsTabProtected( nSrcPos ) )
[ - + ][ - + ]
870 [ # # ][ # # ]: 0 : aDocument.SetTabProtection(nDestPos, pSrcDoc->GetTabProtection(nSrcPos));
871 [ + - ]: 2 : if ( bNotifyAndPaint )
872 : : {
873 [ + - ][ + - ]: 2 : Broadcast( ScTablesHint( SC_TAB_INSERTED, nDestPos ) );
[ + - ]
874 [ + - ]: 2 : PostPaintExtras();
875 [ + - ]: 2 : PostPaintGridAll();
876 : : }
877 [ + - ]: 2 : return nErrVal;
878 : : }
879 : :
880 : 0 : sal_Bool ScDocShell::MoveTable( SCTAB nSrcTab, SCTAB nDestTab, sal_Bool bCopy, sal_Bool bRecord )
881 : : {
882 [ # # ]: 0 : ScDocShellModificator aModificator( *this );
883 : :
884 : : // #i92477# be consistent with ScDocFunc::InsertTable: any index past the last sheet means "append"
885 : : // #i101139# nDestTab must be the target position, not APPEND (for CopyTabProtection etc.)
886 [ # # ][ # # ]: 0 : if ( nDestTab >= aDocument.GetTableCount() )
887 [ # # ]: 0 : nDestTab = aDocument.GetTableCount();
888 : :
889 [ # # ]: 0 : if (bCopy)
890 : : {
891 [ # # ]: 0 : if (bRecord)
892 [ # # ]: 0 : aDocument.BeginDrawUndo(); // drawing layer must do its own undo actions
893 : :
894 : 0 : rtl::OUString sSrcCodeName;
895 [ # # ]: 0 : aDocument.GetCodeName( nSrcTab, sSrcCodeName );
896 [ # # ][ # # ]: 0 : if (!aDocument.CopyTab( nSrcTab, nDestTab ))
897 : : {
898 : : //! EndDrawUndo?
899 : 0 : return false;
900 : : }
901 : : else
902 : : {
903 : 0 : SCTAB nAdjSource = nSrcTab;
904 [ # # ]: 0 : if ( nDestTab <= nSrcTab )
905 : 0 : ++nAdjSource; // new position of source table after CopyTab
906 : :
907 [ # # ][ # # ]: 0 : if ( aDocument.IsTabProtected( nAdjSource ) )
908 [ # # ]: 0 : aDocument.CopyTabProtection(nAdjSource, nDestTab);
909 : :
910 [ # # ]: 0 : if (bRecord)
911 : : {
912 : : SAL_WNODEPRECATED_DECLARATIONS_PUSH
913 [ # # ][ # # ]: 0 : auto_ptr< vector<SCTAB> > pSrcList(new vector<SCTAB>(1, nSrcTab));
914 [ # # ][ # # ]: 0 : auto_ptr< vector<SCTAB> > pDestList(new vector<SCTAB>(1, nDestTab));
915 : : SAL_WNODEPRECATED_DECLARATIONS_POP
916 [ # # ]: 0 : GetUndoManager()->AddUndoAction(
917 [ # # ][ # # ]: 0 : new ScUndoCopyTab(this, pSrcList.release(), pDestList.release()));
[ # # ][ # # ]
[ # # ]
918 : : }
919 : :
920 [ # # ]: 0 : sal_Bool bVbaEnabled = aDocument.IsInVBAMode();
921 [ # # ]: 0 : if ( bVbaEnabled )
922 : : {
923 [ # # ]: 0 : String aLibName( RTL_CONSTASCII_USTRINGPARAM( "Standard" ) );
924 [ # # ]: 0 : Reference< XLibraryContainer > xLibContainer = GetBasicContainer();
925 [ # # ]: 0 : Reference< XVBACompatibility > xVBACompat( xLibContainer, UNO_QUERY );
926 : :
927 [ # # ]: 0 : if ( xVBACompat.is() )
928 : : {
929 [ # # ][ # # ]: 0 : aLibName = xVBACompat->getProjectName();
[ # # ]
930 : : }
931 : :
932 : 0 : SCTAB nTabToUse = nDestTab;
933 [ # # ]: 0 : if ( nDestTab == SC_TAB_APPEND )
934 : 0 : nTabToUse = aDocument.GetMaxTableNumber() - 1;
935 : 0 : rtl::OUString sCodeName;
936 : 0 : rtl::OUString sSource;
937 : : try
938 : : {
939 : 0 : Reference< XNameContainer > xLib;
940 [ # # ]: 0 : if( xLibContainer.is() )
941 : : {
942 [ # # ][ # # ]: 0 : com::sun::star::uno::Any aLibAny = xLibContainer->getByName( aLibName );
[ # # ]
943 [ # # ]: 0 : aLibAny >>= xLib;
944 : : }
945 [ # # ]: 0 : if( xLib.is() )
946 : : {
947 [ # # ][ # # ]: 0 : xLib->getByName( sSrcCodeName ) >>= sSource;
948 [ # # ]: 0 : }
949 : : }
950 [ # # ]: 0 : catch ( const com::sun::star::uno::Exception& )
951 : : {
952 : : }
953 [ # # ][ # # ]: 0 : VBA_InsertModule( aDocument, nTabToUse, sCodeName, sSource );
954 : : }
955 : : }
956 [ # # ][ # # ]: 0 : Broadcast( ScTablesHint( SC_TAB_COPIED, nSrcTab, nDestTab ) );
[ # # ][ # # ]
957 : : }
958 : : else
959 : : {
960 [ # # ]: 0 : if ( aDocument.GetChangeTrack() )
961 : 0 : return false;
962 : :
963 [ # # ][ # # ]: 0 : if ( nSrcTab<nDestTab && nDestTab!=SC_TAB_APPEND )
964 : 0 : nDestTab--;
965 : :
966 [ # # ]: 0 : if ( nSrcTab == nDestTab )
967 : : {
968 : : //! allow only for api calls?
969 : 0 : return sal_True; // nothing to do, but valid
970 : : }
971 : :
972 : : ScProgress* pProgress = new ScProgress(this, ScGlobal::GetRscString(STR_UNDO_MOVE_TAB),
973 [ # # ][ # # ]: 0 : aDocument.GetCodeCount());
[ # # ][ # # ]
974 [ # # ]: 0 : bool bDone = aDocument.MoveTab( nSrcTab, nDestTab, pProgress );
975 [ # # ][ # # ]: 0 : delete pProgress;
976 [ # # ]: 0 : if (!bDone)
977 : : {
978 : 0 : return false;
979 : : }
980 [ # # ]: 0 : else if (bRecord)
981 : : {
982 : : SAL_WNODEPRECATED_DECLARATIONS_PUSH
983 [ # # ][ # # ]: 0 : auto_ptr< vector<SCTAB> > pSrcList(new vector<SCTAB>(1, nSrcTab));
984 [ # # ][ # # ]: 0 : auto_ptr< vector<SCTAB> > pDestList(new vector<SCTAB>(1, nDestTab));
985 : : SAL_WNODEPRECATED_DECLARATIONS_POP
986 [ # # ]: 0 : GetUndoManager()->AddUndoAction(
987 [ # # ][ # # ]: 0 : new ScUndoMoveTab(this, pSrcList.release(), pDestList.release()));
[ # # ][ # # ]
[ # # ]
988 : : }
989 : :
990 [ # # ][ # # ]: 0 : Broadcast( ScTablesHint( SC_TAB_MOVED, nSrcTab, nDestTab ) );
[ # # ]
991 : : }
992 : :
993 [ # # ]: 0 : PostPaintGridAll();
994 [ # # ]: 0 : PostPaintExtras();
995 [ # # ]: 0 : aModificator.SetDocumentModified();
996 [ # # ][ # # ]: 0 : SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
[ # # ][ # # ]
997 : :
998 [ # # ]: 0 : return sal_True;
999 : : }
1000 : :
1001 : :
1002 : 0 : IMPL_LINK( ScDocShell, RefreshDBDataHdl, ScRefreshTimer*, pRefreshTimer )
1003 : : {
1004 : 0 : ScDBDocFunc aFunc(*this);
1005 : :
1006 : 0 : sal_Bool bContinue = sal_True;
1007 : 0 : ScDBData* pDBData = static_cast<ScDBData*>(pRefreshTimer);
1008 [ # # ]: 0 : ScImportParam aImportParam;
1009 [ # # ]: 0 : pDBData->GetImportParam( aImportParam );
1010 [ # # ][ # # ]: 0 : if (aImportParam.bImport && !pDBData->HasImportSelection())
[ # # ]
1011 : : {
1012 : 0 : ScRange aRange;
1013 [ # # ]: 0 : pDBData->GetArea( aRange );
1014 [ # # ]: 0 : bContinue = aFunc.DoImport( aRange.aStart.Tab(), aImportParam, NULL, true, false ); //! Api-Flag as parameter
1015 : : // internal operations (sort, query, subtotal) only if no error
1016 [ # # ]: 0 : if (bContinue)
1017 : : {
1018 [ # # ]: 0 : aFunc.RepeatDB( pDBData->GetName(), sal_True, sal_True );
1019 [ # # ]: 0 : RefreshPivotTables(aRange);
1020 : : }
1021 : : }
1022 : :
1023 [ # # ]: 0 : return bContinue != 0;
1024 [ + - ][ + - ]: 153 : }
1025 : :
1026 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|