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