summaryrefslogtreecommitdiff
path: root/oox
diff options
context:
space:
mode:
authorTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2022-12-06 17:33:44 +0900
committerTomaž Vajngerl <quikee@gmail.com>2023-01-01 23:35:17 +0000
commit312100003fc7cae358038aaec853584782c698f8 (patch)
tree50c9dbedad29c04539c44880bd238c9015f1dabe /oox
parentd5a71bc6a28f8a3d726b2ac4688c7cef9d77ddf0 (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.mk1
-rw-r--r--oox/source/drawingml/ThemeFilterBase.cxx50
-rw-r--r--oox/source/drawingml/themefragmenthandler.cxx56
-rw-r--r--oox/source/shape/ShapeContextHandler.cxx4
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);
}