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