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);
             }

Reply via email to