officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu |   16 ++
 sc/inc/SheetView.hxx                                              |    7 -
 sc/inc/document.hxx                                               |    2 
 sc/inc/sc.hrc                                                     |    2 
 sc/inc/table.hxx                                                  |    2 
 sc/sdi/scalc.sdi                                                  |   35 ++++++
 sc/sdi/tabvwsh.sdi                                                |    4 
 sc/source/core/data/SheetViewManager.cxx                          |   41 
+++++++
 sc/source/core/data/document10.cxx                                |   11 +
 sc/source/core/data/table7.cxx                                    |    2 
 sc/source/ui/inc/viewdata.hxx                                     |    5 
 sc/source/ui/inc/viewfunc.hxx                                     |    2 
 sc/source/ui/view/tabvwsh3.cxx                                    |    8 +
 sc/source/ui/view/tabvwsha.cxx                                    |   11 +
 sc/source/ui/view/viewdata.cxx                                    |    2 
 sc/source/ui/view/viewfun3.cxx                                    |   56 
+++++++++-
 16 files changed, 192 insertions(+), 14 deletions(-)

New commits:
commit 573d91dbcd02fb2cd3a51787921052b7a6b903e1
Author:     Tomaž Vajngerl <[email protected]>
AuthorDate: Mon Jul 28 12:07:44 2025 +0200
Commit:     Tomaž Vajngerl <[email protected]>
CommitDate: Fri Sep 12 20:55:51 2025 +0200

    sc: add a way to switch to the next sheet (or default) view
    
    This addresses the need to switch to a different sheet view if
    there are multiple available and to switch the current view to the
    default view.
    
    Change-Id: I34c0c461793b6b824c4518716ba85906facb944d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188468
    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 f7ae3c48f7d9..4360735bd040 100644
--- a/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu
@@ -2709,6 +2709,14 @@
           <value>1</value>
         </prop>
       </node>
+      <node oor:name=".uno:SwitchToNextSheetView" oor:op="replace">
+        <prop oor:name="Label" oor:type="xs:string">
+          <value xml:lang="en-US">Switch To Next 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/SheetView.hxx b/sc/inc/SheetView.hxx
index 39f797802c16..b7db3e84b22a 100644
--- a/sc/inc/SheetView.hxx
+++ b/sc/inc/SheetView.hxx
@@ -54,6 +54,7 @@ public:
     bool isEmpty() const { return maViews.empty(); }
     bool remove(SheetViewID nID);
     std::vector<SheetView> const& getSheetViews() const { return maViews; }
+    SheetViewID getNextSheetView(SheetViewID nID);
 };
 }
 
diff --git a/sc/inc/sc.hrc b/sc/inc/sc.hrc
index 5447f2a7e7dc..c79f87ea08b1 100644
--- a/sc/inc/sc.hrc
+++ b/sc/inc/sc.hrc
@@ -287,6 +287,7 @@ 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_CHG_ACCEPT          (VIEW_MENU_START + 18)// DANGER DIRTY ID
 #define FID_CHG_COMMENT         (VIEW_MENU_START + 19)// DANGER DIRTY ID
diff --git a/sc/sdi/scalc.sdi b/sc/sdi/scalc.sdi
index f2e3df09d6b8..740ab2693f71 100644
--- a/sc/sdi/scalc.sdi
+++ b/sc/sdi/scalc.sdi
@@ -6085,6 +6085,24 @@ SfxBoolItem RemoveSheetView FID_REMOVE_SHEET_VIEW
     GroupId = SfxGroupId::View
 ]
 
+SfxBoolItem SwitchToNextSheetView FID_SWITCH_TO_NEXT_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 5787e5718867..7cf74e75c17e 100644
--- a/sc/sdi/tabvwsh.sdi
+++ b/sc/sdi/tabvwsh.sdi
@@ -209,6 +209,7 @@ interface TableEditView
     FID_TOGGLEFORMULA   [ ExecMethod = Execute; StateMethod = GetState; ]
     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_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 73f7dbe903ef..e4e3858fbcdc 100644
--- a/sc/source/core/data/SheetViewManager.cxx
+++ b/sc/source/core/data/SheetViewManager.cxx
@@ -39,6 +39,36 @@ SheetView SheetViewManager::get(SheetViewID nID) const
     }
     return SheetView();
 }
+
+/// Calculate the next existing sheet view to use.
+SheetViewID SheetViewManager::getNextSheetView(SheetViewID nID)
+{
+    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();
+
+    // Start with first index and search for the first sheet view in for loop.
+    if (nID == DefaultSheetViewID)
+    {
+        startIndex = 0;
+    }
+    // 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 (nID >= 0 && o3tl::make_unsigned(nID) < maViews.size())
+    {
+        startIndex = size_t(nID) + 1;
+    }
+
+    for (size_t nIndex = startIndex; nIndex < maViews.size(); ++nIndex)
+    {
+        if (maViews[nIndex].isValid())
+            return SheetViewID(nIndex);
+    }
+
+    return DefaultSheetViewID;
+}
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/core/data/document10.cxx 
b/sc/source/core/data/document10.cxx
index 91842430b28e..2e1c3b99e830 100644
--- a/sc/source/core/data/document10.cxx
+++ b/sc/source/core/data/document10.cxx
@@ -1171,7 +1171,7 @@ SCTAB ScDocument::GetSheetViewNumber(SCTAB nTab, 
sc::SheetViewID nID)
 {
     if (ScTable* pMainSheet = FetchTable(nTab))
     {
-        if (pMainSheet->IsSheetView())
+        if (pMainSheet->IsSheetView() || nID == sc::DefaultSheetViewID)
             return nTab;
 
         sc::SheetView aView = pMainSheet->GetSheetViewManager()->get(nID);
diff --git a/sc/source/ui/inc/viewfunc.hxx b/sc/source/ui/inc/viewfunc.hxx
index a75f4eb3e62a..a497d47968ae 100644
--- a/sc/source/ui/inc/viewfunc.hxx
+++ b/sc/source/ui/inc/viewfunc.hxx
@@ -356,6 +356,7 @@ public:
 
     void MakeNewSheetView();
     void RemoveCurrentSheetView();
+    void SwitchSheetView();
 
                                                 // Internal helper functions
 protected:
diff --git a/sc/source/ui/view/tabvwsh3.cxx b/sc/source/ui/view/tabvwsh3.cxx
index 284882e9efff..abd3eb7a76d4 100644
--- a/sc/source/ui/view/tabvwsh3.cxx
+++ b/sc/source/ui/view/tabvwsh3.cxx
@@ -1054,6 +1054,10 @@ void ScTabViewShell::Execute( SfxRequest& rReq )
             RemoveCurrentSheetView();
         break;
 
+        case FID_SWITCH_TO_NEXT_SHEET_VIEW:
+            SwitchSheetView();
+        break;
+
         case SID_ATTR_ZOOM: // status row
         case FID_SCALE:
             {
diff --git a/sc/source/ui/view/tabvwsha.cxx b/sc/source/ui/view/tabvwsha.cxx
index f1cb6cc7a820..17bd167dcf24 100644
--- a/sc/source/ui/view/tabvwsha.cxx
+++ b/sc/source/ui/view/tabvwsha.cxx
@@ -397,11 +397,13 @@ void ScTabViewShell::GetState( SfxItemSet& rSet )
 
             case FID_NEW_SHEET_VIEW:
             case FID_REMOVE_SHEET_VIEW:
+            case FID_SWITCH_TO_NEXT_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);
                     }
                     if (nWhich == FID_REMOVE_SHEET_VIEW && 
GetViewData().GetSheetViewID() == sc::DefaultSheetViewID)
                         rSet.DisableItem(FID_REMOVE_SHEET_VIEW);
diff --git a/sc/source/ui/view/viewfun3.cxx b/sc/source/ui/view/viewfun3.cxx
index 3c3ee3212031..569b2d19f409 100644
--- a/sc/source/ui/view/viewfun3.cxx
+++ b/sc/source/ui/view/viewfun3.cxx
@@ -2096,7 +2096,35 @@ void ScViewFunc::RemoveCurrentSheetView()
     GetViewData().SetTabNo(nTab);
     GetViewData().GetDocFunc().DeleteTable(nSheetViewTab, true);
 
+    ScDocShell& rDocSh = GetViewData().GetDocShell();
+    rDocSh.PostPaintGridAll();
     PaintExtras();
 }
 
+void ScViewFunc::SwitchSheetView()
+{
+    SCTAB nTab = GetViewData().GetTabNumber();
+    ScDocument& rDocument = GetViewData().GetDocument();
+    if (rDocument.IsSheetView(nTab))
+        return;
+
+    sc::SheetViewID nSheetViewID = GetViewData().GetSheetViewID();
+    auto pSheetManager = rDocument.GetSheetViewManager(nTab);
+    sc::SheetViewID nNextSheetViewID = 
pSheetManager->getNextSheetView(nSheetViewID);
+
+    GetViewData().SetSheetViewID(nNextSheetViewID);
+
+    if (nNextSheetViewID != sc::DefaultSheetViewID)
+    {
+        SCTAB nNextSheetViewTab = rDocument.GetSheetViewNumber(nTab, 
nNextSheetViewID);
+        GetViewData().SetTabNo(nNextSheetViewTab); // force add the sheet view 
tab
+    }
+
+    // Update
+    GetViewData().SetTabNo(nTab); // then change back to the current tab
+    ScDocShell& rDocSh = GetViewData().GetDocShell();
+    rDocSh.PostPaintGridAll();
+    PaintExtras(); // update Tab Control
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 1c1d6aacc46003e3fc56ad0d6e443a82292983ad
Author:     Tomaž Vajngerl <[email protected]>
AuthorDate: Thu Jul 24 23:07:40 2025 +0200
Commit:     Tomaž Vajngerl <[email protected]>
CommitDate: Fri Sep 12 20:55:45 2025 +0200

    sc: add a way to remove the current sheet view
    
    If we are currently in a sheet view, this command will remove the
    sheet view (including the ScTable representing the sheet view),
    and return to the default view.
    Also add state code to not allow adding or removing a sheet view
    when read-only and disable remove command when in default view.
    
    Change-Id: I1b44db9faa717d53631b1e0571d4dba1e9856a5d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188467
    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 2b2560714d27..f7ae3c48f7d9 100644
--- a/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu
@@ -2701,6 +2701,14 @@
           <value>1</value>
         </prop>
       </node>
+      <node oor:name=".uno:RemoveSheetView" oor:op="replace">
+        <prop oor:name="Label" oor:type="xs:string">
+          <value xml:lang="en-US">Remove 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/SheetView.hxx b/sc/inc/SheetView.hxx
index cc29eb196423..39f797802c16 100644
--- a/sc/inc/SheetView.hxx
+++ b/sc/inc/SheetView.hxx
@@ -50,8 +50,10 @@ public:
     SheetViewID create(ScTable* pSheetViewTable);
 
     /** Returns a sheet view for the ID. */
-    SheetView get(SheetViewID nID);
-    std::vector<SheetView> const& getSheetViews() { return maViews; }
+    SheetView get(SheetViewID nID) const;
+    bool isEmpty() const { return maViews.empty(); }
+    bool remove(SheetViewID nID);
+    std::vector<SheetView> const& getSheetViews() const { return maViews; }
 };
 }
 
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index c7900b8b348d..ae5f61464d3e 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -2401,6 +2401,8 @@ public:
 
     /** Return the sheet view table for the ID */
     SCTAB GetSheetViewNumber(SCTAB nTab, sc::SheetViewID nID);
+
+    bool HasSheetViews(SCTAB nTab) const;
     std::shared_ptr<sc::SheetViewManager> GetSheetViewManager(SCTAB nTable);
     bool IsSheetView(SCTAB nTab) const;
     void SetSheetView(SCTAB nTab, bool bSheetView);
diff --git a/sc/inc/sc.hrc b/sc/inc/sc.hrc
index fcb9881af9b5..5447f2a7e7dc 100644
--- a/sc/inc/sc.hrc
+++ b/sc/inc/sc.hrc
@@ -286,6 +286,7 @@ class SvxZoomSliderItem;
 #define FID_NORMALVIEWMODE      (VIEW_MENU_START + 9)
 #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_CHG_ACCEPT          (VIEW_MENU_START + 18)// DANGER DIRTY ID
 #define FID_CHG_COMMENT         (VIEW_MENU_START + 19)// DANGER DIRTY ID
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index 16632339870d..ad8ff3abef90 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -1187,7 +1187,7 @@ public:
 
     void CollectBroadcasterState(sc::BroadcasterState& rState) const;
 
-    std::shared_ptr<sc::SheetViewManager> const& GetSheetViewManager();
+    std::shared_ptr<sc::SheetViewManager> const& GetSheetViewManager() const;
 
     bool IsSheetView() const { return mbIsSheetView; }
 
diff --git a/sc/sdi/scalc.sdi b/sc/sdi/scalc.sdi
index d0328da8b0f3..f2e3df09d6b8 100644
--- a/sc/sdi/scalc.sdi
+++ b/sc/sdi/scalc.sdi
@@ -6067,6 +6067,23 @@ SfxBoolItem NewSheetView FID_NEW_SHEET_VIEW
     GroupId = SfxGroupId::View
 ]
 
+SfxBoolItem RemoveSheetView FID_REMOVE_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 cacbdb0cd9cb..5787e5718867 100644
--- a/sc/sdi/tabvwsh.sdi
+++ b/sc/sdi/tabvwsh.sdi
@@ -208,6 +208,7 @@ interface TableEditView
     FID_TOGGLEHEADERS   [ ExecMethod = Execute; StateMethod = GetState; ]
     FID_TOGGLEFORMULA   [ ExecMethod = Execute; StateMethod = GetState; ]
     FID_NEW_SHEET_VIEW  [ ExecMethod = Execute; StateMethod = GetState; ]
+    FID_REMOVE_SHEET_VIEW [ ExecMethod = Execute; StateMethod = GetState; ]
     FID_NORMALVIEWMODE  [ ExecMethod = Execute; StateMethod = GetState; ]
     FID_PAGEBREAKMODE   [ ExecMethod = Execute; StateMethod = GetState; ]
     SID_REPAINT         [ ExecMethod = Execute; StateMethod = GetState; ]
@@ -277,5 +278,3 @@ shell ScTabViewShell
     SID_TBXCTL_INSCELLS     []
 
 }
-
-
diff --git a/sc/source/core/data/SheetViewManager.cxx 
b/sc/source/core/data/SheetViewManager.cxx
index d2132d3ac610..73f7dbe903ef 100644
--- a/sc/source/core/data/SheetViewManager.cxx
+++ b/sc/source/core/data/SheetViewManager.cxx
@@ -21,7 +21,16 @@ SheetViewID SheetViewManager::create(ScTable* 
pSheetViewTable)
     return SheetViewID(nID);
 }
 
-SheetView SheetViewManager::get(SheetViewID nID)
+bool SheetViewManager::remove(SheetViewID nID)
+{
+    if (nID >= 0 && o3tl::make_unsigned(nID) < maViews.size())
+    {
+        maViews.erase(maViews.begin() + nID);
+    }
+    return false;
+}
+
+SheetView SheetViewManager::get(SheetViewID nID) const
 {
     if (nID >= 0 && o3tl::make_unsigned(nID) < maViews.size())
     {
diff --git a/sc/source/core/data/document10.cxx 
b/sc/source/core/data/document10.cxx
index fc38a04ae378..91842430b28e 100644
--- a/sc/source/core/data/document10.cxx
+++ b/sc/source/core/data/document10.cxx
@@ -1148,6 +1148,15 @@ sc::SheetViewID ScDocument::CreateNewSheetView(SCTAB 
nMainTable, SCTAB nSheetVie
     return -1;
 }
 
+bool ScDocument::HasSheetViews(SCTAB nTab) const
+{
+    if (ScTable const* pTable = FetchTable(nTab))
+    {
+        return !pTable->GetSheetViewManager()->isEmpty();
+    }
+    return false;
+}
+
 std::shared_ptr<sc::SheetViewManager> ScDocument::GetSheetViewManager(SCTAB 
nTable)
 {
     if (ScTable* pTable = FetchTable(nTable))
diff --git a/sc/source/core/data/table7.cxx b/sc/source/core/data/table7.cxx
index f79ca5f00396..9df34293bbc7 100644
--- a/sc/source/core/data/table7.cxx
+++ b/sc/source/core/data/table7.cxx
@@ -666,7 +666,7 @@ const std::shared_ptr<sc::SolverSettings> & 
ScTable::GetSolverSettings()
     return m_pSolverSettings;
 }
 
-std::shared_ptr<sc::SheetViewManager> const& ScTable::GetSheetViewManager()
+std::shared_ptr<sc::SheetViewManager> const& ScTable::GetSheetViewManager() 
const
 {
     return mpSheetViewManager;
 }
diff --git a/sc/source/ui/inc/viewdata.hxx b/sc/source/ui/inc/viewdata.hxx
index 1cb8197a8ba3..2e0e3b8270c2 100644
--- a/sc/source/ui/inc/viewdata.hxx
+++ b/sc/source/ui/inc/viewdata.hxx
@@ -413,6 +413,11 @@ public:
         pThisTab->mnSheetViewID = nID;
     }
 
+    sc::SheetViewID GetSheetViewID() const
+    {
+        return pThisTab->mnSheetViewID;
+    }
+
     SCCOL           MaxCol() const                          { return 
mrDoc.MaxCol(); }
     SCROW           MaxRow() const                          { return 
mrDoc.MaxRow(); }
     ScSplitPos      GetActivePart() const                   { return 
pThisTab->eWhichActive; }
diff --git a/sc/source/ui/inc/viewfunc.hxx b/sc/source/ui/inc/viewfunc.hxx
index 55fe418435ed..a75f4eb3e62a 100644
--- a/sc/source/ui/inc/viewfunc.hxx
+++ b/sc/source/ui/inc/viewfunc.hxx
@@ -355,6 +355,7 @@ public:
                                         bool bAttrChanged );
 
     void MakeNewSheetView();
+    void RemoveCurrentSheetView();
 
                                                 // Internal helper functions
 protected:
diff --git a/sc/source/ui/view/tabvwsh3.cxx b/sc/source/ui/view/tabvwsh3.cxx
index fbc4faee87bd..284882e9efff 100644
--- a/sc/source/ui/view/tabvwsh3.cxx
+++ b/sc/source/ui/view/tabvwsh3.cxx
@@ -1050,6 +1050,10 @@ void ScTabViewShell::Execute( SfxRequest& rReq )
             MakeNewSheetView();
         break;
 
+        case FID_REMOVE_SHEET_VIEW:
+            RemoveCurrentSheetView();
+        break;
+
         case SID_ATTR_ZOOM: // status row
         case FID_SCALE:
             {
diff --git a/sc/source/ui/view/tabvwsha.cxx b/sc/source/ui/view/tabvwsha.cxx
index 80d5cc762a60..f1cb6cc7a820 100644
--- a/sc/source/ui/view/tabvwsha.cxx
+++ b/sc/source/ui/view/tabvwsha.cxx
@@ -396,8 +396,15 @@ void ScTabViewShell::GetState( SfxItemSet& rSet )
                 break;
 
             case FID_NEW_SHEET_VIEW:
+            case FID_REMOVE_SHEET_VIEW:
                 {
-                    // TODO
+                    if (GetViewData().GetDocShell().IsReadOnly() || 
IsCurrentLokViewReadOnly())
+                    {
+                        rSet.DisableItem(FID_NEW_SHEET_VIEW);
+                        rSet.DisableItem(FID_REMOVE_SHEET_VIEW);
+                    }
+                    if (nWhich == FID_REMOVE_SHEET_VIEW && 
GetViewData().GetSheetViewID() == sc::DefaultSheetViewID)
+                        rSet.DisableItem(FID_REMOVE_SHEET_VIEW);
                 }
                 break;
 
diff --git a/sc/source/ui/view/viewdata.cxx b/sc/source/ui/view/viewdata.cxx
index 9d12ef74e17f..b538e384b750 100644
--- a/sc/source/ui/view/viewdata.cxx
+++ b/sc/source/ui/view/viewdata.cxx
@@ -4421,7 +4421,7 @@ SCTAB ScViewData::CurrentTabForData() const
 {
     if (!pThisTab)
         return GetTabNumber();
-    auto nSheetViewID = pThisTab->mnSheetViewID;
+    auto nSheetViewID = GetSheetViewID();
     if (nSheetViewID != sc::DefaultSheetViewID)
     {
         SCTAB nTab = mrDoc.GetSheetViewNumber(GetTabNumber(), nSheetViewID);
diff --git a/sc/source/ui/view/viewfun3.cxx b/sc/source/ui/view/viewfun3.cxx
index d0002823ef7f..3c3ee3212031 100644
--- a/sc/source/ui/view/viewfun3.cxx
+++ b/sc/source/ui/view/viewfun3.cxx
@@ -63,6 +63,7 @@
 #include <cliputil.hxx>
 #include <clipoptions.hxx>
 #include <gridwin.hxx>
+#include <SheetView.hxx>
 #include <com/sun/star/util/XCloneable.hpp>
 
 using namespace com::sun::star;
@@ -2062,14 +2063,14 @@ void ScViewFunc::DataFormPutData( SCROW nCurrentRow ,
 void ScViewFunc::MakeNewSheetView()
 {
     SCTAB nTab = GetViewData().GetTabNumber();
-    ScDocument& rDoc = GetViewData().GetDocument();
+    ScDocument& rDocument = GetViewData().GetDocument();
 
     SCTAB nSheetViewTab = nTab + 1;
-    if (rDoc.CopyTab(nTab, nSheetViewTab))
+    if (rDocument.CopyTab(nTab, nSheetViewTab))
     {
         // Add and register the created sheet view
-        rDoc.SetSheetView(nSheetViewTab, true);
-        sc::SheetViewID nSheetViewID = rDoc.CreateNewSheetView(nTab, 
nSheetViewTab);
+        rDocument.SetSheetView(nSheetViewTab, true);
+        sc::SheetViewID nSheetViewID = rDocument.CreateNewSheetView(nTab, 
nSheetViewTab);
         GetViewData().SetSheetViewID(nSheetViewID);
 
         // Update
@@ -2079,4 +2080,23 @@ void ScViewFunc::MakeNewSheetView()
     }
 }
 
+void ScViewFunc::RemoveCurrentSheetView()
+{
+    sc::SheetViewID nSheetViewID = GetViewData().GetSheetViewID();
+    if (nSheetViewID == sc::DefaultSheetViewID)
+        return;
+
+    SCTAB nTab = GetViewData().GetTabNumber();
+    ScDocument& rDocument = GetViewData().GetDocument();
+    SCTAB nSheetViewTab = rDocument.GetSheetViewNumber(nTab, nSheetViewID);
+
+    auto pSheetManager = rDocument.GetSheetViewManager(nTab);
+    pSheetManager->remove(nSheetViewID);
+    GetViewData().SetSheetViewID(sc::DefaultSheetViewID);
+    GetViewData().SetTabNo(nTab);
+    GetViewData().GetDocFunc().DeleteTable(nSheetViewTab, true);
+
+    PaintExtras();
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Reply via email to