This project is a demonstrator tool, made by the MOISE project, that translates timed Altarica models into Fiacre models. Such translation allows to use model checkers such as Tina to prove properties. The project contains the translator tool.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

346 lines
14 KiB

6 years ago
/***************************************************************
* 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