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
 

Reply via email to