diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2022-12-06 17:33:44 +0900 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2023-01-01 23:35:17 +0000 |
commit | 312100003fc7cae358038aaec853584782c698f8 (patch) | |
tree | 50c9dbedad29c04539c44880bd238c9015f1dabe /oox | |
parent | d5a71bc6a28f8a3d726b2ac4688c7cef9d77ddf0 (diff) |
sw: read theme from OOXML file and set it to the draw page
This change extends writerfilter to use oox::ThemeFragmentHandler
to read the theme properties, and sets that to the one and only
draw page of a Writer document.
This change also removes ThemeTable and replaces it with the
ThemeHandler, which takes theme font data from svx::Theme
instead.
In addition, a test has been writen, which loads a document with
a theme, and asserts the draw page has the theme and the theme
properties currently supported.
Change-Id: Iff0048cd21ea030ac55287707852acc463ec3cb0
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/143699
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'oox')
-rw-r--r-- | oox/Library_oox.mk | 1 | ||||
-rw-r--r-- | oox/source/drawingml/ThemeFilterBase.cxx | 50 | ||||
-rw-r--r-- | oox/source/drawingml/themefragmenthandler.cxx | 56 | ||||
-rw-r--r-- | oox/source/shape/ShapeContextHandler.cxx | 4 |
4 files changed, 83 insertions, 28 deletions
diff --git a/oox/Library_oox.mk b/oox/Library_oox.mk index b61f912c87c2..6e031a35c5a0 100644 --- a/oox/Library_oox.mk +++ b/oox/Library_oox.mk @@ -219,6 +219,7 @@ $(eval $(call gb_Library_add_exception_objects,oox,\ oox/source/drawingml/themeelementscontext \ oox/source/drawingml/themefragmenthandler \ oox/source/drawingml/ThemeOverrideFragmentHandler \ + oox/source/drawingml/ThemeFilterBase \ oox/source/drawingml/transform2dcontext \ oox/source/dump/dffdumper \ oox/source/dump/dumperbase \ diff --git a/oox/source/drawingml/ThemeFilterBase.cxx b/oox/source/drawingml/ThemeFilterBase.cxx new file mode 100644 index 000000000000..eddb49eb16cb --- /dev/null +++ b/oox/source/drawingml/ThemeFilterBase.cxx @@ -0,0 +1,50 @@ +/* -*- 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 <oox/drawingml/ThemeFilterBase.hxx> +#include <oox/drawingml/theme.hxx> + +using namespace css; + +namespace oox::drawingml +{ +ThemeFilterBase::ThemeFilterBase(const uno::Reference<uno::XComponentContext>& rxContext) + : XmlFilterBase(rxContext) +{ +} + +ThemeFilterBase::~ThemeFilterBase() = default; + +const oox::drawingml::Theme* ThemeFilterBase::getCurrentTheme() const { return mpTheme.get(); } + +std::shared_ptr<oox::drawingml::Theme> ThemeFilterBase::getCurrentThemePtr() const +{ + return mpTheme; +} + +void ThemeFilterBase::setCurrentTheme(const ::oox::drawingml::ThemePtr& pTheme) +{ + mpTheme = pTheme; +} + +oox::vml::Drawing* ThemeFilterBase::getVmlDrawing() { return nullptr; } + +oox::drawingml::table::TableStyleListPtr ThemeFilterBase::getTableStyles() +{ + return oox::drawingml::table::TableStyleListPtr(); +} + +oox::drawingml::chart::ChartConverter* ThemeFilterBase::getChartConverter() { return nullptr; } + +oox::ole::VbaProject* ThemeFilterBase::implCreateVbaProject() const { return nullptr; } + +OUString ThemeFilterBase::getImplementationName() { return OUString(); } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/oox/source/drawingml/themefragmenthandler.cxx b/oox/source/drawingml/themefragmenthandler.cxx index 30dba148364d..db2d6677567d 100644 --- a/oox/source/drawingml/themefragmenthandler.cxx +++ b/oox/source/drawingml/themefragmenthandler.cxx @@ -38,41 +38,41 @@ ThemeFragmentHandler::~ThemeFragmentHandler() { } -ContextHandlerRef ThemeFragmentHandler::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs) +ContextHandlerRef ThemeFragmentHandler::onCreateContext( sal_Int32 nElement, const AttributeList& /*rAttribs*/) { // CT_OfficeStyleSheet - switch( getCurrentElement() ) + if (getCurrentElement() == A_TOKEN(theme)) { - case XML_ROOT_CONTEXT: - switch( nElement ) - { - case A_TOKEN( theme ): - { - mrTheme.setThemeName(rAttribs.getStringDefaulted(XML_name)); - return this; - } - } - break; - - case A_TOKEN( theme ): - switch( nElement ) - { - case A_TOKEN( themeElements ): // CT_BaseStyles - return new ThemeElementsContext( *this, mrTheme ); - case A_TOKEN( objectDefaults ): // CT_ObjectStyleDefaults - return new objectDefaultContext( *this, mrTheme ); - case A_TOKEN( extraClrSchemeLst ): // CT_ColorSchemeList - return nullptr; - case A_TOKEN( custClrLst ): // CustomColorList - return nullptr; - case A_TOKEN( ext ): // CT_OfficeArtExtension - return nullptr; - } - break; + switch(nElement) + { + case A_TOKEN( themeElements ): // CT_BaseStyles + return new ThemeElementsContext( *this, mrTheme ); + case A_TOKEN( objectDefaults ): // CT_ObjectStyleDefaults + return new objectDefaultContext( *this, mrTheme ); + case A_TOKEN( extraClrSchemeLst ): // CT_ColorSchemeList + return nullptr; + case A_TOKEN( custClrLst ): // CustomColorList + return nullptr; + case A_TOKEN( ext ): // CT_OfficeArtExtension + return nullptr; + } + } + else if (getCurrentElement() == XML_ROOT_CONTEXT) + { + return this; } + return nullptr; } +void ThemeFragmentHandler::onStartElement(const AttributeList& rAttribs) +{ + if (getCurrentElement() == A_TOKEN(theme)) + { + mrTheme.setThemeName(rAttribs.getStringDefaulted(XML_name)); + } +} + } // namespace oox::drawingml /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/oox/source/shape/ShapeContextHandler.cxx b/oox/source/shape/ShapeContextHandler.cxx index 662c3d4c0863..a0d10e12bbc9 100644 --- a/oox/source/shape/ShapeContextHandler.cxx +++ b/oox/source/shape/ShapeContextHandler.cxx @@ -285,6 +285,10 @@ void SAL_CALL ShapeContextHandler::startFastElement mxShapeFilterBase->setCurrentTheme(mpThemePtr); } } + else if (mpThemePtr && !mxShapeFilterBase->getCurrentTheme()) + { + mxShapeFilterBase->setCurrentTheme(mpThemePtr); + } createFastChildContext(Element, Attribs); } |