sc/source/core/data/queryevaluator.cxx |   59 +--------------------------------
 sc/source/core/data/table5.cxx         |   16 ++++++++
 2 files changed, 18 insertions(+), 57 deletions(-)

New commits:
commit 240c2410973e5eec1793656538619560a28a500f
Author:     Samuel Mehrbrodt <samuel.mehrbr...@allotropia.de>
AuthorDate: Thu Apr 27 11:01:02 2023 +0200
Commit:     Samuel Mehrbrodt <samuel.mehrbr...@allotropia.de>
CommitDate: Mon May 8 12:12:15 2023 +0200

    tdf#144549 Consider number format colors when filtering/sorting by color
    
    Change-Id: Ie2e7aa42c15967c1ce04157163b37798522f7349
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151091
    Tested-by: Jenkins
    Reviewed-by: Samuel Mehrbrodt <samuel.mehrbr...@allotropia.de>

diff --git a/sc/source/core/data/queryevaluator.cxx 
b/sc/source/core/data/queryevaluator.cxx
index 2562e513c670..a8a08d9edfd9 100644
--- a/sc/source/core/data/queryevaluator.cxx
+++ b/sc/source/core/data/queryevaluator.cxx
@@ -593,26 +593,7 @@ std::pair<bool, bool> 
ScQueryEvaluator::compareByTextColor(SCCOL nCol, SCROW nRo
                                                            const 
ScQueryEntry::Item& rItem)
 {
     ScAddress aPos(nCol, nRow, mrTab.GetTab());
-    Color color;
-    bool bHasConditionalColor = false;
-    // Text color can be set via conditional formatting - check that first
-    const ScPatternAttr* pPattern = mrDoc.GetPattern(nCol, nRow, 
mrTab.GetTab());
-    if (pPattern)
-    {
-        if (!pPattern->GetItem(ATTR_CONDITIONAL).GetCondFormatData().empty())
-        {
-            const SfxItemSet* pCondSet = mrDoc.GetCondResult(nCol, nRow, 
mrTab.GetTab());
-            const SvxColorItem* pColor = &pPattern->GetItem(ATTR_FONT_COLOR, 
pCondSet);
-            color = pColor->GetValue();
-            bHasConditionalColor = true;
-        }
-    }
-
-    if (!bHasConditionalColor)
-    {
-        const SvxColorItem* pColor = mrDoc.GetAttr(aPos, ATTR_FONT_COLOR);
-        color = pColor->GetValue();
-    }
+    Color color = mrTab.GetCellTextColor(aPos);
 
     bool bMatch = rItem.maColor == color;
     return std::pair<bool, bool>(bMatch, false);
@@ -622,43 +603,7 @@ std::pair<bool, bool> 
ScQueryEvaluator::compareByBackgroundColor(SCCOL nCol, SCR
                                                                  const 
ScQueryEntry::Item& rItem)
 {
     ScAddress aPos(nCol, nRow, mrTab.GetTab());
-    Color color;
-
-    // Background color can be set via conditional formatting - check that 
first
-    bool bHasConditionalColor = false;
-    const ScPatternAttr* pPattern = mrDoc.GetPattern(nCol, nRow, 
mrTab.GetTab());
-    if (pPattern)
-    {
-        if (!pPattern->GetItem(ATTR_CONDITIONAL).GetCondFormatData().empty())
-        {
-            const SfxItemSet* pCondSet = mrDoc.GetCondResult(nCol, nRow, 
mrTab.GetTab());
-            const SvxBrushItem* pBackgroundColor = 
&pPattern->GetItem(ATTR_BACKGROUND, pCondSet);
-            color = pBackgroundColor->GetColor();
-            bHasConditionalColor = true;
-        }
-    }
-
-    ScConditionalFormat* pCondFormat = mrDoc.GetCondFormat(nCol, nRow, 
mrTab.GetTab());
-    if (pCondFormat)
-    {
-        for (size_t i = 0; i < pCondFormat->size(); i++)
-        {
-            auto aEntry = pCondFormat->GetEntry(i);
-            if (aEntry->GetType() == ScFormatEntry::Type::Colorscale)
-            {
-                const ScColorScaleFormat* pColFormat
-                    = static_cast<const ScColorScaleFormat*>(aEntry);
-                color = *(pColFormat->GetColor(aPos));
-                bHasConditionalColor = true;
-            }
-        }
-    }
-
-    if (!bHasConditionalColor)
-    {
-        const SvxBrushItem* pBrush = mrDoc.GetAttr(aPos, ATTR_BACKGROUND);
-        color = pBrush->GetColor();
-    }
+    Color color = mrTab.GetCellBackgroundColor(aPos);
 
     bool bMatch = rItem.maColor == color;
     return std::pair<bool, bool>(bMatch, false);
diff --git a/sc/source/core/data/table5.cxx b/sc/source/core/data/table5.cxx
index be866aa634ea..a238cde6c32d 100644
--- a/sc/source/core/data/table5.cxx
+++ b/sc/source/core/data/table5.cxx
@@ -39,12 +39,15 @@
 #include <userdat.hxx>
 #include <conditio.hxx>
 #include <colorscale.hxx>
+#include <cellform.hxx>
 
 #include <com/sun/star/sheet/TablePageBreakData.hpp>
 
 #include <editeng/brushitem.hxx>
 #include <editeng/colritem.hxx>
 #include <osl/diagnose.h>
+#include <svl/numformat.hxx>
+#include <svl/zformat.hxx>
 
 #include <algorithm>
 #include <limits>
@@ -1100,6 +1103,19 @@ Color ScTable::GetCellTextColor(ScAddress aPos) const
             const SvxColorItem* pColor = &pPattern->GetItem(ATTR_FONT_COLOR, 
pCondSet);
             return pColor->GetValue();
         }
+
+        if (pPattern->GetItem(ATTR_VALUE_FORMAT).GetValue())
+        {
+            SvNumberFormatter* pNumberFormatter = GetDoc().GetFormatTable();
+            const SfxUInt32Item pItem = pPattern->GetItem(ATTR_VALUE_FORMAT);
+            auto& rDoc = const_cast<ScDocument&>(GetDoc());
+            const Color* pColor;
+            ScRefCellValue aCell(rDoc, aPos);
+            ScCellFormat::GetString(rDoc, aPos, pItem.GetValue(), &pColor, 
*pNumberFormatter, false,
+                                    false);
+            if (pColor)
+                return *pColor;
+        }
     }
 
     const SvxColorItem* pColor = GetDoc().GetAttr(aPos, ATTR_FONT_COLOR);

Reply via email to