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: */
