/*************************************************************** * Name: LineShape.h * Purpose: Defines line shape class * Author: Michal Bližňák (michal.bliznak@tiscali.cz) * Created: 2007-07-22 * Copyright: Michal Bližňák * License: wxWidgets license (www.wxwidgets.org) * Notes: **************************************************************/ #ifndef _WXSFLINESHAPE_H #define _WXSFLINESHAPE_H #include #include #include // default values /*! \brief Default value of undefined ID. */ #define sfdvLINESHAPE_UNKNOWNID -1 /*! \brief Default value of wxSFLineShape::m_Pen data member. */ #define sfdvLINESHAPE_PEN wxPen(*wxBLACK) /*! \brief Default value of wxSFLineShape::m_nDockPoint data member. */ #define sfdvLINESHAPE_DOCKPOINT 0 /*! \brief Default value of wxSFLineShape::m_nDockPoint data member (start line point). */ #define sfdvLINESHAPE_DOCKPOINT_START -1 /*! \brief Default value of wxSFLineShape::m_nDockPoint data member (end line point). */ #define sfdvLINESHAPE_DOCKPOINT_END -2 /*! \brief Default value of wxSFLineShape::m_nDockPoint data member (middle dock point). */ #define sfdvLINESHAPE_DOCKPOINT_CENTER INT_MAX /*! \brief Default value of wxSFLineShape::m_nSrcOffset and wxSFLineShape::m_nTrgOffset data members. */ #define sfdvLINESHAPE_OFFSET wxRealPoint(-1, -1) /*! \brief Default value of wxSFLineShape::m_nSrcPoint and wxSFLineShape::m_nTrgPoint data members. */ #define sfdvLINESHAPE_DEFAULTPOINT wxRealPoint(0, 0) /*! \brief Default value of wxSFLineShape::m_fStandAlone data member. */ #define sfdvLINESHAPE_STANDALONE false /*! * \brief Basic class encapsulating the multiline consisting of several line segments. */ class WXDLLIMPEXP_SF wxSFLineShape : public wxSFShapeBase { public: friend class wxSFShapeCanvas; XS_DECLARE_CLONABLE_CLASS(wxSFLineShape); /*! \brief Default constructor. */ wxSFLineShape(void); /*! * \brief User constructor. * \param src ID of the source shape * \param trg ID of the target shape * \param path List of the line control points (can be empty) * \param manager Pointer to parent shape manager */ wxSFLineShape(long src, long trg, const wxXS::RealPointList& path, wxSFDiagramManager* manager); /** * \brief User constructor. * \param src Starting line point * \param trg Ending line point * \param path List of the line control points (can be empty) * \param manager Pointer to parent shape manager */ wxSFLineShape(const wxRealPoint& src, const wxRealPoint& trg, const wxXS::RealPointList& path, wxSFDiagramManager* manager); /*! * \brief Copy constructor. * \param obj Reference to the source object */ wxSFLineShape(const wxSFLineShape& obj); /*! \brief Destructor. */ virtual ~wxSFLineShape(void); // public member data accessors /*! * \brief Set line source. * \param id ID of the source shape */ inline void SetSrcShapeId(long id) {m_nSrcShapeId = id;} /*! * \brief Get line source. * \return ID of the source shape */ inline long GetSrcShapeId() {return m_nSrcShapeId;} /*! * \brief Set line target. * \param id ID of the target shape */ inline void SetTrgShapeId(long id) {m_nTrgShapeId = id;} /*! * \brief Get line target. * \return ID of the target shape */ inline long GetTrgShapeId() {return m_nTrgShapeId;} /** * \brief Set user-defined starting line point. * \param src Starting point */ inline void SetSrcPoint(const wxRealPoint& src) {m_nSrcPoint = src;} /*! * \brief Get first line point. * \return First line point */ wxRealPoint GetSrcPoint(); /** * \brief Set user-defined ending point. * \param trg Ending point */ inline void SetTrgPoint(const wxRealPoint& trg) {m_nTrgPoint = trg;} /*! * \brief Get last line point. * \return Last line point */ wxRealPoint GetTrgPoint(); /** * \brief Get starting and ending line points. * \param src Reference to real point value where starting line point will be stored * \param trg Reference to real point value where ending line point will be stored */ void GetDirectLine(wxRealPoint& src, wxRealPoint& trg); /*! * \brief Set source arrow object. * \param arrow Pointer to the arrow object which will be assigned to the begin of the line */ void SetSrcArrow(wxSFArrowBase* arrow); /*! * \brief Set target arrow object. * \param arrow Pointer to the arrow object which will be assigned to the end of the line */ void SetTrgArrow(wxSFArrowBase* arrow); /*! * \brief Set source arrow object created from its class info. * \param arrowInfo Class info of the arrow class * \return New arrow object */ wxSFArrowBase* SetSrcArrow(wxClassInfo* arrowInfo); /*! * \brief Get object of source arrow. * \return Pointer to the arrow object if exists, otherwise NULL */ inline wxSFArrowBase* GetSrcArrow() {return m_pSrcArrow;} /*! * \brief Set target arrow object created from its class info. * \param arrowInfo Class info of the arrow class * \return New arrow object */ wxSFArrowBase* SetTrgArrow(wxClassInfo* arrowInfo); /*! * \brief Get object of target arrow. * \return Pointer to the arrow object if exists, otherwise NULL */ inline wxSFArrowBase* GetTrgArrow() {return m_pTrgArrow;} /*! * \brief Set line style. * \param pen Reference to wxPen object */ inline void SetLinePen(const wxPen& pen) {m_Pen = pen;} /*! * \brief Get line style. * \return wxPen class */ inline wxPen GetLinePen() const {return m_Pen;} /*! * \brief Set the line dock point. It is a zerro based index of the line * control point which will act as the shape position (value returned by GetRelativePosition() function). * \param index Zerro based index of the line control point * \sa sfdvLINESHAPE_DOCKPOINT_START, sfdvLINESHAPE_DOCKPOINT_END, sfdvLINESHAPE_DOCKPOINT_CENTER */ inline void SetDockPoint(int index) {m_nDockPoint = index;} /*! * \brief Get the line dock point. It is a zerro based index of the line * control point which will act as the shape position (value returned by GetRelativePosition() function). * \return Zerro based index of the line control point (-1 means UNDEFINED) */ inline int GetDockPoint() {return m_nDockPoint;} /*! * \brief Get a list of the line's contol points (their positions). * \return List of control points' positions */ inline wxXS::RealPointList& GetControlPoints() {return m_lstPoints;} /*! * \brief Get a position of given line dock point. * \param dp Dock point * \return The dock point's position if exists, otherwise the line center */ wxRealPoint GetDockPointPosition(int dp); /*! * \brief Initialize line's starting point with existing fixed connection point. * \param cp Pointer to connection point */ void SetStartingConnectionPoint(const wxSFConnectionPoint *cp); /*! * \brief Initialize line's ending point with existing fixed connection point. * \param cp Pointer to connection point */ void SetEndingConnectionPoint(const wxSFConnectionPoint *cp); /*! * \brief Get starting and ending point of line segment defined by its index. * \param index Index of desired line segment * \param src Reference to variable where starting point will be stored * \param trg Reference to variable where ending point will be stored * \return TRUE if a line segment of given index exists, otherwise FALSE */ bool GetLineSegment(size_t index, wxRealPoint& src, wxRealPoint& trg); /*! * \brief Set stand-alone line mode. * \param enab TRUE for stand-alone line, otherwise FALSE */ inline void SetStandAlone(bool enab) { m_fStandAlone = enab; } /*! * \brief Get stand-alone line mode. * \return TRUE, if the line is stand-alone, otherwise FALSE */ inline bool IsStandAlone() { return m_fStandAlone; } // public virtual functions /*! * \brief Get line's bounding box. The function can be overrided if neccessary. * \return Bounding rectangle */ virtual wxRect GetBoundingBox(); /*! * \brief Get the shape's absolute position in the canvas. * \return Shape's position */ virtual wxRealPoint GetAbsolutePosition(); /*! * \brief Get intersection point of the shape border and a line leading from * 'start' point to 'end' point. The function can be overrided if neccessary. * \param start Starting point of the virtual intersection line * \param end Ending point of the virtual intersection line * \return Intersection point */ virtual wxRealPoint GetBorderPoint(const wxRealPoint& start, const wxRealPoint& end); /*! * \brief Test whether the given point is inside the shape. The function * can be overrided if neccessary. * \param pos Examined point * \return TRUE if the point is inside the shape area, otherwise FALSE */ virtual bool Contains(const wxPoint& pos); /*! * \brief Move the shape to the given absolute position. The function * can be overrided if neccessary. * \param x X coordinate * \param y Y coordinate */ virtual void MoveTo(double x, double y); /*! * \brief Move the shape by the given offset. The function * can be overrided if neccessary. * \param x X offset * \param y Y offset */ virtual void MoveBy(double x, double y); /*! * \brief Function called by the framework responsible for creation of shape handles * at the creation time. The function can be overrided if neccesary. */ virtual void CreateHandles(); /*! * \brief Event handler called during dragging of the shape handle. * The function can be overrided if necessary. * * The function is called by the framework (by the shape canvas). * \param handle Reference to dragged handle */ virtual void OnHandle(wxSFShapeHandle& handle); /*! * \brief Event handler called when the user finished dragging of the shape handle. * The function can be overrided if necessary. * * The function is called by the framework (by the shape canvas). * Default implementation does nothing. * \param handle Reference to dragged handle */ virtual void OnEndHandle(wxSFShapeHandle& handle); /*! * \brief Event handler called at the begining of the shape dragging process. * The function can be overrided if necessary. * * The function is called by the framework (by the shape canvas). * \sa wxSFShapeCanvas */ virtual void OnBeginDrag(const wxPoint& pos); /*! * \brief Event handler called when the shape is double-clicked by * the left mouse button. The function can be overrided if necessary. * * The function is called by the framework (by the shape canvas). * \param pos Current mouse position * \sa wxSFShapeCanvas */ virtual void OnLeftDoubleClick(const wxPoint& pos); /*! * \brief Scale the shape size by in both directions. The function can be overrided if necessary * (new implementation should call default one ore scale shape's children manualy if neccesary). * \param x Horizontal scale factor * \param y Vertical scale factor * \param children TRUE if the shape's children shoould be scaled as well, otherwise the shape will be updated after scaling via Update() function. */ virtual void Scale(double x, double y, bool children = sfWITHCHILDREN); protected: /*! \brief The modes in which the line shape can stay. */ enum LINEMODE { modeREADY, modeUNDERCONSTRUCTION, modeSRCCHANGE, modeTRGCHANGE }; // protected data members /*! \brief List of the line's control points. */ wxXS::RealPointList m_lstPoints; wxRealPoint m_nPrevPosition; wxPoint m_nUnfinishedPoint; LINEMODE m_nMode; /*! \brief Index of the line dock point. */ int m_nDockPoint; long m_nSrcShapeId; long m_nTrgShapeId; wxSFArrowBase* m_pSrcArrow; wxSFArrowBase* m_pTrgArrow; bool m_fStandAlone; /*! \brief Stand alone line's starting point. */ wxRealPoint m_nSrcPoint; /*! \brief Stand alone line's ending point. */ wxRealPoint m_nTrgPoint; /*! \brief Modification offset for starting line point. */ wxRealPoint m_nSrcOffset; /*! \brief Modification offset for ending line point. */ wxRealPoint m_nTrgOffset; wxPen m_Pen; // protected virtual functions /*! * \brief Draw the shape in the normal way. The function can be overrided if neccessary. * \param dc Reference to device context where the shape will be drawn to */ virtual void DrawNormal(wxDC& dc); /*! * \brief Draw the shape in the hower mode (the mouse cursor is above the shape). * The function can be overrided if neccessary. * \param dc Reference to device context where the shape will be drawn to */ virtual void DrawHover(wxDC& dc); /*! * \brief Draw the shape in the highlighted mode (another shape is dragged over this * shape and this shape will accept the dragged one if it will be dropped on it). * The function can be overrided if neccessary. * \param dc Reference to device context where the shape will be drawn to */ virtual void DrawHighlighted(wxDC& dc); /*! \brief Draw completed line. */ virtual void DrawCompleteLine(wxDC& dc); /*! * \brief Get index of the line segment intersecting the given point. * \param pos Examined point * \return Zero-based index of line segment located under the given point */ virtual int GetHitLinesegment(const wxPoint& pos); // protected functions /*! * \brief Set line shape's working mode. * \param mode Working mode * \sa LINEMODE */ void SetLineMode(LINEMODE mode){m_nMode = mode;} /*! * \brief Get current working mode. * \return Current working mode * \sa LINEMODE */ LINEMODE GetLineMode(){return m_nMode;} /*! * \brief Set next potential control point position (usefull in modeUNDERCONSTRUCTION working mode). * \param pos New potential control point position * \sa LINEMODE */ void SetUnfinishedPoint(const wxPoint& pos){m_nUnfinishedPoint = pos;} /*! * \brief Get modified starting line point . * \return Modified starting line point */ wxRealPoint GetModSrcPoint(); /*! * \brief Get modified ending line point . * \return Modified ending line point */ wxRealPoint GetModTrgPoint(); private: // private functions /*! \brief Initialize serializable properties. */ void MarkSerializableDataMembers(); }; #endif //_WXSFLINESHAPE_H