sc/inc/colorscale.hxx | 2 + sc/qa/unit/ucalc_condformat.cxx | 53 +++++++++++++++++++++++++++++++++++++ sc/source/core/data/colorscale.cxx | 35 ++++++++++++++++++++++++ 3 files changed, 90 insertions(+)
New commits: commit c0529c1c3aa6d905b9e4824054c6f9effab329b7 Author: Tibor Nagy <nagy.tib...@nisz.hu> AuthorDate: Wed May 17 08:40:43 2023 +0200 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Thu May 25 10:34:59 2023 +0200 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 <nem...@numbertext.org> Reviewed-by: László Németh <nem...@numbertext.org> Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152115 diff --git a/sc/inc/colorscale.hxx b/sc/inc/colorscale.hxx index 513eb11cf2f4..88e35775419a 100644 --- a/sc/inc/colorscale.hxx +++ b/sc/inc/colorscale.hxx @@ -310,6 +310,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 e523968e4e37..005addc1fcb6 100644 --- a/sc/qa/unit/ucalc_condformat.cxx +++ b/sc/qa/unit/ucalc_condformat.cxx @@ -93,6 +93,7 @@ public: void testCondFormatInsertRow(); void testCondFormatInsertCol(); void testCondFormatInsertDeleteSheets(); + void testDataBarCondCopyPaste(); void testColorScaleCondCopyPaste(); void testCondCopyPaste(); void testCondCopyPasteSingleCell(); //e.g. fdo#82503 @@ -139,6 +140,7 @@ public: CPPUNIT_TEST(testCondFormatInsertRow); CPPUNIT_TEST(testCondFormatInsertCol); CPPUNIT_TEST(testCondFormatInsertDeleteSheets); + CPPUNIT_TEST(testDataBarCondCopyPaste); CPPUNIT_TEST(testColorScaleCondCopyPaste); CPPUNIT_TEST(testCondCopyPaste); CPPUNIT_TEST(testCondCopyPasteSingleCell); @@ -353,6 +355,57 @@ void TestCondformat::testCondFormatInsertDeleteSheets() m_pDoc->DeleteTab(0); } +void 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); +} + void TestCondformat::testColorScaleCondCopyPaste() { m_pDoc->InsertTab(0, "Test"); diff --git a/sc/source/core/data/colorscale.cxx b/sc/source/core/data/colorscale.cxx index 192dd1cea78c..43be13b5f320 100644 --- a/sc/source/core/data/colorscale.cxx +++ b/sc/source/core/data/colorscale.cxx @@ -781,6 +781,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);