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);

Reply via email to