sc/inc/document.hxx | 5 +-- sc/inc/table.hxx | 8 ++--- sc/qa/unit/tiledrendering/SheetViewTest.cxx | 32 ++++++++++++++++++++ sc/source/core/data/document10.cxx | 19 +++-------- sc/source/filter/excel/xelink.cxx | 2 - sc/source/filter/xml/xmlexprt.cxx | 3 + sc/source/ui/docshell/SheetViewOperationsTester.cxx | 2 - sc/source/ui/view/viewfun3.cxx | 4 +- sc/source/ui/view/viewfunc.cxx | 4 +- 9 files changed, 53 insertions(+), 26 deletions(-)
New commits: commit 73a6735652dc5bbb4ac51743f41bbed3fe5d1060 Author: Tomaž Vajngerl <[email protected]> AuthorDate: Fri Oct 10 15:25:20 2025 +0900 Commit: Tomaž Vajngerl <[email protected]> CommitDate: Tue Oct 14 14:40:47 2025 +0200 sc: Don't save the sheet view holder table to the ODF, OOXML file Sheet view holder table is temporary and shouldn't be saved to the document file. This also includes a test, which checks if the ODF, OOXML files have the sheet view holder table saved. Change-Id: Iaf93b7723be7b10d7c10f829db7079a92deb1a8b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/192146 Reviewed-by: Miklos Vajna <[email protected]> Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/192365 Reviewed-by: Tomaž Vajngerl <[email protected]> Tested-by: Jenkins diff --git a/sc/qa/unit/tiledrendering/SheetViewTest.cxx b/sc/qa/unit/tiledrendering/SheetViewTest.cxx index e4c61008fd97..761099707dfd 100644 --- a/sc/qa/unit/tiledrendering/SheetViewTest.cxx +++ b/sc/qa/unit/tiledrendering/SheetViewTest.cxx @@ -478,6 +478,38 @@ CPPUNIT_TEST_FIXTURE(SheetViewTest, testSheetViewManager) CPPUNIT_ASSERT_EQUAL(sc::InvalidSheetViewID, maSheetViewManager.getPreviousSheetView(-99)); } +CPPUNIT_TEST_FIXTURE(SheetViewTest, testCheckIfSheetViewIsSavedInDocument_ODF) +{ + // Check if sheet view holder table is saved into the ODF document + ScModelObj* pModelObj = createDoc("SheetView_AutoFilter.ods"); + pModelObj->initializeForTiledRendering(uno::Sequence<beans::PropertyValue>()); + + dispatchCommand(mxComponent, u".uno:NewSheetView"_ustr, {}); + Scheduler::ProcessEventsToIdle(); + + save(u"calc8"_ustr); + + xmlDocUniquePtr pXmlDoc = parseExport(u"content.xml"_ustr); + CPPUNIT_ASSERT(pXmlDoc); + assertXPath(pXmlDoc, "//table:table", 1); +} + +CPPUNIT_TEST_FIXTURE(SheetViewTest, testCheckIfSheetViewIsSavedInDocument_OOXML) +{ + // Check if sheet view holder table is saved into the OOXML document + ScModelObj* pModelObj = createDoc("SheetView_AutoFilter.ods"); + pModelObj->initializeForTiledRendering(uno::Sequence<beans::PropertyValue>()); + + dispatchCommand(mxComponent, u".uno:NewSheetView"_ustr, {}); + Scheduler::ProcessEventsToIdle(); + + save(u"Calc Office Open XML"_ustr); + + xmlDocUniquePtr pXmlDoc = parseExport(u"xl/workbook.xml"_ustr); + CPPUNIT_ASSERT(pXmlDoc); + assertXPath(pXmlDoc, "/x:workbook/x:sheets/x:sheet", 1); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/filter/excel/xelink.cxx b/sc/source/filter/excel/xelink.cxx index fe9612053400..f0f8c22e4e05 100644 --- a/sc/source/filter/excel/xelink.cxx +++ b/sc/source/filter/excel/xelink.cxx @@ -659,7 +659,7 @@ XclExpTabInfo::XclExpTabInfo( const XclExpRoot& rRoot ) : for( nScTab = 0; nScTab < mnScCnt; ++nScTab ) { // ignored sheets (skipped by export, with invalid Excel sheet index) - if( rDoc.IsScenario( nScTab ) ) + if (rDoc.IsScenario(nScTab) || rDoc.IsSheetViewHolder(nScTab)) { SetFlag( nScTab, ExcTabBufFlags::Ignore ); } diff --git a/sc/source/filter/xml/xmlexprt.cxx b/sc/source/filter/xml/xmlexprt.cxx index 314f85bd6d23..2223e9257e3a 100644 --- a/sc/source/filter/xml/xmlexprt.cxx +++ b/sc/source/filter/xml/xmlexprt.cxx @@ -1915,6 +1915,9 @@ void ScXMLExport::ExportContent_() WriteTheLabelRanges(*pDoc, xSpreadDoc); for (sal_Int32 nTable = 0; nTable < nTableCount; ++nTable) { + // We need to skip tables that hold the data for a sheet view + if (pDoc->IsSheetViewHolder(nTable)) + continue; sal_Int64 nStartOffset = -1; sal_Int64 nEndOffset = -1; if (pSheetData && pDoc->IsStreamValid(static_cast<SCTAB>(nTable)) && !pDoc->GetChangeTrack()) commit 43b63465a65434d22eb15ee234a7bbec1faf0143 Author: Tomaž Vajngerl <[email protected]> AuthorDate: Fri Oct 10 15:21:31 2025 +0900 Commit: Tomaž Vajngerl <[email protected]> CommitDate: Tue Oct 14 14:40:39 2025 +0200 sc: rename IsSheetView to IsSheetViewHolder To make it more clear what is being refered - IsSheetViewHolder is a sheet / table that holds the data for a sheet view, but the table should never be used directly. Change-Id: I8fe1d252b37389660ba4f010229fa60b2ef29da3 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/192145 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Miklos Vajna <[email protected]> (cherry picked from commit a819480a30237ce27b2bce6d3522b147a1354dcd) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/192364 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <[email protected]> diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index f8a8e4f8340c..721492ea6893 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -2404,8 +2404,9 @@ public: bool HasSheetViews(SCTAB nTab) const; SC_DLLPUBLIC std::shared_ptr<sc::SheetViewManager> GetSheetViewManager(SCTAB nTable); - bool IsSheetView(SCTAB nTab) const; - void SetSheetView(SCTAB nTab, bool bSheetView); + + /** Is a holder of the sheet view data */ + SC_DLLPUBLIC bool IsSheetViewHolder(SCTAB nTab) const; private: ScDocument(const ScDocument& r) = delete; diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx index ad8ff3abef90..9fb488eaaa81 100644 --- a/sc/inc/table.hxx +++ b/sc/inc/table.hxx @@ -253,7 +253,7 @@ private: bool mbForceBreaks:1; bool mbTotalsRowBelow:1; - bool mbIsSheetView : 1 = false; + bool mbIsSheetViewHolder : 1 = false; /** this is touched from formula group threading context */ std::atomic<bool> bStreamValid; @@ -1189,11 +1189,11 @@ public: std::shared_ptr<sc::SheetViewManager> const& GetSheetViewManager() const; - bool IsSheetView() const { return mbIsSheetView; } + bool IsSheetViewHolder() const { return mbIsSheetViewHolder; } - void SetSheetView(bool bValue) + void SetSheetViewHolder(bool bValue) { - mbIsSheetView = bValue; + mbIsSheetViewHolder = bValue; } private: diff --git a/sc/source/core/data/document10.cxx b/sc/source/core/data/document10.cxx index e5fe3010f353..0331427d6b0c 100644 --- a/sc/source/core/data/document10.cxx +++ b/sc/source/core/data/document10.cxx @@ -1131,24 +1131,15 @@ sc::BroadcasterState ScDocument::GetBroadcasterState() const return aState; } -bool ScDocument::IsSheetView(SCTAB nTab) const +bool ScDocument::IsSheetViewHolder(SCTAB nTab) const { if (ScTable const* pTable = FetchTable(nTab)) { - return pTable->IsSheetView(); + return pTable->IsSheetViewHolder(); } return false; } -void ScDocument::SetSheetView(SCTAB nTab, bool bSheetView) -{ - if (ScTable* pTable = FetchTable(nTab)) - { - pTable->SetSheetView(bSheetView); - } -} - - std::pair<sc::SheetViewID, SCTAB> ScDocument::CreateNewSheetView(SCTAB nTab) { if (ScTable* pTable = FetchTable(nTab)) @@ -1160,7 +1151,7 @@ std::pair<sc::SheetViewID, SCTAB> ScDocument::CreateNewSheetView(SCTAB nTab) { auto nSheetViewID = pTable->GetSheetViewManager()->create(pSheetViewTable); pSheetViewTable->SetVisible(false); - pSheetViewTable->SetSheetView(true); + pSheetViewTable->SetSheetViewHolder(true); return { nSheetViewID, nSheetViewTab }; } } @@ -1181,7 +1172,7 @@ std::shared_ptr<sc::SheetViewManager> ScDocument::GetSheetViewManager(SCTAB nTab { if (ScTable* pTable = FetchTable(nTable)) { - if (!pTable->IsSheetView()) + if (!pTable->IsSheetViewHolder()) return pTable->GetSheetViewManager(); } return {}; @@ -1191,7 +1182,7 @@ SCTAB ScDocument::GetSheetViewNumber(SCTAB nTab, sc::SheetViewID nID) { if (ScTable* pMainSheet = FetchTable(nTab)) { - if (pMainSheet->IsSheetView() || nID == sc::DefaultSheetViewID) + if (pMainSheet->IsSheetViewHolder() || nID == sc::DefaultSheetViewID) return nTab; std::shared_ptr<sc::SheetView> pView = pMainSheet->GetSheetViewManager()->get(nID); diff --git a/sc/source/ui/docshell/SheetViewOperationsTester.cxx b/sc/source/ui/docshell/SheetViewOperationsTester.cxx index 94dc4154118d..6b5469159173 100644 --- a/sc/source/ui/docshell/SheetViewOperationsTester.cxx +++ b/sc/source/ui/docshell/SheetViewOperationsTester.cxx @@ -142,7 +142,7 @@ bool SheetViewOperationsTester::check(Operation eOperation) const SCTAB nTab = mpViewData->GetTabNumber(); // Never allow direct changes to the data holder sheet of the sheet view. - if (rDocument.IsSheetView(nTab)) + if (rDocument.IsSheetViewHolder(nTab)) return false; sc::SheetViewID nSheetViewID = mpViewData->GetSheetViewID(); diff --git a/sc/source/ui/view/viewfun3.cxx b/sc/source/ui/view/viewfun3.cxx index 7889ffc6989a..30f443a93441 100644 --- a/sc/source/ui/view/viewfun3.cxx +++ b/sc/source/ui/view/viewfun3.cxx @@ -2097,7 +2097,7 @@ void ScViewFunc::RemoveCurrentSheetView() ScDocument& rDocument = GetViewData().GetDocument(); SCTAB nTab = GetViewData().GetTabNumber(); - if (rDocument.IsSheetView(nTab)) + if (rDocument.IsSheetViewHolder(nTab)) return; auto pSheetManager = rDocument.GetSheetViewManager(nTab); @@ -2136,7 +2136,7 @@ void ScViewFunc::SelectSheetView(sc::SheetViewID nSelectSheetViewID) { SCTAB nTab = GetViewData().GetTabNumber(); - if (GetViewData().GetDocument().IsSheetView(nTab)) + if (GetViewData().GetDocument().IsSheetViewHolder(nTab)) return; sc::SheetViewID nSheetViewID = GetViewData().GetSheetViewID(); diff --git a/sc/source/ui/view/viewfunc.cxx b/sc/source/ui/view/viewfunc.cxx index 0088b890f213..5bbec50f0eb8 100644 --- a/sc/source/ui/view/viewfunc.cxx +++ b/sc/source/ui/view/viewfunc.cxx @@ -812,7 +812,7 @@ void ScViewFunc::EnterData( SCCOL nCol, SCROW nRow, SCTAB nTab, applyFormulaToCell(*this, nCol, nRow, nTab, rString, pData, xModificator, aMark, bMatrixExpand, bRecord, bNumFmtChanged); - if (!rDoc.IsSheetView(nSelectedTab)) + if (!rDoc.IsSheetViewHolder(nSelectedTab)) { auto pManager = rDoc.GetSheetViewManager(nSelectedTab); @@ -838,7 +838,7 @@ void ScViewFunc::EnterData( SCCOL nCol, SCROW nRow, SCTAB nTab, { for (const auto& rTab : aMark) { - if (!rDoc.IsSheetView(rTab)) + if (!rDoc.IsSheetViewHolder(rTab)) { auto pManager = rDoc.GetSheetViewManager(rTab); for (auto const& pSheetView : pManager->getSheetViews())
