| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- ///////////////////////////////////////////////////////////////////////////////
- // Name: wx/mousemanager.h
- // Purpose: wxMouseEventsManager class declaration
- // Author: Vadim Zeitlin
- // Created: 2009-04-20
- // Copyright: (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org>
- // Licence: wxWindows licence
- ///////////////////////////////////////////////////////////////////////////////
- #ifndef _WX_MOUSEMANAGER_H_
- #define _WX_MOUSEMANAGER_H_
- #include "wx/event.h"
- // ----------------------------------------------------------------------------
- // wxMouseEventsManager
- // ----------------------------------------------------------------------------
- /*
- This class handles mouse events and synthesizes high-level notifications
- such as clicks and drag events from low level mouse button presses and
- mouse movement events. It is useful because handling the mouse events is
- less obvious than might seem at a first glance: for example, clicks on an
- object should only be generated if the mouse was both pressed and released
- over it and not just released (so it requires storing the previous state)
- and dragging shouldn't start before the mouse moves away far enough.
- This class encapsulates all these dull details for controls containing
- multiple items which can be identified by a positive integer index and you
- just need to implement its pure virtual functions to use it.
- */
- class WXDLLIMPEXP_CORE wxMouseEventsManager : public wxEvtHandler
- {
- public:
- // a mouse event manager is always associated with a window and must be
- // deleted by the window when it is destroyed so if it is created using the
- // default ctor Create() must be called later
- wxMouseEventsManager() { Init(); }
- wxMouseEventsManager(wxWindow *win) { Init(); Create(win); }
- bool Create(wxWindow *win);
- virtual ~wxMouseEventsManager();
- protected:
- // called to find the item at the given position: return wxNOT_FOUND (-1)
- // if there is no item here
- virtual int MouseHitTest(const wxPoint& pos) = 0;
- // called when the user clicked (i.e. pressed and released mouse over the
- // same item), should normally generate a notification about this click and
- // return true if it was handled or false otherwise, determining whether
- // the original mouse event is skipped or not
- virtual bool MouseClicked(int item) = 0;
- // called to start dragging the given item, should generate the appropriate
- // BEGIN_DRAG event and return false if dragging this item was forbidden
- virtual bool MouseDragBegin(int item, const wxPoint& pos) = 0;
- // called while the item is being dragged, should normally update the
- // feedback on screen (usually using wxOverlay)
- virtual void MouseDragging(int item, const wxPoint& pos) = 0;
- // called when the mouse is released after dragging the item
- virtual void MouseDragEnd(int item, const wxPoint& pos) = 0;
- // called when mouse capture is lost while dragging the item, should remove
- // the visual feedback drawn by MouseDragging()
- virtual void MouseDragCancelled(int item) = 0;
- // you don't need to override those but you will want to do if it your
- // control renders pressed items differently
- // called when the item is becomes pressed, can be used to change its
- // appearance
- virtual void MouseClickBegin(int WXUNUSED(item)) { }
- // called if the mouse capture was lost while the item was pressed, can be
- // used to restore the default item appearance if it was changed in
- // MouseClickBegin()
- virtual void MouseClickCancelled(int WXUNUSED(item)) { }
- private:
- /*
- Here is a small diagram explaining the switches between different
- states:
- /---------->NORMAL<--------------- Drag end
- / / / | event
- / / | | ^
- / / | | |
- Click / N | | mouse | mouse up
- event / | | down |
- | / | | DRAGGING
- | / | | ^
- Y|/ N \ v |Y
- +-------------+ +--------+ N +-----------+
- |On same item?| |On item?| -----------|Begin drag?|
- +-------------+ +--------+ / +-----------+
- ^ | / ^
- | | / |
- \ mouse | / mouse moved |
- \ up v v far enough /
- \--------PRESSED-------------------/
- There are also transitions from PRESSED and DRAGGING to NORMAL in case
- the mouse capture is lost or Escape key is pressed which are not shown.
- */
- enum State
- {
- State_Normal, // initial, default state
- State_Pressed, // mouse was pressed over an item
- State_Dragging // the item is being dragged
- };
- // common part of both ctors
- void Init();
- // various event handlers
- void OnCaptureLost(wxMouseCaptureLostEvent& event);
- void OnLeftDown(wxMouseEvent& event);
- void OnLeftUp(wxMouseEvent& event);
- void OnMove(wxMouseEvent& event);
- // the associated window, never NULL except between the calls to the
- // default ctor and Create()
- wxWindow *m_win;
- // the current state
- State m_state;
- // the details of the operation currently in progress, only valid if
- // m_state is not normal
- // the item being pressed or dragged (always valid, i.e. != wxNOT_FOUND if
- // m_state != State_Normal)
- int m_item;
- // the position of the last mouse event of interest: either mouse press in
- // State_Pressed or last movement event in State_Dragging
- wxPoint m_posLast;
- DECLARE_EVENT_TABLE()
- wxDECLARE_NO_COPY_CLASS(wxMouseEventsManager);
- };
- #endif // _WX_MOUSEMANAGER_H_
|