summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sc/0001-add-unit-test-for-ScDocument-MoveTab.patch90
-rw-r--r--sc/inc/address.hxx2
-rw-r--r--sc/inc/appoptio.hxx6
-rw-r--r--sc/inc/cell.hxx4
-rw-r--r--sc/inc/column.hxx6
-rw-r--r--sc/inc/compiler.hxx4
-rw-r--r--sc/inc/document.hxx15
-rw-r--r--sc/inc/markdata.hxx9
-rw-r--r--sc/inc/rangenam.hxx4
-rw-r--r--sc/inc/sheetdata.hxx16
-rw-r--r--sc/inc/table.hxx6
-rw-r--r--sc/source/core/data/cell2.cxx22
-rw-r--r--sc/source/core/data/column.cxx22
-rw-r--r--sc/source/core/data/dociter.cxx55
-rw-r--r--sc/source/core/data/documen2.cxx138
-rw-r--r--sc/source/core/data/documen3.cxx166
-rw-r--r--sc/source/core/data/documen4.cxx87
-rw-r--r--sc/source/core/data/documen5.cxx16
-rw-r--r--sc/source/core/data/documen7.cxx8
-rw-r--r--sc/source/core/data/documen8.cxx16
-rw-r--r--sc/source/core/data/documen9.cxx31
-rw-r--r--sc/source/core/data/document.cxx1122
-rw-r--r--sc/source/core/data/markdata.cxx95
-rw-r--r--sc/source/core/data/table1.cxx19
-rw-r--r--sc/source/core/tool/compiler.cxx30
-rw-r--r--sc/source/core/tool/rangenam.cxx8
-rw-r--r--sc/source/filter/inc/scflt.hxx6
-rw-r--r--sc/source/filter/xml/XMLTableSourceContext.cxx4
-rw-r--r--sc/source/filter/xml/sheetdata.cxx24
-rw-r--r--sc/source/filter/xml/xmlcoli.cxx8
-rw-r--r--sc/source/filter/xml/xmlimprt.cxx2
-rw-r--r--sc/source/filter/xml/xmlimprt.hxx4
-rw-r--r--sc/source/filter/xml/xmlrowi.cxx8
-rw-r--r--sc/source/filter/xml/xmlsceni.cxx2
-rw-r--r--sc/source/filter/xml/xmlstyli.cxx4
-rw-r--r--sc/source/filter/xml/xmlstyli.hxx6
-rw-r--r--sc/source/filter/xml/xmlsubti.cxx20
-rw-r--r--sc/source/filter/xml/xmlsubti.hxx6
-rw-r--r--sc/source/filter/xml/xmltabi.cxx8
-rw-r--r--sc/source/ui/app/scmod.cxx11
-rw-r--r--sc/source/ui/app/transobj.cxx6
-rw-r--r--sc/source/ui/docshell/docsh.cxx13
-rw-r--r--sc/source/ui/docshell/docsh5.cxx9
-rw-r--r--sc/source/ui/inc/pfuncache.hxx4
-rw-r--r--sc/source/ui/inc/preview.hxx6
-rw-r--r--sc/source/ui/inc/uiitems.hxx2
-rw-r--r--sc/source/ui/inc/undotab.hxx4
-rw-r--r--sc/source/ui/inc/viewdata.hxx4
-rw-r--r--sc/source/ui/inc/viewfunc.hxx3
-rw-r--r--sc/source/ui/undo/undotab.cxx44
-rw-r--r--sc/source/ui/vba/vbaquerytable.cxx6
-rw-r--r--sc/source/ui/view/cellsh3.cxx2
-rw-r--r--sc/source/ui/view/gridwin.cxx9
-rw-r--r--sc/source/ui/view/pfuncache.cxx17
-rw-r--r--sc/source/ui/view/preview.cxx22
-rw-r--r--sc/source/ui/view/tabvwsh5.cxx14
-rw-r--r--sc/source/ui/view/tabvwshf.cxx29
-rw-r--r--sc/source/ui/view/viewdata.cxx139
-rw-r--r--sc/source/ui/view/viewfun2.cxx101
-rw-r--r--sc/source/ui/view/viewfun3.cxx4
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;