1///////////////////////////////////////////////////////////////////////////// 2// Name: wx/univ/inpcons.h 3// Purpose: wxInputConsumer: mix-in class for input handling 4// Author: Vadim Zeitlin 5// Modified by: 6// Created: 14.08.00 7// RCS-ID: $Id: inpcons.h 61872 2009-09-09 22:37:05Z VZ $ 8// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com) 9// Licence: wxWindows licence 10///////////////////////////////////////////////////////////////////////////// 11 12#ifndef _WX_UNIV_INPCONS_H_ 13#define _WX_UNIV_INPCONS_H_ 14 15class WXDLLEXPORT wxInputHandler; 16class WXDLLEXPORT wxWindow; 17 18#include "wx/object.h" 19#include "wx/event.h" 20 21// ---------------------------------------------------------------------------- 22// wxControlAction: the action is currently just a string which identifies it, 23// later it might become an atom (i.e. an opaque handler to string). 24// ---------------------------------------------------------------------------- 25 26typedef wxString wxControlAction; 27 28// the list of actions which apply to all controls (other actions are defined 29// in the controls headers) 30 31#define wxACTION_NONE wxT("") // no action to perform 32 33// ---------------------------------------------------------------------------- 34// wxInputConsumer: mix-in class for handling wxControlActions (used by 35// wxControl and wxTopLevelWindow). 36// ---------------------------------------------------------------------------- 37 38class WXDLLEXPORT wxInputConsumer 39{ 40public: 41 wxInputConsumer() { m_inputHandler = NULL; } 42 virtual ~wxInputConsumer() { } 43 44 // get the input handler 45 wxInputHandler *GetInputHandler() const { return m_inputHandler; } 46 47 // perform a control-dependent action: an action may have an optional 48 // numeric and another (also optional) string argument whose interpretation 49 // depends on the action 50 // 51 // NB: we might use ellipsis in PerformAction() declaration but this 52 // wouldn't be more efficient than always passing 2 unused parameters 53 // but would be more difficult. Another solution would be to have 54 // several overloaded versions but this will expose the problem of 55 // virtual function hiding we don't have here. 56 virtual bool PerformAction(const wxControlAction& action, 57 long numArg = -1l, 58 const wxString& strArg = wxEmptyString); 59 60 // get the window to work with (usually the class wxInputConsumer was mixed into) 61 virtual wxWindow *GetInputWindow() const = 0; 62 63 // this function must be implemented in any classes process input (i.e. not 64 // static controls) to create the standard input handler for the concrete 65 // class deriving from this mix-in 66 // 67 // the parameter is the default input handler which should receive all 68 // unprocessed input (i.e. typically handlerDef is passed to 69 // wxStdInputHandler ctor) or it may be NULL 70 // 71 // the returned pointer will not be deleted by caller so it must either 72 // point to a static object or be deleted on program termination 73 virtual wxInputHandler *DoGetStdInputHandler(wxInputHandler *handlerDef); 74 75 76protected: 77 // event handlers 78 void OnMouse(wxMouseEvent& event); 79 void OnKeyDown(wxKeyEvent& event); 80 void OnKeyUp(wxKeyEvent& event); 81 void OnFocus(wxFocusEvent& event); 82 void OnActivate(wxActivateEvent& event); 83 84 // create input handler by name, fall back to GetStdInputHandler() if 85 // the current theme doesn't define any specific handler of this type 86 void CreateInputHandler(const wxString& inphandler); 87 88private: 89 // the input processor (we never delete it) 90 wxInputHandler *m_inputHandler; 91}; 92 93 94// ---------------------------------------------------------------------------- 95// macros which must be used by the classes derived from wxInputConsumer mix-in 96// ---------------------------------------------------------------------------- 97 98// declare the methods to be forwarded 99#define WX_DECLARE_INPUT_CONSUMER() \ 100private: \ 101 void OnMouse(wxMouseEvent& event); \ 102 void OnKeyDown(wxKeyEvent& event); \ 103 void OnKeyUp(wxKeyEvent& event); \ 104 void OnFocus(wxFocusEvent& event); \ 105public: /* because of docview :-( */ \ 106 void OnActivate(wxActivateEvent& event); \ 107private: 108 109// implement the event table entries for wxControlContainer 110#define WX_EVENT_TABLE_INPUT_CONSUMER(classname) \ 111 EVT_KEY_DOWN(classname::OnKeyDown) \ 112 EVT_KEY_UP(classname::OnKeyUp) \ 113 EVT_MOUSE_EVENTS(classname::OnMouse) \ 114 EVT_SET_FOCUS(classname::OnFocus) \ 115 EVT_KILL_FOCUS(classname::OnFocus) \ 116 EVT_ACTIVATE(classname::OnActivate) 117 118// Forward event handlers to wxInputConsumer 119// 120// (We can't use them directly, because wxIC has virtual methods, which forces 121// the compiler to include (at least) two vtables into wxControl, one for the 122// wxWindow-wxControlBase-wxControl branch and one for the wxIC mix-in. 123// Consequently, the "this" pointer has different value when in wxControl's 124// and wxIC's method, even though the instance stays same. This doesn't matter 125// so far as member pointers aren't used, but that's not wxControl's case. 126// When we add an event table entry (= use a member pointer) pointing to 127// wxIC's OnXXX method, GCC compiles code that executes wxIC::OnXXX with the 128// version of "this" that belongs to wxControl, not wxIC! In our particular 129// case, the effect is that m_handler is NULL (probably same memory 130// area as the_other_vtable's_this->m_refObj) and input handling doesn't work.) 131#define WX_FORWARD_TO_INPUT_CONSUMER(classname) \ 132 void classname::OnMouse(wxMouseEvent& event) \ 133 { \ 134 wxInputConsumer::OnMouse(event); \ 135 } \ 136 void classname::OnKeyDown(wxKeyEvent& event) \ 137 { \ 138 wxInputConsumer::OnKeyDown(event); \ 139 } \ 140 void classname::OnKeyUp(wxKeyEvent& event) \ 141 { \ 142 wxInputConsumer::OnKeyUp(event); \ 143 } \ 144 void classname::OnFocus(wxFocusEvent& event) \ 145 { \ 146 wxInputConsumer::OnFocus(event); \ 147 } \ 148 void classname::OnActivate(wxActivateEvent& event) \ 149 { \ 150 wxInputConsumer::OnActivate(event); \ 151 } 152 153#endif // _WX_UNIV_INPCONS_H_ 154