officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu |    8 ++
 sc/inc/SheetView.hxx                                              |    6 +-
 sc/inc/document.hxx                                               |    2 
 sc/inc/sc.hrc                                                     |    1 
 sc/inc/table.hxx                                                  |    2 
 sc/sdi/scalc.sdi                                                  |   17 ++++++
 sc/sdi/tabvwsh.sdi                                                |    3 -
 sc/source/core/data/SheetViewManager.cxx                          |   11 +++
 sc/source/core/data/document10.cxx                                |    9 +++
 sc/source/core/data/table7.cxx                                    |    2 
 sc/source/ui/inc/viewdata.hxx                                     |    5 +
 sc/source/ui/inc/viewfunc.hxx                                     |    1 
 sc/source/ui/view/tabvwsh3.cxx                                    |    4 +
 sc/source/ui/view/tabvwsha.cxx                                    |    9 ++-
 sc/source/ui/view/viewdata.cxx                                    |    2 
 sc/source/ui/view/viewfun3.cxx                                    |   28 
++++++++--
 16 files changed, 97 insertions(+), 13 deletions(-)

New commits:
commit 74a5b68b5a4de08a6e16da1a1563dfadeb543374
Author:     Tomaž Vajngerl <[email protected]>
AuthorDate: Thu Jul 24 23:07:40 2025 +0200
Commit:     Miklos Vajna <[email protected]>
CommitDate: Tue Sep 16 08:28:46 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]>
    (cherry picked from commit 1c1d6aacc46003e3fc56ad0d6e443a82292983ad)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190942
    Tested-by: Jenkins CollaboraOffice <[email protected]>
    Reviewed-by: Miklos Vajna <[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 fc4876011a0e..378d93bf84d7 100644
--- a/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/UI/CalcCommands.xcu
@@ -2712,6 +2712,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 421767370a4c..58fa689962b9 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -2403,6 +2403,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 05badb5110a1..c3044e7232b3 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 0e87fb4753c7..1fd37b9958b6 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -1197,7 +1197,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 13cba78c815c..be97e10ba3c2 100644
--- a/sc/sdi/scalc.sdi
+++ b/sc/sdi/scalc.sdi
@@ -6050,6 +6050,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 ac40eb90b7f0..e9abdf70616f 100644
--- a/sc/sdi/tabvwsh.sdi
+++ b/sc/sdi/tabvwsh.sdi
@@ -178,6 +178,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; ]
@@ -247,5 +248,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 64df5c36af0e..a71ad734de4b 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 9643f5984e34..de43cb5cff2b 100644
--- a/sc/source/ui/inc/viewdata.hxx
+++ b/sc/source/ui/inc/viewdata.hxx
@@ -417,6 +417,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 a075f7e68d45..d6295a2d29de 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 4a6751ef2786..9aac88b8ae34 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 c1319a474a18..6171ac989bf2 100644
--- a/sc/source/ui/view/tabvwsha.cxx
+++ b/sc/source/ui/view/tabvwsha.cxx
@@ -397,8 +397,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 14527045fda7..513fc782bbbf 100644
--- a/sc/source/ui/view/viewdata.cxx
+++ b/sc/source/ui/view/viewdata.cxx
@@ -4484,7 +4484,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 959777729519..0639534cc956 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;
@@ -2064,14 +2065,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
@@ -2081,4 +2082,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