[Libreoffice-commits] core.git: Branch 'feature/themesupport2' - 5 commits - editeng/source include/editeng include/oox include/sfx2 include/svx oox/source sfx2/Library_sfx.mk sfx2/source svx/Library_svxcore.mk svx/source sw/source

Sarper Akdemir (via logerrit) logerrit at kemper.freedesktop.org
Wed Aug 25 20:22:10 UTC 2021


Rebased ref, commits from common ancestor:
commit de40c940c3a94588d44a3d1f6d8cd4191cca4f73
Author:     Sarper Akdemir <sarper.akdemir at collabora.com>
AuthorDate: Wed Aug 25 02:24:42 2021 +0300
Commit:     Sarper Akdemir <sarper.akdemir at collabora.com>
CommitDate: Wed Aug 25 17:06:36 2021 +0300

    implement color tint or shade import for pptx
    
    Change-Id: I38661afecec6d769bd41b8c3b71c9a4de5e69440

diff --git a/include/oox/drawingml/color.hxx b/include/oox/drawingml/color.hxx
index 00473cfe6f27..bd67982c6e92 100644
--- a/include/oox/drawingml/color.hxx
+++ b/include/oox/drawingml/color.hxx
@@ -99,6 +99,7 @@ public:
     /** Returns the scheme name from the a:schemeClr element for interoperability purposes */
     const OUString&     getSchemeColorName() const { return msSchemeName; }
     sal_Int16           getSchemeColorIndex() const;
+    sal_Int16           getTintOrShade();
 
     /** Returns the unaltered list of transformations for interoperability purposes */
     const css::uno::Sequence< css::beans::PropertyValue >& getTransformations() const { return maInteropTransformations;}
diff --git a/oox/source/drawingml/color.cxx b/oox/source/drawingml/color.cxx
index edb317eaac3d..1c1e9f7a110a 100644
--- a/oox/source/drawingml/color.cxx
+++ b/oox/source/drawingml/color.cxx
@@ -478,6 +478,22 @@ void Color::clearTransparence()
     mnAlpha = MAX_PERCENT;
 }
 
+sal_Int16 Color::getTintOrShade()
+{
+    for(auto const& aTransform : maTransforms)
+    {
+        switch(aTransform.mnToken)
+        {
+            case XML_tint:
+                // from 1000th percent to 100th percent...
+                return aTransform.mnValue/10;
+            case XML_shade:
+                // from 1000th percent to 100th percent...
+                return -aTransform.mnValue/10;
+        }
+    }
+    return 0;
+}
 ::Color Color::getColor( const GraphicHelper& rGraphicHelper, ::Color nPhClr ) const
 {
     const sal_Int32 nTempC1 = mnC1;
diff --git a/oox/source/drawingml/textcharacterproperties.cxx b/oox/source/drawingml/textcharacterproperties.cxx
index 90b0e38c1d3a..bd4d051a490b 100644
--- a/oox/source/drawingml/textcharacterproperties.cxx
+++ b/oox/source/drawingml/textcharacterproperties.cxx
@@ -113,6 +113,7 @@ void TextCharacterProperties::pushToPropMap( PropertyMap& rPropMap, const XmlFil
         rPropMap.setProperty(PROP_CharColor, aColor.getColor(rFilter.getGraphicHelper()));
         // set color theme index
         rPropMap.setProperty(PROP_CharColorTheme, aColor.getSchemeColorIndex());
+        rPropMap.setProperty(PROP_CharColorTintOrShade, aColor.getTintOrShade());
 
         if (aColor.hasTransparency())
         {
commit aef22c3bbf1b4bb8ab9ba2bccb7005e0d0c75cb3
Author:     Sarper Akdemir <sarper.akdemir at collabora.com>
AuthorDate: Tue Aug 24 23:58:35 2021 +0300
Commit:     Sarper Akdemir <sarper.akdemir at collabora.com>
CommitDate: Wed Aug 25 17:06:36 2021 +0300

    rename getSchemeName getSchemeIndex to remove ambiguity
    
    Change-Id: Ib1fa16b15c219b38754ffe5cbfc9d11ff2be0fcd

diff --git a/include/oox/drawingml/color.hxx b/include/oox/drawingml/color.hxx
index f213dba9a973..00473cfe6f27 100644
--- a/include/oox/drawingml/color.hxx
+++ b/include/oox/drawingml/color.hxx
@@ -97,8 +97,8 @@ public:
     sal_Int16           getTransparency() const;
 
     /** Returns the scheme name from the a:schemeClr element for interoperability purposes */
-    const OUString&     getSchemeName() const { return msSchemeName; }
-    sal_Int16           getSchemeIndex() const;
+    const OUString&     getSchemeColorName() const { return msSchemeName; }
+    sal_Int16           getSchemeColorIndex() const;
 
     /** Returns the unaltered list of transformations for interoperability purposes */
     const css::uno::Sequence< css::beans::PropertyValue >& getTransformations() const { return maInteropTransformations;}
diff --git a/oox/source/drawingml/color.cxx b/oox/source/drawingml/color.cxx
index 5d3ea6cb8708..edb317eaac3d 100644
--- a/oox/source/drawingml/color.cxx
+++ b/oox/source/drawingml/color.cxx
@@ -660,7 +660,7 @@ sal_Int16 Color::getTransparency() const
     return sal_Int16(std::round( (1.0 * (MAX_PERCENT - mnAlpha)) / PER_PERCENT) );
 }
 
-sal_Int16 Color::getSchemeIndex() const
+sal_Int16 Color::getSchemeColorIndex() const
 {
     static std::map<OUString, sal_Int32> const aSchemeColorNameToIndex{
         { "dk1", 0 },     { "lt1", 1 },     { "dk2", 2 },     { "lt2", 3 },
diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx
index b0e2ddef30e7..78a482abd446 100644
--- a/oox/source/drawingml/shape.cxx
+++ b/oox/source/drawingml/shape.cxx
@@ -1060,7 +1060,7 @@ Reference< XShape > const & Shape::createAndInsert(
                 // Store style-related properties to InteropGrabBag to be able to export them back
                 uno::Sequence<beans::PropertyValue> aProperties = comphelper::InitPropertySequence(
                 {
-                    {"SchemeClr", uno::makeAny(pLineRef->maPhClr.getSchemeName())},
+                    {"SchemeClr", uno::makeAny(pLineRef->maPhClr.getSchemeColorName())},
                     {"Idx", uno::makeAny(pLineRef->mnThemedIdx)},
                     {"Color", uno::makeAny(nLinePhClr)},
                     {"LineStyle", uno::makeAny(aLineProperties.getLineStyle())},
@@ -1078,7 +1078,7 @@ Reference< XShape > const & Shape::createAndInsert(
                     nFillPhClr = pFillRef->maPhClr.getColor(rGraphicHelper);
                 }
 
-                OUString sColorScheme = pFillRef->maPhClr.getSchemeName();
+                OUString sColorScheme = pFillRef->maPhClr.getSchemeColorName();
                 if( !sColorScheme.isEmpty() )
                 {
                     uno::Sequence<beans::PropertyValue> aProperties = comphelper::InitPropertySequence(
@@ -1100,7 +1100,7 @@ Reference< XShape > const & Shape::createAndInsert(
                 // Store style-related properties to InteropGrabBag to be able to export them back
                 uno::Sequence<beans::PropertyValue> aProperties = comphelper::InitPropertySequence(
                 {
-                    {"SchemeClr", uno::makeAny(pEffectRef->maPhClr.getSchemeName())},
+                    {"SchemeClr", uno::makeAny(pEffectRef->maPhClr.getSchemeColorName())},
                     {"Idx", uno::makeAny(pEffectRef->mnThemedIdx)},
                     {"Transformations", uno::makeAny(pEffectRef->maPhClr.getTransformations())}
                 });
@@ -1349,13 +1349,13 @@ Reference< XShape > const & Shape::createAndInsert(
             aProperties.push_back(comphelper::makePropertyValue("EmuLineWidth", aLineProperties.moLineWidth.get(0)));
             aProperties.push_back(comphelper::makePropertyValue("OriginalSolidFillClr", aShapeProps.getProperty(PROP_FillColor)));
             aProperties.push_back(comphelper::makePropertyValue("OriginalLnSolidFillClr", aShapeProps.getProperty(PROP_LineColor)));
-            OUString sColorFillScheme = aFillProperties.maFillColor.getSchemeName();
+            OUString sColorFillScheme = aFillProperties.maFillColor.getSchemeColorName();
             if( !aFillProperties.maFillColor.isPlaceHolder() && !sColorFillScheme.isEmpty() )
             {
                 aProperties.push_back(comphelper::makePropertyValue("SpPrSolidFillSchemeClr", sColorFillScheme));
                 aProperties.push_back(comphelper::makePropertyValue("SpPrSolidFillSchemeClrTransformations", aFillProperties.maFillColor.getTransformations()));
             }
-            OUString sLnColorFillScheme = aLineProperties.maLineFill.maFillColor.getSchemeName();
+            OUString sLnColorFillScheme = aLineProperties.maLineFill.maFillColor.getSchemeColorName();
             if( !aLineProperties.maLineFill.maFillColor.isPlaceHolder() && !sLnColorFillScheme.isEmpty() )
             {
                 aProperties.push_back(comphelper::makePropertyValue("SpPrLnSolidFillSchemeClr", sLnColorFillScheme));
@@ -1379,7 +1379,7 @@ Reference< XShape > const & Shape::createAndInsert(
                     std::vector<beans::PropertyValue> aGradientStop;
                     aGradientStop.push_back(comphelper::makePropertyValue("Pos", rPos));
 
-                    OUString sStopColorScheme = rColor.getSchemeName();
+                    OUString sStopColorScheme = rColor.getSchemeColorName();
                     if( sStopColorScheme.isEmpty() )
                     {
                         // save RGB color
@@ -1422,7 +1422,7 @@ Reference< XShape > const & Shape::createAndInsert(
                         aEffectsGrabBag.push_back(comphelper::makePropertyValue("Attribs", aEffect.Value));
 
                         Color& aColor( it->moColor );
-                        OUString sColorScheme = aColor.getSchemeName();
+                        OUString sColorScheme = aColor.getSchemeColorName();
                         if( sColorScheme.isEmpty() )
                         {
                             // RGB color and transparency value
diff --git a/oox/source/drawingml/shape3dproperties.cxx b/oox/source/drawingml/shape3dproperties.cxx
index 18f53a7e309f..c4e03ddc9390 100644
--- a/oox/source/drawingml/shape3dproperties.cxx
+++ b/oox/source/drawingml/shape3dproperties.cxx
@@ -312,7 +312,7 @@ css::uno::Sequence< css::beans::PropertyValue > Generic3DProperties::getColorAtt
         const Color& rColor, const GraphicHelper& rGraphicHelper, ::Color rPhClr )
 {
     css::uno::Sequence<css::beans::PropertyValue> aSeq(2);
-    const OUString& sColorScheme = rColor.getSchemeName();
+    const OUString& sColorScheme = rColor.getSchemeColorName();
     if( sColorScheme.isEmpty() )
     {
         // RGB color and transparency value
diff --git a/oox/source/drawingml/textcharacterproperties.cxx b/oox/source/drawingml/textcharacterproperties.cxx
index 9cbc331d05fa..90b0e38c1d3a 100644
--- a/oox/source/drawingml/textcharacterproperties.cxx
+++ b/oox/source/drawingml/textcharacterproperties.cxx
@@ -112,7 +112,7 @@ void TextCharacterProperties::pushToPropMap( PropertyMap& rPropMap, const XmlFil
         Color aColor = maFillProperties.getBestSolidColor();
         rPropMap.setProperty(PROP_CharColor, aColor.getColor(rFilter.getGraphicHelper()));
         // set color theme index
-        rPropMap.setProperty(PROP_CharColorTheme, aColor.getSchemeIndex());
+        rPropMap.setProperty(PROP_CharColorTheme, aColor.getSchemeColorIndex());
 
         if (aColor.hasTransparency())
         {
commit ec68ca0b5fb6773f42600f6a5825b4794cdb0990
Author:     Sarper Akdemir <sarper.akdemir at collabora.com>
AuthorDate: Fri Aug 20 00:45:55 2021 +0300
Commit:     Sarper Akdemir <sarper.akdemir at collabora.com>
CommitDate: Wed Aug 25 17:06:36 2021 +0300

    implement initial pptx theme color import
    
    Change-Id: Ic3a46c2d01c8f8be73f22d2af41aa11a9bb3267d

diff --git a/include/oox/drawingml/color.hxx b/include/oox/drawingml/color.hxx
index 59f417cfac52..f213dba9a973 100644
--- a/include/oox/drawingml/color.hxx
+++ b/include/oox/drawingml/color.hxx
@@ -98,6 +98,8 @@ public:
 
     /** Returns the scheme name from the a:schemeClr element for interoperability purposes */
     const OUString&     getSchemeName() const { return msSchemeName; }
+    sal_Int16           getSchemeIndex() const;
+
     /** Returns the unaltered list of transformations for interoperability purposes */
     const css::uno::Sequence< css::beans::PropertyValue >& getTransformations() const { return maInteropTransformations;}
 
diff --git a/oox/source/drawingml/color.cxx b/oox/source/drawingml/color.cxx
index 1cd5d2ebaed7..5d3ea6cb8708 100644
--- a/oox/source/drawingml/color.cxx
+++ b/oox/source/drawingml/color.cxx
@@ -660,6 +660,21 @@ sal_Int16 Color::getTransparency() const
     return sal_Int16(std::round( (1.0 * (MAX_PERCENT - mnAlpha)) / PER_PERCENT) );
 }
 
+sal_Int16 Color::getSchemeIndex() const
+{
+    static std::map<OUString, sal_Int32> const aSchemeColorNameToIndex{
+        { "dk1", 0 },     { "lt1", 1 },     { "dk2", 2 },     { "lt2", 3 },
+        { "accent1", 4 }, { "accent2", 5 }, { "accent3", 6 }, { "accent4", 7 },
+        { "accent5", 8 }, { "accent6", 9 }, { "hlink", 10 },  { "folHlink", 11 }
+    };
+
+    auto aIt = aSchemeColorNameToIndex.find(msSchemeName);
+    if( aIt == aSchemeColorNameToIndex.end() )
+        return -1;
+    else
+        return aIt->second;
+}
+
 // private --------------------------------------------------------------------
 
 void Color::setResolvedRgb( ::Color nRgb ) const
diff --git a/oox/source/drawingml/textcharacterproperties.cxx b/oox/source/drawingml/textcharacterproperties.cxx
index 4eb5acaffb56..9cbc331d05fa 100644
--- a/oox/source/drawingml/textcharacterproperties.cxx
+++ b/oox/source/drawingml/textcharacterproperties.cxx
@@ -111,6 +111,8 @@ void TextCharacterProperties::pushToPropMap( PropertyMap& rPropMap, const XmlFil
     {
         Color aColor = maFillProperties.getBestSolidColor();
         rPropMap.setProperty(PROP_CharColor, aColor.getColor(rFilter.getGraphicHelper()));
+        // set color theme index
+        rPropMap.setProperty(PROP_CharColorTheme, aColor.getSchemeIndex());
 
         if (aColor.hasTransparency())
         {
diff --git a/oox/source/token/properties.txt b/oox/source/token/properties.txt
index 68b5e2d14af5..1b20bfe61828 100644
--- a/oox/source/token/properties.txt
+++ b/oox/source/token/properties.txt
@@ -54,6 +54,8 @@ CharBackColor
 CharCaseMap
 CharColor
 CharContoured
+CharColorTheme
+CharColorTintOrShade
 CharEscapement
 CharEscapementHeight
 CharFontCharSet
commit 88b6801ff2aa61ed2f0d64cef94fe6a9c09f3a35
Author:     Sarper Akdemir <sarper.akdemir at collabora.com>
AuthorDate: Wed Aug 18 16:04:37 2021 +0300
Commit:     Sarper Akdemir <sarper.akdemir at collabora.com>
CommitDate: Wed Aug 25 17:06:36 2021 +0300

    expose the SvxColorItem theme related uno for draw/impress
    
    Change-Id: I6d8dc19d5c2418aa61fed507cb2bb5b119d15acd

diff --git a/include/editeng/unoprnms.hxx b/include/editeng/unoprnms.hxx
index c637521dcf2d..3c5011210d51 100644
--- a/include/editeng/unoprnms.hxx
+++ b/include/editeng/unoprnms.hxx
@@ -325,6 +325,8 @@
 #define UNO_NAME_EDIT_CHAR_LOCALE_COMPLEX       "CharLocaleComplex"
 
 #define UNO_NAME_EDIT_CHAR_COLOR                "CharColor"
+#define UNO_NAME_EDIT_CHAR_COLOR_THEME          "CharColorTheme"
+#define UNO_NAME_EDIT_CHAR_COLOR_TINT_OR_SHADE  "CharColorTintOrShade"
 #define UNO_NAME_EDIT_CHAR_TRANSPARENCE         "CharTransparence"
 #define UNO_NAME_EDIT_CHAR_CROSSEDOUT           "CharCrossedOut"
 #define UNO_NAME_EDIT_CHAR_STRIKEOUT            "CharStrikeout"
diff --git a/include/editeng/unotext.hxx b/include/editeng/unotext.hxx
index 0c09b4361edc..896130f6d257 100644
--- a/include/editeng/unotext.hxx
+++ b/include/editeng/unotext.hxx
@@ -85,8 +85,10 @@ struct SfxItemPropertyMapEntry;
     { u"" UNO_NAME_EDIT_CHAR_POSTURE,     EE_CHAR_ITALIC,     ::cppu::UnoType<css::awt::FontSlant>::get(),0, MID_POSTURE }, \
     { u"" UNO_NAME_EDIT_CHAR_WEIGHT,      EE_CHAR_WEIGHT,     cppu::UnoType<float>::get(),            0, MID_WEIGHT }, \
     { u"" UNO_NAME_EDIT_CHAR_LOCALE,      EE_CHAR_LANGUAGE,   ::cppu::UnoType<css::lang::Locale>::get(),0, MID_LANG_LOCALE }, \
-    { u"" UNO_NAME_EDIT_CHAR_COLOR,       EE_CHAR_COLOR,      ::cppu::UnoType<sal_Int32>::get(),        0, 0 }, \
+    { u"" UNO_NAME_EDIT_CHAR_COLOR,       EE_CHAR_COLOR,      ::cppu::UnoType<sal_Int32>::get(),        0, MID_COLOR_RGB }, \
     { u"" UNO_NAME_EDIT_CHAR_TRANSPARENCE,EE_CHAR_COLOR,      ::cppu::UnoType<sal_Int16>::get(),        0, MID_COLOR_ALPHA }, \
+    { u"" UNO_NAME_EDIT_CHAR_COLOR_THEME, EE_CHAR_COLOR,      ::cppu::UnoType<sal_Int16>::get(),        0, MID_COLOR_THEME_INDEX }, \
+    { u"" UNO_NAME_EDIT_CHAR_COLOR_TINT_OR_SHADE, EE_CHAR_COLOR, ::cppu::UnoType<sal_Int16>::get(),     0, MID_COLOR_TINT_OR_SHADE }, \
     { u"CharBackColor",                EE_CHAR_BKGCOLOR,   ::cppu::UnoType<sal_Int32>::get(),        0, 0 }, \
     { u"CharBackTransparent",          EE_CHAR_BKGCOLOR,   ::cppu::UnoType<bool>::get(),             0, MID_GRAPHIC_TRANSPARENT }, \
     { u"" UNO_NAME_EDIT_CHAR_ESCAPEMENT,  EE_CHAR_ESCAPEMENT, ::cppu::UnoType<sal_Int16>::get(),        0, MID_ESC }, \
diff --git a/svx/source/unodraw/unoprov.cxx b/svx/source/unodraw/unoprov.cxx
index e90d980ebd89..f5564ef236d0 100644
--- a/svx/source/unodraw/unoprov.cxx
+++ b/svx/source/unodraw/unoprov.cxx
@@ -578,7 +578,9 @@ static SfxItemPropertyMapEntry const * ImplGetSvxControlShapePropertyMap()
         { u"" UNO_NAME_EDIT_CHAR_UNDERLINE,       0,  cppu::UnoType<sal_Int16>::get(),        0, 0 },
         { u"" UNO_NAME_EDIT_CHAR_STRIKEOUT,       0,  cppu::UnoType<sal_Int16>::get(),        0, 0},
         { u"" UNO_NAME_EDIT_CHAR_CASEMAP,         0,  cppu::UnoType<sal_Int16>::get(),        0, 0 },
-        { u"" UNO_NAME_EDIT_CHAR_COLOR,           0,  cppu::UnoType<sal_Int32>::get(),        0, 0 },
+        { u"" UNO_NAME_EDIT_CHAR_COLOR,           0,  cppu::UnoType<sal_Int32>::get(),        0, MID_COLOR_RGB },
+        { u"" UNO_NAME_EDIT_CHAR_COLOR_THEME,     0,  cppu::UnoType<sal_Int16>::get(),        0, MID_COLOR_THEME_INDEX },
+        { u"" UNO_NAME_EDIT_CHAR_COLOR_TINT_OR_SHADE, 0, cppu::UnoType<sal_Int16>::get(),     0, MID_COLOR_TINT_OR_SHADE },
         { u"CharBackColor",                    0,  cppu::UnoType<sal_Int32>::get(),        0, 0 },
         { u"CharBackTransparent",              0,  cppu::UnoType<bool>::get(),             0, 0 },
         { u"CharRelief",                       0,  cppu::UnoType<sal_Int16>::get(),        0, 0 },
commit 1647d34d8573f4940c0cbb7fb6cd9c6b4e5a4a15
Author:     Sarper Akdemir <sarper.akdemir at collabora.com>
AuthorDate: Wed Jul 28 02:03:12 2021 +0300
Commit:     Sarper Akdemir <sarper.akdemir at collabora.com>
CommitDate: Wed Aug 25 17:06:35 2021 +0300

    make colorsets work outside of styles and with direct formatting
    
    Change-Id: Id3cb073d4567f4dbc70a52bc08403751f4c8ddd4

diff --git a/editeng/source/items/textitem.cxx b/editeng/source/items/textitem.cxx
index ac87db3a2573..11407bb79a31 100644
--- a/editeng/source/items/textitem.cxx
+++ b/editeng/source/items/textitem.cxx
@@ -21,6 +21,7 @@
 #include <com/sun/star/awt/FontDescriptor.hpp>
 #include <com/sun/star/frame/status/FontHeight.hpp>
 #include <math.h>
+#include <optional>
 #include <sal/log.hxx>
 #include <o3tl/safeint.hxx>
 #include <osl/diagnose.h>
@@ -78,6 +79,9 @@
 #include <editeng/eerdll.hxx>
 #include <libxml/xmlwriter.h>
 
+#include <sfx2/sfxsids.hrc>
+#include <sfx2/objsh.hxx>
+
 using namespace ::com::sun::star;
 using namespace ::com::sun::star::text;
 
@@ -1309,20 +1313,103 @@ bool SvxContourItem::GetPresentation
     return true;
 }
 
+// class ThemeColorData
+bool ThemeColorData::operator==(const ThemeColorData &rOther) const
+{
+    // Comparing individual data doesn't make sense if both are not theme colors
+    if(mnThemeColorIndex <= -1 && rOther.mnThemeColorIndex <= -1)
+        return true;
+    else
+        return mnThemeColorIndex == rOther.mnThemeColorIndex
+               && mnTintShade == rOther.mnTintShade;
+}
+
+std::optional<Color> ThemeColorData::getThemeColorIfNeedsUpdate() const
+{
+    if (mnThemeColorIndex > -1)
+    {
+        // try to get the pointer for ColorSets if it's not there...
+        if (!mpColorSets)
+        {
+            if (SfxObjectShell* pObjShell = SfxObjectShell::Current())
+            {
+                if (const SfxColorSetListItem* pColorSetItem = pObjShell->GetItem(SID_COLOR_SETS))
+                {
+                    mpColorSets = &pColorSetItem->GetSfxColorSetList();
+                }
+            }
+        }
+
+        if (mpColorSets)
+        {
+            Color aColor = mpColorSets->getThemeColorSet().getColor(mnThemeColorIndex);
+
+            // only calculate transformations applied color when necessary
+            if(aColor != maCachedBaseColor || mbRecalculateColor)
+            {
+                maCachedBaseColor = aColor;
+                mbRecalculateColor = false;
+                aColor.ApplyTintOrShade(mnTintShade);
+                return aColor;
+            }
+        }
+    }
+
+    // if there's no update needed or the color isn't a theme color return nullopt
+    return std::nullopt;
+}
+
+void ThemeColorData::setTintOrShade(sal_Int16 nTintShade)
+{
+    RecalculateOnNextGet();
+    mnTintShade = nTintShade;
+}
+
+sal_Int16 ThemeColorData::getTintOrShade() const
+{
+    return mnTintShade;
+}
+
+sal_Int16 ThemeColorData::getThemeColorIndex() const
+{
+    return mnThemeColorIndex;
+}
+
+void ThemeColorData::setThemeColorIndex(sal_Int16 nThemeColorIndex)
+{
+    mnThemeColorIndex = nThemeColorIndex;
+}
+
+void ThemeColorData::RecalculateOnNextGet()
+{
+    // There are a few problems with triggerring a recalculate
+    // If we're doing a calculation outside of getThemeColorIfNeedsUpdate()
+    // we have to store the calculated color as a member.
+    // CalculateAndStore()
+
+    // If instead we store a flag that we can check to whether or not recalculate
+    // this will work for every kind of transformation so this might make the most sense.
+    mbRecalculateColor = true;
+
+    // Most memory efficient way of doing this is playing with CachedBaseColor.
+    // which will be wrong if the base color is the same as whatever constant we
+    // set here...
+    // Also pretty unmaintainable in my opinion.
+    // maCachedBaseColor = 0xDEADBEEF;
+}
+
 // class SvxColorItem ----------------------------------------------------
 SvxColorItem::SvxColorItem( const sal_uInt16 nId ) :
     SfxPoolItem(nId),
     mColor( COL_BLACK ),
-    maThemeIndex(-1),
-    maTintShade(0)
+    maThemeColorData()
 {
 }
 
 SvxColorItem::SvxColorItem( const Color& rCol, const sal_uInt16 nId ) :
     SfxPoolItem( nId ),
     mColor( rCol ),
-    maThemeIndex(-1),
-    maTintShade(0)
+    maThemeColorData()
 {
 }
 
@@ -1330,14 +1417,33 @@ SvxColorItem::~SvxColorItem()
 {
 }
 
+sal_Int16 SvxColorItem::GetThemeIndex() const
+{
+    return maThemeColorData.getThemeColorIndex();
+}
+
+void SvxColorItem::SetThemeIndex(sal_Int16 nIndex)
+{
+    maThemeColorData.setThemeColorIndex(nIndex);
+}
+
+sal_Int16 SvxColorItem::GetTintOrShade() const
+{
+    return maThemeColorData.getTintOrShade();
+}
+
+void SvxColorItem::SetTintOrShade(sal_Int16 nTintOrShade)
+{
+    maThemeColorData.setTintOrShade(nTintOrShade);
+}
+
 bool SvxColorItem::operator==( const SfxPoolItem& rAttr ) const
 {
     assert(SfxPoolItem::operator==(rAttr));
     const SvxColorItem& rColorItem = static_cast<const SvxColorItem&>(rAttr);
 
-    return mColor == rColorItem.mColor &&
-           maThemeIndex == rColorItem.maThemeIndex &&
-           maTintShade == rColorItem.maTintShade;
+    return mColor == rColorItem.mColor
+           && maThemeColorData == rColorItem.maThemeColorData;
 }
 
 bool SvxColorItem::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
@@ -1358,12 +1464,12 @@ bool SvxColorItem::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
         }
         case MID_COLOR_THEME_INDEX:
         {
-            rVal <<= maThemeIndex;
+            rVal <<= maThemeColorData.getThemeColorIndex();
             break;
         }
         case MID_COLOR_TINT_OR_SHADE:
         {
-            rVal <<= maTintShade;
+            rVal <<= maThemeColorData.getTintOrShade();
             break;
         }
         default:
@@ -1401,7 +1507,7 @@ bool SvxColorItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
             sal_Int16 nIndex = -1;
             if (!(rVal >>= nIndex))
                 return false;
-            maThemeIndex = nIndex;
+            maThemeColorData.setThemeColorIndex(nIndex);
         }
         break;
         case MID_COLOR_TINT_OR_SHADE:
@@ -1409,7 +1515,7 @@ bool SvxColorItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
             sal_Int16 nTintShade = -1;
             if (!(rVal >>= nTintShade))
                 return false;
-            maTintShade = nTintShade;
+            maThemeColorData.setTintOrShade(nTintShade);
         }
         break;
         default:
@@ -1454,7 +1560,13 @@ void SvxColorItem::dumpAsXml(xmlTextWriterPtr pWriter) const
     (void)xmlTextWriterEndElement(pWriter);
 }
 
+const Color& SvxColorItem::GetValue() const
+{
+    if(auto aOptionalColor = maThemeColorData.getThemeColorIfNeedsUpdate())
+        mColor = aOptionalColor.value();
 
+    return mColor;
+}
 
 void SvxColorItem::SetValue( const Color& rNewCol )
 {
diff --git a/include/editeng/colritem.hxx b/include/editeng/colritem.hxx
index ce51be7f3e30..13444a57541c 100644
--- a/include/editeng/colritem.hxx
+++ b/include/editeng/colritem.hxx
@@ -19,20 +19,75 @@
 #ifndef INCLUDED_EDITENG_COLRITEM_HXX
 #define INCLUDED_EDITENG_COLRITEM_HXX
 
+#include <sfx2/objsh.hxx>
+#include <sfx2/ColorSets.hxx>
 #include <svl/poolitem.hxx>
 #include <tools/color.hxx>
 #include <editeng/editengdllapi.h>
 
+#include <sal/log.hxx>
+
 #define VERSION_USEAUTOCOLOR    1
 
+/** ThemeColorData holds theme color related
+    data of a color item eg. SvxColorItem
+*/
+class ThemeColorData
+{
+public:
+    bool operator==(const ThemeColorData& rOther) const;
+    /** Calculates and returns the theme color from current ThemeColorData
+
+        @returns std::nullopt if color item that owns the ThemeColorData
+                 doesn't need a color update, returns calculated color otherwise.
+
+    */
+    std::optional<Color> getThemeColorIfNeedsUpdate() const;
+    void setTintOrShade(sal_Int16 nTintShade);
+    sal_Int16 getTintOrShade() const;
+    void setThemeColorIndex(sal_Int16 nThemeColorIndex);
+    sal_Int16 getThemeColorIndex() const;
+
+private:
+    void RecalculateOnNextGet();
+    /** Specifies which color of the current theme color set
+        is the base color for this item.
+
+        If it is -1, this item isn't a theme color.
+     */
+    sal_Int16 mnThemeColorIndex = -1;
+    /** Tint or Shade value that will be applied
+        on top of the base color
+     */
+    sal_Int16 mnTintShade = 0;
+    /** Cached base color value used to determine whether
+        a recalculation of theme color is required.
+
+        Mutable since the base color is cached on the getThemeColorIfNeedsUpdate
+    */
+    mutable Color maCachedBaseColor;
+    /** Pointer to the ColorSets of the document.
+
+        Mutable since the correct value initialized on getThemeColorIfNeedsUpdate
+        if it is indeed a theme color
+     */
+    mutable const ColorSets* mpColorSets = nullptr;
+    // mutable since marked as false after recalculation in getThemeColorIfNeedsUpdate
+    mutable bool mbRecalculateColor = true;
+};
+
 /** SvxColorItem item describes a color.
 */
 class EDITENG_DLLPUBLIC SvxColorItem final : public SfxPoolItem
 {
 private:
-    Color mColor;
-    sal_Int16 maThemeIndex;
-    sal_Int16 maTintShade;
+    // Marked mutable since the color gets recalculated on GetValue if
+    // it is a ThemeColor and a recalculation is needed.
+    mutable Color mColor;
+    /** ThemeColorData that is used to calculate and update mColor
+        if color item is a theme color.
+    */
+    ThemeColorData maThemeColorData;
 
 public:
     static SfxPoolItem* CreateDefault();
@@ -53,31 +108,15 @@ public:
     virtual SvxColorItem* Clone(SfxItemPool* pPool = nullptr) const override;
     SvxColorItem(SvxColorItem const &) = default; // SfxPoolItem copy function dichotomy
 
-    const Color& GetValue() const
-    {
-        return mColor;
-    }
+    const Color& GetValue() const;
+
     void SetValue(const Color& rNewColor);
 
-    sal_Int16 GetThemeIndex() const
-    {
-        return maThemeIndex;
-    }
-
-    void SetThemeIndex(sal_Int16 nIndex)
-    {
-        maThemeIndex = nIndex;
-    }
-
-    sal_Int16 GetTintOrShade() const
-    {
-        return maTintShade;
-    }
-
-    void SetTintOrShade(sal_Int16 nTintOrShade)
-    {
-        maTintShade = nTintOrShade;
-    }
+    // Getters and setters for maThemeColorData
+    sal_Int16 GetThemeIndex() const;
+    void SetThemeIndex(sal_Int16 nIndex);
+    sal_Int16 GetTintOrShade() const;
+    void SetTintOrShade(sal_Int16 nTintOrShade);
 
     void dumpAsXml(xmlTextWriterPtr pWriter) const override;
 };
diff --git a/include/sfx2/ColorSets.hxx b/include/sfx2/ColorSets.hxx
new file mode 100644
index 000000000000..ffd3ea4f6ed3
--- /dev/null
+++ b/include/sfx2/ColorSets.hxx
@@ -0,0 +1,88 @@
+/* -*- 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 <vector>
+
+#include <rtl/ustring.hxx>
+#include <sal/types.h>
+#include <sfx2/dllapi.h>
+#include <svl/poolitem.hxx>
+#include <tools/color.hxx>
+
+class ColorSet
+{
+    OUString maColorSetName;
+    std::vector<Color> maColors;
+
+public:
+    ColorSet(OUString const& aName);
+
+    void add(sal_uInt32 nIndex, ::Color aColorData) { maColors[nIndex] = aColorData; }
+
+    const OUString& getName() const { return maColorSetName; }
+    const Color& getColor(sal_uInt32 nIndex) const { return maColors[nIndex]; }
+
+    const std::vector<Color>& getColors() const { return maColors; }
+};
+
+class SFX2_DLLPUBLIC ColorSets
+{
+    std::vector<ColorSet> maColorSets;
+    sal_Int32 mnThemeColorSetIndex;
+
+public:
+    ColorSets();
+    ~ColorSets();
+
+    static ColorSets& get()
+    {
+        static ColorSets aColorSetsInstance;
+        return aColorSetsInstance;
+    }
+
+    const ColorSet& getThemeColorSet() const { return getColorSet(mnThemeColorSetIndex); }
+
+    void setThemeColorSet(sal_Int32 nIndex);
+
+    void setThemeColorSet(std::u16string_view rName);
+
+    const std::vector<ColorSet>& getColorSets() const { return maColorSets; }
+
+    const ColorSet& getColorSet(sal_uInt32 nIndex) const { return maColorSets[nIndex]; }
+
+    const ColorSet& getColorSet(std::u16string_view rName) const;
+};
+
+class SFX2_DLLPUBLIC SfxColorSetListItem final : public SfxPoolItem
+{
+    std::shared_ptr<ColorSets> mpColorSets;
+
+public:
+    static SfxPoolItem* CreateDefault();
+    SfxColorSetListItem();
+    SfxColorSetListItem(const ColorSets& rColorSets, sal_uInt16 nWhich);
+    SfxColorSetListItem(const SfxColorSetListItem&);
+
+    virtual bool GetPresentation(SfxItemPresentation ePres, MapUnit eCoreMetric,
+                                 MapUnit ePresMetric, OUString& rText,
+                                 const IntlWrapper&) const override;
+
+    virtual bool operator==(const SfxPoolItem&) const override;
+    virtual SfxColorSetListItem* Clone(SfxItemPool* pPool = nullptr) const override;
+    virtual bool QueryValue(css::uno::Any& rVal, sal_uInt8 nMemberId = 0) const override;
+    virtual bool PutValue(const css::uno::Any& rVal, sal_uInt8 nMemberId) override;
+
+    const ColorSets& GetSfxColorSetList() const { return *mpColorSets; }
+    std::shared_ptr<ColorSets> GetSfxColorSetListPtr() const { return mpColorSets; }
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/sfx2/sfxsids.hrc b/include/sfx2/sfxsids.hrc
index 35d9ab895856..c2b3a13818bc 100644
--- a/include/sfx2/sfxsids.hrc
+++ b/include/sfx2/sfxsids.hrc
@@ -28,6 +28,7 @@ class SfxUInt16Item;
 class SvxHyperlinkItem;
 class SfxDocumentInfoItem;
 class SvxSearchItem;
+class SfxColorSetListItem;
 
 // Please be careful:
 // Changing just one part here doesn't add new
@@ -362,6 +363,7 @@ class SvxSearchItem;
 #define SID_STYLE_UPD_BY_EX_NAME            (SID_SFX_START + 1585)
 #define SID_STYLE_REFERENCE                 TypedWhichId<SfxStringItem>(SID_SFX_START + 1602)
 
+#define SID_COLOR_SETS                      TypedWhichId<SfxColorSetListItem>(SID_SFX_START + 1605)
 #define SID_TEMPLATE_NAME                   (SID_SFX_START + 660)
 #define SID_TEMPLATE_REGIONNAME             (SID_SFX_START + 662)
 #define SID_TEMPLATE_LOAD                   (SID_SFX_START + 663)
diff --git a/include/svx/ColorSets.hxx b/include/svx/ColorSets.hxx
deleted file mode 100644
index 361fe47c622e..000000000000
--- a/include/svx/ColorSets.hxx
+++ /dev/null
@@ -1,71 +0,0 @@
-/* -*- 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/.
- *
- */
-
-#ifndef INCLUDED_SVX_COLORSETS_HXX
-#define INCLUDED_SVX_COLORSETS_HXX
-
-#include <vector>
-
-#include <rtl/ustring.hxx>
-#include <sal/types.h>
-#include <svx/svxdllapi.h>
-#include <tools/color.hxx>
-
-namespace svx
-{
-
-class ColorSet
-{
-    OUString maColorSetName;
-    std::vector<Color> maColors;
-public:
-    ColorSet(OUString const & aName);
-
-    void add(sal_uInt32 nIndex, ::Color aColorData)
-    {
-        maColors[nIndex] = aColorData;
-    }
-
-    const OUString& getName() const
-    {
-        return maColorSetName;
-    }
-    const Color& getColor(sal_uInt32 nIndex) const
-    {
-        return maColors[nIndex];
-    }
-};
-
-class SVXCORE_DLLPUBLIC ColorSets
-{
-    std::vector<ColorSet> maColorSets;
-public:
-    ColorSets();
-    ~ColorSets();
-
-    void init();
-    const std::vector<ColorSet>& getColorSets() const
-    {
-        return maColorSets;
-    }
-
-    const ColorSet& getColorSet(sal_uInt32 nIndex)
-    {
-        return maColorSets[nIndex];
-    }
-
-    const ColorSet& getColorSet(std::u16string_view rName);
-};
-
-} // end of namespace svx
-
-#endif // INCLUDED_SVX_COLORSETS_HXX
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sfx2/Library_sfx.mk b/sfx2/Library_sfx.mk
index 0120cee75b4e..d2369bb43247 100644
--- a/sfx2/Library_sfx.mk
+++ b/sfx2/Library_sfx.mk
@@ -294,6 +294,7 @@ $(eval $(call gb_Library_add_exception_objects,sfx,\
     sfx2/source/sidebar/UnoDecks \
     sfx2/source/sidebar/UnoSidebar \
     sfx2/source/statbar/stbitem \
+    sfx2/source/styles/ColorSets \
     sfx2/source/styles/StyleManager \
     sfx2/source/toolbox/tbxitem \
     sfx2/source/toolbox/weldutils \
diff --git a/sfx2/source/doc/objxtor.cxx b/sfx2/source/doc/objxtor.cxx
index 70b2e1e2e486..4175ddf3e467 100644
--- a/sfx2/source/doc/objxtor.cxx
+++ b/sfx2/source/doc/objxtor.cxx
@@ -41,6 +41,7 @@
 #include <unotools/configmgr.hxx>
 #include <unotools/eventcfg.hxx>
 
+#include <sfx2/ColorSets.hxx>
 #include <sfx2/objsh.hxx>
 #include <sfx2/signaturestate.hxx>
 #include <sfx2/sfxmodelfactory.hxx>
@@ -260,6 +261,8 @@ SfxObjectShell::SfxObjectShell( const SfxModelFlags i_nCreationFlags )
     const bool bDocRecovery = ( i_nCreationFlags & SfxModelFlags::DISABLE_DOCUMENT_RECOVERY ) == SfxModelFlags::NONE;
     if ( !bDocRecovery )
         pImpl->m_bDocRecoverySupport = false;
+
+    PutItem(SfxColorSetListItem(ColorSets(), SID_COLOR_SETS));
 }
 
 /** Constructor of the class SfxObjectShell.
@@ -277,6 +280,7 @@ SfxObjectShell::SfxObjectShell(SfxObjectCreateMode eMode)
     , bIsInGenerateThumbnail(false)
     , mbAvoidRecentDocs(false)
 {
+    PutItem(SfxColorSetListItem(ColorSets(), SID_COLOR_SETS));
 }
 
 SfxObjectShell::~SfxObjectShell()
diff --git a/sfx2/source/styles/ColorSets.cxx b/sfx2/source/styles/ColorSets.cxx
new file mode 100644
index 000000000000..ac0088311c93
--- /dev/null
+++ b/sfx2/source/styles/ColorSets.cxx
@@ -0,0 +1,155 @@
+/* -*- 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 <sfx2/ColorSets.hxx>
+
+ColorSet::ColorSet(OUString const& aColorSetName)
+    : maColorSetName(aColorSetName)
+    , maColors(12)
+{
+}
+
+ColorSets::ColorSets()
+    : maColorSets()
+    , mnThemeColorSetIndex(0)
+{
+    {
+        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);
+        maColorSets.push_back(aColorSet);
+    }
+}
+
+ColorSets::~ColorSets() {}
+
+const ColorSet& ColorSets::getColorSet(std::u16string_view rName) const
+{
+    for (const ColorSet& rColorSet : maColorSets)
+    {
+        if (rColorSet.getName() == rName)
+            return rColorSet;
+    }
+    return maColorSets[0];
+}
+
+void ColorSets::setThemeColorSet(sal_Int32 nIndex) { mnThemeColorSetIndex = nIndex; }
+
+void ColorSets::setThemeColorSet(std::u16string_view rName)
+{
+    for (sal_uInt32 nIndex = 0; nIndex < maColorSets.size(); ++nIndex)
+    {
+        if (maColorSets[nIndex].getName() == rName)
+            mnThemeColorSetIndex = nIndex;
+    }
+}
+
+SfxColorSetListItem::SfxColorSetListItem() {}
+
+SfxColorSetListItem::SfxColorSetListItem(const ColorSets& rColorSets, sal_uInt16 nW)
+    : SfxPoolItem(nW)
+{
+    mpColorSets = std::make_shared<ColorSets>(rColorSets);
+}
+
+SfxColorSetListItem::SfxColorSetListItem(const SfxColorSetListItem& rItem)
+    : SfxPoolItem(rItem)
+    , mpColorSets(rItem.mpColorSets)
+{
+}
+
+bool SfxColorSetListItem::GetPresentation(SfxItemPresentation /*ePres*/, MapUnit /*eCoreUnit*/,
+                                          MapUnit /*ePresUnit*/, OUString& rText,
+                                          const IntlWrapper&) const
+{
+    rText.clear();
+    return false;
+}
+
+bool SfxColorSetListItem::operator==(const SfxPoolItem& rItem) const
+{
+    assert(SfxPoolItem::operator==(rItem));
+    // TODO: check these out before pushing...
+    return false;
+    //    return static_cast<const SfxColorSetListItem&>(rItem).mrColorSets == mrColorSets;
+}
+
+SfxColorSetListItem* SfxColorSetListItem::Clone(SfxItemPool*) const
+{
+    return new SfxColorSetListItem(*this);
+}
+
+/// TODO: check these out before pushing...
+bool SfxColorSetListItem::QueryValue(css::uno::Any& rVal, sal_uInt8 nMemberId) const
+{
+    return false;
+}
+
+bool SfxColorSetListItem::PutValue(const css::uno::Any& rVal, sal_uInt8 nMemberId) { return false; }
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sfx2/source/view/viewfrm.cxx b/sfx2/source/view/viewfrm.cxx
index b7fa742cabe8..a7dc6bb2e199 100644
--- a/sfx2/source/view/viewfrm.cxx
+++ b/sfx2/source/view/viewfrm.cxx
@@ -17,6 +17,8 @@
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
  */
 
+#include <sfx2/ColorSets.hxx>
+
 #include <config_feature_desktop.h>
 #include <osl/file.hxx>
 #include <sfx2/docfilt.hxx>
diff --git a/svx/Library_svxcore.mk b/svx/Library_svxcore.mk
index 8e596acd4605..625fa6297109 100644
--- a/svx/Library_svxcore.mk
+++ b/svx/Library_svxcore.mk
@@ -359,7 +359,6 @@ $(eval $(call gb_Library_add_exception_objects,svxcore,\
     svx/source/svdraw/textchaincursor \
     svx/source/styles/CommonStylePreviewRenderer \
     svx/source/styles/CommonStyleManager \
-    svx/source/styles/ColorSets \
     svx/source/table/cell \
     svx/source/table/cellcursor \
     svx/source/table/cellrange \
diff --git a/svx/source/styles/ColorSets.cxx b/svx/source/styles/ColorSets.cxx
deleted file mode 100644
index 7a04eb4e6314..000000000000
--- a/svx/source/styles/ColorSets.cxx
+++ /dev/null
@@ -1,107 +0,0 @@
-/* -*- 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 <svx/ColorSets.hxx>
-
-namespace svx
-{
-
-ColorSet::ColorSet(OUString const & aColorSetName)
-    : maColorSetName(aColorSetName)
-    , maColors(12)
-{}
-
-ColorSets::ColorSets()
-{}
-
-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);
-        maColorSets.push_back(aColorSet);
-    }
-}
-
-const ColorSet& ColorSets::getColorSet(std::u16string_view rName)
-{
-    for (const ColorSet & rColorSet : maColorSets)
-    {
-        if (rColorSet.getName() == rName)
-            return rColorSet;
-    }
-    return maColorSets[0];
-}
-
-} // end of namespace svx
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/uibase/sidebar/ThemePanel.cxx b/sw/source/uibase/sidebar/ThemePanel.cxx
index ce42983879ce..a9ddb4af0c83 100644
--- a/sw/source/uibase/sidebar/ThemePanel.cxx
+++ b/sw/source/uibase/sidebar/ThemePanel.cxx
@@ -13,6 +13,7 @@
 #include "ThemePanel.hxx"
 
 #include <sfx2/objsh.hxx>
+#include <sfx2/sfxsids.hrc>
 
 #include <com/sun/star/lang/IllegalArgumentException.hpp>
 
@@ -75,7 +76,7 @@ public:
         maVariable = aVariable;
     }
 
-    Color getColor(svx::ColorSet const & rColorSet)
+    Color getColor(ColorSet const & rColorSet)
     {
         Color aColor;
         if (maVariable.mnIndex > -1)
@@ -229,7 +230,7 @@ void changeFont(SwFormat* pFormat, SwDocStyleSheet const * pStyle, FontSet const
     }
 }*/
 
-void changeColor(SwTextFormatColl* pCollection, svx::ColorSet const& rColorSet, StyleRedefinition* /*pRedefinition*/)
+void changeColor(SwTextFormatColl* pCollection, ColorSet const& rColorSet, StyleRedefinition* /*pRedefinition*/)
 {
     SvxColorItem aColorItem(pCollection->GetColor());
     sal_Int16 nIndex = aColorItem.GetThemeIndex();
@@ -331,16 +332,19 @@ FontSet getFontSet(std::u16string_view rFontVariant, std::vector<FontSet>& aFont
 }
 
 void applyTheme(SfxStyleSheetBasePool* pPool, std::u16string_view sFontSetName, std::u16string_view sColorSetName,
-                StyleSet& rStyleSet, svx::ColorSets& rColorSets)
+                StyleSet& rStyleSet, ColorSets& rColorSets)
 {
     SwDocStyleSheet* pStyle;
 
     std::vector<FontSet> aFontSets = initFontSets();
     FontSet aFontSet = getFontSet(sFontSetName, aFontSets);
 
-    svx::ColorSet aColorSet = rColorSets.getColorSet(sColorSetName);
+    ColorSet aColorSet = rColorSets.getColorSet(sColorSetName);
 
     pStyle = static_cast<SwDocStyleSheet*>(pPool->First(SfxStyleFamily::Para));
+
+    rColorSets.setThemeColorSet(sColorSetName);
+
     while (pStyle)
     {
         SwTextFormatColl* pCollection = pStyle->GetCollection();
@@ -368,7 +372,7 @@ void applyTheme(SfxStyleSheetBasePool* pPool, std::u16string_view sFontSetName,
     }
 }
 
-BitmapEx GenerateColorPreview(const svx::ColorSet& rColorSet)
+BitmapEx GenerateColorPreview(const ColorSet& rColorSet)
 {
     ScopedVclPtrInstance<VirtualDevice> pVirtualDev(*Application::GetDefaultDevice());
     float fScaleFactor = pVirtualDev->GetDPIScaleFactor();
@@ -440,7 +444,7 @@ ThemePanel::ThemePanel(weld::Widget* pParent)
     , mxValueSetColors(new ValueSet(nullptr))
     , mxValueSetColorsWin(new weld::CustomWeld(*m_xBuilder, "valueset_colors", *mxValueSetColors))
     , mxApplyButton(m_xBuilder->weld_button("apply"))
-    , maColorSets()
+    , maColorSets(nullptr)
 {
     mxValueSetColors->SetColCount(2);
     mxValueSetColors->SetLineCount(3);
@@ -454,26 +458,32 @@ ThemePanel::ThemePanel(weld::Widget* pParent)
     for (const FontSet & rFontSet : aFontSets)
         mxListBoxFonts->append_text(rFontSet.maName);
     mxListBoxFonts->set_size_request(-1, mxListBoxFonts->get_height_rows(aFontSets.size()));
+    if (SfxObjectShell* pObjShell = SfxObjectShell::Current())
+    {
+        if (const SfxColorSetListItem* pColorSetItem = pObjShell->GetItem(SID_COLOR_SETS))
+        {
+            maColorSets = pColorSetItem->GetSfxColorSetListPtr();
+        }
+    }
 
-    maColorSets.init();
 
-    const std::vector<svx::ColorSet>& aColorSets = maColorSets.getColorSets();
-    for (size_t i = 0; i < aColorSets.size(); ++i)
-    {
-        const svx::ColorSet& rColorSet = aColorSets[i];
+    const std::vector<ColorSet>& aColorSets = maColorSets->getColorSets();
+        for (size_t i = 0; i < aColorSets.size(); ++i)
+        {
+            const ColorSet& rColorSet = aColorSets[i];
 
-        const OUString& aName = rColorSet.getName();
-        BitmapEx aPreview = GenerateColorPreview(rColorSet);
+            const OUString& aName = rColorSet.getName();
+            BitmapEx aPreview = GenerateColorPreview(rColorSet);
 
-        sal_uInt16 nId = i + 1;
-        mxValueSetColors->InsertItem(nId, Image(aPreview), aName);
-    }
+            sal_uInt16 nId = i + 1;
+            mxValueSetColors->InsertItem(nId, Image(aPreview), aName);
+        }
 
-    mxValueSetColors->SetOptimalSize();
+        mxValueSetColors->SetOptimalSize();
 
-    if (!aColorSets.empty())
-        mxValueSetColors->SelectItem(1); // ItemId 1, position 0
-}
+        if (!aColorSets.empty())
+            mxValueSetColors->SelectItem(1); // ItemId 1, position 0
+    }
 
 ThemePanel::~ThemePanel()
 {
@@ -510,11 +520,11 @@ void ThemePanel::DoubleClickHdl()
         return;
     OUString sEntryFonts = mxListBoxFonts->get_selected_text();
     sal_uInt32 nIndex = nItemId - 1;
-    OUString sEntryColors = maColorSets.getColorSet(nIndex).getName();
+    OUString sEntryColors = maColorSets->getColorSet(nIndex).getName();
 
     StyleSet aStyleSet = setupThemes();
 
-    applyTheme(pDocSh->GetStyleSheetPool(), sEntryFonts, sEntryColors, aStyleSet, maColorSets);
+    applyTheme(pDocSh->GetStyleSheetPool(), sEntryFonts, sEntryColors, aStyleSet, *maColorSets);
 }
 
 void ThemePanel::NotifyItemUpdate(const sal_uInt16 /*nSId*/,
diff --git a/sw/source/uibase/sidebar/ThemePanel.hxx b/sw/source/uibase/sidebar/ThemePanel.hxx
index 14af479e664a..ee0cbeaadfa1 100644
--- a/sw/source/uibase/sidebar/ThemePanel.hxx
+++ b/sw/source/uibase/sidebar/ThemePanel.hxx
@@ -13,7 +13,7 @@
 #include <sfx2/sidebar/PanelLayout.hxx>
 #include <sfx2/sidebar/ControllerItem.hxx>
 #include <svtools/valueset.hxx>
-#include <svx/ColorSets.hxx>
+#include <sfx2/ColorSets.hxx>
 
 namespace sw::sidebar {
 
@@ -40,7 +40,7 @@ private:
     std::unique_ptr<weld::CustomWeld> mxValueSetColorsWin;
     std::unique_ptr<weld::Button> mxApplyButton;
 
-    svx::ColorSets maColorSets;
+    std::shared_ptr<ColorSets> maColorSets;
 
     DECL_LINK(ClickHdl, weld::Button&, void);
     DECL_LINK(DoubleClickHdl, weld::TreeView&, bool);


More information about the Libreoffice-commits mailing list