Advanced Diagram support: Make Style/Theme info available

The Style/Theme information is central for re-creating the
Diagram shape representation. Make that data available in
the ModelData classes in svx. With that information, a re-
creation with all needed attributes is possible, e.g. when
the model gets changed (remove/add data entries).
Also some cleanups done.

Change-Id: Icd925c9731891092f1ddd96c8feb165e1f846f4f
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/132738
Tested-by: Jenkins
Reviewed-by: Armin Le Grand <Armin.Le.Grand@me.com>
This commit is contained in:
Armin Le Grand (Allotropia)
2022-04-08 17:38:12 +02:00
committed by Armin Le Grand
parent a5c27f59c4
commit 027db2df53
6 changed files with 56 additions and 28 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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());
}

View File

@@ -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: */

View File

@@ -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;
};
}

View File

@@ -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: */