sc/inc/document.hxx | 1 sc/source/core/data/documen2.cxx | 93 - sc/source/core/data/documen3.cxx | 312 ++---- sc/source/core/data/documen4.cxx | 63 - sc/source/core/data/documen5.cxx | 8 sc/source/core/data/documen6.cxx | 2 sc/source/core/data/documen7.cxx | 24 sc/source/core/data/documen8.cxx | 4 sc/source/core/data/documen9.cxx | 16 sc/source/core/data/document.cxx | 1793 ++++++++++++++++-------------------- sc/source/core/data/document10.cxx | 2 sc/source/core/data/formulacell.cxx | 2 12 files changed, 1056 insertions(+), 1264 deletions(-)
New commits: commit 3cc198a0706b25c42cc8dae7e25635cbd911ac02 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Sun Jul 9 00:41:12 2023 +0900 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Thu Jul 13 07:25:42 2023 +0200 sc: remove duplicated table validity checks and other duplications Remove the duplicated table validity checks and replace them with FetchTable(..) call, which returns nullptr if the table is not valid and available, or the table itself. This simpifies the code all around. When only the check if the table is available is needed, use HasTable(..) in those cases. The call TableExists(..) is identical to HasTable(..) and has been removed. Finally use GetTableCount(), which return a SCTAB type for the number of tables is used instead of static_cast<SCTAB>(maTabs.size()) that was used all over the code. Change-Id: Ibfd9777b1350ba8e0cbe577783db81589f95591c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/154225 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index 27499ca9f105..157a49099184 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -2620,7 +2620,6 @@ public: void ConvertFormulaToValue( const ScRange& rRange, sc::TableValues* pUndo ); void SwapNonEmpty( sc::TableValues& rValues ); void finalizeOutlineImport(); - bool TableExists( SCTAB nTab ) const; // Returns the given column range, first allocating all the columns if necessary. SC_DLLPUBLIC ScColumnsRange GetWritableColumnsRange(SCTAB nTab, SCCOL nColBegin, SCCOL nColEnd); diff --git a/sc/source/core/data/documen2.cxx b/sc/source/core/data/documen2.cxx index e5d5df5a94cb..42f971c82cfb 100644 --- a/sc/source/core/data/documen2.cxx +++ b/sc/source/core/data/documen2.cxx @@ -528,19 +528,19 @@ void ScDocument::ResetClip( ScDocument* pSourceDoc, const ScMarkData* pMarks ) { InitClipPtrs(pSourceDoc); - for (SCTAB i = 0; i < static_cast<SCTAB>(pSourceDoc->maTabs.size()); i++) + for (SCTAB i = 0; i < pSourceDoc->GetTableCount(); i++) if (pSourceDoc->maTabs[i]) if (!pMarks || pMarks->GetTableSelect(i)) { OUString aString = pSourceDoc->maTabs[i]->GetName(); - if ( i < static_cast<SCTAB>(maTabs.size()) ) + if (i < GetTableCount()) { maTabs[i].reset( new ScTable(*this, i, aString) ); } else { - if( i > static_cast<SCTAB>(maTabs.size()) ) + if (i > GetTableCount()) { maTabs.resize(i); } @@ -560,12 +560,12 @@ void ScDocument::ResetClip( ScDocument* pSourceDoc, SCTAB nTab ) if (bIsClip) { InitClipPtrs(pSourceDoc); - if (nTab >= static_cast<SCTAB>(maTabs.size())) + if (nTab >= GetTableCount()) { maTabs.resize(nTab+1); } maTabs[nTab].reset( new ScTable(*this, nTab, "baeh") ); - if (nTab < static_cast<SCTAB>(pSourceDoc->maTabs.size()) && pSourceDoc->maTabs[nTab]) + if (nTab < pSourceDoc->GetTableCount() && pSourceDoc->maTabs[nTab]) maTabs[nTab]->SetLayoutRTL( pSourceDoc->maTabs[nTab]->IsLayoutRTL() ); } else @@ -577,7 +577,7 @@ void ScDocument::ResetClip( ScDocument* pSourceDoc, SCTAB nTab ) void ScDocument::EnsureTable( SCTAB nTab ) { bool bExtras = !bIsUndo; // Column-Widths, Row-Heights, Flags - if (o3tl::make_unsigned(nTab) >= maTabs.size()) + if (nTab >= GetTableCount()) maTabs.resize(nTab+1); if (!maTabs[nTab]) @@ -586,18 +586,16 @@ void ScDocument::EnsureTable( SCTAB nTab ) ScRefCellValue ScDocument::GetRefCellValue( const ScAddress& rPos ) { - if (!TableExists(rPos.Tab())) - return ScRefCellValue(); // empty - - return maTabs[rPos.Tab()]->GetRefCellValue(rPos.Col(), rPos.Row()); + if (ScTable* pTable = FetchTable(rPos.Tab())) + return pTable->GetRefCellValue(rPos.Col(), rPos.Row()); + return ScRefCellValue(); // empty } ScRefCellValue ScDocument::GetRefCellValue( const ScAddress& rPos, sc::ColumnBlockPosition& rBlockPos ) { - if (!TableExists(rPos.Tab())) - return ScRefCellValue(); // empty - - return maTabs[rPos.Tab()]->GetRefCellValue(rPos.Col(), rPos.Row(), rBlockPos); + if (ScTable* pTable = FetchTable(rPos.Tab())) + return pTable->GetRefCellValue(rPos.Col(), rPos.Row(), rBlockPos); + return ScRefCellValue(); // empty } svl::SharedStringPool& ScDocument::GetSharedStringPool() @@ -613,9 +611,9 @@ const svl::SharedStringPool& ScDocument::GetSharedStringPool() const bool ScDocument::GetPrintArea( SCTAB nTab, SCCOL& rEndCol, SCROW& rEndRow, bool bNotes) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) + if (const ScTable* pTable = FetchTable(nTab)) { - bool bAny = maTabs[nTab]->GetPrintArea( rEndCol, rEndRow, bNotes, /*bCalcHiddens*/false); + bool bAny = pTable->GetPrintArea( rEndCol, rEndRow, bNotes, /*bCalcHiddens*/false); if (mpDrawLayer) { ScRange aDrawRange(0,0,nTab, MaxCol(),MaxRow(),nTab); @@ -637,9 +635,9 @@ bool ScDocument::GetPrintArea( SCTAB nTab, SCCOL& rEndCol, SCROW& rEndRow, bool ScDocument::GetPrintAreaHor( SCTAB nTab, SCROW nStartRow, SCROW nEndRow, SCCOL& rEndCol ) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) + if (const ScTable* pTable = FetchTable(nTab)) { - bool bAny = maTabs[nTab]->GetPrintAreaHor( nStartRow, nEndRow, rEndCol ); + bool bAny = pTable->GetPrintAreaHor( nStartRow, nEndRow, rEndCol ); if (mpDrawLayer) { ScRange aDrawRange(0,nStartRow,nTab, MaxCol(),nEndRow,nTab); @@ -659,9 +657,9 @@ bool ScDocument::GetPrintAreaHor( SCTAB nTab, SCROW nStartRow, SCROW nEndRow, bool ScDocument::GetPrintAreaVer( SCTAB nTab, SCCOL nStartCol, SCCOL nEndCol, SCROW& rEndRow, bool bNotes ) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) + if (const ScTable* pTable = FetchTable(nTab)) { - bool bAny = maTabs[nTab]->GetPrintAreaVer( nStartCol, nEndCol, rEndRow, bNotes ); + bool bAny = pTable->GetPrintAreaVer( nStartCol, nEndCol, rEndRow, bNotes ); if (mpDrawLayer) { ScRange aDrawRange(nStartCol,0,nTab, nEndCol,MaxRow(),nTab); @@ -680,9 +678,9 @@ bool ScDocument::GetPrintAreaVer( SCTAB nTab, SCCOL nStartCol, SCCOL nEndCol, bool ScDocument::GetDataStart( SCTAB nTab, SCCOL& rStartCol, SCROW& rStartRow ) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) + if (const ScTable* pTable = FetchTable(nTab)) { - bool bAny = maTabs[nTab]->GetDataStart( rStartCol, rStartRow ); + bool bAny = pTable->GetDataStart( rStartCol, rStartRow ); if (mpDrawLayer) { ScRange aDrawRange(0,0,nTab, MaxCol(),MaxRow(),nTab); @@ -737,7 +735,7 @@ bool ScDocument::MoveTab( SCTAB nOldPos, SCTAB nNewPos, ScProgress* pProgress ) if (nOldPos == nNewPos) return false; - SCTAB nTabCount = static_cast<SCTAB>(maTabs.size()); + SCTAB nTabCount = GetTableCount(); if(nTabCount < 2) return false; @@ -805,8 +803,8 @@ bool ScDocument::MoveTab( SCTAB nOldPos, SCTAB nNewPos, ScProgress* pProgress ) bool ScDocument::CopyTab( SCTAB nOldPos, SCTAB nNewPos, const ScMarkData* pOnlyMarked ) { - if (SC_TAB_APPEND == nNewPos || nNewPos >= static_cast<SCTAB>(maTabs.size())) - nNewPos = static_cast<SCTAB>(maTabs.size()); + if (SC_TAB_APPEND == nNewPos || nNewPos >= GetTableCount()) + nNewPos = GetTableCount(); OUString aName; GetName(nOldPos, aName); @@ -828,14 +826,14 @@ bool ScDocument::CopyTab( SCTAB nOldPos, SCTAB nNewPos, const ScMarkData* pOnlyM if (bValid) { - if (nNewPos >= static_cast<SCTAB>(maTabs.size())) + if (nNewPos >= GetTableCount()) { - nNewPos = static_cast<SCTAB>(maTabs.size()); + nNewPos = GetTableCount(); maTabs.emplace_back(new ScTable(*this, nNewPos, aName)); } else { - if (ValidTab(nNewPos) && (nNewPos < static_cast<SCTAB>(maTabs.size()))) + if (ValidTab(nNewPos) && nNewPos < GetTableCount()) { SetNoListening( true ); @@ -979,9 +977,9 @@ sal_uLong ScDocument::TransferTab( ScDocument& rSrcDoc, SCTAB nSrcPos, } else // replace existing tables { - if (ValidTab(nDestPos) && nDestPos < static_cast<SCTAB>(maTabs.size()) && maTabs[nDestPos]) + if (ScTable* pTable = FetchTable(nDestPos)) { - maTabs[nDestPos]->DeleteArea( 0,0, MaxCol(),MaxRow(), InsertDeleteFlags::ALL ); + pTable->DeleteArea(0, 0, MaxCol(), MaxRow(), InsertDeleteFlags::ALL); } else bValid = false; @@ -1130,38 +1128,31 @@ sal_uLong ScDocument::TransferTab( ScDocument& rSrcDoc, SCTAB nSrcPos, void ScDocument::SetError( SCCOL nCol, SCROW nRow, SCTAB nTab, const FormulaError nError) { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size())) - if (maTabs[nTab]) - maTabs[nTab]->SetError( nCol, nRow, nError ); + if (ScTable* pTable = FetchTable(nTab)) + pTable->SetError(nCol, nRow, nError); } void ScDocument::SetFormula( const ScAddress& rPos, const ScTokenArray& rArray ) { - if (!TableExists(rPos.Tab())) - return; - - maTabs[rPos.Tab()]->SetFormula(rPos.Col(), rPos.Row(), rArray, formula::FormulaGrammar::GRAM_DEFAULT); + if (ScTable* pTable = FetchTable(rPos.Tab())) + pTable->SetFormula(rPos.Col(), rPos.Row(), rArray, formula::FormulaGrammar::GRAM_DEFAULT); } void ScDocument::SetFormula( const ScAddress& rPos, const OUString& rFormula, formula::FormulaGrammar::Grammar eGram ) { - if (!TableExists(rPos.Tab())) - return; - - maTabs[rPos.Tab()]->SetFormula(rPos.Col(), rPos.Row(), rFormula, eGram); + if (ScTable* pTable = FetchTable(rPos.Tab())) + pTable->SetFormula(rPos.Col(), rPos.Row(), rFormula, eGram); } ScFormulaCell* ScDocument::SetFormulaCell( const ScAddress& rPos, ScFormulaCell* pCell ) { - if (!TableExists(rPos.Tab())) - { - delete pCell; - return nullptr; - } + if (ScTable* pTable = FetchTable(rPos.Tab())) + return pTable->SetFormulaCell(rPos.Col(), rPos.Row(), pCell); - return maTabs[rPos.Tab()]->SetFormulaCell(rPos.Col(), rPos.Row(), pCell); + delete pCell; + return nullptr; } bool ScDocument::SetFormulaCells( const ScAddress& rPos, std::vector<ScFormulaCell*>& rCells ) @@ -1169,11 +1160,9 @@ bool ScDocument::SetFormulaCells( const ScAddress& rPos, std::vector<ScFormulaCe if (rCells.empty()) return false; - ScTable* pTab = FetchTable(rPos.Tab()); - if (!pTab) - return false; - - return pTab->SetFormulaCells(rPos.Col(), rPos.Row(), rCells); + if (ScTable* pTable = FetchTable(rPos.Tab())) + return pTable->SetFormulaCells(rPos.Col(), rPos.Row(), rCells); + return false; } void ScDocument::SetConsolidateDlgData( std::unique_ptr<ScConsolidateParam> pData ) diff --git a/sc/source/core/data/documen3.cxx b/sc/source/core/data/documen3.cxx index 8d0d2ba9a665..8fb0e824e06f 100644 --- a/sc/source/core/data/documen3.cxx +++ b/sc/source/core/data/documen3.cxx @@ -107,7 +107,7 @@ void sortAndRemoveDuplicates(std::vector<ScTypedStrData>& rStrings, bool bCaseSe void ScDocument::GetAllTabRangeNames(ScRangeName::TabNameCopyMap& rNames) const { ScRangeName::TabNameCopyMap aNames; - for (SCTAB i = 0; i < static_cast<SCTAB>(maTabs.size()); ++i) + for (SCTAB i = 0; i < GetTableCount(); ++i) { if (!maTabs[i]) // no more tables to iterate through. @@ -148,7 +148,7 @@ void ScDocument::SetAllRangeNames(const std::map<OUString, ScRangeName>& rRangeM void ScDocument::GetRangeNameMap(std::map<OUString, ScRangeName*>& aRangeNameMap) { - for (SCTAB i = 0; i < static_cast<SCTAB>(maTabs.size()); ++i) + for (SCTAB i = 0; i < GetTableCount(); ++i) { if (!maTabs[i]) continue; @@ -170,10 +170,9 @@ void ScDocument::GetRangeNameMap(std::map<OUString, ScRangeName*>& aRangeNameMap ScRangeName* ScDocument::GetRangeName(SCTAB nTab) const { - if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(maTabs.size()) || !maTabs[nTab]) - return nullptr; - - return maTabs[nTab]->GetRangeName(); + if (const ScTable* pTable = FetchTable(nTab)) + return pTable->GetRangeName(); + return nullptr; } ScRangeName* ScDocument::GetRangeName() const @@ -185,10 +184,8 @@ ScRangeName* ScDocument::GetRangeName() const void ScDocument::SetRangeName(SCTAB nTab, std::unique_ptr<ScRangeName> pNew) { - if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(maTabs.size()) || !maTabs[nTab]) - return; - - return maTabs[nTab]->SetRangeName(std::move(pNew)); + if (ScTable* pTable = FetchTable(nTab)) + pTable->SetRangeName(std::move(pNew)); } void ScDocument::SetRangeName( std::unique_ptr<ScRangeName> pNewRangeName ) @@ -428,70 +425,68 @@ void ScDocument::SetChartListenerCollection( void ScDocument::SetScenario( SCTAB nTab, bool bFlag ) { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - maTabs[nTab]->SetScenario(bFlag); + if (ScTable* pTable = FetchTable(nTab)) + pTable->SetScenario(bFlag); } bool ScDocument::IsScenario( SCTAB nTab ) const { - return ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] &&maTabs[nTab]->IsScenario(); + const ScTable* pTable = FetchTable(nTab); + return pTable && pTable->IsScenario(); } void ScDocument::SetScenarioData( SCTAB nTab, const OUString& rComment, const Color& rColor, ScScenarioFlags nFlags ) { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->IsScenario()) + if (ScTable* pTable = FetchTable(nTab); pTable->IsScenario()) { - maTabs[nTab]->SetScenarioComment( rComment ); - maTabs[nTab]->SetScenarioColor( rColor ); - maTabs[nTab]->SetScenarioFlags( nFlags ); + pTable->SetScenarioComment( rComment ); + pTable->SetScenarioColor( rColor ); + pTable->SetScenarioFlags( nFlags ); } } Color ScDocument::GetTabBgColor( SCTAB nTab ) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - return maTabs[nTab]->GetTabBgColor(); + if (const ScTable* pTable = FetchTable(nTab)) + return pTable->GetTabBgColor(); return COL_AUTO; } void ScDocument::SetTabBgColor( SCTAB nTab, const Color& rColor ) { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - maTabs[nTab]->SetTabBgColor(rColor); + if (ScTable* pTable = FetchTable(nTab)) + pTable->SetTabBgColor(rColor); } bool ScDocument::IsDefaultTabBgColor( SCTAB nTab ) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - return maTabs[nTab]->GetTabBgColor() == COL_AUTO; + if (const ScTable* pTable = FetchTable(nTab)) + return pTable->GetTabBgColor() == COL_AUTO; return true; } void ScDocument::GetScenarioData( SCTAB nTab, OUString& rComment, Color& rColor, ScScenarioFlags& rFlags ) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->IsScenario()) + if (const ScTable* pTable = FetchTable(nTab); pTable->IsScenario()) { - maTabs[nTab]->GetScenarioComment( rComment ); - rColor = maTabs[nTab]->GetScenarioColor(); - rFlags = maTabs[nTab]->GetScenarioFlags(); + pTable->GetScenarioComment( rComment ); + rColor = pTable->GetScenarioColor(); + rFlags = pTable->GetScenarioFlags(); } } void ScDocument::GetScenarioFlags( SCTAB nTab, ScScenarioFlags& rFlags ) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->IsScenario()) - rFlags = maTabs[nTab]->GetScenarioFlags(); + if (const ScTable* pTable = FetchTable(nTab); pTable->IsScenario()) + rFlags = pTable->GetScenarioFlags(); } bool ScDocument::IsLinked( SCTAB nTab ) const { - return ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->IsLinked(); - // equivalent to - //if (ValidTab(nTab) && pTab[nTab]) - // return pTab[nTab]->IsLinked(); - //return false; + const ScTable* pTable = FetchTable(nTab); + return pTable && pTable->IsLinked(); } formula::FormulaGrammar::AddressConvention ScDocument::GetAddressConvention() const @@ -506,43 +501,43 @@ void ScDocument::SetGrammar( formula::FormulaGrammar::Grammar eGram ) ScLinkMode ScDocument::GetLinkMode( SCTAB nTab ) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - return maTabs[nTab]->GetLinkMode(); + if (const ScTable* pTable = FetchTable(nTab)) + return pTable->GetLinkMode(); return ScLinkMode::NONE; } OUString ScDocument::GetLinkDoc( SCTAB nTab ) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - return maTabs[nTab]->GetLinkDoc(); + if (const ScTable* pTable = FetchTable(nTab)) + return pTable->GetLinkDoc(); return OUString(); } OUString ScDocument::GetLinkFlt( SCTAB nTab ) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - return maTabs[nTab]->GetLinkFlt(); + if (const ScTable* pTable = FetchTable(nTab)) + return pTable->GetLinkFlt(); return OUString(); } OUString ScDocument::GetLinkOpt( SCTAB nTab ) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - return maTabs[nTab]->GetLinkOpt(); + if (const ScTable* pTable = FetchTable(nTab)) + return pTable->GetLinkOpt(); return OUString(); } OUString ScDocument::GetLinkTab( SCTAB nTab ) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - return maTabs[nTab]->GetLinkTab(); + if (const ScTable* pTable = FetchTable(nTab)) + return pTable->GetLinkTab(); return OUString(); } sal_uLong ScDocument::GetLinkRefreshDelay( SCTAB nTab ) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - return maTabs[nTab]->GetLinkRefreshDelay(); + if (const ScTable* pTable = FetchTable(nTab)) + return pTable->GetLinkRefreshDelay(); return 0; } @@ -550,14 +545,14 @@ void ScDocument::SetLink( SCTAB nTab, ScLinkMode nMode, const OUString& rDoc, const OUString& rFilter, const OUString& rOptions, const OUString& rTabName, sal_uLong nRefreshDelay ) { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - maTabs[nTab]->SetLink( nMode, rDoc, rFilter, rOptions, rTabName, nRefreshDelay ); + if (ScTable* pTable = FetchTable(nTab)) + pTable->SetLink(nMode, rDoc, rFilter, rOptions, rTabName, nRefreshDelay); } bool ScDocument::HasLink( std::u16string_view rDoc, std::u16string_view rFilter, std::u16string_view rOptions ) const { - SCTAB nCount = static_cast<SCTAB>(maTabs.size()); + SCTAB nCount = GetTableCount(); for (SCTAB i=0; i<nCount; i++) if (maTabs[i]->IsLinked() && maTabs[i]->GetLinkDoc() == rDoc @@ -665,23 +660,23 @@ ScFormulaParserPool& ScDocument::GetFormulaParserPool() const const ScSheetEvents* ScDocument::GetSheetEvents( SCTAB nTab ) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - return maTabs[nTab]->GetSheetEvents(); + if (const ScTable* pTable = FetchTable(nTab)) + pTable->GetSheetEvents(); return nullptr; } void ScDocument::SetSheetEvents( SCTAB nTab, std::unique_ptr<ScSheetEvents> pNew ) { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - maTabs[nTab]->SetSheetEvents( std::move(pNew) ); + if (ScTable* pTable = FetchTable(nTab)) + pTable->SetSheetEvents( std::move(pNew) ); } bool ScDocument::HasSheetEventScript( SCTAB nTab, ScSheetEventId nEvent, bool bWithVbaEvents ) const { - if (nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) + if (const ScTable* pTable = FetchTable(nTab)) { // check if any event handler script has been configured - const ScSheetEvents* pEvents = maTabs[nTab]->GetSheetEvents(); + const ScSheetEvents* pEvents = pTable->GetSheetEvents(); if ( pEvents && pEvents->GetScript( nEvent ) ) return true; // check if VBA event handlers exist @@ -701,7 +696,7 @@ bool ScDocument::HasSheetEventScript( SCTAB nTab, ScSheetEventId nEvent, bool bW bool ScDocument::HasAnySheetEventScript( ScSheetEventId nEvent, bool bWithVbaEvents ) const { - SCTAB nSize = static_cast<SCTAB>(maTabs.size()); + SCTAB nSize = GetTableCount(); for (SCTAB nTab = 0; nTab < nSize; nTab++) if (HasSheetEventScript( nTab, nEvent, bWithVbaEvents )) return true; @@ -710,7 +705,7 @@ bool ScDocument::HasAnySheetEventScript( ScSheetEventId nEvent, bool bWithVbaEve bool ScDocument::HasAnyCalcNotification() const { - SCTAB nSize = static_cast<SCTAB>(maTabs.size()); + SCTAB nSize = GetTableCount(); for (SCTAB nTab = 0; nTab < nSize; nTab++) if (maTabs[nTab] && maTabs[nTab]->GetCalcNotification()) return true; @@ -719,21 +714,21 @@ bool ScDocument::HasAnyCalcNotification() const bool ScDocument::HasCalcNotification( SCTAB nTab ) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - return maTabs[nTab]->GetCalcNotification(); + if (const ScTable* pTable = FetchTable(nTab)) + return pTable->GetCalcNotification(); return false; } void ScDocument::SetCalcNotification( SCTAB nTab ) { // set only if not set before - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && !maTabs[nTab]->GetCalcNotification()) - maTabs[nTab]->SetCalcNotification(true); + if (ScTable* pTable = FetchTable(nTab) ; !pTable->GetCalcNotification()) + pTable->SetCalcNotification(true); } void ScDocument::ResetCalcNotifications() { - SCTAB nSize = static_cast<SCTAB>(maTabs.size()); + SCTAB nSize = GetTableCount(); for (SCTAB nTab = 0; nTab < nSize; nTab++) if (maTabs[nTab] && maTabs[nTab]->GetCalcNotification()) maTabs[nTab]->SetCalcNotification(false); @@ -743,46 +738,48 @@ ScOutlineTable* ScDocument::GetOutlineTable( SCTAB nTab, bool bCreate ) { ScOutlineTable* pVal = nullptr; - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size())) - if (maTabs[nTab]) + if (ScTable* pTable = FetchTable(nTab)) + { + pVal = pTable->GetOutlineTable(); + if (!pVal && bCreate) { - pVal = maTabs[nTab]->GetOutlineTable(); - if (!pVal && bCreate) - { - maTabs[nTab]->StartOutlineTable(); - pVal = maTabs[nTab]->GetOutlineTable(); - } + pTable->StartOutlineTable(); + pVal = pTable->GetOutlineTable(); } + } return pVal; } bool ScDocument::SetOutlineTable( SCTAB nTab, const ScOutlineTable* pNewOutline ) { - return ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->SetOutlineTable(pNewOutline); + ScTable* pTable = FetchTable(nTab); + return pTable && pTable->SetOutlineTable(pNewOutline); } void ScDocument::DoAutoOutline( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, SCTAB nTab ) { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - maTabs[nTab]->DoAutoOutline( nStartCol, nStartRow, nEndCol, nEndRow ); + if (ScTable* pTable = FetchTable(nTab)) + pTable->DoAutoOutline( nStartCol, nStartRow, nEndCol, nEndRow ); } bool ScDocument::TestRemoveSubTotals( SCTAB nTab, const ScSubTotalParam& rParam ) { - return ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->TestRemoveSubTotals( rParam ); + ScTable* pTable = FetchTable(nTab); + return pTable && pTable->TestRemoveSubTotals(rParam); } void ScDocument::RemoveSubTotals( SCTAB nTab, ScSubTotalParam& rParam ) { - if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] ) - maTabs[nTab]->RemoveSubTotals( rParam ); + if (ScTable* pTable = FetchTable(nTab)) + pTable->RemoveSubTotals( rParam ); } bool ScDocument::DoSubTotals( SCTAB nTab, ScSubTotalParam& rParam ) { - return ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->DoSubTotals( rParam ); + ScTable* pTable = FetchTable(nTab); + return pTable && pTable->DoSubTotals(rParam); } bool ScDocument::HasSubTotalCells( const ScRange& rRange ) @@ -805,7 +802,7 @@ bool ScDocument::HasSubTotalCells( const ScRange& rRange ) */ void ScDocument::CopyUpdated( ScDocument* pPosDoc, ScDocument* pDestDoc ) { - SCTAB nCount = static_cast<SCTAB>(maTabs.size()); + SCTAB nCount = GetTableCount(); for (SCTAB nTab=0; nTab<nCount; nTab++) if (maTabs[nTab] && pPosDoc->maTabs[nTab] && pDestDoc->maTabs[nTab]) maTabs[nTab]->CopyUpdated( pPosDoc->maTabs[nTab].get(), pDestDoc->maTabs[nTab].get() ); @@ -813,8 +810,7 @@ void ScDocument::CopyUpdated( ScDocument* pPosDoc, ScDocument* pDestDoc ) void ScDocument::CopyScenario( SCTAB nSrcTab, SCTAB nDestTab, bool bNewScenario ) { - if (!(ValidTab(nSrcTab) && ValidTab(nDestTab) && nSrcTab < static_cast<SCTAB>(maTabs.size()) - && nDestTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nSrcTab] && maTabs[nDestTab])) + if (!HasTable(nSrcTab) || !HasTable(nDestTab)) return; // Set flags correctly for active scenarios @@ -823,7 +819,7 @@ void ScDocument::CopyScenario( SCTAB nSrcTab, SCTAB nDestTab, bool bNewScenario // nDestTab is the target table for ( SCTAB nTab = nDestTab+1; - nTab< static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->IsScenario(); + nTab < GetTableCount() && maTabs[nTab] && maTabs[nTab]->IsScenario(); nTab++ ) { if ( maTabs[nTab]->IsActiveScenario() ) // Even if it's the same scenario @@ -861,41 +857,42 @@ void ScDocument::MarkScenario( SCTAB nSrcTab, SCTAB nDestTab, ScMarkData& rDestM if (bResetMark) rDestMark.ResetMark(); - if (ValidTab(nSrcTab) && nSrcTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nSrcTab]) - maTabs[nSrcTab]->MarkScenarioIn( rDestMark, nNeededBits ); + if (const ScTable* pTable = FetchTable(nSrcTab)) + pTable->MarkScenarioIn(rDestMark, nNeededBits); - rDestMark.SetAreaTab( nDestTab ); + rDestMark.SetAreaTab( nDestTab); } bool ScDocument::HasScenarioRange( SCTAB nTab, const ScRange& rRange ) const { - return ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->HasScenarioRange( rRange ); + const ScTable* pTable = FetchTable(nTab); + return pTable && pTable->HasScenarioRange(rRange); } const ScRangeList* ScDocument::GetScenarioRanges( SCTAB nTab ) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - return maTabs[nTab]->GetScenarioRanges(); + if (const ScTable* pTable = FetchTable(nTab)) + return pTable->GetScenarioRanges(); return nullptr; } bool ScDocument::IsActiveScenario( SCTAB nTab ) const { - return ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && maTabs[nTab]->IsActiveScenario( ); + const ScTable* pTable = FetchTable(nTab); + return pTable && pTable->IsActiveScenario(); } void ScDocument::SetActiveScenario( SCTAB nTab, bool bActive ) { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - maTabs[nTab]->SetActiveScenario( bActive ); + if (ScTable* pTable = FetchTable(nTab)) + pTable->SetActiveScenario( bActive ); } bool ScDocument::TestCopyScenario( SCTAB nSrcTab, SCTAB nDestTab ) const { - if (ValidTab(nSrcTab) && nSrcTab < static_cast<SCTAB>(maTabs.size()) - && nDestTab < static_cast<SCTAB>(maTabs.size())&& ValidTab(nDestTab)) - return maTabs[nSrcTab]->TestCopyScenarioTo( maTabs[nDestTab].get() ); + if (HasTable(nSrcTab) && HasTable(nDestTab)) + return maTabs[nSrcTab]->TestCopyScenarioTo(maTabs[nDestTab].get()); OSL_FAIL("wrong table at TestCopyScenario"); return false; @@ -1124,7 +1121,7 @@ void ScDocument::UpdateTranspose( const ScAddress& rDestPos, ScDocument* pClipDo ScAddress aDest = rDestPos; SCTAB nClipTab = 0; - for (SCTAB nDestTab=0; nDestTab< static_cast<SCTAB>(maTabs.size()) && maTabs[nDestTab]; nDestTab++) + for (SCTAB nDestTab = 0; nDestTab < GetTableCount() && maTabs[nDestTab]; nDestTab++) if (rMark.GetTableSelect(nDestTab)) { while (!pClipDoc->maTabs[nClipTab]) nClipTab = (nClipTab+1) % (MAXTAB+1); @@ -1135,7 +1132,7 @@ void ScDocument::UpdateTranspose( const ScAddress& rDestPos, ScDocument* pClipDo // Like UpdateReference if (pRangeName) pRangeName->UpdateTranspose( aSource, aDest ); // Before the cells! - for (SCTAB i=0; i< static_cast<SCTAB>(maTabs.size()); i++) + for (SCTAB i = 0; i < GetTableCount(); i++) if (maTabs[i]) maTabs[i]->UpdateTranspose( aSource, aDest, pUndoDoc ); @@ -1152,7 +1149,7 @@ void ScDocument::UpdateGrow( const ScRange& rArea, SCCOL nGrowX, SCROW nGrowY ) if (pRangeName) pRangeName->UpdateGrow( rArea, nGrowX, nGrowY ); - for (SCTAB i=0; i< static_cast<SCTAB>(maTabs.size()) && maTabs[i]; i++) + for (SCTAB i = 0; i < GetTableCount() && maTabs[i]; i++) maTabs[i]->UpdateGrow( rArea, nGrowX, nGrowY ); } @@ -1181,7 +1178,7 @@ void ScDocument::Fill(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, ScProg OUString ScDocument::GetAutoFillPreview( const ScRange& rSource, SCCOL nEndX, SCROW nEndY ) { SCTAB nTab = rSource.aStart.Tab(); - if (nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) + if (nTab < GetTableCount() && maTabs[nTab]) return maTabs[nTab]->GetAutoFillPreview( rSource, nEndX, nEndY ); return OUString(); @@ -1205,14 +1202,11 @@ 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) && nTab < static_cast<SCTAB>(maTabs.size())) + if (ScTable* pTable = FetchTable(nTab)) { - if (maTabs[nTab]) - { - PutInOrder(nStartCol, nEndCol); - PutInOrder(nStartRow, nEndRow); - maTabs[nTab]->GetAutoFormatData(nStartCol, nStartRow, nEndCol, nEndRow, rData); - } + PutInOrder(nStartCol, nEndCol); + PutInOrder(nStartRow, nEndRow); + pTable->GetAutoFormatData(nStartCol, nStartRow, nEndCol, nEndRow, rData); } } @@ -1317,7 +1311,7 @@ bool ScDocument::SearchAndReplace( { // FIXME: Manage separated marks per table! bool bFound = false; - if (rTab >= static_cast<SCTAB>(maTabs.size())) + if (rTab >= GetTableCount()) OSL_FAIL("table out of range"); if (ValidTab(rTab)) { @@ -1381,7 +1375,7 @@ bool ScDocument::SearchAndReplace( } else { - for (nTab = rTab; (nTab < static_cast<SCTAB>(maTabs.size())) && !bFound; nTab++) + for (nTab = rTab; (nTab < GetTableCount()) && !bFound; nTab++) if (maTabs[nTab]) { if (rMark.GetTableSelect(nTab)) @@ -1420,8 +1414,8 @@ bool ScDocument::SearchAndReplace( */ bool ScDocument::UpdateOutlineCol( SCCOL nStartCol, SCCOL nEndCol, SCTAB nTab, bool bShow ) { - if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] ) - return maTabs[nTab]->UpdateOutlineCol( nStartCol, nEndCol, bShow ); + if (ScTable* pTable = FetchTable(nTab)) + return pTable->UpdateOutlineCol(nStartCol, nEndCol, bShow); OSL_FAIL("missing tab"); return false; @@ -1429,8 +1423,8 @@ bool ScDocument::UpdateOutlineCol( SCCOL nStartCol, SCCOL nEndCol, SCTAB nTab, b bool ScDocument::UpdateOutlineRow( SCROW nStartRow, SCROW nEndRow, SCTAB nTab, bool bShow ) { - if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] ) - return maTabs[nTab]->UpdateOutlineRow( nStartRow, nEndRow, bShow ); + if (ScTable* pTable = FetchTable(nTab)) + return pTable->UpdateOutlineRow(nStartRow, nEndRow, bShow); OSL_FAIL("missing tab"); return false; @@ -1440,42 +1434,41 @@ void ScDocument::Sort( SCTAB nTab, const ScSortParam& rSortParam, bool bKeepQuery, bool bUpdateRefs, ScProgress* pProgress, sc::ReorderParam* pUndo ) { - if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] ) + if (ScTable* pTable = FetchTable(nTab)) { bool bOldEnableIdle = IsIdleEnabled(); EnableIdle(false); - maTabs[nTab]->Sort(rSortParam, bKeepQuery, bUpdateRefs, pProgress, pUndo); + pTable->Sort(rSortParam, bKeepQuery, bUpdateRefs, pProgress, pUndo); EnableIdle(bOldEnableIdle); } } void ScDocument::Reorder( const sc::ReorderParam& rParam ) { - ScTable* pTab = FetchTable(rParam.maSortRange.aStart.Tab()); - if (!pTab) + ScTable* pTable = FetchTable(rParam.maSortRange.aStart.Tab()); + if (!pTable) return; bool bOldEnableIdle = IsIdleEnabled(); EnableIdle(false); - pTab->Reorder(rParam); + pTable->Reorder(rParam); EnableIdle(bOldEnableIdle); } void ScDocument::PrepareQuery( SCTAB nTab, ScQueryParam& rQueryParam ) { - if( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] ) - maTabs[nTab]->PrepareQuery(rQueryParam); + if (ScTable* pTable = FetchTable(nTab)) + pTable->PrepareQuery(rQueryParam); else { OSL_FAIL("missing tab"); - return; } } SCSIZE ScDocument::Query(SCTAB nTab, const ScQueryParam& rQueryParam, bool bKeepSub) { - if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] ) - return maTabs[nTab]->Query(rQueryParam, bKeepSub); + if (ScTable* pTable = FetchTable(nTab)) + return pTable->Query(rQueryParam, bKeepSub); OSL_FAIL("missing tab"); return 0; @@ -1483,23 +1476,19 @@ SCSIZE ScDocument::Query(SCTAB nTab, const ScQueryParam& rQueryParam, bool bKeep OUString ScDocument::GetUpperCellString(SCCOL nCol, SCROW nRow, SCTAB nTab) { - if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] ) - return maTabs[nTab]->GetUpperCellString( nCol, nRow ); + if (ScTable* pTable = FetchTable(nTab)) + return pTable->GetUpperCellString( nCol, nRow ); else return OUString(); } bool ScDocument::CreateQueryParam( const ScRange& rRange, ScQueryParam& rQueryParam ) { - ScTable* pTab = FetchTable(rRange.aStart.Tab()); - if (!pTab) - { - OSL_FAIL("missing tab"); - return false; - } + if (ScTable* pTable = FetchTable(rRange.aStart.Tab())) + return pTable->CreateQueryParam(rRange.aStart.Col(), rRange.aStart.Row(), rRange.aEnd.Col(), rRange.aEnd.Row(), rQueryParam); - return pTab->CreateQueryParam( - rRange.aStart.Col(), rRange.aStart.Row(), rRange.aEnd.Col(), rRange.aEnd.Row(), rQueryParam); + OSL_FAIL("missing tab"); + return false; } bool ScDocument::HasAutoFilter( SCCOL nCurCol, SCROW nCurRow, SCTAB nCurTab ) @@ -1537,20 +1526,23 @@ bool ScDocument::HasAutoFilter( SCCOL nCurCol, SCROW nCurRow, SCTAB nCurTab ) bool ScDocument::HasColHeader( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, SCTAB nTab ) { - return ValidTab(nTab) && maTabs[nTab] && maTabs[nTab]->HasColHeader( nStartCol, nStartRow, nEndCol, nEndRow ); + ScTable* pTable = FetchTable(nTab); + return pTable && pTable->HasColHeader(nStartCol, nStartRow, nEndCol, nEndRow); } bool ScDocument::HasRowHeader( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, SCTAB nTab ) { - return ValidTab(nTab) && maTabs[nTab] && maTabs[nTab]->HasRowHeader( nStartCol, nStartRow, nEndCol, nEndRow ); + ScTable* pTable = FetchTable(nTab); + return pTable && pTable->HasRowHeader(nStartCol, nStartRow, nEndCol, nEndRow); } void ScDocument::GetFilterSelCount( SCCOL nCol, SCROW nRow, SCTAB nTab, SCSIZE& nSelected, SCSIZE& nTotal ) { nSelected = 0; nTotal = 0; - if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] ) + + if (HasTable(nTab)) { ScDBData* pDBData = GetDBAtCursor( nCol, nRow, nTab, ScDBDataPortion::AREA ); if( pDBData && pDBData->HasAutoFilter() ) @@ -1564,7 +1556,7 @@ void ScDocument::GetFilterSelCount( SCCOL nCol, SCROW nRow, SCTAB nTab, SCSIZE& void ScDocument::GetFilterEntries( SCCOL nCol, SCROW nRow, SCTAB nTab, ScFilterEntries& rFilterEntries ) { - if ( !(ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] && pDBCollection) ) + if (!HasTable(nTab) || !pDBCollection) return; ScDBData* pDBData = pDBCollection->GetDBAtCursor(nCol, nRow, nTab, ScDBDataPortion::AREA); //!?? @@ -1617,10 +1609,10 @@ void ScDocument::GetFilterEntriesArea( SCCOL nCol, SCROW nStartRow, SCROW nEndRow, SCTAB nTab, bool bCaseSens, ScFilterEntries& rFilterEntries ) { - if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] ) + if (ScTable* pTable = FetchTable(nTab)) { - maTabs[nTab]->GetFilterEntries( nCol, nStartRow, nEndRow, rFilterEntries, true ); - sortAndRemoveDuplicates( rFilterEntries.maStrData, bCaseSens); + pTable->GetFilterEntries(nCol, nStartRow, nEndRow, rFilterEntries, true); + sortAndRemoveDuplicates(rFilterEntries.maStrData, bCaseSens); } } @@ -1650,10 +1642,7 @@ void ScDocument::GetDataEntries( } } - if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(maTabs.size())) - return; - - if (!maTabs[nTab]) + if (!HasTable(nTab)) return; std::set<ScTypedStrData> aStrings; @@ -1720,7 +1709,7 @@ tools::Rectangle ScDocument::GetEmbeddedRect() const // 1/100 mm { tools::Rectangle aRect; ScTable* pTable = nullptr; - if ( aEmbedRange.aStart.Tab() < static_cast<SCTAB>(maTabs.size()) ) + if (aEmbedRange.aStart.Tab() < GetTableCount()) pTable = maTabs[aEmbedRange.aStart.Tab()].get(); else OSL_FAIL("table out of range"); @@ -1808,7 +1797,7 @@ static bool lcl_AddTwipsWhile( tools::Long & rTwips, tools::Long nStopTwips, SCR ScRange ScDocument::GetRange( SCTAB nTab, const tools::Rectangle& rMMRect, bool bHiddenAsZero ) const { ScTable* pTable = nullptr; - if (nTab < static_cast<SCTAB>(maTabs.size())) + if (nTab < GetTableCount()) pTable = maTabs[nTab].get(); else OSL_FAIL("table out of range"); @@ -1915,8 +1904,8 @@ bool ScDocument::IsDocEditable() const bool ScDocument::IsTabProtected( SCTAB nTab ) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - return maTabs[nTab]->IsProtected(); + if (const ScTable* pTable = FetchTable(nTab)) + return pTable->IsProtected(); OSL_FAIL("Wrong table number"); return false; @@ -1924,23 +1913,21 @@ bool ScDocument::IsTabProtected( SCTAB nTab ) const const ScTableProtection* ScDocument::GetTabProtection(SCTAB nTab) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - return maTabs[nTab]->GetProtection(); + if (const ScTable* pTable = FetchTable(nTab)) + return pTable->GetProtection(); return nullptr; } void ScDocument::SetTabProtection(SCTAB nTab, const ScTableProtection* pProtect) { - if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(maTabs.size())) - return; - - maTabs[nTab]->SetProtection(pProtect); + if (ScTable* pTable = FetchTable(nTab)) + pTable->SetProtection(pProtect); } void ScDocument::CopyTabProtection(SCTAB nTabSrc, SCTAB nTabDest) { - if (!ValidTab(nTabSrc) || nTabSrc >= static_cast<SCTAB>(maTabs.size()) || nTabDest >= static_cast<SCTAB>(maTabs.size()) || !ValidTab(nTabDest)) + if (!HasTable(nTabSrc) || !HasTable(nTabDest)) return; maTabs[nTabDest]->SetProtection( maTabs[nTabSrc]->GetProtection() ); @@ -1998,7 +1985,7 @@ void ScDocument::SetLanguage( LanguageType eLatin, LanguageType eCjk, LanguageTy tools::Rectangle ScDocument::GetMMRect( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, SCTAB nTab, bool bHiddenAsZero ) const { - if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(maTabs.size()) || !maTabs[nTab]) + if (!HasTable(nTab)) { OSL_FAIL("GetMMRect: wrong table"); return tools::Rectangle(0,0,0,0); @@ -2109,30 +2096,29 @@ void ScDocument::RemoveMerge( SCCOL nCol, SCROW nRow, SCTAB nTab ) void ScDocument::ExtendPrintArea( OutputDevice* pDev, SCTAB nTab, SCCOL nStartCol, SCROW nStartRow, SCCOL& rEndCol, SCROW nEndRow ) const { - if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] ) - maTabs[nTab]->ExtendPrintArea( pDev, nStartCol, nStartRow, rEndCol, nEndRow ); + if (HasTable(nTab)) + maTabs[nTab]->ExtendPrintArea(pDev, nStartCol, nStartRow, rEndCol, nEndRow); } SCSIZE ScDocument::GetPatternCount( SCTAB nTab, SCCOL nCol ) const { - if( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] ) - return maTabs[nTab]->GetPatternCount( nCol ); + if (const ScTable* pTable = FetchTable(nTab)) + return pTable->GetPatternCount( nCol ); else return 0; } SCSIZE ScDocument::GetPatternCount( SCTAB nTab, SCCOL nCol, SCROW nRow1, SCROW nRow2 ) const { - if( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] ) - return maTabs[nTab]->GetPatternCount( nCol, nRow1, nRow2 ); - else - return 0; + if (const ScTable* pTable = FetchTable(nTab)) + return pTable->GetPatternCount(nCol, nRow1, nRow2); + return 0; } void ScDocument::ReservePatternCount( SCTAB nTab, SCCOL nCol, SCSIZE nReserve ) { - if( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] ) - maTabs[nTab]->ReservePatternCount( nCol, nReserve ); + if (ScTable* pTable = FetchTable(nTab)) + pTable->ReservePatternCount(nCol, nReserve); } void ScDocument::GetSortParam( ScSortParam& rParam, SCTAB nTab ) diff --git a/sc/source/core/data/documen4.cxx b/sc/source/core/data/documen4.cxx index 0db93c0aeb5b..313340676df1 100644 --- a/sc/source/core/data/documen4.cxx +++ b/sc/source/core/data/documen4.cxx @@ -77,8 +77,8 @@ bool ScDocument::Solver(SCCOL nFCol, SCROW nFRow, SCTAB nFTab, nX = 0.0; if ( ValidColRow( nFCol, nFRow ) && ValidTab( nFTab ) && ValidColRow( nVCol, nVRow ) && ValidTab( nVTab ) && - nFTab < static_cast<SCTAB>( maTabs.size() ) && maTabs[nFTab] && - nVTab < static_cast<SCTAB>( maTabs.size() ) && maTabs[nVTab] ) + nFTab < GetTableCount() && maTabs[nFTab] && + nVTab < GetTableCount() && maTabs[nVTab] ) { CellType eFType = GetCellType(nFCol, nFRow, nFTab); CellType eVType = GetCellType(nVCol, nVRow, nVTab); @@ -291,7 +291,7 @@ void ScDocument::InsertMatrixFormula(SCCOL nCol1, SCROW nRow1, else pCell = new ScFormulaCell(*this, aPos, rFormula, eGram, ScMatrixMode::Formula); pCell->SetMatColsRows( nCol2 - nCol1 + 1, nRow2 - nRow1 + 1 ); - SCTAB nMax = static_cast<SCTAB>(maTabs.size()); + SCTAB nMax = GetTableCount(); for (const auto& rTab : rMark) { if (rTab >= nMax) @@ -365,7 +365,7 @@ void ScDocument::InsertTableOp(const ScTabOpParam& rParam, // multiple (repeate SCROW k; i = 0; bool bStop = false; - SCTAB nMax = static_cast<SCTAB>(maTabs.size()); + SCTAB nMax = GetTableCount(); for (const auto& rTab : rMark) { if (rTab >= nMax) @@ -438,7 +438,7 @@ void ScDocument::InsertTableOp(const ScTabOpParam& rParam, // multiple (repeate formula::FormulaGrammar::GRAM_NATIVE, ScMatrixMode::NONE ); for( j = nCol1; j <= nCol2; j++ ) for( k = nRow1; k <= nRow2; k++ ) - for (i = 0; i < static_cast<SCTAB>(maTabs.size()); i++) + for (i = 0; i < GetTableCount(); i++) { for (const auto& rTab : rMark) { @@ -530,27 +530,25 @@ bool ScDocument::MarkUsedExternalReferences( const ScTokenArray& rArr, const ScA bool ScDocument::GetNextSpellingCell(SCCOL& nCol, SCROW& nRow, SCTAB nTab, bool bInSel, const ScMarkData& rMark) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - return maTabs[nTab]->GetNextSpellingCell( nCol, nRow, bInSel, rMark ); - else - return false; + if (const ScTable* pTable = FetchTable(nTab)) + return pTable->GetNextSpellingCell( nCol, nRow, bInSel, rMark ); + return false; } bool ScDocument::GetNextMarkedCell( SCCOL& rCol, SCROW& rRow, SCTAB nTab, const ScMarkData& rMark ) { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - return maTabs[nTab]->GetNextMarkedCell( rCol, rRow, rMark ); - else - return false; + if (ScTable* pTable = FetchTable(nTab)) + return pTable->GetNextMarkedCell( rCol, rRow, rMark ); + return false; } void ScDocument::ReplaceStyle(const SvxSearchItem& rSearchItem, SCCOL nCol, SCROW nRow, SCTAB nTab, const ScMarkData& rMark) { - if (nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - maTabs[nTab]->ReplaceStyle(rSearchItem, nCol, nRow, rMark, true/*bIsUndoP*/); + if (ScTable* pTable = FetchTable(nTab)) + pTable->ReplaceStyle(rSearchItem, nCol, nRow, rMark, true/*bIsUndoP*/); } void ScDocument::CompileDBFormula() @@ -588,21 +586,17 @@ void ScDocument::InvalidateTableArea() sal_Int32 ScDocument::GetMaxStringLen( SCTAB nTab, SCCOL nCol, SCROW nRowStart, SCROW nRowEnd, rtl_TextEncoding eCharSet ) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - return maTabs[nTab]->GetMaxStringLen( nCol, nRowStart, nRowEnd, eCharSet ); - else - return 0; + if (const ScTable* pTable = FetchTable(nTab)) + return pTable->GetMaxStringLen(nCol, nRowStart, nRowEnd, eCharSet); + return 0; } sal_Int32 ScDocument::GetMaxNumberStringLen( sal_uInt16& nPrecision, SCTAB nTab, - SCCOL nCol, - SCROW nRowStart, SCROW nRowEnd ) const + SCCOL nCol, SCROW nRowStart, SCROW nRowEnd ) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - return maTabs[nTab]->GetMaxNumberStringLen( nPrecision, nCol, - nRowStart, nRowEnd ); - else - return 0; + if (const ScTable* pTable = FetchTable(nTab)) + return pTable->GetMaxNumberStringLen(nPrecision, nCol, nRowStart, nRowEnd); + return 0; } bool ScDocument::GetSelectionFunction( ScSubTotalFunc eFunc, @@ -616,7 +610,7 @@ bool ScDocument::GetSelectionFunction( ScSubTotalFunc eFunc, if (!aMark.IsMultiMarked() && !aMark.IsCellMarked(rCursor.Col(), rCursor.Row())) aMark.SetMarkArea(rCursor); - SCTAB nMax = static_cast<SCTAB>(maTabs.size()); + SCTAB nMax = GetTableCount(); ScMarkData::const_iterator itr = aMark.begin(), itrEnd = aMark.end(); for (; itr != itrEnd && *itr < nMax && !aData.getError(); ++itr) @@ -716,8 +710,8 @@ sal_uLong ScDocument::AddCondFormat( std::unique_ptr<ScConditionalFormat> pNew, if(!pNew) return 0; - if(ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - return maTabs[nTab]->AddCondFormat( std::move(pNew) ); + if (ScTable* pTable = FetchTable(nTab)) + return pTable->AddCondFormat(std::move(pNew)); return 0; } @@ -865,16 +859,15 @@ ScConditionalFormat* ScDocument::GetCondFormat( ScConditionalFormatList* ScDocument::GetCondFormList(SCTAB nTab) const { - if(ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) + if (HasTable(nTab)) return maTabs[nTab]->GetCondFormList(); - return nullptr; } void ScDocument::SetCondFormList( ScConditionalFormatList* pList, SCTAB nTab ) { - if(ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - maTabs[nTab]->SetCondFormList(pList); + if (ScTable* pTable = FetchTable(nTab)) + pTable->SetCondFormList(pList); } const ScValidationData* ScDocument::GetValidationEntry( sal_uInt32 nIndex ) const @@ -887,8 +880,8 @@ const ScValidationData* ScDocument::GetValidationEntry( sal_uInt32 nIndex ) cons void ScDocument::DeleteConditionalFormat(sal_uLong nOldIndex, SCTAB nTab) { - if(ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - maTabs[nTab]->DeleteConditionalFormat(nOldIndex); + if (ScTable* pTable = FetchTable(nTab)) + pTable->DeleteConditionalFormat(nOldIndex); } bool ScDocument::HasDetectiveOperations() const diff --git a/sc/source/core/data/documen5.cxx b/sc/source/core/data/documen5.cxx index c4f76433b41d..0355812a7b9f 100644 --- a/sc/source/core/data/documen5.cxx +++ b/sc/source/core/data/documen5.cxx @@ -528,11 +528,9 @@ void ScDocument::SetChartRangeList( std::u16string_view rChartName, bool ScDocument::HasData( SCCOL nCol, SCROW nRow, SCTAB nTab ) { - if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] - && nCol < maTabs[nTab]->GetAllocatedColumnsCount()) - return maTabs[nTab]->HasData( nCol, nRow ); - else - return false; + if (ScTable* pTable = FetchTable(nTab) ; pTable && nCol < pTable->GetAllocatedColumnsCount()) + return pTable->HasData(nCol, nRow); + return false; } uno::Reference< embed::XEmbeddedObject > diff --git a/sc/source/core/data/documen6.cxx b/sc/source/core/data/documen6.cxx index 49d433ffebb7..931cb9002bee 100644 --- a/sc/source/core/data/documen6.cxx +++ b/sc/source/core/data/documen6.cxx @@ -183,7 +183,7 @@ public: SvtScriptType ScDocument::GetRangeScriptType( sc::ColumnBlockPosition& rBlockPos, const ScAddress& rPos, SCROW nLength ) { - if (!TableExists(rPos.Tab())) + if (!HasTable(rPos.Tab())) return SvtScriptType::NONE; return maTabs[rPos.Tab()]->GetRangeScriptType(rBlockPos, rPos.Col(), rPos.Row(), rPos.Row()+nLength-1); diff --git a/sc/source/core/data/documen7.cxx b/sc/source/core/data/documen7.cxx index 61f6b68f0543..f69585167c66 100644 --- a/sc/source/core/data/documen7.cxx +++ b/sc/source/core/data/documen7.cxx @@ -129,7 +129,7 @@ void ScDocument::Broadcast( const ScHint& rHint ) if ( rHint.GetStartAddress() != BCA_BRDCST_ALWAYS ) { SCTAB nTab = rHint.GetStartAddress().Tab(); - if (nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) + if (nTab < GetTableCount() && maTabs[nTab]) maTabs[nTab]->SetStreamValid(false); } } @@ -223,8 +223,8 @@ void ScDocument::StartListeningCell( const ScAddress& rAddress, { OSL_ENSURE(pListener, "StartListeningCell: pListener Null"); SCTAB nTab = rAddress.Tab(); - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - maTabs[nTab]->StartListening( rAddress, pListener ); + if (ScTable* pTable = FetchTable(nTab)) + pTable->StartListening(rAddress, pListener); } void ScDocument::EndListeningCell( const ScAddress& rAddress, @@ -232,28 +232,22 @@ void ScDocument::EndListeningCell( const ScAddress& rAddress, { OSL_ENSURE(pListener, "EndListeningCell: pListener Null"); SCTAB nTab = rAddress.Tab(); - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - maTabs[nTab]->EndListening( rAddress, pListener ); + if (ScTable* pTable = FetchTable(nTab)) + pTable->EndListening( rAddress, pListener ); } void ScDocument::StartListeningCell( sc::StartListeningContext& rCxt, const ScAddress& rPos, SvtListener& rListener ) { - ScTable* pTab = FetchTable(rPos.Tab()); - if (!pTab) - return; - - pTab->StartListening(rCxt, rPos, rListener); + if (ScTable* pTable = FetchTable(rPos.Tab())) + pTable->StartListening(rCxt, rPos, rListener); } void ScDocument::EndListeningCell( sc::EndListeningContext& rCxt, const ScAddress& rPos, SvtListener& rListener ) { - ScTable* pTab = FetchTable(rPos.Tab()); - if (!pTab) - return; - - pTab->EndListening(rCxt, rPos, rListener); + if (ScTable* pTable = FetchTable(rPos.Tab())) + pTable->EndListening(rCxt, rPos, rListener); } void ScDocument::EndListeningFormulaCells( std::vector<ScFormulaCell*>& rCells ) diff --git a/sc/source/core/data/documen8.cxx b/sc/source/core/data/documen8.cxx index 1c97e5d2408a..3d4d2ecc4b47 100644 --- a/sc/source/core/data/documen8.cxx +++ b/sc/source/core/data/documen8.cxx @@ -549,7 +549,7 @@ bool ScDocument::IdleCalcTextWidth() // true = try next again aScope.incTab(); } - if (!ValidTab(aScope.Tab()) || aScope.Tab() >= static_cast<SCTAB>(maTabs.size()) || !maTabs[aScope.Tab()]) + if (!HasTable(aScope.Tab())) aScope.setTab(0); ScTable* pTab = maTabs[aScope.Tab()].get(); @@ -628,7 +628,7 @@ bool ScDocument::IdleCalcTextWidth() // true = try next again bNewTab = true; } - if (!ValidTab(aScope.Tab()) || aScope.Tab() >= static_cast<SCTAB>(maTabs.size()) || !maTabs[aScope.Tab()] ) + if (!HasTable(aScope.Tab())) { // Sheet doesn't exist at specified sheet position. Restart at sheet 0. aScope.setTab(0); diff --git a/sc/source/core/data/documen9.cxx b/sc/source/core/data/documen9.cxx index f63c1ee4d1f1..cc49d58c5cdb 100644 --- a/sc/source/core/data/documen9.cxx +++ b/sc/source/core/data/documen9.cxx @@ -146,11 +146,11 @@ void ScDocument::InitDrawLayer( SfxObjectShell* pDocShell ) SCTAB nDrawPages = 0; SCTAB nTab; - for (nTab=0; nTab < static_cast<SCTAB>(maTabs.size()); nTab++) + for (nTab = 0; nTab < GetTableCount(); nTab++) if (maTabs[nTab]) nDrawPages = nTab + 1; // needed number of pages - for (nTab=0; nTab<nDrawPages && nTab < static_cast<SCTAB>(maTabs.size()); nTab++) + for (nTab = 0; nTab < nDrawPages && nTab < GetTableCount(); nTab++) { mpDrawLayer->ScAddPage( nTab ); // always add page, with or without the table if (maTabs[nTab]) @@ -202,10 +202,8 @@ void ScDocument::UpdateDrawPrinter() void ScDocument::SetDrawPageSize(SCTAB nTab) { - if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(maTabs.size()) || !maTabs[nTab]) - return; - - maTabs[nTab]->SetDrawPageSize(); + if (ScTable* pTable = FetchTable(nTab)) + pTable->SetDrawPageSize(); } bool ScDocument::IsChart( const SdrObject* pObject ) @@ -271,7 +269,7 @@ bool ScDocument::HasOLEObjectsInArea( const ScRange& rRange, const ScMarkData* p return false; SCTAB nStartTab = 0; - SCTAB nEndTab = static_cast<SCTAB>(maTabs.size()); + SCTAB nEndTab = GetTableCount(); if ( !pTabMark ) { nStartTab = rRange.aStart.Tab(); @@ -390,7 +388,7 @@ SdrObject* ScDocument::GetObjectAtPoint( SCTAB nTab, const Point& rPos ) { // for Drag&Drop on draw object SdrObject* pFound = nullptr; - if (mpDrawLayer && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) + if (mpDrawLayer && nTab < GetTableCount() && maTabs[nTab]) { SdrPage* pPage = mpDrawLayer->GetPage(static_cast<sal_uInt16>(nTab)); OSL_ENSURE(pPage,"Page ?"); @@ -590,7 +588,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< static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]; nTab++ ) + for (SCTAB nTab = 0; nTab < GetTableCount() && maTabs[nTab]; nTab++) if ( maTabs[nTab]->IsLoadingRTL() ) { // SetLayoutRTL => SetDrawPageSize => ScDrawLayer::SetPageSize, includes RTL-mirroring; diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx index 0095e7dad744..cc6ee1236098 100644 --- a/sc/source/core/data/document.cxx +++ b/sc/source/core/data/document.cxx @@ -170,7 +170,7 @@ typedef std::set<ScDefaultAttr, ScLessDefaultAttr> ScDefaultAttrSet; void ScDocument::MakeTable( SCTAB nTab,bool _bNeedsNameCheck ) { - if ( !(ValidTab(nTab) && ( nTab >= static_cast<SCTAB>(maTabs.size()) ||!maTabs[nTab])) ) + if (!ValidTab(nTab) || HasTable(nTab)) return; // Get Custom prefix @@ -178,50 +178,35 @@ void ScDocument::MakeTable( SCTAB nTab,bool _bNeedsNameCheck ) OUString aString = rOpt.GetInitTabPrefix() + OUString::number(nTab+1); if ( _bNeedsNameCheck ) CreateValidTabName( aString ); // no doubles - if (nTab < static_cast<SCTAB>(maTabs.size())) + if (nTab < GetTableCount()) { maTabs[nTab].reset( new ScTable(*this, nTab, aString) ); } else { - while(nTab > static_cast<SCTAB>(maTabs.size())) + while (nTab > GetTableCount()) maTabs.push_back(nullptr); maTabs.emplace_back( new ScTable(*this, nTab, aString) ); } maTabs[nTab]->SetLoadingMedium(bLoadingMedium); } -bool ScDocument::HasTable( SCTAB nTab ) const -{ - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size())) - if (maTabs[nTab]) - return true; - - return false; -} - bool ScDocument::GetHashCode( SCTAB nTab, sal_Int64& rHashCode ) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size())) + if (const ScTable* pTable = FetchTable(nTab)) { - if (maTabs[nTab]) - { - rHashCode = maTabs[nTab]->GetHashCode(); - return true; - } + rHashCode = pTable->GetHashCode(); + return true; } return false; } bool ScDocument::GetName( SCTAB nTab, OUString& rName ) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size())) + if (const ScTable* pTable = FetchTable(nTab)) { - if (maTabs[nTab]) - { - rName = maTabs[nTab]->GetName(); - return true; - } + rName = pTable->GetName(); + return true; } rName.clear(); return false; @@ -236,13 +221,10 @@ OUString ScDocument::GetCopyTabName( SCTAB nTab ) const bool ScDocument::SetCodeName( SCTAB nTab, const OUString& rName ) { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size())) + if (ScTable* pTable = FetchTable(nTab)) { - if (maTabs[nTab]) - { - maTabs[nTab]->SetCodeName( rName ); - return true; - } + pTable->SetCodeName(rName); + return true; } SAL_WARN("sc", "can't set code name " << rName ); return false; @@ -250,12 +232,11 @@ bool ScDocument::SetCodeName( SCTAB nTab, const OUString& rName ) bool ScDocument::GetCodeName( SCTAB nTab, OUString& rName ) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size())) - if (maTabs[nTab]) - { - rName = maTabs[nTab]->GetCodeName(); - return true; - } + if (const ScTable* pTable = FetchTable(nTab)) + { + rName = pTable->GetCodeName(); + return true; + } rName.clear(); return false; } @@ -273,7 +254,7 @@ bool ScDocument::GetTable( const OUString& rName, SCTAB& rTab ) const } const OUString aUpperName = aCacheUpperName; - for (SCTAB i=0; i< static_cast<SCTAB>(maTabs.size()); i++) + for (SCTAB i = 0; i < GetTableCount(); i++) if (maTabs[i]) { if (aUpperName == maTabs[i]->GetUpperName()) @@ -308,8 +289,8 @@ std::vector<OUString> ScDocument::GetAllTableNames() const ScDBData* ScDocument::GetAnonymousDBData(SCTAB nTab) { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - return maTabs[nTab]->GetAnonymousDBData(); + if (ScTable* pTable = FetchTable(nTab)) + return pTable->GetAnonymousDBData(); return nullptr; } @@ -320,8 +301,8 @@ SCTAB ScDocument::GetTableCount() const void ScDocument::SetAnonymousDBData(SCTAB nTab, std::unique_ptr<ScDBData> pDBData) { - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab]) - maTabs[nTab]->SetAnonymousDBData(std::move(pDBData)); + if (ScTable* pTable = FetchTable(nTab)) + pTable->SetAnonymousDBData(std::move(pDBData)); } void ScDocument::SetAnonymousDBData( std::unique_ptr<ScDBData> pDBData ) @@ -408,7 +389,7 @@ void ScDocument::CreateValidTabName(OUString& rName) const OSL_ENSURE(bPrefix, "Invalid Table Name"); SCTAB nDummy; - for ( SCTAB i = static_cast<SCTAB>(maTabs.size())+1; !bOk ; i++ ) + for (SCTAB i = GetTableCount() + 1; !bOk ; i++) { rName = aStrTable + OUString::number(static_cast<sal_Int32>(i)); if (bPrefix) @@ -450,7 +431,7 @@ void ScDocument::CreateValidTabNames(std::vector<OUString>& aNames, SCTAB nCount bool bPrefix = ValidTabName( aStrTable ); OSL_ENSURE(bPrefix, "Invalid Table Name"); SCTAB nDummy; - SCTAB i = static_cast<SCTAB>(maTabs.size())+1; + SCTAB i = GetTableCount() + 1; for (SCTAB j = 0; j < nCount; ++j) { @@ -471,7 +452,7 @@ void ScDocument::CreateValidTabNames(std::vector<OUString>& aNames, SCTAB nCount void ScDocument::AppendTabOnLoad(const OUString& rName) { - SCTAB nTabCount = static_cast<SCTAB>(maTabs.size()); + SCTAB nTabCount = GetTableCount(); if (!ValidTab(nTabCount)) // max table count reached. No more tables. return; @@ -483,7 +464,7 @@ void ScDocument::AppendTabOnLoad(const OUString& rName) void ScDocument::SetTabNameOnLoad(SCTAB nTab, const OUString& rName) { - if (!ValidTab(nTab) || static_cast<SCTAB>(maTabs.size()) <= nTab) + if (!ValidTab(nTab) || GetTableCount() <= nTab) return; if (!ValidTabName(rName)) @@ -504,8 +485,8 @@ void ScDocument::InvalidateStreamOnSave() bool ScDocument::InsertTab( SCTAB nPos, const OUString& rName, bool bExternalDocument, bool bUndoDeleteTab ) { - SCTAB nTabCount = static_cast<SCTAB>(maTabs.size()); - bool bValid = ValidTab(nTabCount); + SCTAB nTabCount = GetTableCount(); + bool bValid = ValidTab(nTabCount); if ( !bExternalDocument ) // else test rName == "'Doc'!Tab" first bValid = (bValid && ValidNewTabName(rName)); if (bValid) @@ -592,9 +573,9 @@ bool ScDocument::InsertTab( bool ScDocument::InsertTabs( SCTAB nPos, const std::vector<OUString>& rNames, bool bNamesValid ) { - SCTAB nNewSheets = static_cast<SCTAB>(rNames.size()); - SCTAB nTabCount = static_cast<SCTAB>(maTabs.size()); - bool bValid = bNamesValid || ValidTab(nTabCount+nNewSheets); + SCTAB nNewSheets = static_cast<SCTAB>(rNames.size()); + SCTAB nTabCount = GetTableCount(); + bool bValid = bNamesValid || ValidTab(nTabCount+nNewSheets); if (bValid) { @@ -673,94 +654,91 @@ bool ScDocument::InsertTabs( SCTAB nPos, const std::vector<OUString>& rNames, bool ScDocument::DeleteTab( SCTAB nTab ) { bool bValid = false; - if (ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size())) + if (HasTable(nTab)) { - if (maTabs[nTab]) + SCTAB nTabCount = GetTableCount(); + if (nTabCount > 1) { - SCTAB nTabCount = static_cast<SCTAB>(maTabs.size()); - if (nTabCount > 1) + sc::AutoCalcSwitch aACSwitch(*this, false); + sc::RefUpdateDeleteTabContext aCxt( *this, nTab, 1); + sc::DelayDeletingBroadcasters delayDeletingBroadcasters(*this); + + ScRange aRange( 0, 0, nTab, MaxCol(), MaxRow(), nTab ); + DelBroadcastAreasInRange( aRange ); + + // #i8180# remove database ranges etc. that are on the deleted tab + // (restored in undo with ScRefUndoData) + + xColNameRanges->DeleteOnTab( nTab ); + xRowNameRanges->DeleteOnTab( nTab ); + pDBCollection->DeleteOnTab( nTab ); + if (pDPCollection) + pDPCollection->DeleteOnTab( nTab ); + if (pDetOpList) + pDetOpList->DeleteOnTab( nTab ); + DeleteAreaLinksOnTab( nTab ); + + // normal reference update + + aRange.aEnd.SetTab(GetTableCount() - 1); + xColNameRanges->UpdateReference( URM_INSDEL, this, aRange, 0,0,-1 ); + xRowNameRanges->UpdateReference( URM_INSDEL, this, aRange, 0,0,-1 ); + if (pRangeName) + pRangeName->UpdateDeleteTab(aCxt); + pDBCollection->UpdateReference( + URM_INSDEL, 0,0,nTab, MaxCol(),MaxRow(),MAXTAB, 0,0,-1 ); + if (pDPCollection) + pDPCollection->UpdateReference( URM_INSDEL, aRange, 0,0,-1 ); + if (pDetOpList) + pDetOpList->UpdateReference( this, URM_INSDEL, aRange, 0,0,-1 ); + UpdateChartRef( URM_INSDEL, 0,0,nTab, MaxCol(),MaxRow(),MAXTAB, 0,0,-1 ); + UpdateRefAreaLinks( URM_INSDEL, aRange, 0,0,-1 ); + if (pValidationList) { - sc::AutoCalcSwitch aACSwitch(*this, false); - sc::RefUpdateDeleteTabContext aCxt( *this, nTab, 1); - sc::DelayDeletingBroadcasters delayDeletingBroadcasters(*this); - - ScRange aRange( 0, 0, nTab, MaxCol(), MaxRow(), nTab ); - DelBroadcastAreasInRange( aRange ); - - // #i8180# remove database ranges etc. that are on the deleted tab - // (restored in undo with ScRefUndoData) - - xColNameRanges->DeleteOnTab( nTab ); - xRowNameRanges->DeleteOnTab( nTab ); - pDBCollection->DeleteOnTab( nTab ); - if (pDPCollection) - pDPCollection->DeleteOnTab( nTab ); - if (pDetOpList) - pDetOpList->DeleteOnTab( nTab ); - DeleteAreaLinksOnTab( nTab ); - - // normal reference update - - aRange.aEnd.SetTab( static_cast<SCTAB>(maTabs.size())-1 ); - xColNameRanges->UpdateReference( URM_INSDEL, this, aRange, 0,0,-1 ); - xRowNameRanges->UpdateReference( URM_INSDEL, this, aRange, 0,0,-1 ); - if (pRangeName) - pRangeName->UpdateDeleteTab(aCxt); - pDBCollection->UpdateReference( - URM_INSDEL, 0,0,nTab, MaxCol(),MaxRow(),MAXTAB, 0,0,-1 ); - if (pDPCollection) - pDPCollection->UpdateReference( URM_INSDEL, aRange, 0,0,-1 ); - if (pDetOpList) - pDetOpList->UpdateReference( this, URM_INSDEL, aRange, 0,0,-1 ); - UpdateChartRef( URM_INSDEL, 0,0,nTab, MaxCol(),MaxRow(),MAXTAB, 0,0,-1 ); - UpdateRefAreaLinks( URM_INSDEL, aRange, 0,0,-1 ); - if (pValidationList) - { - ScMutationGuard aGuard(*this, ScMutationGuardFlags::CORE); - pValidationList->UpdateDeleteTab(aCxt); - } - if ( pUnoBroadcaster ) - pUnoBroadcaster->Broadcast( ScUpdateRefHint( URM_INSDEL, aRange, 0,0,-1 ) ); - - for (auto & pTab : maTabs) - if (pTab) - pTab->UpdateDeleteTab(aCxt); - - // tdf#149502 make sure ScTable destructor called after the erase is finished, when - // maTabs[x].nTab==x is true again, as it should be always true. - // In the end of maTabs.erase, maTabs indexes change, but nTab updated before erase. - // ~ScTable expect that maTabs[x].nTab==x so it shouldn't be called during erase. - ScTableUniquePtr pErasedTab = std::move(maTabs[nTab]); - maTabs.erase(maTabs.begin() + nTab); - delete pErasedTab.release(); - - // 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 (const auto& a : maTabs) - { - if (a) - a->UpdateCompile(); - } - // Excel-Filter deletes some Tables while loading, Listeners will - // only be triggered after the loading is done. - if ( !bInsertingFromOtherDoc ) - { - StartAllListeners(); - - sc::SetFormulaDirtyContext aFormulaDirtyCxt; - SetAllFormulasDirty(aFormulaDirtyCxt); - } + ScMutationGuard aGuard(*this, ScMutationGuardFlags::CORE); + pValidationList->UpdateDeleteTab(aCxt); + } + if ( pUnoBroadcaster ) + pUnoBroadcaster->Broadcast( ScUpdateRefHint( URM_INSDEL, aRange, 0,0,-1 ) ); + + for (auto & pTab : maTabs) + if (pTab) + pTab->UpdateDeleteTab(aCxt); + + // tdf#149502 make sure ScTable destructor called after the erase is finished, when + // maTabs[x].nTab==x is true again, as it should be always true. + // In the end of maTabs.erase, maTabs indexes change, but nTab updated before erase. + // ~ScTable expect that maTabs[x].nTab==x so it shouldn't be called during erase. + ScTableUniquePtr pErasedTab = std::move(maTabs[nTab]); + maTabs.erase(maTabs.begin() + nTab); + delete pErasedTab.release(); + + // 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 (const auto& a : maTabs) + { + if (a) + a->UpdateCompile(); + } + // Excel-Filter deletes some Tables while loading, Listeners will + // only be triggered after the loading is done. + if ( !bInsertingFromOtherDoc ) + { + StartAllListeners(); - if (comphelper::LibreOfficeKit::isActive()) - { - ScModelObj* pModel = comphelper::getFromUnoTunnel<ScModelObj>(this->GetDocumentShell()->GetModel()); - SfxLokHelper::notifyDocumentSizeChangedAllViews(pModel); - } + sc::SetFormulaDirtyContext aFormulaDirtyCxt; + SetAllFormulasDirty(aFormulaDirtyCxt); + } - bValid = true; + if (comphelper::LibreOfficeKit::isActive()) + { + ScModelObj* pModel = comphelper::getFromUnoTunnel<ScModelObj>(this->GetDocumentShell()->GetModel()); + SfxLokHelper::notifyDocumentSizeChangedAllViews(pModel); } + + bValid = true; } } return bValid; @@ -769,91 +747,88 @@ bool ScDocument::DeleteTab( SCTAB nTab ) bool ScDocument::DeleteTabs( SCTAB nTab, SCTAB nSheets ) { bool bValid = false; - if (ValidTab(nTab) && (nTab + nSheets) <= static_cast<SCTAB>(maTabs.size())) + if (HasTable(nTab) && (nTab + nSheets) <= GetTableCount()) { - if (maTabs[nTab]) + SCTAB nTabCount = GetTableCount(); + if (nTabCount > nSheets) { - SCTAB nTabCount = static_cast<SCTAB>(maTabs.size()); - if (nTabCount > nSheets) - { - sc::AutoCalcSwitch aACSwitch(*this, false); - sc::RefUpdateDeleteTabContext aCxt( *this, nTab, nSheets); - sc::DelayDeletingBroadcasters delayDeletingBroadcasters(*this); + sc::AutoCalcSwitch aACSwitch(*this, false); + sc::RefUpdateDeleteTabContext aCxt( *this, nTab, nSheets); + sc::DelayDeletingBroadcasters delayDeletingBroadcasters(*this); - 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->UpdateDeleteTab(aCxt); + for (SCTAB aTab = 0; aTab < nSheets; ++aTab) + { + ScRange aRange( 0, 0, nTab, MaxCol(), MaxRow(), nTab + aTab ); + DelBroadcastAreasInRange( aRange ); - // normal reference update + // #i8180# remove database ranges etc. that are on the deleted tab + // (restored in undo with ScRefUndoData) - 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 ); + xColNameRanges->DeleteOnTab( nTab + aTab ); + xRowNameRanges->DeleteOnTab( nTab + aTab ); + pDBCollection->DeleteOnTab( nTab + aTab ); if (pDPCollection) - pDPCollection->UpdateReference( URM_INSDEL, aRange, 0,0,-1*nSheets ); + pDPCollection->DeleteOnTab( nTab + aTab ); 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 (pValidationList) - { - ScMutationGuard aGuard(*this, ScMutationGuardFlags::CORE); - pValidationList->UpdateDeleteTab(aCxt); - } - if ( pUnoBroadcaster ) - pUnoBroadcaster->Broadcast( ScUpdateRefHint( URM_INSDEL, aRange, 0,0,-1*nSheets ) ); - - for (auto & pTab : maTabs) - if (pTab) - pTab->UpdateDeleteTab(aCxt); - - maTabs.erase(maTabs.begin() + nTab, maTabs.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); - for (const auto& a : maTabs) - { - if (a) - a->UpdateCompile(); - } - // Excel-Filter deletes some Tables while loading, Listeners will - // only be triggered after the loading is done. - if ( !bInsertingFromOtherDoc ) - { - StartAllListeners(); + pDetOpList->DeleteOnTab( nTab + aTab ); + DeleteAreaLinksOnTab( nTab + aTab ); + } - sc::SetFormulaDirtyContext aFormulaDirtyCxt; - SetAllFormulasDirty(aFormulaDirtyCxt); - } + if (pRangeName) + pRangeName->UpdateDeleteTab(aCxt); + + // 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 (pValidationList) + { + ScMutationGuard aGuard(*this, ScMutationGuardFlags::CORE); + pValidationList->UpdateDeleteTab(aCxt); + } + if ( pUnoBroadcaster ) + pUnoBroadcaster->Broadcast( ScUpdateRefHint( URM_INSDEL, aRange, 0,0,-1*nSheets ) ); + + for (auto & pTab : maTabs) + if (pTab) + pTab->UpdateDeleteTab(aCxt); + + maTabs.erase(maTabs.begin() + nTab, maTabs.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); + for (const auto& a : maTabs) + { + if (a) + a->UpdateCompile(); + } + // Excel-Filter deletes some Tables while loading, Listeners will + // only be triggered after the loading is done. + if ( !bInsertingFromOtherDoc ) + { + StartAllListeners(); - if (comphelper::LibreOfficeKit::isActive()) - { - ScModelObj* pModel = comphelper::getFromUnoTunnel<ScModelObj>(this->GetDocumentShell()->GetModel()); - SfxLokHelper::notifyDocumentSizeChangedAllViews(pModel); - } + sc::SetFormulaDirtyContext aFormulaDirtyCxt; + SetAllFormulasDirty(aFormulaDirtyCxt); + } - bValid = true; + if (comphelper::LibreOfficeKit::isActive()) + { + ScModelObj* pModel = comphelper::getFromUnoTunnel<ScModelObj>(this->GetDocumentShell()->GetModel()); + SfxLokHelper::notifyDocumentSizeChangedAllViews(pModel); } + + bValid = true; } } return bValid; @@ -863,41 +838,40 @@ bool ScDocument::RenameTab( SCTAB nTab, const OUString& rName, bool bExternalDoc { bool bValid = false; SCTAB i; - if (ValidTab(nTab)) + if (HasTable(nTab)) { - if (maTabs[nTab]) + if ( bExternalDocument ) + bValid = true; // composed name + else + bValid = ValidTabName(rName); + for (i = 0; i < GetTableCount() && bValid; i++) { - if ( bExternalDocument ) - bValid = true; // composed name - else - bValid = ValidTabName(rName); - for (i=0; (i< static_cast<SCTAB>(maTabs.size())) && bValid; i++) - if (maTabs[i] && (i != nTab)) - { - OUString aOldName = maTabs[i]->GetName(); - bValid = !ScGlobal::GetTransliteration().isEqual( rName, aOldName ); - } - if (bValid) + if (maTabs[i] && (i != nTab)) { - // #i75258# update charts before renaming, so they can get their live data objects. - // Once the charts are live, the sheet can be renamed without problems. - if ( pChartListenerCollection ) - pChartListenerCollection->UpdateChartsContainingTab( nTab ); - maTabs[nTab]->SetName(rName); - - // If formulas refer to the renamed sheet, the TokenArray remains valid, - // but the XML stream must be re-generated. - for (const auto& a : maTabs) - { - if (a) - a->SetStreamValid( false ); - } + OUString aOldName = maTabs[i]->GetName(); + bValid = !ScGlobal::GetTransliteration().isEqual( rName, aOldName ); + } + } + if (bValid) + { + // #i75258# update charts before renaming, so they can get their live data objects. + // Once the charts are live, the sheet can be renamed without problems. + if ( pChartListenerCollection ) + pChartListenerCollection->UpdateChartsContainingTab( nTab ); + maTabs[nTab]->SetName(rName); + + // If formulas refer to the renamed sheet, the TokenArray remains valid, + // but the XML stream must be re-generated. + for (const auto& pTable : maTabs) + { + if (pTable) + pTable->SetStreamValid( false ); + } - if (comphelper::LibreOfficeKit::isActive() && GetDrawLayer()) - { - ScModelObj* pModel = comphelper::getFromUnoTunnel<ScModelObj>(this->GetDocumentShell()->GetModel()); - SfxLokHelper::notifyDocumentSizeChangedAllViews(pModel); - } + if (comphelper::LibreOfficeKit::isActive() && GetDrawLayer()) + { + ScModelObj* pModel = comphelper::getFromUnoTunnel<ScModelObj>(this->GetDocumentShell()->GetModel()); + SfxLokHelper::notifyDocumentSizeChangedAllViews(pModel); } } } @@ -909,32 +883,28 @@ bool ScDocument::RenameTab( SCTAB nTab, const OUString& rName, bool bExternalDoc void ScDocument::SetVisible( SCTAB nTab, bool bVisible ) { - if (ValidTab(nTab) && nTab < static_cast<SCTAB> (maTabs.size())) - if (maTabs[nTab]) - maTabs[nTab]->SetVisible(bVisible); + if (ScTable* pTable = FetchTable(nTab)) + pTable->SetVisible(bVisible); } bool ScDocument::IsVisible( SCTAB nTab ) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB> (maTabs.size())) - if (maTabs[nTab]) - return maTabs[nTab]->IsVisible(); - + if (const ScTable* pTable = FetchTable(nTab)) + return pTable->IsVisible(); return false; } bool ScDocument::IsStreamValid( SCTAB nTab ) const { - if ( ValidTab(nTab) && nTab < static_cast<SCTAB> (maTabs.size()) && maTabs[nTab] ) - return maTabs[nTab]->IsStreamValid(); - + if (const ScTable* pTable = FetchTable(nTab)) + return pTable->IsStreamValid(); return false; } void ScDocument::SetStreamValid( SCTAB nTab, bool bSet, bool bIgnoreLock ) { - if ( ValidTab(nTab) && nTab < static_cast<SCTAB> (maTabs.size()) && maTabs[nTab] ) - maTabs[nTab]->SetStreamValid( bSet, bIgnoreLock ); + if (ScTable* pTable = FetchTable(nTab)) + pTable->SetStreamValid( bSet, bIgnoreLock ); } void ScDocument::LockStreamValid( bool bLock ) @@ -944,16 +914,15 @@ void ScDocument::LockStreamValid( bool bLock ) bool ScDocument::IsPendingRowHeights( SCTAB nTab ) const { - if ( ValidTab(nTab) && nTab < static_cast<SCTAB> (maTabs.size()) && maTabs[nTab] ) - return maTabs[nTab]->IsPendingRowHeights(); - + if (const ScTable* pTable = FetchTable(nTab)) + return pTable->IsPendingRowHeights(); return false; } void ScDocument::SetPendingRowHeights( SCTAB nTab, bool bSet ) { - if ( ValidTab(nTab) && nTab < static_cast<SCTAB> (maTabs.size()) && maTabs[nTab] ) - maTabs[nTab]->SetPendingRowHeights( bSet ); + if (ScTable* pTable = FetchTable(nTab)) + pTable->SetPendingRowHeights(bSet); } sal_uInt16 ScDocument::GetSheetOptimalMinRowHeight(SCTAB nTab) const @@ -967,7 +936,8 @@ sal_uInt16 ScDocument::GetSheetOptimalMinRowHeight(SCTAB nTab) const void ScDocument::SetLayoutRTL( SCTAB nTab, bool bRTL, ScObjectHandling eObjectHandling) { - if ( !(ValidTab(nTab) && nTab < static_cast<SCTAB> (maTabs.size()) && maTabs[nTab]) ) + ScTable* pTable = FetchTable(nTab); + if (!pTable) return; if ( bImportingXML ) @@ -976,12 +946,12 @@ void ScDocument::SetLayoutRTL( SCTAB nTab, bool bRTL, ScObjectHandling eObjectHa // is applied in SetImportingXML(false). This is so the shapes can be loaded in // normal LTR mode. - maTabs[nTab]->SetLoadingRTL( bRTL ); + pTable->SetLoadingRTL( bRTL ); return; } - maTabs[nTab]->SetLayoutRTL( bRTL ); // only sets the flag - maTabs[nTab]->SetDrawPageSize(true, true, eObjectHandling); + pTable->SetLayoutRTL( bRTL ); // only sets the flag + pTable->SetDrawPageSize(true, true, eObjectHandling); // objects are already repositioned via SetDrawPageSize, only writing mode is missing if (!mpDrawLayer) @@ -1003,8 +973,8 @@ void ScDocument::SetLayoutRTL( SCTAB nTab, bool bRTL, ScObjectHandling eObjectHa bool ScDocument::IsLayoutRTL( SCTAB nTab ) const { - if ( ValidTab(nTab) && nTab < static_cast<SCTAB> (maTabs.size()) && maTabs[nTab] ) - return maTabs[nTab]->IsLayoutRTL(); + if (const ScTable* pTable = FetchTable(nTab)) + return pTable->IsLayoutRTL(); return false; } @@ -1027,9 +997,8 @@ bool ScDocument::IsNegativePage( SCTAB nTab ) const bool ScDocument::GetCellArea( SCTAB nTab, SCCOL& rEndCol, SCROW& rEndRow ) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB> (maTabs.size())) - if (maTabs[nTab]) - return maTabs[nTab]->GetCellArea( rEndCol, rEndRow ); + if (HasTable(nTab)) + return maTabs[nTab]->GetCellArea(rEndCol, rEndRow); rEndCol = 0; rEndRow = 0; @@ -1038,9 +1007,8 @@ bool ScDocument::GetCellArea( SCTAB nTab, SCCOL& rEndCol, SCROW& rEndRow ) const bool ScDocument::GetTableArea( SCTAB nTab, SCCOL& rEndCol, SCROW& rEndRow, bool bCalcHiddens) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB> (maTabs.size())) - if (maTabs[nTab]) - return maTabs[nTab]->GetTableArea( rEndCol, rEndRow, bCalcHiddens); + if (const ScTable* pTable = FetchTable(nTab)) + return pTable->GetTableArea(rEndCol, rEndRow, bCalcHiddens); rEndCol = 0; rEndRow = 0; @@ -1049,7 +1017,7 @@ bool ScDocument::GetTableArea( SCTAB nTab, SCCOL& rEndCol, SCROW& rEndRow, bool bool ScDocument::ShrinkToDataArea(SCTAB nTab, SCCOL& rStartCol, SCROW& rStartRow, SCCOL& rEndCol, SCROW& rEndRow) const { - if (!ValidTab(nTab) || nTab >= static_cast<SCTAB> (maTabs.size()) || !maTabs[nTab]) + if (!HasTable(nTab)) return false; SCCOL nCol1, nCol2; @@ -1082,23 +1050,21 @@ bool ScDocument::ShrinkToUsedDataArea( bool& o_bShrunk, SCTAB nTab, SCCOL& rStar SCROW& rStartRow, SCCOL& rEndCol, SCROW& rEndRow, bool bColumnsOnly, bool bStickyTopRow, bool bStickyLeftCol, ScDataAreaExtras* pDataAreaExtras ) const { - if (!ValidTab(nTab) || nTab >= static_cast<SCTAB> (maTabs.size()) || !maTabs[nTab]) + if (const ScTable* pTable = FetchTable(nTab)) { - o_bShrunk = false; - return false; + return pTable->ShrinkToUsedDataArea( + o_bShrunk, rStartCol, rStartRow, rEndCol, rEndRow, bColumnsOnly, bStickyTopRow, + bStickyLeftCol, pDataAreaExtras); } - return maTabs[nTab]->ShrinkToUsedDataArea( - o_bShrunk, rStartCol, rStartRow, rEndCol, rEndRow, bColumnsOnly, bStickyTopRow, - bStickyLeftCol, pDataAreaExtras); + o_bShrunk = false; + return false; } SCROW ScDocument::GetLastDataRow( SCTAB nTab, SCCOL nCol1, SCCOL nCol2, SCROW nLastRow ) const { - const ScTable* pTab = FetchTable(nTab); - if (!pTab) - return -1; - - return pTab->GetLastDataRow(nCol1, nCol2, nLastRow); + if (const ScTable* pTable = FetchTable(nTab)) + return pTable->GetLastDataRow(nCol1, nCol2, nLastRow); + return -1; } // connected area @@ -1106,8 +1072,8 @@ SCROW ScDocument::GetLastDataRow( SCTAB nTab, SCCOL nCol1, SCCOL nCol2, SCROW nL void ScDocument::GetDataArea( SCTAB nTab, SCCOL& rStartCol, SCROW& rStartRow, SCCOL& rEndCol, SCROW& rEndRow, bool bIncludeOld, bool bOnlyDown ) const { - if (ValidTab(nTab) && nTab < static_cast<SCTAB> (maTabs.size()) && maTabs[nTab]) - maTabs[nTab]->GetDataArea( rStartCol, rStartRow, rEndCol, rEndRow, bIncludeOld, bOnlyDown ); + if (const ScTable* pTable = FetchTable(nTab)) + pTable->GetDataArea( rStartCol, rStartRow, rEndCol, rEndRow, bIncludeOld, bOnlyDown ); } bool ScDocument::GetDataAreaSubrange(ScRange& rRange) const @@ -1116,8 +1082,8 @@ bool ScDocument::GetDataAreaSubrange(ScRange& rRange) const if (nTab != rRange.aEnd.Tab()) return true; - if (ValidTab(nTab) && nTab < static_cast<SCTAB> (maTabs.size()) && maTabs[nTab]) - return maTabs[nTab]->GetDataAreaSubrange(rRange); + if (const ScTable* pTable = FetchTable(nTab)) + return pTable->GetDataAreaSubrange(rRange); return true; } @@ -1125,9 +1091,8 @@ bool ScDocument::GetDataAreaSubrange(ScRange& rRange) const void ScDocument::LimitChartArea( SCTAB nTab, SCCOL& rStartCol, SCROW& rStartRow, SCCOL& rEndCol, SCROW& rEndRow ) { - if (ValidTab(nTab) && nTab < static_cast<SCTAB> (maTabs.size())) - if (maTabs[nTab]) - maTabs[nTab]->LimitChartArea( rStartCol, rStartRow, rEndCol, rEndRow ); + if (ScTable* pTable = FetchTable(nTab)) + pTable->LimitChartArea( rStartCol, rStartRow, rEndCol, rEndRow); } void ScDocument::LimitChartIfAll( ScRangeListRef& rRangeList ) @@ -1146,8 +1111,8 @@ void ScDocument::LimitChartIfAll( ScRangeListRef& rRangeList ) SCCOL nEndCol = aRange.aEnd.Col(); SCROW nEndRow = aRange.aEnd.Row(); SCTAB nTab = aRange.aStart.Tab(); - if ( nTab < static_cast<SCTAB> (maTabs.size()) && maTabs[nTab]) - maTabs[nTab]->LimitChartArea(nStartCol, nStartRow, nEndCol, nEndRow); + if (ScTable* pTable = FetchTable(nTab)) + pTable->LimitChartArea(nStartCol, nStartRow, nEndCol, nEndRow); aRange.aStart.SetCol( nStartCol ); aRange.aStart.SetRow( nStartRow ); aRange.aEnd.SetCol( nEndCol ); @@ -1213,7 +1178,7 @@ bool ScDocument::CanInsertRow( const ScRange& rRange ) const SCSIZE nSize = static_cast<SCSIZE>(nEndRow - nStartRow + 1); bool bTest = true; - for (SCTAB i=nStartTab; i<=nEndTab && bTest && i < static_cast<SCTAB>(maTabs.size()); i++) + for (SCTAB i = nStartTab; i <= nEndTab && bTest && i < GetTableCount(); i++) if (maTabs[i]) bTest &= maTabs[i]->TestInsertRow( nStartCol, nEndCol, nStartRow, nSize ); @@ -1267,7 +1232,7 @@ bool ScDocument::InsertRow( SCCOL nStartCol, SCTAB nStartTab, if ( pTabMark ) { nStartTab = 0; - nEndTab = static_cast<SCTAB>(maTabs.size()) -1; + nEndTab = GetTableCount() - 1; } bool bTest = true; @@ -1276,7 +1241,7 @@ bool ScDocument::InsertRow( SCCOL nStartCol, SCTAB nStartTab, SetAutoCalc( false ); // avoid multiple calculations bool oldDelayedDeleteBroadcasters = IsDelayedDeletingBroadcasters(); EnableDelayDeletingBroadcasters( true ); - for ( i = nStartTab; i <= nEndTab && bTest && i < static_cast<SCTAB>(maTabs.size()); i++) + for ( i = nStartTab; i <= nEndTab && bTest && i < GetTableCount(); i++) if (maTabs[i] && (!pTabMark || pTabMark->GetTableSelect(i))) bTest &= maTabs[i]->TestInsertRow(nStartCol, nEndCol, nStartRow, nSize); if (bTest) @@ -1287,7 +1252,7 @@ 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, static_cast<SCTAB>(maTabs.size()) ); + lcl_GetFirstTabRange(nTabRangeStart, nTabRangeEnd, pTabMark, GetTableCount()); ScRange aShiftedRange(nStartCol, nStartRow, nTabRangeStart, nEndCol, MaxRow(), nTabRangeEnd); sc::EndListeningContext aEndListenCxt(*this); @@ -1305,9 +1270,9 @@ bool ScDocument::InsertRow( SCCOL nStartCol, SCTAB nStartTab, UpdateBroadcastAreas(URM_INSDEL, aShiftedRange, 0, static_cast<SCROW>(nSize), 0); } - while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark, static_cast<SCTAB>(maTabs.size()) ) ); + while (lcl_GetNextTabRange(nTabRangeStart, nTabRangeEnd, pTabMark, GetTableCount())); - lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark, static_cast<SCTAB>(maTabs.size()) ); + lcl_GetFirstTabRange(nTabRangeStart, nTabRangeEnd, pTabMark, GetTableCount()); sc::RefUpdateContext aCxt(*this); aCxt.meMode = URM_INSDEL; @@ -1319,20 +1284,20 @@ bool ScDocument::InsertRow( SCCOL nStartCol, SCTAB nStartTab, aCxt.maRange.aEnd.SetTab(nTabRangeEnd); UpdateReference(aCxt, pRefUndoDoc, false); // without drawing objects } - while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark, static_cast<SCTAB>(maTabs.size()) ) ); + while (lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark, GetTableCount())); // UpdateReference should have set "needs listening" flags to those // whose references have been modified. We also need to set this flag // to those that were in the groups that got split by shifting. SetNeedsListeningGroups(aGroupPos); - for (i=nStartTab; i<=nEndTab && i < static_cast<SCTAB>(maTabs.size()); i++) + for (i=nStartTab; i<=nEndTab && i < GetTableCount(); i++) if (maTabs[i] && (!pTabMark || pTabMark->GetTableSelect(i))) maTabs[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 < static_cast<SCTAB>(maTabs.size()); i++) + for (i=nStartTab; i<=nEndTab && i < GetTableCount(); i++) if (maTabs[i] && (!pTabMark || pTabMark->GetTableSelect(i))) maTabs[i]->UpdateDrawRef( URM_INSDEL, nStartCol, nStartRow, nStartTab, nEndCol, MaxRow(), nEndTab, @@ -1390,7 +1355,7 @@ void ScDocument::DeleteRow( SCCOL nStartCol, SCTAB nStartTab, if ( pTabMark ) { nStartTab = 0; - nEndTab = static_cast<SCTAB>(maTabs.size())-1; + nEndTab = GetTableCount() - 1; } sc::AutoCalcSwitch aACSwitch(*this, false); // avoid multiple calculations @@ -1398,7 +1363,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, static_cast<SCTAB>(maTabs.size()) ); + lcl_GetFirstTabRange(nTabRangeStart, nTabRangeEnd, pTabMark, GetTableCount()); do { if ( ValidRow(nStartRow+nSize) ) @@ -1415,13 +1380,13 @@ void ScDocument::DeleteRow( SCCOL nStartCol, SCTAB nStartTab, ScAddress( nStartCol, nStartRow, nTabRangeStart ), ScAddress( nEndCol, MaxRow(), nTabRangeEnd ) ) ); } - while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark, static_cast<SCTAB>(maTabs.size()) ) ); + while (lcl_GetNextTabRange(nTabRangeStart, nTabRangeEnd, pTabMark, GetTableCount())); sc::RefUpdateContext aCxt(*this); const bool bLastRowIncluded = (static_cast<SCROW>(nStartRow + nSize) == GetMaxRowCount() && ValidRow(nStartRow)); if ( ValidRow(nStartRow+nSize) || bLastRowIncluded ) { - lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark, static_cast<SCTAB>(maTabs.size()) ); + lcl_GetFirstTabRange(nTabRangeStart, nTabRangeEnd, pTabMark, GetTableCount()); aCxt.meMode = URM_INSDEL; aCxt.mnRowDelta = -static_cast<SCROW>(nSize); if (bLastRowIncluded) @@ -1437,7 +1402,7 @@ void ScDocument::DeleteRow( SCCOL nStartCol, SCTAB nStartTab, { UpdateReference(aCxt, pRefUndoDoc, true, false); } - while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark, static_cast<SCTAB>(maTabs.size()) ) ); + while (lcl_GetNextTabRange(nTabRangeStart, nTabRangeEnd, pTabMark, GetTableCount())); } if (pUndoOutline) @@ -1447,7 +1412,7 @@ void ScDocument::DeleteRow( SCCOL nStartCol, SCTAB nStartTab, // during row deletion. std::vector<ScAddress> aGroupPos; ... etc. - the rest is truncated