Rebased ref, commits from common ancestor:
commit 8ae63ad4564ca6b377f721b2573846d5d6511d5b
Author: Tomaž Vajngerl <[email protected]>
AuthorDate: Tue Mar 22 15:12:55 2022 +0900
Commit: Tomaž Vajngerl <[email protected]>
CommitDate: Tue Mar 22 15:12:55 2022 +0900
sc: split attrs out of SparklineGroup into a COW class
The attributes can be independent of the actual SparklineGroup,
so they can be shared through multiple SparklineGroups and with
the attributes being COW, they can be safely changed without the
fear that it will impact a different SparklineGroup insstance.
Change-Id: I274b1243d014288ea34a213326ef765ceff86a58
diff --git a/sc/Library_sc.mk b/sc/Library_sc.mk
index 7a7cf817e004..2c78147abf62 100644
--- a/sc/Library_sc.mk
+++ b/sc/Library_sc.mk
@@ -512,7 +512,9 @@ $(eval $(call gb_Library_add_exception_objects,sc,\
sc/source/ui/sidebar/NumberFormatControl \
sc/source/ui/sidebar/NumberFormatPropertyPanel \
sc/source/ui/sidebar/ScPanelFactory \
+ sc/source/ui/sparklines/SparklineAttributes \
sc/source/ui/sparklines/SparklineData \
+ sc/source/ui/sparklines/SparklineGroup \
sc/source/ui/StatisticsDialogs/AnalysisOfVarianceDialog \
sc/source/ui/StatisticsDialogs/CorrelationDialog \
sc/source/ui/StatisticsDialogs/CovarianceDialog \
diff --git a/sc/inc/SparklineAttributes.hxx b/sc/inc/SparklineAttributes.hxx
new file mode 100644
index 000000000000..1443c0b4b742
--- /dev/null
+++ b/sc/inc/SparklineAttributes.hxx
@@ -0,0 +1,140 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ */
+
+#pragma once
+
+#include "scdllapi.h"
+#include <sal/types.h>
+#include <tools/color.hxx>
+#include <optional>
+#include <o3tl/cow_wrapper.hxx>
+
+namespace sc
+{
+enum class SparklineType
+{
+ Line,
+ Column,
+ Stacked
+};
+
+enum class AxisType
+{
+ Individual,
+ Group,
+ Custom
+};
+
+enum class DisplayEmptyCellsAs
+{
+ Span,
+ Gap,
+ Zero
+};
+
+class SC_DLLPUBLIC SparklineAttributes
+{
+private:
+ class Implementation;
+ o3tl::cow_wrapper<Implementation> m_aImplementation;
+
+public:
+ SparklineAttributes();
+ ~SparklineAttributes();
+ SparklineAttributes(const SparklineAttributes& rOther);
+ SparklineAttributes(SparklineAttributes&& rOther);
+ SparklineAttributes& operator=(const SparklineAttributes& rOther);
+ SparklineAttributes& operator=(SparklineAttributes&& rOther);
+
+ bool operator==(const SparklineAttributes& rOther) const;
+ bool operator!=(const SparklineAttributes& rOther) const
+ {
+ return !(SparklineAttributes::operator==(rOther));
+ }
+
+ Color getColorSeries() const;
+ void setColorSeries(Color aColorSeries);
+
+ Color getColorNegative() const;
+ void setColorNegative(Color aColorSeries);
+
+ Color getColorAxis() const;
+ void setColorAxis(Color aColorSeries);
+
+ Color getColorMarkers() const;
+ void setColorMarkers(Color aColorSeries);
+
+ Color getColorFirst() const;
+ void setColorFirst(Color aColorSeries);
+
+ Color getColorLast() const;
+ void setColorLast(Color aColorSeries);
+
+ Color getColorHigh() const;
+ void setColorHigh(Color aColorSeries);
+
+ Color getColorLow() const;
+ void setColorLow(Color aColorSeries);
+
+ AxisType getMinAxisType() const;
+ void setMinAxisType(AxisType eAxisType);
+
+ AxisType getMaxAxisType() const;
+ void setMaxAxisType(AxisType eAxisType);
+
+ double getLineWeight() const;
+ void setLineWeight(double nWeight);
+
+ SparklineType getType() const;
+ void setType(SparklineType eType);
+
+ bool isDateAxis() const;
+ void setDateAxis(bool bValue);
+
+ DisplayEmptyCellsAs getDisplayEmptyCellsAs() const;
+ void setDisplayEmptyCellsAs(DisplayEmptyCellsAs eValue);
+
+ bool isMarkers() const;
+ void setMarkers(bool bValue);
+
+ bool isHigh() const;
+ void setHigh(bool bValue);
+
+ bool isLow() const;
+ void setLow(bool bValue);
+
+ bool isFirst() const;
+ void setFirst(bool bValue);
+
+ bool isLast() const;
+ void setLast(bool bValue);
+
+ bool isNegative() const;
+ void setNegative(bool bValue);
+
+ bool shouldDisplayXAxis() const;
+ void setDisplayXAxis(bool bValue);
+
+ bool shouldDisplayHidden() const;
+ void setDisplayHidden(bool bValue);
+
+ bool isRightToLeft() const;
+ void setRightToLeft(bool bValue);
+
+ std::optional<double> getManualMax() const;
+ void setManualMax(std::optional<double> aValue);
+
+ std::optional<double> getManualMin() const;
+ void setManualMin(std::optional<double> aValue);
+};
+
+} // end sc
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/inc/SparklineGroup.hxx b/sc/inc/SparklineGroup.hxx
index a045f8d659d1..8cddafd68e70 100644
--- a/sc/inc/SparklineGroup.hxx
+++ b/sc/inc/SparklineGroup.hxx
@@ -13,123 +13,23 @@
#include "scdllapi.h"
#include <tools/color.hxx>
#include <optional>
+#include <SparklineAttributes.hxx>
namespace sc
{
-enum class SparklineType
-{
- Line,
- Column,
- Stacked
-};
-
-enum class AxisType
-{
- Individual,
- Group,
- Custom
-};
-
-enum class DisplayEmptyCellAs
-{
- Span,
- Gap,
- Zero
-};
-
class SC_DLLPUBLIC SparklineGroup
{
-public:
- Color m_aColorSeries;
- Color m_aColorNegative;
- Color m_aColorAxis;
- Color m_aColorMarkers;
- Color m_aColorFirst;
- Color m_aColorLast;
- Color m_aColorHigh;
- Color m_aColorLow;
-
- AxisType m_eMinAxisType;
- AxisType m_eMaxAxisType;
-
- double m_fLineWeight; // In pt
+private:
+ SparklineAttributes m_aAttributes;
- SparklineType m_eType;
-
- bool m_bDateAxis;
-
- DisplayEmptyCellAs m_eDisplayEmptyCellsAs; // span, gap, zero
-
- bool m_bMarkers;
- bool m_bHigh;
- bool m_bLow;
- bool m_bFirst;
- bool m_bLast;
- bool m_bNegative;
- bool m_bDisplayXAxis;
- bool m_bDisplayHidden;
- bool m_bRightToLeft;
+public:
+ SparklineAttributes& getAttributes() { return m_aAttributes; }
- std::optional<double> m_aManualMax;
- std::optional<double> m_aManualMin;
OUString m_sUID;
- SparklineGroup()
- : m_aColorSeries(COL_BLUE)
- , m_aColorNegative(COL_RED)
- , m_aColorAxis(COL_RED)
- , m_aColorMarkers(COL_RED)
- , m_aColorFirst(COL_RED)
- , m_aColorLast(COL_RED)
- , m_aColorHigh(COL_RED)
- , m_aColorLow(COL_RED)
- , m_eMinAxisType(AxisType::Individual)
- , m_eMaxAxisType(AxisType::Individual)
- , m_fLineWeight(0.75)
- , m_eType(SparklineType::Line)
- , m_bDateAxis(false)
- , m_eDisplayEmptyCellsAs(DisplayEmptyCellAs::Zero)
- , m_bMarkers(false)
- , m_bHigh(false)
- , m_bLow(false)
- , m_bFirst(false)
- , m_bLast(false)
- , m_bNegative(false)
- , m_bDisplayXAxis(false)
- , m_bDisplayHidden(false)
- , m_bRightToLeft(false)
- {
- }
+ SparklineGroup();
- SparklineGroup(SparklineGroup const& pOtherSparkline)
- : m_aColorSeries(pOtherSparkline.m_aColorSeries)
- , m_aColorNegative(pOtherSparkline.m_aColorNegative)
- , m_aColorAxis(pOtherSparkline.m_aColorAxis)
- , m_aColorMarkers(pOtherSparkline.m_aColorMarkers)
- , m_aColorFirst(pOtherSparkline.m_aColorFirst)
- , m_aColorLast(pOtherSparkline.m_aColorLast)
- , m_aColorHigh(pOtherSparkline.m_aColorHigh)
- , m_aColorLow(pOtherSparkline.m_aColorLow)
- , m_eMinAxisType(pOtherSparkline.m_eMinAxisType)
- , m_eMaxAxisType(pOtherSparkline.m_eMaxAxisType)
- , m_fLineWeight(pOtherSparkline.m_fLineWeight)
- , m_eType(pOtherSparkline.m_eType)
- , m_bDateAxis(pOtherSparkline.m_bDateAxis)
- , m_eDisplayEmptyCellsAs(pOtherSparkline.m_eDisplayEmptyCellsAs)
- , m_bMarkers(pOtherSparkline.m_bMarkers)
- , m_bHigh(pOtherSparkline.m_bHigh)
- , m_bLow(pOtherSparkline.m_bLow)
- , m_bFirst(pOtherSparkline.m_bFirst)
- , m_bLast(pOtherSparkline.m_bLast)
- , m_bNegative(pOtherSparkline.m_bNegative)
- , m_bDisplayXAxis(pOtherSparkline.m_bDisplayXAxis)
- , m_bDisplayHidden(pOtherSparkline.m_bDisplayHidden)
- , m_bRightToLeft(pOtherSparkline.m_bRightToLeft)
- , m_aManualMax(pOtherSparkline.m_aManualMax)
- , m_aManualMin(pOtherSparkline.m_aManualMin)
- , m_sUID(pOtherSparkline.m_sUID)
- {
- }
+ SparklineGroup(SparklineGroup const& pOtherSparkline);
SparklineGroup& operator=(const SparklineGroup&) = delete;
};
diff --git a/sc/qa/unit/SparklineImportExportTest.cxx
b/sc/qa/unit/SparklineImportExportTest.cxx
index cd0578e91418..2aaeb333f82e 100644
--- a/sc/qa/unit/SparklineImportExportTest.cxx
+++ b/sc/qa/unit/SparklineImportExportTest.cxx
@@ -59,88 +59,88 @@ void checkSparklines(ScDocument& rDocument)
{
auto pSparkline = rDocument.GetSparkline(ScAddress(0, 1, 0)); // A2
CPPUNIT_ASSERT(pSparkline);
- auto pSparklineGroup = pSparkline->getSparklineGroup();
- CPPUNIT_ASSERT_EQUAL(sc::SparklineType::Line,
pSparklineGroup->m_eType);
-
- CPPUNIT_ASSERT_EQUAL(Color(0x376092), pSparklineGroup->m_aColorSeries);
- CPPUNIT_ASSERT_EQUAL(Color(0x00b050),
pSparklineGroup->m_aColorNegative);
- CPPUNIT_ASSERT_EQUAL(Color(0x000000), pSparklineGroup->m_aColorAxis);
- CPPUNIT_ASSERT_EQUAL(Color(0x000000),
pSparklineGroup->m_aColorMarkers);
- CPPUNIT_ASSERT_EQUAL(Color(0x7030a0), pSparklineGroup->m_aColorFirst);
- CPPUNIT_ASSERT_EQUAL(Color(0xff0000), pSparklineGroup->m_aColorLast);
- CPPUNIT_ASSERT_EQUAL(Color(0x92d050), pSparklineGroup->m_aColorHigh);
- CPPUNIT_ASSERT_EQUAL(Color(0x00b0f0), pSparklineGroup->m_aColorLow);
-
- CPPUNIT_ASSERT_EQUAL(1.0, pSparklineGroup->m_fLineWeight);
- CPPUNIT_ASSERT_EQUAL(false, pSparklineGroup->m_bDateAxis);
- CPPUNIT_ASSERT_EQUAL(sc::DisplayEmptyCellAs::Gap,
pSparklineGroup->m_eDisplayEmptyCellsAs);
-
- CPPUNIT_ASSERT_EQUAL(true, pSparklineGroup->m_bMarkers);
- CPPUNIT_ASSERT_EQUAL(true, pSparklineGroup->m_bHigh);
- CPPUNIT_ASSERT_EQUAL(true, pSparklineGroup->m_bLow);
- CPPUNIT_ASSERT_EQUAL(true, pSparklineGroup->m_bFirst);
- CPPUNIT_ASSERT_EQUAL(true, pSparklineGroup->m_bLast);
- CPPUNIT_ASSERT_EQUAL(true, pSparklineGroup->m_bNegative);
- CPPUNIT_ASSERT_EQUAL(true, pSparklineGroup->m_bDisplayXAxis);
- CPPUNIT_ASSERT_EQUAL(false, pSparklineGroup->m_bDisplayHidden);
- CPPUNIT_ASSERT_EQUAL(false, pSparklineGroup->m_bRightToLeft);
-
- CPPUNIT_ASSERT_EQUAL(false, bool(pSparklineGroup->m_aManualMax));
- CPPUNIT_ASSERT_EQUAL(false, bool(pSparklineGroup->m_aManualMin));
+ auto& rAttributes = pSparkline->getSparklineGroup()->getAttributes();
+ CPPUNIT_ASSERT_EQUAL(sc::SparklineType::Line, rAttributes.getType());
+
+ CPPUNIT_ASSERT_EQUAL(Color(0x376092), rAttributes.getColorSeries());
+ CPPUNIT_ASSERT_EQUAL(Color(0x00b050), rAttributes.getColorNegative());
+ CPPUNIT_ASSERT_EQUAL(Color(0x000000), rAttributes.getColorAxis());
+ CPPUNIT_ASSERT_EQUAL(Color(0x000000), rAttributes.getColorMarkers());
+ CPPUNIT_ASSERT_EQUAL(Color(0x7030a0), rAttributes.getColorFirst());
+ CPPUNIT_ASSERT_EQUAL(Color(0xff0000), rAttributes.getColorLast());
+ CPPUNIT_ASSERT_EQUAL(Color(0x92d050), rAttributes.getColorHigh());
+ CPPUNIT_ASSERT_EQUAL(Color(0x00b0f0), rAttributes.getColorLow());
+
+ CPPUNIT_ASSERT_EQUAL(1.0, rAttributes.getLineWeight());
+ CPPUNIT_ASSERT_EQUAL(false, rAttributes.isDateAxis());
+ CPPUNIT_ASSERT_EQUAL(sc::DisplayEmptyCellsAs::Gap,
rAttributes.getDisplayEmptyCellsAs());
+
+ CPPUNIT_ASSERT_EQUAL(true, rAttributes.isMarkers());
+ CPPUNIT_ASSERT_EQUAL(true, rAttributes.isHigh());
+ CPPUNIT_ASSERT_EQUAL(true, rAttributes.isLow());
+ CPPUNIT_ASSERT_EQUAL(true, rAttributes.isFirst());
+ CPPUNIT_ASSERT_EQUAL(true, rAttributes.isLast());
+ CPPUNIT_ASSERT_EQUAL(true, rAttributes.isNegative());
+ CPPUNIT_ASSERT_EQUAL(true, rAttributes.shouldDisplayXAxis());
+ CPPUNIT_ASSERT_EQUAL(false, rAttributes.shouldDisplayHidden());
+ CPPUNIT_ASSERT_EQUAL(false, rAttributes.isRightToLeft());
+
+ CPPUNIT_ASSERT_EQUAL(false, bool(rAttributes.getManualMax()));
+ CPPUNIT_ASSERT_EQUAL(false, bool(rAttributes.getManualMin()));
}
// Sparkline at Sheet1:A3
{
auto pSparkline = rDocument.GetSparkline(ScAddress(0, 2, 0)); // A3
CPPUNIT_ASSERT(pSparkline);
- auto pSparklineGroup = pSparkline->getSparklineGroup();
- CPPUNIT_ASSERT_EQUAL(sc::SparklineType::Column,
pSparklineGroup->m_eType);
-
- CPPUNIT_ASSERT_EQUAL(Color(0x376092), pSparklineGroup->m_aColorSeries);
- CPPUNIT_ASSERT_EQUAL(Color(0xff0000),
pSparklineGroup->m_aColorNegative);
- CPPUNIT_ASSERT_EQUAL(Color(0x000000), pSparklineGroup->m_aColorAxis);
- CPPUNIT_ASSERT_EQUAL(Color(0xd00000),
pSparklineGroup->m_aColorMarkers);
- CPPUNIT_ASSERT_EQUAL(Color(0x92d050), pSparklineGroup->m_aColorFirst);
- CPPUNIT_ASSERT_EQUAL(Color(0x00b0f0), pSparklineGroup->m_aColorLast);
- CPPUNIT_ASSERT_EQUAL(Color(0x7030a0), pSparklineGroup->m_aColorHigh);
- CPPUNIT_ASSERT_EQUAL(Color(0xffc000), pSparklineGroup->m_aColorLow);
-
- CPPUNIT_ASSERT_EQUAL(0.75, pSparklineGroup->m_fLineWeight);
- CPPUNIT_ASSERT_EQUAL(false, pSparklineGroup->m_bDateAxis);
- CPPUNIT_ASSERT_EQUAL(sc::DisplayEmptyCellAs::Gap,
pSparklineGroup->m_eDisplayEmptyCellsAs);
-
- CPPUNIT_ASSERT_EQUAL(false, pSparklineGroup->m_bMarkers);
- CPPUNIT_ASSERT_EQUAL(true, pSparklineGroup->m_bHigh);
- CPPUNIT_ASSERT_EQUAL(true, pSparklineGroup->m_bLow);
- CPPUNIT_ASSERT_EQUAL(true, pSparklineGroup->m_bFirst);
- CPPUNIT_ASSERT_EQUAL(true, pSparklineGroup->m_bLast);
- CPPUNIT_ASSERT_EQUAL(true, pSparklineGroup->m_bNegative);
- CPPUNIT_ASSERT_EQUAL(false, pSparklineGroup->m_bDisplayXAxis);
- CPPUNIT_ASSERT_EQUAL(false, pSparklineGroup->m_bDisplayHidden);
- CPPUNIT_ASSERT_EQUAL(false, pSparklineGroup->m_bRightToLeft);
-
- CPPUNIT_ASSERT_EQUAL(false, bool(pSparklineGroup->m_aManualMax));
- CPPUNIT_ASSERT_EQUAL(false, bool(pSparklineGroup->m_aManualMin));
+ auto& rAttributes = pSparkline->getSparklineGroup()->getAttributes();
+ CPPUNIT_ASSERT_EQUAL(sc::SparklineType::Column, rAttributes.getType());
+
+ CPPUNIT_ASSERT_EQUAL(Color(0x376092), rAttributes.getColorSeries());
+ CPPUNIT_ASSERT_EQUAL(Color(0xff0000), rAttributes.getColorNegative());
+ CPPUNIT_ASSERT_EQUAL(Color(0x000000), rAttributes.getColorAxis());
+ CPPUNIT_ASSERT_EQUAL(Color(0xd00000), rAttributes.getColorMarkers());
+ CPPUNIT_ASSERT_EQUAL(Color(0x92d050), rAttributes.getColorFirst());
+ CPPUNIT_ASSERT_EQUAL(Color(0x00b0f0), rAttributes.getColorLast());
+ CPPUNIT_ASSERT_EQUAL(Color(0x7030a0), rAttributes.getColorHigh());
+ CPPUNIT_ASSERT_EQUAL(Color(0xffc000), rAttributes.getColorLow());
+
+ CPPUNIT_ASSERT_EQUAL(0.75, rAttributes.getLineWeight());
+ CPPUNIT_ASSERT_EQUAL(false, rAttributes.isDateAxis());
+ CPPUNIT_ASSERT_EQUAL(sc::DisplayEmptyCellsAs::Gap,
rAttributes.getDisplayEmptyCellsAs());
+
+ CPPUNIT_ASSERT_EQUAL(false, rAttributes.isMarkers());
+ CPPUNIT_ASSERT_EQUAL(true, rAttributes.isHigh());
+ CPPUNIT_ASSERT_EQUAL(true, rAttributes.isLow());
+ CPPUNIT_ASSERT_EQUAL(true, rAttributes.isFirst());
+ CPPUNIT_ASSERT_EQUAL(true, rAttributes.isLast());
+ CPPUNIT_ASSERT_EQUAL(true, rAttributes.isNegative());
+ CPPUNIT_ASSERT_EQUAL(false, rAttributes.shouldDisplayXAxis());
+ CPPUNIT_ASSERT_EQUAL(false, rAttributes.shouldDisplayHidden());
+ CPPUNIT_ASSERT_EQUAL(false, rAttributes.isRightToLeft());
+
+ CPPUNIT_ASSERT_EQUAL(false, bool(rAttributes.getManualMax()));
+ CPPUNIT_ASSERT_EQUAL(false, bool(rAttributes.getManualMin()));
}
// Sparkline at Sheet2:B1
{
auto pSparkline = rDocument.GetSparkline(ScAddress(1, 0, 1)); //B1
CPPUNIT_ASSERT(pSparkline);
- auto pSparklineGroup = pSparkline->getSparklineGroup();
- CPPUNIT_ASSERT_EQUAL(sc::SparklineType::Column,
pSparklineGroup->m_eType);
+ auto& rAttributes = pSparkline->getSparklineGroup()->getAttributes();
+ CPPUNIT_ASSERT_EQUAL(sc::SparklineType::Column, rAttributes.getType());
}
// Sparkline at Sheet2:B2
{
auto pSparkline = rDocument.GetSparkline(ScAddress(1, 1, 1)); //B2
CPPUNIT_ASSERT(pSparkline);
- auto pSparklineGroup = pSparkline->getSparklineGroup();
- CPPUNIT_ASSERT_EQUAL(sc::SparklineType::Line,
pSparklineGroup->m_eType);
+ auto& rAttributes = pSparkline->getSparklineGroup()->getAttributes();
+ CPPUNIT_ASSERT_EQUAL(sc::SparklineType::Line, rAttributes.getType());
}
// Sparkline at Sheet2:B2
{
auto pSparkline = rDocument.GetSparkline(ScAddress(1, 1, 1)); //B2
CPPUNIT_ASSERT(pSparkline);
- auto pSparklineGroup = pSparkline->getSparklineGroup();
- CPPUNIT_ASSERT_EQUAL(sc::SparklineType::Line,
pSparklineGroup->m_eType);
+ auto& rAttributes = pSparkline->getSparklineGroup()->getAttributes();
+ CPPUNIT_ASSERT_EQUAL(sc::SparklineType::Line, rAttributes.getType());
}
// Sparkline doesn't exists at A4
{
diff --git a/sc/source/filter/excel/export/SparklineExt.cxx
b/sc/source/filter/excel/export/SparklineExt.cxx
index 883389572ef7..565ac51a1e0b 100644
--- a/sc/source/filter/excel/export/SparklineExt.cxx
+++ b/sc/source/filter/excel/export/SparklineExt.cxx
@@ -62,121 +62,121 @@ void SparklineExt::SaveXml(XclExpXmlStream& rStream)
void SparklineExt::addSparklineGroupAttributes(
rtl::Reference<sax_fastparser::FastAttributeList>& pAttrList,
- sc::SparklineGroup& rSparklineGroup)
+ sc::SparklineAttributes& rAttributes)
{
- if (rSparklineGroup.m_fLineWeight != 0.75)
- pAttrList->add(XML_lineWeight,
OString::number(rSparklineGroup.m_fLineWeight));
+ if (rAttributes.getLineWeight() != 0.75)
+ pAttrList->add(XML_lineWeight,
OString::number(rAttributes.getLineWeight()));
- if (rSparklineGroup.m_eType != sc::SparklineType::Line)
+ if (rAttributes.getType() != sc::SparklineType::Line)
{
- if (rSparklineGroup.m_eType == sc::SparklineType::Column)
+ if (rAttributes.getType() == sc::SparklineType::Column)
pAttrList->add(XML_type, "column");
- else if (rSparklineGroup.m_eType == sc::SparklineType::Stacked)
+ else if (rAttributes.getType() == sc::SparklineType::Stacked)
pAttrList->add(XML_type, "stacked");
}
- if (rSparklineGroup.m_bDateAxis)
+ if (rAttributes.isDateAxis())
pAttrList->add(XML_dateAxis, "1");
- if (rSparklineGroup.m_eDisplayEmptyCellsAs != sc::DisplayEmptyCellAs::Zero)
+ if (rAttributes.getDisplayEmptyCellsAs() != sc::DisplayEmptyCellsAs::Zero)
{
- if (rSparklineGroup.m_eDisplayEmptyCellsAs ==
sc::DisplayEmptyCellAs::Gap)
+ if (rAttributes.getDisplayEmptyCellsAs() ==
sc::DisplayEmptyCellsAs::Gap)
pAttrList->add(XML_displayEmptyCellsAs, "gap");
- else if (rSparklineGroup.m_eDisplayEmptyCellsAs ==
sc::DisplayEmptyCellAs::Span)
+ else if (rAttributes.getDisplayEmptyCellsAs() ==
sc::DisplayEmptyCellsAs::Span)
pAttrList->add(XML_displayEmptyCellsAs, "span");
}
- if (rSparklineGroup.m_bMarkers)
+ if (rAttributes.isMarkers())
pAttrList->add(XML_markers, "1");
- if (rSparklineGroup.m_bHigh)
+ if (rAttributes.isHigh())
pAttrList->add(XML_high, "1");
- if (rSparklineGroup.m_bLow)
+ if (rAttributes.isLow())
pAttrList->add(XML_low, "1");
- if (rSparklineGroup.m_bFirst)
+ if (rAttributes.isFirst())
pAttrList->add(XML_first, "1");
- if (rSparklineGroup.m_bLast)
+ if (rAttributes.isLast())
pAttrList->add(XML_last, "1");
- if (rSparklineGroup.m_bNegative)
+ if (rAttributes.isNegative())
pAttrList->add(XML_negative, "1");
- if (rSparklineGroup.m_bDisplayXAxis)
+ if (rAttributes.shouldDisplayXAxis())
pAttrList->add(XML_displayXAxis, "1");
- if (rSparklineGroup.m_bDisplayHidden)
+ if (rAttributes.shouldDisplayHidden())
pAttrList->add(XML_displayHidden, "1");
- if (rSparklineGroup.m_eMinAxisType != sc::AxisType::Individual)
+ if (rAttributes.getMinAxisType() != sc::AxisType::Individual)
{
- if (rSparklineGroup.m_eMinAxisType == sc::AxisType::Group)
+ if (rAttributes.getMinAxisType() == sc::AxisType::Group)
pAttrList->add(XML_minAxisType, "group");
- else if (rSparklineGroup.m_eMinAxisType == sc::AxisType::Custom)
+ else if (rAttributes.getMinAxisType() == sc::AxisType::Custom)
pAttrList->add(XML_minAxisType, "custom");
}
- if (rSparklineGroup.m_eMaxAxisType != sc::AxisType::Individual)
+ if (rAttributes.getMaxAxisType() != sc::AxisType::Individual)
{
- if (rSparklineGroup.m_eMaxAxisType == sc::AxisType::Group)
+ if (rAttributes.getMaxAxisType() == sc::AxisType::Group)
pAttrList->add(XML_maxAxisType, "group");
- else if (rSparklineGroup.m_eMaxAxisType == sc::AxisType::Custom)
+ else if (rAttributes.getMaxAxisType() == sc::AxisType::Custom)
pAttrList->add(XML_maxAxisType, "custom");
}
- if (rSparklineGroup.m_bRightToLeft)
+ if (rAttributes.isRightToLeft())
pAttrList->add(XML_rightToLeft, "1");
- if (rSparklineGroup.m_aManualMax && rSparklineGroup.m_eMaxAxisType ==
sc::AxisType::Custom)
- pAttrList->add(XML_manualMax,
OString::number(*rSparklineGroup.m_aManualMax));
+ if (rAttributes.getManualMax() && rAttributes.getMaxAxisType() ==
sc::AxisType::Custom)
+ pAttrList->add(XML_manualMax,
OString::number(*rAttributes.getManualMax()));
- if (rSparklineGroup.m_aManualMin && rSparklineGroup.m_eMinAxisType ==
sc::AxisType::Custom)
- pAttrList->add(XML_manualMin,
OString::number(*rSparklineGroup.m_aManualMin));
+ if (rAttributes.getManualMin() && rAttributes.getMinAxisType() ==
sc::AxisType::Custom)
+ pAttrList->add(XML_manualMin,
OString::number(*rAttributes.getManualMin()));
}
void SparklineExt::addSparklineGroupColors(XclExpXmlStream& rStream,
- sc::SparklineGroup& rSparklineGroup)
+ sc::SparklineAttributes&
rAttributes)
{
sax_fastparser::FSHelperPtr& rWorksheet = rStream.GetCurrentStream();
rWorksheet->singleElementNS(XML_x14, XML_colorSeries, XML_rgb,
-
XclXmlUtils::ToOString(rSparklineGroup.m_aColorSeries));
+
XclXmlUtils::ToOString(rAttributes.getColorSeries()));
- if (rSparklineGroup.m_aColorSeries != COL_TRANSPARENT)
+ if (rAttributes.getColorNegative() != COL_TRANSPARENT)
{
rWorksheet->singleElementNS(XML_x14, XML_colorNegative, XML_rgb,
-
XclXmlUtils::ToOString(rSparklineGroup.m_aColorNegative));
+
XclXmlUtils::ToOString(rAttributes.getColorNegative()));
}
- if (rSparklineGroup.m_aColorAxis != COL_TRANSPARENT)
+ if (rAttributes.getColorAxis() != COL_TRANSPARENT)
{
rWorksheet->singleElementNS(XML_x14, XML_colorAxis, XML_rgb,
-
XclXmlUtils::ToOString(rSparklineGroup.m_aColorAxis));
+
XclXmlUtils::ToOString(rAttributes.getColorAxis()));
}
- if (rSparklineGroup.m_aColorMarkers != COL_TRANSPARENT)
+ if (rAttributes.getColorMarkers() != COL_TRANSPARENT)
{
rWorksheet->singleElementNS(XML_x14, XML_colorMarkers, XML_rgb,
-
XclXmlUtils::ToOString(rSparklineGroup.m_aColorMarkers));
+
XclXmlUtils::ToOString(rAttributes.getColorMarkers()));
}
- if (rSparklineGroup.m_aColorFirst != COL_TRANSPARENT)
+ if (rAttributes.getColorFirst() != COL_TRANSPARENT)
{
rWorksheet->singleElementNS(XML_x14, XML_colorFirst, XML_rgb,
-
XclXmlUtils::ToOString(rSparklineGroup.m_aColorFirst));
+
XclXmlUtils::ToOString(rAttributes.getColorFirst()));
}
- if (rSparklineGroup.m_aColorLast != COL_TRANSPARENT)
+ if (rAttributes.getColorLast() != COL_TRANSPARENT)
{
rWorksheet->singleElementNS(XML_x14, XML_colorLast, XML_rgb,
-
XclXmlUtils::ToOString(rSparklineGroup.m_aColorLast));
+
XclXmlUtils::ToOString(rAttributes.getColorLast()));
}
- if (rSparklineGroup.m_aColorHigh != COL_TRANSPARENT)
+ if (rAttributes.getColorHigh() != COL_TRANSPARENT)
{
rWorksheet->singleElementNS(XML_x14, XML_colorHigh, XML_rgb,
-
XclXmlUtils::ToOString(rSparklineGroup.m_aColorHigh));
+
XclXmlUtils::ToOString(rAttributes.getColorHigh()));
}
- if (rSparklineGroup.m_aColorLow != COL_TRANSPARENT)
+ if (rAttributes.getColorLow() != COL_TRANSPARENT)
{
rWorksheet->singleElementNS(XML_x14, XML_colorLow, XML_rgb,
-
XclXmlUtils::ToOString(rSparklineGroup.m_aColorLow));
+
XclXmlUtils::ToOString(rAttributes.getColorLow()));
}
}
@@ -187,11 +187,11 @@ void SparklineExt::addSparklineGroup(XclExpXmlStream&
rStream, sc::SparklineGrou
// Sparkline Group Attributes
auto pAttrList = sax_fastparser::FastSerializerHelper::createAttrList();
- addSparklineGroupAttributes(pAttrList, rSparklineGroup);
+ addSparklineGroupAttributes(pAttrList, rSparklineGroup.getAttributes());
rWorksheet->startElementNS(XML_x14, XML_sparklineGroup, pAttrList);
- addSparklineGroupColors(rStream, rSparklineGroup);
+ addSparklineGroupColors(rStream, rSparklineGroup.getAttributes());
// Sparklines
diff --git a/sc/source/filter/inc/export/SparklineExt.hxx
b/sc/source/filter/inc/export/SparklineExt.hxx
index 116462c5f3c4..7d26922f15db 100644
--- a/sc/source/filter/inc/export/SparklineExt.hxx
+++ b/sc/source/filter/inc/export/SparklineExt.hxx
@@ -14,6 +14,7 @@
#include <map>
#include <rangelst.hxx>
#include <Sparkline.hxx>
+#include <SparklineAttributes.hxx>
#include <sax/fastattribs.hxx>
@@ -35,8 +36,9 @@ public:
void addSparklineGroup(XclExpXmlStream& rStream, sc::SparklineGroup&
rSparklineGroup,
std::vector<std::shared_ptr<sc::Sparkline>> const&
rSparklines);
void
addSparklineGroupAttributes(rtl::Reference<sax_fastparser::FastAttributeList>&
pAttrList,
- sc::SparklineGroup& rSparklineGroup);
- void addSparklineGroupColors(XclExpXmlStream& rStream, sc::SparklineGroup&
rSparklineGroup);
+ sc::SparklineAttributes&
rSparklineAttributes);
+ void addSparklineGroupColors(XclExpXmlStream& rStream,
+ sc::SparklineAttributes&
rSparklineAttributes);
XclExpExtType GetType() override { return XclExpExtSparklineType; }
};
diff --git a/sc/source/filter/oox/SparklineFragment.cxx
b/sc/source/filter/oox/SparklineFragment.cxx
index b4c5089dbfa1..eda633bb3df3 100644
--- a/sc/source/filter/oox/SparklineFragment.cxx
+++ b/sc/source/filter/oox/SparklineFragment.cxx
@@ -56,34 +56,34 @@ namespace
return ::Color();
}
-void addColorsToSparklineGroup(sc::SparklineGroup& rSparklineGroup, sal_Int32
nElement,
- const AttributeList& rAttribs, ThemeBuffer&
rThemeBuffer)
+void addColorsToSparklineAttributes(sc::SparklineAttributes& rAttributes,
sal_Int32 nElement,
+ const AttributeList& rAttribs,
ThemeBuffer& rThemeBuffer)
{
switch (nElement)
{
case XLS14_TOKEN(colorSeries):
- rSparklineGroup.m_aColorSeries = getColor(rAttribs, rThemeBuffer);
+ rAttributes.setColorSeries(getColor(rAttribs, rThemeBuffer));
break;
case XLS14_TOKEN(colorNegative):
- rSparklineGroup.m_aColorNegative = getColor(rAttribs,
rThemeBuffer);
+ rAttributes.setColorNegative(getColor(rAttribs, rThemeBuffer));
break;
case XLS14_TOKEN(colorAxis):
- rSparklineGroup.m_aColorAxis = getColor(rAttribs, rThemeBuffer);
+ rAttributes.setColorAxis(getColor(rAttribs, rThemeBuffer));
break;
case XLS14_TOKEN(colorMarkers):
- rSparklineGroup.m_aColorMarkers = getColor(rAttribs, rThemeBuffer);
+ rAttributes.setColorMarkers(getColor(rAttribs, rThemeBuffer));
break;
case XLS14_TOKEN(colorFirst):
- rSparklineGroup.m_aColorFirst = getColor(rAttribs, rThemeBuffer);
+ rAttributes.setColorFirst(getColor(rAttribs, rThemeBuffer));
break;
case XLS14_TOKEN(colorLast):
- rSparklineGroup.m_aColorLast = getColor(rAttribs, rThemeBuffer);
+ rAttributes.setColorLast(getColor(rAttribs, rThemeBuffer));
break;
case XLS14_TOKEN(colorHigh):
- rSparklineGroup.m_aColorHigh = getColor(rAttribs, rThemeBuffer);
+ rAttributes.setColorHigh(getColor(rAttribs, rThemeBuffer));
break;
case XLS14_TOKEN(colorLow):
- rSparklineGroup.m_aColorLow = getColor(rAttribs, rThemeBuffer);
+ rAttributes.setColorLow(getColor(rAttribs, rThemeBuffer));
break;
default:
break;
@@ -99,13 +99,13 @@ sc::SparklineType parseSparklineType(OUString const&
rString)
return sc::SparklineType::Line;
}
-sc::DisplayEmptyCellAs parseDisplayEmptyCellAs(OUString const& rString)
+sc::DisplayEmptyCellsAs parseDisplayEmptyCellsAs(OUString const& rString)
{
if (rString == "span")
- return sc::DisplayEmptyCellAs::Span;
+ return sc::DisplayEmptyCellsAs::Span;
else if (rString == "gap")
- return sc::DisplayEmptyCellAs::Gap;
- return sc::DisplayEmptyCellAs::Zero;
+ return sc::DisplayEmptyCellsAs::Gap;
+ return sc::DisplayEmptyCellsAs::Zero;
}
sc::AxisType parseAxisType(OUString const& rString)
@@ -117,45 +117,43 @@ sc::AxisType parseAxisType(OUString const& rString)
return sc::AxisType::Individual;
}
-void addAttributesToSparklineGroup(sc::SparklineGroup& rSparklineGroup,
- const AttributeList& rAttribs)
+void addAttributesToSparklineAttributes(sc::SparklineAttributes&
rSparklineAttributes,
+ const AttributeList& rAttribs)
{
auto oManualMax = rAttribs.getDouble(XML_manualMax);
auto oManualMin = rAttribs.getDouble(XML_manualMin);
- rSparklineGroup.m_fLineWeight = rAttribs.getDouble(XML_lineWeight, 0.75);
+ rSparklineAttributes.setLineWeight(rAttribs.getDouble(XML_lineWeight,
0.75));
OUString sType = rAttribs.getString(XML_type, "line");
- rSparklineGroup.m_eType = parseSparklineType(sType);
+ rSparklineAttributes.setType(parseSparklineType(sType));
- rSparklineGroup.m_bDateAxis = rAttribs.getBool(XML_dateAxis, false);
+ rSparklineAttributes.setDateAxis(rAttribs.getBool(XML_dateAxis, false));
OUString sDisplayEmptyCellsAs =
rAttribs.getString(XML_displayEmptyCellsAs, "zero");
- rSparklineGroup.m_eDisplayEmptyCellsAs =
parseDisplayEmptyCellAs(sDisplayEmptyCellsAs);
+
rSparklineAttributes.setDisplayEmptyCellsAs(parseDisplayEmptyCellsAs(sDisplayEmptyCellsAs));
- rSparklineGroup.m_bMarkers = rAttribs.getBool(XML_markers, false);
- rSparklineGroup.m_bHigh = rAttribs.getBool(XML_high, false);
- rSparklineGroup.m_bLow = rAttribs.getBool(XML_low, false);
- rSparklineGroup.m_bFirst = rAttribs.getBool(XML_first, false);
- rSparklineGroup.m_bLast = rAttribs.getBool(XML_last, false);
- rSparklineGroup.m_bNegative = rAttribs.getBool(XML_negative, false);
- rSparklineGroup.m_bDisplayXAxis = rAttribs.getBool(XML_displayXAxis,
false);
- rSparklineGroup.m_bDisplayHidden = rAttribs.getBool(XML_displayHidden,
false);
+ rSparklineAttributes.setMarkers(rAttribs.getBool(XML_markers, false));
+ rSparklineAttributes.setHigh(rAttribs.getBool(XML_high, false));
+ rSparklineAttributes.setLow(rAttribs.getBool(XML_low, false));
+ rSparklineAttributes.setFirst(rAttribs.getBool(XML_first, false));
+ rSparklineAttributes.setLast(rAttribs.getBool(XML_last, false));
+ rSparklineAttributes.setNegative(rAttribs.getBool(XML_negative, false));
+ rSparklineAttributes.setDisplayXAxis(rAttribs.getBool(XML_displayXAxis,
false));
+ rSparklineAttributes.setDisplayHidden(rAttribs.getBool(XML_displayHidden,
false));
OUString sMinAxisType = rAttribs.getString(XML_minAxisType, "individual");
- rSparklineGroup.m_eMinAxisType = parseAxisType(sMinAxisType);
+ rSparklineAttributes.setMinAxisType(parseAxisType(sMinAxisType));
OUString sMaxAxisType = rAttribs.getString(XML_maxAxisType, "individual");
- rSparklineGroup.m_eMaxAxisType = parseAxisType(sMaxAxisType);
+ rSparklineAttributes.setMaxAxisType(parseAxisType(sMaxAxisType));
- rSparklineGroup.m_bRightToLeft = rAttribs.getBool(XML_rightToLeft, false);
+ rSparklineAttributes.setRightToLeft(rAttribs.getBool(XML_rightToLeft,
false));
- rSparklineGroup.m_sUID = rAttribs.getString(XML_uid, OUString());
-
- if (rSparklineGroup.m_eMaxAxisType == sc::AxisType::Custom)
- rSparklineGroup.m_aManualMax = oManualMax.get();
- if (rSparklineGroup.m_eMinAxisType == sc::AxisType::Custom)
- rSparklineGroup.m_aManualMin = oManualMin.get();
+ if (rSparklineAttributes.getMaxAxisType() == sc::AxisType::Custom)
+ rSparklineAttributes.setManualMax(oManualMax.get());
+ if (rSparklineAttributes.getMinAxisType() == sc::AxisType::Custom)
+ rSparklineAttributes.setManualMin(oManualMin.get());
}
} // end anonymous namespace
@@ -173,7 +171,9 @@ ContextHandlerRef
SparklineGroupsContext::onCreateContext(sal_Int32 nElement,
case XLS14_TOKEN(sparklineGroup):
{
auto& rLastGroup = m_aSparklineGroups.emplace_back();
- addAttributesToSparklineGroup(*rLastGroup.getSparklineGroup(),
rAttribs);
+ auto& rSparklineAttributes =
rLastGroup.getSparklineGroup()->getAttributes();
+ addAttributesToSparklineAttributes(rSparklineAttributes, rAttribs);
+ rLastGroup.getSparklineGroup()->m_sUID =
rAttribs.getString(XML_uid, OUString());
return this;
}
case XLS14_TOKEN(colorSeries):
@@ -186,8 +186,8 @@ ContextHandlerRef
SparklineGroupsContext::onCreateContext(sal_Int32 nElement,
case XLS14_TOKEN(colorLow):
{
auto& rLastGroup = m_aSparklineGroups.back();
- addColorsToSparklineGroup(*rLastGroup.getSparklineGroup(),
nElement, rAttribs,
- getTheme());
+ auto& rSparklineAttributes =
rLastGroup.getSparklineGroup()->getAttributes();
+ addColorsToSparklineAttributes(rSparklineAttributes, nElement,
rAttribs, getTheme());
return this;
}
case XLS14_TOKEN(sparklines):
diff --git a/sc/source/ui/dialogs/SparklineDialog.cxx
b/sc/source/ui/dialogs/SparklineDialog.cxx
index 103582c25a6e..b285108bca6d 100644
--- a/sc/source/ui/dialogs/SparklineDialog.cxx
+++ b/sc/source/ui/dialogs/SparklineDialog.cxx
@@ -113,7 +113,9 @@ SparklineDialog::~SparklineDialog() {}
void SparklineDialog::setupValues(std::shared_ptr<sc::SparklineGroup> const&
pSparklineGroup)
{
- switch (pSparklineGroup->m_eType)
+ auto& rAttribute = pSparklineGroup->getAttributes();
+
+ switch (rAttribute.getType())
{
case sc::SparklineType::Line:
mxRadioLine->set_active(true);
@@ -126,20 +128,20 @@ void
SparklineDialog::setupValues(std::shared_ptr<sc::SparklineGroup> const& pSp
break;
}
- mxColorSeries->SelectEntry(pSparklineGroup->m_aColorSeries);
- mxColorNegative->SelectEntry(pSparklineGroup->m_aColorNegative);
- mxColorMarker->SelectEntry(pSparklineGroup->m_aColorMarkers);
- mxColorHigh->SelectEntry(pSparklineGroup->m_aColorHigh);
- mxColorLow->SelectEntry(pSparklineGroup->m_aColorLow);
- mxColorFirst->SelectEntry(pSparklineGroup->m_aColorFirst);
- mxColorLast->SelectEntry(pSparklineGroup->m_aColorLast);
-
- mxCheckButtonNegative->set_active(pSparklineGroup->m_bNegative);
- mxCheckButtonMarker->set_active(pSparklineGroup->m_bMarkers);
- mxCheckButtonHigh->set_active(pSparklineGroup->m_bHigh);
- mxCheckButtonLow->set_active(pSparklineGroup->m_bLow);
- mxCheckButtonFirst->set_active(pSparklineGroup->m_bFirst);
- mxCheckButtonLast->set_active(pSparklineGroup->m_bLast);
+ mxColorSeries->SelectEntry(rAttribute.getColorSeries());
+ mxColorNegative->SelectEntry(rAttribute.getColorNegative());
+ mxColorMarker->SelectEntry(rAttribute.getColorMarkers());
+ mxColorHigh->SelectEntry(rAttribute.getColorHigh());
+ mxColorLow->SelectEntry(rAttribute.getColorLow());
+ mxColorFirst->SelectEntry(rAttribute.getColorFirst());
+ mxColorLast->SelectEntry(rAttribute.getColorLast());
+
+ mxCheckButtonNegative->set_active(rAttribute.isNegative());
+ mxCheckButtonMarker->set_active(rAttribute.isMarkers());
+ mxCheckButtonHigh->set_active(rAttribute.isHigh());
+ mxCheckButtonLow->set_active(rAttribute.isLow());
+ mxCheckButtonFirst->set_active(rAttribute.isFirst());
+ mxCheckButtonLast->set_active(rAttribute.isLast());
}
void SparklineDialog::Close() {
DoClose(sc::SparklineDialogWrapper::GetChildWindowId()); }
@@ -289,28 +291,32 @@ IMPL_LINK(SparklineDialog, ButtonClicked, weld::Button&,
rButton, void)
IMPL_LINK(SparklineDialog, ToggleHandler, weld::Toggleable&, rToggle, void)
{
+ auto& rAttribute = mpLocalSparklineGroup->getAttributes();
+
if (mxCheckButtonNegative.get() == &rToggle)
- mpLocalSparklineGroup->m_bNegative =
mxCheckButtonNegative->get_active();
+ rAttribute.setNegative(mxCheckButtonNegative->get_active());
if (mxCheckButtonMarker.get() == &rToggle)
- mpLocalSparklineGroup->m_bMarkers = mxCheckButtonMarker->get_active();
+ rAttribute.setMarkers(mxCheckButtonMarker->get_active());
if (mxCheckButtonHigh.get() == &rToggle)
- mpLocalSparklineGroup->m_bHigh = mxCheckButtonHigh->get_active();
+ rAttribute.setHigh(mxCheckButtonHigh->get_active());
if (mxCheckButtonLow.get() == &rToggle)
- mpLocalSparklineGroup->m_bLow = mxCheckButtonLow->get_active();
+ rAttribute.setLow(mxCheckButtonLow->get_active());
if (mxCheckButtonFirst.get() == &rToggle)
- mpLocalSparklineGroup->m_bFirst = mxCheckButtonFirst->get_active();
+ rAttribute.setFirst(mxCheckButtonFirst->get_active());
if (mxCheckButtonLast.get() == &rToggle)
- mpLocalSparklineGroup->m_bLast = mxCheckButtonLast->get_active();
+ rAttribute.setLast(mxCheckButtonLast->get_active());
}
IMPL_LINK_NOARG(SparklineDialog, SelectSparklineType, weld::Toggleable&, void)
{
+ auto& rAttribute = mpLocalSparklineGroup->getAttributes();
+
if (mxRadioLine->get_active())
- mpLocalSparklineGroup->m_eType = sc::SparklineType::Line;
+ rAttribute.setType(sc::SparklineType::Line);
else if (mxRadioColumn->get_active())
- mpLocalSparklineGroup->m_eType = sc::SparklineType::Column;
+ rAttribute.setType(sc::SparklineType::Column);
else if (mxRadioStacked->get_active())
- mpLocalSparklineGroup->m_eType = sc::SparklineType::Stacked;
+ rAttribute.setType(sc::SparklineType::Stacked);
}
bool SparklineDialog::checkValidInputOutput()
@@ -335,13 +341,15 @@ bool SparklineDialog::checkValidInputOutput()
void SparklineDialog::perform()
{
- mpLocalSparklineGroup->m_aColorSeries =
mxColorSeries->GetSelectEntryColor();
- mpLocalSparklineGroup->m_aColorNegative =
mxColorNegative->GetSelectEntryColor();
- mpLocalSparklineGroup->m_aColorMarkers =
mxColorMarker->GetSelectEntryColor();
- mpLocalSparklineGroup->m_aColorHigh = mxColorHigh->GetSelectEntryColor();
- mpLocalSparklineGroup->m_aColorLow = mxColorLow->GetSelectEntryColor();
- mpLocalSparklineGroup->m_aColorFirst = mxColorFirst->GetSelectEntryColor();
- mpLocalSparklineGroup->m_aColorLast = mxColorLast->GetSelectEntryColor();
+ auto& rAttribute = mpLocalSparklineGroup->getAttributes();
+
+ rAttribute.setColorSeries(mxColorSeries->GetSelectEntryColor());
+ rAttribute.setColorNegative(mxColorNegative->GetSelectEntryColor());
+ rAttribute.setColorMarkers(mxColorMarker->GetSelectEntryColor());
+ rAttribute.setColorHigh(mxColorHigh->GetSelectEntryColor());
+ rAttribute.setColorLow(mxColorLow->GetSelectEntryColor());
+ rAttribute.setColorFirst(mxColorFirst->GetSelectEntryColor());
+ rAttribute.setColorLast(mxColorLast->GetSelectEntryColor());
auto& rDocFunc = mrViewData.GetDocShell()->GetDocFunc();
diff --git a/sc/source/ui/sparklines/SparklineAttributes.cxx
b/sc/source/ui/sparklines/SparklineAttributes.cxx
new file mode 100644
index 000000000000..1203b9f67eb0
--- /dev/null
+++ b/sc/source/ui/sparklines/SparklineAttributes.cxx
@@ -0,0 +1,273 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ */
+
+#include <SparklineAttributes.hxx>
+
+namespace sc
+{
+class SparklineAttributes::Implementation
+{
+public:
+ Color m_aColorSeries;
+ Color m_aColorNegative;
+ Color m_aColorAxis;
+ Color m_aColorMarkers;
+ Color m_aColorFirst;
+ Color m_aColorLast;
+ Color m_aColorHigh;
+ Color m_aColorLow;
+
+ AxisType m_eMinAxisType;
+ AxisType m_eMaxAxisType;
+
+ double m_fLineWeight; // In pt
+
+ SparklineType m_eType;
+
+ bool m_bDateAxis;
+
+ DisplayEmptyCellsAs m_eDisplayEmptyCellsAs; // span, gap, zero
+
+ bool m_bMarkers;
+ bool m_bHigh;
+ bool m_bLow;
+ bool m_bFirst;
+ bool m_bLast;
+ bool m_bNegative;
+ bool m_bDisplayXAxis;
+ bool m_bDisplayHidden;
+ bool m_bRightToLeft;
+
+ std::optional<double> m_aManualMax;
+ std::optional<double> m_aManualMin;
+
+ Implementation()
+ : m_aColorSeries(COL_BLUE)
+ , m_aColorNegative(COL_RED)
+ , m_aColorAxis(COL_RED)
+ , m_aColorMarkers(COL_RED)
+ , m_aColorFirst(COL_RED)
+ , m_aColorLast(COL_RED)
+ , m_aColorHigh(COL_RED)
+ , m_aColorLow(COL_RED)
+ , m_eMinAxisType(AxisType::Individual)
+ , m_eMaxAxisType(AxisType::Individual)
+ , m_fLineWeight(0.75)
+ , m_eType(SparklineType::Line)
+ , m_bDateAxis(false)
+ , m_eDisplayEmptyCellsAs(DisplayEmptyCellsAs::Zero)
+ , m_bMarkers(false)
+ , m_bHigh(false)
+ , m_bLow(false)
+ , m_bFirst(false)
+ , m_bLast(false)
+ , m_bNegative(false)
+ , m_bDisplayXAxis(false)
+ , m_bDisplayHidden(false)
+ , m_bRightToLeft(false)
+ {
+ }
+
+ Implementation(Implementation const& pOther)
+ : m_aColorSeries(pOther.m_aColorSeries)
+ , m_aColorNegative(pOther.m_aColorNegative)
+ , m_aColorAxis(pOther.m_aColorAxis)
+ , m_aColorMarkers(pOther.m_aColorMarkers)
+ , m_aColorFirst(pOther.m_aColorFirst)
+ , m_aColorLast(pOther.m_aColorLast)
+ , m_aColorHigh(pOther.m_aColorHigh)
+ , m_aColorLow(pOther.m_aColorLow)
+ , m_eMinAxisType(pOther.m_eMinAxisType)
+ , m_eMaxAxisType(pOther.m_eMaxAxisType)
+ , m_fLineWeight(pOther.m_fLineWeight)
+ , m_eType(pOther.m_eType)
+ , m_bDateAxis(pOther.m_bDateAxis)
+ , m_eDisplayEmptyCellsAs(pOther.m_eDisplayEmptyCellsAs)
+ , m_bMarkers(pOther.m_bMarkers)
+ , m_bHigh(pOther.m_bHigh)
+ , m_bLow(pOther.m_bLow)
+ , m_bFirst(pOther.m_bFirst)
+ , m_bLast(pOther.m_bLast)
+ , m_bNegative(pOther.m_bNegative)
+ , m_bDisplayXAxis(pOther.m_bDisplayXAxis)
+ , m_bDisplayHidden(pOther.m_bDisplayHidden)
+ , m_bRightToLeft(pOther.m_bRightToLeft)
+ , m_aManualMax(pOther.m_aManualMax)
+ , m_aManualMin(pOther.m_aManualMin)
+ {
+ }
+
+ bool operator==(const Implementation& rImpl) const
+ {
+ return (m_aColorSeries == rImpl.m_aColorSeries)
+ && (m_aColorNegative == rImpl.m_aColorNegative)
+ && (m_aColorAxis == rImpl.m_aColorAxis) && (m_aColorMarkers ==
rImpl.m_aColorMarkers)
+ && (m_aColorFirst == rImpl.m_aColorFirst) && (m_aColorLast ==
rImpl.m_aColorLast)
+ && (m_aColorHigh == rImpl.m_aColorHigh) && (m_aColorLow ==
rImpl.m_aColorLow)
+ && (m_eMinAxisType == rImpl.m_eMinAxisType)
+ && (m_eMaxAxisType == rImpl.m_eMaxAxisType) && (m_fLineWeight
== rImpl.m_fLineWeight)
+ && (m_eType == rImpl.m_eType) && (m_bDateAxis ==
rImpl.m_bDateAxis)
+ && (m_eDisplayEmptyCellsAs == rImpl.m_eDisplayEmptyCellsAs)
+ && (m_bMarkers == rImpl.m_bMarkers) && (m_bHigh ==
rImpl.m_bHigh)
+ && (m_bLow == rImpl.m_bLow) && (m_bFirst == rImpl.m_bFirst)
+ && (m_bLast == rImpl.m_bLast) && (m_bNegative ==
rImpl.m_bNegative)
+ && (m_bDisplayXAxis == rImpl.m_bDisplayXAxis)
+ && (m_bDisplayHidden == rImpl.m_bDisplayHidden)
+ && (m_bRightToLeft == rImpl.m_bRightToLeft) && (m_aManualMax ==
rImpl.m_aManualMax)
+ && (m_aManualMin == rImpl.m_aManualMin);
+ }
+};
+
+SparklineAttributes::SparklineAttributes() = default;
+
+SparklineAttributes::~SparklineAttributes() = default;
+
+SparklineAttributes::SparklineAttributes(SparklineAttributes const&) = default;
+
+SparklineAttributes::SparklineAttributes(SparklineAttributes&&) = default;
+
+SparklineAttributes& SparklineAttributes::operator=(SparklineAttributes
const&) = default;
+
+SparklineAttributes& SparklineAttributes::operator=(SparklineAttributes&&) =
default;
+
+bool SparklineAttributes::operator==(SparklineAttributes const& rOther) const
+{
+ return m_aImplementation == rOther.m_aImplementation;
+}
+
+Color SparklineAttributes::getColorSeries() const { return
m_aImplementation->m_aColorSeries; }
+
+void SparklineAttributes::setColorSeries(Color aColor)
+{
+ m_aImplementation->m_aColorSeries = aColor;
+}
+
+Color SparklineAttributes::getColorNegative() const { return
m_aImplementation->m_aColorNegative; }
+
+void SparklineAttributes::setColorNegative(Color aColor)
+{
+ m_aImplementation->m_aColorNegative = aColor;
+}
+
+Color SparklineAttributes::getColorAxis() const { return
m_aImplementation->m_aColorAxis; }
+
+void SparklineAttributes::setColorAxis(Color aColor) {
m_aImplementation->m_aColorAxis = aColor; }
+
+Color SparklineAttributes::getColorMarkers() const { return
m_aImplementation->m_aColorMarkers; }
+void SparklineAttributes::setColorMarkers(Color aColor)
+{
+ m_aImplementation->m_aColorMarkers = aColor;
+}
+
+Color SparklineAttributes::getColorFirst() const { return
m_aImplementation->m_aColorFirst; }
+void SparklineAttributes::setColorFirst(Color aColor) {
m_aImplementation->m_aColorFirst = aColor; }
+
+Color SparklineAttributes::getColorLast() const { return
m_aImplementation->m_aColorLast; }
+void SparklineAttributes::setColorLast(Color aColor) {
m_aImplementation->m_aColorLast = aColor; }
+
+Color SparklineAttributes::getColorHigh() const { return
m_aImplementation->m_aColorHigh; }
+void SparklineAttributes::setColorHigh(Color aColor) {
m_aImplementation->m_aColorHigh = aColor; }
+
+Color SparklineAttributes::getColorLow() const { return
m_aImplementation->m_aColorLow; }
+void SparklineAttributes::setColorLow(Color aColor) {
m_aImplementation->m_aColorLow = aColor; }
+
+AxisType SparklineAttributes::getMinAxisType() const { return
m_aImplementation->m_eMinAxisType; }
+void SparklineAttributes::setMinAxisType(AxisType eAxisType)
+{
+ m_aImplementation->m_eMinAxisType = eAxisType;
+}
+
+AxisType SparklineAttributes::getMaxAxisType() const { return
m_aImplementation->m_eMaxAxisType; }
+void SparklineAttributes::setMaxAxisType(AxisType eAxisType)
+{
+ m_aImplementation->m_eMaxAxisType = eAxisType;
+}
+
+double SparklineAttributes::getLineWeight() const { return
m_aImplementation->m_fLineWeight; }
+void SparklineAttributes::setLineWeight(double nWeight)
+{
+ m_aImplementation->m_fLineWeight = nWeight;
+}
+
+SparklineType SparklineAttributes::getType() const { return
m_aImplementation->m_eType; }
+void SparklineAttributes::setType(SparklineType eType) {
m_aImplementation->m_eType = eType; }
+
+bool SparklineAttributes::isDateAxis() const { return
m_aImplementation->m_bDateAxis; }
+void SparklineAttributes::setDateAxis(bool bValue) {
m_aImplementation->m_bDateAxis = bValue; }
+
+DisplayEmptyCellsAs SparklineAttributes::getDisplayEmptyCellsAs() const
+{
+ return m_aImplementation->m_eDisplayEmptyCellsAs;
+}
+void SparklineAttributes::setDisplayEmptyCellsAs(DisplayEmptyCellsAs eValue)
+{
+ m_aImplementation->m_eDisplayEmptyCellsAs = eValue;
+}
+
+bool SparklineAttributes::isMarkers() const { return
m_aImplementation->m_bMarkers; }
+void SparklineAttributes::setMarkers(bool bValue) {
m_aImplementation->m_bMarkers = bValue; }
+
+bool SparklineAttributes::isHigh() const { return m_aImplementation->m_bHigh; }
+void SparklineAttributes::setHigh(bool bValue) { m_aImplementation->m_bHigh =
bValue; }
+
+bool SparklineAttributes::isLow() const { return m_aImplementation->m_bLow; }
+void SparklineAttributes::setLow(bool bValue) { m_aImplementation->m_bLow =
bValue; }
+
+bool SparklineAttributes::isFirst() const { return
m_aImplementation->m_bFirst; }
+void SparklineAttributes::setFirst(bool bValue) { m_aImplementation->m_bFirst
= bValue; }
+
+bool SparklineAttributes::isLast() const { return m_aImplementation->m_bLast; }
+void SparklineAttributes::setLast(bool bValue) { m_aImplementation->m_bLast =
bValue; }
+
+bool SparklineAttributes::isNegative() const { return
m_aImplementation->m_bNegative; }
+void SparklineAttributes::setNegative(bool bValue) {
m_aImplementation->m_bNegative = bValue; }
+
+bool SparklineAttributes::shouldDisplayXAxis() const { return
m_aImplementation->m_bDisplayXAxis; }
+void SparklineAttributes::setDisplayXAxis(bool bValue)
+{
+ m_aImplementation->m_bDisplayXAxis = bValue;
+}
+
+bool SparklineAttributes::shouldDisplayHidden() const
+{
+ return m_aImplementation->m_bDisplayHidden;
+}
+void SparklineAttributes::setDisplayHidden(bool bValue)
+{
+ m_aImplementation->m_bDisplayHidden = bValue;
+}
+
+bool SparklineAttributes::isRightToLeft() const { return
m_aImplementation->m_bRightToLeft; }
+void SparklineAttributes::setRightToLeft(bool bValue)
+{
+ m_aImplementation->m_bRightToLeft = bValue;
+}
+
+std::optional<double> SparklineAttributes::getManualMax() const
+{
+ return m_aImplementation->m_aManualMax;
+}
+void SparklineAttributes::setManualMax(std::optional<double> aValue)
+{
+ m_aImplementation->m_aManualMax = aValue;
+}
+
+std::optional<double> SparklineAttributes::getManualMin() const
+{
+ return m_aImplementation->m_aManualMin;
+}
+void SparklineAttributes::setManualMin(std::optional<double> aValue)
+{
+ m_aImplementation->m_aManualMin = aValue;
+}
+
+} // end sc
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/sparklines/SparklineGroup.cxx
b/sc/source/ui/sparklines/SparklineGroup.cxx
new file mode 100644
index 000000000000..55f52ff4665f
--- /dev/null
+++ b/sc/source/ui/sparklines/SparklineGroup.cxx
@@ -0,0 +1,25 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ */
+
+#include <SparklineGroup.hxx>
+
+namespace sc
+{
+SparklineGroup::SparklineGroup() {}
+
+SparklineGroup::SparklineGroup(SparklineGroup const& pOtherSparkline)
+ : m_aAttributes(pOtherSparkline.m_aAttributes)
+ , m_sUID(pOtherSparkline.m_sUID)
+{
+}
+
+} // end sc
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/view/output.cxx b/sc/source/ui/view/output.cxx
index a73989d848a8..1b8231974c13 100644
--- a/sc/source/ui/view/output.cxx
+++ b/sc/source/ui/view/output.cxx
@@ -2332,8 +2332,8 @@ void createMarker(std::vector<SparklineMarker> &
rMarkers, double x, double y, C
}
void drawLine(vcl::RenderContext& rRenderContext, tools::Rectangle const &
rRectangle,
- std::vector<double> const & rValues, double nMin, double nMax,
- std::shared_ptr<sc::SparklineGroup> const & pSparklineGroup)
+ std::vector<double> const& rValues, double nMin, double nMax,
+ sc::SparklineAttributes const& rAttributes)
{
basegfx::B2DPolygon aPolygon;
double numebrOfSteps = rValues.size() - 1;
@@ -2352,25 +2352,25 @@ void drawLine(vcl::RenderContext& rRenderContext,
tools::Rectangle const & rRect
aPolygon.append({ x, y } );
- if (pSparklineGroup->m_bFirst && nValueIndex == 0)
+ if (rAttributes.isFirst() && nValueIndex == 0)
{
- createMarker(aMarkers, x, y, pSparklineGroup->m_aColorFirst);
+ createMarker(aMarkers, x, y, rAttributes.getColorFirst());
}
- else if (pSparklineGroup->m_bLast && nValueIndex == (nValuesSize - 1))
+ else if (rAttributes.isLast() && nValueIndex == (nValuesSize - 1))
{
- createMarker(aMarkers, x, y, pSparklineGroup->m_aColorLast);
+ createMarker(aMarkers, x, y, rAttributes.getColorLast());
}
- else if (pSparklineGroup->m_bHigh && nValue == nMax)
+ else if (rAttributes.isHigh() && nValue == nMax)
{
- createMarker(aMarkers, x, y, pSparklineGroup->m_aColorHigh);
+ createMarker(aMarkers, x, y, rAttributes.getColorHigh());
}
- else if (pSparklineGroup->m_bLow && nValue == nMin)
+ else if (rAttributes.isLow() && nValue == nMin)
{
- createMarker(aMarkers, x, y, pSparklineGroup->m_aColorLow);
+ createMarker(aMarkers, x, y, rAttributes.getColorLow());
}
- else if (pSparklineGroup->m_bNegative && nValue < 0.0)
+ else if (rAttributes.isNegative() && nValue < 0.0)
{
- createMarker(aMarkers, x, y, pSparklineGroup->m_aColorNegative);
+ createMarker(aMarkers, x, y, rAttributes.getColorNegative());
}
xStep++;
@@ -2381,7 +2381,7 @@ void drawLine(vcl::RenderContext& rRenderContext,
tools::Rectangle const & rRect
aMatrix.translate(rRectangle.Left(), rRectangle.Top());
aPolygon.transform(aMatrix);
- rRenderContext.SetLineColor(pSparklineGroup->m_aColorSeries);
+ rRenderContext.SetLineColor(rAttributes.getColorSeries());
rRenderContext.DrawPolyLine(aPolygon);
for (auto const & rMarker : aMarkers)
@@ -2394,44 +2394,44 @@ void drawLine(vcl::RenderContext& rRenderContext,
tools::Rectangle const & rRect
}
}
-void setFillAndLineColor(vcl::RenderContext& rRenderContext,
std::shared_ptr<sc::SparklineGroup> const & pSparklineGroup,
+void setFillAndLineColor(vcl::RenderContext& rRenderContext,
sc::SparklineAttributes const& rAttributes,
double nValue, sal_Int64 nValueIndex, sal_Int64
nValuesSize, double nMin, double nMax)
{
- if (pSparklineGroup->m_bFirst && nValueIndex == 0)
+ if (rAttributes.isFirst() && nValueIndex == 0)
{
- rRenderContext.SetLineColor(pSparklineGroup->m_aColorFirst);
- rRenderContext.SetFillColor(pSparklineGroup->m_aColorFirst);
+ rRenderContext.SetLineColor(rAttributes.getColorFirst());
+ rRenderContext.SetFillColor(rAttributes.getColorFirst());
}
- else if (pSparklineGroup->m_bLast && nValueIndex == (nValuesSize - 1))
+ else if (rAttributes.isLast() && nValueIndex == (nValuesSize - 1))
{
- rRenderContext.SetLineColor(pSparklineGroup->m_aColorLast);
- rRenderContext.SetFillColor(pSparklineGroup->m_aColorLast);
+ rRenderContext.SetLineColor(rAttributes.getColorLast());
+ rRenderContext.SetFillColor(rAttributes.getColorLast());
}
- else if (pSparklineGroup->m_bHigh && nValue == nMax)
+ else if (rAttributes.isHigh() && nValue == nMax)
{
- rRenderContext.SetLineColor(pSparklineGroup->m_aColorHigh);
- rRenderContext.SetFillColor(pSparklineGroup->m_aColorHigh);
+ rRenderContext.SetLineColor(rAttributes.getColorHigh());
+ rRenderContext.SetFillColor(rAttributes.getColorHigh());
}
- else if (pSparklineGroup->m_bLow && nValue == nMin)
+ else if (rAttributes.isLow() && nValue == nMin)
{
- rRenderContext.SetLineColor(pSparklineGroup->m_aColorLow);
- rRenderContext.SetFillColor(pSparklineGroup->m_aColorLow);
+ rRenderContext.SetLineColor(rAttributes.getColorLow());
+ rRenderContext.SetFillColor(rAttributes.getColorLow());
}
- else if (pSparklineGroup->m_bNegative && nValue < 0.0)
+ else if (rAttributes.isNegative() && nValue < 0.0)
{
- rRenderContext.SetLineColor(pSparklineGroup->m_aColorNegative);
- rRenderContext.SetFillColor(pSparklineGroup->m_aColorNegative);
+ rRenderContext.SetLineColor(rAttributes.getColorNegative());
+ rRenderContext.SetFillColor(rAttributes.getColorNegative());
}
else
{
- rRenderContext.SetLineColor(pSparklineGroup->m_aColorSeries);
- rRenderContext.SetFillColor(pSparklineGroup->m_aColorSeries);
+ rRenderContext.SetLineColor(rAttributes.getColorSeries());
+ rRenderContext.SetFillColor(rAttributes.getColorSeries());
}
}
void drawColumn(vcl::RenderContext& rRenderContext, tools::Rectangle const &
rRectangle,
std::vector<double> const & rValues, double nMin, double nMax,
- std::shared_ptr<sc::SparklineGroup> const & pSparklineGroup)
+ sc::SparklineAttributes const & rAttributes)
{
basegfx::B2DPolygon aPolygon;
@@ -2455,7 +2455,7 @@ void drawColumn(vcl::RenderContext& rRenderContext,
tools::Rectangle const & rRe
{
if (nValue != 0.0)
{
- setFillAndLineColor(rRenderContext, pSparklineGroup, nValue,
nValueIndex, sal_Int64(rValues.size()), nMax, nMin);
+ setFillAndLineColor(rRenderContext, rAttributes, nValue,
nValueIndex, sal_Int64(rValues.size()), nMax, nMin);
double nP = (nValue - nMin) / nDelta;
double x = rRectangle.GetWidth() * (xStep / numberOfSteps);
@@ -2483,6 +2483,7 @@ void drawSparkline(std::shared_ptr<sc::Sparkline> const&
pSparkline, vcl::Render
return;
auto pSparklineGroup = pSparkline->getSparklineGroup();
+ auto const& rAttributes = pSparklineGroup->getAttributes();
rRenderContext.SetAntialiasing(AntialiasingFlags::Enable);
@@ -2524,11 +2525,11 @@ void drawSparkline(std::shared_ptr<sc::Sparkline>
const& pSparkline, vcl::Render
}
}
- if (pSparklineGroup->m_eType == sc::SparklineType::Column)
+ if (rAttributes.getType() == sc::SparklineType::Column)
{
- drawColumn(rRenderContext, rRectangle, aValues, nMin, nMax,
pSparklineGroup);
+ drawColumn(rRenderContext, rRectangle, aValues, nMin, nMax,
pSparklineGroup->getAttributes());
}
- else if (pSparklineGroup->m_eType == sc::SparklineType::Stacked)
+ else if (rAttributes.getType() == sc::SparklineType::Stacked)
{
// transform the data to 1, -1
for (auto & rValue : aValues)
@@ -2536,11 +2537,11 @@ void drawSparkline(std::shared_ptr<sc::Sparkline>
const& pSparkline, vcl::Render
if (rValue != 0.0)
rValue = rValue > 0.0 ? 1.0 : -1.0;
}
- drawColumn(rRenderContext, rRectangle, aValues, -1, 1,
pSparklineGroup);
+ drawColumn(rRenderContext, rRectangle, aValues, -1, 1,
pSparklineGroup->getAttributes());
}
- else if (pSparklineGroup->m_eType == sc::SparklineType::Line)
+ else if (rAttributes.getType() == sc::SparklineType::Line)
{
- drawLine(rRenderContext, rRectangle, aValues, nMin, nMax,
pSparklineGroup);
+ drawLine(rRenderContext, rRectangle, aValues, nMin, nMax,
pSparklineGroup->getAttributes());
}
}
} // end anonymous namespace
commit a1687bc00493942324ce5ff464901478fc4d26d2
Author: Tomaž Vajngerl <[email protected]>
AuthorDate: Tue Mar 22 11:03:24 2022 +0900
Commit: Tomaž Vajngerl <[email protected]>
CommitDate: Tue Mar 22 11:03:24 2022 +0900
sc: undo/redo for sparklines when deleting the cell content
This adds support for undo/redo when clearing the content of a
cell, which includes a sparkline.
Change-Id: I79d9ef965e21cf5b35de84aa3b5cb93b644777ed
diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index 3da4a7bac798..61c51761c0a0 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -627,7 +627,7 @@ public:
void DeleteSparklineCells(sc::ColumnBlockPosition& rBlockPos, SCROW nRow1,
SCROW nRow2);
bool DeleteSparkline(SCROW nRow);
bool IsSparklinesEmptyBlock(SCROW nStartRow, SCROW nEndRow) const;
- void CopyCellSparklinesToDocument(SCROW nRow1, SCROW nRow2, ScColumn&
rDestCol, SCROW nRowOffsetDest) const;
+ void CopyCellSparklinesToDocument(SCROW nRow1, SCROW nRow2, ScColumn&
rDestCol, SCROW nRowOffsetDest = 0) const;
void DuplicateSparklines(SCROW nStartRow, size_t nDataSize, ScColumn&
rDestCol,
sc::ColumnBlockPosition& rDestBlockPos, SCROW
nRowOffsetDest = 0) const;
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index 6c7053905f3a..ca099be7a0a0 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -480,6 +480,7 @@ public:
bool DeleteSparkline(SCCOL nCol, SCROW nRow);
sc::SparklineList& GetSparklineList();
+ void CopySparklinesToTable(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW
nRow2, ScTable* pDestTab);
// Notes / Comments
std::unique_ptr<ScPostIt> ReleaseNote( SCCOL nCol, SCROW nRow );
diff --git a/sc/qa/unit/SparklineTest.cxx b/sc/qa/unit/SparklineTest.cxx
index f4524a4c8b3c..185328d58776 100644
--- a/sc/qa/unit/SparklineTest.cxx
+++ b/sc/qa/unit/SparklineTest.cxx
@@ -52,6 +52,7 @@ public:
void testCutPasteSparkline();
void testUndoRedoInsertSparkline();
void testUndoRedoDeleteSparkline();
+ void testUndoRedoClearContentForSparkline();
CPPUNIT_TEST_SUITE(SparklineTest);
CPPUNIT_TEST(testAddSparkline);
@@ -60,6 +61,7 @@ public:
CPPUNIT_TEST(testCutPasteSparkline);
CPPUNIT_TEST(testUndoRedoInsertSparkline);
CPPUNIT_TEST(testUndoRedoDeleteSparkline);
+ CPPUNIT_TEST(testUndoRedoClearContentForSparkline);
CPPUNIT_TEST_SUITE_END();
};
@@ -351,6 +353,69 @@ void SparklineTest::testUndoRedoDeleteSparkline()
xDocSh->DoClose();
}
+void SparklineTest::testUndoRedoClearContentForSparkline()
+{
+ ScDocShellRef xDocSh = loadEmptyDocument();
+ CPPUNIT_ASSERT(xDocSh);
+
+ ScDocument& rDocument = xDocSh->GetDocument();
+ ScTabViewShell* pViewShell = xDocSh->GetBestViewShell(false);
+ CPPUNIT_ASSERT(pViewShell);
+
+ auto& rDocFunc = xDocSh->GetDocFunc();
+
+ // Try to delete sparkline that doesn't exist - returns false
+ CPPUNIT_ASSERT(!rDocFunc.DeleteSparkline(ScAddress(0, 6, 0)));
+
+ // insert test data - A1:A6
+ insertTestData(rDocument);
+
+ // Sparkline range
+ ScRange aRange(0, 6, 0, 0, 6, 0);
+
+ // Check Sparkline at cell A7 doesn't exists
+ auto pSparkline = rDocument.GetSparkline(aRange.aStart);
+ CPPUNIT_ASSERT(!pSparkline);
+
+ auto pSparklineGroup = std::make_shared<sc::SparklineGroup>();
+ CPPUNIT_ASSERT(rDocFunc.InsertSparklines(ScRange(0, 0, 0, 0, 5, 0),
aRange, pSparklineGroup));
+
+ // Check Sparkline at cell A7 exists
+ pSparkline = rDocument.GetSparkline(aRange.aStart);
+ CPPUNIT_ASSERT(pSparkline);
+ CPPUNIT_ASSERT_EQUAL(SCCOL(0), pSparkline->getColumn());
+ CPPUNIT_ASSERT_EQUAL(SCROW(6), pSparkline->getRow());
+
+ // Clear content - including sparkline
+ ScMarkData aMark(rDocument.GetSheetLimits());
+ aMark.SetMarkArea(aRange.aStart);
+ rDocFunc.DeleteContents(aMark, InsertDeleteFlags::CONTENTS, true, true);
+
+ // Check Sparkline at cell A7 doesn't exists
+ pSparkline = rDocument.GetSparkline(aRange.aStart);
+ CPPUNIT_ASSERT(!pSparkline);
+
+ // Undo
+ rDocument.GetUndoManager()->Undo();
+
+ // Check Sparkline at cell A7 exists
+ pSparkline = rDocument.GetSparkline(aRange.aStart);
+ CPPUNIT_ASSERT(pSparkline);
+ CPPUNIT_ASSERT_EQUAL(SCCOL(0), pSparkline->getColumn());
+ CPPUNIT_ASSERT_EQUAL(SCROW(6), pSparkline->getRow());
+
+ // Redo
+ rDocument.GetUndoManager()->Redo();
+
+ // Check Sparkline at cell A7 doesn't exists
+ pSparkline = rDocument.GetSparkline(aRange.aStart);
+ CPPUNIT_ASSERT(!pSparkline);
+
+ CPPUNIT_ASSERT(!rDocument.HasSparkline(aRange.aStart));
+
+ xDocSh->DoClose();
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(SparklineTest);
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx
index d92e651c03b6..833935f99804 100644
--- a/sc/source/core/data/table2.cxx
+++ b/sc/source/core/data/table2.cxx
@@ -1439,6 +1439,11 @@ void ScTable::CopyToTable(
if(nFlags & InsertDeleteFlags::OUTLINE) // also only when bColRowFlags
pDestTab->SetOutlineTable( pOutlineTable.get() );
+ if (nFlags & InsertDeleteFlags::SPARKLINES)
+ {
+ CopySparklinesToTable(nCol1, nRow1, nCol2, nRow2, pDestTab);
+ }
+
if (!bIsUndoDoc && bCopyCaptions && (nFlags & (InsertDeleteFlags::NOTE |
InsertDeleteFlags::ADDNOTES)))
{
bool bCloneCaption = (nFlags & InsertDeleteFlags::NOCAPTIONS) ==
InsertDeleteFlags::NONE;
@@ -1446,6 +1451,18 @@ void ScTable::CopyToTable(
}
}
+void ScTable::CopySparklinesToTable(SCCOL nCol1, SCROW nRow1, SCCOL nCol2,
SCROW nRow2, ScTable* pDestTab)
+{
+ if (!ValidColRow(nCol1, nRow1) || !ValidColRow(nCol2, nRow2))
+ return;
+
+ nCol2 = ClampToAllocatedColumns(nCol2);
+ for (SCCOL i = nCol1; i <= nCol2; i++)
+ {
+ aCol[i].CopyCellSparklinesToDocument(nRow1, nRow2,
pDestTab->CreateColumnIfNotExists(i));
+ }
+}
+
void ScTable::CopyCaptionsToTable( SCCOL nCol1, SCROW nRow1, SCCOL nCol2,
SCROW nRow2, ScTable* pDestTab,
bool bCloneCaption )
{
diff --git a/sc/source/ui/undo/undoblk3.cxx b/sc/source/ui/undo/undoblk3.cxx
index 073035be799b..57ce491c6fcb 100644
--- a/sc/source/ui/undo/undoblk3.cxx
+++ b/sc/source/ui/undo/undoblk3.cxx
@@ -119,6 +119,8 @@ void ScUndoDeleteContents::DoChange( const bool bUndo )
nUndoFlags |= InsertDeleteFlags::ATTRIB;
if (nFlags & InsertDeleteFlags::EDITATTR) // Edit-Engine
attribute
nUndoFlags |= InsertDeleteFlags::STRING; // -> Cells will be
changed
+ if (nFlags & InsertDeleteFlags::SPARKLINES)
+ nUndoFlags |= InsertDeleteFlags::SPARKLINES;
// do not create clones of note captions, they will be restored via
drawing undo
nUndoFlags |= InsertDeleteFlags::NOCAPTIONS;
commit e84989b694f5a1545ec3edc020312ea94e4bafbd
Author: Tomaž Vajngerl <[email protected]>
AuthorDate: Mon Mar 21 17:26:30 2022 +0900
Commit: Tomaž Vajngerl <[email protected]>
CommitDate: Mon Mar 21 17:28:14 2022 +0900
sc: add Undo/Redo for deleting a Sparkline
Adds the code to delete the Sparkline via DocFunc + test.
Change-Id: I710a1ee59a5fe5f2bfb91f8bf487501ef39ce949
diff --git a/sc/Library_sc.mk b/sc/Library_sc.mk
index 2a9c6f659a0a..7a7cf817e004 100644
--- a/sc/Library_sc.mk
+++ b/sc/Library_sc.mk
@@ -551,6 +551,7 @@ $(eval $(call gb_Library_add_exception_objects,sc,\
sc/source/ui/undo/undotab \
sc/source/ui/undo/undoutil \
sc/source/ui/undo/UndoInsertSparkline \
+ sc/source/ui/undo/UndoDeleteSparkline \
sc/source/ui/unoobj/ChartRangeSelectionListener \
sc/source/ui/unoobj/addruno \
sc/source/ui/unoobj/afmtuno \
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index b5274c3533e0..da7c89eabdd4 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -1244,6 +1244,7 @@ public:
/** Spaklines */
SC_DLLPUBLIC std::shared_ptr<sc::Sparkline> GetSparkline(ScAddress const &
rPosition);
+ SC_DLLPUBLIC bool HasSparkline(ScAddress const & rPosition);
SC_DLLPUBLIC sc::Sparkline* CreateSparkline(ScAddress const & rPosition,
std::shared_ptr<sc::SparklineGroup> & pSparklineGroup);
SC_DLLPUBLIC sc::SparklineList* GetSparklineList(SCTAB nTab);
SC_DLLPUBLIC bool DeleteSparkline(ScAddress const& rPosition);
diff --git a/sc/inc/globstr.hrc b/sc/inc/globstr.hrc
index 6ae26c9d4a0f..bed2e10f9b51 100644
--- a/sc/inc/globstr.hrc
+++ b/sc/inc/globstr.hrc
@@ -540,6 +540,8 @@
#define STR_HYPHENATECELL_OFF NC_("STR_HYPHENATECELL_OFF",
"Hyphenate: Off")
#define STR_INDENTCELL NC_("STR_INDENTCELL", "Indent:
")
#define STR_UNDO_INSERT_SPARKLINE_GROUP
NC_("STR_UNDO_INSERT_SPARKLINE", "Insert Sparkline Group")
+#define STR_UNDO_DELETE_SPARKLINE
NC_("STR_UNDO_DELETE_SPARKLINE", "Delete Sparkline")
+
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/qa/unit/SparklineTest.cxx b/sc/qa/unit/SparklineTest.cxx
index 993fb473337c..f4524a4c8b3c 100644
--- a/sc/qa/unit/SparklineTest.cxx
+++ b/sc/qa/unit/SparklineTest.cxx
@@ -47,17 +47,19 @@ public:
}
void testAddSparkline();
- void testDeleteSprkline();
+ void testClearContentSprkline();
void testCopyPasteSparkline();
void testCutPasteSparkline();
void testUndoRedoInsertSparkline();
+ void testUndoRedoDeleteSparkline();
CPPUNIT_TEST_SUITE(SparklineTest);
CPPUNIT_TEST(testAddSparkline);
- CPPUNIT_TEST(testDeleteSprkline);
+ CPPUNIT_TEST(testClearContentSprkline);
CPPUNIT_TEST(testCopyPasteSparkline);
CPPUNIT_TEST(testCutPasteSparkline);
CPPUNIT_TEST(testUndoRedoInsertSparkline);
+ CPPUNIT_TEST(testUndoRedoDeleteSparkline);
CPPUNIT_TEST_SUITE_END();
};
@@ -117,7 +119,7 @@ void SparklineTest::testAddSparkline()
xDocSh->DoClose();
}
-void SparklineTest::testDeleteSprkline()
+void SparklineTest::testClearContentSprkline()
{
ScDocShellRef xDocSh = loadEmptyDocument();
CPPUNIT_ASSERT(xDocSh);
@@ -288,6 +290,67 @@ void SparklineTest::testUndoRedoInsertSparkline()
xDocSh->DoClose();
}
+void SparklineTest::testUndoRedoDeleteSparkline()
+{
+ ScDocShellRef xDocSh = loadEmptyDocument();
+ CPPUNIT_ASSERT(xDocSh);
+
+ ScDocument& rDocument = xDocSh->GetDocument();
+ ScTabViewShell* pViewShell = xDocSh->GetBestViewShell(false);
+ CPPUNIT_ASSERT(pViewShell);
+
+ auto& rDocFunc = xDocSh->GetDocFunc();
+
+ // Try to delete sparkline that doesn't exist - returns false
+ CPPUNIT_ASSERT(!rDocFunc.DeleteSparkline(ScAddress(0, 6, 0)));
+
+ // insert test data - A1:A6
+ insertTestData(rDocument);
+
+ // Sparkline range
+ ScRange aRange(0, 6, 0, 0, 6, 0);
+
+ // Check Sparkline at cell A7 doesn't exists
+ auto pSparkline = rDocument.GetSparkline(aRange.aStart);
+ CPPUNIT_ASSERT(!pSparkline);
+
+ auto pSparklineGroup = std::make_shared<sc::SparklineGroup>();
+ CPPUNIT_ASSERT(rDocFunc.InsertSparklines(ScRange(0, 0, 0, 0, 5, 0),
aRange, pSparklineGroup));
+
+ // Check Sparkline at cell A7 exists
+ pSparkline = rDocument.GetSparkline(aRange.aStart);
+ CPPUNIT_ASSERT(pSparkline);
+ CPPUNIT_ASSERT_EQUAL(SCCOL(0), pSparkline->getColumn());
+ CPPUNIT_ASSERT_EQUAL(SCROW(6), pSparkline->getRow());
+
+ // Delete Sparkline
+ CPPUNIT_ASSERT(rDocFunc.DeleteSparkline(ScAddress(0, 6, 0)));
+
+ // Check Sparkline at cell A7 doesn't exists
+ pSparkline = rDocument.GetSparkline(aRange.aStart);
+ CPPUNIT_ASSERT(!pSparkline);
+
+ // Undo
+ rDocument.GetUndoManager()->Undo();
+
+ // Check Sparkline at cell A7 exists
+ pSparkline = rDocument.GetSparkline(aRange.aStart);
+ CPPUNIT_ASSERT(pSparkline);
+ CPPUNIT_ASSERT_EQUAL(SCCOL(0), pSparkline->getColumn());
+ CPPUNIT_ASSERT_EQUAL(SCROW(6), pSparkline->getRow());
+
+ // Redo
+ rDocument.GetUndoManager()->Redo();
+
+ // Check Sparkline at cell A7 doesn't exists
+ pSparkline = rDocument.GetSparkline(aRange.aStart);
+ CPPUNIT_ASSERT(!pSparkline);
+
+ CPPUNIT_ASSERT(!rDocument.HasSparkline(aRange.aStart));
+
+ xDocSh->DoClose();
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(SparklineTest);
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index 3a11c7a3d950..92cd1c46f882 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -6517,6 +6517,11 @@ std::shared_ptr<sc::Sparkline>
ScDocument::GetSparkline(ScAddress const& rPositi
return std::shared_ptr<sc::Sparkline>();
}
+bool ScDocument::HasSparkline(ScAddress const & rPosition)
+{
+ return bool(GetSparkline(rPosition));
+}
+
sc::Sparkline* ScDocument::CreateSparkline(ScAddress const & rPosition,
std::shared_ptr<sc::SparklineGroup> & pSparklineGroup)
{
SCTAB nTab = rPosition.Tab();
diff --git a/sc/source/ui/docshell/docfunc.cxx
b/sc/source/ui/docshell/docfunc.cxx
index f28ca7e74344..e5972d54b7af 100644
--- a/sc/source/ui/docshell/docfunc.cxx
+++ b/sc/source/ui/docshell/docfunc.cxx
@@ -97,6 +97,7 @@
#include <SparklineGroup.hxx>
#include <SparklineData.hxx>
#include <undo/UndoInsertSparkline.hxx>
+#include <undo/UndoDeleteSparkline.hxx>
#include <config_features.h>
#include <memory>
@@ -5841,4 +5842,19 @@ bool ScDocFunc::InsertSparklines(ScRange const&
rDataRange, ScRange const& rSpar
return true;
}
+bool ScDocFunc::DeleteSparkline(ScAddress const& rAddress)
+{
+ auto& rDocument = rDocShell.GetDocument();
+
+ if (!rDocument.HasSparkline(rAddress))
+ return false;
+
+ auto pUndoDeleteSparkline =
std::make_unique<sc::UndoDeleteSparkline>(rDocShell, rAddress);
+ // delete sparkline by "redoing"
+ pUndoDeleteSparkline->Redo();
+ rDocShell.GetUndoManager()->AddUndoAction(std::move(pUndoDeleteSparkline));
+
+ return true;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/inc/docfunc.hxx b/sc/source/ui/inc/docfunc.hxx
index 52d61cb2e86e..9ac438639585 100644
--- a/sc/source/ui/inc/docfunc.hxx
+++ b/sc/source/ui/inc/docfunc.hxx
@@ -239,6 +239,8 @@ public:
SC_DLLPUBLIC bool InsertSparklines(ScRange const& rDataRange, ScRange
const& rSparklineRange,
std::shared_ptr<sc::SparklineGroup>
pSparklineGroup);
+ SC_DLLPUBLIC bool DeleteSparkline(ScAddress const& rAddress);
+
private:
void ProtectDocument(const ScDocProtection& rProtect);
};
diff --git a/sc/source/ui/inc/undo/UndoDeleteSparkline.hxx
b/sc/source/ui/inc/undo/UndoDeleteSparkline.hxx
new file mode 100644
index 000000000000..61cdd640a017
--- /dev/null
+++ b/sc/source/ui/inc/undo/UndoDeleteSparkline.hxx
@@ -0,0 +1,43 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ */
+
+#pragma once
+
+#include "undobase.hxx"
+#include <address.hxx>
+#include <memory>
+
+namespace sc
+{
+class SparklineGroup;
+class SparklineData;
+
+/** Undo action for deleting a Sparkline */
+class UndoDeleteSparkline : public ScSimpleUndo
+{
+private:
+ std::shared_ptr<sc::SparklineGroup> mpSparklineGroup;
+ ScAddress maSparklinePosition;
+
+public:
+ UndoDeleteSparkline(ScDocShell& rDocShell, ScAddress const&
rSparklinePosition);
+
+ virtual ~UndoDeleteSparkline() override;
+
+ void Undo() override;
+ void Redo() override;
+ bool CanRepeat(SfxRepeatTarget& rTarget) const override;
+ void Repeat(SfxRepeatTarget& rTarget) override;
+ OUString GetComment() const override;
+};
+
+} // namespace sc
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/undo/UndoDeleteSparkline.cxx
b/sc/source/ui/undo/UndoDeleteSparkline.cxx
new file mode 100644
index 000000000000..6c9df18090d1
--- /dev/null
+++ b/sc/source/ui/undo/UndoDeleteSparkline.cxx
@@ -0,0 +1,76 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ */
+
+#include <undo/UndoDeleteSparkline.hxx>
+#include <globstr.hrc>
+#include <scresid.hxx>
+
+#include <Sparkline.hxx>
+#include <SparklineGroup.hxx>
+
+namespace sc
+{
+UndoDeleteSparkline::UndoDeleteSparkline(ScDocShell& rDocShell, ScAddress
const& rSparklinePosition)
+ : ScSimpleUndo(&rDocShell)
+ , maSparklinePosition(rSparklinePosition)
+{
+}
+
+UndoDeleteSparkline::~UndoDeleteSparkline() {}
+
+void UndoDeleteSparkline::Undo()
+{
+ BeginUndo();
+
+ ScDocument& rDocument = pDocShell->GetDocument();
+ auto pSparkline = rDocument.GetSparkline(maSparklinePosition);
+ if (!pSparkline)
+ {
+ rDocument.CreateSparkline(maSparklinePosition, mpSparklineGroup);
+ }
+ else
+ {
+ SAL_WARN("sc", "Can't undo deletion if the sparkline at that address
already exists.");
+ }
+
+ pDocShell->PostPaintCell(maSparklinePosition);
+
+ EndUndo();
+}
+
+void UndoDeleteSparkline::Redo()
+{
+ BeginRedo();
+
+ ScDocument& rDocument = pDocShell->GetDocument();
+ if (auto pSparkline = rDocument.GetSparkline(maSparklinePosition))
+ {
+ mpSparklineGroup = pSparkline->getSparklineGroup();
+ rDocument.DeleteSparkline(maSparklinePosition);
+ }
+ else
+ {
+ SAL_WARN("sc", "Can't delete a sparkline that donesn't exist.");
+ }
+
+ pDocShell->PostPaintCell(maSparklinePosition);
+
+ EndRedo();
+}
+
+void UndoDeleteSparkline::Repeat(SfxRepeatTarget& /*rTarget*/) {}
+
+bool UndoDeleteSparkline::CanRepeat(SfxRepeatTarget& /*rTarget*/) const {
return false; }
+
+OUString UndoDeleteSparkline::GetComment() const { return
ScResId(STR_UNDO_DELETE_SPARKLINE); }
+
+} // end sc namespace
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit fe5a519bd4bdd5a36f498511546f2322c93ffae2
Author: Tomaž Vajngerl <[email protected]>
AuthorDate: Sun Mar 20 20:49:18 2022 +0900
Commit: Tomaž Vajngerl <[email protected]>
CommitDate: Mon Mar 21 09:00:04 2022 +0900
sc: add Undo/Redo for inserting Sparklines
Move the code to insert a sparkline from the SparklineDialog to
DocFunc and inside the UndoInsertSparkline, so there is no code
duplication and the code can be tested.
Change-Id: I85f4020190ae835b33e706ec9cb2cda9fd6fc752
diff --git a/sc/Library_sc.mk b/sc/Library_sc.mk
index f145d3a7fbf2..2a9c6f659a0a 100644
--- a/sc/Library_sc.mk
+++ b/sc/Library_sc.mk
@@ -512,6 +512,7 @@ $(eval $(call gb_Library_add_exception_objects,sc,\
sc/source/ui/sidebar/NumberFormatControl \
sc/source/ui/sidebar/NumberFormatPropertyPanel \
sc/source/ui/sidebar/ScPanelFactory \
+ sc/source/ui/sparklines/SparklineData \
sc/source/ui/StatisticsDialogs/AnalysisOfVarianceDialog \
sc/source/ui/StatisticsDialogs/CorrelationDialog \
sc/source/ui/StatisticsDialogs/CovarianceDialog \
@@ -549,6 +550,7 @@ $(eval $(call gb_Library_add_exception_objects,sc,\
sc/source/ui/undo/undostyl \
sc/source/ui/undo/undotab \
sc/source/ui/undo/undoutil \
+ sc/source/ui/undo/UndoInsertSparkline \
sc/source/ui/unoobj/ChartRangeSelectionListener \
sc/source/ui/unoobj/addruno \
sc/source/ui/unoobj/afmtuno \
diff --git a/sc/inc/SparklineData.hxx b/sc/inc/SparklineData.hxx
new file mode 100644
index 000000000000..80cc8a0329c2
--- /dev/null
+++ b/sc/inc/SparklineData.hxx
@@ -0,0 +1,42 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ */
+
+#pragma once
+
+#include "address.hxx"
+#include "scdllapi.h"
+
+namespace sc
+{
+struct SC_DLLPUBLIC SparklineData
+{
+ ScAddress maPosition;
+ ScRange maData;
+
+ SparklineData(ScAddress const& rPosition, ScRange const& rData)
+ : maPosition(rPosition)
+ , maData(rData)
+ {
+ }
+};
+
+enum class RangeOrientation
+{
+ Unknown,
+ Row,
+ Col
+};
+
+SC_DLLPUBLIC RangeOrientation calculateOrientation(sal_Int32 nOutputSize,
+ ScRange const& rInputRange);
+
+} // end sc
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/inc/globstr.hrc b/sc/inc/globstr.hrc
index 793d3cb95d55..6ae26c9d4a0f 100644
--- a/sc/inc/globstr.hrc
+++ b/sc/inc/globstr.hrc
@@ -539,7 +539,7 @@
#define STR_HYPHENATECELL_ON NC_("STR_HYPHENATECELL_ON",
"Hyphenate: On")
#define STR_HYPHENATECELL_OFF NC_("STR_HYPHENATECELL_OFF",
"Hyphenate: Off")
#define STR_INDENTCELL NC_("STR_INDENTCELL", "Indent:
")
-
+#define STR_UNDO_INSERT_SPARKLINE_GROUP
NC_("STR_UNDO_INSERT_SPARKLINE", "Insert Sparkline Group")
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/qa/unit/SparklineTest.cxx b/sc/qa/unit/SparklineTest.cxx
index 826638feb17c..993fb473337c 100644
--- a/sc/qa/unit/SparklineTest.cxx
+++ b/sc/qa/unit/SparklineTest.cxx
@@ -11,6 +11,8 @@
#include <docsh.hxx>
#include <tabvwsh.hxx>
#include <cliputil.hxx>
+#include <docfunc.hxx>
+
#include <Sparkline.hxx>
#include <SparklineGroup.hxx>
@@ -21,8 +23,6 @@ class SparklineTest : public ScBootstrapFixture
private:
uno::Reference<uno::XInterface> m_xCalcComponent;
- sc::Sparkline* createTestSparkline(ScDocument& rDocument);
-
public:
SparklineTest()
: ScBootstrapFixture("sc/qa/unit/data")
@@ -50,29 +50,38 @@ public:
void testDeleteSprkline();
void testCopyPasteSparkline();
void testCutPasteSparkline();
+ void testUndoRedoInsertSparkline();
CPPUNIT_TEST_SUITE(SparklineTest);
CPPUNIT_TEST(testAddSparkline);
CPPUNIT_TEST(testDeleteSprkline);
CPPUNIT_TEST(testCopyPasteSparkline);
CPPUNIT_TEST(testCutPasteSparkline);
+ CPPUNIT_TEST(testUndoRedoInsertSparkline);
CPPUNIT_TEST_SUITE_END();
};
-sc::Sparkline* SparklineTest::createTestSparkline(ScDocument& rDocument)
+namespace
+{
+void insertTestData(ScDocument& rDocument)
{
- auto pSparklineGroup = std::make_shared<sc::SparklineGroup>();
-
- sc::Sparkline* pSparkline = rDocument.CreateSparkline(ScAddress(0, 6, 0),
pSparklineGroup);
- if (!pSparkline)
- return nullptr;
-
rDocument.SetValue(0, 0, 0, 4);
rDocument.SetValue(0, 1, 0, -2);
rDocument.SetValue(0, 2, 0, 1);
rDocument.SetValue(0, 3, 0, -3);
rDocument.SetValue(0, 4, 0, 5);
rDocument.SetValue(0, 5, 0, 3);
+}
+
+sc::Sparkline* createTestSparkline(ScDocument& rDocument)
+{
+ auto pSparklineGroup = std::make_shared<sc::SparklineGroup>();
+
+ sc::Sparkline* pSparkline = rDocument.CreateSparkline(ScAddress(0, 6, 0),
pSparklineGroup);
+ if (!pSparkline)
+ return nullptr;
+
+ insertTestData(rDocument);
ScRangeList aList;
aList.push_back(ScRange(0, 0, 0, 0, 5, 0));
@@ -81,6 +90,8 @@ sc::Sparkline* SparklineTest::createTestSparkline(ScDocument&
rDocument)
return pSparkline;
}
+} // end anonymous namespace
+
void SparklineTest::testAddSparkline()
{
ScDocShellRef xDocSh = loadEmptyDocument();
@@ -228,6 +239,55 @@ void SparklineTest::testCutPasteSparkline()
xDocSh->DoClose();
}
+void SparklineTest::testUndoRedoInsertSparkline()
+{
+ ScDocShellRef xDocSh = loadEmptyDocument();
+ CPPUNIT_ASSERT(xDocSh);
+
+ ScDocument& rDocument = xDocSh->GetDocument();
+ ScTabViewShell* pViewShell = xDocSh->GetBestViewShell(false);
+ CPPUNIT_ASSERT(pViewShell);
+
+ auto& rDocFunc = xDocSh->GetDocFunc();
+
+ // insert test data - A1:A6
+ insertTestData(rDocument);
+
+ // Sparkline range
+ ScRange aRange(0, 6, 0, 0, 6, 0);
+
+ // Check Sparkline at cell A7 doesn't exists
+ auto pSparkline = rDocument.GetSparkline(aRange.aStart);
+ CPPUNIT_ASSERT(!pSparkline);
+
+ auto pSparklineGroup = std::make_shared<sc::SparklineGroup>();
+ rDocFunc.InsertSparklines(ScRange(0, 0, 0, 0, 5, 0), aRange,
pSparklineGroup);
+
+ // Check Sparkline at cell A7 exists
+ pSparkline = rDocument.GetSparkline(aRange.aStart);
+ CPPUNIT_ASSERT(pSparkline);
+ CPPUNIT_ASSERT_EQUAL(SCCOL(0), pSparkline->getColumn());
+ CPPUNIT_ASSERT_EQUAL(SCROW(6), pSparkline->getRow());
+
+ // Undo
+ rDocument.GetUndoManager()->Undo();
+
+ // Check Sparkline at cell A7 doesn't exists
+ pSparkline = rDocument.GetSparkline(aRange.aStart);
+ CPPUNIT_ASSERT(!pSparkline);
+
+ // Redo
+ rDocument.GetUndoManager()->Redo();
+
+ // Check Sparkline at cell A7 exists
+ pSparkline = rDocument.GetSparkline(aRange.aStart);
+ CPPUNIT_ASSERT(pSparkline);
+ CPPUNIT_ASSERT_EQUAL(SCCOL(0), pSparkline->getColumn());
+ CPPUNIT_ASSERT_EQUAL(SCROW(6), pSparkline->getRow());
+
+ xDocSh->DoClose();
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(SparklineTest);
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/dialogs/SparklineDialog.cxx
b/sc/source/ui/dialogs/SparklineDialog.cxx
index fac1d8274be5..103582c25a6e 100644
--- a/sc/source/ui/dialogs/SparklineDialog.cxx
+++ b/sc/source/ui/dialogs/SparklineDialog.cxx
@@ -8,10 +8,13 @@
*/
#include <SparklineDialog.hxx>
+#include <SparklineData.hxx>
#include <SparklineGroup.hxx>
#include <Sparkline.hxx>
#include <reffact.hxx>
+#include <docfunc.hxx>
+
#include <svx/colorbox.hxx>
namespace sc
@@ -310,48 +313,24 @@ IMPL_LINK_NOARG(SparklineDialog, SelectSparklineType,
weld::Toggleable&, void)
mpLocalSparklineGroup->m_eType = sc::SparklineType::Stacked;
}
-namespace
-{
-enum class RangeOrientation
-{
- Unknown,
- Row,
- Col
-};
-
-RangeOrientation calculateOrientation(sal_Int32 nOutputSize, ScRange const&
rInputRange)
-{
- sal_Int32 nRowSize = rInputRange.aEnd.Row() - rInputRange.aStart.Row();
- sal_Int32 nColSize = rInputRange.aEnd.Col() - rInputRange.aStart.Col();
-
- auto eInputOrientation = RangeOrientation::Unknown;
- if (nOutputSize == nRowSize)
- eInputOrientation = RangeOrientation::Row;
- else if (nOutputSize == nColSize)
- eInputOrientation = RangeOrientation::Col;
- return eInputOrientation;
-}
-
-} // end anonymous namespace
-
bool SparklineDialog::checkValidInputOutput()
{
if (!maInputRange.IsValid() || !maOutputRange.IsValid())
return false;
- RangeOrientation eInputOrientation = RangeOrientation::Unknown;
+ sc::RangeOrientation eInputOrientation = sc::RangeOrientation::Unknown;
if (maOutputRange.aStart.Col() == maOutputRange.aEnd.Col())
{
sal_Int32 nOutputRowSize = maOutputRange.aEnd.Row() -
maOutputRange.aStart.Row();
- eInputOrientation = calculateOrientation(nOutputRowSize, maInputRange);
+ eInputOrientation = sc::calculateOrientation(nOutputRowSize,
maInputRange);
}
else if (maOutputRange.aStart.Row() == maOutputRange.aEnd.Row())
{
sal_Int32 nOutputColSize = maOutputRange.aEnd.Col() -
maOutputRange.aStart.Col();
- eInputOrientation = calculateOrientation(nOutputColSize, maInputRange);
+ eInputOrientation = sc::calculateOrientation(nOutputColSize,
maInputRange);
}
- return eInputOrientation != RangeOrientation::Unknown;
+ return eInputOrientation != sc::RangeOrientation::Unknown;
}
void SparklineDialog::perform()
@@ -364,65 +343,9 @@ void SparklineDialog::perform()
mpLocalSparklineGroup->m_aColorFirst = mxColorFirst->GetSelectEntryColor();
mpLocalSparklineGroup->m_aColorLast = mxColorLast->GetSelectEntryColor();
- if (maOutputRange.aStart.Col() == maOutputRange.aEnd.Col())
- {
- sal_Int32 nOutputRowSize = maOutputRange.aEnd.Row() -
maOutputRange.aStart.Row();
-
- auto eInputOrientation = calculateOrientation(nOutputRowSize,
maInputRange);
-
- if (eInputOrientation == RangeOrientation::Unknown)
- return;
-
- sal_Int32 nIndex = 0;
- for (ScAddress aAddress = maOutputRange.aStart; aAddress.Row() <=
maOutputRange.aEnd.Row();
- aAddress.IncRow())
- {
- ScRange aInputRangeSlice = maInputRange;
- if (eInputOrientation == RangeOrientation::Row)
- {
- aInputRangeSlice.aStart.SetRow(maInputRange.aStart.Row() +
nIndex);
- aInputRangeSlice.aEnd.SetRow(maInputRange.aStart.Row() +
nIndex);
- }
- else
- {
- aInputRangeSlice.aStart.SetCol(maInputRange.aStart.Col() +
nIndex);
- aInputRangeSlice.aEnd.SetCol(maInputRange.aStart.Col() +
nIndex);
- }
- auto* pCreated = mrDocument.CreateSparkline(aAddress,
mpLocalSparklineGroup);
- pCreated->setInputRange(aInputRangeSlice);
- nIndex++;
- }
- }
- else if (maOutputRange.aStart.Row() == maOutputRange.aEnd.Row())
- {
- sal_Int32 nOutputColSize = maOutputRange.aEnd.Col() -
maOutputRange.aStart.Col();
-
- auto eInputOrientation = calculateOrientation(nOutputColSize,
maInputRange);
-
- if (eInputOrientation == RangeOrientation::Unknown)
- return;
+ auto& rDocFunc = mrViewData.GetDocShell()->GetDocFunc();
- sal_Int32 nIndex = 0;
-
- for (ScAddress aAddress = maOutputRange.aStart; aAddress.Col() <=
maOutputRange.aEnd.Col();
- aAddress.IncCol())
- {
- ScRange aInputRangeSlice = maInputRange;
- if (eInputOrientation == RangeOrientation::Row)
- {
- aInputRangeSlice.aStart.SetRow(maInputRange.aStart.Row() +
nIndex);
- aInputRangeSlice.aEnd.SetRow(maInputRange.aStart.Row() +
nIndex);
- }
- else
- {
- aInputRangeSlice.aStart.SetCol(maInputRange.aStart.Col() +
nIndex);
- aInputRangeSlice.aEnd.SetCol(maInputRange.aStart.Col() +
nIndex);
- }
- auto* pCreated = mrDocument.CreateSparkline(aAddress,
mpLocalSparklineGroup);
- pCreated->setInputRange(aInputRangeSlice);
- nIndex++;
- }
- }
+ rDocFunc.InsertSparklines(maInputRange, maOutputRange,
mpLocalSparklineGroup);
}
}
diff --git a/sc/source/ui/docshell/docfunc.cxx
b/sc/source/ui/docshell/docfunc.cxx
index b6c93a86cfc0..f28ca7e74344 100644
--- a/sc/source/ui/docshell/docfunc.cxx
+++ b/sc/source/ui/docshell/docfunc.cxx
@@ -94,6 +94,9 @@
#include <conditio.hxx>
#include <columnspanset.hxx>
#include <validat.hxx>
+#include <SparklineGroup.hxx>
+#include <SparklineData.hxx>
+#include <undo/UndoInsertSparkline.hxx>
#include <config_features.h>
#include <memory>
@@ -5759,4 +5762,83 @@ void ScDocFunc::EndListAction()
rDocShell.GetUndoManager()->LeaveListAction();
}
+bool ScDocFunc::InsertSparklines(ScRange const& rDataRange, ScRange const&
rSparklineRange,
+ std::shared_ptr<sc::SparklineGroup>
pSparklineGroup)
+{
+ std::vector<sc::SparklineData> aSparklineDataVector;
+
+ if (rSparklineRange.aStart.Col() == rSparklineRange.aEnd.Col())
+ {
+ sal_Int32 nOutputRowSize = rSparklineRange.aEnd.Row() -
rSparklineRange.aStart.Row();
+
+ auto eInputOrientation = sc::calculateOrientation(nOutputRowSize,
rDataRange);
+
+ if (eInputOrientation == sc::RangeOrientation::Unknown)
+ return false;
+
+ sal_Int32 nIndex = 0;
+
+ for (ScAddress aAddress = rSparklineRange.aStart; aAddress.Row() <=
rSparklineRange.aEnd.Row();
+ aAddress.IncRow())
+ {
+ ScRange aInputRangeSlice = rDataRange;
+ if (eInputOrientation == sc::RangeOrientation::Row)
+ {
+ aInputRangeSlice.aStart.SetRow(rDataRange.aStart.Row() +
nIndex);
+ aInputRangeSlice.aEnd.SetRow(rDataRange.aStart.Row() + nIndex);
+ }
+ else
+ {
+ aInputRangeSlice.aStart.SetCol(rDataRange.aStart.Col() +
nIndex);
+ aInputRangeSlice.aEnd.SetCol(rDataRange.aStart.Col() + nIndex);
+ }
+
+ aSparklineDataVector.emplace_back(aAddress, aInputRangeSlice);
+
+ nIndex++;
+ }
+ }
+ else if (rSparklineRange.aStart.Row() == rSparklineRange.aEnd.Row())
+ {
+ sal_Int32 nOutputColSize = rSparklineRange.aEnd.Col() -
rSparklineRange.aStart.Col();
+
+ auto eInputOrientation = sc::calculateOrientation(nOutputColSize,
rDataRange);
+
+ if (eInputOrientation == sc::RangeOrientation::Unknown)
+ return false;
+
+ sal_Int32 nIndex = 0;
+
+ for (ScAddress aAddress = rSparklineRange.aStart; aAddress.Col() <=
rSparklineRange.aEnd.Col();
+ aAddress.IncCol())
+ {
+ ScRange aInputRangeSlice = rDataRange;
+ if (eInputOrientation == sc::RangeOrientation::Row)
+ {
+ aInputRangeSlice.aStart.SetRow(rDataRange.aStart.Row() +
nIndex);
+ aInputRangeSlice.aEnd.SetRow(rDataRange.aStart.Row() + nIndex);
+ }
+ else
+ {
+ aInputRangeSlice.aStart.SetCol(rDataRange.aStart.Col() +
nIndex);
+ aInputRangeSlice.aEnd.SetCol(rDataRange.aStart.Col() + nIndex);
+ }
+
+ aSparklineDataVector.emplace_back(aAddress, aInputRangeSlice);
+
+ nIndex++;
+ }
+ }
+
+ if (aSparklineDataVector.empty())
+ return false;
+
+ auto pUndoInsertSparkline =
std::make_unique<sc::UndoInsertSparkline>(rDocShell, aSparklineDataVector,
pSparklineGroup);
+ // insert the sparkline by "redoing"
+ pUndoInsertSparkline->Redo();
+ rDocShell.GetUndoManager()->AddUndoAction(std::move(pUndoInsertSparkline));
+
+ return true;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/inc/docfunc.hxx b/sc/source/ui/inc/docfunc.hxx
index 8b0ea7d7c16a..52d61cb2e86e 100644
--- a/sc/source/ui/inc/docfunc.hxx
+++ b/sc/source/ui/inc/docfunc.hxx
@@ -51,8 +51,10 @@ class ScPostIt;
enum class TransliterationFlags;
enum class CreateNameFlags;
-namespace sc {
+namespace sc
+{
struct ColRowSpan;
+ class SparklineGroup;
}
class ScDocFunc
@@ -234,6 +236,9 @@ public:
void ConvertFormulaToValue( const ScRange& rRange, bool bInteraction );
+ SC_DLLPUBLIC bool InsertSparklines(ScRange const& rDataRange, ScRange
const& rSparklineRange,
+ std::shared_ptr<sc::SparklineGroup>
pSparklineGroup);
+
private:
void ProtectDocument(const ScDocProtection& rProtect);
};
diff --git a/sc/source/ui/inc/undo/UndoInsertSparkline.hxx
b/sc/source/ui/inc/undo/UndoInsertSparkline.hxx
new file mode 100644
index 000000000000..3c2fa6d17977
--- /dev/null
+++ b/sc/source/ui/inc/undo/UndoInsertSparkline.hxx
@@ -0,0 +1,45 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ */
+
+#pragma once
+
+#include "undobase.hxx"
+#include <address.hxx>
+#include <memory>
+
+namespace sc
+{
+class SparklineGroup;
+class SparklineData;
+
+/** Undo action for inserting a Sparkline */
+class UndoInsertSparkline : public ScSimpleUndo
+{
+private:
+ std::vector<sc::SparklineData> maSparklineDataVector;
+ std::shared_ptr<sc::SparklineGroup> mpSparklineGroup;
+
+public:
+ UndoInsertSparkline(ScDocShell& rDocShell,
+ std::vector<SparklineData> const& rSparklineDataVector,
+ std::shared_ptr<sc::SparklineGroup> pSparklineGroup);
+
+ virtual ~UndoInsertSparkline() override;
+
+ void Undo() override;
+ void Redo() override;
+ bool CanRepeat(SfxRepeatTarget& rTarget) const override;
+ void Repeat(SfxRepeatTarget& rTarget) override;
+ OUString GetComment() const override;
+};
+
+} // namespace sc
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/sparklines/SparklineData.cxx
b/sc/source/ui/sparklines/SparklineData.cxx
new file mode 100644
index 000000000000..a126acc10b0a
--- /dev/null
+++ b/sc/source/ui/sparklines/SparklineData.cxx
@@ -0,0 +1,30 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ */
+
+#include <SparklineData.hxx>
+
+namespace sc
+{
+RangeOrientation calculateOrientation(sal_Int32 nOutputSize, ScRange const&
rInputRange)
+{
+ sal_Int32 nRowSize = rInputRange.aEnd.Row() - rInputRange.aStart.Row();
+ sal_Int32 nColSize = rInputRange.aEnd.Col() - rInputRange.aStart.Col();
+
+ auto eInputOrientation = RangeOrientation::Unknown;
+ if (nOutputSize == nRowSize)
+ eInputOrientation = RangeOrientation::Row;
+ else if (nOutputSize == nColSize)
+ eInputOrientation = RangeOrientation::Col;
+ return eInputOrientation;
+}
+
+} // end sc
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/undo/UndoInsertSparkline.cxx
b/sc/source/ui/undo/UndoInsertSparkline.cxx
new file mode 100644
index 000000000000..c35cc3f6dc03
--- /dev/null
+++ b/sc/source/ui/undo/UndoInsertSparkline.cxx
@@ -0,0 +1,78 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
... etc. - the rest is truncated