[Libreoffice-commits] core.git: Branch 'feature/themesupport2' - include/oox include/sfx2 oox/source sfx2/source

Sarper Akdemir (via logerrit) logerrit at kemper.freedesktop.org
Mon Sep 13 06:52:08 UTC 2021


 include/oox/drawingml/clrscheme.hxx |    3 +++
 include/oox/drawingml/theme.hxx     |    1 +
 include/oox/ppt/pptimport.hxx       |    1 +
 include/sfx2/ColorSets.hxx          |    8 +++++++-
 oox/source/drawingml/clrscheme.cxx  |   28 ++++++++++++++++++++++++++++
 oox/source/ppt/pptimport.cxx        |   31 +++++++++++++++++++++++++++----
 sfx2/source/doc/sfxbasemodel.cxx    |   23 ++++++++++++-----------
 7 files changed, 79 insertions(+), 16 deletions(-)

New commits:
commit 3b21d166f585dcdf8d576d166aeff3cfd4694aab
Author:     Sarper Akdemir <sarper.akdemir at collabora.com>
AuthorDate: Mon Sep 13 09:47:11 2021 +0300
Commit:     Sarper Akdemir <sarper.akdemir at collabora.com>
CommitDate: Mon Sep 13 09:47:11 2021 +0300

    import pptx color schemes as color sets
    
    initial import work for color sets.
    Themes (which we get the color schemes from) in MSO can
    be different for each master - will need to support that too.
    
    Change-Id: I30a75de2cbaf22ee48e37ceacabd83452177b697

diff --git a/include/oox/drawingml/clrscheme.hxx b/include/oox/drawingml/clrscheme.hxx
index 21553aafe2fe..cd8755e77088 100644
--- a/include/oox/drawingml/clrscheme.hxx
+++ b/include/oox/drawingml/clrscheme.hxx
@@ -86,6 +86,9 @@ public:
     bool     getColor( sal_Int32 nSchemeClrToken, ::Color& rColor ) const;
     void     setColor( sal_Int32 nSchemeClrToken, ::Color nColor );
 
+    std::vector<::Color> getColorVector();
+    std::vector<sal_Int32> getColorVectorAsInts();
+
     bool     getColorByIndex(size_t nIndex,
             ::Color& rColor) const;
 };
diff --git a/include/oox/drawingml/theme.hxx b/include/oox/drawingml/theme.hxx
index 6d64649f3a69..40ef9784dab0 100644
--- a/include/oox/drawingml/theme.hxx
+++ b/include/oox/drawingml/theme.hxx
@@ -60,6 +60,7 @@ public:
                         ~Theme();
 
     void                     setStyleName( const OUString& rStyleName ) { maStyleName = rStyleName; }
+    const OUString&          getStyleName() const { return maStyleName; }
 
     ClrScheme&               getClrScheme() { return maClrScheme; }
     const ClrScheme&         getClrScheme() const { return maClrScheme; }
diff --git a/include/oox/ppt/pptimport.hxx b/include/oox/ppt/pptimport.hxx
index 29ef3c5732a6..78f6d363b791 100644
--- a/include/oox/ppt/pptimport.hxx
+++ b/include/oox/ppt/pptimport.hxx
@@ -85,6 +85,7 @@ private:
     virtual GraphicHelper* implCreateGraphicHelper() const override;
     virtual ::oox::ole::VbaProject* implCreateVbaProject() const override;
     virtual OUString SAL_CALL getImplementationName() override;
+    void saveImportedThemesIntoDocumentColorSets();
 
 private:
     OUString                                       maTableStyleListPath;
diff --git a/include/sfx2/ColorSets.hxx b/include/sfx2/ColorSets.hxx
index ffd3ea4f6ed3..9ca322ab458d 100644
--- a/include/sfx2/ColorSets.hxx
+++ b/include/sfx2/ColorSets.hxx
@@ -60,6 +60,12 @@ public:
     const ColorSet& getColorSet(sal_uInt32 nIndex) const { return maColorSets[nIndex]; }
 
     const ColorSet& getColorSet(std::u16string_view rName) const;
+
+    int addColorSet(const ColorSet& rColorSet)
+    {
+        maColorSets.push_back(rColorSet);
+        return maColorSets.size() - 1;
+    }
 };
 
 class SFX2_DLLPUBLIC SfxColorSetListItem final : public SfxPoolItem
@@ -81,7 +87,7 @@ public:
     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; }
+    ColorSets& GetSfxColorSetList() const { return *mpColorSets; }
     std::shared_ptr<ColorSets> GetSfxColorSetListPtr() const { return mpColorSets; }
 };
 
diff --git a/oox/source/drawingml/clrscheme.cxx b/oox/source/drawingml/clrscheme.cxx
index 6b391d7877a8..cb3e9104855d 100644
--- a/oox/source/drawingml/clrscheme.cxx
+++ b/oox/source/drawingml/clrscheme.cxx
@@ -22,6 +22,7 @@
 #include <osl/diagnose.h>
 #include <oox/drawingml/clrscheme.hxx>
 #include <oox/token/tokens.hxx>
+#include <vector>
 
 namespace oox::drawingml {
 
@@ -102,6 +103,33 @@ bool ClrScheme::getColorByIndex(size_t nIndex, ::Color& rColor) const
     return true;
 }
 
+std::vector<::Color> ClrScheme::getColorVector()
+{
+    // most likely should reorder using tokens here...
+    // this is a experimental hack:
+
+    std::vector<::Color> aColors;
+
+    for( auto rIndexColorPair : maClrScheme )
+    {
+        aColors.emplace_back(rIndexColorPair.second);
+    }
+    return aColors;
+}
+
+std::vector<sal_Int32> ClrScheme::getColorVectorAsInts()
+{
+    // most likely should reorder using tokens here...
+    // this is a experimental hack:
+
+    std::vector<sal_Int32> aColors;
+
+    for (auto rIndexColorPair : maClrScheme)
+    {
+        aColors.emplace_back(static_cast<sal_Int32>(rIndexColorPair.second));
+    }
+    return aColors;
+}
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/oox/source/ppt/pptimport.cxx b/oox/source/ppt/pptimport.cxx
index 1f569d099876..1dd0ea48557d 100644
--- a/oox/source/ppt/pptimport.cxx
+++ b/oox/source/ppt/pptimport.cxx
@@ -23,10 +23,12 @@
 #include <com/sun/star/frame/XModel.hpp>
 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
 #include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/document/XColorSetsManager.hpp>
 #include <com/sun/star/document/XUndoManager.hpp>
 #include <com/sun/star/document/XUndoManagerSupplier.hpp>
 #include <comphelper/propertysequence.hxx>
 #include <comphelper/scopeguard.hxx>
+#include <comphelper/sequence.hxx>
 #include <vcl/svapp.hxx>
 #include <vcl/weld.hxx>
 #include <svtools/sfxecode.hxx>
@@ -58,6 +60,22 @@ namespace oox::ppt {
 XmlFilterBase* PowerPointImport::mpDebugFilterBase = nullptr;
 #endif
 
+void PowerPointImport::saveImportedThemesIntoDocumentColorSets()
+{
+    auto rThemes = getThemes();
+    css::uno::Reference<css::document::XColorSetsManager> xColorSetsManager(getModel(), css::uno::UNO_QUERY_THROW);
+
+    for(auto& aItem : rThemes)
+    {
+        const OUString& rThemeName = aItem.second->getStyleName();
+        drawingml::ClrScheme& rColorScheme = aItem.second->getClrScheme(); // gets the theme color scheme
+
+        auto aColorVector = rColorScheme.getColorVectorAsInts();
+
+        xColorSetsManager->addNewColorSet(rThemeName, comphelper::containerToSequence(aColorVector));
+    }
+}
+
 PowerPointImport::PowerPointImport( const Reference< XComponentContext >& rxContext ) :
     XmlFilterBase( rxContext ),
     mxChartConv( std::make_shared<::oox::drawingml::chart::ChartConverter>() )
@@ -101,11 +119,16 @@ bool PowerPointImport::importDocument()
         = xPresentationFragmentHandler->getFragmentPathFromFirstTypeFromOfficeDoc(u"presProps");
 
     bool bRet = importFragment(xPresentationFragmentHandler);
-    if (bRet && !sPresPropsPath.isEmpty())
+    if (bRet)
     {
-        FragmentHandlerRef xPresPropsFragmentHandler(
-            new PresPropsFragmentHandler(*this, sPresPropsPath));
-        importFragment(xPresPropsFragmentHandler);
+        if(!sPresPropsPath.isEmpty())
+        {
+            FragmentHandlerRef xPresPropsFragmentHandler(
+                new PresPropsFragmentHandler(*this, sPresPropsPath));
+            importFragment(xPresPropsFragmentHandler);
+        }
+
+        saveImportedThemesIntoDocumentColorSets();
     }
 
     static bool bNoSmartartWarning = getenv("OOX_NO_SMARTART_WARNING");
diff --git a/sfx2/source/doc/sfxbasemodel.cxx b/sfx2/source/doc/sfxbasemodel.cxx
index d3d6479e47e4..3178aa601718 100644
--- a/sfx2/source/doc/sfxbasemodel.cxx
+++ b/sfx2/source/doc/sfxbasemodel.cxx
@@ -2739,22 +2739,23 @@ void SfxBaseModel::loadCmisProperties( )
 void SAL_CALL SfxBaseModel::addNewColorSet(const OUString& rColorSetName,
                const css::uno::Sequence<css::util::Color>& rColorSetColors)
 {
-    if(SfxObjectShell* pObjShell = SfxObjectShell::Current())
+    if(SfxObjectShell* pObjShell = GetObjectShell())
     {
         if(const SfxColorSetListItem* pColorSetItem = pObjShell->GetItem(SID_COLOR_SETS))
         {
-            pColorSetItem->GetSfxColorSetListPtr();//->AddNewColorSet( NAME, COLORS );
-            //SAL/_DEBUG("Got the ColorSet without a problem!");
-        }
-        else
-        {
-            //SAL/_DEBUG("Couldn't get pColorSetItem (in addNewColorSet)");
+            ColorSet aColorSet(rColorSetName);
+            int nIndex = 0;
+            for( const css::util::Color& rColor : rColorSetColors )
+            {
+                aColorSet.add(nIndex++, rColor);
+            }
+
+            ColorSets& rColorSets = pColorSetItem->GetSfxColorSetList();
+
+            // let's force it as the selected color set for the moment.
+            rColorSets.setThemeColorSet( rColorSets.addColorSet(aColorSet) );
         }
     }
-    else
-    {
-        //SAL/_DEBUG("Couldn't get the object shell (in addNewColorSet)");
-    }
 }
 
 SfxMedium* SfxBaseModel::handleLoadError( ErrCode nError, SfxMedium* pMedium )


More information about the Libreoffice-commits mailing list