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.
311 lines
11 KiB
311 lines
11 KiB
/*************************************************************** |
|
* Name: ControlShape.h |
|
* Purpose: Defines GUI control shape class |
|
* Author: Michal Bližňák (michal.bliznak@tiscali.cz) |
|
* Created: 2008-04-30 |
|
* Copyright: Michal Bližňák |
|
* License: wxWidgets license (www.wxwidgets.org) |
|
* Notes: |
|
**************************************************************/ |
|
|
|
#ifndef _WXSFCONTROLSHAPE_H |
|
#define _WXSFCONTROLSHAPE_H |
|
|
|
#include <wx/wxsf/RectShape.h> |
|
|
|
#define sfFIT_SHAPE_TO_CONTROL true |
|
#define sfFIT_CONTROL_TO_SHAPE false |
|
|
|
#define sfdvCONTROLSHAPE_CONTROLOFFSET 0 |
|
#define sfdvCONTROLSHAPE_PROCESSEVENTS wxSFControlShape::evtKEY2CANVAS | wxSFControlShape::evtMOUSE2CANVAS |
|
#define sfdvCONTROLSHAPE_MODFILL wxBrush(*wxBLUE, wxBDIAGONAL_HATCH) |
|
#define sfdvCONTROLSHAPE_MODBORDER wxPen(*wxBLUE, 1, wxSOLID) |
|
|
|
class WXDLLIMPEXP_SF wxSFControlShape; |
|
|
|
/*! |
|
* \brief Auxiliary class used by wxSFControlShape. All events generated by a GUI control (widget) |
|
* managed by parent control shape are redirected to this event sink which invokes a default event handler |
|
* or send a copy of the event to shape canvas if requested. |
|
*/ |
|
class EventSink : public wxEvtHandler |
|
{ |
|
public: |
|
/*! \brief Default constructor. */ |
|
EventSink(); |
|
/*! |
|
* \brief User constructor. |
|
* \param parent Pointer to parent control shape |
|
*/ |
|
EventSink(wxSFControlShape *parent); |
|
/*! \brief Destructor. */ |
|
virtual ~EventSink(); |
|
|
|
// public functions |
|
/*! |
|
* \brief Event handler used for delayed processing of a mouse button events. |
|
* The handler creates new key event instance and sends it to a shape canvas for further processing. |
|
* \param event Mouse event |
|
*/ |
|
void _OnMouseButton(wxMouseEvent &event); |
|
/*! |
|
* \brief Event handler used for delayed processing of a mouse event (mouse movement). |
|
* The handler creates new key event instance and sends it to a shape canvas for further processing. |
|
* \param event Mouse event |
|
*/ |
|
void _OnMouseMove(wxMouseEvent &event); |
|
/*! |
|
* \brief Event handler used for delayed processing of a key event. |
|
* The handler creates new key event instance and sends it to a shape canvas for further processing. |
|
* \param event Keyboard event |
|
*/ |
|
void _OnKeyDown(wxKeyEvent &event); |
|
|
|
/*! \brief Event handler used for adjusting the parent shape's size in accordance to size of managed GUI control. */ |
|
void _OnSize(wxSizeEvent &event); |
|
|
|
protected: |
|
// protected data members |
|
/*! \brief Poineter to parent contol shape. */ |
|
wxSFControlShape *m_pParentShape; |
|
|
|
// protected functions |
|
/*! |
|
* \brief Send copy of incomming event to a shape canvas. |
|
* \param event Event to be send |
|
*/ |
|
void SendEvent(wxEvent &event); |
|
/*! |
|
* \brief Modify given mouse event (recalculate the event's position in accordance to parent control |
|
* shape's position. |
|
* \param event Mouse event to be updated; |
|
*/ |
|
void UpdateMouseEvent(wxMouseEvent &event); |
|
}; |
|
|
|
/*! |
|
* \brief Class encapsulates a special shape able to manage assigned GUI controls (widgets). The GUI control's |
|
* position and size can by modified via parent control shape. User can also specify how events incoming from the |
|
* managed GUI control are processed. |
|
* |
|
* Note that the managed controls use a shape canvas as their parent window so these shapes cannot be used |
|
* without existing and properly initialized shape canvas. Moreover, managed GUI controls are not serialized in any |
|
* way internaly so it is completely up to the user to provide this functionality if needed. |
|
*/ |
|
class WXDLLIMPEXP_SF wxSFControlShape : public wxSFRectShape |
|
{ |
|
public: |
|
friend class EventSink; |
|
|
|
XS_DECLARE_CLONABLE_CLASS(wxSFControlShape) |
|
|
|
/*! \brief Way of processing of GUI control's events. */ |
|
enum EVTPROCESSING |
|
{ |
|
/*! \brief Event isn't processed. */ |
|
evtNONE = 0, |
|
/*! \brief Keyboard events are processed by the GUI control. */ |
|
evtKEY2GUI = 1, |
|
/*! \brief Keyboard events are send to a shape canvas. */ |
|
evtKEY2CANVAS = 2, |
|
/*! \brief Mouse events are processed by the GUI control. */ |
|
evtMOUSE2GUI = 4, |
|
/*! \brief Mouse events are send to a shape canvas. */ |
|
evtMOUSE2CANVAS = 8 |
|
}; |
|
|
|
/*! \brief Default constructor. */ |
|
wxSFControlShape(); |
|
/*! |
|
* \brief User constructor. |
|
* \param ctrl Pointer to managed GUI control |
|
* \param pos Initial position |
|
* \param size Initial size |
|
* \param manager Pointer to parent diagram manager |
|
*/ |
|
wxSFControlShape(wxWindow *ctrl, const wxRealPoint& pos, const wxRealPoint& size, wxSFDiagramManager* manager); |
|
/*! |
|
* \brief Copy constructor. |
|
* \param obj Object to copy from |
|
*/ |
|
wxSFControlShape(const wxSFControlShape& obj); |
|
/*! \brief Default destructor. */ |
|
virtual ~wxSFControlShape(); |
|
|
|
// member data accessors |
|
/*! |
|
* \brief Set managed GUI control. |
|
* \param ctrl Pointer to existing manager GUI control |
|
* \param fit TRUE if the control shape should be resized in accordance to the given GUI control |
|
*/ |
|
void SetControl(wxWindow * ctrl, bool fit = sfFIT_SHAPE_TO_CONTROL); |
|
/*! |
|
* \brief Get pointer to managed GUI control. |
|
* \return Pointer to the GUI control |
|
*/ |
|
wxWindow * GetControl() { return m_pControl; } |
|
/*! |
|
* \brief Set a way how GUI control's events are processed. |
|
* \param mask Event processing |
|
* \sa EVTPROCESSING |
|
*/ |
|
void SetEventProcessing(int mask){m_nProcessEvents = mask;} |
|
/*! |
|
* \brief Get a way how GUI control's events are processed. |
|
* \return Combination of EVTPROCESSING flags |
|
* \sa EVTPROCESSING |
|
*/ |
|
int GetEventProcessing(){return m_nProcessEvents;} |
|
/*! |
|
* \brief Set control shape's background style used during its modification. |
|
* \param brush Reference to used brush |
|
*/ |
|
void SetModFill(const wxBrush& brush){m_ModFill = brush;} |
|
/*! |
|
* \brief Get control shape's background style used during its modification. |
|
* \return Used brush |
|
*/ |
|
wxBrush GetModFill(){return m_ModFill;} |
|
/*! |
|
* \brief Set control shape's border styl used during its modification. |
|
* \param pen Reference to used pen |
|
*/ |
|
void SetModBorder(const wxPen& pen){m_ModBorder = pen;} |
|
/*! |
|
* \brief Get control shape's border styl used during its modification. |
|
* \return Used pen |
|
*/ |
|
wxPen GetModBorder(){return m_ModBorder;} |
|
/*! |
|
* \brief Set control shape's offset (a gap between the shape's border and managed GUI control). |
|
* \param offset Offset size |
|
*/ |
|
void SetControlOffset(int offset){m_nControlOffset = offset;} |
|
/*! |
|
* \brief Get control shape's offset (a gap between the shape's border and managed GUI control). |
|
* \return Offset size |
|
*/ |
|
int GetControlOffset(){return m_nControlOffset;} |
|
|
|
// public functions |
|
/*! \brief Update size and position of the managed control according to the parent shape. */ |
|
void UpdateControl(); |
|
/*! \brief Update size of the shape position according to the managed control. */ |
|
void UpdateShape(); |
|
|
|
// public virtual functions |
|
|
|
/*! |
|
* \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); |
|
/*! |
|
* \brief Move the shape to the given absolute position. The function can be overrided if necessary. |
|
* \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 Upate shape (align all child shapes an resize it to fit them) */ |
|
virtual void Update(); |
|
|
|
/*! \brief Resize the shape to bound all child shapes. The function can be overrided if neccessary. */ |
|
virtual void FitToChildren(); |
|
|
|
/*! |
|
* \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). |
|
* Default implementation does nothing. |
|
* \sa wxSFShapeCanvas |
|
*/ |
|
virtual void OnBeginDrag(const wxPoint& pos); |
|
/*! |
|
* \brief Event handler called at the end of the shape dragging process. |
|
* The function can be overrided if necessary. |
|
* |
|
* The function is called by the framework (by the shape canvas). |
|
* Default implementation does nothing. |
|
* \param pos Current mouse position |
|
* \sa wxSFShapeCanvas |
|
*/ |
|
virtual void OnEndDrag(const wxPoint& pos); |
|
/*! |
|
* \brief Event handler called when the user started to drag 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 OnBeginHandle(wxSFShapeHandle& handle); |
|
/*! |
|
* \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). |
|
* Default implementation does nothing. |
|
* \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); |
|
|
|
protected: |
|
|
|
// protected data members |
|
|
|
/*! \brief Pointer to manager data control. */ |
|
wxWindow * m_pControl; |
|
/*! \brief Events processing mask */ |
|
int m_nProcessEvents; |
|
|
|
/*! \brief Brush used during the shape's modification. */ |
|
wxBrush m_ModFill; |
|
/*! \brief Pen used during the shape's modification. */ |
|
wxPen m_ModBorder; |
|
/*! \brief Offset between the shape and managed GUI control. */ |
|
int m_nControlOffset; |
|
|
|
// protected functions |
|
|
|
private: |
|
|
|
// private data members |
|
|
|
/*! \brief Pointer to parent window. */ |
|
wxWindow * m_pPrevParent; |
|
/*! \brief Pointer to event sink.*/ |
|
EventSink * m_pEventSink; |
|
/*! \brief Previous canvas style. */ |
|
long m_nPrevStyle; |
|
/*! \brief Previously used shape's brush. */ |
|
wxBrush m_PrevFill; |
|
/*! \brief Previously used shape's pen. */ |
|
wxPen m_PrevBorder; |
|
|
|
// private functions |
|
/*! \brief Initialize serializable properties. */ |
|
void MarkSerializableDataMembers(); |
|
|
|
}; |
|
|
|
#endif //_WXSFCONTROLSHAPE_H
|
|
|