sc/source/ui/inc/viewdata.hxx | 2 ++ sc/source/ui/view/viewdata.cxx | 31 +++++++++++++++++++------------ 2 files changed, 21 insertions(+), 12 deletions(-)
New commits: commit 8d7ccf294ccac7efd978beaa2fe38c101620f4b4 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Thu Sep 4 17:10:53 2025 +0200 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Tue Sep 16 09:27:36 2025 +0200 sc: fix scrolling in sheet view, add check if a tab no. is valid Scrolling needs to use the tab number of the actual sheet we are currently using in the UI. The same goes for the grid. Added a function to check if a tab number is currently valid, to reduce duplication and to make the code a bit more readable. Change-Id: I4e76a61efaa3632b020cfd75ea77c0809f08f6da Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190598 Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> Tested-by: Jenkins (cherry picked from commit 202a1fead00d235c2b7e330d906e852a0e597380) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190945 Reviewed-by: Miklos Vajna <vmik...@collabora.com> Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> diff --git a/sc/source/ui/inc/viewdata.hxx b/sc/source/ui/inc/viewdata.hxx index de43cb5cff2b..9ca329fbd47e 100644 --- a/sc/source/ui/inc/viewdata.hxx +++ b/sc/source/ui/inc/viewdata.hxx @@ -352,6 +352,8 @@ private: ScViewData(ScDocument* pDoc, ScDocShell* pDocSh, ScTabViewShell* pViewSh); + bool IsValidTabNumber(SCTAB nTabNumber) const; + public: ScViewData( ScDocShell& rDocSh, ScTabViewShell* pViewSh ); ScViewData( ScDocument& rDoc ); diff --git a/sc/source/ui/view/viewdata.cxx b/sc/source/ui/view/viewdata.cxx index c4c819cf0b90..de07b7903dfd 100644 --- a/sc/source/ui/view/viewdata.cxx +++ b/sc/source/ui/view/viewdata.cxx @@ -880,9 +880,15 @@ ScViewData::~ScViewData() COVERITY_NOEXCEPT_FALSE ScDBFunc* ScViewData::GetView() const { return pView; } +bool ScViewData::IsValidTabNumber(SCTAB nTabNumber) const +{ + return nTabNumber >= 0 || o3tl::make_unsigned(nTabNumber) < maTabData.size(); +} + void ScViewData::UpdateCurrentTab() { - assert(0 <= mnTabNumber && o3tl::make_unsigned(mnTabNumber) < maTabData.size()); + assert(IsValidTabNumber(GetTabNumber())); + pThisTab = maTabData[mnTabNumber].get(); while (!pThisTab) { @@ -931,7 +937,8 @@ void ScViewData::InsertTabs( SCTAB nTab, SCTAB nNewSheets ) void ScViewData::DeleteTab( SCTAB nTab ) { - assert(nTab < static_cast<SCTAB>(maTabData.size())); + assert(IsValidTabNumber(nTab)); + maTabData.erase(maTabData.begin() + nTab); if (o3tl::make_unsigned(GetTabNumber()) >= maTabData.size()) @@ -1127,7 +1134,7 @@ void ScViewData::SetZoom( const Fraction& rNewX, const Fraction& rNewY, bool bAl void ScViewData::SetShowGrid( bool bShow ) { CreateSelectedTabData(); - maTabData[CurrentTabForData()]->bShowGrid = bShow; + maTabData[GetTabNumber()]->bShowGrid = bShow; } bool ScViewData::GetPrintGrid() const @@ -1492,7 +1499,7 @@ SCROW ScViewData::GetPosY( ScVSplitPos eWhich, SCTAB nForTab ) const ScViewDataTable* ScViewData::FetchTableData(SCTAB nTabIndex) const { - if (!ValidTab(nTabIndex) || (nTabIndex >= static_cast<SCTAB>(maTabData.size()))) + if (!ValidTab(nTabIndex) || !IsValidTabNumber(nTabIndex)) return nullptr; ScViewDataTable* pRet = maTabData[nTabIndex].get(); SAL_WARN_IF(!pRet, "sc.viewdata", "ScViewData::FetchTableData: hidden sheet = " << nTabIndex); @@ -2505,12 +2512,12 @@ Point ScViewData::GetScrPos( SCCOL nWhereX, SCROW nWhereY, ScSplitPos eWhich, } if (nForTab == -1) - nForTab = CurrentTabForData(); - bool bForCurTab = (nForTab == CurrentTabForData()); + nForTab = GetTabNumber(); + bool bForCurTab = (nForTab == GetTabNumber()); if (!bForCurTab && (!ValidTab(nForTab) || (nForTab >= static_cast<SCTAB>(maTabData.size())))) { SAL_WARN("sc.viewdata", "ScViewData::GetScrPos : invalid nForTab = " << nForTab); - nForTab = CurrentTabForData(); + nForTab = GetTabNumber(); bForCurTab = true; } @@ -4133,7 +4140,7 @@ bool ScViewData::IsOle() const bool ScViewData::UpdateFixX( SCTAB nTab ) // true = value changed { if (!ValidTab(nTab)) // Default - nTab = CurrentTabForData(); // current table + nTab = GetTabNumber(); // current table if (!pView || maTabData[nTab]->eHSplitMode != SC_SPLIT_FIX) return false; @@ -4157,7 +4164,7 @@ bool ScViewData::UpdateFixX( SCTAB nTab ) // true = value changed if (nNewPos != maTabData[nTab]->nHSplitPos) { maTabData[nTab]->nHSplitPos = nNewPos; - if (nTab == CurrentTabForData()) + if (nTab == GetTabNumber()) RecalcPixPos(); // should not be needed return true; } @@ -4168,7 +4175,7 @@ bool ScViewData::UpdateFixX( SCTAB nTab ) // true = value changed bool ScViewData::UpdateFixY( SCTAB nTab ) // true = value changed { if (!ValidTab(nTab)) // Default - nTab = CurrentTabForData(); // current table + nTab = GetTabNumber(); // current table if (!pView || maTabData[nTab]->eVSplitMode != SC_SPLIT_FIX) return false; @@ -4192,7 +4199,7 @@ bool ScViewData::UpdateFixY( SCTAB nTab ) // true = value changed if (nNewPos != maTabData[nTab]->nVSplitPos) { maTabData[nTab]->nVSplitPos = nNewPos; - if (nTab == CurrentTabForData()) + if (nTab == GetTabNumber()) RecalcPixPos(); // should not be needed return true; } @@ -4340,7 +4347,7 @@ bool ScViewData::SetLOKSheetFreezeIndex(const SCCOLROW nFreezeIndex, bool bIsCol { nForTab = CurrentTabForData(); } - else if (!ValidTab(nForTab) || (nForTab >= static_cast<SCTAB>(maTabData.size()))) + else if (!ValidTab(nForTab) || !IsValidTabNumber(nForTab)) { SAL_WARN("sc.viewdata", "ScViewData::SetLOKSheetFreezeIndex : invalid nForTab = " << nForTab); return false;