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