git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60839 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			155 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
///////////////////////////////////////////////////////////////////////////////
 | 
						|
// Name:        wx/mousemanager.h
 | 
						|
// Purpose:     wxMouseEventsManager class declaration
 | 
						|
// Author:      Vadim Zeitlin
 | 
						|
// Created:     2009-04-20
 | 
						|
// RCS-ID:      $Id$
 | 
						|
// 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_
 | 
						|
 |