sc/inc/conditio.hxx                    |    2 +-
 sc/qa/unit/data/ods/tdf166669.ods      |binary
 sc/qa/unit/subsequent_export_test4.cxx |   28 ++++++++++++++++++++++++++++
 sc/source/core/data/conditio.cxx       |    4 ++--
 4 files changed, 31 insertions(+), 3 deletions(-)

New commits:
commit a7354ccdba7a608f66b98b4e0025a11504d15f11
Author:     Xisco Fauli <xiscofa...@libreoffice.org>
AuthorDate: Fri Jun 13 19:18:11 2025 +0200
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Fri Jun 13 22:10:08 2025 +0200

    tdf#166669: make conditional formatting for duplicates case insensitive
    
    Change-Id: I991082fe4c4ad94c1c8ed10caae37eba5c0b8e91
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/186471
    Tested-by: Jenkins
    Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org>

diff --git a/sc/inc/conditio.hxx b/sc/inc/conditio.hxx
index bf705f63154f..08c39189f3d2 100644
--- a/sc/inc/conditio.hxx
+++ b/sc/inc/conditio.hxx
@@ -366,7 +366,7 @@ public:
 
     virtual void SetParent( ScConditionalFormat* pNew ) override;
 
-    bool IsCellValid( const ScRefCellValue& rCell, const ScAddress& rPos ) 
const;
+    SC_DLLPUBLIC bool IsCellValid( const ScRefCellValue& rCell, const 
ScAddress& rPos ) const;
 
     ScConditionMode GetOperation() const        { return eOp; }
     void SetOperation(ScConditionMode eMode);
diff --git a/sc/qa/unit/data/ods/tdf166669.ods 
b/sc/qa/unit/data/ods/tdf166669.ods
new file mode 100644
index 000000000000..ccd32ad95f93
Binary files /dev/null and b/sc/qa/unit/data/ods/tdf166669.ods differ
diff --git a/sc/qa/unit/subsequent_export_test4.cxx 
b/sc/qa/unit/subsequent_export_test4.cxx
index de67cc5c0055..a72fdda464c6 100644
--- a/sc/qa/unit/subsequent_export_test4.cxx
+++ b/sc/qa/unit/subsequent_export_test4.cxx
@@ -215,6 +215,34 @@ CPPUNIT_TEST_FIXTURE(ScExportTest4, testTdf165383)
     verify();
 }
 
+CPPUNIT_TEST_FIXTURE(ScExportTest4, testTdf166669)
+{
+    auto verify = [this]() {
+        ScDocument* pDoc = getScDoc();
+        CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->GetCondFormList(0)->size());
+
+        ScConditionalFormat* pFormat = pDoc->GetCondFormat(0, 0, 0);
+        CPPUNIT_ASSERT(pFormat);
+
+        const ScFormatEntry* pEntry = pFormat->GetEntry(0);
+        CPPUNIT_ASSERT(pEntry);
+        CPPUNIT_ASSERT_EQUAL(ScFormatEntry::Type::Condition, 
pEntry->GetType());
+        const ScConditionEntry* pConditionEntry = static_cast<const 
ScConditionEntry*>(pEntry);
+        CPPUNIT_ASSERT_EQUAL(ScConditionMode::Duplicate, 
pConditionEntry->GetOperation());
+        for (SCROW row = 0; row < 5; ++row)
+        {
+            ScRefCellValue aCell(*pDoc, ScAddress(0, row, 0));
+            CPPUNIT_ASSERT_EQUAL(row == 4 ? false : true,
+                                 pConditionEntry->IsCellValid(aCell, 
ScAddress(0, row, 0)));
+        }
+    };
+
+    createScDoc("ods/tdf166669.ods");
+    verify();
+    saveAndReload(u"Calc Office Open XML"_ustr);
+    verify();
+}
+
 CPPUNIT_TEST_FIXTURE(ScExportTest4, testCommentTextHAlignment)
 {
     // Testing comment text alignments.
diff --git a/sc/source/core/data/conditio.cxx b/sc/source/core/data/conditio.cxx
index 36aa0f853cc5..2e2dee288b30 100644
--- a/sc/source/core/data/conditio.cxx
+++ b/sc/source/core/data/conditio.cxx
@@ -831,7 +831,7 @@ void ScConditionEntry::FillCache() const
                 if (!lcl_GetCellContent(aCell, false, nVal, aStr, mrDoc))
                 {
                     
std::pair<ScConditionEntryCache::StringCacheType::iterator, bool> aResult =
-                        mpCache->maStrings.emplace(aStr, 1);
+                        
mpCache->maStrings.emplace(ScGlobal::getCharClass().lowercase(aStr), 1);
 
                     if(!aResult.second)
                         aResult.first->second++;
@@ -866,7 +866,7 @@ bool ScConditionEntry::IsDuplicate( double nArg, const 
OUString& rStr ) const
     }
     else
     {
-        ScConditionEntryCache::StringCacheType::iterator itr = 
mpCache->maStrings.find(rStr);
+        ScConditionEntryCache::StringCacheType::iterator itr = 
mpCache->maStrings.find(ScGlobal::getCharClass().lowercase(rStr));
         if(itr == mpCache->maStrings.end())
             return false;
         else

Reply via email to