sc/inc/SparklineGroup.hxx | 35 +++++++++++ sc/source/filter/inc/SparklineFragment.hxx | 43 +++----------- sc/source/filter/oox/SparklineFragment.cxx | 88 ++++++++++++++++++++++------- 3 files changed, 114 insertions(+), 52 deletions(-)
New commits: commit 38e241141426dac71093dac0dad36742b79adda5 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Wed Feb 23 10:06:20 2022 +0900 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Sun Apr 10 15:31:50 2022 +0200 sc: write the OOXML Sparkline props. to the model This moves the properties read during the OOXML import into the SparlineGroup class (the document model), so a sparkline can be connected with the properties. Change-Id: I09ecf560f1870624cb984722bdb8ee306d839dfe Reviewed-on: https://gerrit.libreoffice.org/c/core/+/131163 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> (cherry picked from commit c4e0fd8dd682820c7daed1b7043e0612696ed513) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/132548 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> diff --git a/sc/inc/SparklineGroup.hxx b/sc/inc/SparklineGroup.hxx index 6d98e1b2dcbf..d130084fd121 100644 --- a/sc/inc/SparklineGroup.hxx +++ b/sc/inc/SparklineGroup.hxx @@ -11,6 +11,7 @@ #pragma once #include "scdllapi.h" +#include <tools/color.hxx> #include <optional> namespace sc @@ -19,6 +20,40 @@ namespace sc 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; + + OUString m_sMinAxisType; // individual, group, custom + OUString m_sMaxAxisType; // individual, group, custom + + double m_fLineWeight; // In pt + + OUString m_sType; // line, column, stacked + + bool m_bDateAxis; + + OUString m_sDisplayEmptyCellsAs; // 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; // if m_sMinAxisType is "custom" + std::optional<double> m_aManualMin; // if m_sMaxAxisType is "custom" + OUString m_sUID; + SparklineGroup() {} SparklineGroup(const SparklineGroup&) = delete; diff --git a/sc/source/filter/inc/SparklineFragment.hxx b/sc/source/filter/inc/SparklineFragment.hxx index 36a7b5ca9f05..de1f9ae7ebda 100644 --- a/sc/source/filter/inc/SparklineFragment.hxx +++ b/sc/source/filter/inc/SparklineFragment.hxx @@ -11,10 +11,10 @@ #include "excelhandlers.hxx" #include <oox/core/contexthandler.hxx> +#include <SparklineGroup.hxx> #include <vector> #include <memory> -#include <optional> namespace oox { @@ -36,40 +36,15 @@ class SparklineGroup private: std::vector<Sparkline> m_aSparklines; -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; - - OUString m_sMinAxisType; // individual, group, custom - OUString m_sMaxAxisType; - - double m_fLineWeight; // In pt - - OUString m_sType; // line, column, stacked + std::shared_ptr<sc::SparklineGroup> m_pSparklineGroup; - bool m_bDateAxis; - - OUString m_sDisplayEmptyCellsAs; // 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: + SparklineGroup() + : m_pSparklineGroup(new sc::SparklineGroup()) + { + } - std::optional<double> m_aManualMax; - std::optional<double> m_aManualMin; - OUString m_sUID; + std::shared_ptr<sc::SparklineGroup> getSparklineGroup() { return m_pSparklineGroup; } std::vector<Sparkline>& getSparklines() { return m_aSparklines; } }; @@ -87,6 +62,8 @@ public: void onStartElement(const AttributeList& rAttribs) override; void onCharacters(const OUString& rCharacters) override; void onEndElement() override; + + void insertSparkline(SparklineGroup& rSparklineGroup, Sparkline& rSparkline); }; } //namespace oox::xls diff --git a/sc/source/filter/oox/SparklineFragment.cxx b/sc/source/filter/oox/SparklineFragment.cxx index a743b886b7db..bfc5a259a883 100644 --- a/sc/source/filter/oox/SparklineFragment.cxx +++ b/sc/source/filter/oox/SparklineFragment.cxx @@ -15,6 +15,8 @@ #include <oox/helper/attributelist.hxx> #include <document.hxx> #include <rangeutl.hxx> +#include <Sparkline.hxx> +#include <themebuffer.hxx> using ::oox::core::ContextHandlerRef; @@ -22,51 +24,74 @@ namespace oox::xls { namespace { -Color getColor(const AttributeList& rAttribs) +// TODO: deduplicate with importOOXColor +::Color getColor(const AttributeList& rAttribs, ThemeBuffer const& rThemeBuffer) { if (rAttribs.hasAttribute(XML_rgb)) { - return Color(ColorTransparency, - rAttribs.getIntegerHex(XML_rgb, sal_Int32(API_RGB_TRANSPARENT))); + return ::Color(ColorAlpha, rAttribs.getIntegerHex(XML_rgb, sal_Int32(API_RGB_TRANSPARENT))); } - return Color(); + else if (rAttribs.hasAttribute(XML_theme)) + { + sal_uInt32 nThemeIndex = rAttribs.getUnsigned(XML_theme, 0); + + // Excel has a bug in the mapping of index 0, 1, 2 and 3. + if (nThemeIndex == 0) + nThemeIndex = 1; + else if (nThemeIndex == 1) + nThemeIndex = 0; + else if (nThemeIndex == 2) + nThemeIndex = 3; + else if (nThemeIndex == 3) + nThemeIndex = 2; + + ::Color aColor = rThemeBuffer.getColorByIndex(nThemeIndex); + double nTint = rAttribs.getDouble(XML_tint, 0.0); + + if (nTint > 0.0) + aColor.ApplyTintOrShade(nTint * 10000); + return aColor; + } + + return ::Color(); } -void addColorsToSparklineGroup(SparklineGroup& rSparklineGroup, sal_Int32 nElement, - const AttributeList& rAttribs) +void addColorsToSparklineGroup(sc::SparklineGroup& rSparklineGroup, sal_Int32 nElement, + const AttributeList& rAttribs, ThemeBuffer& rThemeBuffer) { switch (nElement) { case XLS14_TOKEN(colorSeries): - rSparklineGroup.m_aColorSeries = getColor(rAttribs); + rSparklineGroup.m_aColorSeries = getColor(rAttribs, rThemeBuffer); break; case XLS14_TOKEN(colorNegative): - rSparklineGroup.m_aColorNegative = getColor(rAttribs); + rSparklineGroup.m_aColorNegative = getColor(rAttribs, rThemeBuffer); break; case XLS14_TOKEN(colorAxis): - rSparklineGroup.m_aColorAxis = getColor(rAttribs); + rSparklineGroup.m_aColorAxis = getColor(rAttribs, rThemeBuffer); break; case XLS14_TOKEN(colorMarkers): - rSparklineGroup.m_aColorMarkers = getColor(rAttribs); + rSparklineGroup.m_aColorMarkers = getColor(rAttribs, rThemeBuffer); break; case XLS14_TOKEN(colorFirst): - rSparklineGroup.m_aColorFirst = getColor(rAttribs); + rSparklineGroup.m_aColorFirst = getColor(rAttribs, rThemeBuffer); break; case XLS14_TOKEN(colorLast): - rSparklineGroup.m_aColorLast = getColor(rAttribs); + rSparklineGroup.m_aColorLast = getColor(rAttribs, rThemeBuffer); break; case XLS14_TOKEN(colorHigh): - rSparklineGroup.m_aColorHigh = getColor(rAttribs); + rSparklineGroup.m_aColorHigh = getColor(rAttribs, rThemeBuffer); break; case XLS14_TOKEN(colorLow): - rSparklineGroup.m_aColorLow = getColor(rAttribs); + rSparklineGroup.m_aColorLow = getColor(rAttribs, rThemeBuffer); break; default: break; } } -void addAttributesToSparklineGroup(SparklineGroup& rSparklineGroup, const AttributeList& rAttribs) +void addAttributesToSparklineGroup(sc::SparklineGroup& rSparklineGroup, + const AttributeList& rAttribs) { auto oManualMax = rAttribs.getDouble(XML_manualMax); auto oManualMin = rAttribs.getDouble(XML_manualMin); @@ -116,7 +141,7 @@ ContextHandlerRef SparklineGroupsContext::onCreateContext(sal_Int32 nElement, case XLS14_TOKEN(sparklineGroup): { auto& rLastGroup = m_aSparklineGroups.emplace_back(); - addAttributesToSparklineGroup(rLastGroup, rAttribs); + addAttributesToSparklineGroup(*rLastGroup.getSparklineGroup(), rAttribs); return this; } case XLS14_TOKEN(colorSeries): @@ -129,7 +154,8 @@ ContextHandlerRef SparklineGroupsContext::onCreateContext(sal_Int32 nElement, case XLS14_TOKEN(colorLow): { auto& rLastGroup = m_aSparklineGroups.back(); - addColorsToSparklineGroup(rLastGroup, nElement, rAttribs); + addColorsToSparklineGroup(*rLastGroup.getSparklineGroup(), nElement, rAttribs, + getTheme()); return this; } case XLS14_TOKEN(sparklines): @@ -155,7 +181,6 @@ void SparklineGroupsContext::onCharacters(const OUString& rChars) ScDocument& rDocument = getScDocument(); auto& rLastGroup = m_aSparklineGroups.back(); auto& rLastSparkline = rLastGroup.getSparklines().back(); - ScRangeList aRange; if (ScRangeStringConverter::GetRangeListFromString(aRange, rChars, rDocument, formula::FormulaGrammar::CONV_XL_OOX)) @@ -182,7 +207,32 @@ void SparklineGroupsContext::onCharacters(const OUString& rChars) } } -void SparklineGroupsContext::onEndElement() {} +void SparklineGroupsContext::onEndElement() +{ + if (getCurrentElement() == XLS14_TOKEN(sparklineGroup)) + { + auto& rLastGroup = m_aSparklineGroups.back(); + for (Sparkline& rSparkline : rLastGroup.getSparklines()) + { + insertSparkline(rLastGroup, rSparkline); + } + } +} + +void SparklineGroupsContext::insertSparkline(SparklineGroup& rSparklineGroup, Sparkline& rSparkline) +{ + auto& rDocument = getScDocument(); + if (rSparkline.m_aTargetRange.size() == 1) + { + auto& rRange = rSparkline.m_aTargetRange[0]; + if (rRange.aStart == rRange.aEnd) + { + auto pSparklineGroup = rSparklineGroup.getSparklineGroup(); + auto* pCreated = rDocument.CreateSparkline(rRange.aStart, pSparklineGroup); + pCreated->setInputRange(rSparkline.m_aInputRange); + } + } +} } //namespace oox::xls