summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/oox/shape/ShapeFilterBase.hxx2
-rw-r--r--include/svx/diagram/datamodel.hxx11
-rw-r--r--oox/source/drawingml/diagram/diagram.cxx6
-rw-r--r--oox/source/drawingml/diagram/diagramhelper.cxx35
-rw-r--r--oox/source/drawingml/diagram/diagramhelper.hxx7
-rw-r--r--oox/source/shape/ShapeFilterBase.cxx23
6 files changed, 56 insertions, 28 deletions
diff --git a/include/oox/shape/ShapeFilterBase.hxx b/include/oox/shape/ShapeFilterBase.hxx
index 200bc92ee492..477060fa6e48 100644
--- a/include/oox/shape/ShapeFilterBase.hxx
+++ b/include/oox/shape/ShapeFilterBase.hxx
@@ -70,8 +70,6 @@ public:
::Color getSchemeColor( sal_Int32 nToken ) const;
- void importTheme();
-
void setGraphicMapper(css::uno::Reference<css::graphic::XGraphicMapper> const & rxGraphicMapper)
{
mxGraphicMapper = rxGraphicMapper;
diff --git a/include/svx/diagram/datamodel.hxx b/include/svx/diagram/datamodel.hxx
index 3df7cc2e8afd..c42a3d26a115 100644
--- a/include/svx/diagram/datamodel.hxx
+++ b/include/svx/diagram/datamodel.hxx
@@ -30,6 +30,7 @@
#include <com/sun/star/uno/Sequence.hxx>
#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/xml/dom/XDocument.hpp>
namespace svx::diagram {
@@ -183,6 +184,9 @@ public:
OUString addNode(const OUString& rText);
bool removeNode(const OUString& rNodeId);
+ const css::uno::Reference< css::xml::dom::XDocument >& getThemeDocument() const { return mxThemeDocument; }
+ void setThemeDocument( const css::uno::Reference< css::xml::dom::XDocument >& xRef ) { mxThemeDocument = xRef; }
+
protected:
void getChildrenString(OUStringBuffer& rBuf, const Point* pPoint, sal_Int32 nLevel) const;
void addConnection(TypeConstant nType, const OUString& sSourceId, const OUString& sDestId);
@@ -194,8 +198,15 @@ protected:
// See evtl. parts in oox::drawingml::DiagramData that may need t obe accessed
// - logic connections/associations
// - data point entries
+ // - Theme definition as css::xml::dom::XDocument
+ // Note: I decided to use dom::XDocument which is already in use, instead of a
+ // temp file what is also possible (implemented that for POC) but would
+ // need to be created in PresentationFragmentHandler::importSlide. If
+ // this needs to be written to a File, please refer to
+ // fileDocxExport::WriteTheme(), look for "OOXTheme"
Connections maConnections;
Points maPoints;
+ css::uno::Reference< css::xml::dom::XDocument > mxThemeDocument;
// temporary processing data, deleted when using build()
PointNameMap maPointNameMap;
diff --git a/oox/source/drawingml/diagram/diagram.cxx b/oox/source/drawingml/diagram/diagram.cxx
index d12deea33d2f..484e7af9fd13 100644
--- a/oox/source/drawingml/diagram/diagram.cxx
+++ b/oox/source/drawingml/diagram/diagram.cxx
@@ -416,6 +416,12 @@ void loadDiagram( ShapePtr const & pShape,
pDiagram->addTo(pShape);
pShape->setDiagramDoms(pDiagram->getDomsAsPropertyValues());
+ // Get the oox::Theme definition and - if available - move/secure the
+ // original ImportData directly to the Diagram ModelData
+ std::shared_ptr<::oox::drawingml::Theme> aTheme(rFilter.getCurrentThemePtr());
+ if(aTheme)
+ pData->setThemeDocument(aTheme->getFragment()); //getTempFile());
+
// Prepare support for the advanced DiagramHelper using Diagram & Theme data
pShape->prepareDiagramHelper(pDiagram, rFilter.getCurrentThemePtr());
}
diff --git a/oox/source/drawingml/diagram/diagramhelper.cxx b/oox/source/drawingml/diagram/diagramhelper.cxx
index 4ed76e5bff1c..cc6efd9ba50e 100644
--- a/oox/source/drawingml/diagram/diagramhelper.cxx
+++ b/oox/source/drawingml/diagram/diagramhelper.cxx
@@ -26,6 +26,8 @@
#include <drawingml/fillproperties.hxx>
#include <svx/svdmodel.hxx>
#include <comphelper/processfactory.hxx>
+#include <oox/drawingml/themefragmenthandler.hxx>
+#include <com/sun/star/xml/sax/XFastSAXSerializable.hpp>
using namespace ::com::sun::star;
@@ -101,7 +103,7 @@ void AdvancedDiagramHelper::reLayout(SdrObjGroup& rTarget)
// set oox::Theme at Filter. All LineStyle/FillStyle/Colors/Attributes
// will be taken from there
- xFilter->setCurrentTheme(mpThemePtr);
+ xFilter->setCurrentTheme(getOrCreateThemePtr(xFilter));
css::uno::Reference< css::lang::XComponent > aComponentModel( rUnoModel, uno::UNO_QUERY );
xFilter->setTargetDocument(aComponentModel);
@@ -183,6 +185,37 @@ void AdvancedDiagramHelper::doAnchor(SdrObjGroup& rTarget)
anchorToSdrObjGroup(rTarget);
}
+std::shared_ptr< ::oox::drawingml::Theme > AdvancedDiagramHelper::getOrCreateThemePtr(
+ rtl::Reference< oox::shape::ShapeFilterBase >& rxFilter) const
+{
+ static bool bForceThemePtrReceation(false);
+
+ // (Re-)Use already existing Theme if existing/imported if possible.
+ // If not, re-import Theme if data is available and thus possible
+ if(hasDiagramData() && (bForceThemePtrReceation || !mpThemePtr))
+ {
+ // get the originally imported dom::XDocument
+ const uno::Reference< css::xml::dom::XDocument >& xThemeDocument(mpDiagramPtr->getData()->getThemeDocument());
+
+ if(xThemeDocument)
+ {
+ // reset local Theme ModelData *always* to get rid of former data that would
+ // else be added additionally
+ const_cast<AdvancedDiagramHelper*>(this)->mpThemePtr = std::make_shared<oox::drawingml::Theme>();
+
+ // import Theme ModelData
+ rxFilter->importFragment(
+ new ThemeFragmentHandler(
+ *rxFilter, OUString(), *mpThemePtr ),
+ uno::Reference< css::xml::sax::XFastSAXSerializable >(
+ xThemeDocument,
+ uno::UNO_QUERY_THROW));
+ }
+ }
+
+ return mpThemePtr;
+}
+
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/oox/source/drawingml/diagram/diagramhelper.hxx b/oox/source/drawingml/diagram/diagramhelper.hxx
index 33fd2da9d7a1..d8fd46ce57a1 100644
--- a/oox/source/drawingml/diagram/diagramhelper.hxx
+++ b/oox/source/drawingml/diagram/diagramhelper.hxx
@@ -22,6 +22,7 @@
#include <rtl/ustring.hxx>
#include <oox/drawingml/theme.hxx>
+#include <oox/shape/ShapeFilterBase.hxx>
#include <svx/svdogrp.hxx>
namespace oox::drawingml {
@@ -43,8 +44,8 @@ class Diagram;
// - im/export Diagram model to other representations
class AdvancedDiagramHelper final : public IDiagramHelper
{
- const std::shared_ptr< Diagram > mpDiagramPtr;
- const std::shared_ptr<::oox::drawingml::Theme> mpThemePtr;
+ const std::shared_ptr< Diagram > mpDiagramPtr;
+ std::shared_ptr<::oox::drawingml::Theme> mpThemePtr;
css::awt::Size maImportSize;
@@ -73,6 +74,8 @@ public:
virtual bool removeNode(const OUString& rNodeId) override;
void doAnchor(SdrObjGroup& rTarget);
+ std::shared_ptr< ::oox::drawingml::Theme > getOrCreateThemePtr(
+ rtl::Reference< oox::shape::ShapeFilterBase>& rxFilter ) const;
};
}
diff --git a/oox/source/shape/ShapeFilterBase.cxx b/oox/source/shape/ShapeFilterBase.cxx
index ebd47d83e9d5..ad10c4fe670d 100644
--- a/oox/source/shape/ShapeFilterBase.cxx
+++ b/oox/source/shape/ShapeFilterBase.cxx
@@ -132,29 +132,6 @@ GraphicHelper* ShapeFilterBase::implCreateGraphicHelper() const
return nColor;
}
-void ShapeFilterBase::importTheme()
-{
- drawingml::ThemePtr pTheme = std::make_shared<drawingml::Theme>();
- uno::Reference<beans::XPropertySet> xPropSet(getModel(), uno::UNO_QUERY_THROW);
- uno::Sequence<beans::PropertyValue> aGrabBag;
- xPropSet->getPropertyValue("InteropGrabBag") >>= aGrabBag;
-
- for (const auto& rProp : std::as_const(aGrabBag))
- {
- if (rProp.Name == "OOXTheme")
- {
- uno::Reference<xml::sax::XFastSAXSerializable> xDoc;
- if (rProp.Value >>= xDoc)
- {
- rtl::Reference<core::FragmentHandler> xFragmentHandler(
- new drawingml::ThemeFragmentHandler(*this, OUString(), *pTheme));
- importFragment(xFragmentHandler, xDoc);
- setCurrentTheme(pTheme);
- }
- }
- }
-}
-
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */