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

Reply via email to