summaryrefslogtreecommitdiffstats
path: root/sc/source/ui/sparklines
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/ui/sparklines')
-rw-r--r--sc/source/ui/sparklines/SparklineAttributes.cxx277
-rw-r--r--sc/source/ui/sparklines/SparklineData.cxx30
-rw-r--r--sc/source/ui/sparklines/SparklineGroup.cxx34
-rw-r--r--sc/source/ui/sparklines/SparklineList.cxx103
4 files changed, 444 insertions, 0 deletions
diff --git a/sc/source/ui/sparklines/SparklineAttributes.cxx b/sc/source/ui/sparklines/SparklineAttributes.cxx
new file mode 100644
index 000000000..20b8bf6fe
--- /dev/null
+++ b/sc/source/ui/sparklines/SparklineAttributes.cxx
@@ -0,0 +1,277 @@
+/* -*- 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
+{
+/** Holder of sparkline attributes */
+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;
+
+ static constexpr ::Color COL_STANDARD_RED = 0xff0000;
+ static constexpr ::Color COL_STANDARD_BLUE = 0x2a6099;
+
+ Implementation()
+ : m_aColorSeries(COL_STANDARD_BLUE)
+ , m_aColorNegative(COL_STANDARD_RED)
+ , m_aColorAxis(COL_STANDARD_RED)
+ , m_aColorMarkers(COL_STANDARD_RED)
+ , m_aColorFirst(COL_STANDARD_RED)
+ , m_aColorLast(COL_STANDARD_RED)
+ , m_aColorHigh(COL_STANDARD_RED)
+ , m_aColorLow(COL_STANDARD_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/SparklineData.cxx b/sc/source/ui/sparklines/SparklineData.cxx
new file mode 100644
index 000000000..a126acc10
--- /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/sparklines/SparklineGroup.cxx b/sc/source/ui/sparklines/SparklineGroup.cxx
new file mode 100644
index 000000000..1ba235e75
--- /dev/null
+++ b/sc/source/ui/sparklines/SparklineGroup.cxx
@@ -0,0 +1,34 @@
+/* -*- 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(SparklineAttributes const& rSparklineAttributes)
+ : m_aAttributes(rSparklineAttributes)
+ , m_aGUID(tools::Guid::Generate)
+{
+}
+
+SparklineGroup::SparklineGroup()
+ : m_aGUID(tools::Guid::Generate)
+{
+}
+
+SparklineGroup::SparklineGroup(SparklineGroup const& pOtherSparkline)
+ : m_aAttributes(pOtherSparkline.m_aAttributes)
+ , m_aGUID(pOtherSparkline.m_aGUID)
+{
+}
+
+} // end sc
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/sparklines/SparklineList.cxx b/sc/source/ui/sparklines/SparklineList.cxx
new file mode 100644
index 000000000..1cae30896
--- /dev/null
+++ b/sc/source/ui/sparklines/SparklineList.cxx
@@ -0,0 +1,103 @@
+/* -*- 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 <SparklineList.hxx>
+
+namespace sc
+{
+SparklineList::SparklineList() = default;
+
+void SparklineList::addSparkline(std::shared_ptr<Sparkline> const& pSparkline)
+{
+ auto pWeakGroup = std::weak_ptr<SparklineGroup>(pSparkline->getSparklineGroup());
+
+ auto[iterator, bInserted]
+ = m_aSparklineGroupMap.try_emplace(pWeakGroup, std::vector<std::weak_ptr<Sparkline>>());
+ iterator->second.push_back(std::weak_ptr<Sparkline>(pSparkline));
+ if (bInserted)
+ m_aSparklineGroups.push_back(pWeakGroup);
+}
+
+void SparklineList::removeSparkline(std::shared_ptr<Sparkline> const& pSparkline)
+{
+ auto pWeakGroup = std::weak_ptr<SparklineGroup>(pSparkline->getSparklineGroup());
+ auto iteratorGroup = m_aSparklineGroupMap.find(pWeakGroup);
+ if (iteratorGroup != m_aSparklineGroupMap.end())
+ {
+ auto& rWeakSparklines = iteratorGroup->second;
+
+ for (auto iterator = rWeakSparklines.begin(); iterator != rWeakSparklines.end();)
+ {
+ auto pCurrentSparkline = iterator->lock();
+
+ if (pCurrentSparkline && pCurrentSparkline != pSparkline)
+ {
+ iterator++;
+ }
+ else
+ {
+ iterator = rWeakSparklines.erase(iterator);
+ }
+ }
+ }
+}
+
+std::vector<std::shared_ptr<SparklineGroup>> SparklineList::getSparklineGroups()
+{
+ std::vector<std::shared_ptr<SparklineGroup>> toReturn;
+
+ for (auto iterator = m_aSparklineGroups.begin(); iterator != m_aSparklineGroups.end();)
+ {
+ auto pWeakGroup = *iterator;
+ if (auto pSparklineGroup = pWeakGroup.lock())
+ {
+ toReturn.push_back(pSparklineGroup);
+ iterator++;
+ }
+ else
+ {
+ iterator = m_aSparklineGroups.erase(iterator);
+ }
+ }
+ return toReturn;
+}
+
+std::vector<std::shared_ptr<Sparkline>>
+SparklineList::getSparklinesFor(std::shared_ptr<SparklineGroup> const& pSparklineGroup)
+{
+ std::vector<std::shared_ptr<Sparkline>> toReturn;
+
+ std::weak_ptr<SparklineGroup> pWeakGroup(pSparklineGroup);
+ auto iteratorGroup = m_aSparklineGroupMap.find(pWeakGroup);
+
+ if (iteratorGroup == m_aSparklineGroupMap.end())
+ return toReturn;
+
+ auto& rWeakSparklines = iteratorGroup->second;
+
+ for (auto iterator = rWeakSparklines.begin(); iterator != rWeakSparklines.end();)
+ {
+ if (auto aSparkline = iterator->lock())
+ {
+ toReturn.push_back(aSparkline);
+ iterator++;
+ }
+ else
+ {
+ iterator = rWeakSparklines.erase(iterator);
+ }
+ }
+
+ return toReturn;
+}
+
+} // end sc
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */