officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu |   16 ++
 sc/inc/SheetViewManager.hxx                                       |    3 
 sc/inc/sc.hrc                                                     |    4 
 sc/qa/unit/tiledrendering/SheetViewTest.cxx                       |   72 
++++++++++
 sc/sdi/scalc.sdi                                                  |   36 +++++
 sc/sdi/tabvwsh.sdi                                                |    2 
 sc/source/core/data/SheetViewManager.cxx                          |   42 +++++
 sc/source/ui/inc/viewdata.hxx                                     |    2 
 sc/source/ui/inc/viewfunc.hxx                                     |   19 ++
 sc/source/ui/unoobj/docuno.cxx                                    |   19 ++
 sc/source/ui/view/tabvwsh3.cxx                                    |   11 +
 sc/source/ui/view/tabvwsha.cxx                                    |   12 -
 sc/source/ui/view/tabvwshc.cxx                                    |    2 
 sc/source/ui/view/viewdata.cxx                                    |   12 +
 sc/source/ui/view/viewfun3.cxx                                    |   60 
++++----
 15 files changed, 271 insertions(+), 41 deletions(-)

New commits:
commit 7a134245d00058cfa409beb1458600c67a424928
Author:     Tomaž Vajngerl <[email protected]>
AuthorDate: Mon Oct 6 23:28:03 2025 +0900
Commit:     Tomaž Vajngerl <[email protected]>
CommitDate: Fri Oct 10 13:59:59 2025 +0200

    sc: add ExitSheetView and SwitchToPreviousSheetView commands
    
    We can already switch to "next" sheet view, so this also adds a
    command to switch to a previous sheet view and to exit a sheet
    view (return to default view).
    
    Change-Id: Ia5c2eead3af4b2bdc0ace6b5e4a2ce5339013f2d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191976
    Tested-by: Jenkins CollaboraOffice <[email protected]>
    Reviewed-by: Miklos Vajna <[email protected]>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/192148
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <[email protected]>

diff --git a/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu 
b/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu
index 4360735bd040..a9d1175b75c4 100644
--- a/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu
@@ -2717,6 +2717,22 @@
           <value>1</value>
         </prop>
       </node>
+      <node oor:name=".uno:SwitchToPreviousSheetView" oor:op="replace">
+        <prop oor:name="Label" oor:type="xs:string">
+          <value xml:lang="en-US">Switch To Previous Sheet View</value>
+        </prop>
+        <prop oor:name="Properties" oor:type="xs:int">
+          <value>1</value>
+        </prop>
+      </node>
+      <node oor:name=".uno:ExitSheetView" oor:op="replace">
+        <prop oor:name="Label" oor:type="xs:string">
+          <value xml:lang="en-US">Exit Sheet View</value>
+        </prop>
+        <prop oor:name="Properties" oor:type="xs:int">
+          <value>1</value>
+        </prop>
+      </node>
       <node oor:name=".uno:AssignMacro" oor:op="replace">
         <prop oor:name="Label" oor:type="xs:string">
           <value xml:lang="en-US">Assign Macro...</value>
diff --git a/sc/inc/SheetViewManager.hxx b/sc/inc/SheetViewManager.hxx
index d74d774bdedc..b8562c568eeb 100644
--- a/sc/inc/SheetViewManager.hxx
+++ b/sc/inc/SheetViewManager.hxx
@@ -53,6 +53,9 @@ public:
     /** Calculate the next sheet view ID from the current ID. */
     SheetViewID getNextSheetView(SheetViewID nID);
 
+    /** Calculate the previous sheet view ID from the current ID. */
+    SheetViewID getPreviousSheetView(SheetViewID nID);
+
     void unsyncAllSheetViews();
 };
 }
diff --git a/sc/inc/sc.hrc b/sc/inc/sc.hrc
index 2a1181655748..cd2e11463981 100644
--- a/sc/inc/sc.hrc
+++ b/sc/inc/sc.hrc
@@ -287,7 +287,9 @@ class SvxZoomSliderItem;
 #define FID_TOGGLEFORMULA       (VIEW_MENU_START + 10)
 #define FID_NEW_SHEET_VIEW      (VIEW_MENU_START + 11)
 #define FID_REMOVE_SHEET_VIEW   (VIEW_MENU_START + 12)
-#define FID_SWITCH_TO_NEXT_SHEET_VIEW (VIEW_MENU_START + 13)
+#define FID_SWITCH_TO_NEXT_SHEET_VIEW     (VIEW_MENU_START + 13)
+#define FID_SWITCH_TO_PREVIOUS_SHEET_VIEW (VIEW_MENU_START + 14)
+#define FID_EXIT_SHEET_VIEW     (VIEW_MENU_START + 15)
 
 #define FID_CHG_ACCEPT          (VIEW_MENU_START + 18)// DANGER DIRTY ID
 #define FID_CHG_COMMENT         (VIEW_MENU_START + 19)// DANGER DIRTY ID
diff --git a/sc/qa/unit/tiledrendering/SheetViewTest.cxx 
b/sc/qa/unit/tiledrendering/SheetViewTest.cxx
index 5b84c1471683..e4c61008fd97 100644
--- a/sc/qa/unit/tiledrendering/SheetViewTest.cxx
+++ b/sc/qa/unit/tiledrendering/SheetViewTest.cxx
@@ -406,6 +406,78 @@ CPPUNIT_TEST_FIXTURE(SheetViewTest, 
testSheetViewOperationRestrictions_SheetView
     CPPUNIT_ASSERT_EQUAL(true, pSheetView2->isSynced());
 }
 
+CPPUNIT_TEST_FIXTURE(SheetViewTest, testSheetViewManager)
+{
+    sc::SheetViewID nNonExistingID = 99;
+
+    // Empty
+    sc::SheetViewManager maSheetViewManager;
+    CPPUNIT_ASSERT_EQUAL(sc::DefaultSheetViewID,
+                         
maSheetViewManager.getNextSheetView(sc::DefaultSheetViewID));
+    CPPUNIT_ASSERT_EQUAL(sc::DefaultSheetViewID,
+                         maSheetViewManager.getNextSheetView(0)); // First non 
existing
+    CPPUNIT_ASSERT_EQUAL(sc::DefaultSheetViewID,
+                         maSheetViewManager.getNextSheetView(1)); // Next non 
existing
+    CPPUNIT_ASSERT_EQUAL(sc::DefaultSheetViewID,
+                         maSheetViewManager.getNextSheetView(nNonExistingID));
+    CPPUNIT_ASSERT_EQUAL(sc::InvalidSheetViewID,
+                         
maSheetViewManager.getNextSheetView(sc::InvalidSheetViewID));
+    CPPUNIT_ASSERT_EQUAL(sc::InvalidSheetViewID, 
maSheetViewManager.getNextSheetView(-99));
+
+    CPPUNIT_ASSERT_EQUAL(sc::DefaultSheetViewID,
+                         
maSheetViewManager.getPreviousSheetView(sc::DefaultSheetViewID));
+    CPPUNIT_ASSERT_EQUAL(sc::DefaultSheetViewID,
+                         maSheetViewManager.getPreviousSheetView(0)); // First 
non existing
+    CPPUNIT_ASSERT_EQUAL(sc::DefaultSheetViewID,
+                         maSheetViewManager.getPreviousSheetView(1)); // Next 
non existing
+    CPPUNIT_ASSERT_EQUAL(sc::DefaultSheetViewID,
+                         
maSheetViewManager.getPreviousSheetView(nNonExistingID));
+    CPPUNIT_ASSERT_EQUAL(sc::InvalidSheetViewID,
+                         
maSheetViewManager.getPreviousSheetView(sc::InvalidSheetViewID));
+    CPPUNIT_ASSERT_EQUAL(sc::InvalidSheetViewID, 
maSheetViewManager.getPreviousSheetView(-99));
+
+    // Add ID 1
+    auto nID1 = maSheetViewManager.create(nullptr);
+    CPPUNIT_ASSERT(maSheetViewManager.get(nID1));
+
+    CPPUNIT_ASSERT_EQUAL(nID1, 
maSheetViewManager.getNextSheetView(sc::DefaultSheetViewID));
+    CPPUNIT_ASSERT_EQUAL(sc::DefaultSheetViewID, 
maSheetViewManager.getNextSheetView(nID1));
+    CPPUNIT_ASSERT_EQUAL(sc::DefaultSheetViewID,
+                         maSheetViewManager.getNextSheetView(nNonExistingID));
+    CPPUNIT_ASSERT_EQUAL(sc::InvalidSheetViewID,
+                         
maSheetViewManager.getNextSheetView(sc::InvalidSheetViewID));
+    CPPUNIT_ASSERT_EQUAL(sc::InvalidSheetViewID, 
maSheetViewManager.getNextSheetView(-99));
+
+    CPPUNIT_ASSERT_EQUAL(sc::DefaultSheetViewID, 
maSheetViewManager.getPreviousSheetView(nID1));
+    CPPUNIT_ASSERT_EQUAL(nID1, 
maSheetViewManager.getPreviousSheetView(sc::DefaultSheetViewID));
+    CPPUNIT_ASSERT_EQUAL(sc::DefaultSheetViewID,
+                         
maSheetViewManager.getPreviousSheetView(nNonExistingID));
+    CPPUNIT_ASSERT_EQUAL(sc::InvalidSheetViewID,
+                         
maSheetViewManager.getPreviousSheetView(sc::InvalidSheetViewID));
+    CPPUNIT_ASSERT_EQUAL(sc::InvalidSheetViewID, 
maSheetViewManager.getPreviousSheetView(-99));
+
+    // Add ID 2
+    auto nID2 = maSheetViewManager.create(nullptr);
+    CPPUNIT_ASSERT(maSheetViewManager.get(nID2));
+    CPPUNIT_ASSERT_EQUAL(nID1, 
maSheetViewManager.getNextSheetView(sc::DefaultSheetViewID));
+    CPPUNIT_ASSERT_EQUAL(nID2, maSheetViewManager.getNextSheetView(nID1));
+    CPPUNIT_ASSERT_EQUAL(sc::DefaultSheetViewID, 
maSheetViewManager.getNextSheetView(nID2));
+    CPPUNIT_ASSERT_EQUAL(sc::DefaultSheetViewID,
+                         maSheetViewManager.getNextSheetView(nNonExistingID));
+    CPPUNIT_ASSERT_EQUAL(sc::InvalidSheetViewID,
+                         
maSheetViewManager.getNextSheetView(sc::InvalidSheetViewID));
+    CPPUNIT_ASSERT_EQUAL(sc::InvalidSheetViewID, 
maSheetViewManager.getNextSheetView(-99));
+
+    CPPUNIT_ASSERT_EQUAL(nID2, 
maSheetViewManager.getPreviousSheetView(sc::DefaultSheetViewID));
+    CPPUNIT_ASSERT_EQUAL(nID1, maSheetViewManager.getPreviousSheetView(nID2));
+    CPPUNIT_ASSERT_EQUAL(sc::DefaultSheetViewID, 
maSheetViewManager.getPreviousSheetView(nID1));
+    CPPUNIT_ASSERT_EQUAL(sc::DefaultSheetViewID,
+                         
maSheetViewManager.getPreviousSheetView(nNonExistingID));
+    CPPUNIT_ASSERT_EQUAL(sc::InvalidSheetViewID,
+                         
maSheetViewManager.getPreviousSheetView(sc::InvalidSheetViewID));
+    CPPUNIT_ASSERT_EQUAL(sc::InvalidSheetViewID, 
maSheetViewManager.getPreviousSheetView(-99));
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/sdi/scalc.sdi b/sc/sdi/scalc.sdi
index 98f4c02599ed..e05cfa78c43b 100644
--- a/sc/sdi/scalc.sdi
+++ b/sc/sdi/scalc.sdi
@@ -6103,6 +6103,42 @@ SfxBoolItem SwitchToNextSheetView 
FID_SWITCH_TO_NEXT_SHEET_VIEW
     GroupId = SfxGroupId::View
 ]
 
+SfxBoolItem SwitchToPreviousSheetView FID_SWITCH_TO_PREVIOUS_SHEET_VIEW
+[
+    /* flags */
+    AutoUpdate = FALSE,
+    FastCall = FALSE,
+    ReadOnlyDoc = TRUE,
+    Toggle = FALSE,
+    Container = FALSE,
+    RecordAbsolute = FALSE,
+    RecordPerSet;
+
+    /* config */
+    AccelConfig = TRUE,
+    MenuConfig = FALSE,
+    ToolBoxConfig = FALSE,
+    GroupId = SfxGroupId::View
+]
+
+SfxBoolItem ExitSheetView FID_EXIT_SHEET_VIEW
+[
+    /* flags */
+    AutoUpdate = FALSE,
+    FastCall = FALSE,
+    ReadOnlyDoc = TRUE,
+    Toggle = FALSE,
+    Container = FALSE,
+    RecordAbsolute = FALSE,
+    RecordPerSet;
+
+    /* config */
+    AccelConfig = TRUE,
+    MenuConfig = FALSE,
+    ToolBoxConfig = FALSE,
+    GroupId = SfxGroupId::View
+]
+
 SfxBoolItem ViewValueHighlighting FID_TOGGLESYNTAX
 
 [
diff --git a/sc/sdi/tabvwsh.sdi b/sc/sdi/tabvwsh.sdi
index 7cf74e75c17e..e3bb2dfedbcb 100644
--- a/sc/sdi/tabvwsh.sdi
+++ b/sc/sdi/tabvwsh.sdi
@@ -210,6 +210,8 @@ interface TableEditView
     FID_NEW_SHEET_VIEW  [ ExecMethod = Execute; StateMethod = GetState; ]
     FID_REMOVE_SHEET_VIEW [ ExecMethod = Execute; StateMethod = GetState; ]
     FID_SWITCH_TO_NEXT_SHEET_VIEW [ ExecMethod = Execute; StateMethod = 
GetState; ]
+    FID_SWITCH_TO_PREVIOUS_SHEET_VIEW [ ExecMethod = Execute; StateMethod = 
GetState; ]
+    FID_EXIT_SHEET_VIEW [ ExecMethod = Execute; StateMethod = GetState; ]
     FID_NORMALVIEWMODE  [ ExecMethod = Execute; StateMethod = GetState; ]
     FID_PAGEBREAKMODE   [ ExecMethod = Execute; StateMethod = GetState; ]
     SID_REPAINT         [ ExecMethod = Execute; StateMethod = GetState; ]
diff --git a/sc/source/core/data/SheetViewManager.cxx 
b/sc/source/core/data/SheetViewManager.cxx
index 6ddc9c72f76d..ca8cbd38b169 100644
--- a/sc/source/core/data/SheetViewManager.cxx
+++ b/sc/source/core/data/SheetViewManager.cxx
@@ -46,11 +46,14 @@ std::shared_ptr<SheetView> 
SheetViewManager::get(SheetViewID nID) const
 /// Calculate the next existing sheet view to use.
 SheetViewID SheetViewManager::getNextSheetView(SheetViewID nID)
 {
+    if (nID != DefaultSheetViewID && nID < 0)
+        return InvalidSheetViewID;
+
     if (maViews.empty())
         return DefaultSheetViewID;
 
     // Set to max, so we prevent the for loop to run
-    size_t startIndex = std::numeric_limits<size_t>::max();
+    sal_Int32 startIndex = std::numeric_limits<sal_Int32>::max();
 
     // Start with first index and search for the first sheet view in for loop.
     if (nID == DefaultSheetViewID)
@@ -61,10 +64,43 @@ SheetViewID SheetViewManager::getNextSheetView(SheetViewID 
nID)
     // for then next valid sheet view in the for loop.
     else if (isValidSheetViewID(nID))
     {
-        startIndex = size_t(nID) + 1;
+        startIndex = sal_Int32(nID) + 1;
+    }
+
+    for (sal_Int32 nIndex = startIndex; nIndex < sal_Int32(maViews.size()); 
++nIndex)
+    {
+        if (maViews[nIndex])
+            return SheetViewID(nIndex);
+    }
+
+    return DefaultSheetViewID;
+}
+
+/// Calculate the previous existing sheet view to use.
+SheetViewID SheetViewManager::getPreviousSheetView(SheetViewID nID)
+{
+    if (nID != DefaultSheetViewID && nID < 0)
+        return InvalidSheetViewID;
+
+    if (maViews.empty())
+        return DefaultSheetViewID;
+
+    // Set to -1, so we prevent the for loop to run
+    sal_Int32 startIndex = -1;
+
+    // Start with first index and search for the first sheet view in for loop.
+    if (nID == DefaultSheetViewID)
+    {
+        startIndex = sal_Int32(maViews.size()) - 1;
+    }
+    // If we assume currnet ID is valid, so set the start to current + 1 to 
search
+    // for then next valid sheet view in the for loop.
+    else if (isValidSheetViewID(nID))
+    {
+        startIndex = sal_Int32(nID) - 1;
     }
 
-    for (size_t nIndex = startIndex; nIndex < maViews.size(); ++nIndex)
+    for (sal_Int32 nIndex = startIndex; nIndex >= 0; --nIndex)
     {
         if (maViews[nIndex])
             return SheetViewID(nIndex);
diff --git a/sc/source/ui/inc/viewfunc.hxx b/sc/source/ui/inc/viewfunc.hxx
index 47ab774a017e..5385f4f8d857 100644
--- a/sc/source/ui/inc/viewfunc.hxx
+++ b/sc/source/ui/inc/viewfunc.hxx
@@ -67,6 +67,18 @@ struct ScDataFormFragment
     ScDataFormFragment(weld::Grid* pGrid, int nLine);
 };
 
+namespace sc
+{
+
+/** Direction of searching for the sheet view to switch to relative to the 
current sheet view. */
+enum class SwitchSheetViewDirection
+{
+    Next,
+    Previous
+};
+
+}
+
 class ScViewFunc : public ScTabView
 {
 private:
@@ -354,9 +366,11 @@ public:
     void            DoAutoAttributes( SCCOL nCol, SCROW nRow, SCTAB nTab,
                                         bool bAttrChanged );
 
+    // SheetView methods
     void MakeNewSheetView();
     void RemoveCurrentSheetView();
-    void SwitchSheetView();
+    void SwitchSheetView(sc::SwitchSheetViewDirection eDirection);
+    void ExitSheetView(); // Switch to default view
 
                                                 // Internal helper functions
 protected:
@@ -366,6 +380,9 @@ protected:
                                      bool                 bColor );
 
 private:
+    // SheetView Private
+    void SheetViewChanged();
+
     void            PasteRTF( SCCOL nCol, SCROW nStartRow,
                                 const css::uno::Reference< 
css::datatransfer::XTransferable >& rxTransferable );
 
diff --git a/sc/source/ui/view/tabvwsh3.cxx b/sc/source/ui/view/tabvwsh3.cxx
index abd3eb7a76d4..9fb981539321 100644
--- a/sc/source/ui/view/tabvwsh3.cxx
+++ b/sc/source/ui/view/tabvwsh3.cxx
@@ -1046,16 +1046,21 @@ void ScTabViewShell::Execute( SfxRequest& rReq )
             }
             break;
 
+        // Handle sheet views
         case FID_NEW_SHEET_VIEW:
             MakeNewSheetView();
         break;
-
         case FID_REMOVE_SHEET_VIEW:
             RemoveCurrentSheetView();
         break;
-
         case FID_SWITCH_TO_NEXT_SHEET_VIEW:
-            SwitchSheetView();
+            SwitchSheetView(sc::SwitchSheetViewDirection::Next);
+        break;
+        case FID_SWITCH_TO_PREVIOUS_SHEET_VIEW:
+            SwitchSheetView(sc::SwitchSheetViewDirection::Previous);
+        break;
+        case FID_EXIT_SHEET_VIEW:
+            ExitSheetView();
         break;
 
         case SID_ATTR_ZOOM: // status row
diff --git a/sc/source/ui/view/tabvwsha.cxx b/sc/source/ui/view/tabvwsha.cxx
index 17bd167dcf24..f1521d0fc25d 100644
--- a/sc/source/ui/view/tabvwsha.cxx
+++ b/sc/source/ui/view/tabvwsha.cxx
@@ -398,15 +398,17 @@ void ScTabViewShell::GetState( SfxItemSet& rSet )
             case FID_NEW_SHEET_VIEW:
             case FID_REMOVE_SHEET_VIEW:
             case FID_SWITCH_TO_NEXT_SHEET_VIEW:
+            case FID_SWITCH_TO_PREVIOUS_SHEET_VIEW:
+            case FID_EXIT_SHEET_VIEW:
                 {
                     if (GetViewData().GetDocShell().IsReadOnly() || 
IsCurrentLokViewReadOnly())
                     {
-                        rSet.DisableItem(FID_NEW_SHEET_VIEW);
-                        rSet.DisableItem(FID_REMOVE_SHEET_VIEW);
-                        rSet.DisableItem(FID_SWITCH_TO_NEXT_SHEET_VIEW);
+                        rSet.DisableItem(nWhich);
+                    }
+                    else if (nWhich == FID_REMOVE_SHEET_VIEW && 
GetViewData().GetSheetViewID() == sc::DefaultSheetViewID)
+                    {
+                        rSet.DisableItem(nWhich);
                     }
-                    if (nWhich == FID_REMOVE_SHEET_VIEW && 
GetViewData().GetSheetViewID() == sc::DefaultSheetViewID)
-                        rSet.DisableItem(FID_REMOVE_SHEET_VIEW);
                 }
                 break;
 
diff --git a/sc/source/ui/view/viewfun3.cxx b/sc/source/ui/view/viewfun3.cxx
index 89cbdd18ddc0..4953a9bb3c78 100644
--- a/sc/source/ui/view/viewfun3.cxx
+++ b/sc/source/ui/view/viewfun3.cxx
@@ -2061,6 +2061,13 @@ void ScViewFunc::DataFormPutData( SCROW nCurrentRow ,
     rDocSh.UpdateOle(GetViewData());
 }
 
+void ScViewFunc::SheetViewChanged()
+{
+    ScDocShell& rDocSh = GetViewData().GetDocShell();
+    ScDocument& rDocument = GetViewData().GetDocument();
+    rDocSh.PostPaint(0,0,0, rDocument.MaxCol(), rDocument.MaxRow(), MAXTAB, 
PaintPartFlags::All);
+}
+
 void ScViewFunc::MakeNewSheetView()
 {
     SCTAB nTab = GetViewData().GetTabNumber();
@@ -2076,16 +2083,10 @@ void ScViewFunc::MakeNewSheetView()
 
     GetViewData().SetSheetViewID(nSheetViewID);
 
-    // Update
-    GetViewData().SetTabNo(nSheetViewTab); // force add the sheet view tab
-    GetViewData().SetTabNo(nTab); // then change back to the current tab
-
-    ScDocShell& rDocSh = GetViewData().GetDocShell();
-    rDocSh.PostPaintGridAll();
-    PaintExtras(); // update Tab Control
-
     GetViewData().GetDocShell().Broadcast(ScTablesHint(SC_TAB_INSERTED, 
nSheetViewTab));
     SfxGetpApp()->Broadcast(SfxHint(SfxHintId::ScTablesChanged));
+
+    SheetViewChanged();
 }
 
 void ScViewFunc::RemoveCurrentSheetView()
@@ -2100,17 +2101,17 @@ void ScViewFunc::RemoveCurrentSheetView()
     if (!pSheetManager)
         return;
 
+    GetViewData().SetSheetViewID(sc::DefaultSheetViewID);
+
     SCTAB nSheetViewTab = rDocument.GetSheetViewNumber(nTab, nSheetViewID);
     pSheetManager->remove(nSheetViewID);
-    GetViewData().SetSheetViewID(sc::DefaultSheetViewID);
-    GetViewData().SetTabNo(nTab);
+
     GetViewData().GetDocFunc().DeleteTable(nSheetViewTab, true);
 
-    GetViewData().GetDocShell().PostPaintGridAll();
-    PaintExtras();
+    SheetViewChanged();
 }
 
-void ScViewFunc::SwitchSheetView()
+void ScViewFunc::SwitchSheetView(sc::SwitchSheetViewDirection eDirection)
 {
     SCTAB nTab = GetViewData().GetTabNumber();
     ScDocument& rDocument = GetViewData().GetDocument();
@@ -2119,21 +2120,30 @@ void ScViewFunc::SwitchSheetView()
 
     sc::SheetViewID nSheetViewID = GetViewData().GetSheetViewID();
     auto pSheetManager = rDocument.GetSheetViewManager(nTab);
-    sc::SheetViewID nNextSheetViewID = 
pSheetManager->getNextSheetView(nSheetViewID);
 
-    GetViewData().SetSheetViewID(nNextSheetViewID);
+    sc::SheetViewID nSwitchSheetViewID = eDirection == 
sc::SwitchSheetViewDirection::Next
+                                            ? 
pSheetManager->getNextSheetView(nSheetViewID)
+                                            : 
pSheetManager->getPreviousSheetView(nSheetViewID);
 
-    if (nNextSheetViewID != sc::DefaultSheetViewID)
-    {
-        SCTAB nNextSheetViewTab = rDocument.GetSheetViewNumber(nTab, 
nNextSheetViewID);
-        GetViewData().SetTabNo(nNextSheetViewTab); // force add the sheet view 
tab
-    }
+    GetViewData().SetSheetViewID(nSwitchSheetViewID);
 
-    // Update
-    GetViewData().SetTabNo(nTab); // then change back to the current tab
-    ScDocShell& rDocSh = GetViewData().GetDocShell();
-    rDocSh.PostPaintGridAll();
-    PaintExtras(); // update Tab Control
+    SheetViewChanged();
+}
+
+void ScViewFunc::ExitSheetView()
+{
+    SCTAB nTab = GetViewData().GetTabNumber();
+    ScDocument& rDocument = GetViewData().GetDocument();
+    if (rDocument.IsSheetView(nTab))
+        return;
+
+    sc::SheetViewID nSheetViewID = GetViewData().GetSheetViewID();
+    if (nSheetViewID == sc::DefaultSheetViewID)
+        return;
+
+    GetViewData().SetSheetViewID(sc::DefaultSheetViewID);
+
+    SheetViewChanged();
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 5e7d58e7952106dcf3d441d63d0d86862327445d
Author:     Tomaž Vajngerl <[email protected]>
AuthorDate: Mon Oct 6 23:50:29 2025 +0900
Commit:     Tomaž Vajngerl <[email protected]>
CommitDate: Fri Oct 10 13:59:51 2025 +0200

    sc: send sheet view information as part properties via LOKit
    
    This sends the information needed for online to handle show the
    sheets are using the sheet view functionality and to show if the
    sheet view is synched with the default view or not.
    
    Change getPart to return GetTabNumber instead of CurrentTabForData
    or the code will select the wrong sheet when we create or switch to
    a sheet view.
    
    Change-Id: I6990af757f60a9a33594e3991dec8b5b3b278b54
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191977
    Reviewed-by: Miklos Vajna <[email protected]>
    Tested-by: Jenkins CollaboraOffice <[email protected]>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/192147
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <[email protected]>

diff --git a/sc/source/ui/inc/viewdata.hxx b/sc/source/ui/inc/viewdata.hxx
index e6e5c1b56559..deb49ad11aa3 100644
--- a/sc/source/ui/inc/viewdata.hxx
+++ b/sc/source/ui/inc/viewdata.hxx
@@ -421,6 +421,8 @@ public:
         return pThisTab->mnSheetViewID;
     }
 
+    sc::SheetViewID GetSheetViewIDForSheet(SCTAB nTab) const;
+
     SCCOL           MaxCol() const                          { return 
mrDoc.MaxCol(); }
     SCROW           MaxRow() const                          { return 
mrDoc.MaxRow(); }
     ScSplitPos      GetActivePart() const                   { return 
pThisTab->eWhichActive; }
diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx
index 334b46f50f65..afb880509a69 100644
--- a/sc/source/ui/unoobj/docuno.cxx
+++ b/sc/source/ui/unoobj/docuno.cxx
@@ -137,6 +137,7 @@
 #include <formulaopt.hxx>
 #include <output.hxx>
 #include <stlpool.hxx>
+#include <SheetViewManager.hxx>
 
 #include <strings.hrc>
 
@@ -646,9 +647,21 @@ OUString ScModelObj::getPartInfo( int nPart )
     ScViewData* pViewData = ScDocShell::GetViewData();
     if (!pViewData)
         return OUString();
+    ScDocument& rDocument = pViewData->GetDocument();
+    const bool bIsVisible = rDocument.IsVisible(nPart);
+    const bool bIsProtected = rDocument.IsTabProtected(nPart);
+    const sc::SheetViewID nSheetViewID = 
pViewData->GetSheetViewIDForSheet(nPart);
+
+    bool nSheetViewSynced = true;
+
+    if (auto pSheetViewManager = rDocument.GetSheetViewManager(nPart))
+    {
+        if (auto pSheetView = pSheetViewManager->get(nSheetViewID))
+        {
+            nSheetViewSynced = pSheetView->isSynced();
+        }
+    }
 
-    const bool bIsVisible = pViewData->GetDocument().IsVisible(nPart);
-    const bool bIsProtected = pViewData->GetDocument().IsTabProtected(nPart);
     //FIXME: Implement IsSelected().
     const bool bIsSelected = false; 
//pViewData->GetDocument()->IsSelected(nPart);
     const bool bIsRTLLayout = pViewData->GetDocument().IsLayoutRTL(nPart);
@@ -657,6 +670,8 @@ OUString ScModelObj::getPartInfo( int nPart )
     jsonWriter.put("visible", static_cast<unsigned int>(bIsVisible));
     jsonWriter.put("rtllayout", static_cast<unsigned int>(bIsRTLLayout));
     jsonWriter.put("protected", static_cast<unsigned int>(bIsProtected));
+    jsonWriter.put("sheetviewid", int32_t(nSheetViewID));
+    jsonWriter.put("sheetviewsynced", uint32_t(nSheetViewSynced));
     jsonWriter.put("selected", static_cast<unsigned int>(bIsSelected));
 
     OUString tabName;
diff --git a/sc/source/ui/view/tabvwshc.cxx b/sc/source/ui/view/tabvwshc.cxx
index 574c180ecfdd..74a02fcdad22 100644
--- a/sc/source/ui/view/tabvwshc.cxx
+++ b/sc/source/ui/view/tabvwshc.cxx
@@ -455,7 +455,7 @@ std::shared_ptr<SfxModelessDialogController> 
ScTabViewShell::CreateRefDialogCont
 
 int ScTabViewShell::getPart() const
 {
-    return GetViewData().CurrentTabForData();
+    return GetViewData().GetTabNumber();
 }
 
 void ScTabViewShell::afterCallbackRegistered()
diff --git a/sc/source/ui/view/viewdata.cxx b/sc/source/ui/view/viewdata.cxx
index 072089cf7eff..b629c9a4719c 100644
--- a/sc/source/ui/view/viewdata.cxx
+++ b/sc/source/ui/view/viewdata.cxx
@@ -4446,4 +4446,16 @@ SCTAB ScViewData::CurrentTabForData() const
     return GetTabNumber();
 }
 
+sc::SheetViewID ScViewData::GetSheetViewIDForSheet(SCTAB nTab) const
+{
+    if (!IsValidTabNumber(nTab))
+        return sc::InvalidSheetViewID;
+
+    if (!maTabData[nTab])
+        return sc::InvalidSheetViewID;
+
+    return maTabData[nTab]->mnSheetViewID;
+}
+
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Reply via email to