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 027dac2fb12e64bf15db654c5951e290be8be6c2 Author: Tomaž Vajngerl <[email protected]> AuthorDate: Fri Sep 12 23:41:17 2025 +0200 Commit: Tomaž Vajngerl <[email protected]> CommitDate: Fri Dec 19 08:53:41 2025 +0100 sc: synching 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]> 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 a17ee4c5e3fe..3f80cf13bba7 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 0e550e1742cf..913a8db21846 100644 --- a/sc/qa/unit/types/SortOrderReverserTest.cxx +++ b/sc/qa/unit/types/SortOrderReverserTest.cxx @@ -76,4 +76,27 @@ 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)); + } +} + /* 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 d4c5683974d6..7e370e7258c8 100644 --- a/sc/source/ui/view/viewfunc.cxx +++ b/sc/source/ui/view/viewfunc.cxx @@ -877,7 +877,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); }
