summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorTibor Nagy <nagy.tibor2@nisz.hu>2023-05-17 08:40:43 +0200
committerLászló Németh <nemeth@numbertext.org>2023-05-22 13:32:56 +0200
commit8af6c46a9c0e86bbbd908e96ff236ad1d6c4ddab (patch)
treefb3c7283678ef5476a446bca3eedc78126ae85c1 /sc
parent4a162c4cdc9fd95bdbeb6a71b9b7689f242c2906 (diff)
tdf#155319 sc: fix conditional format data bar after copying
This is a follow up to commit I064fb3fe0443705553c6bbfcc34f2d717e0f6bd6 (tdf#154906 tdf#129813 tdf#129814 sc: fix conditional format color scale) Change-Id: Iacc1f5af762e1f6a40ecd13c33384e4a3340822a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151860 Tested-by: Jenkins Tested-by: László Németh <nemeth@numbertext.org> Reviewed-by: László Németh <nemeth@numbertext.org>
Diffstat (limited to 'sc')
-rw-r--r--sc/inc/colorscale.hxx2
-rw-r--r--sc/qa/unit/ucalc_condformat.cxx51
-rw-r--r--sc/source/core/data/colorscale.cxx35
3 files changed, 88 insertions, 0 deletions
diff --git a/sc/inc/colorscale.hxx b/sc/inc/colorscale.hxx
index 90a973391995..6652e224fe67 100644
--- a/sc/inc/colorscale.hxx
+++ b/sc/inc/colorscale.hxx
@@ -313,6 +313,8 @@ public:
const ScDataBarFormatData* GetDataBarData() const;
ScDataBarFormatData* GetDataBarData();
+ bool IsEqual(const ScFormatEntry& r, bool bIgnoreSrcPos) const override;
+
virtual void UpdateReference( sc::RefUpdateContext& rCxt ) override;
virtual void UpdateInsertTab( sc::RefUpdateInsertTabContext& rCxt ) override;
virtual void UpdateDeleteTab( sc::RefUpdateDeleteTabContext& rCxt ) override;
diff --git a/sc/qa/unit/ucalc_condformat.cxx b/sc/qa/unit/ucalc_condformat.cxx
index bfece1515a89..78978daec33a 100644
--- a/sc/qa/unit/ucalc_condformat.cxx
+++ b/sc/qa/unit/ucalc_condformat.cxx
@@ -268,6 +268,57 @@ CPPUNIT_TEST_FIXTURE(TestCondformat, testCondFormatInsertDeleteSheets)
m_pDoc->DeleteTab(0);
}
+CPPUNIT_TEST_FIXTURE(TestCondformat, testDataBarCondCopyPaste)
+{
+ m_pDoc->InsertTab(0, "Test");
+
+ auto pFormat = std::make_unique<ScConditionalFormat>(1, m_pDoc);
+ ScRange aCondFormatRange(0, 0, 0, 2, 0, 0);
+ ScRangeList aRangeList(aCondFormatRange);
+ pFormat->SetRange(aRangeList);
+
+ ScDataBarFormat* pDatabar = new ScDataBarFormat(m_pDoc);
+ ScDataBarFormatData* pFormatData = new ScDataBarFormatData();
+ pFormatData->meAxisPosition = databar::AUTOMATIC;
+ pFormatData->maPositiveColor = COL_BLUE;
+ pFormatData->mxNegativeColor = COL_GREEN;
+ pFormatData->mbGradient = true;
+
+ pDatabar->SetDataBarData(pFormatData);
+ pFormat->AddEntry(pDatabar);
+
+ sal_uLong nIndex = m_pDoc->AddCondFormat(std::move(pFormat), 0);
+
+ ScDocument aClipDoc(SCDOCMODE_CLIP);
+ copyToClip(m_pDoc, aCondFormatRange, &aClipDoc);
+
+ ScRange aTargetRange(0, 3, 0, 2, 3, 0);
+ pasteFromClip(m_pDoc, aTargetRange, &aClipDoc);
+
+ // Pasting the same conditional format must modify existing format, making its range
+ // combined of previous range and newly pasted range having the conditional format.
+ // No new conditional formats must be created.
+ CPPUNIT_ASSERT_EQUAL(size_t(1), m_pDoc->GetCondFormList(0)->size());
+ aRangeList.Join(aTargetRange);
+ for (SCCOL nCol = 0; nCol < 3; ++nCol)
+ {
+ ScConditionalFormat* pPastedFormat = m_pDoc->GetCondFormat(nCol, 3, 0);
+ CPPUNIT_ASSERT(pPastedFormat);
+ CPPUNIT_ASSERT_EQUAL(aRangeList, pPastedFormat->GetRange());
+
+ sal_uLong nPastedKey = pPastedFormat->GetKey();
+ CPPUNIT_ASSERT_EQUAL(nIndex, nPastedKey);
+
+ const SfxPoolItem* pItem = m_pDoc->GetAttr(nCol, 3, 0, ATTR_CONDITIONAL);
+ const ScCondFormatItem* pCondFormatItem = static_cast<const ScCondFormatItem*>(pItem);
+ CPPUNIT_ASSERT(pCondFormatItem);
+ CPPUNIT_ASSERT_EQUAL(size_t(1), pCondFormatItem->GetCondFormatData().size());
+ CPPUNIT_ASSERT_EQUAL(sal_uInt32(nIndex), pCondFormatItem->GetCondFormatData().front());
+ }
+
+ m_pDoc->DeleteTab(0);
+}
+
CPPUNIT_TEST_FIXTURE(TestCondformat, testColorScaleCondCopyPaste)
{
m_pDoc->InsertTab(0, "Test");
diff --git a/sc/source/core/data/colorscale.cxx b/sc/source/core/data/colorscale.cxx
index 7fd48f47305d..1d713c447c5b 100644
--- a/sc/source/core/data/colorscale.cxx
+++ b/sc/source/core/data/colorscale.cxx
@@ -802,6 +802,41 @@ ScFormatEntry::Type ScDataBarFormat::GetType() const
return Type::Databar;
}
+bool ScDataBarFormat::IsEqual(const ScFormatEntry& rOther, bool /*bIgnoreSrcPos*/) const
+{
+ if (GetType() != rOther.GetType())
+ return false;
+
+ const ScDataBarFormat& r = static_cast<const ScDataBarFormat&>(rOther);
+
+ bool bEq = (mpFormatData->maAxisColor.IsRGBEqual(r.mpFormatData->maAxisColor)
+ && mpFormatData->maPositiveColor.IsRGBEqual(r.mpFormatData->maPositiveColor)
+ && mpFormatData->mxNegativeColor == r.mpFormatData->mxNegativeColor
+ && mpFormatData->meAxisPosition == r.mpFormatData->meAxisPosition
+ && mpFormatData->mbGradient == r.mpFormatData->mbGradient
+ && mpFormatData->mbOnlyBar == r.mpFormatData->mbOnlyBar);
+
+ if (mpFormatData->mpUpperLimit->GetType() == r.mpFormatData->mpUpperLimit->GetType()
+ && bEq)
+ {
+ bEq = (mpFormatData->mpUpperLimit->GetColor().IsRGBEqual(
+ r.mpFormatData->mpUpperLimit->GetColor())
+ && mpFormatData->mpUpperLimit->GetValue()
+ == r.mpFormatData->mpUpperLimit->GetValue());
+ }
+
+ if (mpFormatData->mpLowerLimit->GetType() == r.mpFormatData->mpLowerLimit->GetType()
+ && bEq)
+ {
+ bEq = (mpFormatData->mpLowerLimit->GetColor().IsRGBEqual(
+ r.mpFormatData->mpLowerLimit->GetColor())
+ && mpFormatData->mpLowerLimit->GetValue()
+ == r.mpFormatData->mpLowerLimit->GetValue());
+ }
+
+ return bEq;
+}
+
void ScDataBarFormat::UpdateReference( sc::RefUpdateContext& rCxt )
{
mpFormatData->mpUpperLimit->UpdateReference(rCxt);