diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:06:44 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:06:44 +0000 |
commit | ed5640d8b587fbcfed7dd7967f3de04b37a76f26 (patch) | |
tree | 7a5f7c6c9d02226d7471cb3cc8fbbf631b415303 /include/svx/diagram | |
parent | Initial commit. (diff) | |
download | libreoffice-ed5640d8b587fbcfed7dd7967f3de04b37a76f26.tar.xz libreoffice-ed5640d8b587fbcfed7dd7967f3de04b37a76f26.zip |
Adding upstream version 4:7.4.7.upstream/4%7.4.7upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'include/svx/diagram')
-rw-r--r-- | include/svx/diagram/IDiagramHelper.hxx | 118 | ||||
-rw-r--r-- | include/svx/diagram/datamodel.hxx | 274 |
2 files changed, 392 insertions, 0 deletions
diff --git a/include/svx/diagram/IDiagramHelper.hxx b/include/svx/diagram/IDiagramHelper.hxx new file mode 100644 index 000000000..e93056f70 --- /dev/null +++ b/include/svx/diagram/IDiagramHelper.hxx @@ -0,0 +1,118 @@ +/* -*- 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/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include <vector> +#include <svx/svxdllapi.h> +#include <rtl/ustring.hxx> +#include <svx/svdhdl.hxx> + +// Forward declarations +class SdrObjGroup; +class SdrHdlList; + +namespace svx { namespace diagram { + +// Helper class to visualize an imminently recognizable +// additional visualization for DynamicDiagrams that can also +// be used to show/hide the DiagramDialog by the user +// Note: is also used as additional drag/move handle +class SVXCORE_DLLPUBLIC DiagramFrameHdl final : public SdrHdl +{ + // object dimensions + basegfx::B2DHomMatrix maTransformation; + + // create marker for this kind + virtual void CreateB2dIAObject() override; + +public: + DiagramFrameHdl(const basegfx::B2DHomMatrix& rTransformation); + + static void clicked(const Point& rPnt); +}; + +class DiagramDataState; + +// Helper class to allow administer advanced Diagram related +// data and functionality +class SVXCORE_DLLPUBLIC IDiagramHelper +{ +private: + // These values define behaviour to where take data from at re-creation time. + // Different definitions will have different consequences for re-creation + // of Diagram visualization (if needed/triggered). + // The style attributes per shape e.g. can be re-stored frm either an + // existing Theme, or the preserved key/value list of properties per XShape. + // With the current default settings the re-creation uses the preserved + // key/value pairs, but re-creation from Theme may also be desirable. It + // is also good to preserve both data packages at initial import to allow + // alternatively one of these two methods for re-construction + + // If true, the oox::Theme data from ::DiagramData get/set/ThemeDocument() + // aka mxThemeDocument - if it exists - will be used to create the style + // attributes for the to-be-created XShapes (theoretically allows re-creation + // with other Theme) + bool mbUseDiagramThemeData; // false + + // If true, the UNO API form of attributes per Point as Key/value list + // that was secured after initial XShape creation is used to create the + // style attributes for the to-be-created XShapes + bool mbUseDiagramModelData; // true + + // If true and mxThemeDocument exists it will be re-imported to + // a newly created oox::drawingml::Theme object + bool mbForceThemePtrRecreation; // false + +protected: + void anchorToSdrObjGroup(SdrObjGroup& rTarget); + +public: + IDiagramHelper(); + virtual ~IDiagramHelper(); + + // re-create XShapes + virtual void reLayout(SdrObjGroup& rTarget) = 0; + + // get text representation of data tree + virtual OUString getString() const = 0; + + // get children of provided data node + // use empty string for top-level nodes + // returns vector of (id, text) + virtual std::vector<std::pair<OUString, OUString>> + getChildren(const OUString& rParentId) const = 0; + + // add/remove new top-level node to data model, returns its id + virtual OUString addNode(const OUString& rText) = 0; + virtual bool removeNode(const OUString& rNodeId) = 0; + + // Undo/Redo helpers for extracting/restoring Diagram-defining data + virtual std::shared_ptr<svx::diagram::DiagramDataState> extractDiagramDataState() const = 0; + virtual void applyDiagramDataState(const std::shared_ptr<svx::diagram::DiagramDataState>& rState) = 0; + + bool UseDiagramThemeData() const { return mbUseDiagramThemeData; } + bool UseDiagramModelData() const { return mbUseDiagramModelData; } + bool ForceThemePtrRecreation() const { return mbForceThemePtrRecreation; }; + + static void AddAdditionalVisualization(const SdrObjGroup& rTarget, SdrHdlList& rHdlList); +}; + +}} // end of namespace +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/svx/diagram/datamodel.hxx b/include/svx/diagram/datamodel.hxx new file mode 100644 index 000000000..850cd8f78 --- /dev/null +++ b/include/svx/diagram/datamodel.hxx @@ -0,0 +1,274 @@ +/* -*- 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/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SVX_DIAGRAM_DATAMODEL_HXX +#define INCLUDED_SVX_DIAGRAM_DATAMODEL_HXX + +#include <vector> +#include <optional> +#include <map> + +#include <svx/svxdllapi.h> +#include <rtl/ustring.hxx> +#include <rtl/ustrbuf.hxx> + +#include <com/sun/star/xml/dom/XDocument.hpp> +#include <com/sun/star/drawing/XShape.hpp> + +namespace svx::diagram { + +enum TypeConstant { + XML_none = 0, + XML_type = 395, + XML_asst = 680, + XML_doc = 1924, + XML_node = 3596, + XML_norm = 3609, + XML_parOf = 3878, + XML_parTrans = 3879, + XML_pres = 4085, + XML_presOf = 4090, + XML_presParOf = 4091, + XML_rel = 4298, + XML_sibTrans = 4746, +}; + +/** A Connection + */ +struct SVXCORE_DLLPUBLIC Connection +{ + Connection(); + + TypeConstant mnXMLType; + OUString msModelId; + OUString msSourceId; + OUString msDestId; + OUString msParTransId; + OUString msPresId; + OUString msSibTransId; + sal_Int32 mnSourceOrder; + sal_Int32 mnDestOrder; + +}; + +typedef std::vector< Connection > Connections; + +/** Text and properties for a point + * For proof of concept to make TextData available in svx level this + * is in a first run pretty simple, but may need to be extended accordingly + * up to similar data as in oox::drawingml::TextBody. + */ +struct SVXCORE_DLLPUBLIC TextBody +{ + // text from 1st paragraph (1st run) + OUString msText; + + // attributes from TextBody::getTextProperties() + std::vector< std::pair< OUString, css::uno::Any >> maTextProps; +}; + +typedef std::shared_ptr< TextBody > TextBodyPtr; + +/** Styles for a Point (FillStyle/LineStyle/...) + */ +struct SVXCORE_DLLPUBLIC PointStyle +{ + // attributes (LineStyle/FillStyle/...) + std::vector< std::pair< OUString, css::uno::Any >> maProperties; +}; + +typedef std::shared_ptr< PointStyle > PointStylePtr; + +/** A point + */ +struct SVXCORE_DLLPUBLIC Point +{ + Point(); + + // The minimal text data from the imported Diagram + // in source format + TextBodyPtr msTextBody; + + // The property sequence of pairs<OUString, css::uno::Any>, + // interpreted & assigned by the ::addShape(s) creators in the + // import filter that created a XShape associated/based on this entry + PointStylePtr msPointStylePtr; + + OUString msCnxId; + OUString msModelId; + OUString msColorTransformCategoryId; + OUString msColorTransformTypeId; + OUString msLayoutCategoryId; + OUString msLayoutTypeId; + OUString msPlaceholderText; + OUString msPresentationAssociationId; + OUString msPresentationLayoutName; + OUString msPresentationLayoutStyleLabel; + OUString msQuickStyleCategoryId; + OUString msQuickStyleTypeId; + + 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; + sal_Int32 mnPercentageOwnWidth; + sal_Int32 mnPercentageOwnHeight; + sal_Int32 mnIncludeAngleScale; + sal_Int32 mnRadiusScale; + sal_Int32 mnWidthScale; + sal_Int32 mnHeightScale; + sal_Int32 mnWidthOverride; + sal_Int32 mnHeightOverride; + sal_Int32 mnLayoutStyleCount; + sal_Int32 mnLayoutStyleIndex; + + bool mbOrgChartEnabled; + bool mbBulletEnabled; + bool mbCoherent3DOffset; + bool mbCustomHorizontalFlip; + bool mbCustomVerticalFlip; + bool mbCustomText; + bool mbIsPlaceholder; +}; + +typedef std::vector< Point > Points; + +/** Snippet of Diagram ModelData for Diagram-defining data undo/redo + */ +class SVXCORE_DLLPUBLIC DiagramDataState +{ + Connections maConnections; + Points maPoints; + +public: + DiagramDataState(const Connections& rConnections, const Points& rPoints); + + Connections& getConnections() { return maConnections; } + Points& getPoints() { return maPoints; } +}; + +typedef std::shared_ptr< DiagramDataState > DiagramDataStatePtr; + +/** The collected Diagram ModelData + */ +class SVXCORE_DLLPUBLIC DiagramData +{ +public: + typedef std::map< OUString, Point* > PointNameMap; + typedef std::map< OUString, std::vector< Point* > > PointsNameMap; + typedef std::map< OUString, const Connection* > ConnectionNameMap; + + struct SourceIdAndDepth + { + OUString msSourceId; + sal_Int32 mnDepth = 0; + }; + + /// Tracks connections: destination id -> {destination order, details} map. + typedef std::map< OUString, std::map<sal_Int32, SourceIdAndDepth > > StringMap; + +protected: + // Make constructor protected to signal that this anyway pure virtual class + // shall not be incarnated - target to use is oox::drawingml::DiagramData + DiagramData(); + +public: + virtual ~DiagramData(); + + // creates temporary processing data from model data + virtual void buildDiagramDataModel(bool bClearOoxShapes); + + // dump to readable format + virtual void dump() const = 0; + + // read accesses + Connections& getConnections() { return maConnections; } + Points& getPoints() { return maPoints; } + StringMap& getPresOfNameMap() { return maPresOfNameMap; } + PointNameMap& getPointNameMap() { return maPointNameMap; } + PointsNameMap& getPointsPresNameMap() { return maPointsPresNameMap; } + ::std::vector<OUString>& getExtDrawings() { return maExtDrawings; } + const Point* getRootPoint() const; + OUString getString() const; + std::vector<std::pair<OUString, OUString>> getChildren(const OUString& rParentId) const; + + 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; } + + const OUString& getBackgroundShapeModelID() const { return msBackgroundShapeModelID; } + void setBackgroundShapeModelID( const OUString& rModelID ) { msBackgroundShapeModelID = rModelID; } + + // model modifiers + OUString addNode(const OUString& rText); + bool removeNode(const OUString& rNodeId); + + // Undo/Redo helpers to extract/restore Diagram-defining data + DiagramDataStatePtr extractDiagramDataState() const; + void applyDiagramDataState(const DiagramDataStatePtr& rState); + +protected: + // helpers + void getChildrenString(OUStringBuffer& rBuf, const Point* pPoint, sal_Int32 nLevel) const; + void addConnection(TypeConstant nType, const OUString& sSourceId, const OUString& sDestId); + + // evtl. existing alternative imported visualization identifier + ::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 + // - logic connections/associations + Connections maConnections; + + // - data point entries + Points maPoints; + + // - style for the BackgroundShape (if used) + // this is the property sequence of pairs<OUString, css::uno::Any>, + // as interpreted & assigned by the ::addShape(s) creators in the + // import filter + PointStylePtr maBackgroundShapeStyle; + + // - 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" + css::uno::Reference< css::xml::dom::XDocument > mxThemeDocument; + + // temporary processing data, partially deleted when using build() + PointNameMap maPointNameMap; + PointsNameMap maPointsPresNameMap; + ConnectionNameMap maConnectionNameMap; + StringMap maPresOfNameMap; + OUString msBackgroundShapeModelID; +}; + +typedef std::shared_ptr< DiagramData > DiagramDataPtr; + +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |