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;

Reply via email to