bin/find-can-be-private-symbols.functions.results | 4 bin/find-mergedlib-can-be-private-symbols.functions.results | 4 compilerplugins/clang/mergeclasses.results | 2 compilerplugins/clang/unusedfields.writeonly.results | 2 cui/source/dialogs/DiagramDialog.cxx | 2 include/oox/drawingml/diagram/diagramhelper.hxx | 5 include/oox/export/drawingml.hxx | 2 include/svx/diagram/IDiagramHelper.hxx | 7 include/svx/diagram/datamodel_svx.hxx | 18 oox/IwyuFilter_oox.yaml | 2 oox/Library_oox.mk | 2 oox/source/drawingml/diagram/datamodel_oox.cxx | 127 +++++- oox/source/drawingml/diagram/datamodel_oox.hxx | 19 oox/source/drawingml/diagram/datamodelcontext.cxx | 10 oox/source/drawingml/diagram/datamodelcontext.hxx | 2 oox/source/drawingml/diagram/diagram.cxx | 65 +++ oox/source/drawingml/diagram/diagram.hxx | 5 oox/source/drawingml/diagram/diagramdefinitioncontext.cxx | 6 oox/source/drawingml/diagram/diagramhelper.cxx | 25 - oox/source/drawingml/diagram/diagramlayoutatoms.cxx | 16 oox/source/drawingml/diagram/layoutatomvisitorbase.cxx | 4 oox/source/drawingml/diagram/layoutatomvisitors.cxx | 4 oox/source/drawingml/shape.cxx | 10 oox/source/export/drawingml.cxx | 24 - sd/source/filter/eppt/pptx-epptooxml.cxx | 2 solenv/clang-format/excludelist | 10 svx/Library_svxcore.mk | 2 svx/source/diagram/IDiagramHelper.cxx | 31 + svx/source/diagram/datamodel_svx.cxx | 235 ++++++++++-- svx/source/svdraw/svdundo.cxx | 2 30 files changed, 510 insertions(+), 139 deletions(-)
New commits: commit bd047bbb9e43e0a4432e8e84408c2117a7ffe7a3 Author: Armin Le Grand (collabora) <[email protected]> AuthorDate: Tue Jan 20 16:18:20 2026 +0100 Commit: Armin Le Grand <[email protected]> CommitDate: Thu Jan 22 10:59:37 2026 +0100 SmartArt: Preparations for roundtrip The DiagramModel uses 4 mandatory and three optional XMLDoms for it's data. These get imported, but to get to a roundtrip we will need to be able to create & save these again. Last changes prepared this by deleting XMLDoms which were no longer valid dependent of changes done to that DiagramModel. When exporting the availability of these gets checked and if all are there, it gets exported as Diagram (in MSO format, not yet in ODF). If nothing was changed the original Doms get exported - untouched. That test will now try - if e.g. the most important XMLDom OOXData is missing - to re-create this in that action. The 1st one which I now implemented that is the OOXData which homes the Point/Connections/BGFill data (and some more). Due to this needing testing I for now encapsulated this to a EnvVar called ACTIVATE_RECREATE_DIAGRAM_DATADOMS, so this will for now only happen when this is set. Anyways all that stuff is still behind the 'experimental features' wall. This is and stays experimental for now. These are already deep changes which need to get tested and get to master, opening the path to experiment with it and refine it. Due to the EnvVar gate no real changes should happen in master, but due to the changes around it this will need to be checked this way. Change-Id: Iabba69b19387e45f1028843a25f3bae1fc4f8fe8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197676 Tested-by: Jenkins Reviewed-by: Armin Le Grand <[email protected]> diff --git a/bin/find-can-be-private-symbols.functions.results b/bin/find-can-be-private-symbols.functions.results index 1ef3798194f8..10e85b53b006 100644 --- a/bin/find-can-be-private-symbols.functions.results +++ b/bin/find-can-be-private-symbols.functions.results @@ -15372,8 +15372,8 @@ svx::ThemeDialog::initColorSets() svx::ThemeDialog::runThemeColorEditDialog() svx::classification::containsProperty(com::sun::star::uno::Sequence<com::sun::star::beans::Property> const&, std::basic_string_view<char16_t, std::char_traits<char16_t> >) svx::classification::convertClassificationResultToString(std::__debug::vector<svx::ClassificationResult, std::allocator<svx::ClassificationResult> > const&) -svx::diagram::DiagramData::addConnection(svx::diagram::TypeConstant, rtl::OUString const&, rtl::OUString const&) -svx::diagram::DiagramData::getChildrenString(rtl::OUStringBuffer&, svx::diagram::Point const*, int) const +svx::diagram::DiagramData_svx::addConnection(svx::diagram::TypeConstant, rtl::OUString const&, rtl::OUString const&) +svx::diagram::DiagramData_svx::getChildrenString(rtl::OUStringBuffer&, svx::diagram::Point const*, int) const svx::diagram::DiagramDataState::DiagramDataState(std::__debug::vector<svx::diagram::Connection, std::allocator<svx::diagram::Connection> >, std::__debug::vector<svx::diagram::Point, std::allocator<svx::diagram::Point> >) svx::diagram::DiagramFrameHdl::CreateB2dIAObject() svx::diagram::DiagramFrameHdl::DiagramFrameHdl(basegfx::B2DHomMatrix const&) diff --git a/bin/find-mergedlib-can-be-private-symbols.functions.results b/bin/find-mergedlib-can-be-private-symbols.functions.results index 9461b7cae78d..a5d281d22aa1 100644 --- a/bin/find-mergedlib-can-be-private-symbols.functions.results +++ b/bin/find-mergedlib-can-be-private-symbols.functions.results @@ -15746,8 +15746,8 @@ svx::administrateDatabaseRegistration(weld::Window*) svx::checkForFontWork(SdrObject const*) svx::classification::containsProperty(com::sun::star::uno::Sequence<com::sun::star::beans::Property> const&, std::basic_string_view<char16_t, std::char_traits<char16_t> >) svx::classification::convertClassificationResultToString(std::vector<svx::ClassificationResult, std::allocator<svx::ClassificationResult> > const&) -svx::diagram::DiagramData::addConnection(svx::diagram::TypeConstant, rtl::OUString const&, rtl::OUString const&) -svx::diagram::DiagramData::getChildrenString(rtl::OUStringBuffer&, svx::diagram::Point const*, int) const +svx::diagram::DiagramData_svx::addConnection(svx::diagram::TypeConstant, rtl::OUString const&, rtl::OUString const&) +svx::diagram::DiagramData_svx::getChildrenString(rtl::OUStringBuffer&, svx::diagram::Point const*, int) const svx::diagram::DiagramFrameHdl::CreateB2dIAObject() svx::diagram::DiagramFrameHdl::DiagramFrameHdl(basegfx::B2DHomMatrix const&) svx::diagram::IDiagramHelper::AddAdditionalVisualization(SdrObjGroup const&, SdrHdlList&) diff --git a/compilerplugins/clang/mergeclasses.results b/compilerplugins/clang/mergeclasses.results index 5ce71665a26b..4257c7327a0d 100644 --- a/compilerplugins/clang/mergeclasses.results +++ b/compilerplugins/clang/mergeclasses.results @@ -684,7 +684,7 @@ merge svx::IControllerFeatureInvalidation with FmXFormShell merge svx::IFocusObserver with svx::FmTextControlShell maybe merge svx::ODataAccessObjectTransferable with dbaui::ODataClipboard, in modules svx and dbaccess merge svx::RegistrationItemSetHolder with svx::DatabaseRegistrationDialog -maybe merge svx::diagram::DiagramData with oox::drawingml::DiagramData, in modules svx and oox +maybe merge svx::diagram::DiagramData_svx with oox::drawingml::DiagramData, in modules svx and oox maybe merge svx::diagram::IDiagramHelper with oox::drawingml::AdvancedDiagramHelper, in modules svx and oox maybe merge svx::sidebar::InspectorTextPanel with sw::sidebar::WriterInspectorTextPanel, in modules svx and sw merge svx::sidebar::SvxShapeCommandsMap with svx::sidebar::DefaultShapesPanel diff --git a/compilerplugins/clang/unusedfields.writeonly.results b/compilerplugins/clang/unusedfields.writeonly.results index 7d078c056d6b..3fc26461588c 100644 --- a/compilerplugins/clang/unusedfields.writeonly.results +++ b/compilerplugins/clang/unusedfields.writeonly.results @@ -731,7 +731,7 @@ include/svx/diagram/datamodel.hxx:153 include/svx/diagram/datamodel.hxx:155 svx::diagram::Point mbIsPlaceholder _Bool include/svx/diagram/datamodel.hxx:266 - svx::diagram::DiagramData maConnectionNameMap ConnectionNameMap + svx::diagram::DiagramData_svx maConnectionNameMap ConnectionNameMap include/svx/fillctrl.hxx:83 FillControl mxColorDispatch std::unique_ptr<ToolbarUnoDispatcher> include/svx/float3d.hxx:202 diff --git a/cui/source/dialogs/DiagramDialog.cxx b/cui/source/dialogs/DiagramDialog.cxx index e4d39e553c8c..18fea8e75824 100644 --- a/cui/source/dialogs/DiagramDialog.cxx +++ b/cui/source/dialogs/DiagramDialog.cxx @@ -14,7 +14,7 @@ #include <svx/svdmodel.hxx> #include <svx/svdundo.hxx> #include <com/sun/star/beans/PropertyValue.hpp> -#include <svx/diagram/datamodel.hxx> +#include <svx/diagram/datamodel_svx.hxx> #include <svx/diagram/IDiagramHelper.hxx> DiagramDialog::DiagramDialog(weld::Window* pWindow, SdrObjGroup& rDiagram) diff --git a/oox/source/drawingml/diagram/diagramhelper.hxx b/include/oox/drawingml/diagram/diagramhelper.hxx similarity index 94% rename from oox/source/drawingml/diagram/diagramhelper.hxx rename to include/oox/drawingml/diagram/diagramhelper.hxx index 693585731a84..cfd27b1f1d19 100644 --- a/oox/source/drawingml/diagram/diagramhelper.hxx +++ b/include/oox/drawingml/diagram/diagramhelper.hxx @@ -80,7 +80,7 @@ public: virtual std::shared_ptr< svx::diagram::DiagramDataState > extractDiagramDataState() const override; virtual void applyDiagramDataState(const std::shared_ptr< svx::diagram::DiagramDataState >& rState) override; - void doAnchor(SdrObjGroup& rTarget, ::oox::drawingml::Shape& rRootShape); + void doAnchor(com::sun::star::uno::Reference<com::sun::star::drawing::XShape>& rTarget, ::oox::drawingml::Shape& rRootShape); const std::shared_ptr< ::oox::drawingml::Theme >& getOrCreateThemePtr( const rtl::Reference< oox::shape::ShapeFilterBase>& rxFilter ) const; @@ -89,7 +89,8 @@ public: virtual com::sun::star::uno::Any getOOXDomValue(svx::diagram::DomMapFlag aDomMapFlag) const override; // check if mandatory DiagramDomS exist (or can be created) - virtual bool checkOrCreateMinimalDataDoms() override; + bool checkMinimalDataDoms() const; + void tryToCreateMissingDataDoms(oox::core::XmlFilterBase& rFB); }; } diff --git a/include/oox/export/drawingml.hxx b/include/oox/export/drawingml.hxx index 6fd880e028ed..cb39c05bf2c5 100644 --- a/include/oox/export/drawingml.hxx +++ b/include/oox/export/drawingml.hxx @@ -518,7 +518,7 @@ public: OString WriteWdpPicture( const OUString& rFileId, const css::uno::Sequence< sal_Int8 >& rPictureData ); // Diagram helpers - OOX_DLLPUBLIC static bool PrepareToWriteAsDiagram(const css::uno::Reference<css::drawing::XShape>& rXShape); + OOX_DLLPUBLIC bool PrepareToWriteAsDiagram(const css::uno::Reference<css::drawing::XShape>& rXRootShape); OOX_DLLPUBLIC void WriteDiagram(const css::uno::Reference<css::drawing::XShape>& rXShape, sal_Int32 nDiagramId, sal_Int32 nShapeId = -1); void writeDiagramRels(const css::uno::Sequence<css::uno::Sequence<css::uno::Any>>& xRelSeq, diff --git a/include/svx/diagram/IDiagramHelper.hxx b/include/svx/diagram/IDiagramHelper.hxx index a3e6f4bbf23f..33cde5244efb 100644 --- a/include/svx/diagram/IDiagramHelper.hxx +++ b/include/svx/diagram/IDiagramHelper.hxx @@ -86,7 +86,7 @@ private: protected: // remember associated SdrObjGroup - SdrObjGroup* mpAssociatedSdrObjGroup; + com::sun::star::uno::Reference< com::sun::star::drawing::XShape > mxGroupShape; public: IDiagramHelper(bool bSelfCreated); @@ -122,16 +122,13 @@ public: void setSelfCreated() { mbSelfCreated = true; } // connect/disconnect to/from Group - void connectToSdrObjGroup(SdrObjGroup& rTarget); + void connectToSdrObjGroup(com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& rTarget); void disconnectFromSdrObjGroup(); static void AddAdditionalVisualization(const SdrObjGroup& rTarget, SdrHdlList& rHdlList); // access to PropertyValues virtual com::sun::star::uno::Any getOOXDomValue(svx::diagram::DomMapFlag aDomMapFlag) const = 0; - - // check if mandatory DiagramDomS exist (or can be created) - virtual bool checkOrCreateMinimalDataDoms() = 0; }; }} // end of namespace diff --git a/include/svx/diagram/datamodel.hxx b/include/svx/diagram/datamodel_svx.hxx similarity index 95% rename from include/svx/diagram/datamodel.hxx rename to include/svx/diagram/datamodel_svx.hxx index 73f4ef234ef6..6df1c1963c3e 100644 --- a/include/svx/diagram/datamodel.hxx +++ b/include/svx/diagram/datamodel_svx.hxx @@ -34,6 +34,7 @@ #include <com/sun/star/xml/dom/XDocument.hpp> #include <com/sun/star/drawing/XShape.hpp> #include <oox/token/tokens.hxx> +#include <sax/fshelper.hxx> class Outliner; @@ -71,6 +72,7 @@ struct SVXCORE_DLLPUBLIC Connection sal_Int32 mnSourceOrder; sal_Int32 mnDestOrder; + void writeDiagramData(sax_fastparser::FSHelperPtr& rTarget); }; typedef std::vector< Connection > Connections; @@ -128,13 +130,13 @@ struct SVXCORE_DLLPUBLIC Point OUString msPresentationLayoutStyleLabel; OUString msQuickStyleCategoryId; OUString msQuickStyleTypeId; + OUString msResizeHandles; TypeConstant mnXMLType; sal_Int32 mnMaxChildren; sal_Int32 mnPreferredChildren; sal_Int32 mnDirection; std::optional<sal_Int32> moHierarchyBranch; - sal_Int32 mnResizeHandles; sal_Int32 mnCustomAngle; sal_Int32 mnPercentageNeighbourWidth; sal_Int32 mnPercentageNeighbourHeight; @@ -156,6 +158,8 @@ struct SVXCORE_DLLPUBLIC Point bool mbCustomVerticalFlip; bool mbCustomText; bool mbIsPlaceholder; + + void writeDiagramData(sax_fastparser::FSHelperPtr& rTarget); }; typedef std::vector< Point > Points; @@ -178,7 +182,7 @@ typedef std::shared_ptr< DiagramDataState > DiagramDataStatePtr; /** The collected Diagram ModelData */ -class SVXCORE_DLLPUBLIC DiagramData +class SVXCORE_DLLPUBLIC DiagramData_svx { public: typedef std::map< OUString, Point* > PointNameMap; @@ -196,11 +200,11 @@ public: protected: // Make constructor protected to signal that this anyway pure virtual class - // shall not be incarnated - target to use is oox::drawingml::DiagramData - DiagramData(); + // shall not be incarnated - target to use is oox::drawingml::DiagramData_oox + DiagramData_svx(); public: - virtual ~DiagramData(); + virtual ~DiagramData_svx(); // creates temporary processing data from model data virtual void buildDiagramDataModel(bool bClearOoxShapes); @@ -243,7 +247,7 @@ protected: ::std::vector<OUString> maExtDrawings; // The model definition, the parts available in svx. - // See evtl. parts in oox::drawingml::DiagramData that may need t obe accessed + // See evtl. parts in oox::drawingml::DiagramData_oox that may need t obe accessed // - logic connections/associations Connections maConnections; @@ -272,7 +276,7 @@ protected: OUString msBackgroundShapeModelID; }; -typedef std::shared_ptr< DiagramData > DiagramDataPtr; +typedef std::shared_ptr< DiagramData_svx > DiagramDataPtr_svx; } diff --git a/oox/IwyuFilter_oox.yaml b/oox/IwyuFilter_oox.yaml index 2627293321ad..20ca24569630 100644 --- a/oox/IwyuFilter_oox.yaml +++ b/oox/IwyuFilter_oox.yaml @@ -42,7 +42,7 @@ excludelist: - com/sun/star/drawing/LineStyle.hpp oox/source/drawingml/shape.cxx: # Actually used - - diagram/datamodel.hxx + - diagram/datamodel_oox.hxx # Needed for direct member access - com/sun/star/xml/dom/XDocument.hpp oox/source/drawingml/textparagraph.cxx: diff --git a/oox/Library_oox.mk b/oox/Library_oox.mk index 938fac1c8b95..550a82e839ba 100644 --- a/oox/Library_oox.mk +++ b/oox/Library_oox.mk @@ -156,7 +156,7 @@ $(eval $(call gb_Library_add_exception_objects,oox,\ oox/source/drawingml/customshapepresetdata \ oox/source/drawingml/customshapeproperties \ oox/source/drawingml/diagram/constraintlistcontext \ - oox/source/drawingml/diagram/datamodel \ + oox/source/drawingml/diagram/datamodel_oox \ oox/source/drawingml/diagram/datamodelcontext \ oox/source/drawingml/diagram/diagram \ oox/source/drawingml/diagram/diagramhelper \ diff --git a/oox/source/drawingml/diagram/datamodel.cxx b/oox/source/drawingml/diagram/datamodel_oox.cxx similarity index 73% rename from oox/source/drawingml/diagram/datamodel.cxx rename to oox/source/drawingml/diagram/datamodel_oox.cxx index 3dbddc790851..9182de5057e4 100644 --- a/oox/source/drawingml/diagram/datamodel.cxx +++ b/oox/source/drawingml/diagram/datamodel_oox.cxx @@ -17,7 +17,7 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#include "datamodel.hxx" +#include "datamodel_oox.hxx" #include <rtl/ustrbuf.hxx> #include <sal/log.hxx> @@ -29,7 +29,11 @@ #include <com/sun/star/beans/XPropertyState.hpp> #include <com/sun/star/drawing/FillStyle.hpp> #include <com/sun/star/drawing/LineStyle.hpp> +#include <com/sun/star/drawing/XShapes.hpp> #include <editeng/unoprnms.hxx> +#include <svx/svdobj.hxx> +#include <oox/token/namespaces.hxx> +#include <oox/export/drawingml.hxx> #include <unordered_set> @@ -37,11 +41,11 @@ using namespace ::com::sun::star; namespace oox::drawingml { -Shape* DiagramData::getOrCreateAssociatedShape(const svx::diagram::Point& rPoint, bool bCreateOnDemand) const +Shape* DiagramData_oox::getOrCreateAssociatedShape(const svx::diagram::Point& rPoint, bool bCreateOnDemand) const { if(maPointShapeMap.end() == maPointShapeMap.find(rPoint.msModelId)) { - const_cast<DiagramData*>(this)->maPointShapeMap[rPoint.msModelId] = ShapePtr(); + const_cast<DiagramData_oox*>(this)->maPointShapeMap[rPoint.msModelId] = ShapePtr(); } const ShapePtr& rShapePtr = maPointShapeMap.find(rPoint.msModelId)->second; @@ -58,7 +62,7 @@ Shape* DiagramData::getOrCreateAssociatedShape(const svx::diagram::Point& rPoint return rShapePtr.get(); } -void DiagramData::restoreDataFromModelToShapeAfterReCreation(const svx::diagram::Point& rPoint, Shape& rNewShape) +void DiagramData_oox::restoreDataFromModelToShapeAfterReCreation(const svx::diagram::Point& rPoint, Shape& rNewShape) { // If we did create a new oox::drawingml::Shape, directly apply // available data from the Diagram ModelData to it as preparation @@ -86,6 +90,93 @@ void DiagramData::restoreDataFromModelToShapeAfterReCreation(const svx::diagram: } } +void DiagramData_oox::writeDiagramData(oox::core::XmlFilterBase& rFB, sax_fastparser::FSHelperPtr& rTarget, const css::uno::Reference<css::drawing::XShape>& rXShape) +{ + if (!rTarget) + return; + + // write header infos + const OUString aNsDmlDiagram(rFB.getNamespaceURL(OOX_NS(dmlDiagram))); + const OUString aNsDml(rFB.getNamespaceURL(NMSP_dmlDiagram)); + rTarget->startElementNS(XML_dgm, XML_dataModel, + FSNS(XML_xmlns, XML_dgm), aNsDmlDiagram, + FSNS(XML_xmlns, XML_a), aNsDml); + + // write PointList + rTarget->startElementNS(XML_dgm, XML_ptLst); + for (auto& rPoint : getPoints()) + rPoint.writeDiagramData(rTarget); + rTarget->endElementNS(XML_dgm, XML_ptLst); + + // write ConnectorList + rTarget->startElementNS(XML_dgm, XML_cxnLst); + for (auto& rConnection : getConnections()) + rConnection.writeDiagramData(rTarget); + rTarget->endElementNS(XML_dgm, XML_cxnLst); + + // write BGFill + rTarget->startElementNS(XML_dgm, XML_bg); + + // there is *no* export for oox::drawingml::FillProperties which we have in mpBackgroundShapeFillProperties. + // searching for 'XML_.*XML_noFill' shows that there is also a pretty direct export for FillStyle in Chart2, + // maybe that could be adapted for general use. + // But there is DrawingML::WriteFill, that needs the XShape, sax_fastparser::FSHelper and a XmlFilterBase. We + // can organize all that and then export from XShape model data. + // For The BGShape is is okay since in MSO Diagram data no shape for that exists anyways, it's just + // FillAttributes and a XShape for BG needs to exist in DrawObject model anytime anyways, see + // Diagram::createShapeHierarchyFromModel. This will also allow to use existing stuff like standard dialogs + // and more for later offering changing the Background of a Diagram. + // Note that an incarnation of BG as XShape is also needed to 'carry' the correct Size for that Diagram. + uno::Reference<drawing::XShape> xBgShape; + uno::Reference<drawing::XShapes> xGroup(rXShape, uno::UNO_QUERY); + if (xGroup.is() && 0 != xGroup->getCount()) + { + // access the BGShape, it *should* always exist and be the 1st shape (to *be* in the BG) + uno::Reference<drawing::XShape> xCandidate(xGroup->getByIndex(0), uno::UNO_QUERY); + if (xCandidate.is()) + { + // check comparing the DiagramDataModelID created at BackgroundSHape creation for the oox::Shape + // that got transferend to the XShape when it was created + SdrObject* pCandidate(SdrObject::getSdrObjectFromXShape(xCandidate)); + if (nullptr != pCandidate && pCandidate->getDiagramDataModelID() == getBackgroundShapeModelID()) + xBgShape = xCandidate; + } + } + + if (xBgShape.is()) + { + // if we have the BGShape as XShape, export using a temp DrawingML which uses + // the target file combined with the XmlFilterBase representing the ongoing Diagram export + DrawingML aTempML(rTarget, &rFB); + uno::Reference<beans::XPropertySet> xProps(xBgShape, uno::UNO_QUERY); + aTempML.WriteFill( xProps, xBgShape->getSize()); + } + + rTarget->endElementNS(XML_dgm, XML_bg); + + rTarget->singleElementNS(XML_dgm, XML_whole); + + // write ExtList & it's contents + // Note: I *tried* to use XML_dsp and xmlns:dsp, but these are not defined, thus + // for this case where the only relevant data is the 'relId' entzry I will allow + // to construct the XML statement by own string concatenation + rTarget->startElementNS(XML_dgm, XML_extLst); + const OUString rNsDsp(rFB.getNamespaceURL(OOX_NS(dsp))); + rTarget->startElementNS(XML_a, XML_ext, XML_uri, rNsDsp); + OUString aDspLine("<dsp:dataModelExt xmlns:dsp=\"" + rNsDsp + "\" "); + if (!getExtDrawings().empty()) + { + aDspLine += "relId=\"" + getExtDrawings().front() + "\" "; + } + aDspLine += "minVer=\"" + aNsDml + "\"/>"; + rTarget->write(aDspLine); + rTarget->endElementNS(XML_a, XML_ext); + rTarget->endElementNS(XML_dgm, XML_extLst); + + rTarget->endElementNS(XML_dgm, XML_dataModel); + rTarget->endDocument(); +} + static void addProperty(const OUString& rName, const css::uno::Reference< css::beans::XPropertySetInfo >& xInfo, std::vector< std::pair< OUString, css::uno::Any >>& rTarget, @@ -95,7 +186,7 @@ static void addProperty(const OUString& rName, rTarget.push_back(std::pair(OUString(rName), xPropSet->getPropertyValue(rName))); } -void DiagramData::secureStyleDataFromShapeToModel(::oox::drawingml::Shape& rShape) +void DiagramData_oox::secureStyleDataFromShapeToModel(::oox::drawingml::Shape& rShape) { const std::vector< ShapePtr >& rChildren(rShape.getChildren()); @@ -122,7 +213,7 @@ void DiagramData::secureStyleDataFromShapeToModel(::oox::drawingml::Shape& rShap // define target to save to svx::diagram::PointStyle* pTarget(nullptr); - const bool bIsBackgroundShape(rShape.getDiagramDataModelID() == msBackgroundShapeModelID); + const bool bIsBackgroundShape(rShape.getDiagramDataModelID() == getBackgroundShapeModelID()); if(bIsBackgroundShape) { @@ -270,7 +361,7 @@ void DiagramData::secureStyleDataFromShapeToModel(::oox::drawingml::Shape& rShap } } -void DiagramData::secureDataFromShapeToModelAfterDiagramImport(::oox::drawingml::Shape& rRootShape) +void DiagramData_oox::secureDataFromShapeToModelAfterDiagramImport(::oox::drawingml::Shape& rRootShape) { const std::vector< ShapePtr >& rChildren(rRootShape.getChildren()); @@ -323,7 +414,7 @@ void DiagramData::secureDataFromShapeToModelAfterDiagramImport(::oox::drawingml: } } -void DiagramData::restoreStyleDataFromShapeToModel(::oox::drawingml::Shape& rShape) +void DiagramData_oox::restoreStyleDataFromShapeToModel(::oox::drawingml::Shape& rShape) { const std::vector< ShapePtr >& rChildren(rShape.getChildren()); @@ -351,7 +442,7 @@ void DiagramData::restoreStyleDataFromShapeToModel(::oox::drawingml::Shape& rSha // define source to save to svx::diagram::PointStyle* pSource(nullptr); - if(rShape.getDiagramDataModelID() == msBackgroundShapeModelID) + if(rShape.getDiagramDataModelID() == getBackgroundShapeModelID()) { // if BackgroundShape, set BackgroundShapeStyle as source if(maBackgroundShapeStyle) @@ -389,7 +480,7 @@ void DiagramData::restoreStyleDataFromShapeToModel(::oox::drawingml::Shape& rSha } } -void DiagramData::restoreDataFromShapeToModelAfterDiagramImport(::oox::drawingml::Shape& rRootShape) +void DiagramData_oox::restoreDataFromShapeToModelAfterDiagramImport(::oox::drawingml::Shape& rRootShape) { const std::vector< ShapePtr >& rChildren(rRootShape.getChildren()); @@ -399,13 +490,13 @@ void DiagramData::restoreDataFromShapeToModelAfterDiagramImport(::oox::drawingml } } -DiagramData::DiagramData() -: svx::diagram::DiagramData() +DiagramData_oox::DiagramData_oox() +: svx::diagram::DiagramData_svx() , mpBackgroundShapeFillProperties( std::make_shared<FillProperties>() ) { } -DiagramData::~DiagramData() +DiagramData_oox::~DiagramData_oox() { } @@ -427,18 +518,18 @@ static void Point_dump(const svx::diagram::Point& rPoint, const Shape* pShape) << rPoint.msModelId << ", type " << rPoint.mnXMLType); } -void DiagramData::dump() const +void DiagramData_oox::dump() const { - SAL_INFO("oox.drawingml", "Dgm: DiagramData # of cnx: " << maConnections.size() ); + SAL_INFO("oox.drawingml", "Dgm: DiagramData_oox # of cnx: " << maConnections.size() ); for (const auto& rConnection : maConnections) Connection_dump(rConnection); - SAL_INFO("oox.drawingml", "Dgm: DiagramData # of pt: " << maPoints.size() ); + SAL_INFO("oox.drawingml", "Dgm: DiagramData_oox # of pt: " << maPoints.size() ); for (const auto& rPoint : maPoints) Point_dump(rPoint, getOrCreateAssociatedShape(rPoint)); } -void DiagramData::buildDiagramDataModel(bool bClearOoxShapes) +void DiagramData_oox::buildDiagramDataModel(bool bClearOoxShapes) { if(bClearOoxShapes) { @@ -447,7 +538,7 @@ void DiagramData::buildDiagramDataModel(bool bClearOoxShapes) } // call parent - svx::diagram::DiagramData::buildDiagramDataModel(bClearOoxShapes); + svx::diagram::DiagramData_svx::buildDiagramDataModel(bClearOoxShapes); if(bClearOoxShapes) { diff --git a/oox/source/drawingml/diagram/datamodel.hxx b/oox/source/drawingml/diagram/datamodel_oox.hxx similarity index 82% rename from oox/source/drawingml/diagram/datamodel.hxx rename to oox/source/drawingml/diagram/datamodel_oox.hxx index 23104812edf1..8a52cb5d4032 100644 --- a/oox/source/drawingml/diagram/datamodel.hxx +++ b/oox/source/drawingml/diagram/datamodel_oox.hxx @@ -26,20 +26,21 @@ #include <rtl/ustring.hxx> -#include <svx/diagram/datamodel.hxx> +#include <svx/diagram/datamodel_svx.hxx> #include <oox/drawingml/drawingmltypes.hxx> #include <oox/helper/helper.hxx> #include <oox/token/tokens.hxx> +#include <oox/shape/ShapeFilterBase.hxx> namespace oox::drawingml { -class DiagramData : public svx::diagram::DiagramData +class DiagramData_oox : public svx::diagram::DiagramData_svx { public: typedef std::map< OUString, ShapePtr > PointShapeMap; - DiagramData(); - virtual ~DiagramData(); + DiagramData_oox(); + virtual ~DiagramData_oox(); // creates temporary processing data from model data virtual void buildDiagramDataModel(bool bClearOoxShapes); @@ -54,13 +55,15 @@ public: void restoreDataFromShapeToModelAfterDiagramImport(::oox::drawingml::Shape& rRootShape); static void restoreDataFromModelToShapeAfterReCreation(const svx::diagram::Point& rPoint, Shape& rNewShape); + void writeDiagramData(oox::core::XmlFilterBase& rFB, sax_fastparser::FSHelperPtr& rTarget, const css::uno::Reference<css::drawing::XShape>& rXShape); + protected: void secureStyleDataFromShapeToModel(::oox::drawingml::Shape& rShape); void restoreStyleDataFromShapeToModel(::oox::drawingml::Shape& rShape); private: // The model definition, the parts *only* available in oox. Also look for already - // defined ModelData in svx::diagram::DiagramData + // defined ModelData in svx::diagram::DiagramData_svx // - FillStyle for Diagram Background (empty constructed, may stay empty) FillPropertiesPtr mpBackgroundShapeFillProperties; @@ -70,9 +73,9 @@ private: PointShapeMap maPointShapeMap; }; -// Oox-local definition of DiagramData. Doing and using this on Oox -// allows to do much less static_cast(s) - if at all from svx::diagram::DiagramData -typedef std::shared_ptr< DiagramData > OoxDiagramDataPtr; +// Oox-local definition of DiagramData_oox. Doing and using this on Oox +// allows to do much less static_cast(s) - if at all from svx::diagram::DiagramData_svx +typedef std::shared_ptr< DiagramData_oox > OoxDiagramDataPtr; } diff --git a/oox/source/drawingml/diagram/datamodelcontext.cxx b/oox/source/drawingml/diagram/datamodelcontext.cxx index 009606fa322f..336c870a5659 100644 --- a/oox/source/drawingml/diagram/datamodelcontext.cxx +++ b/oox/source/drawingml/diagram/datamodelcontext.cxx @@ -123,7 +123,7 @@ public: mrPoint.mbOrgChartEnabled = rAttribs.getBool( XML_val, false ); break; case DGM_TOKEN( resizeHandles ): - mrPoint.mnResizeHandles = rAttribs.getToken( XML_val, XML_rel ); + mrPoint.msResizeHandles = rAttribs.getStringDefaulted( XML_val ); break; default: break; @@ -208,7 +208,7 @@ public: PtContext( ContextHandler2Helper const& rParent, const AttributeList& rAttribs, svx::diagram::Point& rPoint, - DiagramData& rDiagramData): + DiagramData_oox& rDiagramData): ContextHandler2( rParent ), mrPoint( rPoint ), mrDiagramData( rDiagramData ) @@ -254,7 +254,7 @@ public: private: svx::diagram::Point& mrPoint; - DiagramData& mrDiagramData; + DiagramData_oox& mrDiagramData; }; // CT_PtList @@ -262,7 +262,7 @@ class PtListContext : public ContextHandler2 { public: - PtListContext( ContextHandler2Helper const & rParent, svx::diagram::Points& rPoints, DiagramData& rDiagramData) : + PtListContext( ContextHandler2Helper const & rParent, svx::diagram::Points& rPoints, DiagramData_oox& rDiagramData) : ContextHandler2( rParent ), mrPoints( rPoints ), mrDiagramData( rDiagramData ) @@ -287,7 +287,7 @@ public: private: svx::diagram::Points& mrPoints; - DiagramData& mrDiagramData; + DiagramData_oox& mrDiagramData; }; // CT_BackgroundFormatting diff --git a/oox/source/drawingml/diagram/datamodelcontext.hxx b/oox/source/drawingml/diagram/datamodelcontext.hxx index 9a5c323de875..40e3320cf20c 100644 --- a/oox/source/drawingml/diagram/datamodelcontext.hxx +++ b/oox/source/drawingml/diagram/datamodelcontext.hxx @@ -21,7 +21,7 @@ #define INCLUDED_OOX_SOURCE_DRAWINGML_DIAGRAM_DATAMODELCONTEXT_HXX #include <oox/core/contexthandler2.hxx> -#include "datamodel.hxx" +#include "datamodel_oox.hxx" namespace oox::drawingml { diff --git a/oox/source/drawingml/diagram/diagram.cxx b/oox/source/drawingml/diagram/diagram.cxx index 1584fb815948..75f84c3b7340 100644 --- a/oox/source/drawingml/diagram/diagram.cxx +++ b/oox/source/drawingml/diagram/diagram.cxx @@ -26,6 +26,8 @@ #include <com/sun/star/drawing/XShapes.hpp> #include <com/sun/star/xml/dom/XDocument.hpp> #include <com/sun/star/xml/sax/XFastSAXSerializable.hpp> +#include <com/sun/star/xml/dom/XDocumentBuilder.hpp> +#include <com/sun/star/xml/dom/DocumentBuilder.hpp> #include <sal/log.hxx> #include <editeng/unoprnms.hxx> #include <drawingml/fillproperties.hxx> @@ -37,10 +39,16 @@ #include <svx/svdpage.hxx> #include <oox/ppt/pptimport.hxx> #include <comphelper/xmltools.hxx> - #include "diagramlayoutatoms.hxx" #include "layoutatomvisitors.hxx" #include "diagramfragmenthandler.hxx" +#include <comphelper/processfactory.hxx> +#include <com/sun/star/io/TempFile.hpp> + +#ifdef DBG_UTIL +#include <osl/file.hxx> +#include <iostream> +#endif using namespace ::com::sun::star; @@ -175,7 +183,7 @@ void Diagram::resetOOXDomValues(svx::diagram::DomMapFlags aDomMapFlags) } } -bool Diagram::checkOrCreateMinimalDataDoms() +bool Diagram::checkMinimalDataDoms() const { if (maDiagramPRDomMap.end() == maDiagramPRDomMap.find(svx::diagram::DomMapFlag::OOXData)) return false; @@ -192,6 +200,57 @@ bool Diagram::checkOrCreateMinimalDataDoms() return true; } +void Diagram::tryToCreateMissingDataDoms(oox::core::XmlFilterBase& rFB, const css::uno::Reference<css::drawing::XShape>& rXRootShape) +{ + // internal testing: allow to force to always recreate + static bool bForceAlwaysReCreate(false); + + // check if activated, return if not to stay compatible for now + static bool bReCreateDiagramDataDoms(nullptr != std::getenv("ACTIVATE_RECREATE_DIAGRAM_DATADOMS")); +#ifdef DBG_UTIL + std::cout << "DiagramReCreate: always==" << bForceAlwaysReCreate << ",bReCreate==" << bReCreateDiagramDataDoms << std::endl; +#endif + if (!bForceAlwaysReCreate && !bReCreateDiagramDataDoms) + return; + + if (bForceAlwaysReCreate || maDiagramPRDomMap.end() == maDiagramPRDomMap.find(svx::diagram::DomMapFlag::OOXData)) + { + // re-create OOXData DomFile from model data +#ifdef DBG_UTIL + std::cout << "DiagramReCreate: creating DomMapFlag::OOXData" << std::endl; +#endif + uno::Reference< io::XTempFile > xTempFile = io::TempFile::create(comphelper::getProcessComponentContext()); + uno::Reference< io::XOutputStream > xOutput = xTempFile->getOutputStream(); + + if (xOutput) + { + sax_fastparser::FSHelperPtr aFS = std::make_shared<sax_fastparser::FastSerializerHelper>(xOutput, true); + getData()->writeDiagramData(rFB, aFS, rXRootShape); + xOutput->flush(); + + // this call is *important*, without it xDocBuilder->parse below fails and some strange + // and wrong assertion gets thrown in ~FastSerializerHelper that shall get called + xOutput->closeOutput(); + + uno::Reference<xml::dom::XDocumentBuilder> xDocBuilder(xml::dom::DocumentBuilder::create(comphelper::getProcessComponentContext())); + if (xDocBuilder) + { + uno::Reference<xml::dom::XDocument> xInstance = xDocBuilder->parse(xTempFile->getInputStream()); + if (xInstance) + { + maDiagramPRDomMap[svx::diagram::DomMapFlag::OOXData] <<= xInstance; + } + } + +#ifdef DBG_UTIL + osl::File::move(xTempFile->getUri(), "file:///home/alg/Downloads/tonne/test.xml"); +#endif + } + } + + // more to do... +} + using ShapePairs = std::map<std::shared_ptr<drawingml::Shape>, css::uno::Reference<css::drawing::XShape>>; @@ -328,7 +387,7 @@ void loadDiagram( ShapePtr const & pShape, { DiagramPtr pDiagram = std::make_shared<Diagram>(); - OoxDiagramDataPtr pData = std::make_shared<DiagramData>(); + OoxDiagramDataPtr pData = std::make_shared<DiagramData_oox>(); pDiagram->setData( pData ); DiagramLayoutPtr pLayout = std::make_shared<DiagramLayout>(*pDiagram); diff --git a/oox/source/drawingml/diagram/diagram.hxx b/oox/source/drawingml/diagram/diagram.hxx index c93ee98a446e..bc7308a7b8d1 100644 --- a/oox/source/drawingml/diagram/diagram.hxx +++ b/oox/source/drawingml/diagram/diagram.hxx @@ -26,7 +26,7 @@ #include <rtl/ustring.hxx> -#include "datamodel.hxx" +#include "datamodel_oox.hxx" #include <oox/drawingml/shape.hxx> namespace com::sun::star { @@ -152,7 +152,8 @@ public: void resetOOXDomValues(svx::diagram::DomMapFlags aDomMapFlags); // check if mandatory DiagramDomS exist (or can be created) - bool checkOrCreateMinimalDataDoms(); + bool checkMinimalDataDoms() const; + void tryToCreateMissingDataDoms(oox::core::XmlFilterBase& rFB, const com::sun::star::uno::Reference<css::drawing::XShape>& rXRootShape); private: // This contains groups of shapes: automatic font size is the same in each group. diff --git a/oox/source/drawingml/diagram/diagramdefinitioncontext.cxx b/oox/source/drawingml/diagram/diagramdefinitioncontext.cxx index fea2c48734cd..25644c70d29a 100644 --- a/oox/source/drawingml/diagram/diagramdefinitioncontext.cxx +++ b/oox/source/drawingml/diagram/diagramdefinitioncontext.cxx @@ -18,7 +18,7 @@ */ #include "diagramdefinitioncontext.hxx" -#include "datamodel.hxx" +#include "datamodel_oox.hxx" #include "datamodelcontext.hxx" #include "layoutnodecontext.hxx" #include <oox/helper/attributelist.hxx> @@ -78,10 +78,10 @@ DiagramDefinitionContext::onCreateContext( ::sal_Int32 aElement, // TODO, does not matter for the UI. skip. return nullptr; case DGM_TOKEN( sampData ): - mpLayout->getSampData() = std::make_shared<DiagramData>(); + mpLayout->getSampData() = std::make_shared<DiagramData_oox>(); return new DataModelContext( *this, mpLayout->getSampData() ); case DGM_TOKEN( styleData ): - mpLayout->getStyleData() = std::make_shared<DiagramData>(); + mpLayout->getStyleData() = std::make_shared<DiagramData_oox>(); return new DataModelContext( *this, mpLayout->getStyleData() ); case DGM_TOKEN( cat ): case DGM_TOKEN( catLst ): diff --git a/oox/source/drawingml/diagram/diagramhelper.cxx b/oox/source/drawingml/diagram/diagramhelper.cxx index 39b07935b6b5..868da3d15e4d 100644 --- a/oox/source/drawingml/diagram/diagramhelper.cxx +++ b/oox/source/drawingml/diagram/diagramhelper.cxx @@ -17,7 +17,7 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#include "diagramhelper.hxx" +#include <oox/drawingml/diagram/diagramhelper.hxx> #include "diagram.hxx" #include <basegfx/matrix/b2dhommatrix.hxx> @@ -29,6 +29,7 @@ #include <comphelper/processfactory.hxx> #include <oox/drawingml/themefragmenthandler.hxx> #include <com/sun/star/xml/sax/XFastSAXSerializable.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> #include <utility> using namespace ::com::sun::star; @@ -110,7 +111,7 @@ void AdvancedDiagramHelper::reLayout(SdrObjGroup& rTarget) if(UseDiagramThemeData() || !isSelfCreated()) xFilter->setCurrentTheme(getOrCreateThemePtr(xFilter)); - css::uno::Reference< css::lang::XComponent > aComponentModel( rUnoModel, uno::UNO_QUERY ); + uno::Reference< css::lang::XComponent > aComponentModel( rUnoModel, uno::UNO_QUERY ); xFilter->setTargetDocument(aComponentModel); // set DiagramFontHeights @@ -239,7 +240,9 @@ void AdvancedDiagramHelper::TextInformationChange(const OUString& rDiagramDataMo // still reset GrabBag at Associated SdrObjGroup object. There are no "OOX.*" // entries anymore, but others like "mso-rotation-angle" and others - mpAssociatedSdrObjGroup->SetGrabBagItem(uno::Any(uno::Sequence<beans::PropertyValue>())); + uno::Reference<beans::XPropertySet> xPropSet(mxGroupShape, uno::UNO_QUERY); + if (xPropSet->getPropertySetInfo()->hasPropertyByName(u"InteropGrabBag"_ustr)) + xPropSet->setPropertyValue(u"InteropGrabBag"_ustr, uno::Any(uno::Sequence<beans::PropertyValue>())); } } @@ -263,9 +266,9 @@ void AdvancedDiagramHelper::applyDiagramDataState(const svx::diagram::DiagramDat mpDiagramPtr->getData()->applyDiagramDataState(rState); } -void AdvancedDiagramHelper::doAnchor(SdrObjGroup& rTarget, ::oox::drawingml::Shape& rRootShape) +void AdvancedDiagramHelper::doAnchor(uno::Reference<drawing::XShape>& rTarget, ::oox::drawingml::Shape& rRootShape) { - if(!mpDiagramPtr) + if(!mpDiagramPtr || !rTarget) { return; } @@ -325,12 +328,20 @@ uno::Any AdvancedDiagramHelper::getOOXDomValue(svx::diagram::DomMapFlag aDomMapF return uno::Any(); } -bool AdvancedDiagramHelper::checkOrCreateMinimalDataDoms() +bool AdvancedDiagramHelper::checkMinimalDataDoms() const { if (!mpDiagramPtr) return false; - return mpDiagramPtr->checkOrCreateMinimalDataDoms(); + return mpDiagramPtr->checkMinimalDataDoms(); +} + +void AdvancedDiagramHelper::tryToCreateMissingDataDoms(oox::core::XmlFilterBase& rFB) +{ + if (!mpDiagramPtr) + return; + + mpDiagramPtr->tryToCreateMissingDataDoms(rFB, mxGroupShape); } } diff --git a/oox/source/drawingml/diagram/diagramlayoutatoms.cxx b/oox/source/drawingml/diagram/diagramlayoutatoms.cxx index c59f87a6f94f..d70c59cb1ece 100644 --- a/oox/source/drawingml/diagram/diagramlayoutatoms.cxx +++ b/oox/source/drawingml/diagram/diagramlayoutatoms.cxx @@ -909,7 +909,7 @@ bool ConditionAtom::getDecision(const svx::diagram::Point* pPresPoint) const // point, ask the parent. OUString aParent = navigate(mrLayoutNode, svx::diagram::TypeConstant::XML_presParOf, pPresPoint->msModelId, /*bSourceToDestination*/ false); - DiagramData::PointNameMap& rPointNameMap + DiagramData_oox::PointNameMap& rPointNameMap = mrLayoutNode.getDiagram().getData()->getPointNameMap(); auto it = rPointNameMap.find(aParent); if (it != rPointNameMap.end()) @@ -1075,9 +1075,9 @@ bool HasCustomText(const ShapePtr& rShape, LayoutNode& rLayoutNode) { const PresPointShapeMap& rPresPointShapeMap = rLayoutNode.getDiagram().getLayout()->getPresPointShapeMap(); - const DiagramData::StringMap& rPresOfNameMap + const DiagramData_oox::StringMap& rPresOfNameMap = rLayoutNode.getDiagram().getData()->getPresOfNameMap(); - const DiagramData::PointNameMap& rPointNameMap + const DiagramData_oox::PointNameMap& rPointNameMap = rLayoutNode.getDiagram().getData()->getPointNameMap(); // Get the first presentation node of the shape. const svx::diagram::Point* pPresNode = nullptr; @@ -1098,7 +1098,7 @@ bool HasCustomText(const ShapePtr& rShape, LayoutNode& rLayoutNode) { for (const auto& rPair : itPresToData->second) { - const DiagramData::SourceIdAndDepth& rItem = rPair.second; + const DiagramData_oox::SourceIdAndDepth& rItem = rPair.second; auto it = rPointNameMap.find(rItem.msSourceId); if (it != rPointNameMap.end()) { @@ -1872,7 +1872,7 @@ bool LayoutNode::setupShape( const ShapePtr& rShape, const svx::diagram::Point* << "\", modelId \"" << pPresNode->msModelId << "\""); // have the presentation node - now, need the actual data node: - const DiagramData::StringMap::const_iterator aNodeName = mrDgm.getData()->getPresOfNameMap().find( + const DiagramData_oox::StringMap::const_iterator aNodeName = mrDgm.getData()->getPresOfNameMap().find( pPresNode->msModelId); if( aNodeName != mrDgm.getData()->getPresOfNameMap().end() ) { @@ -1886,10 +1886,10 @@ bool LayoutNode::setupShape( const ShapePtr& rShape, const svx::diagram::Point* for (const auto& rPair : aNodeName->second) { - const DiagramData::SourceIdAndDepth& rItem = rPair.second; - DiagramData::PointNameMap& rMap = mrDgm.getData()->getPointNameMap(); + const DiagramData_oox::SourceIdAndDepth& rItem = rPair.second; + DiagramData_oox::PointNameMap& rMap = mrDgm.getData()->getPointNameMap(); // pPresNode is the presentation node of the aDataNode2 data node. - DiagramData::PointNameMap::const_iterator aDataNode2 = rMap.find(rItem.msSourceId); + DiagramData_oox::PointNameMap::const_iterator aDataNode2 = rMap.find(rItem.msSourceId); if (aDataNode2 == rMap.end()) { //busted, skip it diff --git a/oox/source/drawingml/diagram/layoutatomvisitorbase.cxx b/oox/source/drawingml/diagram/layoutatomvisitorbase.cxx index 6ffa1c34e57b..ead3836379ea 100644 --- a/oox/source/drawingml/diagram/layoutatomvisitorbase.cxx +++ b/oox/source/drawingml/diagram/layoutatomvisitorbase.cxx @@ -109,7 +109,7 @@ void LayoutAtomVisitorBase::visit(LayoutNode& rAtom) // stop processing if it's not a child of previous LayoutNode - const DiagramData::PointsNameMap::const_iterator aDataNode + const DiagramData_oox::PointsNameMap::const_iterator aDataNode = mrDgm.getData()->getPointsPresNameMap().find(rAtom.getName()); if (aDataNode == mrDgm.getData()->getPointsPresNameMap().end() || mnCurrIdx >= static_cast<sal_Int32>(aDataNode->second.size())) @@ -158,7 +158,7 @@ void ShallowPresNameVisitor::visit(ForEachAtom& rAtom) void ShallowPresNameVisitor::visit(LayoutNode& rAtom) { - DiagramData::PointsNameMap::const_iterator aDataNode = + DiagramData_oox::PointsNameMap::const_iterator aDataNode = mrDgm.getData()->getPointsPresNameMap().find(rAtom.getName()); if( aDataNode != mrDgm.getData()->getPointsPresNameMap().end() ) mnCnt = std::max(mnCnt, diff --git a/oox/source/drawingml/diagram/layoutatomvisitors.cxx b/oox/source/drawingml/diagram/layoutatomvisitors.cxx index 482894ee159e..3fb520fca75b 100644 --- a/oox/source/drawingml/diagram/layoutatomvisitors.cxx +++ b/oox/source/drawingml/diagram/layoutatomvisitors.cxx @@ -54,7 +54,7 @@ void ShapeCreationVisitor::visit(LayoutNode& rAtom) // stop processing if it's not a child of previous LayoutNode - const DiagramData::PointsNameMap::const_iterator aDataNode + const DiagramData_oox::PointsNameMap::const_iterator aDataNode = mrDgm.getData()->getPointsPresNameMap().find(rAtom.getName()); if (aDataNode == mrDgm.getData()->getPointsPresNameMap().end() || mnCurrIdx >= static_cast<sal_Int32>(aDataNode->second.size())) @@ -218,7 +218,7 @@ void ShapeLayoutingVisitor::visit(LayoutNode& rAtom) // stop processing if it's not a child of previous LayoutNode - const DiagramData::PointsNameMap::const_iterator aDataNode + const DiagramData_oox::PointsNameMap::const_iterator aDataNode = mrDgm.getData()->getPointsPresNameMap().find(rAtom.getName()); if (aDataNode == mrDgm.getData()->getPointsPresNameMap().end() || mnCurrIdx >= static_cast<sal_Int32>(aDataNode->second.size())) diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx index 68a7565e27e7..59c3ce0c93a3 100644 --- a/oox/source/drawingml/shape.cxx +++ b/oox/source/drawingml/shape.cxx @@ -54,8 +54,8 @@ #include <oox/mathml/imexport.hxx> #include <oox/mathml/importutils.hxx> #include <oox/token/properties.hxx> -#include "diagram/datamodel.hxx" -#include "diagram/diagramhelper.hxx" +#include "diagram/datamodel_oox.hxx" +#include <oox/drawingml/diagram/diagramhelper.hxx> #include <comphelper/classids.hxx> #include <comphelper/propertysequence.hxx> @@ -274,11 +274,9 @@ void Shape::propagateDiagramHelper() // Propagate collected Diagram data to data holder if (FRAMETYPE_DIAGRAM == meFrameType && nullptr != mpDiagramHelper) { - SdrObjGroup* pAnchorObj = dynamic_cast<SdrObjGroup*>(SdrObject::getSdrObjectFromXShape(mxShape)); - - if(pAnchorObj) + if (mxShape) { - mpDiagramHelper->doAnchor(*pAnchorObj, *this); + mpDiagramHelper->doAnchor(mxShape, *this); mpDiagramHelper = nullptr; } } diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index 327724d81c1a..42c7ddb61876 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -19,6 +19,7 @@ #include <config_features.h> +#include <oox/drawingml/diagram/diagramhelper.hxx> #include <config_folders.h> #include <rtl/bootstrap.hxx> #include <sal/log.hxx> @@ -6807,9 +6808,9 @@ OString DrawingML::WriteWdpPicture( const OUString& rFileId, const Sequence< sal return OUStringToOString(aId, RTL_TEXTENCODING_UTF8); } -bool DrawingML::PrepareToWriteAsDiagram(const css::uno::Reference<css::drawing::XShape>& rXShape) +bool DrawingML::PrepareToWriteAsDiagram(const css::uno::Reference<css::drawing::XShape>& rXRootShape) { - SdrObject* pObj(SdrObject::getSdrObjectFromXShape(rXShape)); + SdrObject* pObj(SdrObject::getSdrObjectFromXShape(rXRootShape)); if (nullptr == pObj) return false; @@ -6819,7 +6820,15 @@ bool DrawingML::PrepareToWriteAsDiagram(const css::uno::Reference<css::drawing:: if (!rIDiagramHelper) return false; - if (!rIDiagramHelper->checkOrCreateMinimalDataDoms()) + AdvancedDiagramHelper* pAdvancedDiagramHelper = static_cast<AdvancedDiagramHelper*>(rIDiagramHelper.get()); + + if (nullptr == pAdvancedDiagramHelper) + return false; + + // try to re-create (if needed is decided there) + pAdvancedDiagramHelper->tryToCreateMissingDataDoms(*GetFB()); + + if (!pAdvancedDiagramHelper->checkMinimalDataDoms()) return false; return true; @@ -6827,9 +6836,6 @@ bool DrawingML::PrepareToWriteAsDiagram(const css::uno::Reference<css::drawing:: void DrawingML::WriteDiagram(const css::uno::Reference<css::drawing::XShape>& rXShape, sal_Int32 nDiagramId, sal_Int32 nShapeId) { - if (!PrepareToWriteAsDiagram(rXShape)) - return; - SdrObject* pObj = SdrObject::getSdrObjectFromXShape(rXShape); assert(pObj && "no SdrObject"); assert(pObj->isDiagram() && "is no Diagram"); @@ -6837,6 +6843,12 @@ void DrawingML::WriteDiagram(const css::uno::Reference<css::drawing::XShape>& rX const std::shared_ptr< svx::diagram::IDiagramHelper >& rIDiagramHelper(pObj->getDiagramHelper()); assert(rIDiagramHelper && "has no DiagramHelper"); + const AdvancedDiagramHelper* pAdvancedDiagramHelper = static_cast<AdvancedDiagramHelper*>(rIDiagramHelper.get()); + assert(pAdvancedDiagramHelper && "has no DiagramHelper"); + + if (!pAdvancedDiagramHelper->checkMinimalDataDoms()) + return; + // get/check mandatory DomS uno::Reference<xml::dom::XDocument> dataDom; rIDiagramHelper->getOOXDomValue(svx::diagram::DomMapFlag::OOXData) >>= dataDom; diff --git a/sd/source/filter/eppt/pptx-epptooxml.cxx b/sd/source/filter/eppt/pptx-epptooxml.cxx index 89433ebf257c..6614002a4315 100644 --- a/sd/source/filter/eppt/pptx-epptooxml.cxx +++ b/sd/source/filter/eppt/pptx-epptooxml.cxx @@ -2369,7 +2369,7 @@ void PowerPointExport::WriteShapeTree(const FSHelperPtr& pFS, PageType ePageType bool bIsDiagram(nullptr != pDiagramCandidate && pDiagramCandidate->isDiagram()); // check if export as Diagram is possible - if (bIsDiagram && !oox::drawingml::DrawingML::PrepareToWriteAsDiagram(mXShape)) + if (bIsDiagram && !aDML.PrepareToWriteAsDiagram(mXShape)) bIsDiagram = false; if (bIsDiagram) diff --git a/solenv/clang-format/excludelist b/solenv/clang-format/excludelist index c4c926484be4..55f3e4a38c3d 100644 --- a/solenv/clang-format/excludelist +++ b/solenv/clang-format/excludelist @@ -5149,6 +5149,7 @@ include/oox/drawingml/clrscheme.hxx include/oox/drawingml/color.hxx include/oox/drawingml/connectorshapecontext.hxx include/oox/drawingml/diagram/diagram.hxx +include/oox/drawingml/diagram/diagramhelper.hxx include/oox/drawingml/drawingmltypes.hxx include/oox/drawingml/graphicshapecontext.hxx include/oox/drawingml/shape.hxx @@ -5673,7 +5674,7 @@ include/svx/sdgmoitm.hxx include/svx/sdmetitm.hxx include/svx/sdooitm.hxx include/svx/sdprcitm.hxx -include/svx/diagram/datamodel.hxx +include/svx/diagram/datamodel_svx.hxx include/svx/diagram/IDiagramHelper.hxx include/svx/sdr/animation/animationstate.hxx include/svx/sdr/animation/objectanimator.hxx @@ -6830,10 +6831,9 @@ oox/source/drawingml/customshapegeometry.cxx oox/source/drawingml/customshapeproperties.cxx oox/source/drawingml/diagram/constraintlistcontext.cxx oox/source/drawingml/diagram/constraintlistcontext.hxx -oox/source/drawingml/diagram/datamodel.cxx -oox/source/drawingml/diagram/datamodel.hxx +oox/source/drawingml/diagram/datamodel_oox.cxx +oox/source/drawingml/diagram/datamodel_oox.hxx oox/source/drawingml/diagram/diagramhelper.cxx -oox/source/drawingml/diagram/diagramhelper.hxx oox/source/drawingml/diagram/datamodelcontext.cxx oox/source/drawingml/diagram/datamodelcontext.hxx oox/source/drawingml/diagram/diagram.cxx @@ -11121,7 +11121,7 @@ svx/source/customshapes/EnhancedCustomShapeGeometry.cxx svx/source/customshapes/EnhancedCustomShapeHandle.cxx svx/source/customshapes/EnhancedCustomShapeHandle.hxx svx/source/customshapes/EnhancedCustomShapeTypeNames.cxx -svx/source/diagram/datamodel.cxx +svx/source/diagram/datamodel_svx.cxx svx/source/diagram/IDiagramHelper.cxx svx/source/dialog/ClassificationDialog.cxx svx/source/dialog/ClassificationEditView.cxx diff --git a/svx/Library_svxcore.mk b/svx/Library_svxcore.mk index 4487586a7b35..ce5ddb80a883 100644 --- a/svx/Library_svxcore.mk +++ b/svx/Library_svxcore.mk @@ -117,7 +117,7 @@ $(eval $(call gb_Library_add_exception_objects,svxcore,\ svx/source/customshapes/EnhancedCustomShapeFunctionParser \ svx/source/customshapes/EnhancedCustomShapeGeometry \ svx/source/customshapes/EnhancedCustomShapeTypeNames \ - svx/source/diagram/datamodel \ + svx/source/diagram/datamodel_svx \ svx/source/diagram/IDiagramHelper \ svx/source/dialog/dialmgr \ svx/source/dialog/dlgutil \ diff --git a/svx/source/diagram/IDiagramHelper.cxx b/svx/source/diagram/IDiagramHelper.cxx index 846aae7ca113..903d3b50e0da 100644 --- a/svx/source/diagram/IDiagramHelper.cxx +++ b/svx/source/diagram/IDiagramHelper.cxx @@ -410,7 +410,7 @@ IDiagramHelper::IDiagramHelper(bool bSelfCreated) , mbUseDiagramModelData(true) , mbForceThemePtrRecreation(false) , mbSelfCreated(bSelfCreated) -, mpAssociatedSdrObjGroup(nullptr) +, mxGroupShape() { } @@ -418,26 +418,35 @@ IDiagramHelper::~IDiagramHelper() {} void IDiagramHelper::disconnectFromSdrObjGroup() { - if (nullptr != mpAssociatedSdrObjGroup) + SdrObjGroup* pGroupObject(dynamic_cast<SdrObjGroup*>(SdrObject::getSdrObjectFromXShape(mxGroupShape))); + if (nullptr != pGroupObject) { - auto const p = mpAssociatedSdrObjGroup; - mpAssociatedSdrObjGroup = nullptr; - p->mp_DiagramHelper.reset(); + mxGroupShape.clear(); + pGroupObject->mp_DiagramHelper.reset(); } } -void IDiagramHelper::connectToSdrObjGroup(SdrObjGroup& rTarget) +void IDiagramHelper::connectToSdrObjGroup(com::sun::star::uno::Reference< com::sun::star::drawing::XShape >& rTarget) { - if (mpAssociatedSdrObjGroup == &rTarget && rTarget.mp_DiagramHelper.get() == this) - // connection already established - return; + SdrObjGroup* pGroupObject(nullptr); + if (pGroupObject && mxGroupShape && rTarget == mxGroupShape) + { + pGroupObject = dynamic_cast<SdrObjGroup*>(SdrObject::getSdrObjectFromXShape(mxGroupShape)); + if (pGroupObject != nullptr && pGroupObject->mp_DiagramHelper.get() == this) + { + // connection already established + return; + } + } // ensure unconnect if already connected disconnectFromSdrObjGroup(); // connect to target - mpAssociatedSdrObjGroup = &rTarget; - rTarget.mp_DiagramHelper.reset(this); + mxGroupShape = rTarget; + pGroupObject = dynamic_cast<SdrObjGroup*>(SdrObject::getSdrObjectFromXShape(mxGroupShape)); + if (nullptr != pGroupObject) + pGroupObject->mp_DiagramHelper.reset(this);; } void IDiagramHelper::AddAdditionalVisualization(const SdrObjGroup& rTarget, SdrHdlList& rHdlList) diff --git a/svx/source/diagram/datamodel.cxx b/svx/source/diagram/datamodel_svx.cxx similarity index 62% rename from svx/source/diagram/datamodel.cxx rename to svx/source/diagram/datamodel_svx.cxx index f72445a7819f..0bdf354945c3 100644 --- a/svx/source/diagram/datamodel.cxx +++ b/svx/source/diagram/datamodel_svx.cxx @@ -21,14 +21,41 @@ #include <algorithm> #include <fstream> -#include <svx/diagram/datamodel.hxx> +#include <svx/diagram/datamodel_svx.hxx> #include <svx/svdoutl.hxx> #include <comphelper/xmltools.hxx> #include <sal/log.hxx> #include <utility> +#include <sax/fastattribs.hxx> + +using namespace ::oox; namespace svx::diagram { +namespace { +void addTypeConstantToFastAttributeList(TypeConstant aTypeConstant, rtl::Reference<sax_fastparser::FastAttributeList>& rAttributeList) +{ + if (TypeConstant::XML_none != aTypeConstant) + { + switch (aTypeConstant) + { + case TypeConstant::XML_type: rAttributeList->add(XML_type, "Type"); break; + case TypeConstant::XML_asst: rAttributeList->add(XML_type, "asst"); break; + case TypeConstant::XML_doc: rAttributeList->add(XML_type, "doc"); break; + case TypeConstant::XML_node: /* XML_node is default, no need to write */ break; + case TypeConstant::XML_norm: rAttributeList->add(XML_type, "norm"); break; + case TypeConstant::XML_parOf: rAttributeList->add(XML_type, "parOf"); break; + case TypeConstant::XML_parTrans: rAttributeList->add(XML_type, "parTrans"); break; + case TypeConstant::XML_pres: rAttributeList->add(XML_type, "pres"); break; + case TypeConstant::XML_presOf: rAttributeList->add(XML_type, "presOf"); break; + case TypeConstant::XML_presParOf: rAttributeList->add(XML_type, "presParOf"); break; + case TypeConstant::XML_rel: rAttributeList->add(XML_type, "rel"); break; + case TypeConstant::XML_sibTrans: rAttributeList->add(XML_type, "sibTrans"); break; + default: break; // XML_none + } + } +}} + Connection::Connection() : mnXMLType( XML_none ) , mnSourceOrder( 0 ) @@ -36,6 +63,26 @@ Connection::Connection() { } +void Connection::writeDiagramData(sax_fastparser::FSHelperPtr& rTarget) +{ + if (!rTarget) + return; + + rtl::Reference<sax_fastparser::FastAttributeList> pAttributeList(sax_fastparser::FastSerializerHelper::createAttrList()); + + addTypeConstantToFastAttributeList(mnXMLType, pAttributeList); + if (!msModelId.isEmpty()) pAttributeList->add(XML_modelId, msModelId); + if (!msSourceId.isEmpty()) pAttributeList->add(XML_srcId, msSourceId); + if (!msDestId.isEmpty()) pAttributeList->add(XML_destId, msDestId); + if (!msPresId.isEmpty()) pAttributeList->add(XML_presId, msPresId); + if (!msSibTransId.isEmpty()) pAttributeList->add(XML_sibTransId, msSibTransId); + if (!msParTransId.isEmpty()) pAttributeList->add(XML_parTransId, msParTransId); + if (0 != mnSourceOrder) pAttributeList->add(XML_srcOrd, OUString::number(mnSourceOrder)); + if (0 != mnDestOrder) pAttributeList->add(XML_destOrd, OUString::number(mnDestOrder)); + + rTarget->singleElementNS(XML_dgm, XML_cxn, pAttributeList); +} + Point::Point() : msTextBody(std::make_shared< TextBody >()) , msPointStylePtr(std::make_shared< PointStyle >()) @@ -43,7 +90,6 @@ Point::Point() , mnMaxChildren(-1) , mnPreferredChildren(-1) , mnDirection(XML_norm) -, mnResizeHandles(XML_rel) , mnCustomAngle(-1) , mnPercentageNeighbourWidth(-1) , mnPercentageNeighbourHeight(-1) @@ -67,15 +113,151 @@ Point::Point() { } -DiagramData::DiagramData() +void Point::writeDiagramData(sax_fastparser::FSHelperPtr& rTarget) +{ + if (!rTarget) + return; + + rtl::Reference<sax_fastparser::FastAttributeList> pAttributeList(sax_fastparser::FastSerializerHelper::createAttrList()); + pAttributeList->add(XML_modelId, msModelId); + + addTypeConstantToFastAttributeList(mnXMLType, pAttributeList); + + if (!msCnxId.isEmpty()) + pAttributeList->add(XML_cxnId, msCnxId); + + rTarget->startElementNS(XML_dgm, XML_pt, pAttributeList); + + pAttributeList->clear(); + + if (!msColorTransformCategoryId.isEmpty()) pAttributeList->add(XML_csCatId, msColorTransformCategoryId); + if (!msColorTransformTypeId.isEmpty()) pAttributeList->add(XML_csTypeId, msColorTransformTypeId); + if (!msLayoutCategoryId.isEmpty()) pAttributeList->add(XML_loCatId, msLayoutCategoryId); + if (!msLayoutTypeId.isEmpty()) pAttributeList->add(XML_loTypeId, msLayoutTypeId); + if (!msPlaceholderText.isEmpty()) pAttributeList->add(XML_phldrT, msPlaceholderText); + if (!msPresentationAssociationId.isEmpty()) pAttributeList->add(XML_presAssocID, msPresentationAssociationId); + if (!msPresentationLayoutName.isEmpty()) pAttributeList->add(XML_presName, msPresentationLayoutName); + if (!msPresentationLayoutStyleLabel.isEmpty()) pAttributeList->add(XML_presStyleLbl, msPresentationLayoutStyleLabel); + if (!msQuickStyleCategoryId.isEmpty()) pAttributeList->add(XML_qsCatId, msQuickStyleCategoryId); + if (!msQuickStyleTypeId.isEmpty()) pAttributeList->add(XML_qsTypeId, msQuickStyleTypeId); + + if (-1 != mnCustomAngle) pAttributeList->add(XML_custAng, OUString::number(mnCustomAngle)); + if (-1 != mnPercentageNeighbourWidth) pAttributeList->add(XML_custLinFactNeighborX, OUString::number(mnPercentageNeighbourWidth)); + if (-1 != mnPercentageNeighbourHeight) pAttributeList->add(XML_custLinFactNeighborY, OUString::number(mnPercentageNeighbourHeight)); + if (-1 != mnPercentageOwnWidth) pAttributeList->add(XML_custLinFactX, OUString::number(mnPercentageOwnWidth)); + if (-1 != mnPercentageOwnHeight) pAttributeList->add(XML_custLinFactY, OUString::number(mnPercentageOwnHeight)); + if (-1 != mnIncludeAngleScale) pAttributeList->add(XML_custRadScaleInc, OUString::number(mnIncludeAngleScale)); + if (-1 != mnRadiusScale) pAttributeList->add(XML_custRadScaleRad, OUString::number(mnRadiusScale)); + if (-1 != mnWidthScale) pAttributeList->add(XML_custScaleX, OUString::number(mnWidthScale)); + if (-1 != mnHeightScale) pAttributeList->add(XML_custScaleY, OUString::number(mnHeightScale)); + if (-1 != mnWidthOverride) pAttributeList->add(XML_custSzX, OUString::number(mnWidthOverride)); + if (-1 != mnHeightOverride) pAttributeList->add(XML_custSzY, OUString::number(mnHeightOverride)); + if (-1 != mnLayoutStyleCount) pAttributeList->add(XML_presStyleCnt, OUString::number(mnLayoutStyleCount)); + if (-1 != mnLayoutStyleIndex) pAttributeList->add(XML_presStyleIdx, OUString::number(mnLayoutStyleIndex)); + + static constexpr OUString aStrTrue = u"1"_ustr; // this uses "1", not "true" + if (true == mbCoherent3DOffset) pAttributeList->add(XML_coherent3DOff, aStrTrue); + if (true == mbCustomHorizontalFlip) pAttributeList->add(XML_custFlipHor, aStrTrue); + if (true == mbCustomVerticalFlip) pAttributeList->add(XML_custFlipVert, aStrTrue); + if (true == mbCustomText) pAttributeList->add(XML_custT, aStrTrue); + if (true == mbIsPlaceholder) pAttributeList->add(XML_phldr, aStrTrue); + + const bool bNeed_presLayoutVars(mbBulletEnabled + || -1 != mnMaxChildren + || -1 != mnPreferredChildren + || XML_norm != mnDirection + || moHierarchyBranch.has_value() + || mbOrgChartEnabled + || !msResizeHandles.isEmpty()); + + if (bNeed_presLayoutVars) + { + rTarget->startElementNS(XML_dgm, XML_prSet, pAttributeList); + rTarget->startElementNS(XML_dgm, XML_presLayoutVars); + + if (mbBulletEnabled) + rTarget->singleElementNS(XML_dgm, XML_bulletEnabled, XML_val, aStrTrue); + + if (-1 != mnMaxChildren) + rTarget->singleElementNS(XML_dgm, XML_chMax, XML_val, OUString::number(mnMaxChildren)); + + if (-1 != mnPreferredChildren) + rTarget->singleElementNS(XML_dgm, XML_chPref, XML_val, OUString::number(mnPreferredChildren)); + + if (XML_norm != mnDirection) + rTarget->singleElementNS(XML_dgm, XML_dir, XML_val, OString::number(mnDirection)); + + if (moHierarchyBranch.has_value()) + rTarget->singleElementNS(XML_dgm, XML_hierBranch, XML_val, OString::number(moHierarchyBranch.value())); + + if (mbOrgChartEnabled) + rTarget->singleElementNS(XML_dgm, XML_orgChart, XML_val, aStrTrue); + + if (!msResizeHandles.isEmpty()) + rTarget->singleElementNS(XML_dgm, XML_resizeHandles, XML_val, msResizeHandles); + + rTarget->endElementNS(XML_dgm, XML_presLayoutVars); + rTarget->endElementNS(XML_dgm, XML_prSet); + } + else + rTarget->singleElementNS(XML_dgm, XML_prSet, pAttributeList); + + rTarget->singleElementNS(XML_dgm, XML_spPr); + + bool bWriteText(TypeConstant::XML_parTrans == mnXMLType || TypeConstant::XML_sibTrans == mnXMLType); + + if (!bWriteText && "textNode" == msPresentationLayoutName) + bWriteText = true; + + const bool bTextEmpty(msTextBody->msText.isEmpty()); + if (!bWriteText && !bTextEmpty) + bWriteText = true; + + if(bWriteText) + { + // for writing text we would need to use the XShape containing it, and DrawingML::WriteText. + // we *could* find the XShape that is referencing this svx::diagram::Point, the text should + // be set there. + // For now, just make a rough export to get this started. This will have to be enhanced in + // the future, either by using XShape or by implementing exporting the raw MSO XML data we + // have here at the mnodel from import - which implies that that is what gets changed when + // text or textAttributes get changed, plus a re-creation of the XShapes in the GroupObject + rTarget->startElementNS(XML_dgm, XML_t); + rTarget->singleElementNS(XML_a, XML_bodyPr); + rTarget->singleElementNS(XML_a, XML_lstStyle); + rTarget->startElementNS(XML_a, XML_p); + + if (bTextEmpty) + { + rTarget->singleElementNS(XML_a, XML_endParaRPr, XML_lang, "en-US"); + } + else + { + rTarget->startElementNS(XML_a, XML_r); + rTarget->singleElementNS(XML_a, XML_rPr, XML_lang, "de-DE", XML_dirty, "0", XML_smtClean, "0"); + rTarget->startElementNS(XML_a, XML_t); + rTarget->write(msTextBody->msText); + rTarget->endElementNS(XML_a, XML_t); + rTarget->endElementNS(XML_a, XML_r); + rTarget->singleElementNS(XML_a, XML_endParaRPr, XML_lang, "en-US", XML_dirty, "0"); + } + + rTarget->endElementNS(XML_a, XML_p); + rTarget->endElementNS(XML_dgm, XML_t); + } + + rTarget->endElementNS(XML_dgm, XML_pt); +} + +DiagramData_svx::DiagramData_svx() { } -DiagramData::~DiagramData() +DiagramData_svx::~DiagramData_svx() { } -const Point* DiagramData::getRootPoint() const +const Point* DiagramData_svx::getRootPoint() const { for (const auto & aCurrPoint : maPoints) if (aCurrPoint.mnXMLType == TypeConstant::XML_doc) @@ -85,7 +267,7 @@ const Point* DiagramData::getRootPoint() const return nullptr; } -OUString DiagramData::getString() const +OUString DiagramData_svx::getString() const { OUStringBuffer aBuf; const Point* pPoint = getRootPoint(); @@ -93,7 +275,7 @@ OUString DiagramData::getString() const return aBuf.makeStringAndClear(); } -DomMapFlags DiagramData::removeDiagramNode(const OUString& rNodeId) +DomMapFlags DiagramData_svx::removeDiagramNode(const OUString& rNodeId) { DomMapFlags aRetval; @@ -143,8 +325,9 @@ DomMapFlags DiagramData::removeDiagramNode(const OUString& rNodeId) // prepare retval, OOXData and OOXLayout is changed aRetval.push_back(DomMapFlag::OOXData); - aRetval.push_back(DomMapFlag::OOXDataRels); - aRetval.push_back(DomMapFlag::OOXLayout); + // aRetval.push_back(DomMapFlag::OOXDrawing); + // aRetval.push_back(DomMapFlag::OOXDataRels); + // aRetval.push_back(DomMapFlag::OOXLayout); return aRetval; } @@ -155,14 +338,14 @@ DiagramDataState::DiagramDataState(Connections aConnections, Points aPoints) { } -DiagramDataStatePtr DiagramData::extractDiagramDataState() const +DiagramDataStatePtr DiagramData_svx::extractDiagramDataState() const { // Just copy all Connections && Points. The shared_ptr data in // Point-entries is no problem, it just continues exiting shared return std::make_shared< DiagramDataState >(maConnections, maPoints); } -void DiagramData::applyDiagramDataState(const DiagramDataStatePtr& rState) +void DiagramData_svx::applyDiagramDataState(const DiagramDataStatePtr& rState) { if(rState) { @@ -176,7 +359,7 @@ void DiagramData::applyDiagramDataState(const DiagramDataStatePtr& rState) } } -void DiagramData::getChildrenString( +void DiagramData_svx::getChildrenString( OUStringBuffer& rBuf, const svx::diagram::Point* pPoint, sal_Int32 nLevel) const @@ -209,7 +392,7 @@ void DiagramData::getChildrenString( getChildrenString(rBuf, pChild, nLevel + 1); } -std::vector<std::pair<OUString, OUString>> DiagramData::getChildren(const OUString& rParentId) const +std::vector<std::pair<OUString, OUString>> DiagramData_svx::getChildren(const OUString& rParentId) const { const OUString sModelId = rParentId.isEmpty() ? getRootPoint()->msModelId : rParentId; std::vector<std::pair<OUString, OUString>> aChildren; @@ -233,7 +416,7 @@ std::vector<std::pair<OUString, OUString>> DiagramData::getChildren(const OUStri return aChildren; } -std::pair<OUString, DomMapFlags> DiagramData::addDiagramNode(const OUString& rText) +std::pair<OUString, DomMapFlags> DiagramData_svx::addDiagramNode(const OUString& rText) { DomMapFlags aRetval; const svx::diagram::Point& rDataRoot = *getRootPoint(); @@ -287,13 +470,14 @@ std::pair<OUString, DomMapFlags> DiagramData::addDiagramNode(const OUString& rTe // prepare retval, OOXData and OOXLayout is changed aRetval.push_back(DomMapFlag::OOXData); - aRetval.push_back(DomMapFlag::OOXDataRels); - aRetval.push_back(DomMapFlag::OOXLayout); + // aRetval.push_back(DomMapFlag::OOXDrawing); + // aRetval.push_back(DomMapFlag::OOXDataRels); + // aRetval.push_back(DomMapFlag::OOXLayout); return std::make_pair(sNewNodeId, aRetval); } -void DiagramData::addConnection(svx::diagram::TypeConstant nType, const OUString& sSourceId, const OUString& sDestId) +void DiagramData_svx::addConnection(svx::diagram::TypeConstant nType, const OUString& sSourceId, const OUString& sDestId) { sal_Int32 nMaxOrd = -1; for (const auto& aCxn : maConnections) @@ -348,7 +532,7 @@ static sal_Int32 calcDepth( std::u16string_view rNodeName, return 0; } -void DiagramData::buildDiagramDataModel(bool /*bClearOoxShapes*/) +void DiagramData_svx::buildDiagramDataModel(bool /*bClearOoxShapes*/) { // build name-object maps maPointNameMap.clear(); @@ -419,11 +603,11 @@ void DiagramData::buildDiagramDataModel(bool /*bClearOoxShapes*/) const bool bInserted1 = getPointNameMap().insert( std::make_pair(point.msModelId,&point)).second; - SAL_WARN_IF(!bInserted1, "oox.drawingml", "DiagramData::build(): non-unique point model id"); + SAL_WARN_IF(!bInserted1, "oox.drawingml", "DiagramData_svx::build(): non-unique point model id"); if( !point.msPresentationLayoutName.isEmpty() ) { - DiagramData::PointsNameMap::value_type::second_type& rVec= + DiagramData_svx::PointsNameMap::value_type::second_type& rVec= getPointsPresNameMap()[point.msPresentationLayoutName]; rVec.push_back(&point); } @@ -484,17 +668,17 @@ void DiagramData::buildDiagramDataModel(bool /*bClearOoxShapes*/) const bool bInserted1 = maConnectionNameMap.insert( std::make_pair(connection.msModelId,&connection)).second; - SAL_WARN_IF(!bInserted1, "oox.drawingml", "DiagramData::build(): non-unique connection model id"); + SAL_WARN_IF(!bInserted1, "oox.drawingml", "DiagramData_svx::build(): non-unique connection model id"); if( connection.mnXMLType == TypeConstant::XML_presOf ) { - DiagramData::StringMap::value_type::second_type& rVec = getPresOfNameMap()[connection.msDestId]; + DiagramData_svx::StringMap::value_type::second_type& rVec = getPresOfNameMap()[connection.msDestId]; rVec[connection.mnDestOrder] = { connection.msSourceId, sal_Int32(0) }; } } // assign outline levels - DiagramData::StringMap& rStringMap = getPresOfNameMap(); + DiagramData_svx::StringMap& rStringMap = getPresOfNameMap(); for (auto & elemPresOf : rStringMap) { for (auto & elem : elemPresOf.second) @@ -508,7 +692,7 @@ void DiagramData::buildDiagramDataModel(bool /*bClearOoxShapes*/) #endif } -DomMapFlags DiagramData::TextInformationChange(const OUString& rDiagramDataModelID, Outliner& rOutl) +DomMapFlags DiagramData_svx::TextInformationChange(const OUString& rDiagramDataModelID, Outliner& rOutl) { DomMapFlags aRetval; @@ -556,7 +740,8 @@ DomMapFlags DiagramData::TextInformationChange(const OUString& rDiagramDataModel // prepare retval, OOXData is changed aRetval.push_back(DomMapFlag::OOXData); - aRetval.push_back(DomMapFlag::OOXDataRels); + // aRetval.push_back(DomMapFlag::OOXDrawing); + // aRetval.push_back(DomMapFlag::OOXDataRels); return aRetval; } diff --git a/svx/source/svdraw/svdundo.cxx b/svx/source/svdraw/svdundo.cxx index e64cb643b202..e712fc037821 100644 --- a/svx/source/svdraw/svdundo.cxx +++ b/svx/source/svdraw/svdundo.cxx @@ -44,7 +44,7 @@ #include <svx/svdoashp.hxx> #include <sal/log.hxx> #include <osl/diagnose.h> -#include <svx/diagram/datamodel.hxx> +#include <svx/diagram/datamodel_svx.hxx> #include <svx/diagram/IDiagramHelper.hxx> #include <tools/debug.hxx>
