Files

346 lines
14 KiB
C
Raw Permalink Normal View History

2018-12-06 16:01:56 +01:00
/***************************************************************
* Name: DiagramManager.h
* Purpose: Defines shape manager class
* Author: Michal Bližňák (michal.bliznak@tiscali.cz)
* Created: 2007-07-25
* Copyright: Michal Bližňák
* License: wxWidgets license (www.wxwidgets.org)
* Notes:
**************************************************************/
#ifndef _WXSFDIAGRAMMANAGER_H
#define _WXSFDIAGRAMMANAGER_H
#include <wx/wxsf/ShapeBase.h>
#include <wx/wxsf/CommonFcn.h>
#define serINCLUDE_PARENTS true
#define serWITHOUT_PARENTS false
#define sfINITIALIZE true
#define sfDONT_INITIALIZE false
class wxSFShapeCanvas;
class wxSFLineShape;
/*! \brief Auxiliary class encapsulation two variables suitable for shape IDs. It is
* used for storing infomation about various relevant shape IDs */
class IDPair : public wxObject
{
public:
/*! \brief Constructor */
IDPair(long oldId, long newId){m_nOldID = oldId; m_nNewID = newId;}
long m_nNewID;
long m_nOldID;
};
WX_DECLARE_LIST(IDPair, IDList);
/*! \brief Class encapsulating framework's data layer. Its functions are responsible
* for managing shape objects and their serialialization/deserialization. Presentation
* layer is provided by wxSFShapeCanvas class which tightly cooperates with the shape
* manager.
*
* An application using wxSF must have at least one shape manager object (one for
* each diagram) and every shape manager can be assigned as a source to one shape
* canvas (and vice versa).
*/
class WXDLLIMPEXP_SF wxSFDiagramManager : public wxXmlSerializer
{
public:
XS_DECLARE_CLONABLE_CLASS(wxSFDiagramManager);
/*! \brief Search mode flags for GetShapeAtPosition function */
enum SEARCHMODE
{
/*! \brief Search for selected shapes only */
searchSELECTED,
/*! \brief Search for unselected shapes only */
searchUNSELECTED,
/*! \brief Search for both selected and unselected shapes */
searchBOTH
};
/*! \brief Constructor */
wxSFDiagramManager();
/*! \brief Copy constructor */
wxSFDiagramManager(const wxSFDiagramManager &obj);
/*! \brief Destructor */
virtual ~wxSFDiagramManager();
// public functions
/*! \brief Get wxShapeFramework version number */
const wxString& GetVersion() const { return m_sSFVersion; }
/*!
* \brief Create new direct connection between two shapes.
*
* This function creates new simple connection line (without arrows) between gived
* shapes.
* \param srcId ID of a source shape
* \param trgId ID of target shape
* \param saveState Set the parameter TRUE if you wish to save canvas state after the operation
* \param err Pointer to variable where operation result will be stored. Can be NULL.
* \return Pointer to new connection object. The object is added to the shape canvas automaticaly.
* \sa StartInteractiveConnection
*/
wxSFShapeBase* CreateConnection(long srcId, long trgId, bool saveState = true, wxSF::ERRCODE *err = NULL);
/*!
* \brief Create new direct connection of given type between two shapes.
*
* This function creates new simple connection line (without arrows) between gived
* shapes.
* \param srcId ID of a source shape
* \param trgId ID of target shape
* \param lineInfo Connection type (any class inherited from wxSFLineShape)
* \param saveState Set the parameter TRUE if you wish to save canvas state after the operation
* \param err Pointer to variable where operation result will be stored. Can be NULL.
* \return Pointer to new connection object. The object is added to the shape canvas automaticaly.
* \sa StartInteractiveConnection
*/
wxSFShapeBase* CreateConnection(long srcId, long trgId, wxClassInfo *lineInfo, bool saveState = true, wxSF::ERRCODE *err = NULL);
/*!
* \brief Create new direct connection of given type between two shapes.
*
* This function creates new simple connection line (without arrows) between gived
* shapes.
* \param srcId ID of a source shape
* \param trgId ID of target shape
* \param line Pointer to line shape
* \param saveState Set the parameter TRUE if you wish to save canvas state after the operation
* \param err Pointer to variable where operation result will be stored. Can be NULL.
* \return Pointer to new connection object. The object is added to the shape canvas automaticaly.
* \sa StartInteractiveConnection
*/
wxSFShapeBase* CreateConnection(long srcId, long trgId, wxSFLineShape *line, bool saveState = true, wxSF::ERRCODE *err = NULL);
/*!
* \brief Create new shape and add it to the shape canvas.
* \param shapeInfo Shape type
* \param saveState Set the parameter TRUE if you wish to save canvas state after the operation
* \param err Pointer to variable where operation result will be stored. Can be NULL.
* \return Pointer to new shape object. The object is added to the shape canvas automaticaly.
*/
wxSFShapeBase* AddShape(wxClassInfo* shapeInfo, bool saveState = true, wxSF::ERRCODE *err = NULL);
/*!
* \brief Create new shape and add it to the shape canvas.
* \param shapeInfo Shape type
* \param pos Shape position
* \param saveState Set the parameter TRUE if you wish to save canvas state after the operation
* \param err Pointer to variable where operation result will be stored. Can be NULL.
* \return Description
* \sa Seealso
*/
wxSFShapeBase* AddShape(wxClassInfo* shapeInfo, const wxPoint& pos, bool saveState = true, wxSF::ERRCODE *err = NULL);
/*!
* \brief Add an existing shape to the canvas.
* \param shape Pointer to the shape
* \param parent Pointer to the parent shape
* \param pos Position
* \param initialize TRUE if the shape should be reinitilialized, otherwise FALSE
* \param saveState TRUE if the canvas state should be saved
* \param err Pointer to variable where operation result will be stored. Can be NULL.
* \return Pointer to the shape
*/
wxSFShapeBase* AddShape(wxSFShapeBase* shape, xsSerializable* parent, const wxPoint& pos, bool initialize, bool saveState = true, wxSF::ERRCODE *err = NULL);
/*!
* \brief Remove given shape from the shape canvas. The shape object will be deleted as well.
* \param shape Pointer to shape object should be deleted
* \param refresh Set the paramater to TRUE if you wish to repaint the canvas
*/
void RemoveShape(wxSFShapeBase* shape, bool refresh = true);
/*!
* \brief Remove shapes from the shape canvas
* \param selection List of shapes which should be removed from the canvas
*/
void RemoveShapes(const ShapeList& selection);
/*! \brief Remove all shapes from canvas */
void Clear();
/*! \brief Move all shapes so none of it will be located in negative position */
void MoveShapesFromNegatives();
/*! \brief Update all shapes in the diagram manager */
void UpdateAll();
/*!
* \brief Serialize complete shape canvas to given file
* \param file Output file
* \param withroot If TRUE then the root item's properties are serialized as well
* \return TRUE on success, otherwise FALSE
*/
virtual bool SerializeToXml(const wxString& file, bool withroot = false);
/*!
* \brief Deserialize complete shape canvas from given file
* \param file Input file
* \return TRUE on success, otherwise FALSE
*/
virtual bool DeserializeFromXml(const wxString& file);
/*!
* \brief Serialize complete shape canvas to given output stream
* \param outstream Output stream
* \param withroot If TRUE then the root item's properties are serialized as well
* \return TRUE on success, otherwise FALSE
*/
virtual bool SerializeToXml(wxOutputStream& outstream, bool withroot = false);
/*!
* \brief Deserialize complete shape canvas from given input stream
* \param instream Input stream
* \return TRUE on success, otherwise FALSE
*/
virtual bool DeserializeFromXml(wxInputStream& instream);
/*!
* \brief Deserialize shapes from XML and assign them to given parent.
*
* The parent can be NULL (in that case topmost shapes will have no parent assigned).
* \param parent Parent shapes
* \param node Source XML node
*/
virtual void DeserializeObjects(xsSerializable* parent, wxXmlNode* node);
/*!
* \brief Add given shape type to an acceptance list. The acceptance list contains class
* names of the shapes which can be inserted into this instance of shapes canvas.
* Note: Keyword 'All' behaves like any class name.
* \param type Class name of accepted shape object
* \sa IsShapeAccepted
*/
void AcceptShape(const wxString& type);
/*!
* \brief Tells whether the given shape type is accepted by this canvas instance (it means
* whether this shape can be inserted into it).
*
* The function is typically used by the framework for determination whether class type supplied
* by AddShape() function can be inserted into shape canvas.
* \param type Class name of examined shape object
* \return TRUE if the shape type is accepted, otherwise FALSE.
*/
bool IsShapeAccepted(const wxString& type);
/*!
* \brief Clear shape object acceptance list
* \sa AcceptShape
*/
inline void ClearAcceptedShapes() { m_arrAcceptedShapes.Clear(); }
/*!
* \brief Get reference to shape acceptance list
*/
inline wxArrayString& GetAcceptedShapes() { return m_arrAcceptedShapes; }
/*!
* \brief Find shape with given ID.
* \param id Shape's ID
* \return Pointer to shape if exists, otherwise NULL
*/
wxSFShapeBase* FindShape(long id);
/*!
* \brief Get list of connections assigned to given parent shape.
* \param parent Pointer to parent shape
* \param shapeInfo Line object type
* \param mode Search mode
* \param lines Reference to shape list where pointers to all found connections will be stored
* \sa wxSFShapeBase::CONNECTMODE
*/
void GetAssignedConnections(wxSFShapeBase* parent, wxClassInfo* shapeInfo, wxSFShapeBase::CONNECTMODE mode, ShapeList& lines);
/*!
* \brief Get list of shapes of given type.
* \param shapeInfo Shape object type
* \param shapes Reference to shape list where pointers to all found shapes will be stored
* \param mode Search algorithm
* \sa xsSerializable::SEARCHMODE
*/
void GetShapes(wxClassInfo* shapeInfo, ShapeList& shapes, xsSerializable::SEARCHMODE mode = xsSerializable::searchBFS);
/*!
* \brief Get shape at given logical position
* \param pos Logical position
* \param zorder Z-order of searched shape (usefull if several shapes are located at the given position)
* \param mode Search mode
* \return Pointer to shape if found, otherwise NULL
* \sa SEARCHMODE, wxSFShapeCanvas::DP2LP,, wxSFShapeCanvas::GetShapeUnderCursor
*/
wxSFShapeBase* GetShapeAtPosition(const wxPoint& pos, int zorder = 1, SEARCHMODE mode = searchBOTH);
/*!
* \brief Get list of all shapes located at given position
* \param pos Logical position
* \param shapes Reference to shape list where pointers to all found shapes will be stored
* \sa wxSFShapeCanvas::DP2LP
*/
void GetShapesAtPosition(const wxPoint& pos, ShapeList& shapes);
/*!
* \brief Get list of shapes located inside given rectangle
* \param rct Examined rectangle
* \param shapes Reference to shape list where pointers to all found shapes will be stored
*/
void GetShapesInside(const wxRect& rct, ShapeList& shapes);
/*!
* \brief Determines whether the diagram manager contains some shapes.
* \return TRUE if there are no shapes in the manager, otherwise FALSE
*/
inline bool IsEmpty() const { return ! GetRootItem()->HasChildren(); }
/*!
* \brief Function finds out whether given shape has some children.
* \param parent Pointer to potential parent shape
* \return TRUE if the parent shape has children, otherwise FALSE
*/
bool HasChildren(wxSFShapeBase* parent);
/*!
* \brief Get neighbour shapes connected to given parent shape.
* \param parent Pointer to parent shape (can be NULL for all topmost shapes)
* \param neighbours List of neighbour shapes
* \param shapeInfo Line object type
* \param condir Connection direction
* \param direct Set this flag to TRUE if only closest shapes should be found,
* otherwise also shapes connected by forked lines will be found (also
* constants sfDIRECT and sfINDIRECT can be used)
* \sa wxSFShapeBase::CONNECTMODE
*/
void GetNeighbours(wxSFShapeBase* parent, ShapeList& neighbours, wxClassInfo* shapeInfo, wxSFShapeBase::CONNECTMODE condir, bool direct = true);
// public member data accessors
/*!
* \brief Set associated shape canvas
* \param canvas Pointer to shape canvas
*/
inline void SetShapeCanvas(wxSFShapeCanvas* canvas) { m_pShapeCanvas = canvas; }
/*!
* \brief Get associated shape canvas
* \return Pointer to shape canvas
*/
inline wxSFShapeCanvas* GetShapeCanvas() { return m_pShapeCanvas; }
protected:
// protected data members
/*! \brief List of accepted shape types */
wxArrayString m_arrAcceptedShapes;
wxSFShapeCanvas* m_pShapeCanvas;
private:
/*! \brief Auxiliary list */
IDList m_lstIDPairs;
/*! \brief Auxiliary list */
ShapeList m_lstLinesForUpdate;
/*! \brief Auxiliary list */
ShapeList m_lstGridsForUpdate;
/*! \brief wxSF version number */
wxString m_sSFVersion;
/*! \brief Update connection shapes after importing/dropping of new shapes */
void UpdateConnections();
/*! \brief Update grid shapes after importing/dropping of new shapes */
void UpdateGrids();
/*!
* \brief Deserialize shapes from XML and assign them to given parent.
* \param parent Parent shapes
* \param node Source XML node
*/
void _DeserializeObjects(xsSerializable* parent, wxXmlNode* node);
};
#endif //_WXSFDIAGRAMMANAGER_H