sc/inc/SheetView.hxx | 1 sc/qa/unit/tiledrendering/SheetViewTest.cxx | 54 ++++++++++++++++++++++++++++ sc/qa/unit/types/SortOrderReverserTest.cxx | 23 +++++++++++ sc/source/core/data/SheetView.cxx | 17 ++++++++ sc/source/ui/view/viewfunc.cxx | 2 - 5 files changed, 96 insertions(+), 1 deletion(-)
New commits: commit eef4a0ad634d883b4f40d59f962bd0803083996d Author: Tomaž Vajngerl <[email protected]> AuthorDate: Fri Sep 12 23:41:17 2025 +0200 Commit: Miklos Vajna <[email protected]> CommitDate: Fri Jan 23 10:37:18 2026 +0100 sc: syncing when default view and sheet view are sorted In this scenario we have sheet view and the default view sorted in different ways, so we need to first unsort the sheet view sort, and then resort the default view sort so we get the correct cell address of the cell that we are changing. Resort is the reverse of unsort. We need to search where in the sort order array is the value of the input row. The array index will be the result and the first row + index will give us the resorted row address. Change-Id: I08dd7f6fc5593464cb2e6bd36ffb3ff250cebf8d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190912 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197822 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Miklos Vajna <[email protected]> diff --git a/sc/inc/SheetView.hxx b/sc/inc/SheetView.hxx index 9cbc5d7489f7..32972acecfcb 100644 --- a/sc/inc/SheetView.hxx +++ b/sc/inc/SheetView.hxx @@ -33,6 +33,7 @@ public: * or it will return the input row without modification. **/ SCROW unsort(SCROW nRow) const; + SCROW resort(SCROW nRow) const; /** Adds or combines the order indices. * diff --git a/sc/qa/unit/tiledrendering/SheetViewTest.cxx b/sc/qa/unit/tiledrendering/SheetViewTest.cxx index 12fd8ddfa8be..ec0dbed01e10 100644 --- a/sc/qa/unit/tiledrendering/SheetViewTest.cxx +++ b/sc/qa/unit/tiledrendering/SheetViewTest.cxx @@ -870,6 +870,60 @@ CPPUNIT_TEST_FIXTURE(SheetViewTest, testSyncAfterSorting_SheetViewSort) } } +CPPUNIT_TEST_FIXTURE(SheetViewTest, testSyncAfterSorting_SortInDefaultAndSheetView) +{ + // Create two views, and leave the second one current. + ScModelObj* pModelObj = createDoc("SheetView_AutoFilter.ods"); + pModelObj->initializeForTiledRendering(uno::Sequence<beans::PropertyValue>()); + + // Setup views + ScTestViewCallback aSheetView; + ScTabViewShell* pTabViewSheetView = aSheetView.getTabViewShell(); + + SfxLokHelper::createView(); + Scheduler::ProcessEventsToIdle(); + + ScTestViewCallback aDefaultView; + ScTabViewShell* pTabViewDefaultView = aDefaultView.getTabViewShell(); + + CPPUNIT_ASSERT(pTabViewSheetView != pTabViewDefaultView); + CPPUNIT_ASSERT(aSheetView.getViewID() != aDefaultView.getViewID()); + + // Switch to Sheet View and Create + { + SfxLokHelper::setView(aSheetView.getViewID()); + Scheduler::ProcessEventsToIdle(); + + dispatchCommand(mxComponent, u".uno:NewSheetView"_ustr, {}); + + // Sort AutoFilter + dispatchCommand(mxComponent, u".uno:SortAscending"_ustr, {}); + } + + // Switch to Sheet View and Create + { + SfxLokHelper::setView(aDefaultView.getViewID()); + Scheduler::ProcessEventsToIdle(); + + // Sort AutoFilter + dispatchCommand(mxComponent, u".uno:SortDescending"_ustr, {}); + + // Check values + CPPUNIT_ASSERT(checkValues(pTabViewSheetView, 0, 1, 4, { u"3", u"4", u"5", u"7" })); + CPPUNIT_ASSERT(checkValues(pTabViewDefaultView, 0, 1, 4, { u"7", u"5", u"4", u"3" })); + } + + { + SfxLokHelper::setView(aSheetView.getViewID()); + Scheduler::ProcessEventsToIdle(); + + typeCharsInCell(std::string("44"), 0, 2, pTabViewSheetView, pModelObj); + + CPPUNIT_ASSERT(checkValues(pTabViewSheetView, 0, 1, 4, { u"3", u"44", u"5", u"7" })); + CPPUNIT_ASSERT(checkValues(pTabViewDefaultView, 0, 1, 4, { u"7", u"5", u"44", u"3" })); + } +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/qa/unit/types/SortOrderReverserTest.cxx b/sc/qa/unit/types/SortOrderReverserTest.cxx index a6808d5c6a87..996d4f4b865f 100644 --- a/sc/qa/unit/types/SortOrderReverserTest.cxx +++ b/sc/qa/unit/types/SortOrderReverserTest.cxx @@ -76,6 +76,29 @@ CPPUNIT_TEST_FIXTURE(SortOrderReverserTest, testCombiningSortOrder) std::equal(aExpectedOrder.begin(), aExpectedOrder.end(), aReverser.maOrder.begin())); } +CPPUNIT_TEST_FIXTURE(SortOrderReverserTest, testResort) +{ + { + sc::SortOrderReverser aReverser; + aReverser.addOrderIndices({ 4, 3, 2, 1 }, 5, 8); + + CPPUNIT_ASSERT_EQUAL(SCROW(8), aReverser.resort(5)); + CPPUNIT_ASSERT_EQUAL(SCROW(7), aReverser.resort(6)); + CPPUNIT_ASSERT_EQUAL(SCROW(6), aReverser.resort(7)); + CPPUNIT_ASSERT_EQUAL(SCROW(5), aReverser.resort(8)); + } + + { + sc::SortOrderReverser aReverser; + aReverser.addOrderIndices({ 3, 1, 4, 2 }, 5, 8); + + CPPUNIT_ASSERT_EQUAL(SCROW(6), aReverser.resort(5)); + CPPUNIT_ASSERT_EQUAL(SCROW(8), aReverser.resort(6)); + CPPUNIT_ASSERT_EQUAL(SCROW(5), aReverser.resort(7)); + CPPUNIT_ASSERT_EQUAL(SCROW(7), aReverser.resort(8)); + } +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/core/data/SheetView.cxx b/sc/source/core/data/SheetView.cxx index f70a1000c272..b944b325e9d3 100644 --- a/sc/source/core/data/SheetView.cxx +++ b/sc/source/core/data/SheetView.cxx @@ -49,6 +49,23 @@ SCROW SortOrderReverser::unsort(SCROW nRow) const return nRow; } +SCROW SortOrderReverser::resort(SCROW nRow) const +{ + if (maOrder.empty()) + return nRow; + + if (nRow >= mnFirstRow && nRow <= mnLastRow) + { + SCCOLROW nOrderValue = nRow - mnFirstRow + 1; + for (size_t nIndex = 0; nIndex < maOrder.size(); ++nIndex) + { + if (maOrder[nIndex] == nOrderValue) + return mnFirstRow + nIndex; + } + } + return nRow; +} + SheetView::SheetView(ScTable* pTable, OUString const& rName, SheetViewID nID) : mpTable(pTable) , maName(rName) diff --git a/sc/source/ui/view/viewfunc.cxx b/sc/source/ui/view/viewfunc.cxx index 30c0dce7d68f..b79d88b420ea 100644 --- a/sc/source/ui/view/viewfunc.cxx +++ b/sc/source/ui/view/viewfunc.cxx @@ -876,7 +876,7 @@ void ScViewFunc::EnterData( SCCOL nCol, SCROW nRow, SCTAB nTab, if (pSheetView->getSortOrder()) nUnsortedRow = pSheetView->getSortOrder()->unsort(nUnsortedRow); if (pManager->getSortOrder()) - nUnsortedRow = pManager->getSortOrder()->unsort(nUnsortedRow); + nUnsortedRow = pManager->getSortOrder()->resort(nUnsortedRow); } applyText(*this, nCol, nUnsortedRow, rTab, rString, bNumFmtChanged); }
