From 9e3adc0ee35d9922a12b63d0b36f7790247dec0f Mon Sep 17 00:00:00 2001 From: Matúš Kukan Date: Fri, 4 Jul 2014 15:12:59 +0200 Subject: bnc#882383: Do not ignore themeOverride for charts in .pptx Otherwise wrong colors are displayed. (cherry picked from commit 08818d8a45e034ad825c7fafbb76766f106f1d1d) Conflicts: oox/source/drawingml/shape.cxx Change-Id: I5d7444100355fdbc5fcd2aaa1c01202ace54312d Reviewed-on: https://gerrit.libreoffice.org/10134 Reviewed-by: Markus Mohrhard Tested-by: Markus Mohrhard --- oox/Library_oox.mk | 1 + .../drawingml/ThemeOverrideFragmentHandler.cxx | 48 ++++++++++++++++++++++ oox/source/drawingml/shape.cxx | 20 ++++++++- 3 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 oox/source/drawingml/ThemeOverrideFragmentHandler.cxx (limited to 'oox') 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 #include #include +#include #include #include #include @@ -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; -- cgit v1.2.3