include/editeng/unoprnms.hxx               |    1 
 include/oox/export/drawingml.hxx           |    2 
 include/svx/ColorSets.hxx                  |    2 
 include/svx/unoshprp.hxx                   |    1 
 oox/inc/drawingml/lineproperties.hxx       |    3 
 oox/qa/unit/data/ThemeShapesReference.pptx |binary
 oox/qa/unit/drawingml.cxx                  |   72 ++++++++++++++++++-
 oox/source/drawingml/clrscheme.cxx         |   24 +++---
 oox/source/drawingml/lineproperties.cxx    |   34 ++++++++-
 oox/source/drawingml/shape.cxx             |    4 -
 oox/source/export/drawingml.cxx            |   62 +++-------------
 oox/source/token/properties.txt            |    1 
 sd/source/core/stlsheet.cxx                |   10 ++
 svx/source/styles/ColorSets.cxx            |  109 +++++++++--------------------
 svx/source/table/cell.cxx                  |   12 ++-
 svx/source/unodraw/unoshape.cxx            |   10 ++
 svx/source/xoutdev/xattr.cxx               |   44 +++++++++--
 17 files changed, 241 insertions(+), 150 deletions(-)

New commits:
commit 80795935980abd9a2b255b8f963691f199d1363f
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Thu Jan 5 14:46:30 2023 +0900
Commit:     Tomaž Vajngerl <qui...@gmail.com>
CommitDate: Wed Jan 18 12:58:01 2023 +0000

    svx: change ColorSet add method to use ThemeColorTyp enum
    
    Change-Id: I2034a7e915d41c6b55c8344d44be4f6a60e8287e
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145072
    Tested-by: Tomaž Vajngerl <qui...@gmail.com>
    Reviewed-by: Tomaž Vajngerl <qui...@gmail.com>
    (cherry picked from commit 0b35b239c0ff1adad2c4544d8692b5b13a0d363b)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145652

diff --git a/include/svx/ColorSets.hxx b/include/svx/ColorSets.hxx
index 030ee8bf934f..625bcc62274e 100644
--- a/include/svx/ColorSets.hxx
+++ b/include/svx/ColorSets.hxx
@@ -36,7 +36,7 @@ class SVXCORE_DLLPUBLIC ColorSet
 public:
     ColorSet(OUString const& rName);
 
-    void add(sal_uInt32 nIndex, Color aColorData);
+    void add(model::ThemeColorType Type, Color aColorData);
 
     const OUString& getName() const
     {
diff --git a/oox/source/drawingml/clrscheme.cxx 
b/oox/source/drawingml/clrscheme.cxx
index 225faf81eecf..b335c7655efc 100644
--- a/oox/source/drawingml/clrscheme.cxx
+++ b/oox/source/drawingml/clrscheme.cxx
@@ -127,21 +127,21 @@ void ClrScheme::fill(svx::ColorSet& rColorSet) const
         switch (nToken)
         {
             case XML_tx1:
-            case XML_dk1: rColorSet.add(0, rColor); break;
+            case XML_dk1: rColorSet.add(model::ThemeColorType::Dark1, rColor); 
break;
             case XML_bg1:
-            case XML_lt1: rColorSet.add(1, rColor); break;
+            case XML_lt1: rColorSet.add(model::ThemeColorType::Light1, 
rColor); break;
             case XML_tx2:
-            case XML_dk2: rColorSet.add(2, rColor); break;
+            case XML_dk2: rColorSet.add(model::ThemeColorType::Dark2, rColor); 
break;
             case XML_bg2:
-            case XML_lt2: rColorSet.add(3, rColor); break;
-            case XML_accent1: rColorSet.add(4, rColor); break;
-            case XML_accent2: rColorSet.add(5, rColor); break;
-            case XML_accent3: rColorSet.add(6, rColor); break;
-            case XML_accent4: rColorSet.add(7, rColor); break;
-            case XML_accent5: rColorSet.add(8, rColor); break;
-            case XML_accent6: rColorSet.add(9, rColor); break;
-            case XML_hlink: rColorSet.add(10, rColor); break;
-            case XML_folHlink: rColorSet.add(11, rColor); break;
+            case XML_lt2: rColorSet.add(model::ThemeColorType::Light2, 
rColor); break;
+            case XML_accent1: rColorSet.add(model::ThemeColorType::Accent1, 
rColor); break;
+            case XML_accent2: rColorSet.add(model::ThemeColorType::Accent2, 
rColor); break;
+            case XML_accent3: rColorSet.add(model::ThemeColorType::Accent3, 
rColor); break;
+            case XML_accent4: rColorSet.add(model::ThemeColorType::Accent4, 
rColor); break;
+            case XML_accent5: rColorSet.add(model::ThemeColorType::Accent5, 
rColor); break;
+            case XML_accent6: rColorSet.add(model::ThemeColorType::Accent6, 
rColor); break;
+            case XML_hlink: rColorSet.add(model::ThemeColorType::Hyperlink, 
rColor); break;
+            case XML_folHlink: 
rColorSet.add(model::ThemeColorType::FollowedHyperlink, rColor); break;
             default: break;
         }
     }
diff --git a/svx/source/styles/ColorSets.cxx b/svx/source/styles/ColorSets.cxx
index c8102de7606c..1cc9e5ed44cf 100644
--- a/svx/source/styles/ColorSets.cxx
+++ b/svx/source/styles/ColorSets.cxx
@@ -120,9 +120,11 @@ ColorSet::ColorSet(OUString const & rName)
     : maName(rName)
 {}
 
-void ColorSet::add(sal_uInt32 nIndex, Color aColorData)
+void ColorSet::add(model::ThemeColorType eType, Color aColorData)
 {
-    maColors[nIndex] = aColorData;
+    if (eType == model::ThemeColorType::Unknown)
+        return;
+    maColors[sal_Int16(eType)] = aColorData;
 }
 
 void ColorSet::dumpAsXml(xmlTextWriterPtr pWriter) const
@@ -152,70 +154,22 @@ ColorSets::~ColorSets()
 
 void ColorSets::init()
 {
-    {
+    //{
         ColorSet aColorSet("Breeze");
-        aColorSet.add(0,  0xFCFCFC);
-        aColorSet.add(1,  0x232629);
-        aColorSet.add(2,  0xEFF0F1);
-        aColorSet.add(3,  0x31363B);
-        aColorSet.add(4,  0xDA4453);
-        aColorSet.add(5,  0xF47750);
-        aColorSet.add(6,  0xFDBC4B);
-        aColorSet.add(7,  0xC9CE3B);
-        aColorSet.add(8,  0x1CDC9A);
-        aColorSet.add(9,  0x2ECC71);
-        aColorSet.add(10, 0x1D99F3);
-        aColorSet.add(11, 0x3DAEE9);
-        maColorSets.push_back(aColorSet);
-    }
-    {
-        ColorSet aColorSet("Material Blue");
-        aColorSet.add(0,  0xFFFFFF);
-        aColorSet.add(1,  0x212121);
-        aColorSet.add(2,  0xECEFF1);
-        aColorSet.add(3,  0x37474F);
-        aColorSet.add(4,  0x7986CB);
-        aColorSet.add(5,  0x303F9F);
-        aColorSet.add(6,  0x64B5F6);
-        aColorSet.add(7,  0x1976D2);
-        aColorSet.add(8,  0x4FC3F7);
-        aColorSet.add(9,  0x0277BD);
-        aColorSet.add(10, 0x4DD0E1);
-        aColorSet.add(11, 0x0097A7);
-        maColorSets.push_back(aColorSet);
-    }
-    {
-        ColorSet aColorSet("Material Red");
-        aColorSet.add(0,  0xFFFFFF);
-        aColorSet.add(1,  0x212121);
-        aColorSet.add(2,  0xF5F5F5);
-        aColorSet.add(3,  0x424242);
-        aColorSet.add(4,  0xFF9800);
-        aColorSet.add(5,  0xFF6D00);
-        aColorSet.add(6,  0xFF5722);
-        aColorSet.add(7,  0xDD2C00);
-        aColorSet.add(8,  0xF44336);
-        aColorSet.add(9,  0xD50000);
-        aColorSet.add(10, 0xE91E63);
-        aColorSet.add(11, 0xC51162);
-        maColorSets.push_back(aColorSet);
-    }
-    {
-        ColorSet aColorSet("Material Green");
-        aColorSet.add(0,  0xFFFFFF);
-        aColorSet.add(1,  0x212121);
-        aColorSet.add(2,  0xF5F5F5);
-        aColorSet.add(3,  0x424242);
-        aColorSet.add(4,  0x009688);
-        aColorSet.add(5,  0x00bfa5);
-        aColorSet.add(6,  0x4caf50);
-        aColorSet.add(7,  0x00c853);
-        aColorSet.add(8,  0x8bc34a);
-        aColorSet.add(9,  0x64dd17);
-        aColorSet.add(10, 0xcddc39);
-        aColorSet.add(11, 0xaeea00);
+        aColorSet.add(model::ThemeColorType::Dark1, 0x232629);
+        aColorSet.add(model::ThemeColorType::Light1, 0xFCFCFC);
+        aColorSet.add(model::ThemeColorType::Dark2, 0x31363B);
+        aColorSet.add(model::ThemeColorType::Light2, 0xEFF0F1);
+        aColorSet.add(model::ThemeColorType::Accent1, 0xDA4453);
+        aColorSet.add(model::ThemeColorType::Accent2, 0xF47750);
+        aColorSet.add(model::ThemeColorType::Accent3, 0xFDBC4B);
+        aColorSet.add(model::ThemeColorType::Accent4, 0xC9CE3B);
+        aColorSet.add(model::ThemeColorType::Accent5, 0x1CDC9A);
+        aColorSet.add(model::ThemeColorType::Accent6, 0x2ECC71);
+        aColorSet.add(model::ThemeColorType::Hyperlink, 0x1D99F3);
+        aColorSet.add(model::ThemeColorType::FollowedHyperlink, 0x3DAEE9);
         maColorSets.push_back(aColorSet);
-    }
+    //}
 }
 
 const ColorSet& ColorSets::getColorSet(std::u16string_view rName)
@@ -273,8 +227,11 @@ void Theme::ToAny(css::uno::Any& rVal) const
         std::vector<util::Color> aColorScheme;
         for (auto eThemeColorType : o3tl::enumrange<model::ThemeColorType>())
         {
-            Color aColor = mpColorSet->getColor(eThemeColorType);
-            aColorScheme.push_back(sal_Int32(aColor));
+            if (eThemeColorType != model::ThemeColorType::Unknown)
+            {
+                Color aColor = mpColorSet->getColor(eThemeColorType);
+                aColorScheme.push_back(sal_Int32(aColor));
+            }
         }
 
         aMap["ColorSchemeName"] <<= mpColorSet->getName();
@@ -313,15 +270,20 @@ std::unique_ptr<Theme> Theme::FromAny(const 
css::uno::Any& rVal)
     {
         uno::Sequence<util::Color> aColors;
         it->second >>= aColors;
-        for (size_t i = 0; i < aColors.size(); ++i)
+
+        SAL_WARN_IF(aColors.size() > 12, "svx", "Theme::FromAny: number of 
colors greater than max theme colors supported");
+
+        for (auto eThemeColorType : o3tl::enumrange<model::ThemeColorType>())
         {
-            if (i >= 12)
+            if (eThemeColorType != model::ThemeColorType::Unknown)
             {
-                SAL_WARN("svx", "Theme::FromAny: too many colors in the color 
set");
-                break;
+                size_t nIndex(static_cast<sal_Int16>(eThemeColorType));
+                if (nIndex < aColors.size())
+                {
+                    Color aColor(ColorTransparency, aColors[nIndex]);
+                    pColorSet->add(eThemeColorType, aColor);
+                }
             }
-
-            pColorSet->add(i, Color(ColorTransparency, aColors[i]));
         }
     }
 
@@ -354,7 +316,8 @@ std::vector<Color> Theme::GetColors() const
     std::vector<Color> aColors;
     for (auto eThemeColorType : o3tl::enumrange<model::ThemeColorType>())
     {
-        aColors.push_back(mpColorSet->getColor(eThemeColorType));
+        if (eThemeColorType != model::ThemeColorType::Unknown)
+            aColors.push_back(mpColorSet->getColor(eThemeColorType));
     }
     return aColors;
 }
commit 8cec5a700a36ad6d3ac6b054a3366b22354d7f1d
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Thu Jan 5 13:12:34 2023 +0900
Commit:     Tomaž Vajngerl <qui...@gmail.com>
CommitDate: Wed Jan 18 12:57:51 2023 +0000

    support theme color for lines + oox support + tests
    
    Extended XLineColor to handle model::ThemeColor which then maps
    to the newly added LineColorThemeData property.
    
    Extended oox import and export to map the scheme color elements
    to and from ThemeColor. Added a new test to check the theme line
    color in impress shapes.
    
    Change-Id: I23ecc18c88b5b47608c9110f5681f189d02e2f36
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145071
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <qui...@gmail.com>
    (cherry picked from commit af8fdba1194e657237f9abc460381a1c4bc49982)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145651
    Tested-by: Tomaž Vajngerl <qui...@gmail.com>

diff --git a/include/editeng/unoprnms.hxx b/include/editeng/unoprnms.hxx
index 77d4636bb14f..a85afe0788f8 100644
--- a/include/editeng/unoprnms.hxx
+++ b/include/editeng/unoprnms.hxx
@@ -77,6 +77,7 @@
 #define UNO_NAME_LINEDASH                       "LineDash"
 #define UNO_NAME_LINEWIDTH                      "LineWidth"
 #define UNO_NAME_LINECOLOR                      "LineColor"
+#define UNO_NAME_LINECOLOR_THEME_REFERENCE      "LineColorThemeReference"
 #define UNO_NAME_LINEJOINT                      "LineJoint"
 #define UNO_NAME_LINESTART                      "LineStart"
 #define UNO_NAME_LINEEND                        "LineEnd"
diff --git a/include/oox/export/drawingml.hxx b/include/oox/export/drawingml.hxx
index f2ef8c910da0..65c9112ab497 100644
--- a/include/oox/export/drawingml.hxx
+++ b/include/oox/export/drawingml.hxx
@@ -230,7 +230,7 @@ public:
     void WriteConnectorConnections( EscherConnectorListEntry& rConnectorEntry, 
sal_Int32 nStartID, sal_Int32 nEndID );
 
     bool WriteCharColor(const css::uno::Reference<css::beans::XPropertySet>& 
xPropertySet);
-    bool WriteFillColor(const css::uno::Reference<css::beans::XPropertySet>& 
xPropertySet);
+    bool WriteSchemeColor(OUString const& rPropertyName, const 
css::uno::Reference<css::beans::XPropertySet>& xPropertySet);
 
     void WriteSolidFill( ::Color nColor, sal_Int32 nAlpha = MAX_PERCENT );
     void WriteSolidFill( const OUString& sSchemeName, const 
css::uno::Sequence< css::beans::PropertyValue >& aTransformations, sal_Int32 
nAlpha = MAX_PERCENT );
diff --git a/include/svx/unoshprp.hxx b/include/svx/unoshprp.hxx
index fec53929fb80..357655c5e71a 100644
--- a/include/svx/unoshprp.hxx
+++ b/include/svx/unoshprp.hxx
@@ -236,6 +236,7 @@
 #define LINE_PROPERTIES_DEFAULTS\
     { u"" UNO_NAME_LINECAP,           XATTR_LINECAP,          
::cppu::UnoType<css::drawing::LineCap>::get(),     0,     0}, \
     { u"" UNO_NAME_LINECOLOR,         XATTR_LINECOLOR,        
::cppu::UnoType<sal_Int32>::get() ,           0,     0}, \
+    { u"" UNO_NAME_LINECOLOR_THEME_REFERENCE, XATTR_LINECOLOR, 
::cppu::UnoType<css::uno::XInterface>::get() ,           0, 
MID_COLOR_THEME_REFERENCE}, \
     { u"" UNO_NAME_LINEENDCENTER,     XATTR_LINEENDCENTER,    
cppu::UnoType<bool>::get() ,           0,     0}, \
     { u"" UNO_NAME_LINEENDWIDTH,      XATTR_LINEENDWIDTH,     
::cppu::UnoType<sal_Int32>::get() ,           0,     0, 
PropertyMoreFlags::METRIC_ITEM}, \
     { u"" UNO_NAME_LINEJOINT,         XATTR_LINEJOINT,        
::cppu::UnoType<css::drawing::LineJoint>::get(),     0,     0}, \
diff --git a/oox/inc/drawingml/lineproperties.hxx 
b/oox/inc/drawingml/lineproperties.hxx
index 214aadba12e9..d2025515b67e 100644
--- a/oox/inc/drawingml/lineproperties.hxx
+++ b/oox/inc/drawingml/lineproperties.hxx
@@ -69,7 +69,8 @@ struct LineProperties
     void                pushToPropMap(
                             ShapePropertyMap& rPropMap,
                             const GraphicHelper& rGraphicHelper,
-                            ::Color nPhClr = API_RGB_TRANSPARENT ) const;
+                            ::Color nPhClr = API_RGB_TRANSPARENT,
+                            sal_Int16 nPhClrTheme = -1) const;
 
     /** Calculates the line style attribute from the internal state of the 
object */
     css::drawing::LineStyle  getLineStyle() const;
diff --git a/oox/qa/unit/data/ThemeShapesReference.pptx 
b/oox/qa/unit/data/ThemeShapesReference.pptx
new file mode 100644
index 000000000000..d871cc56a099
Binary files /dev/null and b/oox/qa/unit/data/ThemeShapesReference.pptx differ
diff --git a/oox/qa/unit/drawingml.cxx b/oox/qa/unit/drawingml.cxx
index 077ad261e620..db9db658ac48 100644
--- a/oox/qa/unit/drawingml.cxx
+++ b/oox/qa/unit/drawingml.cxx
@@ -509,7 +509,7 @@ CPPUNIT_TEST_FIXTURE(OoxDrawingmlTest, 
testTdf132557_footerCustomShapes)
                          xShapeSlideNum->getShapeType());
 }
 
-CPPUNIT_TEST_FIXTURE(OoxDrawingmlTest, testThemeTint)
+CPPUNIT_TEST_FIXTURE(OoxDrawingmlTest, testThemeColorTint_Table)
 {
     // Given a document with a table style, using theme color with tinting in 
the A2 cell:
     OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + 
"theme-tint.pptx";
@@ -557,6 +557,76 @@ CPPUNIT_TEST_FIXTURE(OoxDrawingmlTest, testThemeTint)
     }
 }
 
+CPPUNIT_TEST_FIXTURE(OoxDrawingmlTest, testThemeColor_Shape)
+{
+    // Given a document with a table style, using theme color with tinting in 
the A2 cell:
+    OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + 
"ThemeShapesReference.pptx";
+    load(aURL);
+
+    // Then make sure that we only import theming info to the doc model if the 
effects are limited
+    // to lum mod / off that we can handle (i.e. no tint/shade):
+    uno::Reference<drawing::XDrawPagesSupplier> 
xDrawPagesSupplier(getComponent(), uno::UNO_QUERY);
+    uno::Reference<drawing::XDrawPage> 
xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
+                                                 uno::UNO_QUERY);
+
+    // check line and fill theme color of shape1
+    {
+        model::ThemeColor aThemeColor;
+        uno::Reference<util::XThemeColor> xThemeColor;
+        uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(0), 
uno::UNO_QUERY);
+
+        CPPUNIT_ASSERT(xShape->getPropertyValue("FillColorThemeReference") >>= 
xThemeColor);
+        CPPUNIT_ASSERT(xThemeColor.is());
+        model::theme::setFromXThemeColor(aThemeColor, xThemeColor);
+        CPPUNIT_ASSERT_EQUAL(model::ThemeColorType::Accent6, 
aThemeColor.getType());
+        {
+            auto const& rTrans = aThemeColor.getTransformations();
+            CPPUNIT_ASSERT_EQUAL(size_t(2), rTrans.size());
+            CPPUNIT_ASSERT_EQUAL(model::TransformationType::LumMod, 
rTrans[0].meType);
+            CPPUNIT_ASSERT_EQUAL(sal_Int16(4000), rTrans[0].mnValue);
+            CPPUNIT_ASSERT_EQUAL(model::TransformationType::LumOff, 
rTrans[1].meType);
+            CPPUNIT_ASSERT_EQUAL(sal_Int16(6000), rTrans[1].mnValue);
+        }
+
+        CPPUNIT_ASSERT(xShape->getPropertyValue("LineColorThemeReference") >>= 
xThemeColor);
+        CPPUNIT_ASSERT(xThemeColor.is());
+        model::theme::setFromXThemeColor(aThemeColor, xThemeColor);
+        CPPUNIT_ASSERT_EQUAL(model::ThemeColorType::Accent6, 
aThemeColor.getType());
+        {
+            auto const& rTrans = aThemeColor.getTransformations();
+            CPPUNIT_ASSERT_EQUAL(size_t(1), rTrans.size());
+            CPPUNIT_ASSERT_EQUAL(model::TransformationType::LumMod, 
rTrans[0].meType);
+            CPPUNIT_ASSERT_EQUAL(sal_Int16(5000), rTrans[0].mnValue);
+        }
+    }
+    // check line and fill theme color of shape2
+    {
+        model::ThemeColor aThemeColor;
+        uno::Reference<util::XThemeColor> xThemeColor;
+        uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(1), 
uno::UNO_QUERY);
+
+        CPPUNIT_ASSERT(xShape->getPropertyValue("FillColorThemeReference") >>= 
xThemeColor);
+        CPPUNIT_ASSERT(xThemeColor.is());
+        model::theme::setFromXThemeColor(aThemeColor, xThemeColor);
+        CPPUNIT_ASSERT_EQUAL(model::ThemeColorType::Accent1, 
aThemeColor.getType());
+        {
+            auto const& rTrans = aThemeColor.getTransformations();
+            CPPUNIT_ASSERT_EQUAL(size_t(0), rTrans.size());
+        }
+
+        CPPUNIT_ASSERT(xShape->getPropertyValue("LineColorThemeReference") >>= 
xThemeColor);
+        CPPUNIT_ASSERT(xThemeColor.is());
+        model::theme::setFromXThemeColor(aThemeColor, xThemeColor);
+        CPPUNIT_ASSERT_EQUAL(model::ThemeColorType::Accent1, 
aThemeColor.getType());
+        {
+            auto const& rTrans = aThemeColor.getTransformations();
+            CPPUNIT_ASSERT_EQUAL(size_t(1), rTrans.size());
+            CPPUNIT_ASSERT_EQUAL(model::TransformationType::LumMod, 
rTrans[0].meType);
+            CPPUNIT_ASSERT_EQUAL(sal_Int16(7500), rTrans[0].mnValue);
+        }
+    }
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/oox/source/drawingml/lineproperties.cxx 
b/oox/source/drawingml/lineproperties.cxx
index dedde505e61a..0c4100bcd91c 100644
--- a/oox/source/drawingml/lineproperties.cxx
+++ b/oox/source/drawingml/lineproperties.cxx
@@ -34,6 +34,9 @@
 #include <oox/helper/containerhelper.hxx>
 #include <oox/helper/graphichelper.hxx>
 #include <oox/token/tokens.hxx>
+#include <oox/token/properties.hxx>
+#include <docmodel/uno/UnoThemeColor.hxx>
+
 
 using namespace ::com::sun::star;
 using namespace ::com::sun::star::beans;
@@ -431,7 +434,7 @@ void LineProperties::assignUsed( const LineProperties& 
rSourceProps )
 }
 
 void LineProperties::pushToPropMap( ShapePropertyMap& rPropMap,
-        const GraphicHelper& rGraphicHelper, ::Color nPhClr ) const
+        const GraphicHelper& rGraphicHelper, ::Color nPhClr, sal_Int16 
nPhClrTheme) const
 {
     // line fill type must exist, otherwise ignore other properties
     if( !maLineFill.moFillType.has() )
@@ -491,11 +494,36 @@ void LineProperties::pushToPropMap( ShapePropertyMap& 
rPropMap,
 
     // line color and transparence
     Color aLineColor = maLineFill.getBestSolidColor();
-    if( aLineColor.isUsed() )
+    if (aLineColor.isUsed())
     {
-        rPropMap.setProperty( ShapeProperty::LineColor, aLineColor.getColor( 
rGraphicHelper, nPhClr ) );
+        ::Color aColor = aLineColor.getColor(rGraphicHelper, nPhClr);
+        rPropMap.setProperty(ShapeProperty::LineColor, aColor);
         if( aLineColor.hasTransparency() )
             rPropMap.setProperty( ShapeProperty::LineTransparency, 
aLineColor.getTransparency() );
+
+        model::ThemeColor aThemeColor;
+
+        if (aColor == nPhClr)
+        {
+            aThemeColor.setType(model::convertToThemeColorType(nPhClrTheme));
+            rPropMap.setProperty(PROP_LineColorThemeReference, 
model::theme::createXThemeColor(aThemeColor));
+        }
+        else
+        {
+            
aThemeColor.setType(model::convertToThemeColorType(aLineColor.getSchemeColorIndex()));
+            if (aLineColor.getLumMod() != 10000)
+                
aThemeColor.addTransformation({model::TransformationType::LumMod, 
aLineColor.getLumMod()});
+            if (aLineColor.getLumOff() != 0)
+                
aThemeColor.addTransformation({model::TransformationType::LumOff, 
aLineColor.getLumOff()});
+            if (aLineColor.getTintOrShade() > 0)
+                
aThemeColor.addTransformation({model::TransformationType::Tint, 
aLineColor.getTintOrShade()});
+            if (aLineColor.getTintOrShade() < 0)
+            {
+                sal_Int16 nShade = 
o3tl::narrowing<sal_Int16>(-aLineColor.getTintOrShade());
+                
aThemeColor.addTransformation({model::TransformationType::Shade, nShade});
+            }
+            rPropMap.setProperty(PROP_LineColorThemeReference, 
model::theme::createXThemeColor(aThemeColor));
+        }
     }
 
     // line markers
diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx
index 2343f8b3b027..c1af364f85ac 100644
--- a/oox/source/drawingml/shape.cxx
+++ b/oox/source/drawingml/shape.cxx
@@ -1058,6 +1058,7 @@ Reference< XShape > const & Shape::createAndInsert(
         ::Color nLinePhClr(ColorTransparency, 0xffffffff);
         ::Color nFillPhClr(ColorTransparency, 0xffffffff);
         sal_Int16 nFillPhClrTheme = -1;
+        sal_Int16 nLinePhClrTheme = -1;
         // TODO: use ph color when applying effect properties
         //sal_Int32 nEffectPhClr = -1;
 
@@ -1074,6 +1075,7 @@ Reference< XShape > const & Shape::createAndInsert(
                 if( const LineProperties* pLineProps = pTheme->getLineStyle( 
pLineRef->mnThemedIdx ) )
                     aLineProperties.assignUsed( *pLineProps );
                 nLinePhClr = pLineRef->maPhClr.getColor( rGraphicHelper );
+                nLinePhClrTheme = pLineRef->maPhClr.getSchemeColorIndex();
 
                 // Store style-related properties to InteropGrabBag to be able 
to export them back
                 uno::Sequence<beans::PropertyValue> aProperties = 
comphelper::InitPropertySequence(
@@ -1166,7 +1168,7 @@ Reference< XShape > const & Shape::createAndInsert(
         if(!bIsCroppedGraphic)
             aFillProperties.pushToPropMap( aShapeProps, rGraphicHelper, 
mnRotation, nFillPhClr, nFillPhClrTheme, mbFlipH, mbFlipV, bIsCustomShape );
         LineProperties aLineProperties = getActualLineProperties(pTheme);
-        aLineProperties.pushToPropMap( aShapeProps, rGraphicHelper, nLinePhClr 
);
+        aLineProperties.pushToPropMap( aShapeProps, rGraphicHelper, 
nLinePhClr, nLinePhClrTheme);
         EffectProperties aEffectProperties = getActualEffectProperties(pTheme);
         // TODO: use ph color when applying effect properties
         aEffectProperties.pushToPropMap( aShapeProps, rGraphicHelper );
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index 0db7abf2c8ef..da43043bd9c5 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -418,49 +418,6 @@ void DrawingML::WriteColorTransformations( const Sequence< 
PropertyValue >& aTra
     }
 }
 
-bool DrawingML::WriteCharColor(const 
css::uno::Reference<css::beans::XPropertySet>& xPropertySet)
-{
-    if 
(!xPropertySet->getPropertySetInfo()->hasPropertyByName("CharColorThemeReference"))
-        return false;
-
-    uno::Reference<util::XThemeColor> xThemeColor;
-    xPropertySet->getPropertyValue("CharColorThemeReference") >>= xThemeColor;
-    if (!xThemeColor.is())
-        return false;
-
-    model::ThemeColor aThemeColor;
-    model::theme::setFromXThemeColor(aThemeColor, xThemeColor);
-    if (aThemeColor.getType() == model::ThemeColorType::Unknown)
-        return false;
-    const char* pColorName = 
g_aPredefinedClrNames[sal_Int16(aThemeColor.getType())];
-    mpFS->startElementNS(XML_a, XML_solidFill);
-    mpFS->startElementNS(XML_a, XML_schemeClr, XML_val, pColorName);
-    for (auto const& rTransform : aThemeColor.getTransformations())
-    {
-        switch (rTransform.meType)
-        {
-            case model::TransformationType::LumMod:
-                mpFS->singleElementNS(XML_a, XML_lumMod, XML_val, 
OString::number(rTransform.mnValue * 10));
-                break;
-            case model::TransformationType::LumOff:
-                mpFS->singleElementNS(XML_a, XML_lumOff, XML_val, 
OString::number(rTransform.mnValue * 10));
-                break;
-            case model::TransformationType::Tint:
-                mpFS->singleElementNS(XML_a, XML_tint, XML_val, 
OString::number(rTransform.mnValue * 10));
-                break;
-            case model::TransformationType::Shade:
-                mpFS->singleElementNS(XML_a, XML_shade, XML_val, 
OString::number(rTransform.mnValue * 10));
-                break;
-            default:
-                break;
-        }
-    }
-    mpFS->endElementNS(XML_a, XML_schemeClr);
-    mpFS->endElementNS(XML_a, XML_solidFill);
-
-    return true;
-}
-
 void DrawingML::WriteSolidFill( ::Color nColor, sal_Int32 nAlpha )
 {
     mpFS->startElementNS(XML_a, XML_solidFill);
@@ -553,7 +510,7 @@ void DrawingML::WriteSolidFill( const Reference< 
XPropertySet >& rXPropSet )
     else if ( nFillColor != nOriginalColor )
     {
         // the user has set a different color for the shape
-        if (!WriteFillColor(rXPropSet))
+        if (!WriteSchemeColor(u"FillColorThemeReference", rXPropSet))
         {
             WriteSolidFill(::Color(ColorTransparency, nFillColor & 0xffffff), 
nAlpha);
         }
@@ -571,13 +528,13 @@ void DrawingML::WriteSolidFill( const Reference< 
XPropertySet >& rXPropSet )
     }
 }
 
-bool DrawingML::WriteFillColor(const uno::Reference<beans::XPropertySet>& 
xPropertySet)
+bool DrawingML::WriteSchemeColor(OUString const& rPropertyName, const 
uno::Reference<beans::XPropertySet>& xPropertySet)
 {
-    if 
(!xPropertySet->getPropertySetInfo()->hasPropertyByName("FillColorThemeReference"))
+    if (!xPropertySet->getPropertySetInfo()->hasPropertyByName(rPropertyName))
         return false;
 
     uno::Reference<util::XThemeColor> xThemeColor;
-    xPropertySet->getPropertyValue("FillColorThemeReference") >>= xThemeColor;
+    xPropertySet->getPropertyValue(rPropertyName) >>= xThemeColor;
     if (!xThemeColor.is())
         return false;
 
@@ -598,6 +555,12 @@ bool DrawingML::WriteFillColor(const 
uno::Reference<beans::XPropertySet>& xPrope
             case model::TransformationType::LumOff:
                 mpFS->singleElementNS(XML_a, XML_lumOff, XML_val, 
OString::number(rTransform.mnValue * 10));
                 break;
+            case model::TransformationType::Tint:
+                mpFS->singleElementNS(XML_a, XML_tint, XML_val, 
OString::number(rTransform.mnValue * 10));
+                break;
+            case model::TransformationType::Shade:
+                mpFS->singleElementNS(XML_a, XML_shade, XML_val, 
OString::number(rTransform.mnValue * 10));
+                break;
             default:
                 break;
         }
@@ -1058,7 +1021,8 @@ void DrawingML::WriteOutline( const 
Reference<XPropertySet>& rXPropSet, Referenc
         if( nColor != nOriginalColor )
         {
             // the user has set a different color for the line
-            WriteSolidFill( nColor, nColorAlpha );
+            if (!WriteSchemeColor(u"LineColorThemeReference", rXPropSet))
+                    WriteSolidFill(nColor, nColorAlpha);
         }
         else if( !sColorFillScheme.isEmpty() )
         {
@@ -2260,7 +2224,7 @@ void DrawingML::WriteRunProperties( const Reference< 
XPropertySet >& rRun, bool
             {
                 color.SetAlpha(255);
                 // TODO: special handle embossed/engraved
-                if (!WriteCharColor(rXPropSet))
+                if (!WriteSchemeColor(u"CharColorThemeReference", rXPropSet))
                 {
                     WriteSolidFill(color, nTransparency);
                 }
diff --git a/oox/source/token/properties.txt b/oox/source/token/properties.txt
index 7b504bd529bf..e31885499992 100644
--- a/oox/source/token/properties.txt
+++ b/oox/source/token/properties.txt
@@ -315,6 +315,7 @@ LeftPageHeaderContent
 LegacyFragment
 LineCap
 LineColor
+LineColorThemeReference
 LineCount
 LineDash
 LineDashName
diff --git a/sd/source/core/stlsheet.cxx b/sd/source/core/stlsheet.cxx
index 19f62ffd3140..cb1de01f1659 100644
--- a/sd/source/core/stlsheet.cxx
+++ b/sd/source/core/stlsheet.cxx
@@ -40,6 +40,7 @@
 
 #include <svx/xflbmtit.hxx>
 #include <svx/xflbstit.hxx>
+#include <svx/xlnclit.hxx>
 #include <editeng/bulletitem.hxx>
 #include <editeng/lrspitem.hxx>
 #include <svx/unoshprp.hxx>
@@ -1363,6 +1364,15 @@ PropertyState SAL_CALL SdStyleSheet::getPropertyState( 
const OUString& PropertyN
                     }
                 }
                 break;
+            case XATTR_LINECOLOR:
+                if (pEntry->nMemberId == MID_COLOR_THEME_REFERENCE)
+                {
+                    auto const* pColor = 
rStyleSet.GetItem<XLineColorItem>(pEntry->nWID);
+                    if (pColor->GetThemeColor().getType() == 
model::ThemeColorType::Unknown)
+                    {
+                        eState = PropertyState_DEFAULT_VALUE;
+                    }
+                }
                 break;
             }
         }
diff --git a/svx/source/table/cell.cxx b/svx/source/table/cell.cxx
index 89c2113fd4f4..8aef7510e45a 100644
--- a/svx/source/table/cell.cxx
+++ b/svx/source/table/cell.cxx
@@ -55,6 +55,7 @@
 #include <editeng/charrotateitem.hxx>
 #include <svx/xflbstit.hxx>
 #include <svx/xflbmtit.hxx>
+#include <svx/xlnclit.hxx>
 #include <svx/svdpool.hxx>
 #include <svx/xflclit.hxx>
 #include <tools/diagnose_ex.h>
@@ -1444,7 +1445,6 @@ PropertyState SAL_CALL Cell::getPropertyState( const 
OUString& PropertyName )
                     }
                     break;
                 case XATTR_FILLCOLOR:
-
                     if (pMap->nMemberId == MID_COLOR_THEME_INDEX)
                     {
                         const XFillColorItem* pColor = 
rSet.GetItem<XFillColorItem>(pMap->nWID);
@@ -1490,6 +1490,16 @@ PropertyState SAL_CALL Cell::getPropertyState( const 
OUString& PropertyName )
                         }
                     }
                     break;
+                case XATTR_LINECOLOR:
+                    if (pMap->nMemberId == MID_COLOR_THEME_REFERENCE)
+                    {
+                        auto const* pColor = 
rSet.GetItem<XLineColorItem>(pMap->nWID);
+                        if (pColor->GetThemeColor().getType() == 
model::ThemeColorType::Unknown)
+                        {
+                            eState = PropertyState_DEFAULT_VALUE;
+                        }
+                    }
+                    break;
                 }
             }
         }
diff --git a/svx/source/unodraw/unoshape.cxx b/svx/source/unodraw/unoshape.cxx
index 1f02b0c97c31..5cc292621bfa 100644
--- a/svx/source/unodraw/unoshape.cxx
+++ b/svx/source/unodraw/unoshape.cxx
@@ -42,6 +42,7 @@
 #include <svx/xflbmtit.hxx>
 #include <svx/xlnstit.hxx>
 #include <svx/xlnedit.hxx>
+#include <svx/xlnclit.hxx>
 #include <svx/svdmodel.hxx>
 #include <svx/svdobjkind.hxx>
 #include <svx/unopage.hxx>
@@ -2086,6 +2087,15 @@ beans::PropertyState SvxShape::_getPropertyState( const 
OUString& PropertyName )
                     }
                 }
                 break;
+            case XATTR_LINECOLOR:
+                if (pMap->nMemberId == MID_COLOR_THEME_REFERENCE)
+                {
+                    auto const* pColor = 
rSet.GetItem<XLineColorItem>(pMap->nWID);
+                    if (pColor->GetThemeColor().getType() == 
model::ThemeColorType::Unknown)
+                    {
+                        eState = beans::PropertyState_DEFAULT_VALUE;
+                    }
+                }
                 break;
             }
         }
diff --git a/svx/source/xoutdev/xattr.cxx b/svx/source/xoutdev/xattr.cxx
index d5da15155815..608829503d16 100644
--- a/svx/source/xoutdev/xattr.cxx
+++ b/svx/source/xoutdev/xattr.cxx
@@ -990,19 +990,49 @@ bool XLineColorItem::GetPresentation
     return true;
 }
 
-bool XLineColorItem::QueryValue( css::uno::Any& rVal, sal_uInt8 /*nMemberId*/) 
const
+bool XLineColorItem::QueryValue( css::uno::Any& rVal, sal_uInt8 nMemberId) 
const
 {
-    rVal <<= GetColorValue().GetRGBColor();
+    nMemberId &= ~CONVERT_TWIPS;
+    switch (nMemberId)
+    {
+        case MID_COLOR_THEME_REFERENCE:
+        {
+            auto xThemeColor = 
model::theme::createXThemeColor(GetThemeColor());
+            rVal <<= xThemeColor;
+            break;
+        }
+        default:
+        {
+            rVal <<= GetColorValue().GetRGBColor();
+            break;
+        }
+    }
     return true;
 }
 
-bool XLineColorItem::PutValue( const css::uno::Any& rVal, sal_uInt8 
/*nMemberId*/)
+bool XLineColorItem::PutValue( const css::uno::Any& rVal, sal_uInt8 nMemberId)
 {
-    sal_Int32 nValue = 0;
-    if(!(rVal >>= nValue))
-        return false;
+    nMemberId &= ~CONVERT_TWIPS;
+    switch(nMemberId)
+    {
+        case MID_COLOR_THEME_REFERENCE:
+        {
+            css::uno::Reference<css::util::XThemeColor> xThemeColor;
+            if (!(rVal >>= xThemeColor))
+                return false;
+            model::theme::setFromXThemeColor(GetThemeColor(), xThemeColor);
+        }
+        break;
+        default:
+        {
+            sal_Int32 nValue;
+            if(!(rVal >>= nValue ))
+                return false;
 
-    SetColorValue( Color(ColorTransparency, nValue) );
+            SetColorValue( Color(ColorTransparency, nValue) );
+            break;
+        }
+    }
     return true;
 }
 

Reply via email to