Files
odfstudio/oox/source/drawingml/diagram/diagramlayoutatoms.hxx
T
Xisco Fauli cfd3309a5d loplugin:unusedmethods
Check existing ones that can be removed

Change-Id: I6ee6fc1772c620ac5d12fea915681b094b7c3bfd
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/204583
Tested-by: Jenkins
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
2026-04-30 08:54:45 +02:00

389 lines
12 KiB
C++

/* -*- 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_OOX_SOURCE_DRAWINGML_DIAGRAM_DIAGRAMLAYOUTATOMS_HXX
#define INCLUDED_OOX_SOURCE_DRAWINGML_DIAGRAM_DIAGRAMLAYOUTATOMS_HXX
#include <map>
#include <memory>
#include <com/sun/star/xml/sax/XFastAttributeList.hpp>
#include <utility>
#include "diagram.hxx"
namespace oox::drawingml {
typedef std::shared_ptr< DiagramLayout > DiagramLayoutPtr;
// AG_IteratorAttributes
struct IteratorAttr
{
IteratorAttr();
// not sure this belong here, but wth
void loadFromXAttr( const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttributes );
std::vector<sal_Int32> maAxis;
sal_Int32 mnCnt;
bool mbHideLastTrans;
sal_Int32 mnPtType;
sal_Int32 mnSt;
sal_Int32 mnStep;
};
struct ConditionAttr
{
ConditionAttr();
// not sure this belong here, but wth
void loadFromXAttr( const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttributes );
OUString msVal;
sal_Int32 mnFunc;
sal_Int32 mnArg;
sal_Int32 mnOp;
sal_Int32 mnVal;
};
/// Constraints allow you to specify an ideal (or starting point) size for each shape.
struct Constraint
{
OUString msForName;
OUString msRefForName;
double mfFactor;
double mfValue;
sal_Int32 mnFor;
sal_Int32 mnPointType;
sal_Int32 mnType;
sal_Int32 mnRefFor;
sal_Int32 mnRefType;
sal_Int32 mnRefPointType;
sal_Int32 mnOperator;
};
/// Rules allow you to specify what to do when constraints can't be fully satisfied.
struct Rule
{
OUString msForName;
};
typedef std::map<sal_Int32, sal_Int32> LayoutProperty;
typedef std::map<OUString, LayoutProperty> LayoutPropertyMap;
struct LayoutAtomVisitor;
class LayoutAtom;
class LayoutNode;
typedef std::shared_ptr< LayoutAtom > LayoutAtomPtr;
/** abstract Atom for the layout */
class LayoutAtom
{
public:
LayoutAtom(LayoutNode& rLayoutNode) : mrLayoutNode(rLayoutNode) {}
virtual ~LayoutAtom() { }
LayoutNode& getLayoutNode()
{ return mrLayoutNode; }
/** visitor acceptance
*/
virtual void accept( LayoutAtomVisitor& ) = 0;
void setName( const OUString& sName )
{ msName = sName; }
const OUString& getName() const
{ return msName; }
private:
void addChild( const LayoutAtomPtr & pNode )
{ mpChildNodes.push_back( pNode ); }
void setParent(const LayoutAtomPtr& pParent) { mpParent = pParent; }
public:
const std::vector<LayoutAtomPtr>& getChildren() const
{ return mpChildNodes; }
LayoutAtomPtr getParent() const { return mpParent.lock(); }
static void connect(const LayoutAtomPtr& pParent, const LayoutAtomPtr& pChild)
{
pParent->addChild(pChild);
pChild->setParent(pParent);
}
// dump for debug
void dump(int level = 0);
protected:
LayoutNode& mrLayoutNode;
std::vector< LayoutAtomPtr > mpChildNodes;
std::weak_ptr<LayoutAtom> mpParent;
OUString msName;
};
class ConstraintAtom
: public LayoutAtom
{
public:
ConstraintAtom(LayoutNode& rLayoutNode) : LayoutAtom(rLayoutNode) {}
virtual void accept( LayoutAtomVisitor& ) override;
Constraint& getConstraint()
{ return maConstraint; }
void parseConstraint(std::vector<Constraint>& rConstraints, bool bRequireForName) const;
private:
Constraint maConstraint;
};
/// Represents one <dgm:rule> element.
class RuleAtom
: public LayoutAtom
{
public:
RuleAtom(LayoutNode& rLayoutNode) : LayoutAtom(rLayoutNode) {}
virtual void accept( LayoutAtomVisitor& ) override;
Rule& getRule()
{ return maRule; }
void parseRule(std::vector<Rule>& rRules) const;
private:
Rule maRule;
};
class AlgAtom
: public LayoutAtom
{
public:
AlgAtom(LayoutNode& rLayoutNode) : LayoutAtom(rLayoutNode), mnType(0), maMap() {}
typedef std::map<sal_Int32,sal_Int32> ParamMap;
virtual void accept( LayoutAtomVisitor& ) override;
void setType( sal_Int32 nToken )
{ mnType = nToken; }
const ParamMap& getMap() const { return maMap; }
void addParam( sal_Int32 nType, sal_Int32 nVal )
{ maMap[nType]=nVal; }
sal_Int32 getVerticalShapesCount(const ShapePtr& rShape);
void layoutShape( const SmartArtDiagram& rDgm, const ShapePtr& rShape,
const std::vector<Constraint>& rConstraints,
const std::vector<Rule>& rRules );
void setAspectRatio(double fAspectRatio) { mfAspectRatio = fAspectRatio; }
double getAspectRatio() const { return mfAspectRatio; }
private:
sal_Int32 mnType;
ParamMap maMap;
/// Aspect ratio is not integer, so not part of maMap.
double mfAspectRatio = 0;
/// Determines the connector shape type for conn algorithm
sal_Int32 getConnectorType();
};
typedef std::shared_ptr< AlgAtom > AlgAtomPtr;
/// Finds optimal grid to layout children that have fixed aspect ratio.
class SnakeAlg
{
public:
static void layoutShapeChildren(const AlgAtom& rAlg, const ShapePtr& rShape,
const std::vector<Constraint>& rConstraints);
};
/**
* Lays out child layout nodes along a vertical path and works with the trapezoid shape to create a
* pyramid.
*/
class PyraAlg
{
public:
static void layoutShapeChildren(const ShapePtr& rShape);
};
/**
* Specifies the size and position for all child layout nodes.
*/
class CompositeAlg
{
public:
static void layoutShapeChildren(const SmartArtDiagram& rDgm, AlgAtom& rAlg, const ShapePtr& rShape,
const std::vector<Constraint>& rConstraints);
private:
/**
* Apply rConstraint to the rProperties shared layout state.
*
* Note that the order in which constraints are applied matters, given that constraints can refer to
* each other, and in case A depends on B and A is applied before B, the effect of A won't be
* updated when B is applied.
*/
static void applyConstraintToLayout(const Constraint& rConstraint,
LayoutPropertyMap& rProperties);
/**
* Decides if a certain reference type (e.g. "right") can be inferred from the available properties
* in rMap (e.g. left and width). Returns true if rValue is written to.
*/
static bool inferFromLayoutProperty(const LayoutProperty& rMap, sal_Int32 nRefType,
sal_Int32& rValue);
};
class ForEachAtom
: public LayoutAtom
{
public:
explicit ForEachAtom(LayoutNode& rLayoutNode, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttributes);
IteratorAttr & iterator()
{ return maIter; }
void setRef(const OUString& rsRef)
{ msRef = rsRef; }
const OUString& getRef() const
{ return msRef; }
virtual void accept( LayoutAtomVisitor& ) override;
LayoutAtomPtr getRefAtom(const SmartArtDiagram& rDgm);
private:
IteratorAttr maIter;
OUString msRef;
};
typedef std::shared_ptr< ForEachAtom > ForEachAtomPtr;
class ConditionAtom
: public LayoutAtom
{
public:
explicit ConditionAtom(LayoutNode& rLayoutNode, bool isElse, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttributes);
virtual void accept( LayoutAtomVisitor& ) override;
bool getDecision(const SmartArtDiagram& rDgm, const svx::diagram::Point* pPresPoint) const;
private:
static bool compareResult(sal_Int32 nOperator, sal_Int32 nFirst, sal_Int32 nSecond);
sal_Int32 getNodeCount(const SmartArtDiagram& rDgm, const svx::diagram::Point* pPresPoint) const;
bool mIsElse;
IteratorAttr maIter;
ConditionAttr maCond;
};
typedef std::shared_ptr< ConditionAtom > ConditionAtomPtr;
/** "choose" statements. Atoms will be tested in order. */
class ChooseAtom
: public LayoutAtom
{
public:
ChooseAtom(LayoutNode& rLayoutNode)
: LayoutAtom(rLayoutNode)
{}
virtual void accept( LayoutAtomVisitor& ) override;
};
// I have cleaned LayoutNode from the member 'SmartArtDiagram& mrDgm'
// since LayoutNode is model data and with that in place it would have
// been necessary to deep-clone or re-import the complete DiagramLayout,
// just to make sure that those members of SmartArtDiagram& will
// reference the correct - newly created - SmartArtDiagram.
// That again would have been hard to keep under control due to
// LayoutNodes hosting a full hierarchy of LayoutNodes in its base
// class LayoutAtom, so complicated deep-copy and need of virtual Clone
// method at LayoutAtom to do the right thing for all eight derivations
// of it.
// This is now no longer needed. It can just stay shared, thus the
// DiagramLayoutPtr gets just copied above. This reflects that the
// layout mechanism hosted by these atoms is not changed itself, but
// used (in some ForEach manner) to create the shapes, so does not
// need to be changed itself.
// It gets now just additionally referenced by the SmartArtDiagram copy
// constructor. That is for non-deep copy/paste where this copy operator
// is used.
// For deep copy the SmartArtDiagram constructor with import from
// boost::property_tree has to be used which will have to re-import
// the layout model data to mpLayout anyways.
// Instead of having SmartArtDiagram as member it now will be handed
// as needed to import contexts (LayoutNodeContext and derivatives).
// All those classes are used temporarily and are not part of the model.
// It also gets handed over for shape re-creation in LayoutAtomVisitorBase
// and it's derivates. Also those classes are used temporarily and are
// not part of the model.
class LayoutNode
: public LayoutAtom
{
public:
typedef std::map<sal_Int32, OUString> VarMap;
LayoutNode();
virtual void accept( LayoutAtomVisitor& ) override;
VarMap & variables()
{ return mVariables; }
void setMoveWith( const OUString & sName )
{ msMoveWith = sName; }
void setStyleLabel( const OUString & sLabel )
{ msStyleLabel = sLabel; }
void setChildOrder( sal_Int32 nOrder )
{ mnChildOrder = nOrder; }
sal_Int32 getChildOrder() const { return mnChildOrder; }
void setExistingShape( const ShapePtr& pShape )
{ mpExistingShape = pShape; }
const ShapePtr& getExistingShape() const
{ return mpExistingShape; }
void addNodeShape(const ShapePtr& pShape)
{ mpNodeShapes.push_back(pShape); }
bool setupShape( const SmartArtDiagram& rDgm, const ShapePtr& rShape,
const svx::diagram::Point* pPresNode,
sal_Int32 nCurrIdx ) const;
private:
VarMap mVariables;
OUString msMoveWith;
OUString msStyleLabel;
ShapePtr mpExistingShape;
std::vector<ShapePtr> mpNodeShapes;
sal_Int32 mnChildOrder;
};
typedef std::shared_ptr< LayoutNode > LayoutNodePtr;
class ShapeAtom
: public LayoutAtom
{
public:
ShapeAtom(LayoutNode& rLayoutNode, ShapePtr pShape) : LayoutAtom(rLayoutNode), mpShapeTemplate(std::move(pShape)) {}
virtual void accept( LayoutAtomVisitor& ) override;
const ShapePtr& getShapeTemplate() const
{ return mpShapeTemplate; }
private:
ShapePtr mpShapeTemplate;
};
typedef std::shared_ptr< ShapeAtom > ShapeAtomPtr;
}
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */