summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/oox/drawingml/ThemeOverrideFragmentHandler.hxx40
-rw-r--r--include/oox/ppt/pptimport.hxx1
-rw-r--r--oox/Library_oox.mk1
-rw-r--r--oox/source/drawingml/ThemeOverrideFragmentHandler.cxx48
-rw-r--r--oox/source/drawingml/shape.cxx20
5 files changed, 109 insertions, 1 deletions
diff --git a/include/oox/drawingml/ThemeOverrideFragmentHandler.hxx b/include/oox/drawingml/ThemeOverrideFragmentHandler.hxx
new file mode 100644
index 000000000000..827cf5a52f55
--- /dev/null
+++ b/include/oox/drawingml/ThemeOverrideFragmentHandler.hxx
@@ -0,0 +1,40 @@
+/* -*- 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_OOX_DRAWINGML_THEMEOVERRICEFRAGMENTHANDLER_HXX
+#define INCLUDED_OOX_DRAWINGML_THEMEOVERRICEFRAGMENTHANDLER_HXX
+
+#include <oox/core/fragmenthandler2.hxx>
+
+namespace oox {
+namespace drawingml {
+
+class Theme;
+
+class ThemeOverrideFragmentHandler : public ::oox::core::FragmentHandler2
+{
+public:
+ explicit ThemeOverrideFragmentHandler(
+ ::oox::core::XmlFilterBase& rFilter,
+ const OUString& rFragmentPath,
+ Theme& rTheme );
+ virtual ~ThemeOverrideFragmentHandler();
+
+ virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) SAL_OVERRIDE;
+
+private:
+ Theme& mrTheme;
+};
+
+} // namespace drawingml
+} // namespace oox
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/oox/ppt/pptimport.hxx b/include/oox/ppt/pptimport.hxx
index c393be6411a9..d304792ab884 100644
--- a/include/oox/ppt/pptimport.hxx
+++ b/include/oox/ppt/pptimport.hxx
@@ -50,6 +50,7 @@ public:
virtual const oox::drawingml::table::TableStyleListPtr getTableStyles() SAL_OVERRIDE;
virtual ::oox::drawingml::chart::ChartConverter* getChartConverter() SAL_OVERRIDE;
+ SlidePersistPtr getActualSlidePersist() const { return mpActualSlidePersist; };
void setActualSlidePersist( SlidePersistPtr pActualSlidePersist ){ mpActualSlidePersist = pActualSlidePersist; };
std::map< OUString, oox::drawingml::ThemePtr >& getThemes(){ return maThemes; };
std::vector< SlidePersistPtr >& getDrawPages(){ return maDrawPages; };
diff --git a/oox/Library_oox.mk b/oox/Library_oox.mk
index 4f4a35b658e8..f356565dbef8 100644
--- a/oox/Library_oox.mk
+++ b/oox/Library_oox.mk
@@ -197,6 +197,7 @@ $(eval $(call gb_Library_add_exception_objects,oox,\
oox/source/drawingml/theme \
oox/source/drawingml/themeelementscontext \
oox/source/drawingml/themefragmenthandler \
+ oox/source/drawingml/ThemeOverrideFragmentHandler \
oox/source/drawingml/transform2dcontext \
oox/source/dump/dffdumper \
oox/source/dump/dumperbase \
diff --git a/oox/source/drawingml/ThemeOverrideFragmentHandler.cxx b/oox/source/drawingml/ThemeOverrideFragmentHandler.cxx
new file mode 100644
index 000000000000..5f3e7fc85a76
--- /dev/null
+++ b/oox/source/drawingml/ThemeOverrideFragmentHandler.cxx
@@ -0,0 +1,48 @@
+/* -*- 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/ThemeOverrideFragmentHandler.hxx"
+#include "oox/drawingml/theme.hxx"
+#include "oox/drawingml/themeelementscontext.hxx"
+
+using namespace ::oox::core;
+
+namespace oox {
+namespace drawingml {
+
+ThemeOverrideFragmentHandler::ThemeOverrideFragmentHandler( XmlFilterBase& rFilter, const OUString& rFragmentPath, Theme& rTheme ) :
+ FragmentHandler2( rFilter, rFragmentPath ),
+ mrTheme( rTheme )
+{
+}
+
+ThemeOverrideFragmentHandler::~ThemeOverrideFragmentHandler()
+{
+}
+
+ContextHandlerRef ThemeOverrideFragmentHandler::onCreateContext( sal_Int32 nElement, const AttributeList& )
+{
+ // CT_OfficeStyleSheet
+ switch( getCurrentElement() )
+ {
+ case XML_ROOT_CONTEXT:
+ switch( nElement )
+ {
+ case A_TOKEN( themeOverride ): // CT_BaseStylesOverride
+ return new ThemeElementsContext( *this, mrTheme );
+ }
+ break;
+ }
+ return 0;
+}
+
+} // namespace drawingml
+} // namespace oox
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx
index 0737830ece35..21a559795509 100644
--- a/oox/source/drawingml/shape.cxx
+++ b/oox/source/drawingml/shape.cxx
@@ -25,10 +25,12 @@
#include "oox/drawingml/effectproperties.hxx"
#include "oox/drawingml/shapepropertymap.hxx"
#include "oox/drawingml/textbody.hxx"
+#include "oox/drawingml/ThemeOverrideFragmentHandler.hxx"
#include "oox/drawingml/table/tableproperties.hxx"
#include "oox/drawingml/chart/chartconverter.hxx"
#include "oox/drawingml/chart/chartspacefragment.hxx"
#include "oox/drawingml/chart/chartspacemodel.hxx"
+#include "oox/ppt/pptimport.hxx"
#include "oox/vml/vmldrawing.hxx"
#include "oox/vml/vmlshape.hxx"
#include "oox/vml/vmlshapecontainer.hxx"
@@ -47,6 +49,7 @@
#include <com/sun/star/beans/XMultiPropertySet.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/xml/AttributeData.hpp>
+#include <com/sun/star/xml/sax/XFastSAXSerializable.hpp>
#include <com/sun/star/drawing/HomogenMatrix3.hpp>
#include <com/sun/star/drawing/TextVerticalAdjust.hpp>
#include <com/sun/star/drawing/GraphicExportFilter.hpp>
@@ -1236,7 +1239,22 @@ void Shape::finalizeXShape( XmlFilterBase& rFilter, const Reference< XShapes >&
// load the chart data from the XML fragment
chart::ChartSpaceModel aModel;
- rFilter.importFragment( new chart::ChartSpaceFragment( rFilter, mxChartShapeInfo->maFragmentPath, aModel ) );
+ chart::ChartSpaceFragment *pChartSpaceFragment = new chart::ChartSpaceFragment(
+ rFilter, mxChartShapeInfo->maFragmentPath, aModel );
+ const OUString aThemeOverrideFragmentPath( pChartSpaceFragment->
+ getFragmentPathFromFirstTypeFromOfficeDoc("themeOverride") );
+ rFilter.importFragment( pChartSpaceFragment );
+ ::oox::ppt::PowerPointImport *pPowerPointImport =
+ dynamic_cast< ::oox::ppt::PowerPointImport* >(&rFilter);
+ if (!aThemeOverrideFragmentPath.isEmpty() && pPowerPointImport)
+ {
+ uno::Reference< xml::sax::XFastSAXSerializable > xDoc(
+ rFilter.importFragment(aThemeOverrideFragmentPath), uno::UNO_QUERY_THROW);
+ ThemePtr pTheme = pPowerPointImport->getActualSlidePersist()->getTheme();
+ rFilter.importFragment(new ThemeOverrideFragmentHandler(
+ rFilter, aThemeOverrideFragmentPath, *pTheme), xDoc);
+ pPowerPointImport->getActualSlidePersist()->setTheme(pTheme);
+ }
// convert imported chart model to chart document
Reference< drawing::XShapes > xExternalPage;