diff options
Diffstat (limited to 'sc')
60 files changed, 1541 insertions, 1007 deletions
diff --git a/sc/0001-add-unit-test-for-ScDocument-MoveTab.patch b/sc/0001-add-unit-test-for-ScDocument-MoveTab.patch new file mode 100644 index 000000000000..005e6e5089ed --- /dev/null +++ b/sc/0001-add-unit-test-for-ScDocument-MoveTab.patch @@ -0,0 +1,90 @@ +From e8c376c207e89f0b6155e4bbcd0f46421db116ea Mon Sep 17 00:00:00 2001 +From: Markus Mohrhard <markus.mohrhard@googlemail.com> +Date: Thu, 26 May 2011 19:12:43 +0200 +Subject: [PATCH] add unit test for ScDocument::MoveTab + +this unit test is disabled for now because there is a problem with ScProgress in ScDocument::MoveTab during unit tests +--- + sc/qa/unit/ucalc.cxx | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 files changed, 52 insertions(+), 0 deletions(-) + +diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx +index a55fbbf..c43eb01 100644 +--- a/sc/qa/unit/ucalc.cxx ++++ b/sc/qa/unit/ucalc.cxx +@@ -236,6 +236,7 @@ public: + void testDataPilot(); + void testDataPilotFilters(); + void testSheetCopy(); ++ void testSheetMove(); + void testExternalRef(); + void testDataArea(); + +@@ -276,6 +277,9 @@ public: + CPPUNIT_TEST(testDataPilot); + CPPUNIT_TEST(testDataPilotFilters); + CPPUNIT_TEST(testSheetCopy); ++#if 0 // Disabled, first problem with ScProgress in ScDocument::MoveTab must be solved ++ CPPUNIT_TEST(testSheetMove); ++#endif + CPPUNIT_TEST(testExternalRef); + CPPUNIT_TEST(testDataArea); + CPPUNIT_TEST(testGraphicsInGroup); +@@ -1238,6 +1242,54 @@ void Test::testSheetCopy() + CPPUNIT_ASSERT_MESSAGE("rows 5 - 10 should be hidden", bHidden && nRow1 == 5 && nRow2 == 10); + bHidden = m_pDoc->RowHidden(11, 1, &nRow1, &nRow2); + CPPUNIT_ASSERT_MESSAGE("rows 11 - maxrow should be visible", !bHidden && nRow1 == 11 && nRow2 == MAXROW); ++ m_pDoc->DeleteTab(1); ++ m_pDoc->DeleteTab(0); ++} ++ ++void Test::testSheetMove() ++{ ++ OUString aTabName(RTL_CONSTASCII_USTRINGPARAM("TestTab1")); ++ m_pDoc->InsertTab(0, aTabName); ++ CPPUNIT_ASSERT_MESSAGE("document should have one sheet to begin with.", m_pDoc->GetTableCount() == 1); ++ SCROW nRow1, nRow2; ++ bool bHidden = m_pDoc->RowHidden(0, 0, &nRow1, &nRow2); ++ CPPUNIT_ASSERT_MESSAGE("new sheet should have all rows visible", !bHidden && nRow1 == 0 && nRow2 == MAXROW); ++ ++ //test if inserting before another sheet works ++ m_pDoc->InsertTab(0, OUString(RTL_CONSTASCII_USTRINGPARAM("TestTab2"))); ++ CPPUNIT_ASSERT_MESSAGE("document should have two sheets", m_pDoc->GetTableCount() == 2); ++ bHidden = m_pDoc->RowHidden(0, 0, &nRow1, &nRow2); ++ CPPUNIT_ASSERT_MESSAGE("new sheet should have all rows visible", !bHidden && nRow1 == 0 && nRow2 == MAXROW); ++ ++ // Move and test the result. ++ m_pDoc->MoveTab(0, 1); ++ CPPUNIT_ASSERT_MESSAGE("document now should have two sheets.", m_pDoc->GetTableCount() == 2); ++ bHidden = m_pDoc->RowHidden(0, 1, &nRow1, &nRow2); ++ CPPUNIT_ASSERT_MESSAGE("copied sheet should also have all rows visible as the original.", !bHidden && nRow1 == 0 && nRow2 == MAXROW); ++ String aName; ++ m_pDoc->GetName(0, aName); ++ CPPUNIT_ASSERT_MESSAGE("sheets should have changed places", aName.EqualsAscii("TestTab1")); ++ ++ m_pDoc->SetRowHidden(5, 10, 0, true); ++ bHidden = m_pDoc->RowHidden(0, 0, &nRow1, &nRow2); ++ CPPUNIT_ASSERT_MESSAGE("rows 0 - 4 should be visible", !bHidden && nRow1 == 0 && nRow2 == 4); ++ bHidden = m_pDoc->RowHidden(5, 0, &nRow1, &nRow2); ++ CPPUNIT_ASSERT_MESSAGE("rows 5 - 10 should be hidden", bHidden && nRow1 == 5 && nRow2 == 10); ++ bHidden = m_pDoc->RowHidden(11, 0, &nRow1, &nRow2); ++ CPPUNIT_ASSERT_MESSAGE("rows 11 - maxrow should be visible", !bHidden && nRow1 == 11 && nRow2 == MAXROW); ++ ++ // Move the sheet once again. ++ m_pDoc->MoveTab(1, 0); ++ CPPUNIT_ASSERT_MESSAGE("document now should have two sheets.", m_pDoc->GetTableCount() == 2); ++ bHidden = m_pDoc->RowHidden(0, 1, &nRow1, &nRow2); ++ CPPUNIT_ASSERT_MESSAGE("rows 0 - 4 should be visible", !bHidden && nRow1 == 0 && nRow2 == 4); ++ bHidden = m_pDoc->RowHidden(5, 1, &nRow1, &nRow2); ++ CPPUNIT_ASSERT_MESSAGE("rows 5 - 10 should be hidden", bHidden && nRow1 == 5 && nRow2 == 10); ++ bHidden = m_pDoc->RowHidden(11, 1, &nRow1, &nRow2); ++ CPPUNIT_ASSERT_MESSAGE("rows 11 - maxrow should be visible", !bHidden && nRow1 == 11 && nRow2 == MAXROW); ++ m_pDoc->GetName(0, aName); ++ CPPUNIT_ASSERT_MESSAGE("sheets should have changed places", aName.EqualsAscii("TestTab2")); ++ m_pDoc->DeleteTab(1); + m_pDoc->DeleteTab(0); + } + +-- +1.7.2.5 + diff --git a/sc/inc/address.hxx b/sc/inc/address.hxx index 8778354d2137..661120445643 100644 --- a/sc/inc/address.hxx +++ b/sc/inc/address.hxx @@ -91,7 +91,7 @@ const SCSIZE SCSIZE_MAX = ::std::numeric_limits<SCSIZE>::max(); // Count values const SCROW MAXROWCOUNT = MAXROWCOUNT_DEFINE; const SCCOL MAXCOLCOUNT = MAXCOLCOUNT_DEFINE; -const SCTAB MAXTABCOUNT = 1024; +const SCTAB MAXTABCOUNT = 32000; const SCCOLROW MAXCOLROWCOUNT = MAXROWCOUNT; // Maximum values const SCROW MAXROW = MAXROWCOUNT - 1; diff --git a/sc/inc/appoptio.hxx b/sc/inc/appoptio.hxx index 53cf1b968b1a..84fbc86801ec 100644 --- a/sc/inc/appoptio.hxx +++ b/sc/inc/appoptio.hxx @@ -46,8 +46,8 @@ public: void SetDefaults(); // Set or get the initial tab count for new spreadsheet, it is used by VBA API currently. - void SetTabCountInNewSpreadsheet( sal_Int16 nCount ) { nTabCountInNewSpreadsheet = nCount; } - sal_Int16 GetTabCountInNewSpreadsheet() const { return nTabCountInNewSpreadsheet; } + void SetTabCountInNewSpreadsheet( SCTAB nCount ) { nTabCountInNewSpreadsheet = nCount; } + SCTAB GetTabCountInNewSpreadsheet() const { return nTabCountInNewSpreadsheet; } void SetAppMetric( FieldUnit eUnit ) { eMetric = eUnit; } FieldUnit GetAppMetric() const { return eMetric; } @@ -92,7 +92,7 @@ public: const ScAppOptions& operator= ( const ScAppOptions& rOpt ); private: - sal_Int16 nTabCountInNewSpreadsheet; + SCTAB nTabCountInNewSpreadsheet; FieldUnit eMetric; sal_uInt16 nLRUFuncCount; sal_uInt16* pLRUList; diff --git a/sc/inc/cell.hxx b/sc/inc/cell.hxx index 26b20967b10d..e24154516d4d 100644 --- a/sc/inc/cell.hxx +++ b/sc/inc/cell.hxx @@ -442,9 +442,9 @@ public: void UpdateGrow( const ScRange& rArea, SCCOL nGrowX, SCROW nGrowY ); - void UpdateInsertTab(SCTAB nTable); + void UpdateInsertTab(SCTAB nTable, SCTAB nNewSheets = 1); void UpdateInsertTabAbs(SCTAB nTable); - sal_Bool UpdateDeleteTab(SCTAB nTable, sal_Bool bIsMove = false); + sal_Bool UpdateDeleteTab(SCTAB nTable, sal_Bool bIsMove = false, SCTAB nSheets = 1); void UpdateMoveTab(SCTAB nOldPos, SCTAB nNewPos, SCTAB nTabNo); void UpdateRenameTab(SCTAB nTable, const String& rName); sal_Bool TestTabRefAbs(SCTAB nTable); diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx index c06d4786a286..6ce3bed4639e 100644 --- a/sc/inc/column.hxx +++ b/sc/inc/column.hxx @@ -290,9 +290,9 @@ public: SCCOL nCol2, SCROW nRow2, SCTAB nTab2, SCsCOL nDx, SCsROW nDy, SCsTAB nDz, ScDocument* pUndoDoc = NULL ); - void UpdateInsertTab( SCTAB nTable); - void UpdateInsertTabOnlyCells( SCTAB nTable); - void UpdateDeleteTab( SCTAB nTable, bool bIsMove, ScColumn* pRefUndo = NULL ); + void UpdateInsertTab( SCTAB nTable, SCTAB nNewSheets = 1); + void UpdateInsertTabOnlyCells( SCTAB nTable, SCTAB nNewSheets = 1); + void UpdateDeleteTab( SCTAB nTable, bool bIsMove, ScColumn* pRefUndo = NULL, SCTAB nSheets = 1 ); void UpdateMoveTab(SCTAB nOldPos, SCTAB nNewPos, SCTAB nTabNo); void UpdateCompile( bool bForceIfNameInUse = false ); void UpdateTranspose( const ScRange& rSource, const ScAddress& rDest, diff --git a/sc/inc/compiler.hxx b/sc/inc/compiler.hxx index 81d6f7921c25..1e1d81e73912 100644 --- a/sc/inc/compiler.hxx +++ b/sc/inc/compiler.hxx @@ -444,8 +444,8 @@ public: const ScAddress& rOldPos, const ScRange&, SCsCOL nDx, SCsROW nDy, SCsTAB nDz ); - ScRangeData* UpdateInsertTab(SCTAB nTable, sal_Bool bIsName ); - ScRangeData* UpdateDeleteTab(SCTAB nTable, sal_Bool bIsMove, sal_Bool bIsName, sal_Bool& bCompile); + ScRangeData* UpdateInsertTab(SCTAB nTable, sal_Bool bIsName, SCTAB nNewSheets = 1 ); + ScRangeData* UpdateDeleteTab(SCTAB nTable, sal_Bool bIsMove, sal_Bool bIsName, sal_Bool& bCompile, SCTAB nSheets = 1); ScRangeData* UpdateMoveTab(SCTAB nOldPos, SCTAB nNewPos, sal_Bool bIsName ); bool HasModifiedRange(); diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index 4d1763b9b0e1..4ef0f9ff27b9 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -49,6 +49,7 @@ #include <map> #include <set> #include <list> +#include <vector> #include <boost/ptr_container/ptr_vector.hpp> namespace editeng { class SvxBorderLine; } @@ -185,6 +186,7 @@ namespace com { namespace sun { namespace star { #define SC_ASIANCOMPRESSION_INVALID 0xff #define SC_ASIANKERNING_INVALID 0xff +typedef ::std::vector<ScTable*> TableContainer; enum ScDocumentMode { @@ -239,7 +241,7 @@ private: ScConditionalFormatList* pCondFormList; // conditional formats ScValidationDataList* pValidationList; // validity SvNumberFormatterIndexTable* pFormatExchangeList; // for application of number formats - ScTable* pTab[MAXTABCOUNT]; + ::std::vector<ScTable*> pTab; mutable ScRangeName* pRangeName; ScDBCollection* pDBCollection; ScDPCollection* pDPCollection; @@ -470,7 +472,7 @@ public: SC_DLLPUBLIC ScRangeName* GetRangeName() const; void SetRangeName(SCTAB nTab, ScRangeName* pNew); void SetRangeName( ScRangeName* pNewRangeName ); - SCTAB GetMaxTableNumber() { return nMaxTableNumber; } + SCTAB GetMaxTableNumber() { return static_cast<SCTAB>(pTab.size()) - 1; } void SetMaxTableNumber(SCTAB nNumber) { nMaxTableNumber = nNumber; } ScRangePairList* GetColNameRanges() { return &xColNameRanges; } @@ -533,7 +535,7 @@ public: SC_DLLPUBLIC void SetAnonymousDBData(SCTAB nTab, ScDBData* pDBData); SC_DLLPUBLIC ScDBData* GetAnonymousDBData(SCTAB nTab); - SC_DLLPUBLIC inline SCTAB GetTableCount() const { return nMaxTableNumber; } + SC_DLLPUBLIC inline SCTAB GetTableCount() const { return static_cast<SCTAB>(pTab.size()); } SvNumberFormatterIndexTable* GetFormatExchangeList() const { return pFormatExchangeList; } SC_DLLPUBLIC ScDocProtection* GetDocProtection() const; @@ -571,14 +573,19 @@ public: static SC_DLLPUBLIC bool ValidTabName( const String& rName ); SC_DLLPUBLIC sal_Bool ValidNewTabName( const String& rName ) const; + SC_DLLPUBLIC bool ValidNewTabName( const std::vector<String>& rName ) const; SC_DLLPUBLIC void CreateValidTabName(String& rName) const; + SC_DLLPUBLIC void CreateValidTabNames(std::vector<rtl::OUString>& aNames, SCTAB nCount) const; SC_DLLPUBLIC sal_Bool InsertTab( SCTAB nPos, const String& rName, sal_Bool bExternalDocument = false ); + SC_DLLPUBLIC bool InsertTabs( SCTAB nPos, const std::vector<rtl::OUString>& rNames, + bool bExternalDocument = false, bool bNamesValid = false ); + SC_DLLPUBLIC bool DeleteTabs( SCTAB nTab, SCTAB nSheets, ScDocument* pRefUndoDoc = NULL ); SC_DLLPUBLIC sal_Bool DeleteTab( SCTAB nTab, ScDocument* pRefUndoDoc = NULL ); SC_DLLPUBLIC sal_Bool RenameTab( SCTAB nTab, const String& rName, sal_Bool bUpdateRef = sal_True, sal_Bool bExternalDocument = false ); - sal_Bool MoveTab( SCTAB nOldPos, SCTAB nNewPos ); + sal_Bool MoveTab( SCTAB nOldPos, SCTAB nNewPos, ScProgress* pProgress = NULL ); sal_Bool CopyTab( SCTAB nOldPos, SCTAB nNewPos, const ScMarkData* pOnlyMarked = NULL ); SC_DLLPUBLIC sal_uLong TransferTab(ScDocument* pSrcDoc, SCTAB nSrcPos, SCTAB nDestPos, diff --git a/sc/inc/markdata.hxx b/sc/inc/markdata.hxx index 51b67d7cb560..0bd009a23d7f 100644 --- a/sc/inc/markdata.hxx +++ b/sc/inc/markdata.hxx @@ -33,6 +33,8 @@ #include <tools/solar.h> #include "scdllapi.h" +#include <set> + class ScMarkArray; class ScRangeList; @@ -47,7 +49,7 @@ private: ScRange aMarkRange; // area ScRange aMultiRange; // maximum area altogether ScMarkArray* pMultiSel; // multi selection - sal_Bool bTabMarked[MAXTABCOUNT];// table marked + ::std::set<SCTAB> maTabMarked; sal_Bool bMarked; // rectangle marked sal_Bool bMultiMarked; @@ -77,12 +79,13 @@ public: void SetAreaTab( SCTAB nTab ); - void SelectTable( SCTAB nTab, sal_Bool bNew ) { bTabMarked[nTab] = bNew; } - sal_Bool GetTableSelect( SCTAB nTab ) const { return bTabMarked[nTab]; } + void SelectTable( SCTAB nTab, bool bNew ); + bool GetTableSelect( SCTAB nTab ) const; void SelectOneTable( SCTAB nTab ); SCTAB GetSelectCount() const; SCTAB GetFirstSelected() const; + SCTAB GetLastSelected() const; void SetMarkNegative( sal_Bool bFlag ) { bMarkIsNeg = bFlag; } sal_Bool IsMarkNegative() const { return bMarkIsNeg; } diff --git a/sc/inc/rangenam.hxx b/sc/inc/rangenam.hxx index ebf2769e2baf..5d3ff4942e93 100644 --- a/sc/inc/rangenam.hxx +++ b/sc/inc/rangenam.hxx @@ -146,7 +146,7 @@ public: SC_DLLPUBLIC sal_Bool IsValidReference( ScRange& rRef ) const; sal_Bool IsRangeAtBlock( const ScRange& ) const; - void UpdateTabRef(SCTAB nOldTable, sal_uInt16 nFlag, SCTAB nNewTable); + void UpdateTabRef(SCTAB nOldTable, sal_uInt16 nFlag, SCTAB nNewTable, SCTAB nNewSheets); void TransferTabRef( SCTAB nOldTab, SCTAB nNewTab ); void ValidateTabRefs(); @@ -199,7 +199,7 @@ public: SC_DLLPUBLIC ScRangeData* findByIndex(sal_uInt16 i); void UpdateReference(UpdateRefMode eUpdateRefMode, const ScRange& rRange, SCsCOL nDx, SCsROW nDy, SCsTAB nDz); - void UpdateTabRef(SCTAB nTable, sal_uInt16 nFlag, SCTAB nNewTable = 0); + void UpdateTabRef(SCTAB nTable, sal_uInt16 nFlag, SCTAB nNewTable = 0, SCTAB nNewSheets = 1); void UpdateTranspose(const ScRange& rSource, const ScAddress& rDest); void UpdateGrow(const ScRange& rArea, SCCOL nGrowX, SCROW nGrowY); diff --git a/sc/inc/sheetdata.hxx b/sc/inc/sheetdata.hxx index b4790684ba05..8c6a2360a538 100644 --- a/sc/inc/sheetdata.hxx +++ b/sc/inc/sheetdata.hxx @@ -128,7 +128,7 @@ class ScSheetSaveData std::vector<bool> maBlocked; std::vector<ScStreamEntry> maStreamEntries; std::vector<ScStreamEntry> maSaveEntries; - sal_Int32 mnStartTab; + SCTAB mnStartTab; sal_Int32 mnStartOffset; ScNoteStyleEntry maPreviousNote; @@ -149,20 +149,20 @@ public: void AddTextStyle( const rtl::OUString& rName, const ScAddress& rCellPos, const ESelection& rSelection ); - void BlockSheet( sal_Int32 nTab ); - bool IsSheetBlocked( sal_Int32 nTab ) const; + void BlockSheet( SCTAB nTab ); + bool IsSheetBlocked( SCTAB nTab ) const; - void AddStreamPos( sal_Int32 nTab, sal_Int32 nStartOffset, sal_Int32 nEndOffset ); - void GetStreamPos( sal_Int32 nTab, sal_Int32& rStartOffset, sal_Int32& rEndOffset ) const; - bool HasStreamPos( sal_Int32 nTab ) const; + void AddStreamPos( SCTAB nTab, sal_Int32 nStartOffset, sal_Int32 nEndOffset ); + void GetStreamPos( SCTAB nTab, sal_Int32& rStartOffset, sal_Int32& rEndOffset ) const; + bool HasStreamPos( SCTAB nTab ) const; - void StartStreamPos( sal_Int32 nTab, sal_Int32 nStartOffset ); + void StartStreamPos( SCTAB nTab, sal_Int32 nStartOffset ); void EndStreamPos( sal_Int32 nEndOffset ); bool HasStartPos() const { return mnStartTab >= 0; } void ResetSaveEntries(); - void AddSavePos( sal_Int32 nTab, sal_Int32 nStartOffset, sal_Int32 nEndOffset ); + void AddSavePos( SCTAB nTab, sal_Int32 nStartOffset, sal_Int32 nEndOffset ); void UseSaveEntries(); void StoreInitialNamespaces( const SvXMLNamespaceMap& rNamespaces ); diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx index ce94873da422..b310e8c9b247 100644 --- a/sc/inc/table.hxx +++ b/sc/inc/table.hxx @@ -476,9 +476,9 @@ public: void UpdateGrow( const ScRange& rArea, SCCOL nGrowX, SCROW nGrowY ); - void UpdateInsertTab(SCTAB nTable); - void UpdateDeleteTab( SCTAB nTable, sal_Bool bIsMove, ScTable* pRefUndo = NULL ); - void UpdateMoveTab(SCTAB nOldPos, SCTAB nNewPos, SCTAB nTabNo, ScProgress& ); + void UpdateInsertTab(SCTAB nTable, SCTAB nNewSheets = 1); + void UpdateDeleteTab( SCTAB nTable, sal_Bool bIsMove, ScTable* pRefUndo = NULL, SCTAB nSheets = 1 ); + void UpdateMoveTab(SCTAB nOldPos, SCTAB nNewPos, SCTAB nTabNo, ScProgress* pProgress ); void UpdateCompile( sal_Bool bForceIfNameInUse = false ); void SetTabNo(SCTAB nNewTab); sal_Bool IsRangeNameInUse(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, diff --git a/sc/source/core/data/cell2.cxx b/sc/source/core/data/cell2.cxx index 7948676d3e9c..5c657e6051ce 100644 --- a/sc/source/core/data/cell2.cxx +++ b/sc/source/core/data/cell2.cxx @@ -1129,7 +1129,7 @@ bool ScFormulaCell::UpdateReference(UpdateRefMode eUpdateRefMode, return bCellStateChanged; } -void ScFormulaCell::UpdateInsertTab(SCTAB nTable) +void ScFormulaCell::UpdateInsertTab(SCTAB nTable, SCTAB nNewSheets) { sal_Bool bPosChanged = ( aPos.Tab() >= nTable ? sal_True : false ); pCode->Reset(); @@ -1142,7 +1142,7 @@ void ScFormulaCell::UpdateInsertTab(SCTAB nTable) ScRangeData* pRangeData; ScCompiler aComp(pDocument, aPos, *pCode); aComp.SetGrammar(pDocument->GetGrammar()); - pRangeData = aComp.UpdateInsertTab( nTable, false ); + pRangeData = aComp.UpdateInsertTab( nTable, false, nNewSheets ); if (pRangeData) // Shared Formula gegen echte Formel { // austauschen sal_Bool bRefChanged; @@ -1152,10 +1152,10 @@ void ScFormulaCell::UpdateInsertTab(SCTAB nTable) ScCompiler aComp2(pDocument, aPos, *pCode); aComp2.SetGrammar(pDocument->GetGrammar()); aComp2.MoveRelWrap(pRangeData->GetMaxCol(), pRangeData->GetMaxRow()); - aComp2.UpdateInsertTab( nTable, false ); + aComp2.UpdateInsertTab( nTable, false, nNewSheets ); // If the shared formula contained a named range/formula containing // an absolute reference to a sheet, those have to be readjusted. - aComp2.UpdateDeleteTab( nTable, false, sal_True, bRefChanged ); + aComp2.UpdateDeleteTab( nTable, false, sal_True, bRefChanged, nNewSheets ); bCompile = sal_True; } // kein StartListeningTo weil pTab[nTab] noch nicht existiert! @@ -1164,21 +1164,21 @@ void ScFormulaCell::UpdateInsertTab(SCTAB nTable) aPos.IncTab(); } -sal_Bool ScFormulaCell::UpdateDeleteTab(SCTAB nTable, sal_Bool bIsMove) +sal_Bool ScFormulaCell::UpdateDeleteTab(SCTAB nTable, sal_Bool bIsMove, SCTAB nSheets) { sal_Bool bRefChanged = false; - sal_Bool bPosChanged = ( aPos.Tab() > nTable ? sal_True : false ); + sal_Bool bPosChanged = ( aPos.Tab() > nTable + nSheets ? sal_True : false ); pCode->Reset(); if( pCode->GetNextReferenceRPN() && !pDocument->IsClipOrUndo() ) { EndListeningTo( pDocument ); // IncTab _nach_ EndListeningTo und _vor_ Compiler UpdateDeleteTab ! if ( bPosChanged ) - aPos.IncTab(-1); + aPos.IncTab(-1*nSheets); ScRangeData* pRangeData; ScCompiler aComp(pDocument, aPos, *pCode); aComp.SetGrammar(pDocument->GetGrammar()); - pRangeData = aComp.UpdateDeleteTab(nTable, bIsMove, false, bRefChanged); + pRangeData = aComp.UpdateDeleteTab(nTable, bIsMove, false, bRefChanged, nSheets); if (pRangeData) // Shared Formula gegen echte Formel { // austauschen pDocument->RemoveFromFormulaTree( this ); // update formula count @@ -1188,10 +1188,10 @@ sal_Bool ScFormulaCell::UpdateDeleteTab(SCTAB nTable, sal_Bool bIsMove) aComp2.SetGrammar(pDocument->GetGrammar()); aComp2.CompileTokenArray(); aComp2.MoveRelWrap(pRangeData->GetMaxCol(), pRangeData->GetMaxRow()); - aComp2.UpdateDeleteTab( nTable, false, false, bRefChanged ); + aComp2.UpdateDeleteTab( nTable, false, false, bRefChanged, nSheets ); // If the shared formula contained a named range/formula containing // an absolute reference to a sheet, those have to be readjusted. - aComp2.UpdateInsertTab( nTable,sal_True ); + aComp2.UpdateInsertTab( nTable,sal_True, nSheets ); // bRefChanged kann beim letzten UpdateDeleteTab zurueckgesetzt worden sein bRefChanged = sal_True; bCompile = sal_True; @@ -1199,7 +1199,7 @@ sal_Bool ScFormulaCell::UpdateDeleteTab(SCTAB nTable, sal_Bool bIsMove) // kein StartListeningTo weil pTab[nTab] noch nicht korrekt! } else if ( bPosChanged ) - aPos.IncTab(-1); + aPos.IncTab(-1*nSheets); return bRefChanged; } diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx index 6cd863afd560..680861723040 100644 --- a/sc/source/core/data/column.cxx +++ b/sc/source/core/data/column.cxx @@ -1723,16 +1723,19 @@ void ScColumn::UpdateGrow( const ScRange& rArea, SCCOL nGrowX, SCROW nGrowY ) } -void ScColumn::UpdateInsertTab( SCTAB nTable) +void ScColumn::UpdateInsertTab( SCTAB nTable, SCTAB nNewSheets ) { if (nTab >= nTable) - pAttrArray->SetTab(++nTab); + { + nTab += nNewSheets; + pAttrArray->SetTab(nTab); + } if( pItems ) - UpdateInsertTabOnlyCells( nTable ); + UpdateInsertTabOnlyCells( nTable, nNewSheets ); } -void ScColumn::UpdateInsertTabOnlyCells( SCTAB nTable) +void ScColumn::UpdateInsertTabOnlyCells( SCTAB nTable, SCTAB nNewSheets ) { if (pItems) for (SCSIZE i = 0; i < nCount; i++) @@ -1741,7 +1744,7 @@ void ScColumn::UpdateInsertTabOnlyCells( SCTAB nTable) if( pCell->GetCellType() == CELLTYPE_FORMULA) { SCROW nRow = pItems[i].nRow; - pCell->UpdateInsertTab(nTable); + pCell->UpdateInsertTab(nTable, nNewSheets); if ( nRow != pItems[i].nRow ) Search( nRow, i ); // Listener geloescht/eingefuegt? } @@ -1766,10 +1769,13 @@ void ScColumn::UpdateInsertTabAbs(SCTAB nTable) } -void ScColumn::UpdateDeleteTab( SCTAB nTable, bool bIsMove, ScColumn* pRefUndo ) +void ScColumn::UpdateDeleteTab( SCTAB nTable, bool bIsMove, ScColumn* pRefUndo, SCTAB nSheets ) { if (nTab > nTable) - pAttrArray->SetTab(--nTab); + { + nTab -= nSheets; + pAttrArray->SetTab(nTab); + } if (pItems) for (SCSIZE i = 0; i < nCount; i++) @@ -1782,7 +1788,7 @@ void ScColumn::UpdateDeleteTab( SCTAB nTable, bool bIsMove, ScColumn* pRefUndo ) back the formula cell while keeping the original note. */ ScBaseCell* pSave = pRefUndo ? pOld->CloneWithoutNote( *pDocument ) : 0; - bool bChanged = pOld->UpdateDeleteTab(nTable, bIsMove); + bool bChanged = pOld->UpdateDeleteTab(nTable, bIsMove, nSheets); if ( nRow != pItems[i].nRow ) Search( nRow, i ); // Listener geloescht/eingefuegt? diff --git a/sc/source/core/data/dociter.cxx b/sc/source/core/data/dociter.cxx index 4bb8299d8bc6..ef4ab7a3d2ec 100644 --- a/sc/source/core/data/dociter.cxx +++ b/sc/source/core/data/dociter.cxx @@ -74,8 +74,8 @@ ScDocumentIterator::ScDocumentIterator( ScDocument* pDocument, nEndTab( nEndTable ) { PutInOrder( nStartTab, nEndTab ); - if (!ValidTab(nStartTab)) nStartTab = MAXTAB; - if (!ValidTab(nEndTab)) nEndTab = MAXTAB; + if (!ValidTab(nStartTab)) nStartTab = pDoc->GetTableCount()-1; + if (!ValidTab(nEndTab)) nEndTab = pDoc->GetTableCount()-1; pDefPattern = pDoc->GetDefPattern(); @@ -94,7 +94,7 @@ ScDocumentIterator::~ScDocumentIterator() sal_Bool ScDocumentIterator::GetThisCol() { ScTable* pTab; - while ( (pTab = pDoc->pTab[nTab]) == NULL ) + while ( nTab < pDoc->GetTableCount() && (pTab = pDoc->pTab[nTab]) == NULL ) { if ( nTab == nEndTab ) { @@ -279,6 +279,10 @@ ScValueIterator::ScValueIterator( ScDocument* pDocument, const ScRange& rRange, sal_Bool ScValueIterator::GetThis(double& rValue, sal_uInt16& rErr) { + if (nTab >= pDoc->GetTableCount()) + { + OSL_FAIL("try to access out of index, FIX IT"); + } ScColumn* pCol = &(pDoc->pTab[nTab])->aCol[nCol]; for (;;) { @@ -402,7 +406,7 @@ sal_Bool ScValueIterator::GetThis(double& rValue, sal_uInt16& rErr) void ScValueIterator::GetCurNumFmtInfo( short& nType, sal_uLong& nIndex ) { - if (!bNumValid) + if (!bNumValid && nTab < pDoc->GetTableCount()) { const ScColumn* pCol = &(pDoc->pTab[nTab])->aCol[nCol]; nNumFmtIndex = pCol->GetNumberFormat( nRow ); @@ -439,6 +443,8 @@ sal_Bool ScValueIterator::GetFirst(double& rValue, sal_uInt16& rErr) nRow = nStartRow; nTab = nStartTab; + if (nTab >= pDoc->GetTableCount()) + OSL_FAIL("try to access index out of bounds, FIX IT"); ScColumn* pCol = &(pDoc->pTab[nTab])->aCol[nCol]; pCol->Search( nRow, nColRow ); @@ -462,29 +468,39 @@ ScDBQueryDataIterator::DataAccess::~DataAccess() SCROW ScDBQueryDataIterator::GetRowByColEntryIndex(ScDocument& rDoc, SCTAB nTab, SCCOL nCol, SCSIZE nColRow) { + if (nTab >= rDoc.GetTableCount()) + OSL_FAIL("try to access index out of bounds, FIX IT"); ScColumn* pCol = &rDoc.pTab[nTab]->aCol[nCol]; return pCol->pItems[nColRow].nRow; } ScBaseCell* ScDBQueryDataIterator::GetCellByColEntryIndex(ScDocument& rDoc, SCTAB nTab, SCCOL nCol, SCSIZE nColRow) { + if (nTab >= rDoc.GetTableCount()) + OSL_FAIL("try to access index out of bounds, FIX IT"); ScColumn* pCol = &rDoc.pTab[nTab]->aCol[nCol]; return pCol->pItems[nColRow].pCell; } ScAttrArray* ScDBQueryDataIterator::GetAttrArrayByCol(ScDocument& rDoc, SCTAB nTab, SCCOL nCol) { + if (nTab >= rDoc.GetTableCount()) + OSL_FAIL("try to access index out of bounds, FIX IT"); ScColumn* pCol = &rDoc.pTab[nTab]->aCol[nCol]; return pCol->pAttrArray; } bool ScDBQueryDataIterator::IsQueryValid(ScDocument& rDoc, const ScQueryParam& rParam, SCTAB nTab, SCROW nRow, ScBaseCell* pCell) { + if (nTab >= rDoc.GetTableCount()) + OSL_FAIL("try to access index out of bounds, FIX IT"); return rDoc.pTab[nTab]->ValidQuery(nRow, rParam, NULL, pCell); } SCSIZE ScDBQueryDataIterator::SearchColEntryIndex(ScDocument& rDoc, SCTAB nTab, SCROW nRow, SCCOL nCol) { + if (nTab >= rDoc.GetTableCount()) + OSL_FAIL("try to access index out of bounds, FIX IT"); ScColumn* pCol = &rDoc.pTab[nTab]->aCol[nCol]; SCSIZE nColRow; pCol->Search(nRow, nColRow); @@ -932,8 +948,8 @@ ScCellIterator::ScCellIterator( ScDocument* pDocument, if (!ValidCol(nEndCol)) nEndCol = MAXCOL; if (!ValidRow(nStartRow)) nStartRow = MAXROW; if (!ValidRow(nEndRow)) nEndRow = MAXROW; - if (!ValidTab(nStartTab)) nStartTab = MAXTAB; - if (!ValidTab(nEndTab)) nEndTab = MAXTAB; + if (!ValidTab(nStartTab)) nStartTab = pDoc->GetTableCount()-1; + if (!ValidTab(nEndTab)) nEndTab = pDoc->GetTableCount()-1; while (nEndTab>0 && !pDoc->pTab[nEndTab]) --nEndTab; // nur benutzte Tabellen @@ -974,8 +990,8 @@ ScCellIterator::ScCellIterator if (!ValidCol(nEndCol)) nEndCol = MAXCOL; if (!ValidRow(nStartRow)) nStartRow = MAXROW; if (!ValidRow(nEndRow)) nEndRow = MAXROW; - if (!ValidTab(nStartTab)) nStartTab = MAXTAB; - if (!ValidTab(nEndTab)) nEndTab = MAXTAB; + if (!ValidTab(nStartTab)) nStartTab = pDoc->GetTableCount()-1; + if (!ValidTab(nEndTab)) nEndTab = pDoc->GetTableCount()-1; while (nEndTab>0 && !pDoc->pTab[nEndTab]) --nEndTab; // nur benutzte Tabellen @@ -998,6 +1014,7 @@ ScCellIterator::ScCellIterator ScBaseCell* ScCellIterator::GetThis() { + ScColumn* pCol = &(pDoc->pTab[nTab])->aCol[nCol]; for ( ;; ) { @@ -1095,6 +1112,8 @@ ScQueryCellIterator::ScQueryCellIterator(ScDocument* pDocument, SCTAB nTable, ScBaseCell* ScQueryCellIterator::GetThis() { + if (nTab >= pDoc->GetTableCount()) + OSL_FAIL("try to access index out of bounds, FIX IT"); ScColumn* pCol = &(pDoc->pTab[nTab])->aCol[nCol]; const ScQueryEntry& rEntry = aParam.GetEntry(0); SCCOLROW nFirstQueryField = rEntry.nField; @@ -1192,6 +1211,8 @@ ScBaseCell* ScQueryCellIterator::GetThis() ScBaseCell* ScQueryCellIterator::GetFirst() { + if (nTab >= pDoc->GetTableCount()) + OSL_FAIL("try to access index out of bounds, FIX IT"); nCol = aParam.nCol1; nRow = aParam.nRow1; if (aParam.bHasHeader) @@ -1357,6 +1378,8 @@ sal_Bool ScQueryCellIterator::FindEqualOrSortedLastInRange( SCCOL& nFoundCol, ScBaseCell* ScQueryCellIterator::BinarySearch() { + if (nTab >= pDoc->GetTableCount()) + OSL_FAIL("try to access index out of bounds, FIX IT"); nCol = aParam.nCol1; ScColumn* pCol = &(pDoc->pTab[nTab])->aCol[nCol]; if (!pCol->nCount) @@ -1634,6 +1657,8 @@ ScHorizontalCellIterator::ScHorizontalCellIterator(ScDocument* pDocument, SCTAB nRow( nRow1 ), bMore( sal_True ) { + if (nTab >= pDoc->GetTableCount()) + OSL_FAIL("try to access index out of bounds, FIX IT"); SCCOL i; SCSIZE nIndex; @@ -1747,6 +1772,8 @@ ScHorizontalAttrIterator::ScHorizontalAttrIterator( ScDocument* pDocument, SCTAB nEndCol( nCol2 ), nEndRow( nRow2 ) { + if (nTab >= pDoc->GetTableCount()) + OSL_FAIL("try to access index out of bounds, FIX IT"); OSL_ENSURE( pDoc->pTab[nTab], "Tabelle nicht da" ); SCCOL i; @@ -1800,6 +1827,8 @@ ScHorizontalAttrIterator::~ScHorizontalAttrIterator() const ScPatternAttr* ScHorizontalAttrIterator::GetNext( SCCOL& rCol1, SCCOL& rCol2, SCROW& rRow ) { + if (nTab >= pDoc->GetTableCount()) + OSL_FAIL("try to access index out of bounds, FIX IT"); for (;;) { if (!bRowEmpty) @@ -1987,7 +2016,7 @@ ScDocAttrIterator::ScDocAttrIterator(ScDocument* pDocument, SCTAB nTable, nEndRow( nRow2 ), nCol( nCol1 ) { - if ( ValidTab(nTab) && pDoc->pTab[nTab] ) + if ( ValidTab(nTab) && nTab < pDoc->GetTableCount() && pDoc->pTab[nTab] ) pColIter = pDoc->pTab[nTab]->aCol[nCol].CreateAttrIterator( nStartRow, nEndRow ); else pColIter = NULL; @@ -2068,7 +2097,7 @@ void ScDocRowHeightUpdater::update() for (; itr != itrEnd; ++itr) { SCTAB nTab = itr->mnTab; - if (!ValidTab(nTab) || !mrDoc.pTab[nTab]) + if (!ValidTab(nTab) || nTab >= mrDoc.GetTableCount() || !mrDoc.pTab[nTab]) continue; ScFlatBoolRowSegments::RangeData aData; @@ -2089,7 +2118,7 @@ void ScDocRowHeightUpdater::update() void ScDocRowHeightUpdater::updateAll() { sal_uInt32 nCellCount = 0; - for (SCTAB nTab = 0; nTab <= MAXTAB; ++nTab) + for (SCTAB nTab = 0; nTab < mrDoc.GetTableCount(); ++nTab) { if (!ValidTab(nTab) || !mrDoc.pTab[nTab]) continue; @@ -2101,7 +2130,7 @@ void ScDocRowHeightUpdater::updateAll() Fraction aZoom(1, 1); sal_uLong nProgressStart = 0; - for (SCTAB nTab = 0; nTab <= MAXTAB; ++nTab) + for (SCTAB nTab = 0; nTab < mrDoc.GetTableCount(); ++nTab) { if (!ValidTab(nTab) || !mrDoc.pTab[nTab]) continue; @@ -2126,7 +2155,7 @@ ScAttrRectIterator::ScAttrRectIterator(ScDocument* pDocument, SCTAB nTable, nIterStartCol( nCol1 ), nIterEndCol( nCol1 ) { - if ( ValidTab(nTab) && pDoc->pTab[nTab] ) + if ( ValidTab(nTab) && nTab < pDoc->GetTableCount() && pDoc->pTab[nTab] ) { pColIter = pDoc->pTab[nTab]->aCol[nIterStartCol].CreateAttrIterator( nStartRow, nEndRow ); while ( nIterEndCol < nEndCol && diff --git a/sc/source/core/data/documen2.cxx b/sc/source/core/data/documen2.cxx index a1e630d42aa2..7c1b97a891d2 100644 --- a/sc/source/core/data/documen2.cxx +++ b/sc/source/core/data/documen2.cxx @@ -139,6 +139,7 @@ ScDocument::ScDocument( ScDocumentMode eMode, pCondFormList( NULL ), pValidationList( NULL ), pFormatExchangeList( NULL ), + pTab( 0 ), pRangeName(NULL), pDPCollection( NULL ), pLinkManager( NULL ), @@ -176,7 +177,6 @@ ScDocument::ScDocument( ScDocumentMode eMode, nInterpretLevel(0), nMacroInterpretLevel(0), nInterpreterTableOpLevel(0), - nMaxTableNumber( 0 ), nSrcVer( SC_CURRENT_VERSION ), nSrcMaxRow( MAXROW ), nFormulaTrackCount(0), @@ -235,22 +235,16 @@ ScDocument::ScDocument( ScDocumentMode eMode, xPoolHelper = new ScPoolHelper( this ); - pTab[0] = NULL; pBASM = new ScBroadcastAreaSlotMachine( this ); pChartListenerCollection = new ScChartListenerCollection( this ); pRefreshTimerControl = new ScRefreshTimerControl; } else { - pTab[0] = NULL; pBASM = NULL; pChartListenerCollection = NULL; pRefreshTimerControl = NULL; } - - for (SCTAB i=1; i<=MAXTAB; i++) - pTab[i] = NULL; - pDBCollection = new ScDBCollection(this); pSelectionAttr = NULL; pChartCollection = new ScChartCollection; @@ -562,15 +556,26 @@ void ScDocument::ResetClip( ScDocument* pSourceDoc, const ScMarkData* pMarks ) { InitClipPtrs(pSourceDoc); - for (SCTAB i = 0; i <= MAXTAB; i++) + for (SCTAB i = 0; i < static_cast<SCTAB>(pSourceDoc->pTab.size()); i++) if (pSourceDoc->pTab[i]) if (!pMarks || pMarks->GetTableSelect(i)) { String aString; pSourceDoc->pTab[i]->GetName(aString); - pTab[i] = new ScTable(this, i, aString); + if ( i < static_cast<SCTAB>(pTab.size()) ) + { + pTab[i] = new ScTable(this, i, aString); + + } + else + { + if( i > static_cast<SCTAB>(pTab.size()) ) + { + pTab.resize(i, NULL ); + } + pTab.push_back(new ScTable(this, i, aString)); + } pTab[i]->SetLayoutRTL( pSourceDoc->pTab[i]->IsLayoutRTL() ); - nMaxTableNumber = i+1; } } else @@ -584,12 +589,17 @@ void ScDocument::ResetClip( ScDocument* pSourceDoc, SCTAB nTab ) if (bIsClip) { InitClipPtrs(pSourceDoc); - + if (nTab >= static_cast<SCTAB>(pTab.size())) + { + if( nTab > static_cast<SCTAB>(pTab.size()) ) + { + pTab.resize(nTab+1, NULL ); + } + } pTab[nTab] = new ScTable(this, nTab, String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("baeh"))); - if (pSourceDoc->pTab[nTab]) + if (nTab < static_cast<SCTAB>(pSourceDoc->pTab.size()) && pSourceDoc->pTab[nTab]) pTab[nTab]->SetLayoutRTL( pSourceDoc->pTab[nTab]->IsLayoutRTL() ); - nMaxTableNumber = nTab+1; } else { @@ -610,16 +620,19 @@ void ScDocument::PutCell( SCCOL nCol, SCROW nRow, SCTAB nTab, { if (VALIDTAB(nTab)) { - if ( bForceTab && !pTab[nTab] ) + if ( bForceTab && ( nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab] ) ) { sal_Bool bExtras = !bIsUndo; // Spaltenbreiten, Zeilenhoehen, Flags - - pTab[nTab] = new ScTable(this, nTab, - String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("temp")), - bExtras, bExtras); + if ( nTab >= static_cast<SCTAB>(pTab.size()) ) + { + pTab.resize( nTab + 1, NULL ); + } + pTab.at(nTab) = new ScTable(this, nTab, + String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("temp")), + bExtras, bExtras); } - if (pTab[nTab]) + if ( nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->PutCell( nCol, nRow, nFormatIndex, pCell ); } } @@ -628,7 +641,7 @@ void ScDocument::PutCell( SCCOL nCol, SCROW nRow, SCTAB nTab, sal_Bool ScDocument::GetPrintArea( SCTAB nTab, SCCOL& rEndCol, SCROW& rEndRow, sal_Bool bNotes ) const { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) { sal_Bool bAny = pTab[nTab]->GetPrintArea( rEndCol, rEndRow, bNotes ); if (pDrawLayer) @@ -652,7 +665,7 @@ sal_Bool ScDocument::GetPrintArea( SCTAB nTab, SCCOL& rEndCol, SCROW& rEndRow, sal_Bool ScDocument::GetPrintAreaHor( SCTAB nTab, SCROW nStartRow, SCROW nEndRow, SCCOL& rEndCol, sal_Bool bNotes ) const { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) { sal_Bool bAny = pTab[nTab]->GetPrintAreaHor( nStartRow, nEndRow, rEndCol, bNotes ); if (pDrawLayer) @@ -674,7 +687,7 @@ sal_Bool ScDocument::GetPrintAreaHor( SCTAB nTab, SCROW nStartRow, SCROW nEndRow sal_Bool ScDocument::GetPrintAreaVer( SCTAB nTab, SCCOL nStartCol, SCCOL nEndCol, SCROW& rEndRow, sal_Bool bNotes ) const { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) { sal_Bool bAny = pTab[nTab]->GetPrintAreaVer( nStartCol, nEndCol, rEndRow, bNotes ); if (pDrawLayer) @@ -695,7 +708,7 @@ sal_Bool ScDocument::GetPrintAreaVer( SCTAB nTab, SCCOL nStartCol, SCCOL nEndCol sal_Bool ScDocument::GetDataStart( SCTAB nTab, SCCOL& rStartCol, SCROW& rStartRow ) const { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) { sal_Bool bAny = pTab[nTab]->GetDataStart( rStartCol, rStartRow ); if (pDrawLayer) @@ -716,23 +729,21 @@ sal_Bool ScDocument::GetDataStart( SCTAB nTab, SCCOL& rStartCol, SCROW& rStartRo return false; } -sal_Bool ScDocument::MoveTab( SCTAB nOldPos, SCTAB nNewPos ) +sal_Bool ScDocument::MoveTab( SCTAB nOldPos, SCTAB nNewPos, ScProgress* pProgress ) { if (nOldPos == nNewPos) return false; sal_Bool bValid = false; - if (VALIDTAB(nOldPos)) + SCTAB nTabCount = static_cast<SCTAB>(pTab.size()); + if (VALIDTAB(nOldPos) && nOldPos < nTabCount ) { if (pTab[nOldPos]) { - SCTAB nTabCount = GetTableCount(); if (nTabCount > 1) { sal_Bool bOldAutoCalc = GetAutoCalc(); SetAutoCalc( false ); // Mehrfachberechnungen vermeiden SetNoListening( sal_True ); - ScProgress* pProgress = new ScProgress( GetDocumentShell(), - ScGlobal::GetRscString(STR_UNDO_MOVE_TAB), GetCodeCount() ); - if (nNewPos == SC_TAB_APPEND) + if (nNewPos == SC_TAB_APPEND || nNewPos >= nTabCount) nNewPos = nTabCount-1; // Referenz-Updaterei @@ -761,24 +772,21 @@ sal_Bool ScDocument::MoveTab( SCTAB nOldPos, SCTAB nNewPos ) aSourceRange, 0,0,nDz ) ); ScTable* pSaveTab = pTab[nOldPos]; - SCTAB i; - for (i = nOldPos + 1; i < nTabCount; i++) - pTab[i - 1] = pTab[i]; - pTab[i-1] = NULL; - for (i = nTabCount - 1; i > nNewPos; i--) - pTab[i] = pTab[i - 1]; - pTab[nNewPos] = pSaveTab; - for (i = 0; i <= MAXTAB; i++) - if (pTab[i]) - pTab[i]->UpdateMoveTab( nOldPos, nNewPos, i, *pProgress ); - delete pProgress; // freimachen fuer evtl. andere - for (i = 0; i <= MAXTAB; i++) + pTab.erase(pTab.begin()+nOldPos); + pTab.insert(pTab.begin()+nNewPos, pSaveTab); + TableContainer::iterator it = pTab.begin(); + for (SCTAB i = 0; i < nTabCount; i++) if (pTab[i]) - pTab[i]->UpdateCompile(); + pTab[i]->UpdateMoveTab( nOldPos, nNewPos, i, pProgress ); + it = pTab.begin(); + for (; it != pTab.end(); ++it) + if (*it) + (*it)->UpdateCompile(); SetNoListening( false ); - for (i = 0; i <= MAXTAB; i++) - if (pTab[i]) - pTab[i]->StartAllListeners(); + it = pTab.begin(); + for (; it != pTab.end(); ++it) + if (*it) + (*it)->StartAllListeners(); // sheet names of references may not be valid until sheet is moved pChartListenerCollection->UpdateScheduledSeriesRanges(); SetDirty(); @@ -796,7 +804,8 @@ sal_Bool ScDocument::MoveTab( SCTAB nOldPos, SCTAB nNewPos ) sal_Bool ScDocument::CopyTab( SCTAB nOldPos, SCTAB nNewPos, const ScMarkData* pOnlyMarked ) { - if (SC_TAB_APPEND == nNewPos ) nNewPos = nMaxTableNumber; + if (SC_TAB_APPEND == nNewPos || nNewPos >= static_cast<SCTAB>(pTab.size())) + nNewPos = static_cast<SCTAB>(pTab.size()); String aName; GetName(nOldPos, aName); @@ -810,22 +819,21 @@ sal_Bool ScDocument::CopyTab( SCTAB nOldPos, SCTAB nNewPos, const ScMarkData* pO sal_Bool bValid; if (bPrefix) - bValid = ( ValidNewTabName(aName) && (nMaxTableNumber <= MAXTAB) ); + bValid = ( ValidNewTabName(aName) ); else - bValid = ( !GetTable( aName, nDummy ) && (nMaxTableNumber <= MAXTAB) ); + bValid = ( !GetTable( aName, nDummy ) ); sal_Bool bOldAutoCalc = GetAutoCalc(); SetAutoCalc( false ); // Mehrfachberechnungen vermeiden if (bValid) { - if (nNewPos == nMaxTableNumber) + if (nNewPos >= static_cast<SCTAB>(pTab.size())) { - pTab[nMaxTableNumber] = new ScTable(this, nMaxTableNumber, aName); - ++nMaxTableNumber; + pTab.push_back( new ScTable(this, static_cast<SCTAB>(pTab.size()), aName) ); } else { - if (VALIDTAB(nNewPos) && (nNewPos < nMaxTableNumber)) + if (VALIDTAB(nNewPos) && (nNewPos < static_cast<SCTAB>(pTab.size()))) { SetNoListening( sal_True ); @@ -846,23 +854,23 @@ sal_Bool ScDocument::CopyTab( SCTAB nOldPos, SCTAB nNewPos, const ScMarkData* pO pUnoBroadcaster->Broadcast( ScUpdateRefHint( URM_INSDEL, aRange, 0,0,1 ) ); SCTAB i; - for (i = 0; i <= MAXTAB; i++) - if (pTab[i] && i != nOldPos) - pTab[i]->UpdateInsertTab(nNewPos); - for (i = nMaxTableNumber; i > nNewPos; i--) + for (TableContainer::iterator it = pTab.begin(); it != pTab.end(); ++it) + if (*it && it != (pTab.begin() + nOldPos)) + (*it)->UpdateInsertTab(nNewPos); + pTab.push_back(NULL); + for (i = static_cast<SCTAB>(pTab.size())-1; i > nNewPos; i--) pTab[i] = pTab[i - 1]; if (nNewPos <= nOldPos) nOldPos++; pTab[nNewPos] = new ScTable(this, nNewPos, aName); - ++nMaxTableNumber; bValid = sal_True; - for (i = 0; i <= MAXTAB; i++) - if (pTab[i] && i != nOldPos && i != nNewPos) - pTab[i]->UpdateCompile(); + for (TableContainer::iterator it = pTab.begin(); it != pTab.end(); ++it) + if (*it && it != pTab.begin()+nOldPos && it != pTab.begin() + nNewPos) + (*it)->UpdateCompile(); SetNoListening( false ); - for (i = 0; i <= MAXTAB; i++) - if (pTab[i] && i != nOldPos && i != nNewPos) - pTab[i]->StartAllListeners(); + for (TableContainer::iterator it = pTab.begin(); it != pTab.end(); ++it) + if (*it && it != pTab.begin()+nOldPos && it != pTab.begin()+nNewPos) + (*it)->StartAllListeners(); // update conditional formats after table is inserted if ( pCondFormList ) @@ -932,7 +940,7 @@ sal_uLong ScDocument::TransferTab( ScDocument* pSrcDoc, SCTAB nSrcPos, } else // bestehende Tabelle ersetzen { - if (VALIDTAB(nDestPos) && pTab[nDestPos]) + if (VALIDTAB(nDestPos) && nDestPos < static_cast<SCTAB>(pTab.size()) && pTab[nDestPos]) { pTab[nDestPos]->DeleteArea( 0,0, MAXCOL,MAXROW, IDF_ALL ); } @@ -1125,7 +1133,7 @@ sal_uLong ScDocument::TransferTab( ScDocument* pSrcDoc, SCTAB nSrcPos, void ScDocument::SetError( SCCOL nCol, SCROW nRow, SCTAB nTab, const sal_uInt16 nError) { - if (VALIDTAB(nTab)) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size())) if (pTab[nTab]) pTab[nTab]->SetError( nCol, nRow, nError ); } diff --git a/sc/source/core/data/documen3.cxx b/sc/source/core/data/documen3.cxx index 2720ca16008f..d247a9383fe7 100644 --- a/sc/source/core/data/documen3.cxx +++ b/sc/source/core/data/documen3.cxx @@ -91,7 +91,7 @@ using namespace com::sun::star; void ScDocument::GetAllTabRangeNames(ScRangeName::TabNameCopyMap& rNames) const { ScRangeName::TabNameCopyMap aNames; - for (SCTAB i = 0; i <= MAXTAB; ++i) + for (SCTAB i = 0; i < static_cast<SCTAB>(pTab.size()); ++i) { if (!pTab[i]) // no more tables to iterate through. @@ -110,7 +110,7 @@ void ScDocument::GetAllTabRangeNames(ScRangeName::TabNameCopyMap& rNames) const void ScDocument::SetAllTabRangeNames(const ScRangeName::TabNameCopyMap& rNames) { // Remove all existing range names first. - for (SCTAB i = 0; i <= MAXTAB; ++i) + for (SCTAB i = 0; i < static_cast<SCTAB>(pTab.size()); ++i) { if (!pTab[i]) // no more tables to iterate through. @@ -126,7 +126,7 @@ void ScDocument::SetAllTabRangeNames(const ScRangeName::TabNameCopyMap& rNames) ScRangeName* ScDocument::GetRangeName(SCTAB nTab) const { - if (!ValidTab(nTab) || !pTab[nTab]) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab]) return NULL; return pTab[nTab]->GetRangeName(); @@ -141,7 +141,7 @@ ScRangeName* ScDocument::GetRangeName() const void ScDocument::SetRangeName(SCTAB nTab, ScRangeName* pNew) { - if (!ValidTab(nTab) || !pTab[nTab]) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab]) return; return pTab[nTab]->SetRangeName(pNew); @@ -326,19 +326,19 @@ void ScDocument::SetChartListenerCollection( void ScDocument::SetScenario( SCTAB nTab, sal_Bool bFlag ) { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) pTab[nTab]->SetScenario(bFlag); } sal_Bool ScDocument::IsScenario( SCTAB nTab ) const { - return ValidTab(nTab) && pTab[nTab] &&pTab[nTab]->IsScenario(); + return ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] &&pTab[nTab]->IsScenario(); } void ScDocument::SetScenarioData( SCTAB nTab, const String& rComment, const Color& rColor, sal_uInt16 nFlags ) { - if (ValidTab(nTab) && pTab[nTab] && pTab[nTab]->IsScenario()) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] && pTab[nTab]->IsScenario()) { pTab[nTab]->SetScenarioComment( rComment ); pTab[nTab]->SetScenarioColor( rColor ); @@ -348,20 +348,20 @@ void ScDocument::SetScenarioData( SCTAB nTab, const String& rComment, Color ScDocument::GetTabBgColor( SCTAB nTab ) const { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) return pTab[nTab]->GetTabBgColor(); return Color(COL_AUTO); } void ScDocument::SetTabBgColor( SCTAB nTab, const Color& rColor ) { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) pTab[nTab]->SetTabBgColor(rColor); } bool ScDocument::IsDefaultTabBgColor( SCTAB nTab ) const { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) return pTab[nTab]->GetTabBgColor() == COL_AUTO; return true; } @@ -369,7 +369,7 @@ bool ScDocument::IsDefaultTabBgColor( SCTAB nTab ) const void ScDocument::GetScenarioData( SCTAB nTab, String& rComment, Color& rColor, sal_uInt16& rFlags ) const { - if (ValidTab(nTab) && pTab[nTab] && pTab[nTab]->IsScenario()) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] && pTab[nTab]->IsScenario()) { pTab[nTab]->GetScenarioComment( rComment ); rColor = pTab[nTab]->GetScenarioColor(); @@ -379,13 +379,13 @@ void ScDocument::GetScenarioData( SCTAB nTab, String& rComment, void ScDocument::GetScenarioFlags( SCTAB nTab, sal_uInt16& rFlags ) const { - if (VALIDTAB(nTab) && pTab[nTab] && pTab[nTab]->IsScenario()) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] && pTab[nTab]->IsScenario()) rFlags = pTab[nTab]->GetScenarioFlags(); } sal_Bool ScDocument::IsLinked( SCTAB nTab ) const { - return ValidTab(nTab) && pTab[nTab] && pTab[nTab]->IsLinked(); + return ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] && pTab[nTab]->IsLinked(); // euqivalent to //if (ValidTab(nTab) && pTab[nTab]) // return pTab[nTab]->IsLinked(); @@ -409,42 +409,42 @@ void ScDocument::SetGrammar( formula::FormulaGrammar::Grammar eGram ) sal_Bool ScDocument::GetLinkMode( SCTAB nTab ) const { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) return pTab[nTab]->GetLinkMode(); return SC_LINK_NONE; } const String& ScDocument::GetLinkDoc( SCTAB nTab ) const { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) return pTab[nTab]->GetLinkDoc(); return EMPTY_STRING; } const String& ScDocument::GetLinkFlt( SCTAB nTab ) const { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) return pTab[nTab]->GetLinkFlt(); return EMPTY_STRING; } const String& ScDocument::GetLinkOpt( SCTAB nTab ) const { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) return pTab[nTab]->GetLinkOpt(); return EMPTY_STRING; } const String& ScDocument::GetLinkTab( SCTAB nTab ) const { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) return pTab[nTab]->GetLinkTab(); return EMPTY_STRING; } sal_uLong ScDocument::GetLinkRefreshDelay( SCTAB nTab ) const { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) return pTab[nTab]->GetLinkRefreshDelay(); return 0; } @@ -453,14 +453,14 @@ void ScDocument::SetLink( SCTAB nTab, sal_uInt8 nMode, const String& rDoc, const String& rFilter, const String& rOptions, const String& rTabName, sal_uLong nRefreshDelay ) { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) pTab[nTab]->SetLink( nMode, rDoc, rFilter, rOptions, rTabName, nRefreshDelay ); } sal_Bool ScDocument::HasLink( const String& rDoc, const String& rFilter, const String& rOptions ) const { - SCTAB nCount = GetTableCount(); + SCTAB nCount = static_cast<SCTAB>(pTab.size()); for (SCTAB i=0; i<nCount; i++) if (pTab[i]->IsLinked() && pTab[i]->GetLinkDoc() == rDoc @@ -561,20 +561,20 @@ ScFormulaParserPool& ScDocument::GetFormulaParserPool() const const ScSheetEvents* ScDocument::GetSheetEvents( SCTAB nTab ) const { - if (VALIDTAB(nTab) && pTab[nTab]) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) return pTab[nTab]->GetSheetEvents(); return NULL; } void ScDocument::SetSheetEvents( SCTAB nTab, const ScSheetEvents* pNew ) { - if (VALIDTAB(nTab) && pTab[nTab]) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) pTab[nTab]->SetSheetEvents( pNew ); } bool ScDocument::HasSheetEventScript( SCTAB nTab, sal_Int32 nEvent, bool bWithVbaEvents ) const { - if (pTab[nTab]) + if (nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) { // check if any event handler script has been configured const ScSheetEvents* pEvents = pTab[nTab]->GetSheetEvents(); @@ -598,7 +598,7 @@ bool ScDocument::HasSheetEventScript( SCTAB nTab, sal_Int32 nEvent, bool bWithVb bool ScDocument::HasAnySheetEventScript( sal_Int32 nEvent, bool bWithVbaEvents ) const { - for (SCTAB nTab = 0; nTab <= MAXTAB; nTab++) + for (SCTAB nTab = 0; nTab < static_cast<SCTAB>(pTab.size()); nTab++) if (HasSheetEventScript( nTab, nEvent, bWithVbaEvents )) return true; return false; @@ -606,7 +606,7 @@ bool ScDocument::HasAnySheetEventScript( sal_Int32 nEvent, bool bWithVbaEvents ) bool ScDocument::HasAnyCalcNotification() const { - for (SCTAB nTab = 0; nTab <= MAXTAB; nTab++) + for (SCTAB nTab = 0; nTab < static_cast<SCTAB>(pTab.size()); nTab++) if (pTab[nTab] && pTab[nTab]->GetCalcNotification()) return true; return false; @@ -614,7 +614,7 @@ bool ScDocument::HasAnyCalcNotification() const sal_Bool ScDocument::HasCalcNotification( SCTAB nTab ) const { - if (VALIDTAB(nTab) && pTab[nTab]) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) return pTab[nTab]->GetCalcNotification(); return false; } @@ -622,13 +622,13 @@ sal_Bool ScDocument::HasCalcNotification( SCTAB nTab ) const void ScDocument::SetCalcNotification( SCTAB nTab ) { // set only if not set before - if (VALIDTAB(nTab) && pTab[nTab] && !pTab[nTab]->GetCalcNotification()) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] && !pTab[nTab]->GetCalcNotification()) pTab[nTab]->SetCalcNotification(sal_True); } void ScDocument::ResetCalcNotifications() { - for (SCTAB nTab = 0; nTab <= MAXTAB; nTab++) + for (SCTAB nTab = 0; nTab < static_cast<SCTAB>(pTab.size()); nTab++) if (pTab[nTab] && pTab[nTab]->GetCalcNotification()) pTab[nTab]->SetCalcNotification(false); } @@ -637,7 +637,7 @@ ScOutlineTable* ScDocument::GetOutlineTable( SCTAB nTab, sal_Bool bCreate ) { ScOutlineTable* pVal = NULL; - if (VALIDTAB(nTab)) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size())) if (pTab[nTab]) { pVal = pTab[nTab]->GetOutlineTable(); @@ -654,30 +654,30 @@ ScOutlineTable* ScDocument::GetOutlineTable( SCTAB nTab, sal_Bool bCreate ) sal_Bool ScDocument::SetOutlineTable( SCTAB nTab, const ScOutlineTable* pNewOutline ) { - return VALIDTAB(nTab) && pTab[nTab] && pTab[nTab]->SetOutlineTable(pNewOutline); + return VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] && pTab[nTab]->SetOutlineTable(pNewOutline); } void ScDocument::DoAutoOutline( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, SCTAB nTab ) { - if (VALIDTAB(nTab) && pTab[nTab]) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) pTab[nTab]->DoAutoOutline( nStartCol, nStartRow, nEndCol, nEndRow ); } sal_Bool ScDocument::TestRemoveSubTotals( SCTAB nTab, const ScSubTotalParam& rParam ) { - return VALIDTAB(nTab) && pTab[nTab] && pTab[nTab]->TestRemoveSubTotals( rParam ); + return VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] && pTab[nTab]->TestRemoveSubTotals( rParam ); } void ScDocument::RemoveSubTotals( SCTAB nTab, ScSubTotalParam& rParam ) { - if ( VALIDTAB(nTab) && pTab[nTab] ) + if ( VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->RemoveSubTotals( rParam ); } sal_Bool ScDocument::DoSubTotals( SCTAB nTab, ScSubTotalParam& rParam ) { - return VALIDTAB(nTab) && pTab[nTab] && pTab[nTab]->DoSubTotals( rParam ); + return VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] && pTab[nTab]->DoSubTotals( rParam ); } sal_Bool ScDocument::HasSubTotalCells( const ScRange& rRange ) @@ -699,7 +699,7 @@ sal_Bool ScDocument::HasSubTotalCells( const ScRange& rRange ) void ScDocument::CopyUpdated( ScDocument* pPosDoc, ScDocument* pDestDoc ) { - SCTAB nCount = GetTableCount(); + SCTAB nCount = static_cast<SCTAB>(pTab.size()); for (SCTAB nTab=0; nTab<nCount; nTab++) if (pTab[nTab] && pPosDoc->pTab[nTab] && pDestDoc->pTab[nTab]) pTab[nTab]->CopyUpdated( pPosDoc->pTab[nTab], pDestDoc->pTab[nTab] ); @@ -707,7 +707,8 @@ void ScDocument::CopyUpdated( ScDocument* pPosDoc, ScDocument* pDestDoc ) void ScDocument::CopyScenario( SCTAB nSrcTab, SCTAB nDestTab, sal_Bool bNewScenario ) { - if (ValidTab(nSrcTab) && ValidTab(nDestTab) && pTab[nSrcTab] && pTab[nDestTab]) + if (ValidTab(nSrcTab) && ValidTab(nDestTab) && nSrcTab < static_cast<SCTAB>(pTab.size()) + && nDestTab < static_cast<SCTAB>(pTab.size()) && pTab[nSrcTab] && pTab[nDestTab]) { // Flags fuer aktive Szenarios richtig setzen // und aktuelle Werte in bisher aktive Szenarios zurueckschreiben @@ -716,7 +717,7 @@ void ScDocument::CopyScenario( SCTAB nSrcTab, SCTAB nDestTab, sal_Bool bNewScena // nDestTab ist die Zieltabelle for ( SCTAB nTab = nDestTab+1; - nTab<=MAXTAB && pTab[nTab] && pTab[nTab]->IsScenario(); + nTab< static_cast<SCTAB>(pTab.size()) && pTab[nTab] && pTab[nTab]->IsScenario(); nTab++ ) { if ( pTab[nTab]->IsActiveScenario() ) // auch wenn's dasselbe Szenario ist @@ -755,7 +756,7 @@ void ScDocument::MarkScenario( SCTAB nSrcTab, SCTAB nDestTab, ScMarkData& rDestM if (bResetMark) rDestMark.ResetMark(); - if (ValidTab(nSrcTab) && pTab[nSrcTab]) + if (ValidTab(nSrcTab) && nSrcTab < static_cast<SCTAB>(pTab.size()) && pTab[nSrcTab]) pTab[nSrcTab]->MarkScenarioIn( rDestMark, nNeededBits ); rDestMark.SetAreaTab( nDestTab ); @@ -763,12 +764,12 @@ void ScDocument::MarkScenario( SCTAB nSrcTab, SCTAB nDestTab, ScMarkData& rDestM sal_Bool ScDocument::HasScenarioRange( SCTAB nTab, const ScRange& rRange ) const { - return ValidTab(nTab) && pTab[nTab] && pTab[nTab]->HasScenarioRange( rRange ); + return ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] && pTab[nTab]->HasScenarioRange( rRange ); } const ScRangeList* ScDocument::GetScenarioRanges( SCTAB nTab ) const { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) return pTab[nTab]->GetScenarioRanges(); return NULL; @@ -776,18 +777,19 @@ const ScRangeList* ScDocument::GetScenarioRanges( SCTAB nTab ) const sal_Bool ScDocument::IsActiveScenario( SCTAB nTab ) const { - return ValidTab(nTab) && pTab[nTab] && pTab[nTab]->IsActiveScenario( ); + return ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] && pTab[nTab]->IsActiveScenario( ); } void ScDocument::SetActiveScenario( SCTAB nTab, sal_Bool bActive ) { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) pTab[nTab]->SetActiveScenario( bActive ); } sal_Bool ScDocument::TestCopyScenario( SCTAB nSrcTab, SCTAB nDestTab ) const { - if (ValidTab(nSrcTab) && ValidTab(nDestTab)) + if (ValidTab(nSrcTab) && nSrcTab < static_cast<SCTAB>(pTab.size()) + && nDestTab < static_cast<SCTAB>(pTab.size())&& ValidTab(nDestTab)) return pTab[nSrcTab]->TestCopyScenarioTo( pTab[nDestTab] ); OSL_FAIL("falsche Tabelle bei TestCopyScenario"); @@ -954,9 +956,9 @@ void ScDocument::UpdateReference( UpdateRefMode eUpdateRefMode, pUnoBroadcaster->Broadcast( ScUpdateRefHint( eUpdateRefMode, aRange, nDx, nDy, nDz ) ); i = 0; - iMax = MAXTAB; + iMax = static_cast<SCTAB>(pTab.size())-1; } - for ( ; i<=iMax; i++) + for ( ; i<=iMax && i < static_cast<SCTAB>(pTab.size()); i++) if (pTab[i]) pTab[i]->UpdateReference( eUpdateRefMode, nCol1, nRow1, nTab1, nCol2, nRow2, nTab2, @@ -1006,7 +1008,7 @@ void ScDocument::UpdateTranspose( const ScAddress& rDestPos, ScDocument* pClipDo ScAddress aDest = rDestPos; SCTAB nClipTab = 0; - for (SCTAB nDestTab=0; nDestTab<=MAXTAB && pTab[nDestTab]; nDestTab++) + for (SCTAB nDestTab=0; nDestTab< static_cast<SCTAB>(pTab.size()) && pTab[nDestTab]; nDestTab++) if (rMark.GetTableSelect(nDestTab)) { while (!pClipDoc->pTab[nClipTab]) nClipTab = (nClipTab+1) % (MAXTAB+1); @@ -1017,7 +1019,7 @@ void ScDocument::UpdateTranspose( const ScAddress& rDestPos, ScDocument* pClipDo // wie UpdateReference if (pRangeName) pRangeName->UpdateTranspose( aSource, aDest ); // vor den Zellen! - for (SCTAB i=0; i<=MAXTAB; i++) + for (SCTAB i=0; i< static_cast<SCTAB>(pTab.size()); i++) if (pTab[i]) pTab[i]->UpdateTranspose( aSource, aDest, pUndoDoc ); @@ -1034,7 +1036,7 @@ void ScDocument::UpdateGrow( const ScRange& rArea, SCCOL nGrowX, SCROW nGrowY ) if (pRangeName) pRangeName->UpdateGrow( rArea, nGrowX, nGrowY ); - for (SCTAB i=0; i<=MAXTAB && pTab[i]; i++) + for (SCTAB i=0; i< static_cast<SCTAB>(pTab.size()) && pTab[i]; i++) pTab[i]->UpdateGrow( rArea, nGrowX, nGrowY ); } @@ -1044,7 +1046,7 @@ void ScDocument::Fill(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, const { PutInOrder( nCol1, nCol2 ); PutInOrder( nRow1, nRow2 ); - for (SCTAB i=0; i <= MAXTAB; i++) + for (SCTAB i=0; i < static_cast<SCTAB>(pTab.size()); i++) if (pTab[i]) if (rMark.GetTableSelect(i)) pTab[i]->Fill(nCol1, nRow1, nCol2, nRow2, @@ -1055,7 +1057,7 @@ void ScDocument::Fill(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, const String ScDocument::GetAutoFillPreview( const ScRange& rSource, SCCOL nEndX, SCROW nEndY ) { SCTAB nTab = rSource.aStart.Tab(); - if (pTab[nTab]) + if (nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) return pTab[nTab]->GetAutoFillPreview( rSource, nEndX, nEndY ); return EMPTY_STRING; @@ -1066,7 +1068,7 @@ void ScDocument::AutoFormat( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SC { PutInOrder( nStartCol, nEndCol ); PutInOrder( nStartRow, nEndRow ); - for (SCTAB i=0; i <= MAXTAB; i++) + for (SCTAB i=0; i < static_cast<SCTAB>(pTab.size()); i++) if (pTab[i]) if (rMark.GetTableSelect(i)) pTab[i]->AutoFormat( nStartCol, nStartRow, nEndCol, nEndRow, nFormatNo ); @@ -1075,7 +1077,7 @@ void ScDocument::AutoFormat( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SC void ScDocument::GetAutoFormatData(SCTAB nTab, SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, ScAutoFormatData& rData) { - if (VALIDTAB(nTab)) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size())) { if (pTab[nTab]) { @@ -1182,6 +1184,8 @@ sal_Bool ScDocument::SearchAndReplace(const SvxSearchItem& rSearchItem, rMark.MarkToMulti(); sal_Bool bFound = false; + if (rTab >= static_cast<SCTAB>(pTab.size())) + OSL_FAIL("table out of range"); if (VALIDTAB(rTab)) { SCCOL nCol; @@ -1191,7 +1195,7 @@ sal_Bool ScDocument::SearchAndReplace(const SvxSearchItem& rSearchItem, if ( nCommand == SVX_SEARCHCMD_FIND_ALL || nCommand == SVX_SEARCHCMD_REPLACE_ALL ) { - for (nTab = 0; nTab <= MAXTAB; nTab++) + for (nTab = 0; nTab < static_cast<SCTAB>(pTab.size()); nTab++) if (pTab[nTab]) { if (rMark.GetTableSelect(nTab)) @@ -1232,7 +1236,7 @@ sal_Bool ScDocument::SearchAndReplace(const SvxSearchItem& rSearchItem, } else { - for (nTab = rTab; (nTab <= MAXTAB) && !bFound; nTab++) + for (nTab = rTab; (nTab < static_cast<SCTAB>(pTab.size())) && !bFound; nTab++) if (pTab[nTab]) { if (rMark.GetTableSelect(nTab)) @@ -1260,7 +1264,7 @@ sal_Bool ScDocument::SearchAndReplace(const SvxSearchItem& rSearchItem, sal_Bool ScDocument::UpdateOutlineCol( SCCOL nStartCol, SCCOL nEndCol, SCTAB nTab, sal_Bool bShow ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->UpdateOutlineCol( nStartCol, nEndCol, bShow ); OSL_FAIL("missing tab"); @@ -1269,7 +1273,7 @@ sal_Bool ScDocument::UpdateOutlineCol( SCCOL nStartCol, SCCOL nEndCol, SCTAB nTa sal_Bool ScDocument::UpdateOutlineRow( SCROW nStartRow, SCROW nEndRow, SCTAB nTab, sal_Bool bShow ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->UpdateOutlineRow( nStartRow, nEndRow, bShow ); OSL_FAIL("missing tab"); @@ -1278,7 +1282,7 @@ sal_Bool ScDocument::UpdateOutlineRow( SCROW nStartRow, SCROW nEndRow, SCTAB nTa void ScDocument::Sort(SCTAB nTab, const ScSortParam& rSortParam, sal_Bool bKeepQuery) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) { sal_Bool bOldDisableIdle = IsIdleDisabled(); DisableIdle( sal_True ); @@ -1289,7 +1293,7 @@ void ScDocument::Sort(SCTAB nTab, const ScSortParam& rSortParam, sal_Bool bKeepQ SCSIZE ScDocument::Query(SCTAB nTab, const ScQueryParam& rQueryParam, sal_Bool bKeepSub) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->Query((ScQueryParam&)rQueryParam, bKeepSub); OSL_FAIL("missing tab"); @@ -1299,7 +1303,7 @@ SCSIZE ScDocument::Query(SCTAB nTab, const ScQueryParam& rQueryParam, sal_Bool b void ScDocument::GetUpperCellString(SCCOL nCol, SCROW nRow, SCTAB nTab, String& rStr) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->GetUpperCellString( nCol, nRow, rStr ); else rStr.Erase(); @@ -1307,7 +1311,7 @@ void ScDocument::GetUpperCellString(SCCOL nCol, SCROW nRow, SCTAB nTab, String& sal_Bool ScDocument::CreateQueryParam(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, SCTAB nTab, ScQueryParam& rQueryParam) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->CreateQueryParam(nCol1, nRow1, nCol2, nRow2, rQueryParam); OSL_FAIL("missing tab"); @@ -1367,7 +1371,7 @@ sal_Bool ScDocument::HasRowHeader( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndC sal_Bool ScDocument::GetFilterEntries( SCCOL nCol, SCROW nRow, SCTAB nTab, bool bFilter, TypedScStrCollection& rStrings, bool& rHasDates) { - if ( ValidTab(nTab) && pTab[nTab] && pDBCollection ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] && pDBCollection ) { ScDBData* pDBData = pDBCollection->GetDBAtCursor(nCol, nRow, nTab, false); //!?? if (pDBData) @@ -1425,7 +1429,7 @@ sal_Bool ScDocument::GetFilterEntries( sal_Bool ScDocument::GetFilterEntriesArea( SCCOL nCol, SCROW nStartRow, SCROW nEndRow, SCTAB nTab, TypedScStrCollection& rStrings, bool& rHasDates ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) { pTab[nTab]->GetFilterEntries( nCol, nStartRow, nEndRow, rStrings, rHasDates ); return sal_True; @@ -1455,7 +1459,7 @@ sal_Bool ScDocument::GetDataEntries( SCCOL nCol, SCROW nRow, SCTAB nTab, } } - return ValidTab(nTab) && pTab[nTab] && pTab[nTab]->GetDataEntries( nCol, nRow, rStrings, bLimit ); + return ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] && pTab[nTab]->GetDataEntries( nCol, nRow, rStrings, bLimit ); } // @@ -1544,7 +1548,11 @@ void ScDocument::GetEmbedded( ScRange& rRange ) const Rectangle ScDocument::GetEmbeddedRect() const // 1/100 mm { Rectangle aRect; - ScTable* pTable = pTab[aEmbedRange.aStart.Tab()]; + ScTable* pTable = NULL; + if ( aEmbedRange.aStart.Tab() < static_cast<SCTAB>(pTab.size()) ) + pTable = pTab[aEmbedRange.aStart.Tab()]; + else + OSL_FAIL("table out of range"); if (!pTable) { OSL_FAIL("GetEmbeddedRect ohne Tabelle"); @@ -1632,7 +1640,11 @@ bool lcl_AddTwipsWhile( long & rTwips, long nStopTwips, SCROW & rPosY, SCROW nEn ScRange ScDocument::GetRange( SCTAB nTab, const Rectangle& rMMRect ) const { - ScTable* pTable = pTab[nTab]; + ScTable* pTable = NULL; + if (nTab < static_cast<SCTAB>(pTab.size())) + pTable = pTab[nTab]; + else + OSL_FAIL("table out of range"); if (!pTable) { OSL_FAIL("GetRange ohne Tabelle"); @@ -1766,7 +1778,11 @@ void lcl_SnapVer( ScTable* pTable, long& rVal, SCROW& rStartRow ) void ScDocument::SnapVisArea( Rectangle& rRect ) const { - ScTable* pTable = pTab[nVisibleTab]; + ScTable* pTable = NULL; + if (nVisibleTab < static_cast<SCTAB>(pTab.size())) + pTable = pTab[nVisibleTab]; + else + OSL_FAIL("table out of range"); if (!pTable) { OSL_FAIL("SetEmbedded ohne Tabelle"); @@ -1817,7 +1833,7 @@ sal_Bool ScDocument::IsDocEditable() const sal_Bool ScDocument::IsTabProtected( SCTAB nTab ) const { - if (VALIDTAB(nTab) && pTab[nTab]) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) return pTab[nTab]->IsProtected(); OSL_FAIL("Falsche Tabellennummer"); @@ -1826,7 +1842,7 @@ sal_Bool ScDocument::IsTabProtected( SCTAB nTab ) const ScTableProtection* ScDocument::GetTabProtection( SCTAB nTab ) const { - if (VALIDTAB(nTab) && pTab[nTab]) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) return pTab[nTab]->GetProtection(); return NULL; @@ -1834,7 +1850,7 @@ ScTableProtection* ScDocument::GetTabProtection( SCTAB nTab ) const void ScDocument::SetTabProtection(SCTAB nTab, const ScTableProtection* pProtect) { - if (!ValidTab(nTab)) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size())) return; pTab[nTab]->SetProtection(pProtect); @@ -1842,7 +1858,7 @@ void ScDocument::SetTabProtection(SCTAB nTab, const ScTableProtection* pProtect) void ScDocument::CopyTabProtection(SCTAB nTabSrc, SCTAB nTabDest) { - if (!ValidTab(nTabSrc) || !ValidTab(nTabDest)) + if (!ValidTab(nTabSrc) || nTabSrc >= static_cast<SCTAB>(pTab.size()) || nTabDest >= static_cast<SCTAB>(pTab.size()) || !ValidTab(nTabDest)) return; pTab[nTabDest]->SetProtection( pTab[nTabSrc]->GetProtection() ); @@ -1932,7 +1948,7 @@ void ScDocument::SetDrawDefaults() Rectangle ScDocument::GetMMRect( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, SCTAB nTab ) const { - if (!ValidTab(nTab) || !pTab[nTab]) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab]) { OSL_FAIL("GetMMRect: falsche Tabelle"); return Rectangle(0,0,0,0); @@ -2036,19 +2052,19 @@ void ScDocument::RemoveMerge( SCCOL nCol, SCROW nRow, SCTAB nTab ) void ScDocument::ExtendPrintArea( OutputDevice* pDev, SCTAB nTab, SCCOL nStartCol, SCROW nStartRow, SCCOL& rEndCol, SCROW nEndRow ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->ExtendPrintArea( pDev, nStartCol, nStartRow, rEndCol, nEndRow ); } void ScDocument::IncSizeRecalcLevel( SCTAB nTab ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->IncRecalcLevel(); } void ScDocument::DecSizeRecalcLevel( SCTAB nTab, bool bUpdateNoteCaptionPos ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->DecRecalcLevel( bUpdateNoteCaptionPos ); } diff --git a/sc/source/core/data/documen4.cxx b/sc/source/core/data/documen4.cxx index 5364ae2992c8..0cae10da5e26 100644 --- a/sc/source/core/data/documen4.cxx +++ b/sc/source/core/data/documen4.cxx @@ -69,7 +69,9 @@ sal_Bool ScDocument::Solver(SCCOL nFCol, SCROW nFRow, SCTAB nFTab, sal_Bool bRet = false; nX = 0.0; if (ValidColRow(nFCol, nFRow) && ValidColRow(nVCol, nVRow) && - VALIDTAB(nFTab) && VALIDTAB(nVTab) && pTab[nFTab] && pTab[nVTab]) + VALIDTAB(nFTab) && VALIDTAB(nVTab) && + nFTab < static_cast<SCTAB>(pTab.size()) && pTab[nFTab] && + nVTab < static_cast<SCTAB>(pTab.size()) && pTab[nVTab]) { CellType eFType, eVType; GetCellType(nFCol, nFRow, nFTab, eFType); @@ -135,16 +137,17 @@ void ScDocument::InsertMatrixFormula(SCCOL nCol1, SCROW nRow1, SCCOL j; SCROW k; i = 0; - sal_Bool bStop = false; - while (i <= MAXTAB && !bStop) // erste markierte Tabelle finden + bool bStop = false; + for (;i < static_cast<SCTAB>(pTab.size()); ++i) { if (pTab[i] && rMark.GetTableSelect(i)) - bStop = sal_True; - else - i++; + { + bStop = true; + break; + } } nTab1 = i; - if (i == MAXTAB + 1) + if (!bStop) { Sound::Beep(); OSL_FAIL("ScDocument::InsertMatrixFormula Keine Tabelle markiert"); @@ -158,7 +161,7 @@ void ScDocument::InsertMatrixFormula(SCCOL nCol1, SCROW nRow1, else pCell = new ScFormulaCell( this, aPos, rFormula, eGram, MM_FORMULA ); pCell->SetMatColsRows( nCol2 - nCol1 + 1, nRow2 - nRow1 + 1 ); - for (i = 0; i <= MAXTAB; i++) + for (i = 0; i < static_cast<SCTAB>(pTab.size()); i++) { if (pTab[i] && rMark.GetTableSelect(i)) { @@ -182,7 +185,7 @@ void ScDocument::InsertMatrixFormula(SCCOL nCol1, SCROW nRow1, ScTokenArray aArr; ScToken* t = static_cast<ScToken*>(aArr.AddMatrixSingleReference( aRefData)); - for (i = 0; i <= MAXTAB; i++) + for (i = 0; i < static_cast<SCTAB>(pTab.size()); i++) { if (pTab[i] && rMark.GetTableSelect(i)) { @@ -222,16 +225,17 @@ void ScDocument::InsertTableOp(const ScTabOpParam& rParam, // Mehrfachopera SCCOL j; SCROW k; i = 0; - sal_Bool bStop = false; - while (i <= MAXTAB && !bStop) // erste markierte Tabelle finden + bool bStop = false; + for (;i < static_cast<SCTAB>(pTab.size()); ++i) { if (pTab[i] && rMark.GetTableSelect(i)) - bStop = sal_True; - else - i++; + { + bStop = true; + break; + } } nTab1 = i; - if (i == MAXTAB + 1) + if (!bStop) { Sound::Beep(); OSL_FAIL("ScDocument::InsertTableOp: Keine Tabelle markiert"); @@ -291,7 +295,7 @@ void ScDocument::InsertTableOp(const ScTabOpParam& rParam, // Mehrfachopera formula::FormulaGrammar::GRAM_NATIVE, MM_NONE ); for( j = nCol1; j <= nCol2; j++ ) for( k = nRow1; k <= nRow2; k++ ) - for (i = 0; i <= MAXTAB; i++) + for (i = 0; i < static_cast<SCTAB>(pTab.size()); i++) if( pTab[i] && rMark.GetTableSelect(i) ) pTab[i]->PutCell( j, k, aRefCell.CloneWithoutNote( *this, ScAddress( j, k, i ), SC_CLONECELL_STARTLISTENING ) ); } @@ -370,7 +374,7 @@ bool ScDocument::MarkUsedExternalReferences( ScTokenArray & rArr ) sal_Bool ScDocument::GetNextSpellingCell(SCCOL& nCol, SCROW& nRow, SCTAB nTab, sal_Bool bInSel, const ScMarkData& rMark) const { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) return pTab[nTab]->GetNextSpellingCell( nCol, nRow, bInSel, rMark ); else return false; @@ -379,7 +383,7 @@ sal_Bool ScDocument::GetNextSpellingCell(SCCOL& nCol, SCROW& nRow, SCTAB nTab, sal_Bool ScDocument::GetNextMarkedCell( SCCOL& rCol, SCROW& rRow, SCTAB nTab, const ScMarkData& rMark ) { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) return pTab[nTab]->GetNextMarkedCell( rCol, rRow, rMark ); else return false; @@ -390,7 +394,7 @@ sal_Bool ScDocument::ReplaceStyle(const SvxSearchItem& rSearchItem, ScMarkData& rMark, sal_Bool bIsUndoP) { - if (pTab[nTab]) + if (nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) return pTab[nTab]->ReplaceStyle(rSearchItem, nCol, nRow, rMark, bIsUndoP); else return false; @@ -398,17 +402,21 @@ sal_Bool ScDocument::ReplaceStyle(const SvxSearchItem& rSearchItem, void ScDocument::CompileDBFormula() { - for (SCTAB i=0; i<=MAXTAB; i++) + TableContainer::iterator it = pTab.begin(); + for (;it != pTab.end(); ++it) { - if (pTab[i]) pTab[i]->CompileDBFormula(); + if (*it) + (*it)->CompileDBFormula(); } } void ScDocument::CompileDBFormula( sal_Bool bCreateFormulaString ) { - for (SCTAB i=0; i<=MAXTAB; i++) + TableContainer::iterator it = pTab.begin(); + for (;it != pTab.end(); ++it) { - if (pTab[i]) pTab[i]->CompileDBFormula( bCreateFormulaString ); + if (*it) + (*it)->CompileDBFormula( bCreateFormulaString ); } } @@ -417,23 +425,27 @@ void ScDocument::CompileNameFormula( sal_Bool bCreateFormulaString ) if ( pCondFormList ) pCondFormList->CompileAll(); // nach ScNameDlg noetig - for (SCTAB i=0; i<=MAXTAB; i++) + TableContainer::iterator it = pTab.begin(); + for (;it != pTab.end(); ++it) { - if (pTab[i]) pTab[i]->CompileNameFormula( bCreateFormulaString ); + if (*it) + (*it)->CompileNameFormula( bCreateFormulaString ); } } void ScDocument::CompileColRowNameFormula() { - for (SCTAB i=0; i<=MAXTAB; i++) + TableContainer::iterator it = pTab.begin(); + for (;it != pTab.end(); ++it) { - if (pTab[i]) pTab[i]->CompileColRowNameFormula(); + if (*it) + (*it)->CompileColRowNameFormula(); } } void ScDocument::DoColResize( SCTAB nTab, SCCOL nCol1, SCCOL nCol2, SCSIZE nAdd ) { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) pTab[nTab]->DoColResize( nCol1, nCol2, nAdd ); else { @@ -443,18 +455,19 @@ void ScDocument::DoColResize( SCTAB nTab, SCCOL nCol1, SCCOL nCol2, SCSIZE nAdd void ScDocument::InvalidateTableArea() { - for (SCTAB nTab=0; nTab<=MAXTAB && pTab[nTab]; nTab++) + TableContainer::iterator it = pTab.begin(); + for (;it != pTab.end() && *it; ++it) { - pTab[nTab]->InvalidateTableArea(); - if ( pTab[nTab]->IsScenario() ) - pTab[nTab]->InvalidateScenarioRanges(); + (*it)->InvalidateTableArea(); + if ( (*it)->IsScenario() ) + (*it)->InvalidateScenarioRanges(); } } sal_Int32 ScDocument::GetMaxStringLen( SCTAB nTab, SCCOL nCol, SCROW nRowStart, SCROW nRowEnd, CharSet eCharSet ) const { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) return pTab[nTab]->GetMaxStringLen( nCol, nRowStart, nRowEnd, eCharSet ); else return 0; @@ -464,7 +477,7 @@ xub_StrLen ScDocument::GetMaxNumberStringLen( sal_uInt16& nPrecision, SCTAB nTab SCCOL nCol, SCROW nRowStart, SCROW nRowEnd ) const { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) return pTab[nTab]->GetMaxNumberStringLen( nPrecision, nCol, nRowStart, nRowEnd ); else @@ -486,7 +499,7 @@ sal_Bool ScDocument::GetSelectionFunction( ScSubTotalFunc eFunc, SCCOL nEndCol = aSingle.aEnd.Col(); SCROW nEndRow = aSingle.aEnd.Row(); - for (SCTAB nTab=0; nTab<=MAXTAB && !aData.bError; nTab++) + for (SCTAB nTab=0; nTab< static_cast<SCTAB>(pTab.size()) && !aData.bError; nTab++) if (pTab[nTab] && rMark.GetTableSelect(nTab)) pTab[nTab]->UpdateSelectionFunction( aData, nStartCol, nStartRow, nEndCol, nEndRow, rMark ); @@ -712,13 +725,13 @@ const ScValidationData* ScDocument::GetValidationEntry( sal_uLong nIndex ) const void ScDocument::FindConditionalFormat( sal_uLong nKey, ScRangeList& rRanges ) { - for (SCTAB i=0; i<=MAXTAB && pTab[i]; i++) + for (SCTAB i=0; i< static_cast<SCTAB>(pTab.size()) && pTab[i]; i++) pTab[i]->FindConditionalFormat( nKey, rRanges ); } void ScDocument::FindConditionalFormat( sal_uLong nKey, ScRangeList& rRanges, SCTAB nTab ) { - if(VALIDTAB(nTab) && pTab[nTab]) + if(VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) pTab[nTab]->FindConditionalFormat( nKey, rRanges ); } diff --git a/sc/source/core/data/documen5.cxx b/sc/source/core/data/documen5.cxx index 7bd4197a978c..a930315708ea 100644 --- a/sc/source/core/data/documen5.cxx +++ b/sc/source/core/data/documen5.cxx @@ -135,7 +135,7 @@ void ScDocument::UpdateAllCharts() size_t nDataCount = pChartCollection->size(); - for (SCTAB nTab=0; nTab<=MAXTAB; nTab++) + for (SCTAB nTab=0; nTab< static_cast<SCTAB>(pTab.size()); nTab++) { if (pTab[nTab]) { @@ -205,7 +205,7 @@ void ScDocument::UpdateAllCharts() sal_Bool ScDocument::HasChartAtPoint( SCTAB nTab, const Point& rPos, String* pName ) { - if (pDrawLayer && pTab[nTab]) + if (pDrawLayer && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) { SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab)); OSL_ENSURE(pPage,"Page ?"); @@ -251,7 +251,7 @@ uno::Reference< chart2::XChartDocument > ScDocument::GetChartByName( const Strin if (pDrawLayer) { sal_uInt16 nCount = pDrawLayer->GetPageCount(); - for (sal_uInt16 nTab=0; nTab<nCount; nTab++) + for (sal_uInt16 nTab=0; nTab<nCount&& nTab < static_cast<SCTAB>(pTab.size()); nTab++) { SdrPage* pPage = pDrawLayer->GetPage(nTab); OSL_ENSURE(pPage,"Page ?"); @@ -316,7 +316,7 @@ void ScDocument::GetOldChartParameters( const String& rName, return; sal_uInt16 nCount = pDrawLayer->GetPageCount(); - for (sal_uInt16 nTab=0; nTab<nCount; nTab++) + for (sal_uInt16 nTab=0; nTab<nCount && nTab < static_cast<SCTAB>(pTab.size()); nTab++) { SdrPage* pPage = pDrawLayer->GetPage(nTab); OSL_ENSURE(pPage,"Page ?"); @@ -363,7 +363,7 @@ void ScDocument::UpdateChartArea( const String& rChartName, if (!pDrawLayer) return; - for (SCTAB nTab=0; nTab<=MAXTAB && pTab[nTab]; nTab++) + for (SCTAB nTab=0; nTab< static_cast<SCTAB>(pTab.size()) && pTab[nTab]; nTab++) { SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab)); OSL_ENSURE(pPage,"Page ?"); @@ -598,7 +598,7 @@ void ScDocument::SetChartRangeList( const String& rChartName, if (!pDrawLayer) return; - for (SCTAB nTab=0; nTab<=MAXTAB && pTab[nTab]; nTab++) + for (SCTAB nTab=0; nTab< static_cast<SCTAB>(pTab.size()) && pTab[nTab]; nTab++) { SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab)); OSL_ENSURE(pPage,"Page ?"); @@ -638,7 +638,7 @@ void ScDocument::SetChartRangeList( const String& rChartName, sal_Bool ScDocument::HasData( SCCOL nCol, SCROW nRow, SCTAB nTab ) { - if (pTab[nTab]) + if (nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) return pTab[nTab]->HasData( nCol, nRow ); else return false; @@ -700,7 +700,7 @@ void ScDocument::UpdateChartListenerCollection() ScRange aRange; // Range for searching is not important ScChartListener aCLSearcher( EMPTY_STRING, this, aRange ); - for (SCTAB nTab=0; nTab<=MAXTAB; nTab++) + for (SCTAB nTab=0; nTab< static_cast<SCTAB>(pTab.size()); nTab++) { if (pTab[nTab]) { diff --git a/sc/source/core/data/documen7.cxx b/sc/source/core/data/documen7.cxx index c9513a511318..b50f5288957b 100644 --- a/sc/source/core/data/documen7.cxx +++ b/sc/source/core/data/documen7.cxx @@ -116,7 +116,7 @@ void ScDocument::Broadcast( const ScHint& rHint ) if ( rHint.GetAddress() != BCA_BRDCST_ALWAYS ) { SCTAB nTab = rHint.GetAddress().Tab(); - if (pTab[nTab] && pTab[nTab]->IsStreamValid()) + if (nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] && pTab[nTab]->IsStreamValid()) pTab[nTab]->SetStreamValid(false); } } @@ -193,7 +193,7 @@ void ScDocument::StartListeningCell( const ScAddress& rAddress, { OSL_ENSURE(pListener, "StartListeningCell: pListener Null"); SCTAB nTab = rAddress.Tab(); - if (pTab[nTab]) + if (nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) pTab[nTab]->StartListening( rAddress, pListener ); } @@ -202,7 +202,7 @@ void ScDocument::EndListeningCell( const ScAddress& rAddress, { OSL_ENSURE(pListener, "EndListeningCell: pListener Null"); SCTAB nTab = rAddress.Tab(); - if (pTab[nTab]) + if (nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) pTab[nTab]->EndListening( rAddress, pListener ); } @@ -488,7 +488,7 @@ void ScDocument::TrackFormulas( sal_uLong nHintId ) void ScDocument::StartAllListeners() { - for ( SCTAB i = 0; i <= MAXTAB; ++i ) + for ( SCTAB i = 0; i < static_cast<SCTAB>(pTab.size()); ++i ) if ( pTab[i] ) pTab[i]->StartAllListeners(); } diff --git a/sc/source/core/data/documen8.cxx b/sc/source/core/data/documen8.cxx index 07fb8d5f9e95..1459eeb72234 100644 --- a/sc/source/core/data/documen8.cxx +++ b/sc/source/core/data/documen8.cxx @@ -431,7 +431,7 @@ void ScDocument::InvalidateTextWidth( const ScAddress* pAdrFrom, const ScAddress { const SCTAB nTab = pAdrFrom->Tab(); - if ( pTab[nTab] ) + if (nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->InvalidateTextWidth( pAdrFrom, NULL, bNumFormatChanged, bBroadcast ); } else @@ -439,7 +439,7 @@ void ScDocument::InvalidateTextWidth( const ScAddress* pAdrFrom, const ScAddress const SCTAB nTabStart = pAdrFrom ? pAdrFrom->Tab() : 0; const SCTAB nTabEnd = pAdrTo ? pAdrTo->Tab() : MAXTAB; - for ( SCTAB nTab=nTabStart; nTab<=nTabEnd; nTab++ ) + for ( SCTAB nTab=nTabStart; nTab<=nTabEnd && nTab < static_cast<SCTAB>(pTab.size()); nTab++ ) if ( pTab[nTab] ) pTab[nTab]->InvalidateTextWidth( pAdrFrom, pAdrTo, bNumFormatChanged, bBroadcast ); } @@ -474,7 +474,7 @@ sal_Bool ScDocument::IdleCalcTextWidth() // sal_True = demnaechst wie nRow = 0, nCol--; if ( nCol < 0 ) nCol = MAXCOL, nTab++; - if ( !ValidTab(nTab) || !pTab[nTab] ) + if ( !ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab] ) nTab = 0; // SearchMask/Family muss gemerkt werden, @@ -553,7 +553,7 @@ sal_Bool ScDocument::IdleCalcTextWidth() // sal_True = demnaechst wie bNewTab = sal_True; } - if ( !ValidTab(nTab) || !pTab[nTab] ) + if ( !ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab] ) { nTab = 0; nRestart++; @@ -673,11 +673,11 @@ sal_Bool ScDocument::OnlineSpellInRange( const ScRange& rSpellRange, ScAddress& SCCOL nCol = rSpellRange.aStart.Col(); // iterator always starts on the left edge SCROW nRow = rSpellPos.Row(); SCTAB nTab = rSpellPos.Tab(); - if ( !pTab[nTab] ) // sheet deleted? + if ( nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab] ) // sheet deleted? { nTab = rSpellRange.aStart.Tab(); nRow = rSpellRange.aStart.Row(); - if ( !pTab[nTab] ) + if ( nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab] ) { // may happen for visible range return false; @@ -798,7 +798,7 @@ sal_Bool ScDocument::OnlineSpellInRange( const ScRange& rSpellRange, ScAddress& if (!pCell) // end of range reached -> next sheet { ++nTab; - if ( nTab > rSpellRange.aEnd.Tab() || !pTab[nTab] ) + if ( nTab > rSpellRange.aEnd.Tab() || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab] ) nTab = rSpellRange.aStart.Tab(); nCol = rSpellRange.aStart.Col(); nRow = rSpellRange.aStart.Row(); @@ -890,7 +890,7 @@ void ScDocument::RemoveAutoSpellObj() { // alle Spelling-Informationen entfernen - for (SCTAB nTab=0; nTab<=MAXTAB && pTab[nTab]; nTab++) + for (SCTAB nTab=0; nTab< static_cast<SCTAB>(pTab.size()) && pTab[nTab]; nTab++) pTab[nTab]->RemoveAutoSpellObj(); } diff --git a/sc/source/core/data/documen9.cxx b/sc/source/core/data/documen9.cxx index d893dc06d85b..504f6eab1495 100644 --- a/sc/source/core/data/documen9.cxx +++ b/sc/source/core/data/documen9.cxx @@ -154,11 +154,11 @@ void ScDocument::InitDrawLayer( SfxObjectShell* pDocShell ) SCTAB nDrawPages = 0; SCTAB nTab; - for (nTab=0; nTab<=MAXTAB; nTab++) + for (nTab=0; nTab < static_cast<SCTAB>(pTab.size()); nTab++) if (pTab[nTab]) nDrawPages = nTab + 1; // needed number of pages - for (nTab=0; nTab<nDrawPages; nTab++) + for (nTab=0; nTab<nDrawPages && nTab < static_cast<SCTAB>(pTab.size()); nTab++) { pDrawLayer->ScAddPage( nTab ); // always add page, with or without the table if (pTab[nTab]) @@ -219,7 +219,7 @@ void ScDocument::UpdateDrawPrinter() void ScDocument::SetDrawPageSize(SCTAB nTab) { - if (!ValidTab(nTab) || !pTab[nTab]) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab]) return; pTab[nTab]->SetDrawPageSize(); @@ -276,7 +276,7 @@ void ScDocument::DeleteObjectsInArea( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCR return; SCTAB nTabCount = GetTableCount(); - for (SCTAB nTab=0; nTab<=nTabCount; nTab++) + for (SCTAB nTab=0; nTab<nTabCount; nTab++) if (pTab[nTab] && rMark.GetTableSelect(nTab)) pDrawLayer->DeleteObjectsInArea( nTab, nCol1, nRow1, nCol2, nRow2 ); } @@ -297,7 +297,7 @@ sal_Bool ScDocument::HasOLEObjectsInArea( const ScRange& rRange, const ScMarkDat return false; SCTAB nStartTab = 0; - SCTAB nEndTab = MAXTAB; + SCTAB nEndTab = static_cast<SCTAB>(pTab.size()); if ( !pTabMark ) { nStartTab = rRange.aStart.Tab(); @@ -426,7 +426,7 @@ SdrObject* ScDocument::GetObjectAtPoint( SCTAB nTab, const Point& rPos ) // fuer Drag&Drop auf Zeichenobjekt SdrObject* pFound = NULL; - if (pDrawLayer && pTab[nTab]) + if (pDrawLayer && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) { SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab)); OSL_ENSURE(pPage,"Page ?"); @@ -526,12 +526,10 @@ sal_Bool ScDocument::IsPrintEmpty( SCTAB nTab, SCCOL nStartCol, SCROW nStartRow, void ScDocument::Clear( sal_Bool bFromDestructor ) { - for (SCTAB i=0; i<=MAXTAB; i++) - if (pTab[i]) - { - delete pTab[i]; - pTab[i]=NULL; - } + TableContainer::iterator it = pTab.begin(); + for (;it != pTab.end(); ++it) + delete *it; + pTab.clear(); delete pSelectionAttr; pSelectionAttr = NULL; @@ -679,12 +677,13 @@ bool ScDocument::IsLoadingMedium() const void ScDocument::SetLoadingMedium( bool bVal ) { bLoadingMedium = bVal; - for (SCTAB nTab = 0; nTab <= MAXTAB; ++nTab) + TableContainer::iterator it = pTab.begin(); + for (; it != pTab.end(); ++it) { - if (!pTab[nTab]) + if (!*it) return; - pTab[nTab]->SetLoadingMedium(bVal); + (*it)->SetLoadingMedium(bVal); } } @@ -698,7 +697,7 @@ void ScDocument::SetImportingXML( bool bVal ) { // #i57869# after loading, do the real RTL mirroring for the sheets that have the LoadingRTL flag set - for ( SCTAB nTab=0; nTab<=MAXTAB && pTab[nTab]; nTab++ ) + for ( SCTAB nTab=0; nTab< static_cast<SCTAB>(pTab.size()) && pTab[nTab]; nTab++ ) if ( pTab[nTab]->IsLoadingRTL() ) { pTab[nTab]->SetLoadingRTL( false ); diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx index 23ba47fe5b7d..bb099457889f 100644 --- a/sc/source/core/data/document.cxx +++ b/sc/source/core/data/document.cxx @@ -139,23 +139,30 @@ typedef std::set<ScDefaultAttr, ScLessDefaultAttr> ScDefaultAttrSet; void ScDocument::MakeTable( SCTAB nTab,bool _bNeedsNameCheck ) { - if ( ValidTab(nTab) && !pTab[nTab] ) + if ( ValidTab(nTab) && ( nTab >= static_cast<SCTAB>(pTab.size()) ||!pTab[nTab]) ) { String aString = ScGlobal::GetRscString(STR_TABLE_DEF); //"Table" aString += String::CreateFromInt32(nTab+1); if ( _bNeedsNameCheck ) CreateValidTabName( aString ); // no doubles - - pTab[nTab] = new ScTable(this, nTab, aString); + if (nTab < static_cast<SCTAB>(pTab.size())) + { + pTab[nTab] = new ScTable(this, nTab, aString); + } + else + { + while(nTab > static_cast<SCTAB>(pTab.size())) + pTab.push_back(NULL); + pTab.push_back( new ScTable(this, nTab, aString) ); + } pTab[nTab]->SetLoadingMedium(bLoadingMedium); - ++nMaxTableNumber; } } sal_Bool ScDocument::HasTable( SCTAB nTab ) const { - if (VALIDTAB(nTab)) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size())) if (pTab[nTab]) return sal_True; @@ -164,7 +171,7 @@ sal_Bool ScDocument::HasTable( SCTAB nTab ) const bool ScDocument::GetName( SCTAB nTab, String& rName ) const { - if (VALIDTAB(nTab)) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size())) if (pTab[nTab]) { pTab[nTab]->GetName( rName ); @@ -184,7 +191,7 @@ bool ScDocument::GetName( SCTAB nTab, OUString& rName ) const sal_Bool ScDocument::SetCodeName( SCTAB nTab, const String& rName ) { - if (VALIDTAB(nTab)) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size())) { if (pTab[nTab]) { @@ -198,7 +205,7 @@ sal_Bool ScDocument::SetCodeName( SCTAB nTab, const String& rName ) sal_Bool ScDocument::GetCodeName( SCTAB nTab, String& rName ) const { - if (VALIDTAB(nTab)) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size())) if (pTab[nTab]) { pTab[nTab]->GetCodeName( rName ); @@ -213,7 +220,7 @@ sal_Bool ScDocument::GetTable( const String& rName, SCTAB& rTab ) const String aUpperName = rName; ScGlobal::pCharClass->toUpper(aUpperName); - for (SCTAB i=0; i<=MAXTAB; i++) + for (SCTAB i=0; i< static_cast<SCTAB>(pTab.size()); i++) if (pTab[i]) { if ( pTab[i]->GetUpperName() == aUpperName ) @@ -228,12 +235,15 @@ sal_Bool ScDocument::GetTable( const String& rName, SCTAB& rTab ) const ScDBData* ScDocument::GetAnonymousDBData(SCTAB nTab) { - return pTab[nTab]->GetAnonymousDBData(); + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) + return pTab[nTab]->GetAnonymousDBData(); + return NULL; } void ScDocument::SetAnonymousDBData(SCTAB nTab, ScDBData* pDBData) { - pTab[nTab]->SetAnonymousDBData(pDBData); + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) + pTab[nTab]->SetAnonymousDBData(pDBData); } @@ -280,17 +290,41 @@ bool ScDocument::ValidTabName( const String& rName ) sal_Bool ScDocument::ValidNewTabName( const String& rName ) const { sal_Bool bValid = ValidTabName(rName); - for (SCTAB i=0; (i<=MAXTAB) && bValid; i++) - if (pTab[i]) + TableContainer::const_iterator it = pTab.begin(); + for (; it != pTab.end() && bValid; ++it) + if ( *it ) { String aOldName; - pTab[i]->GetName(aOldName); + (*it)->GetName(aOldName); bValid = !ScGlobal::GetpTransliteration()->isEqual( rName, aOldName ); } return bValid; } +bool ScDocument::ValidNewTabName( const std::vector<String>& rNames ) const//TODO:FIXME what is if there are duplicates in rNames +{ + bool bValid = true; + std::vector<String>::const_iterator nameIter = rNames.begin(); + for (;nameIter != rNames.end() && bValid; ++nameIter) + { + bValid = ValidTabName(*nameIter); + } + TableContainer::const_iterator it = pTab.begin(); + for (; it != pTab.end() && bValid; ++it) + if ( *it ) + { + for (nameIter = rNames.begin(); nameIter != rNames.end(); ++nameIter) + { + String aOldName; + (*it)->GetName(aOldName); + bValid = !ScGlobal::GetpTransliteration()->isEqual( *nameIter, aOldName ); + } + } + return bValid; +} + + void ScDocument::CreateValidTabName(String& rName) const { if ( !ValidTabName(rName) ) @@ -305,8 +339,7 @@ void ScDocument::CreateValidTabName(String& rName) const OSL_ENSURE(bPrefix, "Invalid Table Name"); SCTAB nDummy; - SCTAB nLoops = 0; // "for safety messures" - for ( SCTAB i = nMaxTableNumber+1; !bOk && nLoops <= MAXTAB; i++ ) + for ( SCTAB i = static_cast<SCTAB>(pTab.size())+1; !bOk ; i++ ) { rName = aStrTable; rName += String::CreateFromInt32(i); @@ -314,12 +347,8 @@ void ScDocument::CreateValidTabName(String& rName) const bOk = ValidNewTabName( rName ); else bOk = !GetTable( rName, nDummy ); - ++nLoops; } - OSL_ENSURE(bOk, "No Valid Table name found."); - if ( !bOk ) - rName = aStrTable; } else { @@ -343,20 +372,51 @@ void ScDocument::CreateValidTabName(String& rName) const } +void ScDocument::CreateValidTabNames(std::vector<rtl::OUString>& aNames, SCTAB nCount) const +{ + aNames.clear();//ensure that the vector is empty + + const String aStrTable( ScResId(SCSTR_TABLE) ); + String rName; + bool bOk = false; + + // First test if the prefix is valid, if so only avoid doubles + sal_Bool bPrefix = ValidTabName( aStrTable ); + OSL_ENSURE(bPrefix, "Invalid Table Name"); + SCTAB nDummy; + SCTAB i = static_cast<SCTAB>(pTab.size())+1; + + for (SCTAB j = 0; j < nCount; ++j) + { + bOk = false; + while(!bOk) + { + rName = aStrTable; + rName += String::CreateFromInt32(i); + if (bPrefix) + bOk = ValidNewTabName( rName ); + else + bOk = !GetTable( rName, nDummy ); + i++; + } + aNames.push_back(rtl::OUString(rName)); + } +} + + sal_Bool ScDocument::InsertTab( SCTAB nPos, const String& rName, sal_Bool bExternalDocument ) { - SCTAB nTabCount = GetTableCount(); + SCTAB nTabCount = static_cast<SCTAB>(pTab.size()); sal_Bool bValid = ValidTab(nTabCount); if ( !bExternalDocument ) // else test rName == "'Doc'!Tab" first bValid = (bValid && ValidNewTabName(rName)); if (bValid) { - if (nPos == SC_TAB_APPEND || nPos == nTabCount) + if (nPos == SC_TAB_APPEND || nPos >= nTabCount) { - pTab[nTabCount] = new ScTable(this, nTabCount, rName); + pTab.push_back( new ScTable(this, nTabCount, rName) ); pTab[nTabCount]->SetCodeName( rName ); - ++nMaxTableNumber; if ( bExternalDocument ) pTab[nTabCount]->SetVisible( false ); } @@ -381,10 +441,11 @@ sal_Bool ScDocument::InsertTab( SCTAB nPos, const String& rName, pUnoBroadcaster->Broadcast( ScUpdateRefHint( URM_INSDEL, aRange, 0,0,1 ) ); SCTAB i; - for (i = 0; i <= MAXTAB; i++) - if (pTab[i]) - pTab[i]->UpdateInsertTab(nPos); - + TableContainer::iterator it = pTab.begin(); + for (; it != pTab.end(); ++it) + if ( *it ) + (*it)->UpdateInsertTab(nPos); + pTab.push_back(NULL); for (i = nTabCount; i > nPos; i--) { pTab[i] = pTab[i - 1]; @@ -392,18 +453,19 @@ sal_Bool ScDocument::InsertTab( SCTAB nPos, const String& rName, pTab[nPos] = new ScTable(this, nPos, rName); pTab[nPos]->SetCodeName( rName ); - ++nMaxTableNumber; // UpdateBroadcastAreas must be called between UpdateInsertTab, // which ends listening, and StartAllListeners, to not modify // areas that are to be inserted by starting listeners. UpdateBroadcastAreas( URM_INSDEL, aRange, 0,0,1); - for (i = 0; i <= MAXTAB; i++) - if (pTab[i]) - pTab[i]->UpdateCompile(); - for (i = 0; i <= MAXTAB; i++) - if (pTab[i]) - pTab[i]->StartAllListeners(); + it = pTab.begin(); + for (; it != pTab.end(); ++it) + if ( *it ) + (*it)->UpdateCompile(); + it = pTab.begin(); + for (; it != pTab.end(); ++it) + if ( *it ) + (*it)->StartAllListeners(); // update conditional formats after table is inserted if ( pCondFormList ) @@ -425,14 +487,101 @@ sal_Bool ScDocument::InsertTab( SCTAB nPos, const String& rName, } +bool ScDocument::InsertTabs( SCTAB nPos, const std::vector<rtl::OUString>& rNames, + bool bExternalDocument, bool bNamesValid ) +{ + SCTAB nNewSheets = static_cast<SCTAB>(rNames.size()); + SCTAB nTabCount = static_cast<SCTAB>(pTab.size()); + bool bValid = bNamesValid || ValidTab(nTabCount+nNewSheets); +// if ( !bExternalDocument ) // else test rName == "'Doc'!Tab" first +// bValid = (bValid && ValidNewTabName(rNames)); + if (bValid) + { + if (nPos == SC_TAB_APPEND || nPos >= nTabCount) + { + for ( SCTAB i = 0; i < nNewSheets; ++i ) + { + pTab.push_back( new ScTable(this, nTabCount + i, rNames.at(i)) ); + pTab[nTabCount+i]->SetCodeName( rNames.at(i) ); + if ( bExternalDocument ) + pTab[nTabCount+i]->SetVisible( false ); + } + } + else + { + if (VALIDTAB(nPos) && (nPos < nTabCount)) + { + ScRange aRange( 0,0,nPos, MAXCOL,MAXROW,MAXTAB ); + xColNameRanges->UpdateReference( URM_INSDEL, this, aRange, 0,0,nNewSheets ); + xRowNameRanges->UpdateReference( URM_INSDEL, this, aRange, 0,0,nNewSheets ); + if (pRangeName) + pRangeName->UpdateTabRef( nPos, 1, 0, nNewSheets); + pDBCollection->UpdateReference( + URM_INSDEL, 0,0,nPos, MAXCOL,MAXROW,MAXTAB, 0,0,nNewSheets ); + if (pDPCollection) + pDPCollection->UpdateReference( URM_INSDEL, aRange, 0,0,nNewSheets ); + if (pDetOpList) + pDetOpList->UpdateReference( this, URM_INSDEL, aRange, 0,0,nNewSheets ); + UpdateChartRef( URM_INSDEL, 0,0,nPos, MAXCOL,MAXROW,MAXTAB, 0,0,nNewSheets ); + UpdateRefAreaLinks( URM_INSDEL, aRange, 0,0, nNewSheets ); + if ( pUnoBroadcaster ) + pUnoBroadcaster->Broadcast( ScUpdateRefHint( URM_INSDEL, aRange, 0,0,nNewSheets ) ); + + TableContainer::iterator it = pTab.begin(); + for (; it != pTab.end(); ++it) + if ( *it ) + (*it)->UpdateInsertTab(nPos, nNewSheets); + it = pTab.begin(); + pTab.insert(it+nPos,nNewSheets, NULL); + for (SCTAB i = 0; i < nNewSheets; ++i) + { + pTab[nPos + i] = new ScTable(this, nPos + i, rNames.at(i)); + pTab[nPos + i]->SetCodeName( rNames.at(i) ); + } + + // UpdateBroadcastAreas must be called between UpdateInsertTab, + // which ends listening, and StartAllListeners, to not modify + // areas that are to be inserted by starting listeners. + UpdateBroadcastAreas( URM_INSDEL, aRange, 0,0,nNewSheets); + it = pTab.begin(); + for (; it != pTab.end(); ++it) + { + if ( *it ) + (*it)->UpdateCompile(); + } + it = pTab.begin(); + for (; it != pTab.end(); ++it) + if ( *it ) + (*it)->StartAllListeners(); + + // update conditional formats after table is inserted + if ( pCondFormList ) + pCondFormList->UpdateReference( URM_INSDEL, aRange, 0,0,nNewSheets); + if ( pValidationList ) + pValidationList->UpdateReference( URM_INSDEL, aRange, 0,0,nNewSheets ); + // sheet names of references are not valid until sheet is inserted + if ( pChartListenerCollection ) + pChartListenerCollection->UpdateScheduledSeriesRanges(); + + SetDirty(); + bValid = true; + } + else + bValid = false; + } + } + return bValid; +} + + sal_Bool ScDocument::DeleteTab( SCTAB nTab, ScDocument* pRefUndoDoc ) { sal_Bool bValid = false; - if (VALIDTAB(nTab)) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size())) { if (pTab[nTab]) { - SCTAB nTabCount = GetTableCount(); + SCTAB nTabCount = static_cast<SCTAB>(pTab.size()); if (nTabCount > 1) { sal_Bool bOldAutoCalc = GetAutoCalc(); @@ -454,7 +603,7 @@ sal_Bool ScDocument::DeleteTab( SCTAB nTab, ScDocument* pRefUndoDoc ) // normal reference update - aRange.aEnd.SetTab( MAXTAB ); + aRange.aEnd.SetTab( static_cast<SCTAB>(pTab.size())-1 ); xColNameRanges->UpdateReference( URM_INSDEL, this, aRange, 0,0,-1 ); xRowNameRanges->UpdateReference( URM_INSDEL, this, aRange, 0,0,-1 ); if (pRangeName) @@ -475,30 +624,27 @@ sal_Bool ScDocument::DeleteTab( SCTAB nTab, ScDocument* pRefUndoDoc ) pUnoBroadcaster->Broadcast( ScUpdateRefHint( URM_INSDEL, aRange, 0,0,-1 ) ); SCTAB i; - for (i=0; i<=MAXTAB; i++) + for (i=0; i< static_cast<SCTAB>(pTab.size()); i++) if (pTab[i]) pTab[i]->UpdateDeleteTab(nTab,false, pRefUndoDoc ? pRefUndoDoc->pTab[i] : 0); - delete pTab[nTab]; - for (i=nTab + 1; i < nTabCount; i++) - pTab[i - 1] = pTab[i]; - - pTab[nTabCount - 1] = NULL; - --nMaxTableNumber; + pTab.erase(pTab.begin()+ nTab); // UpdateBroadcastAreas must be called between UpdateDeleteTab, // which ends listening, and StartAllListeners, to not modify // areas that are to be inserted by starting listeners. UpdateBroadcastAreas( URM_INSDEL, aRange, 0,0,-1); - for (i = 0; i <= MAXTAB; i++) - if (pTab[i]) - pTab[i]->UpdateCompile(); + TableContainer::iterator it = pTab.begin(); + for (; it != pTab.end(); ++it) + if ( *it ) + (*it)->UpdateCompile(); // Excel-Filter deletes some Tables while loading, Listeners will // only be triggered after the loading is done. if ( !bInsertingFromOtherDoc ) { - for (i = 0; i <= MAXTAB; i++) - if (pTab[i]) - pTab[i]->StartAllListeners(); + it = pTab.begin(); + for (; it != pTab.end(); ++it) + if ( *it ) + (*it)->StartAllListeners(); SetDirty(); } // sheet names of references are not valid until sheet is deleted @@ -513,6 +659,93 @@ sal_Bool ScDocument::DeleteTab( SCTAB nTab, ScDocument* pRefUndoDoc ) } +bool ScDocument::DeleteTabs( SCTAB nTab, SCTAB nSheets, ScDocument* pRefUndoDoc ) +{ + bool bValid = false; + if (VALIDTAB(nTab) && (nTab + nSheets) < static_cast<SCTAB>(pTab.size())) + { + if (pTab[nTab]) + { + SCTAB nTabCount = static_cast<SCTAB>(pTab.size()); + if (nTabCount > nSheets) + { + bool bOldAutoCalc = GetAutoCalc(); + SetAutoCalc( false ); // avoid multiple calculations + for (SCTAB aTab = 0; aTab < nSheets; ++aTab) + { + ScRange aRange( 0, 0, nTab, MAXCOL, MAXROW, nTab + aTab ); + DelBroadcastAreasInRange( aRange ); + + // #i8180# remove database ranges etc. that are on the deleted tab + // (restored in undo with ScRefUndoData) + + xColNameRanges->DeleteOnTab( nTab + aTab ); + xRowNameRanges->DeleteOnTab( nTab + aTab ); + pDBCollection->DeleteOnTab( nTab + aTab ); + if (pDPCollection) + pDPCollection->DeleteOnTab( nTab + aTab ); + if (pDetOpList) + pDetOpList->DeleteOnTab( nTab + aTab ); + DeleteAreaLinksOnTab( nTab + aTab ); + if (pRangeName) + pRangeName->UpdateTabRef( nTab + aTab, 2 ); + } + // normal reference update + + ScRange aRange( 0, 0, nTab, MAXCOL, MAXROW, nTabCount - 1 ); + xColNameRanges->UpdateReference( URM_INSDEL, this, aRange, 0,0,-1*nSheets ); + xRowNameRanges->UpdateReference( URM_INSDEL, this, aRange, 0,0,-1*nSheets ); + pDBCollection->UpdateReference( + URM_INSDEL, 0,0,nTab, MAXCOL,MAXROW,MAXTAB, 0,0,-1*nSheets ); + if (pDPCollection) + pDPCollection->UpdateReference( URM_INSDEL, aRange, 0,0,-1*nSheets ); + if (pDetOpList) + pDetOpList->UpdateReference( this, URM_INSDEL, aRange, 0,0,-1*nSheets ); + UpdateChartRef( URM_INSDEL, 0,0,nTab, MAXCOL,MAXROW,MAXTAB, 0,0,-1*nSheets ); + UpdateRefAreaLinks( URM_INSDEL, aRange, 0,0,-1*nSheets ); + if ( pCondFormList ) + pCondFormList->UpdateReference( URM_INSDEL, aRange, 0,0,-1*nSheets ); + if ( pValidationList ) + pValidationList->UpdateReference( URM_INSDEL, aRange, 0,0,-1*nSheets ); + if ( pUnoBroadcaster ) + pUnoBroadcaster->Broadcast( ScUpdateRefHint( URM_INSDEL, aRange, 0,0,-1*nSheets ) ); + + SCTAB i; + for (i=0; i< static_cast<SCTAB>(pTab.size()); i++) + if (pTab[i]) + pTab[i]->UpdateDeleteTab(nTab,false, + pRefUndoDoc ? pRefUndoDoc->pTab[i] : 0,nSheets); + pTab.erase(pTab.begin()+ nTab, pTab.begin() + nTab + nSheets); + // UpdateBroadcastAreas must be called between UpdateDeleteTab, + // which ends listening, and StartAllListeners, to not modify + // areas that are to be inserted by starting listeners. + UpdateBroadcastAreas( URM_INSDEL, aRange, 0,0,-1*nSheets); + TableContainer::iterator it = pTab.begin(); + for (; it != pTab.end(); ++it) + if ( *it ) + (*it)->UpdateCompile(); + // Excel-Filter deletes some Tables while loading, Listeners will + // only be triggered after the loading is done. + if ( !bInsertingFromOtherDoc ) + { + it = pTab.begin(); + for (; it != pTab.end(); ++it) + if ( *it ) + (*it)->StartAllListeners(); + SetDirty(); + } + // sheet names of references are not valid until sheet is deleted + pChartListenerCollection->UpdateScheduledSeriesRanges(); + + SetAutoCalc( bOldAutoCalc ); + bValid = true; + } + } + } + return bValid; +} + + sal_Bool ScDocument::RenameTab( SCTAB nTab, const String& rName, sal_Bool /* bUpdateRef */, sal_Bool bExternalDocument ) { @@ -525,7 +758,7 @@ sal_Bool ScDocument::RenameTab( SCTAB nTab, const String& rName, sal_Bool /* bUp bValid = true; // composed name else bValid = ValidTabName(rName); - for (i=0; (i<=MAXTAB) && bValid; i++) + for (i=0; (i< static_cast<SCTAB>(pTab.size())) && bValid; i++) if (pTab[i] && (i != nTab)) { String aOldName; @@ -542,9 +775,10 @@ sal_Bool ScDocument::RenameTab( SCTAB nTab, const String& rName, sal_Bool /* bUp // If formulas refer to the renamed sheet, the TokenArray remains valid, // but the XML stream must be re-generated. - for (i=0; i<=MAXTAB; ++i) - if (pTab[i] && pTab[i]->IsStreamValid()) - pTab[i]->SetStreamValid( false ); + TableContainer::iterator it = pTab.begin(); + for (; it != pTab.end(); ++it) + if ( *it && (*it)->IsStreamValid()) + (*it)->SetStreamValid( false ); } } return bValid; @@ -553,7 +787,7 @@ sal_Bool ScDocument::RenameTab( SCTAB nTab, const String& rName, sal_Bool /* bUp void ScDocument::SetVisible( SCTAB nTab, sal_Bool bVisible ) { - if (VALIDTAB(nTab)) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB> (pTab.size())) if (pTab[nTab]) pTab[nTab]->SetVisible(bVisible); } @@ -561,7 +795,7 @@ void ScDocument::SetVisible( SCTAB nTab, sal_Bool bVisible ) sal_Bool ScDocument::IsVisible( SCTAB nTab ) const { - if (VALIDTAB(nTab)) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB> (pTab.size())) if (pTab[nTab]) return pTab[nTab]->IsVisible(); @@ -571,7 +805,7 @@ sal_Bool ScDocument::IsVisible( SCTAB nTab ) const sal_Bool ScDocument::IsStreamValid( SCTAB nTab ) const { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB> (pTab.size()) && pTab[nTab] ) return pTab[nTab]->IsStreamValid(); return false; @@ -580,7 +814,7 @@ sal_Bool ScDocument::IsStreamValid( SCTAB nTab ) const void ScDocument::SetStreamValid( SCTAB nTab, sal_Bool bSet, sal_Bool bIgnoreLock ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB> (pTab.size()) && pTab[nTab] ) pTab[nTab]->SetStreamValid( bSet, bIgnoreLock ); } @@ -593,7 +827,7 @@ void ScDocument::LockStreamValid( bool bLock ) sal_Bool ScDocument::IsPendingRowHeights( SCTAB nTab ) const { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB> (pTab.size()) && pTab[nTab] ) return pTab[nTab]->IsPendingRowHeights(); return false; @@ -602,14 +836,14 @@ sal_Bool ScDocument::IsPendingRowHeights( SCTAB nTab ) const void ScDocument::SetPendingRowHeights( SCTAB nTab, sal_Bool bSet ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB> (pTab.size()) && pTab[nTab] ) pTab[nTab]->SetPendingRowHeights( bSet ); } void ScDocument::SetLayoutRTL( SCTAB nTab, sal_Bool bRTL ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB> (pTab.size()) && pTab[nTab] ) { if ( bImportingXML ) { @@ -654,7 +888,7 @@ void ScDocument::SetLayoutRTL( SCTAB nTab, sal_Bool bRTL ) sal_Bool ScDocument::IsLayoutRTL( SCTAB nTab ) const { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB> (pTab.size()) && pTab[nTab] ) return pTab[nTab]->IsLayoutRTL(); return false; @@ -681,7 +915,7 @@ sal_Bool ScDocument::IsNegativePage( SCTAB nTab ) const sal_Bool ScDocument::GetCellArea( SCTAB nTab, SCCOL& rEndCol, SCROW& rEndRow ) const { - if (VALIDTAB(nTab)) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB> (pTab.size())) if (pTab[nTab]) return pTab[nTab]->GetCellArea( rEndCol, rEndRow ); @@ -693,7 +927,7 @@ sal_Bool ScDocument::GetCellArea( SCTAB nTab, SCCOL& rEndCol, SCROW& rEndRow ) c sal_Bool ScDocument::GetTableArea( SCTAB nTab, SCCOL& rEndCol, SCROW& rEndRow ) const { - if (VALIDTAB(nTab)) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB> (pTab.size())) if (pTab[nTab]) return pTab[nTab]->GetTableArea( rEndCol, rEndRow ); @@ -704,7 +938,7 @@ sal_Bool ScDocument::GetTableArea( SCTAB nTab, SCCOL& rEndCol, SCROW& rEndRow ) bool ScDocument::ShrinkToDataArea(SCTAB nTab, SCCOL& rStartCol, SCROW& rStartRow, SCCOL& rEndCol, SCROW& rEndRow) const { - if (!ValidTab(nTab) || !pTab[nTab]) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB> (pTab.size()) || !pTab[nTab]) return false; SCCOL nCol1, nCol2; @@ -736,7 +970,7 @@ bool ScDocument::ShrinkToDataArea(SCTAB nTab, SCCOL& rStartCol, SCROW& rStartRow bool ScDocument::ShrinkToUsedDataArea( bool& o_bShrunk, SCTAB nTab, SCCOL& rStartCol, SCROW& rStartRow, SCCOL& rEndCol, SCROW& rEndRow, bool bColumnsOnly ) const { - if (!ValidTab(nTab) || !pTab[nTab]) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB> (pTab.size()) || !pTab[nTab]) { o_bShrunk = false; return false; @@ -749,7 +983,7 @@ bool ScDocument::ShrinkToUsedDataArea( bool& o_bShrunk, SCTAB nTab, SCCOL& rStar void ScDocument::GetDataArea( SCTAB nTab, SCCOL& rStartCol, SCROW& rStartRow, SCCOL& rEndCol, SCROW& rEndRow, sal_Bool bIncludeOld, bool bOnlyDown ) const { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB> (pTab.size()) && pTab[nTab]) pTab[nTab]->GetDataArea( rStartCol, rStartRow, rEndCol, rEndRow, bIncludeOld, bOnlyDown ); } @@ -757,7 +991,7 @@ void ScDocument::GetDataArea( SCTAB nTab, SCCOL& rStartCol, SCROW& rStartRow, void ScDocument::LimitChartArea( SCTAB nTab, SCCOL& rStartCol, SCROW& rStartRow, SCCOL& rEndCol, SCROW& rEndRow ) { - if (VALIDTAB(nTab)) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB> (pTab.size())) if (pTab[nTab]) pTab[nTab]->LimitChartArea( rStartCol, rStartRow, rEndCol, rEndRow ); } @@ -779,7 +1013,7 @@ void ScDocument::LimitChartIfAll( ScRangeListRef& rRangeList ) SCCOL nEndCol = aRange.aEnd.Col(); SCROW nEndRow = aRange.aEnd.Row(); SCTAB nTab = aRange.aStart.Tab(); - if (pTab[nTab]) + if ( nTab < static_cast<SCTAB> (pTab.size()) && pTab[nTab]) pTab[nTab]->LimitChartArea(nStartCol, nStartRow, nEndCol, nEndRow); aRange.aStart.SetCol( nStartCol ); aRange.aStart.SetRow( nStartRow ); @@ -797,17 +1031,17 @@ void ScDocument::LimitChartIfAll( ScRangeListRef& rRangeList ) } -void lcl_GetFirstTabRange( SCTAB& rTabRangeStart, SCTAB& rTabRangeEnd, const ScMarkData* pTabMark ) +void lcl_GetFirstTabRange( SCTAB& rTabRangeStart, SCTAB& rTabRangeEnd, const ScMarkData* pTabMark, SCTAB aMaxTab ) { // without ScMarkData, leave start/end unchanged if ( pTabMark ) { - for (SCTAB nTab=0; nTab<=MAXTAB; ++nTab) + for (SCTAB nTab=0; nTab< aMaxTab; ++nTab) if (pTabMark->GetTableSelect(nTab)) { // find first range of consecutive selected sheets rTabRangeStart = nTab; - while ( nTab+1 <= MAXTAB && pTabMark->GetTableSelect(nTab+1) ) + while ( nTab+1 < aMaxTab && pTabMark->GetTableSelect(nTab+1) ) ++nTab; rTabRangeEnd = nTab; return; @@ -815,16 +1049,16 @@ void lcl_GetFirstTabRange( SCTAB& rTabRangeStart, SCTAB& rTabRangeEnd, const ScM } } -bool lcl_GetNextTabRange( SCTAB& rTabRangeStart, SCTAB& rTabRangeEnd, const ScMarkData* pTabMark ) +bool lcl_GetNextTabRange( SCTAB& rTabRangeStart, SCTAB& rTabRangeEnd, const ScMarkData* pTabMark, SCTAB aMaxTab ) { if ( pTabMark ) { // find next range of consecutive selected sheets after rTabRangeEnd - for (SCTAB nTab=rTabRangeEnd+1; nTab<=MAXTAB; ++nTab) + for (SCTAB nTab=rTabRangeEnd+1; nTab< aMaxTab; ++nTab) if (pTabMark->GetTableSelect(nTab)) { rTabRangeStart = nTab; - while ( nTab+1 <= MAXTAB && pTabMark->GetTableSelect(nTab+1) ) + while ( nTab+1 < aMaxTab && pTabMark->GetTableSelect(nTab+1) ) ++nTab; rTabRangeEnd = nTab; return true; @@ -848,7 +1082,7 @@ sal_Bool ScDocument::CanInsertRow( const ScRange& rRange ) const SCSIZE nSize = static_cast<SCSIZE>(nEndRow - nStartRow + 1); sal_Bool bTest = sal_True; - for (SCTAB i=nStartTab; i<=nEndTab && bTest; i++) + for (SCTAB i=nStartTab; i<=nEndTab && bTest && i < static_cast<SCTAB>(pTab.size()); i++) if (pTab[i]) bTest &= pTab[i]->TestInsertRow( nStartCol, nEndCol, nSize ); @@ -868,14 +1102,14 @@ sal_Bool ScDocument::InsertRow( SCCOL nStartCol, SCTAB nStartTab, if ( pTabMark ) { nStartTab = 0; - nEndTab = MAXTAB; + nEndTab = static_cast<SCTAB>(pTab.size()) -1; } sal_Bool bTest = true; sal_Bool bRet = false; sal_Bool bOldAutoCalc = GetAutoCalc(); SetAutoCalc( false ); // avoid mulitple calculations - for ( i = nStartTab; i <= nEndTab && bTest; i++) + for ( i = nStartTab; i <= nEndTab && bTest && i < static_cast<SCTAB>(pTab.size()); i++) if (pTab[i] && (!pTabMark || pTabMark->GetTableSelect(i))) bTest &= pTab[i]->TestInsertRow( nStartCol, nEndCol, nSize ); if (bTest) @@ -886,31 +1120,31 @@ sal_Bool ScDocument::InsertRow( SCCOL nStartCol, SCTAB nStartTab, // handle chunks of consecutive selected sheets together SCTAB nTabRangeStart = nStartTab; SCTAB nTabRangeEnd = nEndTab; - lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ); + lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark, static_cast<SCTAB>(pTab.size()) ); do { UpdateBroadcastAreas( URM_INSDEL, ScRange( ScAddress( nStartCol, nStartRow, nTabRangeStart ), ScAddress( nEndCol, MAXROW, nTabRangeEnd )), 0, static_cast<SCsROW>(nSize), 0 ); } - while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ) ); + while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark, static_cast<SCTAB>(pTab.size()) ) ); - lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ); + lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark, static_cast<SCTAB>(pTab.size()) ); do { UpdateReference( URM_INSDEL, nStartCol, nStartRow, nTabRangeStart, nEndCol, MAXROW, nTabRangeEnd, 0, static_cast<SCsROW>(nSize), 0, pRefUndoDoc, false ); // without drawing objects } - while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ) ); + while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark, static_cast<SCTAB>(pTab.size()) ) ); - for (i=nStartTab; i<=nEndTab; i++) + for (i=nStartTab; i<=nEndTab && i < static_cast<SCTAB>(pTab.size()); i++) if (pTab[i] && (!pTabMark || pTabMark->GetTableSelect(i))) pTab[i]->InsertRow( nStartCol, nEndCol, nStartRow, nSize ); // UpdateRef for drawing layer must be after inserting, // when the new row heights are known. - for (i=nStartTab; i<=nEndTab; i++) + for (i=nStartTab; i<=nEndTab && static_cast<SCTAB>(pTab.size()); i++) if (pTab[i] && (!pTabMark || pTabMark->GetTableSelect(i))) pTab[i]->UpdateDrawRef( URM_INSDEL, nStartCol, nStartRow, nStartTab, nEndCol, MAXROW, nEndTab, @@ -924,14 +1158,16 @@ sal_Bool ScDocument::InsertRow( SCCOL nStartCol, SCTAB nStartTab, } else { // Listeners have been removed in UpdateReference - for (i=0; i<=MAXTAB; i++) - if (pTab[i]) - pTab[i]->StartNeededListeners(); + TableContainer::iterator it = pTab.begin(); + for (; it != pTab.end(); ++it) + if (*it) + (*it)->StartNeededListeners(); // at least all cells using range names pointing relative // to the moved range must recalculate - for (i=0; i<=MAXTAB; i++) - if (pTab[i]) - pTab[i]->SetRelNameDirty(); + it = pTab.begin(); + for (; it != pTab.end(); ++it) + if (*it) + (*it)->SetRelNameDirty(); } bRet = sal_True; } @@ -964,7 +1200,7 @@ void ScDocument::DeleteRow( SCCOL nStartCol, SCTAB nStartTab, if ( pTabMark ) { nStartTab = 0; - nEndTab = MAXTAB; + nEndTab = static_cast<SCTAB>(pTab.size())-1; } sal_Bool bOldAutoCalc = GetAutoCalc(); @@ -973,7 +1209,7 @@ void ScDocument::DeleteRow( SCCOL nStartCol, SCTAB nStartTab, // handle chunks of consecutive selected sheets together SCTAB nTabRangeStart = nStartTab; SCTAB nTabRangeEnd = nEndTab; - lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ); + lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark, static_cast<SCTAB>(pTab.size()) ); do { if ( ValidRow(nStartRow+nSize) ) @@ -990,37 +1226,39 @@ void ScDocument::DeleteRow( SCCOL nStartCol, SCTAB nStartTab, ScAddress( nStartCol, nStartRow, nTabRangeStart ), ScAddress( nEndCol, MAXROW, nTabRangeEnd ) ) ); } - while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ) ); + while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark, static_cast<SCTAB>(pTab.size()) ) ); if ( ValidRow(nStartRow+nSize) ) { - lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ); + lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark, static_cast<SCTAB>(pTab.size()) ); do { UpdateReference( URM_INSDEL, nStartCol, nStartRow+nSize, nTabRangeStart, nEndCol, MAXROW, nTabRangeEnd, 0, -(static_cast<SCsROW>(nSize)), 0, pRefUndoDoc, sal_True, false ); } - while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ) ); + while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark, static_cast<SCTAB>(pTab.size()) ) ); } if (pUndoOutline) *pUndoOutline = false; - for ( i = nStartTab; i <= nEndTab; i++) + for ( i = nStartTab; i <= nEndTab && i < static_cast<SCTAB>(pTab.size()); i++) if (pTab[i] && (!pTabMark || pTabMark->GetTableSelect(i))) pTab[i]->DeleteRow( nStartCol, nEndCol, nStartRow, nSize, pUndoOutline ); if ( ValidRow(nStartRow+nSize) ) { // Listeners have been removed in UpdateReference - for (i=0; i<=MAXTAB; i++) - if (pTab[i]) - pTab[i]->StartNeededListeners(); - // at least all cells using range names pointing relative to - // the moved range must recalculate - for (i=0; i<=MAXTAB; i++) - if (pTab[i]) - pTab[i]->SetRelNameDirty(); + TableContainer::iterator it = pTab.begin(); + for (; it != pTab.end(); ++it) + if (*it) + (*it)->StartNeededListeners(); + // at least all cells using range names pointing relative + // to the moved range must recalculate + it = pTab.begin(); + for (; it != pTab.end(); ++it) + if (*it) + (*it)->SetRelNameDirty(); } SetAutoCalc( bOldAutoCalc ); @@ -1051,7 +1289,7 @@ sal_Bool ScDocument::CanInsertCol( const ScRange& rRange ) const SCSIZE nSize = static_cast<SCSIZE>(nEndCol - nStartCol + 1); sal_Bool bTest = sal_True; - for (SCTAB i=nStartTab; i<=nEndTab && bTest; i++) + for (SCTAB i=nStartTab; i<=nEndTab && bTest && i < static_cast<SCTAB>(pTab.size()); i++) if (pTab[i]) bTest &= pTab[i]->TestInsertCol( nStartRow, nEndRow, nSize ); @@ -1071,14 +1309,14 @@ sal_Bool ScDocument::InsertCol( SCROW nStartRow, SCTAB nStartTab, if ( pTabMark ) { nStartTab = 0; - nEndTab = MAXTAB; + nEndTab = static_cast<SCTAB>(pTab.size())-1; } sal_Bool bTest = true; sal_Bool bRet = false; sal_Bool bOldAutoCalc = GetAutoCalc(); SetAutoCalc( false ); // avoid multiple calculations - for ( i = nStartTab; i <= nEndTab && bTest; i++) + for ( i = nStartTab; i <= nEndTab && bTest && i < static_cast<SCTAB>(pTab.size()); i++) if (pTab[i] && (!pTabMark || pTabMark->GetTableSelect(i))) bTest &= pTab[i]->TestInsertCol( nStartRow, nEndRow, nSize ); if (bTest) @@ -1086,25 +1324,25 @@ sal_Bool ScDocument::InsertCol( SCROW nStartRow, SCTAB nStartTab, // handle chunks of consecutive selected sheets together SCTAB nTabRangeStart = nStartTab; SCTAB nTabRangeEnd = nEndTab; - lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ); + lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark, static_cast<SCTAB>(pTab.size()) ); do { UpdateBroadcastAreas( URM_INSDEL, ScRange( ScAddress( nStartCol, nStartRow, nTabRangeStart ), ScAddress( MAXCOL, nEndRow, nTabRangeEnd )), static_cast<SCsCOL>(nSize), 0, 0 ); } - while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ) ); + while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark, static_cast<SCTAB>(pTab.size()) ) ); - lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ); + lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark, static_cast<SCTAB>(pTab.size()) ); do { UpdateReference( URM_INSDEL, nStartCol, nStartRow, nTabRangeStart, MAXCOL, nEndRow, nTabRangeEnd, static_cast<SCsCOL>(nSize), 0, 0, pRefUndoDoc, sal_True, false ); } - while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ) ); + while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark, static_cast<SCTAB>(pTab.size()) ) ); - for (i=nStartTab; i<=nEndTab; i++) + for (i=nStartTab; i<=nEndTab && i < static_cast<SCTAB>(pTab.size()); i++) if (pTab[i] && (!pTabMark || pTabMark->GetTableSelect(i))) pTab[i]->InsertCol( nStartCol, nStartRow, nEndRow, nSize ); @@ -1115,15 +1353,17 @@ sal_Bool ScDocument::InsertCol( SCROW nStartRow, SCTAB nStartTab, StartAllListeners(); } else - { // Listeners have been removed in UpdateReference - for (i=0; i<=MAXTAB; i++) - if (pTab[i]) - pTab[i]->StartNeededListeners(); + {// Listeners have been removed in UpdateReference + TableContainer::iterator it = pTab.begin(); + for (; it != pTab.end(); ++it) + if (*it) + (*it)->StartNeededListeners(); // at least all cells using range names pointing relative // to the moved range must recalculate - for (i=0; i<=MAXTAB; i++) - if (pTab[i]) - pTab[i]->SetRelNameDirty(); + it = pTab.begin(); + for (; it != pTab.end(); ++it) + if (*it) + (*it)->SetRelNameDirty(); } bRet = sal_True; } @@ -1154,7 +1394,7 @@ void ScDocument::DeleteCol(SCROW nStartRow, SCTAB nStartTab, SCROW nEndRow, SCTA if ( pTabMark ) { nStartTab = 0; - nEndTab = MAXTAB; + nEndTab = static_cast<SCTAB>(pTab.size())-1; } sal_Bool bOldAutoCalc = GetAutoCalc(); @@ -1163,7 +1403,7 @@ void ScDocument::DeleteCol(SCROW nStartRow, SCTAB nStartTab, SCROW nEndRow, SCTA // handle chunks of consecutive selected sheets together SCTAB nTabRangeStart = nStartTab; SCTAB nTabRangeEnd = nEndTab; - lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ); + lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark, static_cast<SCTAB>(pTab.size()) ); do { if ( ValidCol(sal::static_int_cast<SCCOL>(nStartCol+nSize)) ) @@ -1180,37 +1420,39 @@ void ScDocument::DeleteCol(SCROW nStartRow, SCTAB nStartTab, SCROW nEndRow, SCTA ScAddress( nStartCol, nStartRow, nTabRangeStart ), ScAddress( MAXCOL, nEndRow, nTabRangeEnd ) ) ); } - while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ) ); + while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark, static_cast<SCTAB>(pTab.size()) ) ); if ( ValidCol(sal::static_int_cast<SCCOL>(nStartCol+nSize)) ) { - lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ); + lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark, static_cast<SCTAB>(pTab.size()) ); do { UpdateReference( URM_INSDEL, sal::static_int_cast<SCCOL>(nStartCol+nSize), nStartRow, nTabRangeStart, MAXCOL, nEndRow, nTabRangeEnd, -static_cast<SCsCOL>(nSize), 0, 0, pRefUndoDoc, sal_True, false ); } - while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ) ); + while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark, static_cast<SCTAB>(pTab.size()) ) ); } if (pUndoOutline) *pUndoOutline = false; - for ( i = nStartTab; i <= nEndTab; i++) + for ( i = nStartTab; i <= nEndTab && i < static_cast<SCTAB>(pTab.size()); i++) if (pTab[i] && (!pTabMark || pTabMark->GetTableSelect(i))) pTab[i]->DeleteCol( nStartCol, nStartRow, nEndRow, nSize, pUndoOutline ); if ( ValidCol(sal::static_int_cast<SCCOL>(nStartCol+nSize)) ) - { // Listeners have been removed in UpdateReference - for (i=0; i<=MAXTAB; i++) - if (pTab[i]) - pTab[i]->StartNeededListeners(); - // at least all cells using range names pointing relative to - // the moved range must recalculate - for (i=0; i<=MAXTAB; i++) - if (pTab[i]) - pTab[i]->SetRelNameDirty(); + {// Listeners have been removed in UpdateReference + TableContainer::iterator it = pTab.begin(); + for (; it != pTab.end(); ++it) + if (*it) + (*it)->StartNeededListeners(); + // at least all cells using range names pointing relative + // to the moved range must recalculate + it = pTab.begin(); + for (; it != pTab.end(); ++it) + if (*it) + (*it)->SetRelNameDirty(); } SetAutoCalc( bOldAutoCalc ); @@ -1376,7 +1618,7 @@ void ScDocument::DeleteArea(SCCOL nCol1, SCROW nRow1, PutInOrder( nRow1, nRow2 ); sal_Bool bOldAutoCalc = GetAutoCalc(); SetAutoCalc( false ); // avoid multiple calculations - for (SCTAB i = 0; i <= MAXTAB; i++) + for (SCTAB i = 0; i < static_cast<SCTAB>(pTab.size()); i++) if (pTab[i]) if ( rMark.GetTableSelect(i) || bIsUndo ) pTab[i]->DeleteArea(nCol1, nRow1, nCol2, nRow2, nDelFlag); @@ -1390,7 +1632,7 @@ void ScDocument::DeleteAreaTab(SCCOL nCol1, SCROW nRow1, { PutInOrder( nCol1, nCol2 ); PutInOrder( nRow1, nRow2 ); - if ( VALIDTAB(nTab) && pTab[nTab] ) + if ( VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) { sal_Bool bOldAutoCalc = GetAutoCalc(); SetAutoCalc( false ); // avoid multiple calculations @@ -1419,11 +1661,21 @@ void ScDocument::InitUndoSelected( ScDocument* pSrcDoc, const ScMarkData& rTabSe xPoolHelper = pSrcDoc->xPoolHelper; String aString; - for (SCTAB nTab = 0; nTab <= MAXTAB; nTab++) + for (SCTAB nTab = 0; nTab < rTabSelection.GetLastSelected(); nTab++) if ( rTabSelection.GetTableSelect( nTab ) ) { - pTab[nTab] = new ScTable(this, nTab, aString, bColInfo, bRowInfo); - nMaxTableNumber = nTab + 1; + ScTable* pTable = new ScTable(this, nTab, aString, bColInfo, bRowInfo); + if (nTab < static_cast<SCTAB>(pTab.size())) + pTab[nTab] = pTable; + else + pTab.push_back(pTable); + } + else + { + if (nTab < static_cast<SCTAB>(pTab.size())) + pTab[nTab]=NULL; + else + pTab.push_back(NULL); } } else @@ -1443,10 +1695,13 @@ void ScDocument::InitUndo( ScDocument* pSrcDoc, SCTAB nTab1, SCTAB nTab2, xPoolHelper = pSrcDoc->xPoolHelper; String aString; + if ( nTab1 >= static_cast<SCTAB>(pTab.size())) + pTab.resize(nTab1 + 1, NULL); for (SCTAB nTab = nTab1; nTab <= nTab2; nTab++) - pTab[nTab] = new ScTable(this, nTab, aString, bColInfo, bRowInfo); - - nMaxTableNumber = nTab2 + 1; + { + ScTable* pTable = new ScTable(this, nTab, aString, bColInfo, bRowInfo); + pTab[nTab] = pTable; + } } else { @@ -1460,12 +1715,16 @@ void ScDocument::AddUndoTab( SCTAB nTab1, SCTAB nTab2, sal_Bool bColInfo, sal_Bo if (bIsUndo) { String aString; + if (nTab2 >= static_cast<SCTAB>(pTab.size())) + { + pTab.resize(nTab2+1,NULL); + } for (SCTAB nTab = nTab1; nTab <= nTab2; nTab++) if (!pTab[nTab]) + { pTab[nTab] = new ScTable(this, nTab, aString, bColInfo, bRowInfo); + } - if ( nMaxTableNumber <= nTab2 ) - nMaxTableNumber = nTab2 + 1; } else { @@ -1511,9 +1770,9 @@ void ScDocument::CopyToDocument(SCCOL nCol1, SCROW nRow1, SCTAB nTab1, { sal_Bool bOldAutoCalc = pDestDoc->GetAutoCalc(); pDestDoc->SetAutoCalc( false ); // avoid multiple calculations - for (SCTAB i = nTab1; i <= nTab2; i++) + for (SCTAB i = nTab1; i <= nTab2 && i < static_cast<SCTAB>(pTab.size()); i++) { - if (pTab[i] && pDestDoc->pTab[i]) + if (pTab[i] && i < static_cast<SCTAB>(pDestDoc->pTab.size()) && pDestDoc->pTab[i]) pTab[i]->CopyToTable( nCol1, nRow1, nCol2, nRow2, nFlags, bOnlyMarked, pDestDoc->pTab[i], pMarks, false, bColRowFlags ); @@ -1538,6 +1797,7 @@ void ScDocument::UndoToDocument(SCCOL nCol1, SCROW nRow1, SCTAB nTab1, if (nTab1 > 0) CopyToDocument( 0,0,0, MAXCOL,MAXROW,nTab1-1, IDF_FORMULA, false, pDestDoc, pMarks ); + OSL_ASSERT( nTab2 < static_cast<SCTAB>(pTab.size()) && nTab2 < static_cast<SCTAB>(pDestDoc->pTab.size())); for (SCTAB i = nTab1; i <= nTab2; i++) { if (pTab[i] && pDestDoc->pTab[i]) @@ -1563,8 +1823,8 @@ void ScDocument::CopyToDocument(const ScRange& rRange, pDestDoc->aDocName = aDocName; sal_Bool bOldAutoCalc = pDestDoc->GetAutoCalc(); pDestDoc->SetAutoCalc( false ); // avoid multiple calculations - for (SCTAB i = aNewRange.aStart.Tab(); i <= aNewRange.aEnd.Tab(); i++) - if (pTab[i] && pDestDoc->pTab[i]) + for (SCTAB i = aNewRange.aStart.Tab(); i <= aNewRange.aEnd.Tab() && i < static_cast<SCTAB>(pTab.size()); i++) + if (pTab[i] && i < static_cast<SCTAB>(pDestDoc->pTab.size()) && pDestDoc->pTab[i]) pTab[i]->CopyToTable(aNewRange.aStart.Col(), aNewRange.aStart.Row(), aNewRange.aEnd.Col(), aNewRange.aEnd.Row(), nFlags, bOnlyMarked, pDestDoc->pTab[i], @@ -1587,16 +1847,16 @@ void ScDocument::UndoToDocument(const ScRange& rRange, if (nTab1 > 0) CopyToDocument( 0,0,0, MAXCOL,MAXROW,nTab1-1, IDF_FORMULA, false, pDestDoc, pMarks ); - for (SCTAB i = nTab1; i <= nTab2; i++) + for (SCTAB i = nTab1; i <= nTab2 && i < static_cast<SCTAB>(pTab.size()); i++) { - if (pTab[i] && pDestDoc->pTab[i]) + if (pTab[i] && i < static_cast<SCTAB>(pDestDoc->pTab.size()) && pDestDoc->pTab[i]) pTab[i]->UndoToTable(aNewRange.aStart.Col(), aNewRange.aStart.Row(), aNewRange.aEnd.Col(), aNewRange.aEnd.Row(), nFlags, bOnlyMarked, pDestDoc->pTab[i], pMarks); } - if (nTab2 < MAXTAB) - CopyToDocument( 0,0,nTab2+1, MAXCOL,MAXROW,MAXTAB, IDF_FORMULA, false, pDestDoc, pMarks ); + if (nTab2 < static_cast<SCTAB>(pTab.size())) + CopyToDocument( 0,0,nTab2+1, MAXCOL,MAXROW,pTab.size(), IDF_FORMULA, false, pDestDoc, pMarks ); pDestDoc->SetAutoCalc( bOldAutoCalc ); } @@ -1622,9 +1882,9 @@ void ScDocument::CopyToClip(const ScClipParam& rClipParam, ScRange aClipRange = rClipParam.getWholeRange(); CopyRangeNamesToClip(pClipDoc, aClipRange, pMarks, bAllTabs); - for (SCTAB i = 0; i <= MAXTAB; ++i) + for (SCTAB i = 0; i < static_cast<SCTAB>(pTab.size()); ++i) { - if (!pTab[i] || !pClipDoc->pTab[i]) + if (!pTab[i] || i >= static_cast<SCTAB>(pClipDoc->pTab.size()) || !pClipDoc->pTab[i]) continue; if (pMarks && !pMarks->GetTableSelect(i)) @@ -1662,17 +1922,17 @@ void ScDocument::CopyToClip4VBA(const ScClipParam& rClipParam, ScDocument* pClip pClipDoc->ResetClip( this, nTab ); CopyRangeNamesToClip( pClipDoc, aClipRange, nTab ); - - if ( pTab[nTab] && pClipDoc->pTab[nTab] ) - { - pTab[nTab]->CopyToClip( rClipParam.maRanges, pClipDoc->pTab[nTab], bKeepScenarioFlags, bCloneNoteCaptions ); - if ( pDrawLayer && bIncludeObjects ) + if ( nTab < static_cast<SCTAB>(pTab.size()) && nTab < static_cast<SCTAB>(pClipDoc->pTab.size()) ) + if ( pTab[nTab] && pClipDoc->pTab[nTab] ) { - // Also copy drawing objects. - Rectangle aObjRect = GetMMRect( aClipRange.aStart.Col(), aClipRange.aStart.Row(), aClipRange.aEnd.Col(), aClipRange.aEnd.Row(), nTab ); - pDrawLayer->CopyToClip( pClipDoc, nTab, aObjRect ); + pTab[nTab]->CopyToClip( rClipParam.maRanges, pClipDoc->pTab[nTab], bKeepScenarioFlags, bCloneNoteCaptions ); + if ( pDrawLayer && bIncludeObjects ) + { + // Also copy drawing objects. + Rectangle aObjRect = GetMMRect( aClipRange.aStart.Col(), aClipRange.aStart.Row(), aClipRange.aEnd.Col(), aClipRange.aEnd.Row(), nTab ); + pDrawLayer->CopyToClip( pClipDoc, nTab, aObjRect ); + } } - } // Make sure to mark overlapped cells. pClipDoc->ExtendMerge( aClipRange, true ); @@ -1699,8 +1959,9 @@ void ScDocument::CopyTabToClip(SCCOL nCol1, SCROW nRow1, rClipParam.maRanges.Append(ScRange(nCol1, nRow1, 0, nCol2, nRow2, 0)); pClipDoc->ResetClip( this, nTab ); - if (pTab[nTab] && pClipDoc->pTab[nTab]) - pTab[nTab]->CopyToClip(nCol1, nRow1, nCol2, nRow2, pClipDoc->pTab[nTab], false, sal_True); + if (nTab < static_cast<SCTAB>(pTab.size()) && nTab < static_cast<SCTAB>(pClipDoc->pTab.size())) + if (pTab[nTab] && pClipDoc->pTab[nTab]) + pTab[nTab]->CopyToClip(nCol1, nRow1, nCol2, nRow2, pClipDoc->pTab[nTab], false, true); pClipDoc->GetClipParam().mbCutMode = false; } @@ -1739,7 +2000,7 @@ void ScDocument::TransposeClip( ScDocument* pTransClip, sal_uInt16 nFlags, sal_B ScRange aClipRange = GetClipParam().getWholeRange(); if ( ValidRow(aClipRange.aEnd.Row()-aClipRange.aStart.Row()) ) { - for (SCTAB i=0; i<=MAXTAB; i++) + for (SCTAB i=0; i< static_cast<SCTAB>(pTab.size()); i++) if (pTab[i]) { OSL_ENSURE( pTransClip->pTab[i], "TransposeClip: Table not there" ); @@ -1807,8 +2068,8 @@ void ScDocument::CopyRangeNamesToClip(ScDocument* pClipDoc, const ScRange& rClip return; std::set<sal_uInt16> aUsedNames; // indexes of named ranges that are used in the copied cells - for (SCTAB i = 0; i <= MAXTAB; ++i) - if (pTab[i] && pClipDoc->pTab[i]) + for (SCTAB i = 0; i < static_cast<SCTAB>(pTab.size()); ++i) + if (pTab[i] && i < static_cast<SCTAB>(pClipDoc->pTab.size()) && pClipDoc->pTab[i]) if ( bAllTabs || !pMarks || pMarks->GetTableSelect(i) ) pTab[i]->FindRangeNamesInUse( rClipRange.aStart.Col(), rClipRange.aStart.Row(), @@ -1824,12 +2085,13 @@ void ScDocument::CopyRangeNamesToClip(ScDocument* pClipDoc, const ScRange& rClip // Indexes of named ranges that are used in the copied cells std::set<sal_uInt16> aUsedNames; - if ( pTab[nTab] && pClipDoc->pTab[nTab] ) - { - pTab[nTab]->FindRangeNamesInUse( - rClipRange.aStart.Col(), rClipRange.aStart.Row(), - rClipRange.aEnd.Col(), rClipRange.aEnd.Row(), aUsedNames ); - } + if ( nTab < static_cast<SCTAB>(pTab.size()) && nTab < static_cast<SCTAB>(pClipDoc->pTab.size()) ) + if ( pTab[nTab] && pClipDoc->pTab[nTab] ) + { + pTab[nTab]->FindRangeNamesInUse( + rClipRange.aStart.Col(), rClipRange.aStart.Row(), + rClipRange.aEnd.Col(), rClipRange.aEnd.Row(), aUsedNames ); + } copyUsedNamesToClip(pClipDoc->GetRangeName(), pRangeName, aUsedNames); } @@ -1948,7 +2210,7 @@ void ScDocument::UpdateRangeNamesInFormulas( { do { - for (SCTAB k = 0; k <= MAXTAB; k++) + for (SCTAB k = 0; k < static_cast<SCTAB>(pTab.size()); k++) { if ( pTab[k] && rMark.GetTableSelect(k) ) pTab[k]->ReplaceRangeNamesInUse(nC1, nR1, @@ -1994,7 +2256,7 @@ void ScDocument::StartListeningFromClip( SCCOL nCol1, SCROW nRow1, { if (nInsFlag & IDF_CONTENTS) { - for (SCTAB i = 0; i <= MAXTAB; i++) + for (SCTAB i = 0; i < static_cast<SCTAB>(pTab.size()); i++) if (pTab[i]) if (rMark.GetTableSelect(i)) pTab[i]->StartListeningInArea( nCol1, nRow1, nCol2, nRow2 ); @@ -2009,7 +2271,7 @@ void ScDocument::BroadcastFromClip( SCCOL nCol1, SCROW nRow1, if (nInsFlag & IDF_CONTENTS) { ScBulkBroadcast aBulkBroadcast( GetBASM()); - for (SCTAB i = 0; i <= MAXTAB; i++) + for (SCTAB i = 0; i < static_cast<SCTAB>(pTab.size()); i++) if (pTab[i]) if (rMark.GetTableSelect(i)) pTab[i]->BroadcastInArea( nCol1, nRow1, nCol2, nRow2 ); @@ -2022,14 +2284,14 @@ void ScDocument::CopyBlockFromClip( SCCOL nCol1, SCROW nRow1, SCsCOL nDx, SCsROW nDy, const ScCopyBlockFromClipParams* pCBFCP ) { - ScTable** ppClipTab = pCBFCP->pClipDoc->pTab; + TableContainer& ppClipTab = pCBFCP->pClipDoc->pTab; SCTAB nTabEnd = pCBFCP->nTabEnd; SCTAB nClipTab = 0; - for (SCTAB i = pCBFCP->nTabStart; i <= nTabEnd; i++) + for (SCTAB i = pCBFCP->nTabStart; i <= nTabEnd && i < static_cast<SCTAB>(pTab.size()); i++) { if (pTab[i] && rMark.GetTableSelect(i) ) { - while (!ppClipTab[nClipTab]) nClipTab = (nClipTab+1) % (MAXTAB+1); + while (!ppClipTab[nClipTab]) nClipTab = (nClipTab+1) % (static_cast<SCTAB>(pTab.size())); pTab[i]->CopyFromClip( nCol1, nRow1, nCol2, nRow2, nDx, nDy, pCBFCP->nInsFlag, pCBFCP->bAsLink, pCBFCP->bSkipAttrForEmpty, ppClipTab[nClipTab] ); @@ -2055,17 +2317,17 @@ void ScDocument::CopyBlockFromClip( SCCOL nCol1, SCROW nRow1, } } - nClipTab = (nClipTab+1) % (MAXTAB+1); + nClipTab = (nClipTab+1) % (static_cast<SCTAB>(pTab.size())); } } if ( pCBFCP->nInsFlag & IDF_CONTENTS ) { nClipTab = 0; - for (SCTAB i = pCBFCP->nTabStart; i <= nTabEnd; i++) + for (SCTAB i = pCBFCP->nTabStart; i <= nTabEnd && i < static_cast<SCTAB>(pTab.size()); i++) { if (pTab[i] && rMark.GetTableSelect(i) ) { - while (!ppClipTab[nClipTab]) nClipTab = (nClipTab+1) % (MAXTAB+1); + while (!ppClipTab[nClipTab]) nClipTab = (nClipTab+1) % (static_cast<SCTAB>(pTab.size())); SCsTAB nDz = ((SCsTAB)i) - nClipTab; // ranges of consecutive selected tables (in clipboard and dest. doc) @@ -2091,7 +2353,7 @@ void ScDocument::CopyBlockFromClip( SCCOL nCol1, SCROW nRow1, nCol1, nRow1, i, nCol2, nRow2, i+nFollow, nDx, nDy, nDz, pCBFCP->pRefUndoDoc, false ); - nClipTab = (nClipTab+nFollow+1) % (MAXTAB+1); + nClipTab = (nClipTab+nFollow+1) % (static_cast<SCTAB>(pTab.size())); i = sal::static_int_cast<SCTAB>( i + nFollow ); } } @@ -2111,8 +2373,8 @@ void ScDocument::CopyNonFilteredFromClip( SCCOL nCol1, SCROW nRow1, // filtered state is taken from first used table in clipboard (as in GetClipArea) SCTAB nFlagTab = 0; - ScTable** ppClipTab = pCBFCP->pClipDoc->pTab; - while ( nFlagTab < MAXTAB && !ppClipTab[nFlagTab] ) + TableContainer& ppClipTab = pCBFCP->pClipDoc->pTab; + while ( nFlagTab < static_cast<SCTAB>(ppClipTab.size()) && !ppClipTab[nFlagTab] ) ++nFlagTab; SCROW nSourceRow = rClipStartRow; @@ -2180,7 +2442,7 @@ void ScDocument::CopyFromClip( const ScRange& rDestRange, const ScMarkData& rMar SCCOL nXw = 0; SCROW nYw = 0; ScRange aClipRange = pClipDoc->GetClipParam().getWholeRange(); - for (SCTAB nTab = 0; nTab <= MAXTAB; nTab++) // find largest merge overlap + for (SCTAB nTab = 0; nTab < static_cast<SCTAB>(pClipDoc->pTab.size()); nTab++) // find largest merge overlap if (pClipDoc->pTab[nTab]) // all sheets of the clipboard content { SCCOL nThisEndX = aClipRange.aEnd.Col(); @@ -2233,7 +2495,7 @@ void ScDocument::CopyFromClip( const ScRange& rDestRange, const ScMarkData& rMar // die Draw-Seitengroesse neu berechnet werden muss //! nur wenn ganze Zeilen/Spalten kopiert werden? - for (SCTAB j = 0; j <= MAXTAB; j++) + for (SCTAB j = 0; j < static_cast<SCTAB>(pTab.size()); j++) if (pTab[j] && rMark.GetTableSelect(j)) { if ( j < aCBFCP.nTabStart ) @@ -2319,7 +2581,7 @@ void ScDocument::CopyFromClip( const ScRange& rDestRange, const ScMarkData& rMar ScColumn::bDoubleAlloc = bOldDouble; - for (SCTAB k = 0; k <= MAXTAB; k++) + for (SCTAB k = 0; k < static_cast<SCTAB>(pTab.size()); k++) if (pTab[k] && rMark.GetTableSelect(k)) pTab[k]->DecRecalcLevel(); @@ -2385,7 +2647,7 @@ void ScDocument::CopyMultiRangeFromClip( aCBFCP.nTabStart = MAXTAB; aCBFCP.nTabEnd = 0; - for (SCTAB j = 0; j <= MAXTAB; ++j) + for (SCTAB j = 0; j < static_cast<SCTAB>(pTab.size()); ++j) { if (pTab[j] && rMark.GetTableSelect(j)) { @@ -2455,7 +2717,7 @@ void ScDocument::CopyMultiRangeFromClip( nCol1 += p->aEnd.Col() - p->aStart.Col() + 1; } - for (SCTAB i = 0; i <= MAXTAB; i++) + for (SCTAB i = 0; i < static_cast<SCTAB>(pTab.size()); i++) if (pTab[i] && rMark.GetTableSelect(i)) pTab[i]->DecRecalcLevel(); @@ -2535,7 +2797,7 @@ void ScDocument::GetClipArea(SCCOL& nClipX, SCROW& nClipY, sal_Bool bIncludeFilt // count non-filtered rows // count on first used table in clipboard SCTAB nCountTab = 0; - while ( nCountTab < MAXTAB && !pTab[nCountTab] ) + while ( nCountTab < static_cast<SCTAB>(pTab.size()) && !pTab[nCountTab] ) ++nCountTab; SCROW nResult = CountNonFilteredRows(nStartRow, nEndRow, nCountTab); @@ -2570,7 +2832,7 @@ sal_Bool ScDocument::HasClipFilteredRows() { // count on first used table in clipboard SCTAB nCountTab = 0; - while ( nCountTab < MAXTAB && !pTab[nCountTab] ) + while ( nCountTab < static_cast<SCTAB>(pTab.size()) && !pTab[nCountTab] ) ++nCountTab; ScRangeList& rClipRanges = GetClipParam().maRanges; @@ -2593,8 +2855,8 @@ void ScDocument::MixDocument( const ScRange& rRange, sal_uInt16 nFunction, sal_B { SCTAB nTab1 = rRange.aStart.Tab(); SCTAB nTab2 = rRange.aEnd.Tab(); - for (SCTAB i = nTab1; i <= nTab2; i++) - if (pTab[i] && pSrcDoc->pTab[i]) + for (SCTAB i = nTab1; i <= nTab2 && i < static_cast<SCTAB>(pTab.size()); i++) + if (pTab[i] && i < static_cast<SCTAB>(pSrcDoc->pTab.size()) && pSrcDoc->pTab[i]) pTab[i]->MixData( rRange.aStart.Col(), rRange.aStart.Row(), rRange.aEnd.Col(), rRange.aEnd.Row(), nFunction, bSkipEmpty, pSrcDoc->pTab[i] ); @@ -2611,7 +2873,7 @@ void ScDocument::FillTab( const ScRange& rSrcArea, const ScMarkData& rMark, SCTAB nSrcTab = rSrcArea.aStart.Tab(); - if (ValidTab(nSrcTab) && pTab[nSrcTab]) + if (ValidTab(nSrcTab) && nSrcTab < static_cast<SCTAB>(pTab.size()) && pTab[nSrcTab]) { SCCOL nStartCol = rSrcArea.aStart.Col(); SCROW nStartRow = rSrcArea.aStart.Row(); @@ -2623,7 +2885,7 @@ void ScDocument::FillTab( const ScRange& rSrcArea, const ScMarkData& rMark, sal_Bool bOldAutoCalc = GetAutoCalc(); SetAutoCalc( false ); // avoid multiple calculations - SCTAB nCount = GetTableCount(); + SCTAB nCount = static_cast<SCTAB>(pTab.size()); for (SCTAB i=0; i<nCount; i++) if ( i!=nSrcTab && pTab[i] && rMark.GetTableSelect(i) ) { @@ -2667,7 +2929,7 @@ void ScDocument::FillTabMarked( SCTAB nSrcTab, const ScMarkData& rMark, if (nDelFlags & IDF_CONTENTS) nDelFlags |= IDF_CONTENTS; // immer alle Inhalte oder keine loeschen! - if (ValidTab(nSrcTab) && pTab[nSrcTab]) + if (ValidTab(nSrcTab) && nSrcTab < static_cast<SCTAB>(pTab.size()) && pTab[nSrcTab]) { ScDocument* pMixDoc = NULL; sal_Bool bDoMix = ( bSkipEmpty || nFunction ) && ( nFlags & IDF_CONTENTS ); @@ -2682,7 +2944,7 @@ void ScDocument::FillTabMarked( SCTAB nSrcTab, const ScMarkData& rMark, SCCOL nEndCol = aArea.aEnd.Col(); SCROW nEndRow = aArea.aEnd.Row(); - SCTAB nCount = GetTableCount(); + SCTAB nCount = static_cast<SCTAB>(pTab.size()); for (SCTAB i=0; i<nCount; i++) if ( i!=nSrcTab && pTab[i] && rMark.GetTableSelect(i) ) { @@ -2722,14 +2984,15 @@ void ScDocument::PutCell( SCCOL nCol, SCROW nRow, SCTAB nTab, ScBaseCell* pCell, { if (VALIDTAB(nTab)) { - if ( bForceTab && !pTab[nTab] ) + if ( bForceTab && ( nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab]) ) { sal_Bool bExtras = !bIsUndo; // Spaltenbreiten, Zeilenhoehen, Flags + if (nTab >= static_cast<SCTAB>(pTab.size())) + pTab.resize(nTab + 1,NULL); pTab[nTab] = new ScTable(this, nTab, String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("temp")), bExtras, bExtras); - ++nMaxTableNumber; } if (pTab[nTab]) @@ -2741,14 +3004,15 @@ void ScDocument::PutCell( SCCOL nCol, SCROW nRow, SCTAB nTab, ScBaseCell* pCell, void ScDocument::PutCell( const ScAddress& rPos, ScBaseCell* pCell, sal_Bool bForceTab ) { SCTAB nTab = rPos.Tab(); - if ( bForceTab && !pTab[nTab] ) + if ( bForceTab && ( nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab]) ) { sal_Bool bExtras = !bIsUndo; // Spaltenbreiten, Zeilenhoehen, Flags + if (nTab >= static_cast<SCTAB>(pTab.size())) + pTab.resize(nTab + 1,NULL); pTab[nTab] = new ScTable(this, nTab, String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("temp")), bExtras, bExtras); - ++nMaxTableNumber; } if (pTab[nTab]) @@ -2759,7 +3023,7 @@ void ScDocument::PutCell( const ScAddress& rPos, ScBaseCell* pCell, sal_Bool bFo sal_Bool ScDocument::SetString( SCCOL nCol, SCROW nRow, SCTAB nTab, const String& rString, ScSetStringParam* pParam ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->SetString( nCol, nRow, nTab, rString, pParam ); else return false; @@ -2768,7 +3032,7 @@ sal_Bool ScDocument::SetString( SCCOL nCol, SCROW nRow, SCTAB nTab, const String void ScDocument::SetValue( SCCOL nCol, SCROW nRow, SCTAB nTab, const double& rVal ) { - if (VALIDTAB(nTab)) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size())) if (pTab[nTab]) pTab[nTab]->SetValue( nCol, nRow, rVal ); } @@ -2776,7 +3040,7 @@ void ScDocument::SetValue( SCCOL nCol, SCROW nRow, SCTAB nTab, const double& rVa void ScDocument::GetString( SCCOL nCol, SCROW nRow, SCTAB nTab, String& rString ) { - if ( VALIDTAB(nTab) && pTab[nTab] ) + if ( VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->GetString( nCol, nRow, rString ); else rString.Erase(); @@ -2791,7 +3055,7 @@ void ScDocument::GetString( SCCOL nCol, SCROW nRow, SCTAB nTab, rtl::OUString& r void ScDocument::GetInputString( SCCOL nCol, SCROW nRow, SCTAB nTab, String& rString ) { - if ( VALIDTAB(nTab) && pTab[nTab] ) + if ( VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->GetInputString( nCol, nRow, rString ); else rString.Erase(); @@ -2800,7 +3064,7 @@ void ScDocument::GetInputString( SCCOL nCol, SCROW nRow, SCTAB nTab, String& rSt void ScDocument::GetValue( SCCOL nCol, SCROW nRow, SCTAB nTab, double& rValue ) { - if ( VALIDTAB(nTab) && pTab[nTab] ) + if ( VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) rValue = pTab[nTab]->GetValue( nCol, nRow ); else rValue = 0.0; @@ -2810,7 +3074,7 @@ void ScDocument::GetValue( SCCOL nCol, SCROW nRow, SCTAB nTab, double& rValue ) double ScDocument::GetValue( const ScAddress& rPos ) { SCTAB nTab = rPos.Tab(); - if ( pTab[nTab] ) + if ( nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->GetValue( rPos ); return 0.0; } @@ -2819,7 +3083,7 @@ double ScDocument::GetValue( const ScAddress& rPos ) void ScDocument::GetNumberFormat( SCCOL nCol, SCROW nRow, SCTAB nTab, sal_uInt32& rFormat ) const { - if (VALIDTAB(nTab)) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size())) if (pTab[nTab]) { rFormat = pTab[nTab]->GetNumberFormat( nCol, nRow ); @@ -2839,7 +3103,7 @@ sal_uInt32 ScDocument::GetNumberFormat( const ScRange& rRange ) const sal_uInt32 nFormat = 0; bool bFirstItem = true; - for (SCTAB nTab = nTab1; nTab <= nTab2; ++nTab) + for (SCTAB nTab = nTab1; nTab <= nTab2 && nTab < static_cast<SCTAB>(pTab.size()) ; ++nTab) for (SCCOL nCol = nCol1; nCol <= nCol2; ++nCol) { sal_uInt32 nThisFormat = pTab[nTab]->GetNumberFormat(nCol, nRow1, nRow2); @@ -2868,7 +3132,7 @@ void ScDocument::GetNumberFormatInfo( short& nType, sal_uLong& nIndex, const ScAddress& rPos, const ScBaseCell* pCell ) const { SCTAB nTab = rPos.Tab(); - if ( pTab[nTab] ) + if ( nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) { nIndex = pTab[nTab]->GetNumberFormat( rPos ); if ( (nIndex % SV_COUNTRY_LANGUAGE_OFFSET) == 0 && pCell && @@ -2887,7 +3151,7 @@ void ScDocument::GetNumberFormatInfo( short& nType, sal_uLong& nIndex, void ScDocument::GetFormula( SCCOL nCol, SCROW nRow, SCTAB nTab, String& rFormula ) const { - if ( VALIDTAB(nTab) && pTab[nTab] ) + if ( VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->GetFormula( nCol, nRow, rFormula ); else rFormula.Erase(); @@ -2897,7 +3161,7 @@ void ScDocument::GetFormula( SCCOL nCol, SCROW nRow, SCTAB nTab, String& rFormul CellType ScDocument::GetCellType( const ScAddress& rPos ) const { SCTAB nTab = rPos.Tab(); - if ( pTab[nTab] ) + if ( nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->GetCellType( rPos ); return CELLTYPE_NONE; } @@ -2906,7 +3170,7 @@ CellType ScDocument::GetCellType( const ScAddress& rPos ) const void ScDocument::GetCellType( SCCOL nCol, SCROW nRow, SCTAB nTab, CellType& rCellType ) const { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) rCellType = pTab[nTab]->GetCellType( nCol, nRow ); else rCellType = CELLTYPE_NONE; @@ -2916,7 +3180,7 @@ void ScDocument::GetCellType( SCCOL nCol, SCROW nRow, SCTAB nTab, void ScDocument::GetCell( SCCOL nCol, SCROW nRow, SCTAB nTab, ScBaseCell*& rpCell ) const { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) rpCell = pTab[nTab]->GetCell( nCol, nRow ); else { @@ -2929,7 +3193,7 @@ void ScDocument::GetCell( SCCOL nCol, SCROW nRow, SCTAB nTab, ScBaseCell* ScDocument::GetCell( const ScAddress& rPos ) const { SCTAB nTab = rPos.Tab(); - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) return pTab[nTab]->GetCell( rPos ); OSL_FAIL("GetCell ohne Tabelle"); @@ -2939,7 +3203,7 @@ ScBaseCell* ScDocument::GetCell( const ScAddress& rPos ) const sal_Bool ScDocument::HasStringData( SCCOL nCol, SCROW nRow, SCTAB nTab ) const { - if ( VALIDTAB(nTab) && pTab[nTab] ) + if ( VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->HasStringData( nCol, nRow ); else return false; @@ -2948,7 +3212,7 @@ sal_Bool ScDocument::HasStringData( SCCOL nCol, SCROW nRow, SCTAB nTab ) const sal_Bool ScDocument::HasValueData( SCCOL nCol, SCROW nRow, SCTAB nTab ) const { - if ( VALIDTAB(nTab) && pTab[nTab] ) + if ( VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->HasValueData( nCol, nRow ); else return false; @@ -2966,7 +3230,7 @@ sal_Bool ScDocument::HasStringCells( const ScRange& rRange ) const SCROW nEndRow = rRange.aEnd.Row(); SCTAB nEndTab = rRange.aEnd.Tab(); - for ( SCTAB nTab=nStartTab; nTab<=nEndTab; nTab++ ) + for ( SCTAB nTab=nStartTab; nTab<=nEndTab && nTab < static_cast<SCTAB>(pTab.size()); nTab++ ) if ( pTab[nTab] && pTab[nTab]->HasStringCells( nStartCol, nStartRow, nEndCol, nEndRow ) ) return sal_True; @@ -2989,14 +3253,14 @@ sal_Bool ScDocument::HasSelectionData( SCCOL nCol, SCROW nRow, SCTAB nTab ) cons ScPostIt* ScDocument::GetNote( const ScAddress& rPos ) { - ScTable* pTable = ValidTab( rPos.Tab() ) ? pTab[ rPos.Tab() ] : 0; + ScTable* pTable = ValidTab( rPos.Tab() ) && rPos.Tab() < static_cast<SCTAB>(pTab.size()) ? pTab[ rPos.Tab() ] : 0; return pTable ? pTable->GetNote( rPos.Col(), rPos.Row() ) : 0; } void ScDocument::TakeNote( const ScAddress& rPos, ScPostIt*& rpNote ) { - if( ValidTab( rPos.Tab() ) && pTab[ rPos.Tab() ] ) + if( ValidTab( rPos.Tab() ) && rPos.Tab() < static_cast<SCTAB>(pTab.size()) && pTab[ rPos.Tab() ] ) pTab[ rPos.Tab() ]->TakeNote( rPos.Col(), rPos.Row(), rpNote ); else DELETEZ( rpNote ); @@ -3005,7 +3269,7 @@ void ScDocument::TakeNote( const ScAddress& rPos, ScPostIt*& rpNote ) ScPostIt* ScDocument::ReleaseNote( const ScAddress& rPos ) { - ScTable* pTable = ValidTab( rPos.Tab() ) ? pTab[ rPos.Tab() ] : 0; + ScTable* pTable = ValidTab( rPos.Tab() ) && rPos.Tab() < static_cast<SCTAB>(pTab.size())? pTab[ rPos.Tab() ] : 0; return pTable ? pTable->ReleaseNote( rPos.Col(), rPos.Row() ) : 0; } @@ -3024,20 +3288,20 @@ ScPostIt* ScDocument::GetOrCreateNote( const ScAddress& rPos ) void ScDocument::DeleteNote( const ScAddress& rPos ) { - if( ValidTab( rPos.Tab() ) && pTab[ rPos.Tab() ] ) + if( ValidTab( rPos.Tab() ) && rPos.Tab() < static_cast<SCTAB>(pTab.size()) && pTab[ rPos.Tab() ] ) pTab[ rPos.Tab() ]->DeleteNote( rPos.Col(), rPos.Row() ); } void ScDocument::InitializeNoteCaptions( SCTAB nTab, bool bForced ) { - if( ValidTab( nTab ) && pTab[ nTab ] ) + if( ValidTab( nTab ) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[ nTab ] ) pTab[ nTab ]->InitializeNoteCaptions( bForced ); } void ScDocument::InitializeAllNoteCaptions( bool bForced ) { - for( SCTAB nTab = 0; nTab < GetTableCount(); ++nTab ) + for( SCTAB nTab = 0; nTab < static_cast<SCTAB>(pTab.size()); ++nTab ) InitializeNoteCaptions( nTab, bForced ); } @@ -3047,8 +3311,10 @@ void ScDocument::SetDirty() bAutoCalc = false; // keine Mehrfachberechnung { // scope for bulk broadcast ScBulkBroadcast aBulkBroadcast( GetBASM()); - for (SCTAB i=0; i<=MAXTAB; i++) - if (pTab[i]) pTab[i]->SetDirty(); + TableContainer::iterator it = pTab.begin(); + for (;it != pTab.end(); ++it) + if (*it) + (*it)->SetDirty(); } // Charts werden zwar auch ohne AutoCalc im Tracking auf Dirty gesetzt, @@ -3068,7 +3334,7 @@ void ScDocument::SetDirty( const ScRange& rRange ) { // scope for bulk broadcast ScBulkBroadcast aBulkBroadcast( GetBASM()); SCTAB nTab2 = rRange.aEnd.Tab(); - for (SCTAB i=rRange.aStart.Tab(); i<=nTab2; i++) + for (SCTAB i=rRange.aStart.Tab(); i<=nTab2 && i < static_cast<SCTAB>(pTab.size()); i++) if (pTab[i]) pTab[i]->SetDirty( rRange ); } SetAutoCalc( bOldAutoCalc ); @@ -3080,7 +3346,7 @@ void ScDocument::SetTableOpDirty( const ScRange& rRange ) sal_Bool bOldAutoCalc = GetAutoCalc(); bAutoCalc = false; // no multiple recalculation SCTAB nTab2 = rRange.aEnd.Tab(); - for (SCTAB i=rRange.aStart.Tab(); i<=nTab2; i++) + for (SCTAB i=rRange.aStart.Tab(); i<=nTab2 && i < static_cast<SCTAB>(pTab.size()); i++) if (pTab[i]) pTab[i]->SetTableOpDirty( rRange ); SetAutoCalc( bOldAutoCalc ); } @@ -3131,11 +3397,13 @@ void ScDocument::CalcAll() ClearLookupCaches(); // Ensure we don't deliver zombie data. sal_Bool bOldAutoCalc = GetAutoCalc(); SetAutoCalc( sal_True ); - SCTAB i; - for (i=0; i<=MAXTAB; i++) - if (pTab[i]) pTab[i]->SetDirtyVar(); - for (i=0; i<=MAXTAB; i++) - if (pTab[i]) pTab[i]->CalcAll(); + TableContainer::iterator it = pTab.begin(); + for (; it != pTab.end(); ++it) + if (*it) + (*it)->SetDirtyVar(); + for (; it != pTab.end(); ++it) + if (*it) + (*it)->CalcAll(); ClearFormulaTree(); SetAutoCalc( bOldAutoCalc ); } @@ -3146,8 +3414,10 @@ void ScDocument::CompileAll() if ( pCondFormList ) pCondFormList->CompileAll(); - for (SCTAB i=0; i<=MAXTAB; i++) - if (pTab[i]) pTab[i]->CompileAll(); + TableContainer::iterator it = pTab.begin(); + for (; it != pTab.end(); ++it) + if (*it) + (*it)->CompileAll(); SetDirty(); } @@ -3163,8 +3433,10 @@ void ScDocument::CompileXML() OSL_ENSURE( !pAutoNameCache, "AutoNameCache already set" ); pAutoNameCache = new ScAutoNameCache( this ); - for (SCTAB i=0; i<=MAXTAB; i++) - if (pTab[i]) pTab[i]->CompileXML( aProgress ); + TableContainer::iterator it = pTab.begin(); + for (; it != pTab.end(); ++it) + if (*it) + (*it)->CompileXML( aProgress ); DELETEZ( pAutoNameCache ); // valid only during CompileXML, where cell contents don't change @@ -3180,16 +3452,17 @@ void ScDocument::CompileXML() void ScDocument::CalcAfterLoad() { - SCTAB i; - if (bIsClip) // Excel-Dateien werden aus dem Clipboard in ein Clip-Doc geladen return; // dann wird erst beim Einfuegen in das richtige Doc berechnet - bCalcingAfterLoad = sal_True; - for ( i = 0; i <= MAXTAB; i++) - if (pTab[i]) pTab[i]->CalcAfterLoad(); - for (i=0; i<=MAXTAB; i++) - if (pTab[i]) pTab[i]->SetDirtyAfterLoad(); + bCalcingAfterLoad = true; + TableContainer::iterator it = pTab.begin(); + for (; it != pTab.end(); ++it) + if (*it) + (*it)->CalcAfterLoad(); + for (it = pTab.begin(); it != pTab.end(); ++it) + if (*it) + (*it)->SetDirtyAfterLoad(); bCalcingAfterLoad = false; SetDetectiveDirty(false); // noch keine wirklichen Aenderungen @@ -3212,7 +3485,7 @@ void ScDocument::CalcAfterLoad() sal_uInt16 ScDocument::GetErrCode( const ScAddress& rPos ) const { SCTAB nTab = rPos.Tab(); - if ( pTab[nTab] ) + if ( nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->GetErrCode( rPos ); return 0; } @@ -3222,7 +3495,7 @@ void ScDocument::ResetChanged( const ScRange& rRange ) { SCTAB nStartTab = rRange.aStart.Tab(); SCTAB nEndTab = rRange.aEnd.Tab(); - for (SCTAB nTab=nStartTab; nTab<=nEndTab; nTab++) + for (SCTAB nTab=nStartTab; nTab<=nEndTab && nTab < static_cast<SCTAB>(pTab.size()); nTab++) if (pTab[nTab]) pTab[nTab]->ResetChanged( rRange ); } @@ -3234,46 +3507,46 @@ void ScDocument::ResetChanged( const ScRange& rRange ) void ScDocument::SetColWidth( SCCOL nCol, SCTAB nTab, sal_uInt16 nNewWidth ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->SetColWidth( nCol, nNewWidth ); } void ScDocument::SetColWidthOnly( SCCOL nCol, SCTAB nTab, sal_uInt16 nNewWidth ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->SetColWidthOnly( nCol, nNewWidth ); } void ScDocument::SetRowHeight( SCROW nRow, SCTAB nTab, sal_uInt16 nNewHeight ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->SetRowHeight( nRow, nNewHeight ); } void ScDocument::SetRowHeightRange( SCROW nStartRow, SCROW nEndRow, SCTAB nTab, sal_uInt16 nNewHeight ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->SetRowHeightRange ( nStartRow, nEndRow, nNewHeight, 1.0, 1.0 ); } void ScDocument::SetRowHeightOnly( SCROW nStartRow, SCROW nEndRow, SCTAB nTab, sal_uInt16 nNewHeight ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->SetRowHeightOnly( nStartRow, nEndRow, nNewHeight ); } void ScDocument::SetManualHeight( SCROW nStartRow, SCROW nEndRow, SCTAB nTab, sal_Bool bManual ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->SetManualHeight( nStartRow, nEndRow, bManual ); } sal_uInt16 ScDocument::GetColWidth( SCCOL nCol, SCTAB nTab ) const { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->GetColWidth( nCol ); OSL_FAIL("Falsche Tabellennummer"); return 0; @@ -3282,7 +3555,7 @@ sal_uInt16 ScDocument::GetColWidth( SCCOL nCol, SCTAB nTab ) const sal_uInt16 ScDocument::GetOriginalWidth( SCCOL nCol, SCTAB nTab ) const { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->GetOriginalWidth( nCol ); OSL_FAIL("Falsche Tabellennummer"); return 0; @@ -3291,7 +3564,7 @@ sal_uInt16 ScDocument::GetOriginalWidth( SCCOL nCol, SCTAB nTab ) const sal_uInt16 ScDocument::GetCommonWidth( SCCOL nEndCol, SCTAB nTab ) const { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->GetCommonWidth( nEndCol ); OSL_FAIL("Wrong table number"); return 0; @@ -3300,7 +3573,7 @@ sal_uInt16 ScDocument::GetCommonWidth( SCCOL nEndCol, SCTAB nTab ) const sal_uInt16 ScDocument::GetOriginalHeight( SCROW nRow, SCTAB nTab ) const { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->GetOriginalHeight( nRow ); OSL_FAIL("Wrong table number"); return 0; @@ -3309,7 +3582,7 @@ sal_uInt16 ScDocument::GetOriginalHeight( SCROW nRow, SCTAB nTab ) const sal_uInt16 ScDocument::GetRowHeight( SCROW nRow, SCTAB nTab, bool bHiddenAsZero ) const { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->GetRowHeight( nRow, NULL, NULL, bHiddenAsZero ); OSL_FAIL("Wrong sheet number"); return 0; @@ -3318,7 +3591,7 @@ sal_uInt16 ScDocument::GetRowHeight( SCROW nRow, SCTAB nTab, bool bHiddenAsZero sal_uInt16 ScDocument::GetRowHeight( SCROW nRow, SCTAB nTab, SCROW* pStartRow, SCROW* pEndRow, bool bHiddenAsZero ) const { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->GetRowHeight( nRow, pStartRow, pEndRow, bHiddenAsZero ); OSL_FAIL("Wrong sheet number"); return 0; @@ -3334,7 +3607,7 @@ sal_uLong ScDocument::GetRowHeight( SCROW nStartRow, SCROW nEndRow, SCTAB nTab ) if (nStartRow > nEndRow) return 0; - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->GetRowHeight( nStartRow, nEndRow); OSL_FAIL("wrong sheet number"); @@ -3357,7 +3630,7 @@ sal_uLong ScDocument::GetScaledRowHeight( SCROW nStartRow, SCROW nEndRow, if (nStartRow > nEndRow) return 0; - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->GetScaledRowHeight( nStartRow, nEndRow, fScale); OSL_FAIL("wrong sheet number"); @@ -3366,7 +3639,7 @@ sal_uLong ScDocument::GetScaledRowHeight( SCROW nStartRow, SCROW nEndRow, SCROW ScDocument::GetHiddenRowCount( SCROW nRow, SCTAB nTab ) const { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->GetHiddenRowCount( nRow ); OSL_FAIL("Falsche Tabellennummer"); return 0; @@ -3375,7 +3648,7 @@ SCROW ScDocument::GetHiddenRowCount( SCROW nRow, SCTAB nTab ) const sal_uLong ScDocument::GetColOffset( SCCOL nCol, SCTAB nTab ) const { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->GetColOffset( nCol ); OSL_FAIL("Falsche Tabellennummer"); return 0; @@ -3384,7 +3657,7 @@ sal_uLong ScDocument::GetColOffset( SCCOL nCol, SCTAB nTab ) const sal_uLong ScDocument::GetRowOffset( SCROW nRow, SCTAB nTab ) const { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->GetRowOffset( nRow ); OSL_FAIL("Falsche Tabellennummer"); return 0; @@ -3397,7 +3670,7 @@ sal_uInt16 ScDocument::GetOptimalColWidth( SCCOL nCol, SCTAB nTab, OutputDevice* sal_Bool bFormula, const ScMarkData* pMarkData, const ScColWidthParam* pParam ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->GetOptimalColWidth( nCol, pDev, nPPTX, nPPTY, rZoomX, rZoomY, bFormula, pMarkData, pParam ); OSL_FAIL("Falsche Tabellennummer"); @@ -3411,7 +3684,7 @@ long ScDocument::GetNeededSize( SCCOL nCol, SCROW nRow, SCTAB nTab, const Fraction& rZoomX, const Fraction& rZoomY, sal_Bool bWidth, sal_Bool bTotalSize ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->GetNeededSize ( nCol, nRow, pDev, nPPTX, nPPTY, rZoomX, rZoomY, bWidth, bTotalSize ); OSL_FAIL("Falsche Tabellennummer"); @@ -3426,7 +3699,7 @@ sal_Bool ScDocument::SetOptimalHeight( SCROW nStartRow, SCROW nEndRow, SCTAB nTa sal_Bool bShrink ) { //! MarkToMulti(); - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->SetOptimalHeight( nStartRow, nEndRow, nExtra, pDev, nPPTX, nPPTY, rZoomX, rZoomY, bShrink ); OSL_FAIL("Falsche Tabellennummer"); @@ -3440,14 +3713,14 @@ void ScDocument::UpdateAllRowHeights( OutputDevice* pDev, double nPPTX, double n // one progress across all (selected) sheets sal_uLong nCellCount = 0; - for ( SCTAB nTab=0; nTab<=MAXTAB; nTab++ ) + for ( SCTAB nTab=0; nTab< static_cast<SCTAB>(pTab.size()); nTab++ ) if ( pTab[nTab] && ( !pTabMark || pTabMark->GetTableSelect(nTab) ) ) nCellCount += pTab[nTab]->GetWeightedCount(); ScProgress aProgress( GetDocumentShell(), ScGlobal::GetRscString(STR_PROGRESS_HEIGHTING), nCellCount ); sal_uLong nProgressStart = 0; - for ( SCTAB nTab=0; nTab<=MAXTAB; nTab++ ) + for ( SCTAB nTab=0; nTab< static_cast<SCTAB>(pTab.size()); nTab++ ) if ( pTab[nTab] && ( !pTabMark || pTabMark->GetTableSelect(nTab) ) ) { pTab[nTab]->SetOptimalHeightOnly( 0, MAXROW, 0, @@ -3464,42 +3737,42 @@ void ScDocument::UpdateAllRowHeights( OutputDevice* pDev, double nPPTX, double n void ScDocument::ShowCol(SCCOL nCol, SCTAB nTab, sal_Bool bShow) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->ShowCol( nCol, bShow ); } void ScDocument::ShowRow(SCROW nRow, SCTAB nTab, sal_Bool bShow) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->ShowRow( nRow, bShow ); } void ScDocument::ShowRows(SCROW nRow1, SCROW nRow2, SCTAB nTab, sal_Bool bShow) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->ShowRows( nRow1, nRow2, bShow ); } void ScDocument::SetRowFlags( SCROW nRow, SCTAB nTab, sal_uInt8 nNewFlags ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->SetRowFlags( nRow, nNewFlags ); } void ScDocument::SetRowFlags( SCROW nStartRow, SCROW nEndRow, SCTAB nTab, sal_uInt8 nNewFlags ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->SetRowFlags( nStartRow, nEndRow, nNewFlags ); } sal_uInt8 ScDocument::GetColFlags( SCCOL nCol, SCTAB nTab ) const { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->GetColFlags( nCol ); OSL_FAIL("Falsche Tabellennummer"); return 0; @@ -3507,7 +3780,7 @@ sal_uInt8 ScDocument::GetColFlags( SCCOL nCol, SCTAB nTab ) const sal_uInt8 ScDocument::GetRowFlags( SCROW nRow, SCTAB nTab ) const { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->GetRowFlags( nRow ); OSL_FAIL("Falsche Tabellennummer"); return 0; @@ -3524,7 +3797,7 @@ const ScBitMaskCompressedArray< SCROW, sal_uInt8> & ScDocument::GetRowFlagsArray SCTAB nTab ) const { const ScBitMaskCompressedArray< SCROW, sal_uInt8> * pFlags; - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pFlags = pTab[nTab]->GetRowFlagsArray(); else { @@ -3542,9 +3815,8 @@ const ScBitMaskCompressedArray< SCROW, sal_uInt8> & ScDocument::GetRowFlagsArray void ScDocument::GetAllRowBreaks(set<SCROW>& rBreaks, SCTAB nTab, bool bPage, bool bManual) const { - if (!ValidTab(nTab) || !pTab[nTab]) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab]) return; - pTab[nTab]->GetAllRowBreaks(rBreaks, bPage, bManual); } @@ -3559,7 +3831,7 @@ void ScDocument::GetAllColBreaks(set<SCCOL>& rBreaks, SCTAB nTab, bool bPage, bo ScBreakType ScDocument::HasRowBreak(SCROW nRow, SCTAB nTab) const { ScBreakType nType = BREAK_NONE; - if (!ValidTab(nTab) || !pTab[nTab] || !ValidRow(nRow)) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab] || !ValidRow(nRow)) return nType; if (pTab[nTab]->HasRowPageBreak(nRow)) @@ -3574,7 +3846,7 @@ ScBreakType ScDocument::HasRowBreak(SCROW nRow, SCTAB nTab) const ScBreakType ScDocument::HasColBreak(SCCOL nCol, SCTAB nTab) const { ScBreakType nType = BREAK_NONE; - if (!ValidTab(nTab) || !pTab[nTab] || !ValidCol(nCol)) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab] || !ValidCol(nCol)) return nType; if (pTab[nTab]->HasColPageBreak(nCol)) @@ -3588,7 +3860,7 @@ ScBreakType ScDocument::HasColBreak(SCCOL nCol, SCTAB nTab) const void ScDocument::SetRowBreak(SCROW nRow, SCTAB nTab, bool bPage, bool bManual) { - if (!ValidTab(nTab) || !pTab[nTab] || !ValidRow(nRow)) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab] || !ValidRow(nRow)) return; pTab[nTab]->SetRowBreak(nRow, bPage, bManual); @@ -3596,7 +3868,7 @@ void ScDocument::SetRowBreak(SCROW nRow, SCTAB nTab, bool bPage, bool bManual) void ScDocument::SetColBreak(SCCOL nCol, SCTAB nTab, bool bPage, bool bManual) { - if (!ValidTab(nTab) || !pTab[nTab] || !ValidCol(nCol)) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab] || !ValidCol(nCol)) return; pTab[nTab]->SetColBreak(nCol, bPage, bManual); @@ -3604,7 +3876,7 @@ void ScDocument::SetColBreak(SCCOL nCol, SCTAB nTab, bool bPage, bool bManual) void ScDocument::RemoveRowBreak(SCROW nRow, SCTAB nTab, bool bPage, bool bManual) { - if (!ValidTab(nTab) || !pTab[nTab] || !ValidRow(nRow)) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab] || !ValidRow(nRow)) return; pTab[nTab]->RemoveRowBreak(nRow, bPage, bManual); @@ -3612,7 +3884,7 @@ void ScDocument::RemoveRowBreak(SCROW nRow, SCTAB nTab, bool bPage, bool bManual void ScDocument::RemoveColBreak(SCCOL nCol, SCTAB nTab, bool bPage, bool bManual) { - if (!ValidTab(nTab) || !pTab[nTab] || !ValidCol(nCol)) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab] || !ValidCol(nCol)) return; pTab[nTab]->RemoveColBreak(nCol, bPage, bManual); @@ -3620,7 +3892,7 @@ void ScDocument::RemoveColBreak(SCCOL nCol, SCTAB nTab, bool bPage, bool bManual Sequence<TablePageBreakData> ScDocument::GetRowBreakData(SCTAB nTab) const { - if (!ValidTab(nTab) || !pTab[nTab]) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab]) return Sequence<TablePageBreakData>(); return pTab[nTab]->GetRowBreakData(); @@ -3628,7 +3900,7 @@ Sequence<TablePageBreakData> ScDocument::GetRowBreakData(SCTAB nTab) const bool ScDocument::RowHidden(SCROW nRow, SCTAB nTab, SCROW* pFirstRow, SCROW* pLastRow) { - if (!ValidTab(nTab) || !pTab[nTab]) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab]) return false; return pTab[nTab]->RowHidden(nRow, pFirstRow, pLastRow); @@ -3636,7 +3908,7 @@ bool ScDocument::RowHidden(SCROW nRow, SCTAB nTab, SCROW* pFirstRow, SCROW* pLas bool ScDocument::HasHiddenRows(SCROW nStartRow, SCROW nEndRow, SCTAB nTab) { - if (!ValidTab(nTab) || !pTab[nTab]) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab]) return false; return pTab[nTab]->HasHiddenRows(nStartRow, nEndRow); @@ -3644,7 +3916,7 @@ bool ScDocument::HasHiddenRows(SCROW nStartRow, SCROW nEndRow, SCTAB nTab) bool ScDocument::ColHidden(SCCOL nCol, SCTAB nTab, SCCOL* pFirstCol, SCCOL* pLastCol) { - if (!ValidTab(nTab) || !pTab[nTab]) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab]) { if (pFirstCol) *pFirstCol = nCol; @@ -3658,7 +3930,7 @@ bool ScDocument::ColHidden(SCCOL nCol, SCTAB nTab, SCCOL* pFirstCol, SCCOL* pLas void ScDocument::SetRowHidden(SCROW nStartRow, SCROW nEndRow, SCTAB nTab, bool bHidden) { - if (!ValidTab(nTab) || !pTab[nTab]) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab]) return; pTab[nTab]->SetRowHidden(nStartRow, nEndRow, bHidden); @@ -3666,7 +3938,7 @@ void ScDocument::SetRowHidden(SCROW nStartRow, SCROW nEndRow, SCTAB nTab, bool b void ScDocument::SetColHidden(SCCOL nStartCol, SCCOL nEndCol, SCTAB nTab, bool bHidden) { - if (!ValidTab(nTab) || !pTab[nTab]) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab]) return; pTab[nTab]->SetColHidden(nStartCol, nEndCol, bHidden); @@ -3674,7 +3946,7 @@ void ScDocument::SetColHidden(SCCOL nStartCol, SCCOL nEndCol, SCTAB nTab, bool b SCROW ScDocument::FirstVisibleRow(SCROW nStartRow, SCROW nEndRow, SCTAB nTab) { - if (!ValidTab(nTab) || !pTab[nTab]) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab]) return ::std::numeric_limits<SCROW>::max();; return pTab[nTab]->FirstVisibleRow(nStartRow, nEndRow); @@ -3682,7 +3954,7 @@ SCROW ScDocument::FirstVisibleRow(SCROW nStartRow, SCROW nEndRow, SCTAB nTab) SCROW ScDocument::LastVisibleRow(SCROW nStartRow, SCROW nEndRow, SCTAB nTab) { - if (!ValidTab(nTab) || !pTab[nTab]) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab]) return ::std::numeric_limits<SCROW>::max();; return pTab[nTab]->LastVisibleRow(nStartRow, nEndRow); @@ -3690,7 +3962,7 @@ SCROW ScDocument::LastVisibleRow(SCROW nStartRow, SCROW nEndRow, SCTAB nTab) SCROW ScDocument::CountVisibleRows(SCROW nStartRow, SCROW nEndRow, SCTAB nTab) { - if (!ValidTab(nTab) || !pTab[nTab]) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab]) return 0; return pTab[nTab]->CountVisibleRows(nStartRow, nEndRow); @@ -3698,7 +3970,7 @@ SCROW ScDocument::CountVisibleRows(SCROW nStartRow, SCROW nEndRow, SCTAB nTab) bool ScDocument::RowFiltered(SCROW nRow, SCTAB nTab, SCROW* pFirstRow, SCROW* pLastRow) { - if (!ValidTab(nTab) || !pTab[nTab]) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab]) return false; return pTab[nTab]->RowFiltered(nRow, pFirstRow, pLastRow); @@ -3706,7 +3978,7 @@ bool ScDocument::RowFiltered(SCROW nRow, SCTAB nTab, SCROW* pFirstRow, SCROW* pL bool ScDocument::HasFilteredRows(SCROW nStartRow, SCROW nEndRow, SCTAB nTab) { - if (!ValidTab(nTab) || !pTab[nTab]) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab]) return false; return pTab[nTab]->HasFilteredRows(nStartRow, nEndRow); @@ -3714,7 +3986,7 @@ bool ScDocument::HasFilteredRows(SCROW nStartRow, SCROW nEndRow, SCTAB nTab) bool ScDocument::ColFiltered(SCCOL nCol, SCTAB nTab, SCCOL* pFirstCol, SCCOL* pLastCol) { - if (!ValidTab(nTab) || !pTab[nTab]) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab]) return false; return pTab[nTab]->ColFiltered(nCol, pFirstCol, pLastCol); @@ -3722,7 +3994,7 @@ bool ScDocument::ColFiltered(SCCOL nCol, SCTAB nTab, SCCOL* pFirstCol, SCCOL* pL void ScDocument::SetRowFiltered(SCROW nStartRow, SCROW nEndRow, SCTAB nTab, bool bFiltered) { - if (!ValidTab(nTab) || !pTab[nTab]) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab]) return; pTab[nTab]->SetRowFiltered(nStartRow, nEndRow, bFiltered); @@ -3731,7 +4003,7 @@ void ScDocument::SetRowFiltered(SCROW nStartRow, SCROW nEndRow, SCTAB nTab, bool SCROW ScDocument::FirstNonFilteredRow(SCROW nStartRow, SCROW nEndRow, SCTAB nTab) { - if (!ValidTab(nTab) || !pTab[nTab]) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab]) return ::std::numeric_limits<SCROW>::max();; return pTab[nTab]->FirstNonFilteredRow(nStartRow, nEndRow); @@ -3739,7 +4011,7 @@ SCROW ScDocument::FirstNonFilteredRow(SCROW nStartRow, SCROW nEndRow, SCTAB nTab SCROW ScDocument::LastNonFilteredRow(SCROW nStartRow, SCROW nEndRow, SCTAB nTab) { - if (!ValidTab(nTab) || !pTab[nTab]) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab]) return ::std::numeric_limits<SCROW>::max();; return pTab[nTab]->LastNonFilteredRow(nStartRow, nEndRow); @@ -3747,7 +4019,7 @@ SCROW ScDocument::LastNonFilteredRow(SCROW nStartRow, SCROW nEndRow, SCTAB nTab) SCROW ScDocument::CountNonFilteredRows(SCROW nStartRow, SCROW nEndRow, SCTAB nTab) { - if (!ValidTab(nTab) || !pTab[nTab]) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab]) return 0; return pTab[nTab]->CountNonFilteredRows(nStartRow, nEndRow); @@ -3755,18 +4027,17 @@ SCROW ScDocument::CountNonFilteredRows(SCROW nStartRow, SCROW nEndRow, SCTAB nTa void ScDocument::SyncColRowFlags() { - for (SCTAB i = 0; i <= nMaxTableNumber; ++i) + TableContainer::iterator it = pTab.begin(); + for (; it != pTab.end(); ++it) { - if (!ValidTab(i) || !pTab[i]) - continue; - - pTab[i]->SyncColRowFlags(); + if (*it) + (*it)->SyncColRowFlags(); } } SCROW ScDocument::GetLastFlaggedRow( SCTAB nTab ) const { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->GetLastFlaggedRow(); return 0; } @@ -3774,14 +4045,14 @@ SCROW ScDocument::GetLastFlaggedRow( SCTAB nTab ) const SCCOL ScDocument::GetLastChangedCol( SCTAB nTab ) const { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->GetLastChangedCol(); return 0; } SCROW ScDocument::GetLastChangedRow( SCTAB nTab ) const { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->GetLastChangedRow(); return 0; } @@ -3789,7 +4060,7 @@ SCROW ScDocument::GetLastChangedRow( SCTAB nTab ) const SCCOL ScDocument::GetNextDifferentChangedCol( SCTAB nTab, SCCOL nStart) const { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) { sal_uInt8 nStartFlags = pTab[nTab]->GetColFlags(nStart); sal_uInt16 nStartWidth = pTab[nTab]->GetOriginalWidth(nStart); @@ -3807,7 +4078,7 @@ SCCOL ScDocument::GetNextDifferentChangedCol( SCTAB nTab, SCCOL nStart) const SCROW ScDocument::GetNextDifferentChangedRow( SCTAB nTab, SCROW nStart, bool bCareManualSize) const { - if (!ValidTab(nTab) || !pTab[nTab]) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab]) return 0; const ScBitMaskCompressedArray<SCROW, sal_uInt8>* pRowFlagsArray = pTab[nTab]->GetRowFlagsArray(); @@ -3902,13 +4173,12 @@ sal_Bool ScDocument::GetColDefault( SCTAB nTab, SCCOL nCol, SCROW nLastRow, SCRO sal_Bool ScDocument::GetRowDefault( SCTAB /* nTab */, SCROW /* nRow */, SCCOL /* nLastCol */, SCCOL& /* nDefault */ ) { - sal_Bool bRet(false); - return bRet; + return false; } void ScDocument::StripHidden( SCCOL& rX1, SCROW& rY1, SCCOL& rX2, SCROW& rY2, SCTAB nTab ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->StripHidden( rX1, rY1, rX2, rY2 ); } @@ -3925,7 +4195,7 @@ void ScDocument::ExtendHidden( SCCOL& rX1, SCROW& rY1, SCCOL& rX2, SCROW& rY2, S const SfxPoolItem* ScDocument::GetAttr( SCCOL nCol, SCROW nRow, SCTAB nTab, sal_uInt16 nWhich ) const { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) { const SfxPoolItem* pTemp = pTab[nTab]->GetAttr( nCol, nRow, nWhich ); if (pTemp) @@ -3941,7 +4211,7 @@ const SfxPoolItem* ScDocument::GetAttr( SCCOL nCol, SCROW nRow, SCTAB nTab, sal_ const ScPatternAttr* ScDocument::GetPattern( SCCOL nCol, SCROW nRow, SCTAB nTab ) const { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->GetPattern( nCol, nRow ); return NULL; } @@ -3949,7 +4219,7 @@ const ScPatternAttr* ScDocument::GetPattern( SCCOL nCol, SCROW nRow, SCTAB nTab const ScPatternAttr* ScDocument::GetMostUsedPattern( SCCOL nCol, SCROW nStartRow, SCROW nEndRow, SCTAB nTab ) const { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->GetMostUsedPattern( nCol, nStartRow, nEndRow ); return NULL; } @@ -3957,14 +4227,14 @@ const ScPatternAttr* ScDocument::GetMostUsedPattern( SCCOL nCol, SCROW nStartRow void ScDocument::ApplyAttr( SCCOL nCol, SCROW nRow, SCTAB nTab, const SfxPoolItem& rAttr ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->ApplyAttr( nCol, nRow, rAttr ); } void ScDocument::ApplyPattern( SCCOL nCol, SCROW nRow, SCTAB nTab, const ScPatternAttr& rAttr ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->ApplyPattern( nCol, nRow, rAttr ); } @@ -3975,24 +4245,23 @@ void ScDocument::ApplyPatternArea( SCCOL nStartCol, SCROW nStartRow, const ScPatternAttr& rAttr, ScEditDataArray* pDataArray ) { - for (SCTAB i=0; i <= MAXTAB; i++) - if (pTab[i]) - if (rMark.GetTableSelect(i)) - pTab[i]->ApplyPatternArea( nStartCol, nStartRow, nEndCol, nEndRow, rAttr, pDataArray ); + for (SCTAB i=0; i < static_cast<SCTAB>(pTab.size()); i++) + if (pTab[i] && rMark.GetTableSelect(i)) + pTab[i]->ApplyPatternArea( nStartCol, nStartRow, nEndCol, nEndRow, rAttr, pDataArray ); } void ScDocument::ApplyPatternAreaTab( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, SCTAB nTab, const ScPatternAttr& rAttr ) { - if (VALIDTAB(nTab)) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size())) if (pTab[nTab]) pTab[nTab]->ApplyPatternArea( nStartCol, nStartRow, nEndCol, nEndRow, rAttr ); } bool ScDocument::SetAttrEntries(SCCOL nCol, SCTAB nTab, ScAttrEntry* pData, SCSIZE nSize) { - if (!ValidTab(nTab) || !pTab[nTab]) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab]) return false; return pTab[nTab]->SetAttrEntries(nCol, pData, nSize); @@ -4001,16 +4270,15 @@ bool ScDocument::SetAttrEntries(SCCOL nCol, SCTAB nTab, ScAttrEntry* pData, SCSI void ScDocument::ApplyPatternIfNumberformatIncompatible( const ScRange& rRange, const ScMarkData& rMark, const ScPatternAttr& rPattern, short nNewType ) { - for (SCTAB i=0; i <= MAXTAB; i++) - if (pTab[i]) - if (rMark.GetTableSelect(i)) - pTab[i]->ApplyPatternIfNumberformatIncompatible( rRange, rPattern, nNewType ); + for (SCTAB i=0; i < static_cast<SCTAB>(pTab.size()); i++) + if (pTab[i] && rMark.GetTableSelect(i)) + pTab[i]->ApplyPatternIfNumberformatIncompatible( rRange, rPattern, nNewType ); } void ScDocument::ApplyStyle( SCCOL nCol, SCROW nRow, SCTAB nTab, const ScStyleSheet& rStyle) { - if (VALIDTAB(nTab)) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size())) if (pTab[nTab]) pTab[nTab]->ApplyStyle( nCol, nRow, rStyle ); } @@ -4021,17 +4289,16 @@ void ScDocument::ApplyStyleArea( SCCOL nStartCol, SCROW nStartRow, const ScMarkData& rMark, const ScStyleSheet& rStyle) { - for (SCTAB i=0; i <= MAXTAB; i++) - if (pTab[i]) - if (rMark.GetTableSelect(i)) - pTab[i]->ApplyStyleArea( nStartCol, nStartRow, nEndCol, nEndRow, rStyle ); + for (SCTAB i=0; i < static_cast<SCTAB>(pTab.size()); i++) + if (pTab[i] && rMark.GetTableSelect(i)) + pTab[i]->ApplyStyleArea( nStartCol, nStartRow, nEndCol, nEndRow, rStyle ); } void ScDocument::ApplyStyleAreaTab( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, SCTAB nTab, const ScStyleSheet& rStyle) { - if (VALIDTAB(nTab)) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size())) if (pTab[nTab]) pTab[nTab]->ApplyStyleArea( nStartCol, nStartRow, nEndCol, nEndRow, rStyle ); } @@ -4049,7 +4316,7 @@ void ScDocument::ApplySelectionStyle(const ScStyleSheet& rStyle, const ScMarkDat } else { - for (SCTAB i=0; i<=MAXTAB; i++) + for (SCTAB i=0; i< static_cast<SCTAB>(pTab.size()); i++) if ( pTab[i] && rMark.GetTableSelect(i) ) pTab[i]->ApplySelectionStyle( rStyle, rMark ); } @@ -4062,16 +4329,15 @@ void ScDocument::ApplySelectionLineStyle( const ScMarkData& rMark, if ( bColorOnly && !pLine ) return; - for (SCTAB i=0; i<=MAXTAB; i++) - if (pTab[i]) - if (rMark.GetTableSelect(i)) - pTab[i]->ApplySelectionLineStyle( rMark, pLine, bColorOnly ); + for (SCTAB i=0; i< static_cast<SCTAB>(pTab.size()); i++) + if (pTab[i] && rMark.GetTableSelect(i)) + pTab[i]->ApplySelectionLineStyle( rMark, pLine, bColorOnly ); } const ScStyleSheet* ScDocument::GetStyle( SCCOL nCol, SCROW nRow, SCTAB nTab ) const { - if ( VALIDTAB(nTab) && pTab[nTab] ) + if ( VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->GetStyle(nCol, nRow); else return NULL; @@ -4087,7 +4353,7 @@ const ScStyleSheet* ScDocument::GetSelectionStyle( const ScMarkData& rMark ) con const ScStyleSheet* pNewStyle; if ( rMark.IsMultiMarked() ) - for (SCTAB i=0; i<=MAXTAB && bEqual; i++) + for (SCTAB i=0; i< static_cast<SCTAB>(pTab.size()) && bEqual; i++) if (pTab[i] && rMark.GetTableSelect(i)) { pNewStyle = pTab[i]->GetSelectionStyle( rMark, bFound ); @@ -4102,7 +4368,7 @@ const ScStyleSheet* ScDocument::GetSelectionStyle( const ScMarkData& rMark ) con { ScRange aRange; rMark.GetMarkArea( aRange ); - for (SCTAB i=aRange.aStart.Tab(); i<=aRange.aEnd.Tab() && bEqual; i++) + for (SCTAB i=aRange.aStart.Tab(); i<=aRange.aEnd.Tab() && bEqual && i < static_cast<SCTAB>(pTab.size()); i++) if (pTab[i] && rMark.GetTableSelect(i)) { pNewStyle = pTab[i]->GetAreaStyle( bFound, @@ -4126,9 +4392,10 @@ void ScDocument::StyleSheetChanged( const SfxStyleSheetBase* pStyleSheet, sal_Bo double nPPTX, double nPPTY, const Fraction& rZoomX, const Fraction& rZoomY ) { - for (SCTAB i=0; i <= MAXTAB; i++) - if (pTab[i]) - pTab[i]->StyleSheetChanged + TableContainer::iterator it = pTab.begin(); + for (; it != pTab.end(); ++it) + if (*it) + (*it)->StyleSheetChanged ( pStyleSheet, bRemoved, pDev, nPPTX, nPPTY, rZoomX, rZoomY ); if ( pStyleSheet && pStyleSheet->GetName() == ScGlobal::GetRscString(STR_STYLENAME_STANDARD) ) @@ -4156,20 +4423,19 @@ sal_Bool ScDocument::IsStyleSheetUsed( const ScStyleSheet& rStyle, sal_Bool bGat } } - sal_Bool bIsUsed = false; + bool bIsUsed = false; - for ( SCTAB i=0; i<=MAXTAB; i++ ) - { - if ( pTab[i] ) + TableContainer::const_iterator it = pTab.begin(); + for (; it != pTab.end(); ++it) + if (*it) { - if ( pTab[i]->IsStyleSheetUsed( rStyle, bGatherAllStyles ) ) + if ( (*it)->IsStyleSheetUsed( rStyle, bGatherAllStyles ) ) { if ( !bGatherAllStyles ) return sal_True; - bIsUsed = sal_True; + bIsUsed = true; } } - } if ( bGatherAllStyles ) bStyleSheetUsageInvalid = false; @@ -4184,7 +4450,7 @@ sal_Bool ScDocument::IsStyleSheetUsed( const ScStyleSheet& rStyle, sal_Bool bGat sal_Bool ScDocument::ApplyFlagsTab( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, SCTAB nTab, sal_Int16 nFlags ) { - if (VALIDTAB(nTab)) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size())) if (pTab[nTab]) return pTab[nTab]->ApplyFlags( nStartCol, nStartRow, nEndCol, nEndRow, nFlags ); @@ -4196,7 +4462,7 @@ sal_Bool ScDocument::ApplyFlagsTab( SCCOL nStartCol, SCROW nStartRow, sal_Bool ScDocument::RemoveFlagsTab( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, SCTAB nTab, sal_Int16 nFlags ) { - if (VALIDTAB(nTab)) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size())) if (pTab[nTab]) return pTab[nTab]->RemoveFlags( nStartCol, nStartRow, nEndCol, nEndRow, nFlags ); @@ -4208,7 +4474,7 @@ sal_Bool ScDocument::RemoveFlagsTab( SCCOL nStartCol, SCROW nStartRow, void ScDocument::SetPattern( SCCOL nCol, SCROW nRow, SCTAB nTab, const ScPatternAttr& rAttr, sal_Bool bPutToPool ) { - if (VALIDTAB(nTab)) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size())) if (pTab[nTab]) pTab[nTab]->SetPattern( nCol, nRow, rAttr, bPutToPool ); } @@ -4218,7 +4484,7 @@ void ScDocument::SetPattern( const ScAddress& rPos, const ScPatternAttr& rAttr, sal_Bool bPutToPool ) { SCTAB nTab = rPos.Tab(); - if (pTab[nTab]) + if ( nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) pTab[nTab]->SetPattern( rPos, rAttr, bPutToPool ); } @@ -4229,7 +4495,7 @@ ScPatternAttr* ScDocument::CreateSelectionPattern( const ScMarkData& rMark, sal_ if ( rMark.IsMultiMarked() ) // multi selection { - for (SCTAB i=0; i<=MAXTAB; i++) + for (SCTAB i=0; i< static_cast<SCTAB>(pTab.size()); i++) if (pTab[i] && rMark.GetTableSelect(i)) pTab[i]->MergeSelectionPattern( aState, rMark, bDeep ); } @@ -4237,7 +4503,7 @@ ScPatternAttr* ScDocument::CreateSelectionPattern( const ScMarkData& rMark, sal_ { ScRange aRange; rMark.GetMarkArea(aRange); - for (SCTAB i=0; i<=MAXTAB; i++) + for (SCTAB i=0; i< static_cast<SCTAB>(pTab.size()); i++) if (pTab[i] && rMark.GetTableSelect(i)) pTab[i]->MergePatternArea( aState, aRange.aStart.Col(), aRange.aStart.Row(), @@ -4284,7 +4550,7 @@ void ScDocument::GetSelectionFrame( const ScMarkData& rMark, rMark.GetMarkArea(aRange); rLineInner.EnableHor( aRange.aStart.Row() != aRange.aEnd.Row() ); rLineInner.EnableVer( aRange.aStart.Col() != aRange.aEnd.Col() ); - for (SCTAB i=0; i<=MAXTAB; i++) + for (SCTAB i=0; i< static_cast<SCTAB>(pTab.size()); i++) if (pTab[i] && rMark.GetTableSelect(i)) pTab[i]->MergeBlockFrame( &rLineOuter, &rLineInner, aFlags, aRange.aStart.Col(), aRange.aStart.Row(), @@ -4359,7 +4625,7 @@ bool ScDocument::HasAttrib( SCCOL nCol1, SCROW nRow1, SCTAB nTab1, return false; bool bFound = false; - for (SCTAB i=nTab1; i<=nTab2 && !bFound; i++) + for (SCTAB i=nTab1; i<=nTab2 && !bFound && i < static_cast<SCTAB>(pTab.size()); i++) if (pTab[i]) { if ( nMask & HASATTR_RTL ) @@ -4394,7 +4660,7 @@ bool ScDocument::HasAttrib( const ScRange& rRange, sal_uInt16 nMask ) const void ScDocument::FindMaxRotCol( SCTAB nTab, RowInfo* pRowInfo, SCSIZE nArrCount, SCCOL nX1, SCCOL nX2 ) const { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->FindMaxRotCol( pRowInfo, nArrCount, nX1, nX2 ); else { @@ -4458,7 +4724,7 @@ void ScDocument::GetBorderLines( SCCOL nCol, SCROW nRow, SCTAB nTab, sal_Bool ScDocument::IsBlockEmpty( SCTAB nTab, SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, bool bIgnoreNotes ) const { - if (VALIDTAB(nTab)) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size())) if (pTab[nTab]) return pTab[nTab]->IsBlockEmpty( nStartCol, nStartRow, nEndCol, nEndRow, bIgnoreNotes ); @@ -4469,7 +4735,7 @@ sal_Bool ScDocument::IsBlockEmpty( SCTAB nTab, SCCOL nStartCol, SCROW nStartRow, void ScDocument::LockTable(SCTAB nTab) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->LockTable(); else { @@ -4480,7 +4746,7 @@ void ScDocument::LockTable(SCTAB nTab) void ScDocument::UnlockTable(SCTAB nTab) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->UnlockTable(); else { @@ -4501,7 +4767,7 @@ sal_Bool ScDocument::IsBlockEditable( SCTAB nTab, SCCOL nStartCol, SCROW nStartR return false; } - if (VALIDTAB(nTab)) + if (VALIDTAB(nTab) && nTab < static_cast<SCTAB>(pTab.size())) if (pTab[nTab]) return pTab[nTab]->IsBlockEditable( nStartCol, nStartRow, nEndCol, nEndRow, pOnlyNotBecauseOfMatrix ); @@ -4529,7 +4795,7 @@ sal_Bool ScDocument::IsSelectionEditable( const ScMarkData& rMark, sal_Bool bOk = sal_True; sal_Bool bMatrix = ( pOnlyNotBecauseOfMatrix != NULL ); - for ( SCTAB i=0; i<=MAXTAB && (bOk || bMatrix); i++ ) + for ( SCTAB i=0; i< static_cast<SCTAB>(pTab.size()) && (bOk || bMatrix); i++ ) { if ( pTab[i] && rMark.GetTableSelect(i) ) { @@ -4568,19 +4834,18 @@ sal_Bool ScDocument::HasSelectedBlockMatrixFragment( SCCOL nStartCol, SCROW nSta const ScMarkData& rMark ) const { sal_Bool bOk = sal_True; - for (SCTAB i=0; i<=MAXTAB && bOk; i++) - if (pTab[i]) - if (rMark.GetTableSelect(i)) - if (pTab[i]->HasBlockMatrixFragment( nStartCol, nStartRow, nEndCol, nEndRow )) - bOk = false; + for (SCTAB i=0; i< static_cast<SCTAB>(pTab.size()) && bOk; i++) + if (pTab[i] && rMark.GetTableSelect(i)) + if (pTab[i]->HasBlockMatrixFragment( nStartCol, nStartRow, nEndCol, nEndRow )) + bOk = false; return !bOk; } sal_Bool ScDocument::HasSelectedBlockMatrixFragment( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, SCTAB nTab ) const { - sal_Bool bOk = true; - if ( pTab[nTab] && pTab[nTab]->HasBlockMatrixFragment( nStartCol, nStartRow, nEndCol, nEndRow ) ) + bool bOk = true; + if ( nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] && pTab[nTab]->HasBlockMatrixFragment( nStartCol, nStartRow, nEndCol, nEndRow ) ) { bOk = false; } @@ -4638,7 +4903,7 @@ sal_Bool ScDocument::ExtendOverlapped( SCCOL& rStartCol, SCROW& rStartRow, sal_Bool bFound = false; if ( ValidColRow(rStartCol,rStartRow) && ValidColRow(nEndCol,nEndRow) && ValidTab(nTab) ) { - if (pTab[nTab]) + if (nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) { SCCOL nCol; SCCOL nOldCol = rStartCol; @@ -4697,7 +4962,7 @@ sal_Bool ScDocument::ExtendMergeSel( SCCOL nStartCol, SCROW nStartRow, SCCOL nOldEndCol = rEndCol; SCROW nOldEndRow = rEndRow; - for (SCTAB nTab = 0; nTab <= MAXTAB; nTab++) + for (SCTAB nTab = 0; nTab < static_cast<SCTAB>(pTab.size()); nTab++) if ( pTab[nTab] && rMark.GetTableSelect(nTab) ) { SCCOL nThisEndCol = nOldEndCol; @@ -4721,7 +4986,7 @@ sal_Bool ScDocument::ExtendMerge( SCCOL nStartCol, SCROW nStartRow, sal_Bool bFound = false; if ( ValidColRow(nStartCol,nStartRow) && ValidColRow(rEndCol,rEndRow) && ValidTab(nTab) ) { - if (pTab[nTab]) + if (nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) bFound = pTab[nTab]->ExtendMerge( nStartCol, nStartRow, rEndCol, rEndRow, bRefresh, bAttrs ); if (bRefresh) @@ -4745,7 +5010,7 @@ sal_Bool ScDocument::ExtendMerge( ScRange& rRange, sal_Bool bRefresh, sal_Bool b SCROW nEndRow = rRange.aEnd.Row(); PutInOrder( nStartTab, nEndTab ); - for (SCTAB nTab = nStartTab; nTab <= nEndTab; nTab++ ) + for (SCTAB nTab = nStartTab; nTab <= nEndTab && nTab < static_cast<SCTAB>(pTab.size()); nTab++ ) { SCCOL nExtendCol = rRange.aEnd.Col(); SCROW nExtendRow = rRange.aEnd.Row(); @@ -4804,7 +5069,7 @@ sal_Bool ScDocument::ExtendOverlapped( ScRange& rRange ) SCROW nStartRow = rRange.aStart.Row(); PutInOrder( nStartTab, nEndTab ); - for (SCTAB nTab = nStartTab; nTab <= nEndTab; nTab++ ) + for (SCTAB nTab = nStartTab; nTab <= nEndTab && nTab < static_cast<SCTAB>(pTab.size()); nTab++ ) { SCCOL nExtendCol = rRange.aStart.Col(); SCROW nExtendRow = rRange.aStart.Row(); @@ -4861,7 +5126,7 @@ sal_Bool ScDocument::RefreshAutoFilter( SCCOL nStartCol, SCROW nStartRow, } } } - if (pTab[nTab]) + if (nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) pData = pTab[nTab]->GetAnonymousDBData(); else pData=NULL; @@ -4925,7 +5190,7 @@ void ScDocument::ApplySelectionFrame( const ScMarkData& rMark, ScRangeList aRangeList; rMark.FillRangeListWithMarks( &aRangeList, false ); size_t nRangeCount = aRangeList.size(); - for (SCTAB i=0; i<=MAXTAB; i++) + for (SCTAB i=0; i< static_cast<SCTAB>(pTab.size()); i++) { if (pTab[i] && rMark.GetTableSelect(i)) { @@ -4947,7 +5212,7 @@ void ScDocument::ApplyFrameAreaTab( const ScRange& rRange, { SCTAB nStartTab = rRange.aStart.Tab(); SCTAB nEndTab = rRange.aStart.Tab(); - for (SCTAB nTab=nStartTab; nTab<=nEndTab; nTab++) + for (SCTAB nTab=nStartTab; nTab<=nEndTab && nTab < static_cast<SCTAB>(pTab.size()); nTab++) if (pTab[nTab]) pTab[nTab]->ApplyBlockFrame( pLineOuter, pLineInner, rRange.aStart.Col(), rRange.aStart.Row(), @@ -4977,7 +5242,7 @@ void ScDocument::ApplySelectionPattern( const ScPatternAttr& rAttr, const ScMark else { SfxItemPoolCache aCache( xPoolHelper->GetDocPool(), pSet ); - for (SCTAB nTab=0; nTab<=MAXTAB; nTab++) + for (SCTAB nTab=0; nTab< static_cast<SCTAB>(pTab.size()); nTab++) if (pTab[nTab]) if (rMark.GetTableSelect(nTab)) pTab[nTab]->ApplySelectionCache( &aCache, rMark, pDataArray ); @@ -4988,7 +5253,7 @@ void ScDocument::ApplySelectionPattern( const ScPatternAttr& rAttr, const ScMark void ScDocument::ChangeSelectionIndent( sal_Bool bIncrement, const ScMarkData& rMark ) { - for (SCTAB i=0; i<=MAXTAB; i++) + for (SCTAB i=0; i< static_cast<SCTAB>(pTab.size()); i++) if (pTab[i] && rMark.GetTableSelect(i)) pTab[i]->ChangeSelectionIndent( bIncrement, rMark ); } @@ -4996,7 +5261,7 @@ void ScDocument::ChangeSelectionIndent( sal_Bool bIncrement, const ScMarkData& r void ScDocument::ClearSelectionItems( const sal_uInt16* pWhich, const ScMarkData& rMark ) { - for (SCTAB i=0; i<=MAXTAB; i++) + for (SCTAB i=0; i< static_cast<SCTAB>(pTab.size()); i++) if (pTab[i] && rMark.GetTableSelect(i)) pTab[i]->ClearSelectionItems( pWhich, rMark ); } @@ -5004,7 +5269,7 @@ void ScDocument::ClearSelectionItems( const sal_uInt16* pWhich, const ScMarkData void ScDocument::DeleteSelection( sal_uInt16 nDelFlag, const ScMarkData& rMark ) { - for (SCTAB i=0; i<=MAXTAB; i++) + for (SCTAB i=0; i< static_cast<SCTAB>(pTab.size()); i++) if (pTab[i] && rMark.GetTableSelect(i)) pTab[i]->DeleteSelection( nDelFlag, rMark ); } @@ -5012,7 +5277,7 @@ void ScDocument::DeleteSelection( sal_uInt16 nDelFlag, const ScMarkData& rMark ) void ScDocument::DeleteSelectionTab( SCTAB nTab, sal_uInt16 nDelFlag, const ScMarkData& rMark ) { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) pTab[nTab]->DeleteSelection( nDelFlag, rMark ); else { @@ -5046,7 +5311,7 @@ SCSIZE ScDocument::GetEmptyLinesInBlock( SCCOL nStartCol, SCROW nStartRow, SCTAB PutInOrder(nStartCol, nEndCol); PutInOrder(nStartRow, nEndRow); PutInOrder(nStartTab, nEndTab); - if (VALIDTAB(nStartTab)) + if (VALIDTAB(nStartTab) && nStartTab < static_cast<SCTAB>(pTab.size())) { if (pTab[nStartTab]) return pTab[nStartTab]->GetEmptyLinesInBlock(nStartCol, nStartRow, nEndCol, nEndRow, eDir); @@ -5060,7 +5325,7 @@ SCSIZE ScDocument::GetEmptyLinesInBlock( SCCOL nStartCol, SCROW nStartRow, SCTAB void ScDocument::FindAreaPos( SCCOL& rCol, SCROW& rRow, SCTAB nTab, SCsCOL nMovX, SCsROW nMovY ) { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) pTab[nTab]->FindAreaPos( rCol, rRow, nMovX, nMovY ); } @@ -5074,7 +5339,7 @@ void ScDocument::GetNextPos( SCCOL& rCol, SCROW& rRow, SCTAB nTab, SCsCOL nMovX, aCopyMark.SetMarking(false); aCopyMark.MarkToMulti(); - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) pTab[nTab]->GetNextPos( rCol, rRow, nMovX, nMovY, bMarked, bUnprotected, aCopyMark ); } @@ -5123,16 +5388,17 @@ sal_uLong ScDocument::GetCellCount() const { sal_uLong nCellCount = 0L; - for ( SCTAB nTab=0; nTab<=MAXTAB; nTab++ ) - if ( pTab[nTab] ) - nCellCount += pTab[nTab]->GetCellCount(); + TableContainer::const_iterator it = pTab.begin(); + for (; it != pTab.end(); ++it) + if ( *it ) + nCellCount += (*it)->GetCellCount(); return nCellCount; } SCSIZE ScDocument::GetCellCount(SCTAB nTab, SCCOL nCol) const { - if (!ValidTab(nTab) || !pTab[nTab]) + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(pTab.size()) || !pTab[nTab]) return 0; return pTab[nTab]->GetCellCount(nCol); @@ -5142,9 +5408,10 @@ sal_uLong ScDocument::GetCodeCount() const { sal_uLong nCodeCount = 0; - for ( SCTAB nTab=0; nTab<=MAXTAB; nTab++ ) - if ( pTab[nTab] ) - nCodeCount += pTab[nTab]->GetCodeCount(); + TableContainer::const_iterator it = pTab.begin(); + for (; it != pTab.end(); ++it) + if ( *it ) + nCodeCount += (*it)->GetCodeCount(); return nCodeCount; } @@ -5152,21 +5419,21 @@ sal_uLong ScDocument::GetCodeCount() const void ScDocument::PageStyleModified( SCTAB nTab, const String& rNewName ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->PageStyleModified( rNewName ); } void ScDocument::SetPageStyle( SCTAB nTab, const String& rName ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->SetPageStyle( rName ); } const String& ScDocument::GetPageStyle( SCTAB nTab ) const { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->GetPageStyle(); return EMPTY_STRING; @@ -5175,13 +5442,13 @@ const String& ScDocument::GetPageStyle( SCTAB nTab ) const void ScDocument::SetPageSize( SCTAB nTab, const Size& rSize ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->SetPageSize( rSize ); } Size ScDocument::GetPageSize( SCTAB nTab ) const { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->GetPageSize(); OSL_FAIL("falsche Tab"); @@ -5191,31 +5458,31 @@ Size ScDocument::GetPageSize( SCTAB nTab ) const void ScDocument::SetRepeatArea( SCTAB nTab, SCCOL nStartCol, SCCOL nEndCol, SCROW nStartRow, SCROW nEndRow ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->SetRepeatArea( nStartCol, nEndCol, nStartRow, nEndRow ); } void ScDocument::InvalidatePageBreaks(SCTAB nTab) { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) pTab[nTab]->InvalidatePageBreaks(); } void ScDocument::UpdatePageBreaks( SCTAB nTab, const ScRange* pUserArea ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->UpdatePageBreaks( pUserArea ); } void ScDocument::RemoveManualBreaks( SCTAB nTab ) { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) pTab[nTab]->RemoveManualBreaks(); } sal_Bool ScDocument::HasManualBreaks( SCTAB nTab ) const { - if ( ValidTab(nTab) && pTab[nTab] ) + if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] ) return pTab[nTab]->HasManualBreaks(); OSL_FAIL("falsche Tab"); @@ -5233,11 +5500,12 @@ void ScDocument::GetDocStat( ScDocStat& rDocStat ) sal_Bool ScDocument::HasPrintRange() { - sal_Bool bResult = false; + bool bResult = false; - for ( SCTAB i=0; !bResult && i<nMaxTableNumber; i++ ) - if ( pTab[i] ) - bResult = pTab[i]->IsPrintEntireSheet() || (pTab[i]->GetPrintRangeCount() > 0); + TableContainer::iterator it = pTab.begin(); + for (; it != pTab.end() && !bResult; ++it) + if ( *it ) + bResult = (*it)->IsPrintEntireSheet() || ((*it)->GetPrintRangeCount() > 0); return bResult; } @@ -5245,13 +5513,13 @@ sal_Bool ScDocument::HasPrintRange() sal_Bool ScDocument::IsPrintEntireSheet( SCTAB nTab ) const { - return (ValidTab(nTab) ) && pTab[nTab] && pTab[nTab]->IsPrintEntireSheet(); + return (ValidTab(nTab) ) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab] && pTab[nTab]->IsPrintEntireSheet(); } sal_uInt16 ScDocument::GetPrintRangeCount( SCTAB nTab ) { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) return pTab[nTab]->GetPrintRangeCount(); return 0; @@ -5260,7 +5528,7 @@ sal_uInt16 ScDocument::GetPrintRangeCount( SCTAB nTab ) const ScRange* ScDocument::GetPrintRange( SCTAB nTab, sal_uInt16 nPos ) { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) return pTab[nTab]->GetPrintRange(nPos); return NULL; @@ -5269,7 +5537,7 @@ const ScRange* ScDocument::GetPrintRange( SCTAB nTab, sal_uInt16 nPos ) const ScRange* ScDocument::GetRepeatColRange( SCTAB nTab ) { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) return pTab[nTab]->GetRepeatColRange(); return NULL; @@ -5278,7 +5546,7 @@ const ScRange* ScDocument::GetRepeatColRange( SCTAB nTab ) const ScRange* ScDocument::GetRepeatRowRange( SCTAB nTab ) { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) return pTab[nTab]->GetRepeatRowRange(); return NULL; @@ -5287,42 +5555,42 @@ const ScRange* ScDocument::GetRepeatRowRange( SCTAB nTab ) void ScDocument::ClearPrintRanges( SCTAB nTab ) { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) pTab[nTab]->ClearPrintRanges(); } void ScDocument::AddPrintRange( SCTAB nTab, const ScRange& rNew ) { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) pTab[nTab]->AddPrintRange( rNew ); } void ScDocument::SetPrintEntireSheet( SCTAB nTab ) { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) pTab[nTab]->SetPrintEntireSheet(); } void ScDocument::SetRepeatColRange( SCTAB nTab, const ScRange* pNew ) { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) pTab[nTab]->SetRepeatColRange( pNew ); } void ScDocument::SetRepeatRowRange( SCTAB nTab, const ScRange* pNew ) { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) pTab[nTab]->SetRepeatRowRange( pNew ); } ScPrintRangeSaver* ScDocument::CreatePrintRangeSaver() const { - SCTAB nCount = GetTableCount(); + SCTAB nCount = static_cast<SCTAB>(pTab.size()); ScPrintRangeSaver* pNew = new ScPrintRangeSaver( nCount ); for (SCTAB i=0; i<nCount; i++) if (pTab[i]) @@ -5334,7 +5602,7 @@ ScPrintRangeSaver* ScDocument::CreatePrintRangeSaver() const void ScDocument::RestorePrintRanges( const ScPrintRangeSaver& rSaver ) { SCTAB nCount = rSaver.GetTabCount(); - for (SCTAB i=0; i<nCount; i++) + for (SCTAB i=0; i<nCount && i < static_cast<SCTAB>(pTab.size()); i++) if (pTab[i]) pTab[i]->RestorePrintRanges( rSaver.GetTabData(i) ); } @@ -5346,7 +5614,7 @@ sal_Bool ScDocument::NeedPageResetAfterTab( SCTAB nTab ) const // andere Vorlage als bei der vorherigen gesetzt ist (nur Namen vergleichen) // und eine Seitennummer angegeben ist (nicht 0) - if ( nTab < MAXTAB && pTab[nTab] && pTab[nTab+1] ) + if ( nTab + 1 < static_cast<SCTAB>(pTab.size()) && pTab[nTab] && pTab[nTab+1] ) { String aNew = pTab[nTab+1]->GetPageStyle(); if ( aNew != pTab[nTab]->GetPageStyle() ) @@ -5374,7 +5642,7 @@ SfxUndoManager* ScDocument::GetUndoManager() ScRowBreakIterator* ScDocument::GetRowBreakIterator(SCTAB nTab) const { - if (ValidTab(nTab) && pTab[nTab]) + if (ValidTab(nTab) && nTab < static_cast<SCTAB>(pTab.size()) && pTab[nTab]) return new ScRowBreakIterator(pTab[nTab]->maRowPageBreaks); return NULL; } diff --git a/sc/source/core/data/markdata.cxx b/sc/source/core/data/markdata.cxx index eecf9efac2db..a1091929af6e 100644 --- a/sc/source/core/data/markdata.cxx +++ b/sc/source/core/data/markdata.cxx @@ -42,27 +42,23 @@ //------------------------------------------------------------------------ ScMarkData::ScMarkData() : - pMultiSel( NULL ) + pMultiSel( NULL ), + maTabMarked() { - for (SCTAB i=0; i<=MAXTAB; i++) - bTabMarked[i] = false; - ResetMark(); } ScMarkData::ScMarkData(const ScMarkData& rData) : aMarkRange( rData.aMarkRange ), aMultiRange( rData.aMultiRange ), - pMultiSel( NULL ) + pMultiSel( NULL ), + maTabMarked( rData.maTabMarked ) { bMarked = rData.bMarked; bMultiMarked = rData.bMultiMarked; bMarking = rData.bMarking; bMarkIsNeg = rData.bMarkIsNeg; - for (SCTAB i=0; i<=MAXTAB; i++) - bTabMarked[i] = rData.bTabMarked[i]; - if (rData.pMultiSel) { pMultiSel = new ScMarkArray[MAXCOLCOUNT]; @@ -86,8 +82,7 @@ ScMarkData& ScMarkData::operator=(const ScMarkData& rData) bMarking = rData.bMarking; bMarkIsNeg = rData.bMarkIsNeg; - for (SCTAB i=0; i<=MAXTAB; i++) - bTabMarked[i] = rData.bTabMarked[i]; + maTabMarked = std::set<SCTAB>(rData.maTabMarked); if (rData.pMultiSel) { @@ -123,7 +118,7 @@ void ScMarkData::SetMarkArea( const ScRange& rRange ) // may query (default) attributes although no sheet is marked yet. // => mark that one. if ( !GetSelectCount() ) - bTabMarked[ aMarkRange.aStart.Tab() ] = sal_True; + maTabMarked.insert( aMarkRange.aStart.Tab() ); bMarked = sal_True; } } @@ -189,32 +184,52 @@ void ScMarkData::SetAreaTab( SCTAB nTab ) aMultiRange.aEnd.SetTab(nTab); } +void ScMarkData::SelectTable( SCTAB nTab, bool bNew ) +{ + if ( bNew ) + { + maTabMarked.insert( nTab ); + } + else + { + maTabMarked.erase( nTab ); + } +} + +bool ScMarkData::GetTableSelect( SCTAB nTab ) const +{ + return (maTabMarked.find( nTab ) != maTabMarked.end()); +} + void ScMarkData::SelectOneTable( SCTAB nTab ) { - for (SCTAB i=0; i<=MAXTAB; i++) - bTabMarked[i] = ( nTab == i ); + maTabMarked.clear(); + maTabMarked.insert( nTab ); } SCTAB ScMarkData::GetSelectCount() const { - SCTAB nCount = 0; - for (SCTAB i=0; i<=MAXTAB; i++) - if (bTabMarked[i]) - ++nCount; - - return nCount; + return static_cast<SCTAB> ( maTabMarked.size() ); } SCTAB ScMarkData::GetFirstSelected() const { - for (SCTAB i=0; i<=MAXTAB; i++) - if (bTabMarked[i]) - return i; + if (maTabMarked.size() > 0) + return (*maTabMarked.begin()); OSL_FAIL("GetFirstSelected: keine markiert"); return 0; } +SCTAB ScMarkData::GetLastSelected() const +{ + if (maTabMarked.size() > 0) + return (*maTabMarked.rbegin()); + + OSL_FAIL("GetLastSelected: keine markiert"); + return 0; +} + void ScMarkData::MarkToMulti() { if ( bMarked && !bMarking ) @@ -338,8 +353,7 @@ void ScMarkData::MarkFromRangeList( const ScRangeList& rList, sal_Bool bReset ) { if (bReset) { - for (SCTAB i=0; i<=MAXTAB; i++) - bTabMarked[i] = false; // Tabellen sind nicht in ResetMark + maTabMarked.clear(); ResetMark(); } @@ -406,16 +420,14 @@ void ScMarkData::ExtendRangeListTables( ScRangeList* pList ) const ScRangeList aOldList(*pList); pList->RemoveAll(); //! oder die vorhandenen unten weglassen - for (SCTAB nTab=0; nTab<=MAXTAB; nTab++) - if (bTabMarked[nTab]) + std::set<SCTAB>::iterator it = maTabMarked.begin(); + for (; it != maTabMarked.end(); ++it) + for ( size_t i=0, nCount = aOldList.size(); i<nCount; i++) { - for ( size_t i=0, nCount = aOldList.size(); i<nCount; i++) - { - ScRange aRange = *aOldList[ i ]; - aRange.aStart.SetTab(nTab); - aRange.aEnd.SetTab(nTab); - pList->Append( aRange ); - } + ScRange aRange = *aOldList[ i ]; + aRange.aStart.SetTab(*it); + aRange.aEnd.SetTab(*it); + pList->Append( aRange ); } } @@ -588,16 +600,21 @@ sal_Bool ScMarkData::HasAnyMultiMarks() const void ScMarkData::InsertTab( SCTAB nTab ) { - for (SCTAB i=MAXTAB; i>nTab; i--) - bTabMarked[i] = bTabMarked[i-1]; - bTabMarked[nTab] = false; + std::set<SCTAB> tabMarked(maTabMarked.begin(), maTabMarked.upper_bound(nTab)); + std::set<SCTAB>::iterator it = maTabMarked.upper_bound(nTab); + for (; it != maTabMarked.end(); ++it) + tabMarked.insert(*it + 1); + maTabMarked.swap(tabMarked); } void ScMarkData::DeleteTab( SCTAB nTab ) { - for (SCTAB i=nTab; i<MAXTAB; i++) - bTabMarked[i] = bTabMarked[i+1]; - bTabMarked[MAXTAB] = false; + std::set<SCTAB> tabMarked(maTabMarked.begin(), maTabMarked.find(nTab)); + tabMarked.erase( nTab ); + std::set<SCTAB>::iterator it = maTabMarked.find(nTab); + for (; it != maTabMarked.end(); ++it) + tabMarked.insert(*it + 1); + maTabMarked.swap(tabMarked); } diff --git a/sc/source/core/data/table1.cxx b/sc/source/core/data/table1.cxx index a475d696afdb..079e02039ba6 100644 --- a/sc/source/core/data/table1.cxx +++ b/sc/source/core/data/table1.cxx @@ -1398,47 +1398,48 @@ void ScTable::UpdateGrow( const ScRange& rArea, SCCOL nGrowX, SCROW nGrowY ) aCol[i].UpdateGrow( rArea, nGrowX, nGrowY ); } -void ScTable::UpdateInsertTab(SCTAB nTable) +void ScTable::UpdateInsertTab(SCTAB nTable, SCTAB nNewSheets) { if (nTab >= nTable) { - nTab++; + nTab += nNewSheets; if (pDBDataNoName) pDBDataNoName->UpdateMoveTab(nTab - 1 ,nTab); } - for (SCCOL i=0; i <= MAXCOL; i++) aCol[i].UpdateInsertTab(nTable); + for (SCCOL i=0; i <= MAXCOL; i++) aCol[i].UpdateInsertTab(nTable, nNewSheets); if (IsStreamValid()) SetStreamValid(false); } -void ScTable::UpdateDeleteTab( SCTAB nTable, sal_Bool bIsMove, ScTable* pRefUndo ) +void ScTable::UpdateDeleteTab( SCTAB nTable, sal_Bool bIsMove, ScTable* pRefUndo, SCTAB nSheets ) { if (nTab > nTable) { - nTab--; + nTab -= nSheets; if (pDBDataNoName) pDBDataNoName->UpdateMoveTab(nTab + 1,nTab); } SCCOL i; if (pRefUndo) - for (i=0; i <= MAXCOL; i++) aCol[i].UpdateDeleteTab(nTable, bIsMove, &pRefUndo->aCol[i]); + for (i=0; i <= MAXCOL; i++) aCol[i].UpdateDeleteTab(nTable, bIsMove, &pRefUndo->aCol[i], nSheets); else - for (i=0; i <= MAXCOL; i++) aCol[i].UpdateDeleteTab(nTable, bIsMove, NULL); + for (i=0; i <= MAXCOL; i++) aCol[i].UpdateDeleteTab(nTable, bIsMove, NULL, nSheets); if (IsStreamValid()) SetStreamValid(false); } void ScTable::UpdateMoveTab( SCTAB nOldPos, SCTAB nNewPos, SCTAB nTabNo, - ScProgress& rProgress ) + ScProgress* pProgress ) { nTab = nTabNo; for ( SCCOL i=0; i <= MAXCOL; i++ ) { aCol[i].UpdateMoveTab( nOldPos, nNewPos, nTabNo ); - rProgress.SetState( rProgress.GetState() + aCol[i].GetCodeCount() ); + if (pProgress) + pProgress->SetState(pProgress->GetState() + aCol[i].GetCodeCount()); } if (IsStreamValid()) diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index b554bcffd685..79637dd9d38e 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -4482,11 +4482,11 @@ void ScCompiler::UpdateSharedFormulaReference( UpdateRefMode eUpdateRefMode, } -ScRangeData* ScCompiler::UpdateInsertTab( SCTAB nTable, sal_Bool bIsName ) +ScRangeData* ScCompiler::UpdateInsertTab( SCTAB nTable, sal_Bool bIsName , SCTAB nNewSheets) { ScRangeData* pRangeData = NULL; SCTAB nPosTab = aPos.Tab(); // _after_ incremented! - SCTAB nOldPosTab = ((nPosTab > nTable) ? (nPosTab - 1) : nPosTab); + SCTAB nOldPosTab = ((nPosTab > nTable) ? (nPosTab - nNewSheets) : nPosTab); sal_Bool bIsRel = false; ScToken* t; pArr->Reset(); @@ -4517,7 +4517,7 @@ ScRangeData* ScCompiler::UpdateInsertTab( SCTAB nTable, sal_Bool bIsName ) rRef.nTab = sal::static_int_cast<SCsTAB>( rRef.nTab + pDoc->GetTableCount() ); // was a wrap } if (nTable <= rRef.nTab) - ++rRef.nTab; + rRef.nTab += nNewSheets; rRef.nRelTab = rRef.nTab - nPosTab; } else @@ -4534,7 +4534,7 @@ ScRangeData* ScCompiler::UpdateInsertTab( SCTAB nTable, sal_Bool bIsName ) rRef.nTab = sal::static_int_cast<SCsTAB>( rRef.nTab + pDoc->GetTableCount() ); // was a wrap } if (nTable <= rRef.nTab) - ++rRef.nTab; + rRef.nTab += nNewSheets; rRef.nRelTab = rRef.nTab - nPosTab; } else @@ -4565,7 +4565,7 @@ ScRangeData* ScCompiler::UpdateInsertTab( SCTAB nTable, sal_Bool bIsName ) rRef1.nTab = sal::static_int_cast<SCsTAB>( rRef1.nTab + pDoc->GetTableCount() ); // was a wrap } if (nTable <= rRef1.nTab) - ++rRef1.nTab; + rRef1.nTab += nNewSheets; rRef1.nRelTab = rRef1.nTab - nPosTab; } if ( t->GetType() == svDoubleRef ) @@ -4580,7 +4580,7 @@ ScRangeData* ScCompiler::UpdateInsertTab( SCTAB nTable, sal_Bool bIsName ) rRef2.nTab = sal::static_int_cast<SCsTAB>( rRef2.nTab + pDoc->GetTableCount() ); // was a wrap } if (nTable <= rRef2.nTab) - ++rRef2.nTab; + rRef2.nTab += nNewSheets; rRef2.nRelTab = rRef2.nTab - nPosTab; } } @@ -4591,12 +4591,12 @@ ScRangeData* ScCompiler::UpdateInsertTab( SCTAB nTable, sal_Bool bIsName ) } ScRangeData* ScCompiler::UpdateDeleteTab(SCTAB nTable, sal_Bool /* bIsMove */, sal_Bool bIsName, - sal_Bool& rChanged) + sal_Bool& rChanged, SCTAB nSheets) { ScRangeData* pRangeData = NULL; SCTAB nTab, nTab2; SCTAB nPosTab = aPos.Tab(); // _after_ decremented! - SCTAB nOldPosTab = ((nPosTab >= nTable) ? (nPosTab + 1) : nPosTab); + SCTAB nOldPosTab = ((nPosTab >= nTable) ? (nPosTab + nSheets) : nPosTab); rChanged = false; sal_Bool bIsRel = false; ScToken* t; @@ -4628,7 +4628,7 @@ ScRangeData* ScCompiler::UpdateDeleteTab(SCTAB nTable, sal_Bool /* bIsMove */, s nTab = rRef.nTab; if ( nTable < nTab ) { - rRef.nTab = nTab - 1; + rRef.nTab = nTab - nSheets; rChanged = sal_True; } else if ( nTable == nTab ) @@ -4641,7 +4641,7 @@ ScRangeData* ScCompiler::UpdateDeleteTab(SCTAB nTable, sal_Bool /* bIsMove */, s else nTab2 = rRef2.nTab; if ( nTab == nTab2 - || (nTab+1) >= pDoc->GetTableCount() ) + || (nTab+nSheets) >= pDoc->GetTableCount() ) { rRef.nTab = MAXTAB+1; rRef.SetTabDeleted( sal_True ); @@ -4671,13 +4671,13 @@ ScRangeData* ScCompiler::UpdateDeleteTab(SCTAB nTable, sal_Bool /* bIsMove */, s nTab = rRef.nTab; if ( nTable < nTab ) { - rRef.nTab = nTab - 1; + rRef.nTab = nTab - nSheets; rChanged = sal_True; } else if ( nTable == nTab ) { if ( !t->GetDoubleRef().Ref1.IsTabDeleted() ) - rRef.nTab = nTab - 1; // shrink area + rRef.nTab = nTab - nSheets; // shrink area else { rRef.nTab = MAXTAB+1; @@ -4714,7 +4714,7 @@ ScRangeData* ScCompiler::UpdateDeleteTab(SCTAB nTable, sal_Bool /* bIsMove */, s nTab = rRef1.nTab; if ( nTable < nTab ) { - rRef1.nTab = nTab - 1; + rRef1.nTab = nTab - nSheets; rChanged = sal_True; } else if ( nTable == nTab ) @@ -4755,13 +4755,13 @@ ScRangeData* ScCompiler::UpdateDeleteTab(SCTAB nTable, sal_Bool /* bIsMove */, s nTab = rRef2.nTab; if ( nTable < nTab ) { - rRef2.nTab = nTab - 1; + rRef2.nTab = nTab - nSheets; rChanged = sal_True; } else if ( nTable == nTab ) { if ( !rRef1.IsTabDeleted() ) - rRef2.nTab = nTab - 1; // shrink area + rRef2.nTab = nTab - nSheets; // shrink area else { rRef2.nTab = MAXTAB+1; diff --git a/sc/source/core/tool/rangenam.cxx b/sc/source/core/tool/rangenam.cxx index 41e1b442088f..07c7ea797bdb 100644 --- a/sc/source/core/tool/rangenam.cxx +++ b/sc/source/core/tool/rangenam.cxx @@ -390,7 +390,7 @@ sal_Bool ScRangeData::IsValidReference( ScRange& rRange ) const return false; } -void ScRangeData::UpdateTabRef(SCTAB nOldTable, sal_uInt16 nFlag, SCTAB nNewTable) +void ScRangeData::UpdateTabRef(SCTAB nOldTable, sal_uInt16 nFlag, SCTAB nNewTable, SCTAB nNewSheets) { pCode->Reset(); if( pCode->GetNextReference() ) @@ -402,7 +402,7 @@ void ScRangeData::UpdateTabRef(SCTAB nOldTable, sal_uInt16 nFlag, SCTAB nNewTabl switch (nFlag) { case 1: // einfache InsertTab (doc.cxx) - pRangeData = aComp.UpdateInsertTab(nOldTable, sal_True ); // und CopyTab (doc2.cxx) + pRangeData = aComp.UpdateInsertTab(nOldTable, sal_True, nNewSheets ); // und CopyTab (doc2.cxx) break; case 2: // einfaches delete (doc.cxx) pRangeData = aComp.UpdateDeleteTab(nOldTable, false, sal_True, bChanged); @@ -780,11 +780,11 @@ void ScRangeName::UpdateReference( itr->UpdateReference(eUpdateRefMode, rRange, nDx, nDy, nDz); } -void ScRangeName::UpdateTabRef(SCTAB nTable, sal_uInt16 nFlag, SCTAB nNewTable) +void ScRangeName::UpdateTabRef(SCTAB nTable, sal_uInt16 nFlag, SCTAB nNewTable, SCTAB nNewSheets) { DataType::iterator itr = maData.begin(), itrEnd = maData.end(); for (; itr != itrEnd; ++itr) - itr->UpdateTabRef(nTable, nFlag, nNewTable); + itr->UpdateTabRef(nTable, nFlag, nNewTable, nNewSheets); } void ScRangeName::UpdateTranspose(const ScRange& rSource, const ScAddress& rDest) diff --git a/sc/source/filter/inc/scflt.hxx b/sc/source/filter/inc/scflt.hxx index e66ba12e0c00..35f7743cb047 100644 --- a/sc/source/filter/inc/scflt.hxx +++ b/sc/source/filter/inc/scflt.hxx @@ -247,7 +247,7 @@ struct Sc10BlockRect struct Sc10DataBaseRec { sal_Char Name[32]; - sal_Int16 Tab; + SCTAB Tab; Sc10BlockRect Block; sal_uInt8 RowHeader; sal_Int16 SortField0; @@ -319,7 +319,7 @@ struct Sc10PageFormat sal_Char PrintAreaName[32]; Sc10BlockRect PrintArea; sal_Char PrnZoom[6]; // Pascal 6 Byte Realzahl - sal_uInt16 FirstPageNo; + SCTAB FirstPageNo; sal_Int16 RowRepeatStart; sal_Int16 RowRepeatEnd; sal_Int16 ColRepeatStart; @@ -731,7 +731,7 @@ class Sc10Import Sc10PatternCollection* pPatternCollection; Sc10DataBaseCollection* pDataBaseCollection; sal_uLong nError; - sal_Int16 TabCount; + SCTAB TabCount; SCTAB nShowTab; ScViewOptions aSc30ViewOpt; ScfStreamProgressBar* pPrgrsBar; diff --git a/sc/source/filter/xml/XMLTableSourceContext.cxx b/sc/source/filter/xml/XMLTableSourceContext.cxx index 5febeaf6097d..8e55441f4c90 100644 --- a/sc/source/filter/xml/XMLTableSourceContext.cxx +++ b/sc/source/filter/xml/XMLTableSourceContext.cxx @@ -118,7 +118,7 @@ void ScXMLTableSourceContext::EndElement() if (xLinkable.is() && pDoc) { ScXMLImport::MutexGuard aGuard(GetScImport()); - if (pDoc->RenameTab( static_cast<SCTAB>(GetScImport().GetTables().GetCurrentSheet()), + if (pDoc->RenameTab( GetScImport().GetTables().GetCurrentSheet(), GetScImport().GetTables().GetCurrentSheetName(), false, sal_True)) { String aFileString(sLink); @@ -136,7 +136,7 @@ void ScXMLTableSourceContext::EndElement() else if ( nMode == sheet::SheetLinkMode_VALUE ) nLinkMode = SC_LINK_VALUE; - pDoc->SetLink( static_cast<SCTAB>(GetScImport().GetTables().GetCurrentSheet()), + pDoc->SetLink( GetScImport().GetTables().GetCurrentSheet(), nLinkMode, aFileString, aFilterString, aOptString, aSheetString, nRefresh ); } diff --git a/sc/source/filter/xml/sheetdata.cxx b/sc/source/filter/xml/sheetdata.cxx index 471d6f8325d1..8eb63efe0699 100644 --- a/sc/source/filter/xml/sheetdata.cxx +++ b/sc/source/filter/xml/sheetdata.cxx @@ -103,31 +103,31 @@ void ScSheetSaveData::AddTextStyle( const rtl::OUString& rName, const ScAddress& maTextStyles.push_back( ScTextStyleEntry( rName, rCellPos, rSelection ) ); } -void ScSheetSaveData::BlockSheet( sal_Int32 nTab ) +void ScSheetSaveData::BlockSheet( SCTAB nTab ) { - if ( nTab >= (sal_Int32)maBlocked.size() ) + if ( nTab >= static_cast<SCTAB>(maBlocked.size()) ) maBlocked.resize( nTab + 1, false ); // fill vector with "false" entries maBlocked[nTab] = true; } -bool ScSheetSaveData::IsSheetBlocked( sal_Int32 nTab ) const +bool ScSheetSaveData::IsSheetBlocked( SCTAB nTab ) const { - if ( nTab < (sal_Int32)maBlocked.size() ) + if ( nTab < static_cast<SCTAB>(maBlocked.size()) ) return maBlocked[nTab]; else return false; } -void ScSheetSaveData::AddStreamPos( sal_Int32 nTab, sal_Int32 nStartOffset, sal_Int32 nEndOffset ) +void ScSheetSaveData::AddStreamPos( SCTAB nTab, sal_Int32 nStartOffset, sal_Int32 nEndOffset ) { - if ( nTab >= (sal_Int32)maStreamEntries.size() ) + if ( nTab >= static_cast<SCTAB>(maStreamEntries.size()) ) maStreamEntries.resize( nTab + 1 ); maStreamEntries[nTab] = ScStreamEntry( nStartOffset, nEndOffset ); } -void ScSheetSaveData::StartStreamPos( sal_Int32 nTab, sal_Int32 nStartOffset ) +void ScSheetSaveData::StartStreamPos( SCTAB nTab, sal_Int32 nStartOffset ) { OSL_ENSURE( mnStartTab < 0, "StartStreamPos without EndStreamPos" ); @@ -145,9 +145,9 @@ void ScSheetSaveData::EndStreamPos( sal_Int32 nEndOffset ) } } -void ScSheetSaveData::GetStreamPos( sal_Int32 nTab, sal_Int32& rStartOffset, sal_Int32& rEndOffset ) const +void ScSheetSaveData::GetStreamPos( SCTAB nTab, sal_Int32& rStartOffset, sal_Int32& rEndOffset ) const { - if ( nTab < (sal_Int32)maStreamEntries.size() ) + if ( nTab < static_cast<SCTAB>(maStreamEntries.size()) ) { const ScStreamEntry& rEntry = maStreamEntries[nTab]; rStartOffset = rEntry.mnStartOffset; @@ -157,7 +157,7 @@ void ScSheetSaveData::GetStreamPos( sal_Int32 nTab, sal_Int32& rStartOffset, sal rStartOffset = rEndOffset = -1; } -bool ScSheetSaveData::HasStreamPos( sal_Int32 nTab ) const +bool ScSheetSaveData::HasStreamPos( SCTAB nTab ) const { sal_Int32 nStartOffset = -1; sal_Int32 nEndOffset = -1; @@ -170,9 +170,9 @@ void ScSheetSaveData::ResetSaveEntries() maSaveEntries.clear(); } -void ScSheetSaveData::AddSavePos( sal_Int32 nTab, sal_Int32 nStartOffset, sal_Int32 nEndOffset ) +void ScSheetSaveData::AddSavePos( SCTAB nTab, sal_Int32 nStartOffset, sal_Int32 nEndOffset ) { - if ( nTab >= (sal_Int32)maSaveEntries.size() ) + if ( nTab >= static_cast<SCTAB>(maSaveEntries.size()) ) maSaveEntries.resize( nTab + 1 ); maSaveEntries[nTab] = ScStreamEntry( nStartOffset, nEndOffset ); diff --git a/sc/source/filter/xml/xmlcoli.cxx b/sc/source/filter/xml/xmlcoli.cxx index 9029d5a63a0d..a7f5b2e5823b 100644 --- a/sc/source/filter/xml/xmlcoli.cxx +++ b/sc/source/filter/xml/xmlcoli.cxx @@ -121,7 +121,7 @@ SvXMLImportContext *ScXMLTableColContext::CreateChildContext( sal_uInt16 nPrefix void ScXMLTableColContext::EndElement() { ScXMLImport& rXMLImport = GetScImport(); - sal_Int32 nSheet = rXMLImport.GetTables().GetCurrentSheet(); + SCTAB nSheet = rXMLImport.GetTables().GetCurrentSheet(); sal_Int32 nCurrentColumn = rXMLImport.GetTables().GetCurrentColumn(); uno::Reference<sheet::XSpreadsheet> xSheet(rXMLImport.GetTables().GetCurrentXSheet()); if(xSheet.is()) @@ -151,7 +151,7 @@ void ScXMLTableColContext::EndElement() if ( nSheet != pStyle->GetLastSheet() ) { ScSheetSaveData* pSheetData = ScModelObj::getImplementation(rXMLImport.GetModel())->GetSheetSaveData(); - pSheetData->AddColumnStyle( sStyleName, ScAddress( (SCCOL)nCurrentColumn, 0, (SCTAB)nSheet ) ); + pSheetData->AddColumnStyle( sStyleName, ScAddress( (SCCOL)nCurrentColumn, 0, nSheet ) ); pStyle->SetLastSheet(nSheet); } } @@ -288,7 +288,7 @@ void ScXMLTableColsContext::EndElement() } else if (bGroup) { - sal_Int32 nSheet = rXMLImport.GetTables().GetCurrentSheet(); + SCTAB nSheet = rXMLImport.GetTables().GetCurrentSheet(); nGroupEndCol = rXMLImport.GetTables().GetCurrentColumn(); nGroupEndCol--; if (nGroupStartCol <= nGroupEndCol) @@ -297,7 +297,7 @@ void ScXMLTableColsContext::EndElement() if (pDoc) { ScXMLImport::MutexGuard aGuard(GetScImport()); - ScOutlineTable* pOutlineTable = pDoc->GetOutlineTable(static_cast<SCTAB>(nSheet), sal_True); + ScOutlineTable* pOutlineTable = pDoc->GetOutlineTable(nSheet, sal_True); ScOutlineArray* pColArray = pOutlineTable ? pOutlineTable->GetColArray() : NULL; if (pColArray) { diff --git a/sc/source/filter/xml/xmlimprt.cxx b/sc/source/filter/xml/xmlimprt.cxx index 7456b9b2d407..451e59c4bbd4 100644 --- a/sc/source/filter/xml/xmlimprt.cxx +++ b/sc/source/filter/xml/xmlimprt.cxx @@ -3006,7 +3006,7 @@ void ScXMLImport::ProgressBarIncrement(sal_Bool bEditCell, sal_Int32 nInc) } } -sal_Int32 ScXMLImport::GetVisibleSheet() +SCTAB ScXMLImport::GetVisibleSheet() { // Get the visible sheet number from model's view data (after settings were loaded), // or 0 (default: first sheet) if no settings available. diff --git a/sc/source/filter/xml/xmlimprt.hxx b/sc/source/filter/xml/xmlimprt.hxx index 9a03945acded..2987eb3ca488 100644 --- a/sc/source/filter/xml/xmlimprt.hxx +++ b/sc/source/filter/xml/xmlimprt.hxx @@ -617,7 +617,7 @@ class SolarMutexGuard; struct tScMyCellRange { - sal_Int16 Sheet; + SCTAB Sheet; sal_Int32 StartColumn, EndColumn; sal_Int32 StartRow, EndRow; }; @@ -1009,7 +1009,7 @@ public: void SetLabelRanges(); void AddDefaultNote( const com::sun::star::table::CellAddress& aCell ); - sal_Int32 GetVisibleSheet(); + SCTAB GetVisibleSheet(); /** Extracts the formula string, the formula grammar namespace URL, and a grammar enum value from the passed formula attribute value. diff --git a/sc/source/filter/xml/xmlrowi.cxx b/sc/source/filter/xml/xmlrowi.cxx index 3728f5e9b650..fee203586d90 100644 --- a/sc/source/filter/xml/xmlrowi.cxx +++ b/sc/source/filter/xml/xmlrowi.cxx @@ -169,7 +169,7 @@ void ScXMLTableRowContext::EndElement() GetScImport().GetTables().AddRow(); OSL_FAIL("it seems here is a nonvalid file; possible missing of table:table-cell element"); } - sal_Int32 nSheet = rXMLImport.GetTables().GetCurrentSheet(); + SCTAB nSheet = rXMLImport.GetTables().GetCurrentSheet(); sal_Int32 nCurrentRow(rXMLImport.GetTables().GetCurrentRow()); uno::Reference<sheet::XSpreadsheet> xSheet(rXMLImport.GetTables().GetCurrentXSheet()); if(xSheet.is()) @@ -202,7 +202,7 @@ void ScXMLTableRowContext::EndElement() if ( nSheet != pStyle->GetLastSheet() ) { ScSheetSaveData* pSheetData = ScModelObj::getImplementation(rXMLImport.GetModel())->GetSheetSaveData(); - pSheetData->AddRowStyle( sStyleName, ScAddress( 0, (SCROW)nFirstRow, (SCTAB)nSheet ) ); + pSheetData->AddRowStyle( sStyleName, ScAddress( 0, (SCROW)nFirstRow, nSheet ) ); pStyle->SetLastSheet(nSheet); } } @@ -343,14 +343,14 @@ void ScXMLTableRowsContext::EndElement() else if (bGroup) { nGroupEndRow = rXMLImport.GetTables().GetCurrentRow(); - sal_Int32 nSheet(rXMLImport.GetTables().GetCurrentSheet()); + SCTAB nSheet(rXMLImport.GetTables().GetCurrentSheet()); if (nGroupStartRow <= nGroupEndRow) { ScDocument* pDoc(GetScImport().GetDocument()); if (pDoc) { ScXMLImport::MutexGuard aGuard(GetScImport()); - ScOutlineTable* pOutlineTable(pDoc->GetOutlineTable(static_cast<SCTAB>(nSheet), sal_True)); + ScOutlineTable* pOutlineTable(pDoc->GetOutlineTable(nSheet, sal_True)); ScOutlineArray* pRowArray(pOutlineTable->GetRowArray()); sal_Bool bResized; pRowArray->Insert(static_cast<SCROW>(nGroupStartRow), static_cast<SCROW>(nGroupEndRow), bResized, !bGroupDisplay, sal_True); diff --git a/sc/source/filter/xml/xmlsceni.cxx b/sc/source/filter/xml/xmlsceni.cxx index b20d60bc74f5..97b5ab7f939d 100644 --- a/sc/source/filter/xml/xmlsceni.cxx +++ b/sc/source/filter/xml/xmlsceni.cxx @@ -146,7 +146,7 @@ SvXMLImportContext *ScXMLTableScenarioContext::CreateChildContext( void ScXMLTableScenarioContext::EndElement() { - SCTAB nCurrTable( sal::static_int_cast<SCTAB>( GetScImport().GetTables().GetCurrentSheet() ) ); + SCTAB nCurrTable( GetScImport().GetTables().GetCurrentSheet() ); ScDocument* pDoc(GetScImport().GetDocument()); if (pDoc) { diff --git a/sc/source/filter/xml/xmlstyli.cxx b/sc/source/filter/xml/xmlstyli.cxx index 97eb77dd8d0a..487d484a259a 100644 --- a/sc/source/filter/xml/xmlstyli.cxx +++ b/sc/source/filter/xml/xmlstyli.cxx @@ -1059,14 +1059,14 @@ void ScCellTextStyleContext::FillPropertySet( const uno::Reference<beans::XPrope if (pCellImp) { ScAddress aPos = pCellImp->GetCellObj().GetPosition(); - if ( static_cast<sal_Int32>(aPos.Tab()) != nLastSheet ) + if ( aPos.Tab() != nLastSheet ) { ESelection aSel = pCellImp->GetSelection(); ScSheetSaveData* pSheetData = ScModelObj::getImplementation(GetImport().GetModel())->GetSheetSaveData(); pSheetData->AddTextStyle( GetName(), aPos, aSel ); - nLastSheet = static_cast<sal_Int32>(aPos.Tab()); + nLastSheet = aPos.Tab(); } } else if ( rXMLImport.GetTables().GetCurrentSheet() != nLastSheet ) diff --git a/sc/source/filter/xml/xmlstyli.hxx b/sc/source/filter/xml/xmlstyli.hxx index 9f69acca9d51..7c00d587031b 100644 --- a/sc/source/filter/xml/xmlstyli.hxx +++ b/sc/source/filter/xml/xmlstyli.hxx @@ -102,7 +102,7 @@ class XMLTableStyleContext : public XMLPropStyleContext std::vector<ScXMLMapContent> aMaps; com::sun::star::uno::Any aConditionalFormat; sal_Int32 nNumberFormat; - sal_Int32 nLastSheet; + SCTAB nLastSheet; sal_Bool bConditionalFormatCreated; sal_Bool bParentSet; @@ -160,8 +160,8 @@ public: sal_Int32 GetNumberFormat();// { return nNumberFormat; } - sal_Int32 GetLastSheet() const { return nLastSheet; } - void SetLastSheet(sal_Int32 nNew) { nLastSheet = nNew; } + SCTAB GetLastSheet() const { return nLastSheet; } + void SetLastSheet(SCTAB nNew) { nLastSheet = nNew; } private: using XMLPropStyleContext::SetStyle; diff --git a/sc/source/filter/xml/xmlsubti.cxx b/sc/source/filter/xml/xmlsubti.cxx index 6818327dd336..50c169d44a06 100644 --- a/sc/source/filter/xml/xmlsubti.cxx +++ b/sc/source/filter/xml/xmlsubti.cxx @@ -67,14 +67,14 @@ using ::std::auto_ptr; using namespace com::sun::star; -ScMyTableData::ScMyTableData(sal_Int32 nSheet, sal_Int32 nCol, sal_Int32 nRow) +ScMyTableData::ScMyTableData(SCTAB nSheet, sal_Int32 nCol, sal_Int32 nRow) : nColsPerCol(nDefaultColCount, 1), nRealCols(nDefaultColCount + 1, 0), nRowsPerRow(nDefaultRowCount, 1), nRealRows(nDefaultRowCount + 1, 0), nChangedCols() { - aTableCellPos.Sheet = sal::static_int_cast<sal_Int16>( nSheet ); + aTableCellPos.Sheet = nSheet; aTableCellPos.Column = nCol; aTableCellPos.Row = nRow; @@ -192,7 +192,7 @@ void ScMyTables::NewSheet(const rtl::OUString& sTableName, const rtl::OUString& { try { - xSheets->insertNewByName(sTableName, sal::static_int_cast<sal_Int16>(nCurrentSheet)); + xSheets->insertNewByName(sTableName, nCurrentSheet); } catch ( uno::RuntimeException& ) { @@ -203,7 +203,7 @@ void ScMyTables::NewSheet(const rtl::OUString& sTableName, const rtl::OUString& String sTabName(String::CreateFromAscii("Table")); pDoc->CreateValidTabName(sTabName); rtl::OUString sOUTabName(sTabName); - xSheets->insertNewByName(sOUTabName, sal::static_int_cast<sal_Int16>(nCurrentSheet)); + xSheets->insertNewByName(sOUTabName, nCurrentSheet); } } } @@ -260,7 +260,7 @@ void ScMyTables::NewSheet(const rtl::OUString& sTableName, const rtl::OUString& pStyle->FillPropertySet(xProperties); ScSheetSaveData* pSheetData = ScModelObj::getImplementation(rImport.GetModel())->GetSheetSaveData(); - pSheetData->AddTableStyle( sStyleName, ScAddress( 0, 0, (SCTAB)nCurrentSheet ) ); + pSheetData->AddTableStyle( sStyleName, ScAddress( 0, 0, nCurrentSheet ) ); } } } @@ -608,7 +608,7 @@ void ScMyTables::UpdateRowHeights() SCTAB nCount = pDoc->GetTableCount(); ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer(); - SCTAB nVisible = static_cast<SCTAB>( rImport.GetVisibleSheet() ); + SCTAB nVisible = rImport.GetVisibleSheet(); ScMarkData aUpdateSheets; for (SCTAB nTab=0; nTab<nCount; ++nTab) @@ -667,7 +667,7 @@ void ScMyTables::DeleteTable() pProtect->setPasswordHash(aHash, maProtectionData.meHash1, maProtectionData.meHash2); pProtect->setOption(ScTableProtection::SELECT_LOCKED_CELLS, maProtectionData.mbSelectProtectedCells); pProtect->setOption(ScTableProtection::SELECT_UNLOCKED_CELLS, maProtectionData.mbSelectUnprotectedCells); - rImport.GetDocument()->SetTabProtection(static_cast<SCTAB>(nCurrentSheet), pProtect.get()); + rImport.GetDocument()->SetTabProtection(nCurrentSheet, pProtect.get()); } //#95582#; find out whether it was possible to set the sheet name @@ -679,7 +679,7 @@ void ScMyTables::DeleteTable() rtl::OUString sCurrentName(xNamed->getName()); if (sCurrentName != sCurrentSheetName && rImport.GetDocument()) { - rImport.GetDocument()->RenameTab( static_cast<SCTAB>(nCurrentSheet), + rImport.GetDocument()->RenameTab( nCurrentSheet, sCurrentSheetName, false, sal_True); } } @@ -699,7 +699,7 @@ table::CellAddress ScMyTables::GetRealCellPos() aRealCellPos.Row = nRow; aRealCellPos.Column = nCol; - aRealCellPos.Sheet = sal::static_int_cast<sal_Int16>(nCurrentSheet); + aRealCellPos.Sheet = nCurrentSheet; return aRealCellPos; } @@ -769,7 +769,7 @@ void ScMyTables::AddMatrixRange( aRange.StartRow = nStartRow; aRange.EndColumn = nEndColumn; aRange.EndRow = nEndRow; - aRange.Sheet = sal::static_int_cast<sal_Int16>(nCurrentSheet); + aRange.Sheet = nCurrentSheet; ScMatrixRange aMRange(aRange, rFormula, rFormulaNmsp, eGrammar); aMatrixRangeList.push_back(aMRange); } diff --git a/sc/source/filter/xml/xmlsubti.hxx b/sc/source/filter/xml/xmlsubti.hxx index 32b02080a900..bb76dc2f0fac 100644 --- a/sc/source/filter/xml/xmlsubti.hxx +++ b/sc/source/filter/xml/xmlsubti.hxx @@ -67,7 +67,7 @@ private: sal_Int32 nSubTableSpanned; ScMysalIntList nChangedCols; public: - ScMyTableData(sal_Int32 nSheet = -1, sal_Int32 nCol = -1, sal_Int32 nRow = -1); + ScMyTableData(SCTAB nSheet = -1, sal_Int32 nCol = -1, sal_Int32 nRow = -1); ~ScMyTableData(); com::sun::star::table::CellAddress GetCellPos() const { return aTableCellPos; } sal_Int32 GetRow() const { return aTableCellPos.Row; } @@ -142,7 +142,7 @@ private: sal_Int32 nCurrentColStylePos; sal_Int16 nCurrentDrawPage; sal_Int16 nCurrentXShapes; - sal_Int32 nCurrentSheet; + SCTAB nCurrentSheet; sal_Bool IsMerged (const com::sun::star::uno::Reference <com::sun::star::table::XCellRange>& xCellRange, const sal_Int32 nCol, const sal_Int32 nRow, @@ -172,7 +172,7 @@ public: void AddColStyle(const sal_Int32 nRepeat, const rtl::OUString& rCellStyleName); ScXMLTabProtectionData& GetCurrentProtectionData() { return maProtectionData; } rtl::OUString GetCurrentSheetName() const { return sCurrentSheetName; } - sal_Int32 GetCurrentSheet() const { return nCurrentSheet; } + SCTAB GetCurrentSheet() const { return nCurrentSheet; } sal_Int32 GetCurrentColumn() const { return maTables.back().GetColCount(); } sal_Int32 GetCurrentRow() const { return maTables.back().GetRow(); } ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSpreadsheet > diff --git a/sc/source/filter/xml/xmltabi.cxx b/sc/source/filter/xml/xmltabi.cxx index b0ba2c14e739..5a946b764e40 100644 --- a/sc/source/filter/xml/xmltabi.cxx +++ b/sc/source/filter/xml/xmltabi.cxx @@ -285,8 +285,8 @@ SvXMLImportContext *ScXMLTableContext::CreateChildContext( sal_uInt16 nPrefix, ScDocument* pDoc = GetScImport().GetDocument(); if (pDoc) { - sal_Int32 nTab = GetScImport().GetTables().GetCurrentSheet(); - ScRangeName* pRN = pDoc->GetRangeName(static_cast<SCTAB>(nTab)); + SCTAB nTab = GetScImport().GetTables().GetCurrentSheet(); + ScRangeName* pRN = pDoc->GetRangeName(nTab); if (pRN) { pContext = new ScXMLNamedExpressionsContext( @@ -381,7 +381,7 @@ void ScXMLTableContext::EndElement() if (!pDoc) return; - SCTAB nCurTab = static_cast<SCTAB>(GetScImport().GetTables().GetCurrentSheet()); + SCTAB nCurTab = GetScImport().GetTables().GetCurrentSheet(); if (sPrintRanges.getLength()) { Reference< sheet::XPrintAreas > xPrintAreas( @@ -446,7 +446,7 @@ void ScXMLTableContext::EndElement() if (!pExternalRefInfo.get() && nStartOffset >= 0 /* && nEndOffset >= 0 */) { ScSheetSaveData* pSheetData = ScModelObj::getImplementation(GetScImport().GetModel())->GetSheetSaveData(); - sal_Int32 nTab = GetScImport().GetTables().GetCurrentSheet(); + SCTAB nTab = GetScImport().GetTables().GetCurrentSheet(); // pSheetData->AddStreamPos( nTab, nStartOffset, nEndOffset ); pSheetData->StartStreamPos( nTab, nStartOffset ); } diff --git a/sc/source/ui/app/scmod.cxx b/sc/source/ui/app/scmod.cxx index 503f584a92c7..764b8d91f801 100644 --- a/sc/source/ui/app/scmod.cxx +++ b/sc/source/ui/app/scmod.cxx @@ -1684,15 +1684,8 @@ void lcl_MarkedTabs( const ScMarkData& rMark, SCTAB& rStartTab, SCTAB& rEndTab ) { if (rMark.GetSelectCount() > 1) { - sal_Bool bFirst = sal_True; - for (SCTAB i=0; i<=MAXTAB; i++) - if (rMark.GetTableSelect(i)) - { - if (bFirst) - rStartTab = i; - rEndTab = i; - bFirst = false; - } + rEndTab = rMark.GetLastSelected(); + rStartTab = rMark.GetFirstSelected(); } } diff --git a/sc/source/ui/app/transobj.cxx b/sc/source/ui/app/transobj.cxx index 490c3791b140..d99b7a277509 100644 --- a/sc/source/ui/app/transobj.cxx +++ b/sc/source/ui/app/transobj.cxx @@ -161,7 +161,7 @@ ScTransferObj::ScTransferObj( ScDocument* pClipDoc, const TransferableObjectDesc SCTAB nTab1=0; SCTAB nTab2=0; sal_Bool bFirst = sal_True; - for (SCTAB i=0; i<=MAXTAB; i++) + for (SCTAB i=0; i< pDoc->GetTableCount(); i++) if (pDoc->HasTable(i)) { if (bFirst) @@ -767,10 +767,10 @@ void ScTransferObj::StripRefs( ScDocument* pDoc, // In a clipboard doc the data don't have to be on the first sheet SCTAB nSrcTab = 0; - while (nSrcTab<MAXTAB && !pDoc->HasTable(nSrcTab)) + while (nSrcTab<pDoc->GetTableCount() && !pDoc->HasTable(nSrcTab)) ++nSrcTab; SCTAB nDestTab = 0; - while (nDestTab<MAXTAB && !pDestDoc->HasTable(nDestTab)) + while (nDestTab<pDestDoc->GetTableCount() && !pDestDoc->HasTable(nDestTab)) ++nDestTab; if (!pDoc->HasTable(nSrcTab) || !pDestDoc->HasTable(nDestTab)) diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx index 62ac24675b23..6ff4a81d8204 100644 --- a/sc/source/ui/docshell/docsh.cxx +++ b/sc/source/ui/docshell/docsh.cxx @@ -246,9 +246,7 @@ SCTAB ScDocShell::GetSaveTab() if (pSh) { const ScMarkData& rMark = pSh->GetViewData()->GetMarkData(); - for ( nTab = 0; nTab <= MAXTAB; nTab++ ) // erste markierte Tabelle - if ( rMark.GetTableSelect( nTab ) ) - break; + nTab = rMark.GetFirstSelected(); } return nTab; } @@ -544,6 +542,15 @@ void ScDocShell::Notify( SfxBroadcaster&, const SfxHint& rHint ) aArgs[0] <<= rScHint.GetTab1(); xVbaEvents->processVbaEvent( WORKBOOK_NEWSHEET, aArgs ); } + else if (rScHint.GetId() == SC_TABS_INSERTED) + { + for (SCTAB i = 0; i < rScHint.GetTab2(); ++i) + { + uno::Sequence< uno::Any > aArgs( 1 ); + aArgs[0] <<= rScHint.GetTab1() + i; + xVbaEvents->processVbaEvent( WORKBOOK_NEWSHEET, aArgs ); + } + } } else if ( rHint.ISA( SfxEventHint ) ) { diff --git a/sc/source/ui/docshell/docsh5.cxx b/sc/source/ui/docshell/docsh5.cxx index 373c68f198ac..1e6c2474ffbc 100644 --- a/sc/source/ui/docshell/docsh5.cxx +++ b/sc/source/ui/docshell/docsh5.cxx @@ -59,6 +59,7 @@ #include "dbdocfun.hxx" #include "consoli.hxx" #include "dbdata.hxx" +#include "progress.hxx" #include "olinetab.hxx" #include "patattr.hxx" #include "attrib.hxx" @@ -973,8 +974,14 @@ sal_Bool ScDocShell::MoveTable( SCTAB nSrcTab, SCTAB nDestTab, sal_Bool bCopy, s return sal_True; // nothing to do, but valid } - if (!aDocument.MoveTab( nSrcTab, nDestTab )) + ScProgress* pProgress = new ScProgress(this, ScGlobal::GetRscString(STR_UNDO_MOVE_TAB), + aDocument.GetCodeCount()); + bool bDone = aDocument.MoveTab( nSrcTab, nDestTab, pProgress ); + delete pProgress; + if (!bDone) + { return false; + } else if (bRecord) { auto_ptr< vector<SCTAB> > pSrcList(new vector<SCTAB>(1, nSrcTab)); diff --git a/sc/source/ui/inc/pfuncache.hxx b/sc/source/ui/inc/pfuncache.hxx index b64e9753e43d..75d1d097f0cf 100644 --- a/sc/source/ui/inc/pfuncache.hxx +++ b/sc/source/ui/inc/pfuncache.hxx @@ -100,8 +100,8 @@ class ScPrintFuncCache ScPrintSelectionStatus aSelection; ScDocShell* pDocSh; long nTotalPages; - long nPages[MAXTABCOUNT]; - long nFirstAttr[MAXTABCOUNT]; + std::vector<long> nPages; + std::vector<long> nFirstAttr; std::vector<ScPrintPageLocation> aLocations; bool bLocInitialized; diff --git a/sc/source/ui/inc/preview.hxx b/sc/source/ui/inc/preview.hxx index 6988259526d0..1ea80fd92202 100644 --- a/sc/source/ui/inc/preview.hxx +++ b/sc/source/ui/inc/preview.hxx @@ -32,6 +32,8 @@ #include <vcl/window.hxx> #include "printfun.hxx" // ScPrintState +#include <vector> + class ScDocShell; class ScPreviewShell; class FmFormView; @@ -48,8 +50,8 @@ private: sal_Bool bValid; // folgende Werte gueltig SCTAB nTabCount; SCTAB nTabsTested; // fuer wieviele Tabellen ist nPages gueltig? - long nPages[MAXTABCOUNT]; - long nFirstAttr[MAXTABCOUNT]; + std::vector<long> nPages; + std::vector<long> nFirstAttr; SCTAB nTab; // Tabelle long nTabPage; // Seite von Tabelle long nTabStart; // erste Seite der Tabelle (wirklich) diff --git a/sc/source/ui/inc/uiitems.hxx b/sc/source/ui/inc/uiitems.hxx index 584b6e5dc815..7f71a152684e 100644 --- a/sc/source/ui/inc/uiitems.hxx +++ b/sc/source/ui/inc/uiitems.hxx @@ -92,6 +92,8 @@ public: #define SC_TAB_MOVED 3 #define SC_TAB_COPIED 4 #define SC_TAB_HIDDEN 5 +#define SC_TABS_INSERTED 6 +#define SC_TABS_DELETED 7 class ScTablesHint : public SfxHint { diff --git a/sc/source/ui/inc/undotab.hxx b/sc/source/ui/inc/undotab.hxx index 0c6bec3782af..0d26ac84f9f9 100644 --- a/sc/source/ui/inc/undotab.hxx +++ b/sc/source/ui/inc/undotab.hxx @@ -94,7 +94,7 @@ public: ScDocShell* pNewDocShell, SCTAB nTabNum, sal_Bool bApp, - SvStrings *pNewNameList); + std::vector<rtl::OUString>& newNameList); virtual ~ScUndoInsertTables(); virtual void Undo(); @@ -107,7 +107,7 @@ public: private: SdrUndoAction* pDrawUndo; - SvStrings* pNameList; + std::vector<rtl::OUString> aNameList; sal_uLong nStartChangeAction; sal_uLong nEndChangeAction; SCTAB nTab; diff --git a/sc/source/ui/inc/viewdata.hxx b/sc/source/ui/inc/viewdata.hxx index 83a15fc79b60..d0160ba2708e 100644 --- a/sc/source/ui/inc/viewdata.hxx +++ b/sc/source/ui/inc/viewdata.hxx @@ -170,7 +170,7 @@ class SC_DLLPUBLIC ScViewData private: double nPPTX, nPPTY; // Scaling-Faktoren - ScViewDataTable* pTabData[MAXTABCOUNT]; + ::std::vector<ScViewDataTable*> pTabData; ScViewDataTable* pThisTab; // Daten der angezeigten Tabelle ScDocShell* pDocShell; ScDocument* pDoc; @@ -277,7 +277,9 @@ public: void UpdateThis(); void InsertTab( SCTAB nTab ); + void InsertTabs( SCTAB nTab, SCTAB nNewSheets ); void DeleteTab( SCTAB nTab ); + void DeleteTabs( SCTAB nTab, SCTAB nSheets ); void CopyTab( SCTAB nSrcTab, SCTAB nDestTab ); void MoveTab( SCTAB nSrcTab, SCTAB nDestTab ); diff --git a/sc/source/ui/inc/viewfunc.hxx b/sc/source/ui/inc/viewfunc.hxx index ed78ccf7e4a2..a162b86a2ec7 100644 --- a/sc/source/ui/inc/viewfunc.hxx +++ b/sc/source/ui/inc/viewfunc.hxx @@ -260,13 +260,14 @@ public: void TabOp( const ScTabOpParam& rParam, sal_Bool bRecord = sal_True ); sal_Bool InsertTable( const String& rName, SCTAB nTabNr, sal_Bool bRecord = sal_True ); - sal_Bool InsertTables(SvStrings *pNames, SCTAB nTab, SCTAB nCount, sal_Bool bRecord = sal_True); + sal_Bool InsertTables(std::vector<rtl::OUString>& aNames, SCTAB nTab, SCTAB nCount, sal_Bool bRecord = sal_True); sal_Bool AppendTable( const String& rName, sal_Bool bRecord = sal_True ); sal_Bool DeleteTable( SCTAB nTabNr, sal_Bool bRecord = true ); sal_Bool DeleteTables(const std::vector<SCTAB>& TheTabs, sal_Bool bRecord = true ); + bool DeleteTables(SCTAB nTab, SCTAB nSheets); sal_Bool RenameTable( const String& rName, SCTAB nTabNr ); void MoveTable( sal_uInt16 nDestDocNo, SCTAB nDestTab, sal_Bool bCopy, const String* pNewTabName = NULL ); diff --git a/sc/source/ui/undo/undotab.cxx b/sc/source/ui/undo/undotab.cxx index d5264317c86d..96f8d46ea4bb 100644 --- a/sc/source/ui/undo/undotab.cxx +++ b/sc/source/ui/undo/undotab.cxx @@ -49,6 +49,7 @@ #include "chgtrack.hxx" #include "tabprotection.hxx" #include "viewdata.hxx" +#include "progress.hxx" // for ScUndoRenameObject - might me moved to another file later #include <svx/svditer.hxx> @@ -193,13 +194,13 @@ sal_Bool ScUndoInsertTab::CanRepeat(SfxRepeatTarget& rTarget) const ScUndoInsertTables::ScUndoInsertTables( ScDocShell* pNewDocShell, SCTAB nTabNum, - sal_Bool bApp,SvStrings *pNewNameList) : + sal_Bool bApp,std::vector<rtl::OUString>& newNameList) : ScSimpleUndo( pNewDocShell ), pDrawUndo( NULL ), + aNameList( newNameList ), nTab( nTabNum ), bAppend( bApp ) { - pNameList = pNewNameList; pDrawUndo = GetSdrUndoAction( pDocShell->GetDocument() ); SetChangeTrack(); @@ -207,17 +208,6 @@ ScUndoInsertTables::ScUndoInsertTables( ScDocShell* pNewDocShell, ScUndoInsertTables::~ScUndoInsertTables() { - String *pStr=NULL; - if(pNameList!=NULL) - { - for(int i=0;i<pNameList->Count();i++) - { - pStr=pNameList->GetObject(sal::static_int_cast<sal_uInt16>(i)); - delete pStr; - } - pNameList->Remove(0,pNameList->Count()); - delete pNameList; - } DeleteSdrUndoAction( pDrawUndo ); } @@ -234,7 +224,7 @@ void ScUndoInsertTables::SetChangeTrack() nStartChangeAction = pChangeTrack->GetActionMax() + 1; nEndChangeAction = 0; ScRange aRange( 0, 0, nTab, MAXCOL, MAXROW, nTab ); - for( int i = 0; i < pNameList->Count(); i++ ) + for( size_t i = 0; i < aNameList.size(); i++ ) { aRange.aStart.SetTab( sal::static_int_cast<SCTAB>( nTab + i ) ); aRange.aEnd.SetTab( sal::static_int_cast<SCTAB>( nTab + i ) ); @@ -254,13 +244,7 @@ void ScUndoInsertTables::Undo() pDocShell->SetInUndo( sal_True ); //! BeginUndo bDrawIsInUndo = sal_True; - vector<SCTAB> TheTabs; - for(int i=0; i<pNameList->Count(); ++i) - { - TheTabs.push_back(nTab+i); - } - pViewShell->DeleteTables( TheTabs, false ); - TheTabs.clear(); + pViewShell->DeleteTables( nTab, static_cast<SCTAB>(aNameList.size()) ); bDrawIsInUndo = false; pDocShell->SetInUndo( false ); //! EndUndo @@ -284,7 +268,7 @@ void ScUndoInsertTables::Redo() pDocShell->SetInUndo( sal_True ); //! BeginRedo bDrawIsInUndo = sal_True; pViewShell->SetTabNo(nTab); - pViewShell->InsertTables( pNameList, nTab, static_cast<SCTAB>(pNameList->Count()),false ); + pViewShell->InsertTables( aNameList, nTab, static_cast<SCTAB>(aNameList.size()),false ); bDrawIsInUndo = false; pDocShell->SetInUndo( false ); //! EndRedo @@ -570,14 +554,17 @@ void ScUndoMoveTab::DoChange( sal_Bool bUndo ) const if (bUndo) // UnDo { - for (size_t i = mpNewTabs->size(); i > 0; --i) + size_t i = mpNewTabs->size(); + ScProgress* pProgress = new ScProgress(pDocShell , ScGlobal::GetRscString(STR_UNDO_MOVE_TAB), + i * pDoc->GetCodeCount()); + for (; i > 0; --i) { SCTAB nDestTab = (*mpNewTabs)[i-1]; SCTAB nOldTab = (*mpOldTabs)[i-1]; if (nDestTab > MAXTAB) // angehaengt ? nDestTab = pDoc->GetTableCount() - 1; - pDoc->MoveTab( nDestTab, nOldTab ); + pDoc->MoveTab( nDestTab, nOldTab, pProgress ); pViewShell->GetViewData()->MoveTab( nDestTab, nOldTab ); pViewShell->SetTabNo( nOldTab, true ); if (mpOldNames) @@ -586,10 +573,14 @@ void ScUndoMoveTab::DoChange( sal_Bool bUndo ) const pDoc->RenameTab(nOldTab, rOldName); } } + delete pProgress; } else { - for (size_t i = 0, n = mpNewTabs->size(); i < n; ++i) + size_t n = mpNewTabs->size(); + ScProgress* pProgress = new ScProgress(pDocShell , ScGlobal::GetRscString(STR_UNDO_MOVE_TAB), + n * pDoc->GetCodeCount()); + for (size_t i = 0; i < n; ++i) { SCTAB nDestTab = (*mpNewTabs)[i]; SCTAB nNewTab = nDestTab; @@ -597,7 +588,7 @@ void ScUndoMoveTab::DoChange( sal_Bool bUndo ) const if (nDestTab > MAXTAB) // angehaengt ? nDestTab = pDoc->GetTableCount() - 1; - pDoc->MoveTab( nOldTab, nNewTab ); + pDoc->MoveTab( nOldTab, nNewTab, pProgress ); pViewShell->GetViewData()->MoveTab( nOldTab, nNewTab ); pViewShell->SetTabNo( nDestTab, true ); if (mpNewNames) @@ -606,6 +597,7 @@ void ScUndoMoveTab::DoChange( sal_Bool bUndo ) const pDoc->RenameTab(nNewTab, rNewName); } } + delete pProgress; } SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) ); // Navigator diff --git a/sc/source/ui/vba/vbaquerytable.cxx b/sc/source/ui/vba/vbaquerytable.cxx index 159c7b75adf2..03e734a81548 100644 --- a/sc/source/ui/vba/vbaquerytable.cxx +++ b/sc/source/ui/vba/vbaquerytable.cxx @@ -59,9 +59,9 @@ ScVbaQueryTable::Refresh( const ::com::sun::star::uno::Any& /*aBackgroundQuery*/ { //Get parent Info - sal_Int32 nRow = m_pParent->getRow(); - sal_Int32 nClm = m_pParent->getColumn(); - sal_Int16 nTab = m_pParent->getWorksheet()->getIndex() - 1; //The vba index begin from 1. + SCROW nRow = m_pParent->getRow(); + SCCOL nClm = m_pParent->getColumn(); + SCTAB nTab = m_pParent->getWorksheet()->getIndex() - 1; //The vba index begin from 1. ScAddress crrRngAddr(nClm, nRow, nTab); //Get link info diff --git a/sc/source/ui/view/cellsh3.cxx b/sc/source/ui/view/cellsh3.cxx index 862e8b7a9430..72cf8c94908f 100644 --- a/sc/source/ui/view/cellsh3.cxx +++ b/sc/source/ui/view/cellsh3.cxx @@ -460,7 +460,7 @@ void ScCellShell::Execute( SfxRequest& rReq ) bValid = !pDoc->GetTable( aName, nDummy ); ++i; } - while ( !bValid && i <= 2*MAXTAB ); + while ( !bValid && i <= MAXTAB + 2 ); if ( pReqArgs != NULL ) { diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx index 9fd6585ded83..34dd1fb5a288 100644 --- a/sc/source/ui/view/gridwin.cxx +++ b/sc/source/ui/view/gridwin.cxx @@ -3952,22 +3952,21 @@ sal_Int8 ScGridWindow::DropTransferObj( ScTransferObj* pTransObj, SCCOL nDestPos { ScDocShell* pSrcShell = pTransObj->GetSourceDocShell(); - SCTAB nTabs[MAXTABCOUNT]; + std::vector<SCTAB> nTabs; ScMarkData aMark = pTransObj->GetSourceMarkData(); SCTAB nTabCount = pSourceDoc->GetTableCount(); - SCTAB nTabSelCount = 0; for(SCTAB i=0; i<nTabCount; i++) { if(aMark.GetTableSelect(i)) { - nTabs[nTabSelCount++]=i; + nTabs.push_back(i); for(SCTAB j=i+1;j<nTabCount;j++) { if((!pSourceDoc->IsVisible(j))&&(pSourceDoc->IsScenario(j))) { - nTabs[nTabSelCount++]=j; + nTabs.push_back( j ); i=j; } else break; @@ -3975,7 +3974,7 @@ sal_Int8 ScGridWindow::DropTransferObj( ScTransferObj* pTransObj, SCCOL nDestPos } } - pView->ImportTables( pSrcShell,nTabSelCount, nTabs, bIsLink, nThisTab ); + pView->ImportTables( pSrcShell,static_cast<SCTAB>(nTabs.size()), &nTabs[0], bIsLink, nThisTab ); bDone = sal_True; } } diff --git a/sc/source/ui/view/pfuncache.cxx b/sc/source/ui/view/pfuncache.cxx index 9359c5425cf9..25c90813136a 100644 --- a/sc/source/ui/view/pfuncache.cxx +++ b/sc/source/ui/view/pfuncache.cxx @@ -48,6 +48,8 @@ ScPrintFuncCache::ScPrintFuncCache( ScDocShell* pD, const ScMarkData& rMark, aSelection( rStatus ), pDocSh( pD ), nTotalPages( 0 ), + nPages(), + nFirstAttr(), bLocInitialized( false ) { // page count uses the stored cell widths for the printer anyway, @@ -77,12 +79,12 @@ ScPrintFuncCache::ScPrintFuncCache( ScDocShell* pD, const ScMarkData& rMark, ScPrintFunc aFunc( pDocSh, pPrinter, nTab, nAttrPage, 0, pSelRange, &aSelection.GetOptions() ); nThisTab = aFunc.GetTotalPages(); - nFirstAttr[nTab] = aFunc.GetFirstPageNo(); // from page style or previous sheet + nFirstAttr.push_back( aFunc.GetFirstPageNo() ); // from page style or previous sheet } else - nFirstAttr[nTab] = nAttrPage; + nFirstAttr.push_back( nAttrPage ); - nPages[nTab] = nThisTab; + nPages.push_back( nThisTab ); nTotalPages += nThisTab; } } @@ -175,7 +177,7 @@ SCTAB ScPrintFuncCache::GetTabForPage( long nPage ) const long ScPrintFuncCache::GetTabStart( SCTAB nTab ) const { long nRet = 0; - for ( SCTAB i=0; i<nTab; i++ ) + for ( SCTAB i=0; i<nTab&& i < static_cast<SCTAB>(nPages.size()); i++ ) nRet += nPages[i]; return nRet; } @@ -191,7 +193,12 @@ long ScPrintFuncCache::GetDisplayStart( SCTAB nTab ) const if ( pDoc->NeedPageResetAfterTab(i) ) nDisplayStart = 0; else - nDisplayStart += nPages[i]; + { + if ( i < static_cast<SCTAB>(nPages.size()) ) + nDisplayStart += nPages[i]; + else + OSL_FAIL("nPages out of bounds, FIX IT!"); + } } return nDisplayStart; } diff --git a/sc/source/ui/view/preview.cxx b/sc/source/ui/view/preview.cxx index 35e03864c582..1e39c3b5a8c9 100644 --- a/sc/source/ui/view/preview.cxx +++ b/sc/source/ui/view/preview.cxx @@ -81,7 +81,7 @@ #define SC_PREVIEW_SHADOWSIZE 2 -long lcl_GetDisplayStart( SCTAB nTab, ScDocument* pDoc, long* pPages ) +long lcl_GetDisplayStart( SCTAB nTab, ScDocument* pDoc, std::vector<long>& nPages ) { long nDisplayStart = 0; for (SCTAB i=0; i<nTab; i++) @@ -89,7 +89,7 @@ long lcl_GetDisplayStart( SCTAB nTab, ScDocument* pDoc, long* pPages ) if ( pDoc->NeedPageResetAfterTab(i) ) nDisplayStart = 0; else - nDisplayStart += pPages[i]; + nDisplayStart += nPages[i]; } return nDisplayStart; } @@ -101,6 +101,8 @@ ScPreview::ScPreview( Window* pParent, ScDocShell* pDocSh, ScPreviewShell* pView nZoom( 100 ), bValid( false ), nTabsTested( 0 ), + nPages(), + nFirstAttr(), nTab( 0 ), nTabStart( 0 ), nDisplayStart( 0 ), @@ -190,10 +192,10 @@ void ScPreview::TestLastPage() if (nTotalPages) { nPageNo = nTotalPages - 1; - nTab = nTabCount - 1; + nTab = static_cast<SCTAB>(nPages.size()) -1; while (nTab > 0 && !nPages[nTab]) // letzte nicht leere Tabelle --nTab; - OSL_ENSURE(nPages[nTab],"alle Tabellen leer?"); + OSL_ENSURE(0 < static_cast<SCTAB>(nPages.size()),"alle Tabellen leer?"); nTabPage = nPages[nTab] - 1; nTabStart = 0; for (sal_uInt16 i=0; i<nTab; i++) @@ -245,8 +247,16 @@ void ScPreview::CalcPages( SCTAB /*nToWhichTab*/ ) ScMarkData aMarkData; aMarkData.SelectTable( nCurTab, true ); + while (nStart > static_cast<SCTAB>(nPages.size())) + nPages.push_back(0); + while (nStart > static_cast<SCTAB>(nFirstAttr.size())) + nFirstAttr.push_back(0); for (SCTAB i=nStart; i<nAnz; i++) { + if ( i == static_cast<SCTAB>(nPages.size())) + nPages.push_back(0); + if ( i == static_cast<SCTAB>(nFirstAttr.size())) + nFirstAttr.push_back(0); if (!aOptions.GetAllSheets() && !aMarkData.GetTableSelect( i )) { nPages[i] = 0; nFirstAttr[i] = 0; @@ -308,7 +318,7 @@ void ScPreview::RecalcPages() // nur nPageNo geaendert if (!bDone) { long nPartPages = 0; - for (SCTAB i=0; i<nTabsTested; i++) + for (SCTAB i=0; i<nTabsTested && nTab < static_cast<SCTAB>(nPages.size()); i++) { long nThisStart = nPartPages; nPartPages += nPages[i]; @@ -806,6 +816,8 @@ void ScPreview::SetPageNo( long nPage ) long ScPreview::GetFirstPage(SCTAB nTabP) { + if (nTabP >= static_cast<SCTAB>(nPages.size()) ) + OSL_FAIL("nPages out ouf bounds, FIX IT"); SCTAB nDocTabCount = pDocShell->GetDocument()->GetTableCount(); if (nTabP >= nDocTabCount) nTabP = nDocTabCount-1; diff --git a/sc/source/ui/view/tabvwsh5.cxx b/sc/source/ui/view/tabvwsh5.cxx index 030c26f3ef71..1bc112d13e78 100644 --- a/sc/source/ui/view/tabvwsh5.cxx +++ b/sc/source/ui/view/tabvwsh5.cxx @@ -239,6 +239,12 @@ void ScTabViewShell::Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) break; case SC_TAB_HIDDEN: break; + case SC_TABS_INSERTED: + GetViewData()->InsertTabs( nTab1, nTab2 ); + break; + case SC_TABS_DELETED: + GetViewData()->DeleteTabs( nTab1, nTab2 ); + break; default: OSL_FAIL("unbekannter ScTablesHint"); } @@ -282,6 +288,14 @@ void ScTabViewShell::Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) if ( nTab1 == nNewTab ) // aktuelle ausgeblendet bStayOnActiveTab = false; break; + case SC_TABS_INSERTED: + if ( nTab1 <= nNewTab ) + nNewTab += nTab2; + break; + case SC_TABS_DELETED: + if ( nTab1 < nNewTab ) + nNewTab -= nTab2; + break; } ScDocument* pDoc = GetViewData()->GetDocument(); diff --git a/sc/source/ui/view/tabvwshf.cxx b/sc/source/ui/view/tabvwshf.cxx index 8f57091af5db..c6266ef308cf 100644 --- a/sc/source/ui/view/tabvwshf.cxx +++ b/sc/source/ui/view/tabvwshf.cxx @@ -252,21 +252,20 @@ void ScTabViewShell::ExecuteTable( SfxRequest& rReq ) { if (pDlg->GetTablesFromFile()) { - SCTAB nTabs[MAXTABCOUNT]; - SCTAB nCount = 0; + std::vector<SCTAB> nTabs; sal_uInt16 n = 0; const String* pStr = pDlg->GetFirstTable( &n ); while ( pStr ) { - nTabs[nCount++] = static_cast<SCTAB>(n); + nTabs.push_back( static_cast<SCTAB>(n) ); pStr = pDlg->GetNextTable( &n ); } sal_Bool bLink = pDlg->GetTablesAsLink(); - if (nCount != 0) + if (0 < nTabs.size()) { if(pDlg->IsTableBefore()) { - ImportTables( pDlg->GetDocShellTables(), nCount, nTabs, + ImportTables( pDlg->GetDocShellTables(), nTabs.size(), &nTabs[0], bLink,nTabNr ); } else @@ -282,7 +281,7 @@ void ScTabViewShell::ExecuteTable( SfxRequest& rReq ) } } - ImportTables( pDlg->GetDocShellTables(), nCount, nTabs, + ImportTables( pDlg->GetDocShellTables(), nTabs.size(), &nTabs[0], bLink,nTabAfter ); } } @@ -301,20 +300,15 @@ void ScTabViewShell::ExecuteTable( SfxRequest& rReq ) InsertTable( *pDlg->GetFirstTable(), nTabNr ); } else - InsertTables( NULL, nTabNr,nCount ); + { + std::vector<rtl::OUString> aNames(0); + InsertTables( aNames, nTabNr,nCount ); + } } else { SCTAB nTabAfter = nTabNr+1; - SCTAB nSelHigh=0; - - for(SCTAB i=0;i<nTabCount;i++) - { - if(rMark.GetTableSelect(i)) - { - nSelHigh=i; - } - } + SCTAB nSelHigh = rMark.GetLastSelected(); for(SCTAB j=nSelHigh+1;j<nTabCount;j++) { @@ -337,7 +331,8 @@ void ScTabViewShell::ExecuteTable( SfxRequest& rReq ) } else { - InsertTables( NULL, nTabAfter,nCount); + std::vector<rtl::OUString> aNames(0); + InsertTables( aNames, nTabAfter,nCount); } } } diff --git a/sc/source/ui/view/viewdata.cxx b/sc/source/ui/view/viewdata.cxx index c82bd6e8ccc2..019cf107735e 100644 --- a/sc/source/ui/view/viewdata.cxx +++ b/sc/source/ui/view/viewdata.cxx @@ -296,7 +296,8 @@ void ScViewDataTable::ReadUserDataSequence(const uno::Sequence <beans::PropertyV } ScViewData::ScViewData( ScDocShell* pDocSh, ScTabViewShell* pViewSh ) - : pDocShell ( pDocSh ), + : pTabData(), + pDocShell ( pDocSh ), pDoc ( NULL ), pView ( pViewSh ), pViewShell ( pViewSh ), @@ -331,9 +332,7 @@ ScViewData::ScViewData( ScDocShell* pDocSh, ScTabViewShell* pViewSh ) aScrSize = Size( (long) ( STD_COL_WIDTH * PIXEL_PER_TWIPS * OLE_STD_CELLS_X ), (long) ( ScGlobal::nStdRowHeight * PIXEL_PER_TWIPS * OLE_STD_CELLS_Y ) ); - pTabData[0] = new ScViewDataTable; - for ( SCTAB i = 1; i <= MAXTAB; i++ ) - pTabData[i] = NULL; + pTabData.push_back( new ScViewDataTable() ); pThisTab = pTabData[nTabNo]; for (sal_uInt16 j=0; j<4; j++) { @@ -355,9 +354,11 @@ ScViewData::ScViewData( ScDocShell* pDocSh, ScTabViewShell* pViewSh ) if (pDoc && !pDoc->IsVisible(nTabNo)) { while ( !pDoc->IsVisible(nTabNo) && pDoc->HasTable(nTabNo+1) ) + { ++nTabNo; - - pTabData[nTabNo] = new ScViewDataTable; + pTabData.push_back(NULL); + } + pTabData[nTabNo] = new ScViewDataTable() ; pThisTab = pTabData[nTabNo]; } @@ -365,7 +366,8 @@ ScViewData::ScViewData( ScDocShell* pDocSh, ScTabViewShell* pViewSh ) } ScViewData::ScViewData( const ScViewData& rViewData ) - : pDocShell ( rViewData.pDocShell ), + : pTabData( rViewData.pTabData ), + pDocShell ( rViewData.pDocShell ), pDoc ( rViewData.pDoc ), pView ( rViewData.pView ), pViewShell ( rViewData.pViewShell ), @@ -398,11 +400,7 @@ ScViewData::ScViewData( const ScViewData& rViewData ) SetOutlineMode ( rViewData.IsOutlineMode() ); aScrSize = rViewData.aScrSize; - for ( SCTAB i = 0; i <= MAXTAB; i++ ) - if (rViewData.pTabData[i]) - pTabData[i] = new ScViewDataTable( *rViewData.pTabData[i] ); - else - pTabData[i] = NULL; + pThisTab = pTabData[nTabNo]; for (sal_uInt16 j=0; j<4; j++) { @@ -436,10 +434,6 @@ ScDocument* ScViewData::GetDocument() const ScViewData::~ScViewData() { - for (SCTAB i=0; i<=MAXTAB; i++) - if (pTabData[i]) - delete pTabData[i]; - KillEditView(); delete pOptions; } @@ -454,7 +448,9 @@ void ScViewData::UpdateThis() if (nTabNo>0) --nTabNo; else - pThisTab = pTabData[0] = new ScViewDataTable; + { + pThisTab = pTabData[0] = new ScViewDataTable(); + } // hier keine Assertion, weil sonst Paints kommen, bevor alles initialisiert ist! } @@ -464,29 +460,52 @@ void ScViewData::UpdateThis() void ScViewData::InsertTab( SCTAB nTab ) { - delete pTabData[MAXTAB]; - - for (SCTAB i=MAXTAB; i>nTab; i--) - pTabData[i] = pTabData[i-1]; - - pTabData[nTab] = NULL; // force creating new + if( nTab >= static_cast<SCTAB>(pTabData.size())) + pTabData.resize(nTab+1, NULL); + else + pTabData.insert( pTabData.begin() + nTab, NULL ); CreateTabData( nTab ); UpdateThis(); aMarkData.InsertTab( nTab ); } +void ScViewData::InsertTabs( SCTAB nTab, SCTAB nNewSheets ) +{ + if( nTab+nNewSheets >= static_cast<SCTAB>(pTabData.size())) + pTabData.resize(nTab+nNewSheets, NULL); + else + { + pTabData.insert( pTabData.begin() + nTab, nNewSheets, NULL ); + } + for (SCTAB aTab = nTab; aTab < nTab + nNewSheets; ++aTab) + { + CreateTabData( aTab ); + aMarkData.InsertTab( aTab ); + } + UpdateThis(); +} + void ScViewData::DeleteTab( SCTAB nTab ) { delete pTabData[nTab]; - for (SCTAB i=nTab; i<MAXTAB; i++) - pTabData[i] = pTabData[i+1]; + pTabData.erase(pTabData.begin() + nTab); + UpdateThis(); + aMarkData.DeleteTab( nTab ); +} - pTabData[MAXTAB] = NULL; +void ScViewData::DeleteTabs( SCTAB nTab, SCTAB nSheets ) +{ + for (SCTAB aTab = 0; aTab < nSheets; ++aTab) + { + aMarkData.DeleteTab( nTab + aTab ); + delete pTabData[nTab + aTab]; + } + pTabData.erase(pTabData.begin() + nTab, pTabData.begin()+ nTab+nSheets); UpdateThis(); - aMarkData.DeleteTab( nTab ); + } void ScViewData::CopyTab( SCTAB nSrcTab, SCTAB nDestTab ) @@ -500,15 +519,15 @@ void ScViewData::CopyTab( SCTAB nSrcTab, SCTAB nDestTab ) return; } - delete pTabData[MAXTAB]; - - for (SCTAB i=MAXTAB; i>nDestTab; i--) - pTabData[i] = pTabData[i-1]; + if (nSrcTab >= static_cast<SCTAB>(pTabData.size())) + OSL_FAIL("pTabData out of bounds, FIX IT"); + while( nDestTab >= static_cast<SCTAB>(pTabData.size())) + pTabData.push_back(NULL); if ( pTabData[nSrcTab] ) - pTabData[nDestTab] = new ScViewDataTable( *pTabData[nSrcTab] ); + pTabData.insert(pTabData.begin() + nDestTab, new ScViewDataTable( *pTabData[nSrcTab] )); else - pTabData[nDestTab] = NULL; + pTabData.insert(pTabData.begin() + nDestTab, NULL); UpdateThis(); aMarkData.InsertTab( nDestTab ); @@ -518,26 +537,27 @@ void ScViewData::MoveTab( SCTAB nSrcTab, SCTAB nDestTab ) { if (nDestTab==SC_TAB_APPEND) nDestTab = pDoc->GetTableCount() - 1; - - SCTAB i; - ScViewDataTable* pTab = pTabData[nSrcTab]; - - SCTAB nInsTab = nDestTab; - if ( nSrcTab < nDestTab ) + ScViewDataTable* pTab; + if (nSrcTab < static_cast<SCTAB>(pTabData.size())) { - --nInsTab; - for (i=nSrcTab; i<nDestTab; i++) - pTabData[i] = pTabData[i+1]; + pTab = pTabData[nSrcTab]; + pTabData.erase( pTabData.begin() + nSrcTab ); } else - for (i=nSrcTab; i>nDestTab; i--) - pTabData[i] = pTabData[i-1]; + pTab = NULL; - pTabData[nDestTab] = pTab; + if (nDestTab < static_cast<SCTAB>(pTabData.size())) + pTabData.insert( pTabData.begin() + nDestTab, pTab ); + else + { + while (nDestTab > static_cast<SCTAB>(pTabData.size())) + pTabData.push_back(NULL); + pTabData.push_back(pTab); + } UpdateThis(); aMarkData.DeleteTab( nSrcTab ); - aMarkData.InsertTab( nInsTab ); // ggf. angepasst + aMarkData.InsertTab( nDestTab ); // ggf. angepasst } void ScViewData::CreateTabData( std::vector< SCTAB >& rvTabs ) @@ -557,7 +577,7 @@ void ScViewData::SetZoomType( SvxZoomType eNew, std::vector< SCTAB >& tabs ) if ( bAll ) { - for ( SCTAB i = 0; i <= MAXTAB; ++i ) + for ( SCTAB i = 0; i < static_cast<SCTAB>(pTabData.size()); ++i ) { if ( pTabData[i] ) pTabData[i]->eZoomType = eNew; @@ -571,7 +591,7 @@ void ScViewData::SetZoomType( SvxZoomType eNew, std::vector< SCTAB >& tabs ) for ( ; it != it_end; ++it ) { SCTAB i = *it; - if ( pTabData[i] ) + if ( *it < static_cast<SCTAB>(pTabData.size()) && pTabData[i] ) pTabData[i]->eZoomType = eNew; } } @@ -614,7 +634,7 @@ void ScViewData::SetZoom( const Fraction& rNewX, const Fraction& rNewY, std::vec if ( bAll ) { - for ( SCTAB i = 0; i <= MAXTAB; ++i ) + for ( SCTAB i = 0; i < static_cast<SCTAB>(pTabData.size()); ++i ) { if ( pTabData[i] ) { @@ -648,7 +668,7 @@ void ScViewData::SetZoom( const Fraction& rNewX, const Fraction& rNewY, std::vec for ( ; it != it_end; ++it ) { SCTAB i = *it; - if ( pTabData[i] ) + if ( i < static_cast<SCTAB>(pTabData.size()) && pTabData[i] ) { if ( bPagebreak ) { @@ -1409,6 +1429,8 @@ void ScViewData::GetEditView( ScSplitPos eWhich, EditView*& rViewPtr, SCCOL& rCo void ScViewData::CreateTabData( SCTAB nNewTab ) { + while(nNewTab >= static_cast<SCTAB>(pTabData.size())) + pTabData.push_back(NULL); if (!pTabData[nNewTab]) { pTabData[nNewTab] = new ScViewDataTable; @@ -1423,7 +1445,7 @@ void ScViewData::CreateTabData( SCTAB nNewTab ) void ScViewData::CreateSelectedTabData() { - SCTAB nTabCount = pDoc->GetTableCount(); + SCTAB nTabCount = aMarkData.GetLastSelected(); for (SCTAB i=0; i<nTabCount; i++) if ( aMarkData.GetTableSelect(i) && !pTabData[i] ) CreateTabData( i ); @@ -2181,7 +2203,7 @@ void ScViewData::WriteUserData(String& rData) for (SCTAB i=0; i<nTabCount; i++) { rData += ';'; // Numerierung darf auf keinen Fall durcheinanderkommen - if (pTabData[i]) + if (i < static_cast<SCTAB>(pTabData.size()) && pTabData[i]) { sal_Unicode cTabSep = SC_OLD_TABSEP; // wie 3.1 if ( pTabData[i]->nCurY > MAXROW_30 || @@ -2280,6 +2302,10 @@ void ScViewData::ReadUserData(const String& rData) while ( nCount > nPos+nTabStart ) { aTabOpt = rData.GetToken(static_cast<xub_StrLen>(nPos+nTabStart)); + while(nPos >= static_cast<SCTAB>(pTabData.size())) + { + pTabData.push_back(NULL); + } if (!pTabData[nPos]) pTabData[nPos] = new ScViewDataTable; @@ -2356,7 +2382,7 @@ void ScViewData::WriteExtOptions( ScExtDocOptions& rDocOpt ) const rDocSett.mfTabBarWidth = pView->GetRelTabBarWidth(); // sheet settings - for( SCTAB nTab = 0, nTabCount = pDoc->GetTableCount(); nTab < nTabCount; ++nTab ) + for( SCTAB nTab = 0; nTab < static_cast<SCTAB>(pTabData.size()); ++nTab ) { if( const ScViewDataTable* pViewTab = pTabData[ nTab ] ) { @@ -2458,7 +2484,7 @@ void ScViewData::ReadExtOptions( const ScExtDocOptions& rDocOpt ) pView->SetPendingRelTabBarWidth( rDocSett.mfTabBarWidth ); // sheet settings - for( SCTAB nTab = 0, nTabCount = pDoc->GetTableCount(); nTab < nTabCount; ++nTab ) + for( SCTAB nTab = 0; nTab < static_cast<SCTAB>(pTabData.size()); ++nTab ) { if( const ScExtTabSettings* pTabSett = rDocOpt.GetTabSettings( nTab ) ) { @@ -2605,7 +2631,6 @@ void ScViewData::WriteUserDataSequence(uno::Sequence <beans::PropertyValue>& rSe SvXMLUnitConverter::convertNumber(sBuffer, static_cast<sal_Int32>(nViewID)); pSettings[SC_VIEW_ID].Value <<= sBuffer.makeStringAndClear(); - SCTAB nTabCount (pDoc->GetTableCount()); uno::Reference<lang::XMultiServiceFactory> xServiceFactory = comphelper::getProcessServiceFactory(); OSL_ENSURE( xServiceFactory.is(), "got no service manager" ); @@ -2615,7 +2640,7 @@ void ScViewData::WriteUserDataSequence(uno::Sequence <beans::PropertyValue>& rSe uno::Reference<container::XNameContainer> xNameContainer = uno::Reference<container::XNameContainer>(xServiceFactory->createInstance(sName), uno::UNO_QUERY); if (xNameContainer.is()) { - for (SCTAB nTab=0; nTab<nTabCount; nTab++) + for (SCTAB nTab=0; nTab<static_cast<SCTAB>(pTabData.size()); nTab++) { if (pTabData[nTab]) { @@ -2855,7 +2880,7 @@ void ScViewData::ReadUserDataSequence(const uno::Sequence <beans::PropertyValue> } // copy default zoom to sheets where a different one wasn't specified - for (SCTAB nZoomTab=0; nZoomTab<=MAXTAB; ++nZoomTab) + for (SCTAB nZoomTab=0; nZoomTab< static_cast<SCTAB>(pTabData.size()); ++nZoomTab) if (pTabData[nZoomTab] && ( nZoomTab >= static_cast<SCTAB>(aHasZoomVect.size()) || !aHasZoomVect[nZoomTab] )) { pTabData[nZoomTab]->eZoomType = eDefZoomType; diff --git a/sc/source/ui/view/viewfun2.cxx b/sc/source/ui/view/viewfun2.cxx index d2dfad0ab766..acbc952e74d4 100644 --- a/sc/source/ui/view/viewfun2.cxx +++ b/sc/source/ui/view/viewfun2.cxx @@ -1973,70 +1973,46 @@ sal_Bool ScViewFunc::InsertTable( const String& rName, SCTAB nTab, sal_Bool bRec //---------------------------------------------------------------------------- // Insert tables -sal_Bool ScViewFunc::InsertTables(SvStrings *pNames, SCTAB nTab, +sal_Bool ScViewFunc::InsertTables(std::vector<rtl::OUString>& aNames, SCTAB nTab, SCTAB nCount, sal_Bool bRecord ) { - ScDocShell* pDocSh = GetViewData()->GetDocShell(); - ScDocument* pDoc = pDocSh->GetDocument(); + ScDocShell* pDocSh = GetViewData()->GetDocShell(); + ScDocument* pDoc = pDocSh->GetDocument(); if (bRecord && !pDoc->IsUndoEnabled()) bRecord = false; - SvStrings *pNameList= NULL; - WaitObject aWait( GetFrameWin() ); if (bRecord) { - pNameList= new SvStrings; - pDoc->BeginDrawUndo(); // InsertTab creates a SdrUndoNewPage + pDoc->BeginDrawUndo(); // InsertTab creates a SdrUndoNewPage } - sal_Bool bFlag=false; + bool bFlag=false; - String aValTabName; - String *pStr; - - for(SCTAB i=0;i<nCount;i++) + if(aNames.empty()) { - if(pNames!=NULL) - { - pStr=pNames->GetObject(static_cast<sal_uInt16>(i)); - } - else - { - aValTabName.Erase(); - pDoc->CreateValidTabName( aValTabName); - pStr=&aValTabName; - } - - if(pDoc->InsertTab( nTab+i,*pStr)) - { - bFlag=sal_True; - pDocSh->Broadcast( ScTablesHint( SC_TAB_INSERTED, nTab+i ) ); - } - else - { - break; - } - - if(pNameList!=NULL) - pNameList->Insert(new String(*pStr),pNameList->Count()); - + pDoc->CreateValidTabNames(aNames, nCount); + } + if (pDoc->InsertTabs(nTab, aNames, false)) + { + pDocSh->Broadcast( ScTablesHint( SC_TABS_INSERTED, nTab, nCount ) ); + bFlag = true; } if (bFlag) { if (bRecord) pDocSh->GetUndoManager()->AddUndoAction( - new ScUndoInsertTables( pDocSh, nTab, false, pNameList)); + new ScUndoInsertTables( pDocSh, nTab, false, aNames)); - // Update views + // Update views - SetTabNo( nTab, sal_True ); + SetTabNo( nTab, true ); pDocSh->PostPaintExtras(); pDocSh->SetDocumentModified(); SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) ); - return sal_True; + return true; } else { @@ -2097,11 +2073,54 @@ sal_Bool ScViewFunc::DeleteTable( SCTAB nTab, sal_Bool bRecord ) return bSuccess; } +//only use this method for undo for now, all sheets must be connected +//this method doesn't support undo for now, merge it when it with the other method later +bool ScViewFunc::DeleteTables( const SCTAB nTab, SCTAB nSheets ) +{ + ScDocShell* pDocSh = GetViewData()->GetDocShell(); + ScDocument* pDoc = pDocSh->GetDocument(); + bool bVbaEnabled = pDoc->IsInVBAMode(); + SCTAB nNewTab = nTab; + WaitObject aWait( GetFrameWin() ); + + while ( nNewTab > 0 && !pDoc->IsVisible( nNewTab ) ) + --nNewTab; + + if (pDoc->DeleteTabs(nTab, nSheets, NULL)) + { + if( bVbaEnabled ) + { + for (SCTAB aTab = 0; aTab < nSheets; ++aTab) + { + String sCodeName; + bool bHasCodeName = pDoc->GetCodeName( nTab + aTab, sCodeName ); + if ( bHasCodeName ) + VBA_DeleteModule( *pDocSh, sCodeName ); + } + } + + pDocSh->Broadcast( ScTablesHint( SC_TABS_DELETED, nTab, nSheets ) ); + if ( nNewTab >= pDoc->GetTableCount() ) + nNewTab = pDoc->GetTableCount() - 1; + SetTabNo( nNewTab, sal_True ); + + pDocSh->PostPaintExtras(); + pDocSh->SetDocumentModified(); + + SfxApplication* pSfxApp = SFX_APP(); // Navigator + pSfxApp->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) ); + pSfxApp->Broadcast( SfxSimpleHint( SC_HINT_DBAREAS_CHANGED ) ); + pSfxApp->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) ); + return true; + } + return false; +} + sal_Bool ScViewFunc::DeleteTables(const vector<SCTAB> &TheTabs, sal_Bool bRecord ) { ScDocShell* pDocSh = GetViewData()->GetDocShell(); ScDocument* pDoc = pDocSh->GetDocument(); - sal_Bool bVbaEnabled = pDoc ? pDoc->IsInVBAMode() : false; + sal_Bool bVbaEnabled = pDoc->IsInVBAMode(); SCTAB nNewTab = TheTabs[0]; WaitObject aWait( GetFrameWin() ); if (bRecord && !pDoc->IsUndoEnabled()) diff --git a/sc/source/ui/view/viewfun3.cxx b/sc/source/ui/view/viewfun3.cxx index 1c13f3f629bb..c8d9123e667a 100644 --- a/sc/source/ui/view/viewfun3.cxx +++ b/sc/source/ui/view/viewfun3.cxx @@ -1268,7 +1268,7 @@ sal_Bool ScViewFunc::PasteFromClip( sal_uInt16 nFlags, ScDocument* pClipDoc, // #i68690# ExtendMerge for the clip doc must be called with the clipboard's sheet numbers. // The same end column/row can be used for all calls because the clip doc doesn't contain // content outside the clip area. - for (SCTAB nClipTab=0; nClipTab<=MAXTAB; nClipTab++) + for (SCTAB nClipTab=0; nClipTab < pClipDoc->GetTableCount(); nClipTab++) if ( pClipDoc->HasTable(nClipTab) ) if ( pClipDoc->ExtendMerge( nClipStartX,nClipStartY, nUndoEndCol,nUndoEndRow, nClipTab, false ) ) bClipOver = sal_True; @@ -1604,7 +1604,7 @@ bool ScViewFunc::PasteMultiRangesFromClip( // Determine the first and last selected sheet numbers. SCTAB nTab1 = aMark.GetFirstSelected(); SCTAB nTab2 = nTab1; - for (SCTAB i = nTab1+1; i <= MAXTAB; ++i) + for (SCTAB i = nTab1+1; i < aMark.GetLastSelected(); ++i) if (aMark.GetTableSelect(i)) nTab2 = i; |