sc/inc/column.hxx                       |    2 +-
 sc/inc/document.hxx                     |    2 +-
 sc/inc/table.hxx                        |    2 +-
 sc/inc/validat.hxx                      |    4 ++--
 sc/qa/unit/subsequent_export_test.cxx   |    6 ++----
 sc/qa/unit/subsequent_export_test4.cxx  |    8 ++++----
 sc/qa/unit/subsequent_filters_test3.cxx |   18 +++++++-----------
 sc/qa/unit/ucalc.cxx                    |    4 ++--
 sc/qa/unit/ucalc_formula.cxx            |   13 +++++++------
 sc/source/core/data/column3.cxx         |    2 +-
 sc/source/core/data/documen3.cxx        |   14 ++++++++++++--
 sc/source/core/data/table3.cxx          |    2 +-
 sc/source/core/data/validat.cxx         |   10 +++++-----
 sc/source/ui/app/inputhdl.cxx           |    5 ++++-
 sc/source/ui/view/gridwin.cxx           |    2 +-
 15 files changed, 51 insertions(+), 43 deletions(-)

New commits:
commit ce2a5f6bc80a7a206051d7a81fcc6e87f1fab972
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Tue Aug 20 15:29:46 2024 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Tue Aug 20 21:39:04 2024 +0200

    tdf#162459 Validation list is always displayed in ascending order
    
    Revert
    commit 639a1f39dd45a6ff71eec2c073a84a9f181e350f.
    optimise GetDataEntries a little
    
    Change-Id: I6a08ddfaebea7c8f7a00f01d0237f75dae9abd98
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172129
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index 510533a711e5..22e3ad1e284c 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -605,7 +605,7 @@ public:
 
     void GetBackColorFilterEntries(SCROW nRow1, SCROW nRow2, ScFilterEntries& 
rFilterEntries );
 
-    bool GetDataEntries( SCROW nRow, ScTypedCaseStrSet& rStrings) const;
+    bool GetDataEntries( SCROW nRow, std::set<ScTypedStrData>& rStrings) const;
 
     void UpdateInsertTabAbs(SCTAB nNewPos);
     bool    TestTabRefAbs(SCTAB nTable) const;
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index f550dc60d8f6..f5f2c3487c75 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -2276,7 +2276,7 @@ public:
                                             ScFilterEntries& rFilterEntries );
 
     void              GetDataEntries( SCCOL nCol, SCROW nRow, SCTAB nTab,
-                                      ScTypedCaseStrSet& rStrings, bool 
bValidation = false );
+                                      std::vector<ScTypedStrData>& rStrings, 
bool bValidation = false );
     void              GetFormulaEntries( ScTypedCaseStrSet& rStrings );
 
     bool               HasAutoFilter( SCCOL nCol, SCROW nRow, SCTAB nTab );
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index 473aad3cba00..7da55e4cb3ee 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -1031,7 +1031,7 @@ public:
     void GetFilterEntries(SCCOL nCol, SCROW nRow1, SCROW nRow2, 
ScFilterEntries& rFilterEntries, bool bFiltering = false);
     void GetFilteredFilterEntries(SCCOL nCol, SCROW nRow1, SCROW nRow2, const 
ScQueryParam& rParam, ScFilterEntries& rFilterEntries, bool bFiltering );
     [[nodiscard]]
-    bool GetDataEntries(SCCOL nCol, SCROW nRow, ScTypedCaseStrSet& rStrings);
+    bool GetDataEntries(SCCOL nCol, SCROW nRow, std::set<ScTypedStrData>& 
rStrings);
 
     bool        HasColHeader( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, 
SCROW nEndRow ) const;
     bool        HasRowHeader( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, 
SCROW nEndRow ) const;
diff --git a/sc/inc/validat.hxx b/sc/inc/validat.hxx
index 68d48b7e98a7..4afd9e2ba8f2 100644
--- a/sc/inc/validat.hxx
+++ b/sc/inc/validat.hxx
@@ -126,7 +126,7 @@ public:
         @descr  Fills the list only, if this is a list validation and 
IsShowList() is enabled.
         @param rStrings  (out-param) The string list to fill with list 
validation entries.
         @return  true = rStrings has been filled with at least one entry. */
-    SC_DLLPUBLIC bool FillSelectionList(ScTypedCaseStrSet& rStrings, const 
ScAddress& rPos) const;
+    SC_DLLPUBLIC bool FillSelectionList(std::vector<ScTypedStrData>& rStrings, 
const ScAddress& rPos) const;
 
     //  with string: during input, with cell: for detective / RC_FORCED
     bool IsDataValid(
@@ -181,7 +181,7 @@ private:
         @param rMatch    (out-param) the index of the first item that matched, 
-1 if nothing matched.
         @return  true = Cell range found, rRange is valid, or an error entry 
stuffed into the list if pCell==NULL. */
     bool GetSelectionFromFormula(
-        ScTypedCaseStrSet* pStrings, ScRefCellValue& rCell, const ScAddress& 
rPos,
+        std::vector<ScTypedStrData>* pStrings, ScRefCellValue& rCell, const 
ScAddress& rPos,
         const ScTokenArray& rTokArr, int& rMatch) const;
 
     /** Tests, if pCell is equal to what the passed token array represents. */
diff --git a/sc/qa/unit/subsequent_export_test.cxx 
b/sc/qa/unit/subsequent_export_test.cxx
index da7e5d5c19ca..dde63a313271 100644
--- a/sc/qa/unit/subsequent_export_test.cxx
+++ b/sc/qa/unit/subsequent_export_test.cxx
@@ -336,12 +336,10 @@ CPPUNIT_TEST_FIXTURE(ScExportTest, 
testTdf99856_dataValidationTest)
     CPPUNIT_ASSERT(pData);
 
     // Excel can't open corrupt file if the list is longer than 255 characters
-    ScTypedCaseStrSet aList;
+    std::vector<ScTypedStrData> aList;
     pData->FillSelectionList(aList, ScAddress(0, 1, 1));
     CPPUNIT_ASSERT_EQUAL(size_t(18), aList.size());
-    auto it = aList.begin();
-    std::advance(it, 17);
-    CPPUNIT_ASSERT_EQUAL(u"9 Mississippi"_ustr, it->GetString());
+    CPPUNIT_ASSERT_EQUAL(u"18 Missis"_ustr, aList[17].GetString());
 }
 
 CPPUNIT_TEST_FIXTURE(ScExportTest, testProtectionKeyODS_UTF16LErtlSHA1)
diff --git a/sc/qa/unit/subsequent_export_test4.cxx 
b/sc/qa/unit/subsequent_export_test4.cxx
index 3fef1f6dc203..fbf31673ada3 100644
--- a/sc/qa/unit/subsequent_export_test4.cxx
+++ b/sc/qa/unit/subsequent_export_test4.cxx
@@ -201,7 +201,7 @@ CPPUNIT_TEST_FIXTURE(ScExportTest4, testTdf151484)
         const ScValidationData* pData = pDoc->GetValidationEntry(1);
         CPPUNIT_ASSERT(pData);
 
-        ScTypedCaseStrSet aList;
+        std::vector<ScTypedStrData> aList;
         pData->FillSelectionList(aList, ScAddress(0, 1, 0));
 
         // Without the fix in place, this test would have failed with
@@ -209,9 +209,9 @@ CPPUNIT_TEST_FIXTURE(ScExportTest4, testTdf151484)
         // - Actual  : 1
         // - Failed on filter: MS Excel 97
         CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), size_t(4), 
aList.size());
-        auto it = aList.begin();
-        for (size_t j = 0; j < 4; ++j, ++it)
-            CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), double(j + 
1), it->GetValue());
+        for (size_t j = 0; j < 4; ++j)
+            CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), double(j + 
1),
+                                         aList[j].GetValue());
     }
 }
 
diff --git a/sc/qa/unit/subsequent_filters_test3.cxx 
b/sc/qa/unit/subsequent_filters_test3.cxx
index e2808a623070..6358d0acd770 100644
--- a/sc/qa/unit/subsequent_filters_test3.cxx
+++ b/sc/qa/unit/subsequent_filters_test3.cxx
@@ -1531,12 +1531,11 @@ CPPUNIT_TEST_FIXTURE(ScFiltersTest3, testTdf104310)
         CPPUNIT_ASSERT(pData);
 
         // Make sure the list is correct.
-        ScTypedCaseStrSet aList;
+        std::vector<ScTypedStrData> aList;
         pData->FillSelectionList(aList, ScAddress(0, 1, 0));
         CPPUNIT_ASSERT_EQUAL(size_t(5), aList.size());
-        auto it = aList.begin();
-        for (size_t i = 0; i < 5; ++i, ++it)
-            CPPUNIT_ASSERT_DOUBLES_EQUAL(double(i + 1), it->GetValue(), 1e-8);
+        for (size_t i = 0; i < 5; ++i)
+            CPPUNIT_ASSERT_DOUBLES_EQUAL(double(i + 1), aList[i].GetValue(), 
1e-8);
     }
 
     // 2. Test x12ac extension
@@ -1548,15 +1547,12 @@ CPPUNIT_TEST_FIXTURE(ScFiltersTest3, testTdf104310)
         CPPUNIT_ASSERT(pData);
 
         // Make sure the list is correct.
-        ScTypedCaseStrSet aList;
+        std::vector<ScTypedStrData> aList;
         pData->FillSelectionList(aList, ScAddress(0, 1, 0));
         CPPUNIT_ASSERT_EQUAL(size_t(3), aList.size());
-        auto it = aList.begin();
-        CPPUNIT_ASSERT_EQUAL(u"1"_ustr, it->GetString());
-        ++it;
-        CPPUNIT_ASSERT_EQUAL(u"4"_ustr, it->GetString());
-        ++it;
-        CPPUNIT_ASSERT_EQUAL(u"2,3"_ustr, it->GetString());
+        CPPUNIT_ASSERT_EQUAL(u"1"_ustr, aList[0].GetString());
+        CPPUNIT_ASSERT_EQUAL(u"2,3"_ustr, aList[1].GetString());
+        CPPUNIT_ASSERT_EQUAL(u"4"_ustr, aList[2].GetString());
     }
 }
 
diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index 82b88381c79d..3d0686c2cc77 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -830,12 +830,12 @@ CPPUNIT_TEST_FIXTURE(Test, testDataEntries)
     m_pDoc->SetString(ScAddress(0,7,0), u"Charlie"_ustr);
     m_pDoc->SetString(ScAddress(0,10,0), u"Andy"_ustr);
 
-    ScTypedCaseStrSet aEntries;
+    std::vector<ScTypedStrData> aEntries;
     m_pDoc->GetDataEntries(0, 0, 0, aEntries); // Try at the very top.
 
     // Entries are supposed to be sorted in ascending order, and are all 
unique.
     CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), aEntries.size());
-    auto it = aEntries.begin();
+    std::vector<ScTypedStrData>::const_iterator it = aEntries.begin();
     CPPUNIT_ASSERT_EQUAL(u"Andy"_ustr, it->GetString());
     ++it;
     CPPUNIT_ASSERT_EQUAL(u"Bruce"_ustr, it->GetString());
diff --git a/sc/qa/unit/ucalc_formula.cxx b/sc/qa/unit/ucalc_formula.cxx
index 4d3ff42ac14c..1660ce5daba4 100644
--- a/sc/qa/unit/ucalc_formula.cxx
+++ b/sc/qa/unit/ucalc_formula.cxx
@@ -4211,7 +4211,7 @@ CPPUNIT_TEST_FIXTURE(TestFormula, 
testFormulaRefUpdateValidity)
 {
     struct {
 
-        bool checkList( ScTypedCaseStrSet& rList )
+        bool checkList( std::vector<ScTypedStrData>& rList )
         {
             double aExpected[] = { 1.0, 2.0, 3.0 }; // must be sorted.
             size_t nCheckSize = SAL_N_ELEMENTS(aExpected);
@@ -4222,13 +4222,14 @@ CPPUNIT_TEST_FIXTURE(TestFormula, 
testFormulaRefUpdateValidity)
                 return false;
             }
 
-            auto it = rList.begin();
-            for (size_t i = 0; i < nCheckSize; ++i, ++it)
+            std::sort(rList.begin(), rList.end(), 
ScTypedStrData::LessCaseSensitive());
+
+            for (size_t i = 0; i < nCheckSize; ++i)
             {
-                if (aExpected[i] != it->GetValue())
+                if (aExpected[i] != rList[i].GetValue())
                 {
                     cerr << "Incorrect value at position " << i
-                        << ": expected=" << aExpected[i] << ", actual=" << 
it->GetValue() << endl;
+                        << ": expected=" << aExpected[i] << ", actual=" << 
rList[i].GetValue() << endl;
                     return false;
                 }
             }
@@ -4265,7 +4266,7 @@ CPPUNIT_TEST_FIXTURE(TestFormula, 
testFormulaRefUpdateValidity)
     CPPUNIT_ASSERT(pData);
 
     // Make sure the list is correct.
-    ScTypedCaseStrSet aList;
+    std::vector<ScTypedStrData> aList;
     pData->FillSelectionList(aList, ScAddress(0,1,0));
     bool bGood = aCheck.checkList(aList);
     CPPUNIT_ASSERT_MESSAGE("Initial list is incorrect.", bGood);
diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx
index d8b70b38a99d..26fcd36de0ba 100644
--- a/sc/source/core/data/column3.cxx
+++ b/sc/source/core/data/column3.cxx
@@ -2902,7 +2902,7 @@ public:
 
 // GetDataEntries - Strings from continuous Section around nRow
 bool ScColumn::GetDataEntries(
-    SCROW nStartRow, ScTypedCaseStrSet& rStrings) const
+    SCROW nStartRow, std::set<ScTypedStrData>& rStrings) const
 {
     // Start at the specified row position, and collect all string values
     // going upward and downward directions in parallel. The start position
diff --git a/sc/source/core/data/documen3.cxx b/sc/source/core/data/documen3.cxx
index c59172b4fc39..6007ecf6d78f 100644
--- a/sc/source/core/data/documen3.cxx
+++ b/sc/source/core/data/documen3.cxx
@@ -1627,7 +1627,7 @@ void ScDocument::GetFilterEntriesArea(
  */
 void ScDocument::GetDataEntries(
     SCCOL nCol, SCROW nRow, SCTAB nTab,
-    ScTypedCaseStrSet& rStrings, bool bValidation )
+    std::vector<ScTypedStrData>& rStrings, bool bValidation )
 {
     if( bValidation )
     {
@@ -1639,14 +1639,24 @@ void ScDocument::GetDataEntries(
         {
             const ScValidationData* pData = GetValidationEntry( nValidation );
             if( pData && pData->FillSelectionList( rStrings, ScAddress( nCol, 
nRow, nTab ) ) )
+            {
+                if (pData->GetListType() == 
css::sheet::TableValidationVisibility::SORTEDASCENDING)
+                    sortAndRemoveDuplicates(rStrings, true/*bCaseSens*/);
+
                 return;
+            }
         }
     }
 
     if (!HasTable(nTab))
         return;
 
-    (void) maTabs[nTab]->GetDataEntries(nCol, nRow, rStrings);
+    std::set<ScTypedStrData> aStrings;
+    if (maTabs[nTab]->GetDataEntries(nCol, nRow, aStrings))
+    {
+        rStrings.insert(rStrings.end(), aStrings.begin(), aStrings.end());
+        sortAndRemoveDuplicates(rStrings, true/*bCaseSens*/);
+    }
 }
 
 /**
diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx
index e0ce52d717b8..86c709f711c4 100644
--- a/sc/source/core/data/table3.cxx
+++ b/sc/source/core/data/table3.cxx
@@ -2935,7 +2935,7 @@ void ScTable::GetFilteredFilterEntries(
     }
 }
 
-bool ScTable::GetDataEntries(SCCOL nCol, SCROW nRow, ScTypedCaseStrSet& 
rStrings)
+bool ScTable::GetDataEntries(SCCOL nCol, SCROW nRow, std::set<ScTypedStrData>& 
rStrings)
 {
     if (!ValidCol(nCol) || nCol >= GetAllocatedColumnsCount())
         return false;
diff --git a/sc/source/core/data/validat.cxx b/sc/source/core/data/validat.cxx
index d467adcd215b..6a4a4aed064e 100644
--- a/sc/source/core/data/validat.cxx
+++ b/sc/source/core/data/validat.cxx
@@ -804,7 +804,7 @@ bool ScValidationData::HasSelectionList() const
 }
 
 bool ScValidationData::GetSelectionFromFormula(
-    ScTypedCaseStrSet* pStrings, ScRefCellValue& rCell, const ScAddress& rPos,
+    std::vector<ScTypedStrData>* pStrings, ScRefCellValue& rCell, const 
ScAddress& rPos,
     const ScTokenArray& rTokArr, int& rMatch) const
 {
     bool bOk = true;
@@ -985,7 +985,7 @@ bool ScValidationData::GetSelectionFromFormula(
             if( pEntry )
             {
                 assert(pStrings);
-                pStrings->insert(*pEntry);
+                pStrings->push_back(*pEntry);
                 n++;
             }
         }
@@ -996,7 +996,7 @@ bool ScValidationData::GetSelectionFromFormula(
     return bOk || rCell.isEmpty();
 }
 
-bool ScValidationData::FillSelectionList(ScTypedCaseStrSet& rStrColl, const 
ScAddress& rPos) const
+bool ScValidationData::FillSelectionList(std::vector<ScTypedStrData>& 
rStrColl, const ScAddress& rPos) const
 {
     bool bOk = false;
 
@@ -1013,8 +1013,8 @@ bool 
ScValidationData::FillSelectionList(ScTypedCaseStrSet& rStrColl, const ScAd
             double fValue;
             OUString aStr(pString);
             bool bIsValue = 
GetDocument()->GetFormatTable()->IsNumberFormat(aStr, nFormat, fValue);
-            rStrColl.insert( {
-                    aStr, fValue, fValue, bIsValue ? ScTypedStrData::Value : 
ScTypedStrData::Standard } );
+            rStrColl.emplace_back(
+                    aStr, fValue, fValue, bIsValue ? ScTypedStrData::Value : 
ScTypedStrData::Standard);
         }
         bOk = aIt.Ok();
 
diff --git a/sc/source/ui/app/inputhdl.cxx b/sc/source/ui/app/inputhdl.cxx
index 9968d161dd66..d9210251cc44 100644
--- a/sc/source/ui/app/inputhdl.cxx
+++ b/sc/source/ui/app/inputhdl.cxx
@@ -2068,8 +2068,11 @@ void ScInputHandler::GetColData()
     else
         pColumnData.reset( new ScTypedCaseStrSet );
 
+    std::vector<ScTypedStrData> aEntries;
     rDoc.GetDataEntries(
-        aCursorPos.Col(), aCursorPos.Row(), aCursorPos.Tab(), *pColumnData);
+        aCursorPos.Col(), aCursorPos.Row(), aCursorPos.Tab(), aEntries);
+    if (!aEntries.empty())
+        pColumnData->insert(aEntries.begin(), aEntries.end());
 
     miAutoPosColumn = pColumnData->end();
 }
diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx
index 6df4629748b4..34860443ca54 100644
--- a/sc/source/ui/view/gridwin.cxx
+++ b/sc/source/ui/view/gridwin.cxx
@@ -1536,7 +1536,7 @@ void ScGridWindow::LaunchDataSelectMenu(const SCCOL nCol, 
const SCROW nRow)
     const ScValidationData* pData = nIndex ? rDoc.GetValidationEntry(nIndex) : 
nullptr;
 
     bool bEmpty = false;
-    ScTypedCaseStrSet aStrings; // case sensitive
+    std::vector<ScTypedStrData> aStrings; // case sensitive
     // Fill List
     rDoc.GetDataEntries(nCol, nRow, nTab, aStrings, true /* bValidation */);
 

Reply via email to