summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sc/inc/column.hxx2
-rw-r--r--sc/source/core/data/column3.cxx60
-rw-r--r--sc/source/core/data/table3.cxx6
3 files changed, 68 insertions, 0 deletions
diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index b8e348d00e70..2f22ada03caa 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -544,6 +544,8 @@ public:
sc::ColumnBlockConstPosition& rBlockPos, SCROW nStartRow, SCROW nEndRow,
ScFilterEntries& rFilterEntries, bool bFiltering );
+ void GetBackColorFilterEntries(SCROW nRow1, SCROW nRow2, ScFilterEntries& rFilterEntries );
+
bool GetDataEntries( SCROW nRow, std::set<ScTypedStrData>& rStrings) const;
void UpdateInsertTabAbs(SCTAB nNewPos);
diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx
index 69a32eaad433..ebec09e581ef 100644
--- a/sc/source/core/data/column3.cxx
+++ b/sc/source/core/data/column3.cxx
@@ -2720,6 +2720,66 @@ void ScColumn::GetFilterEntries(
sc::ParseAll(rBlockPos.miCellPos, maCells, nStartRow, nEndRow, aFunc, aFunc);
}
+void ScColumn::GetBackColorFilterEntries(SCROW nRow1, SCROW nRow2, ScFilterEntries& rFilterEntries)
+{
+ Color aBackColor;
+ bool bCondBackColor = false;
+ ScAddress aCell(GetCol(), 0, GetTab());
+ ScConditionalFormat* pCondFormat = nullptr;
+
+ const SfxItemSet* pCondSet = nullptr;
+ const SvxBrushItem* pBrush = nullptr;
+ const ScPatternAttr* pPattern = nullptr;
+ const ScColorScaleFormat* pColFormat = nullptr;
+
+ if (!GetDoc().ValidRow(nRow1) || !GetDoc().ValidRow(nRow2))
+ return;
+
+ while (nRow1 <= nRow2)
+ {
+ aCell.SetRow(nRow1);
+ pPattern = GetDoc().GetPattern(aCell.Col(), aCell.Row(), aCell.Tab());
+ if (pPattern)
+ {
+ if (!pPattern->GetItem(ATTR_CONDITIONAL).GetCondFormatData().empty())
+ {
+ pCondSet = GetDoc().GetCondResult(GetCol(), nRow1, GetTab());
+ pBrush = &pPattern->GetItem(ATTR_BACKGROUND, pCondSet);
+ aBackColor = pBrush->GetColor();
+ bCondBackColor = true;
+ }
+ }
+
+ pCondFormat = GetDoc().GetCondFormat(aCell.Col(), aCell.Row(), aCell.Tab());
+ if (pCondFormat)
+ {
+ for (size_t nFormat = 0; nFormat < pCondFormat->size(); nFormat++)
+ {
+ auto aEntry = pCondFormat->GetEntry(nFormat);
+ if (aEntry->GetType() == ScFormatEntry::Type::Colorscale)
+ {
+ pColFormat = static_cast<const ScColorScaleFormat*>(aEntry);
+ std::optional<Color> oColor = pColFormat->GetColor(aCell);
+ if (oColor)
+ {
+ aBackColor = *oColor;
+ bCondBackColor = true;
+ }
+ }
+ }
+ }
+
+ if (!bCondBackColor)
+ {
+ pBrush = GetDoc().GetAttr(aCell, ATTR_BACKGROUND);
+ aBackColor = pBrush->GetColor();
+ }
+
+ rFilterEntries.addBackgroundColor(aBackColor);
+ nRow1++;
+ }
+}
+
namespace {
/**
diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx
index efcc910dc696..e4b13f8ad17f 100644
--- a/sc/source/core/data/table3.cxx
+++ b/sc/source/core/data/table3.cxx
@@ -2968,6 +2968,12 @@ void ScTable::GetFilterEntries( SCCOL nCol, SCROW nRow1, SCROW nRow2, ScFilterEn
sc::ColumnBlockConstPosition aBlockPos;
aCol[nCol].InitBlockPosition(aBlockPos);
aCol[nCol].GetFilterEntries(aBlockPos, nRow1, nRow2, rFilterEntries, bFiltering);
+
+ SCROW nLastRow = aBlockPos.miCellPos->position;
+ if (nLastRow < nRow2)
+ {
+ aCol[nCol].GetBackColorFilterEntries(nLastRow, nRow2, rFilterEntries);
+ }
}
void ScTable::GetFilteredFilterEntries(