X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3dd9b88ac26caa8dbcc26c7fafc10cd886fc97ac..c822ad5a5e30a21ca3340af644bf79804cf7c777:/include/wx/event.h?ds=sidebyside diff --git a/include/wx/event.h b/include/wx/event.h index cb13126bf6..cedaf922eb 100644 --- a/include/wx/event.h +++ b/include/wx/event.h @@ -18,6 +18,7 @@ #include "wx/defs.h" #include "wx/object.h" +#include "wx/clntdata.h" #if wxUSE_GUI #include "wx/gdicmn.h" @@ -33,7 +34,6 @@ class WXDLLEXPORT wxList; #if wxUSE_GUI - class WXDLLEXPORT wxClientData; class WXDLLEXPORT wxDC; class WXDLLEXPORT wxMenu; class WXDLLEXPORT wxWindow; @@ -76,6 +76,7 @@ typedef int wxEventType; #define DECLARE_EVENT_TYPE(name, value) name = wxEVT_FIRST + value, #define DECLARE_LOCAL_EVENT_TYPE(name, value) name = wxEVT_FIRST + value, #define DEFINE_EVENT_TYPE(name) +#define DEFINE_LOCAL_EVENT_TYPE(name) #else // !WXWIN_COMPATIBILITY_EVENT_TYPES @@ -89,6 +90,7 @@ typedef int wxEventType; extern const wxEventType WXDLLEXPORT name; #define DECLARE_LOCAL_EVENT_TYPE(name, value) extern const wxEventType name; #define DEFINE_EVENT_TYPE(name) const wxEventType name = wxNewEventType(); +#define DEFINE_LOCAL_EVENT_TYPE(name) const wxEventType name = wxNewEventType(); // generate a new unique event type extern WXDLLEXPORT wxEventType wxNewEventType(); @@ -104,7 +106,7 @@ BEGIN_DECLARE_EVENT_TYPES() #else // !WXWIN_COMPATIBILITY_EVENT_TYPES // it is important to still have these as constants to avoid // initialization order related problems - DECLARE_EVENT_TYPE(wxEVT_NULL,0); + DECLARE_EVENT_TYPE(wxEVT_NULL,0); const wxEventType wxEVT_FIRST = 10000; const wxEventType wxEVT_USER_FIRST = wxEVT_FIRST + 2000; #endif // WXWIN_COMPATIBILITY_EVENT_TYPES/!WXWIN_COMPATIBILITY_EVENT_TYPES @@ -115,8 +117,13 @@ BEGIN_DECLARE_EVENT_TYPES() DECLARE_EVENT_TYPE(wxEVT_COMMAND_LISTBOX_SELECTED, 4) DECLARE_EVENT_TYPE(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, 5) DECLARE_EVENT_TYPE(wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, 6) + // now they are in wx/textctrl.h +#if WXWIN_COMPATIBILITY_EVENT_TYPES DECLARE_EVENT_TYPE(wxEVT_COMMAND_TEXT_UPDATED, 7) DECLARE_EVENT_TYPE(wxEVT_COMMAND_TEXT_ENTER, 8) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TEXT_URL, 13) + DECLARE_EVENT_TYPE(wxEVT_COMMAND_TEXT_MAXLEN, 14) +#endif // WXWIN_COMPATIBILITY_EVENT_TYPES DECLARE_EVENT_TYPE(wxEVT_COMMAND_MENU_SELECTED, 9) DECLARE_EVENT_TYPE(wxEVT_COMMAND_SLIDER_UPDATED, 10) DECLARE_EVENT_TYPE(wxEVT_COMMAND_RADIOBOX_SELECTED, 11) @@ -151,7 +158,8 @@ BEGIN_DECLARE_EVENT_TYPES() DECLARE_EVENT_TYPE(wxEVT_RIGHT_DCLICK, 111) DECLARE_EVENT_TYPE(wxEVT_SET_FOCUS, 112) DECLARE_EVENT_TYPE(wxEVT_KILL_FOCUS, 113) - DECLARE_EVENT_TYPE(wxEVT_MOUSEWHEEL, 114) + DECLARE_EVENT_TYPE(wxEVT_CHILD_FOCUS, 114) + DECLARE_EVENT_TYPE(wxEVT_MOUSEWHEEL, 115) // Non-client mouse events DECLARE_EVENT_TYPE(wxEVT_NC_LEFT_DOWN, 200) @@ -222,20 +230,21 @@ BEGIN_DECLARE_EVENT_TYPES() DECLARE_EVENT_TYPE(wxEVT_POPUP_MENU_INIT, 423) DECLARE_EVENT_TYPE(wxEVT_CONTEXT_MENU, 424) DECLARE_EVENT_TYPE(wxEVT_SYS_COLOUR_CHANGED, 425) - DECLARE_EVENT_TYPE(wxEVT_SETTING_CHANGED, 426) - DECLARE_EVENT_TYPE(wxEVT_QUERY_NEW_PALETTE, 427) - DECLARE_EVENT_TYPE(wxEVT_PALETTE_CHANGED, 428) - DECLARE_EVENT_TYPE(wxEVT_JOY_BUTTON_DOWN, 429) - DECLARE_EVENT_TYPE(wxEVT_JOY_BUTTON_UP, 430) - DECLARE_EVENT_TYPE(wxEVT_JOY_MOVE, 431) - DECLARE_EVENT_TYPE(wxEVT_JOY_ZMOVE, 432) - DECLARE_EVENT_TYPE(wxEVT_DROP_FILES, 433) - DECLARE_EVENT_TYPE(wxEVT_DRAW_ITEM, 434) - DECLARE_EVENT_TYPE(wxEVT_MEASURE_ITEM, 435) - DECLARE_EVENT_TYPE(wxEVT_COMPARE_ITEM, 436) - DECLARE_EVENT_TYPE(wxEVT_INIT_DIALOG, 437) - DECLARE_EVENT_TYPE(wxEVT_IDLE, 438) - DECLARE_EVENT_TYPE(wxEVT_UPDATE_UI, 439) + DECLARE_EVENT_TYPE(wxEVT_DISPLAY_CHANGED, 426) + DECLARE_EVENT_TYPE(wxEVT_SETTING_CHANGED, 427) + DECLARE_EVENT_TYPE(wxEVT_QUERY_NEW_PALETTE, 428) + DECLARE_EVENT_TYPE(wxEVT_PALETTE_CHANGED, 429) + DECLARE_EVENT_TYPE(wxEVT_JOY_BUTTON_DOWN, 430) + DECLARE_EVENT_TYPE(wxEVT_JOY_BUTTON_UP, 431) + DECLARE_EVENT_TYPE(wxEVT_JOY_MOVE, 432) + DECLARE_EVENT_TYPE(wxEVT_JOY_ZMOVE, 433) + DECLARE_EVENT_TYPE(wxEVT_DROP_FILES, 434) + DECLARE_EVENT_TYPE(wxEVT_DRAW_ITEM, 435) + DECLARE_EVENT_TYPE(wxEVT_MEASURE_ITEM, 436) + DECLARE_EVENT_TYPE(wxEVT_COMPARE_ITEM, 437) + DECLARE_EVENT_TYPE(wxEVT_INIT_DIALOG, 438) + DECLARE_EVENT_TYPE(wxEVT_IDLE, 439) + DECLARE_EVENT_TYPE(wxEVT_UPDATE_UI, 440) // Generic command events // Note: a click is a higher-level event than button down/up @@ -256,7 +265,17 @@ END_DECLARE_EVENT_TYPES() // these 2 events are the same #define wxEVT_COMMAND_TOOL_CLICKED wxEVT_COMMAND_MENU_SELECTED +// ---------------------------------------------------------------------------- // Compatibility +// ---------------------------------------------------------------------------- + +// this event is also used by wxComboBox and wxSpinCtrl which don't include +// wx/textctrl.h in all ports [yet], so declare it here as well +// +// still, any new code using it should include wx/textctrl.h explicitly +#if !WXWIN_COMPATIBILITY_EVENT_TYPES + extern const wxEventType WXDLLEXPORT wxEVT_COMMAND_TEXT_UPDATED; +#endif #if WXWIN_COMPATIBILITY @@ -315,11 +334,11 @@ END_DECLARE_EVENT_TYPES() class WXDLLEXPORT wxEvent : public wxObject { - DECLARE_ABSTRACT_CLASS(wxEvent) +protected: + wxEvent(const wxEvent&); // for implementing Clone() public: - wxEvent(int id = 0); - ~wxEvent() {} + wxEvent(int id = 0, wxEventType commandType = wxEVT_NULL ); void SetEventType(wxEventType typ) { m_eventType = typ; } wxEventType GetEventType() const { return m_eventType; } @@ -337,11 +356,14 @@ public: void Skip(bool skip = TRUE) { m_skipped = skip; } bool GetSkipped() const { return m_skipped; }; - // implementation only: this test is explicitlty anti OO and this functions - // exists only for optimization purposes + // Implementation only: this test is explicitlty anti OO and this functions + // exists only for optimization purposes. bool IsCommandEvent() const { return m_isCommandEvent; } - void CopyObject(wxObject& object_dest) const; + // this function is used to create a copy of the event polymorphically and + // all derived classes must implement it because otherwise wxPostEvent() + // for them wouldn't work (it needs to do a copy of the event) + virtual wxEvent *Clone() const = 0; public: wxObject* m_eventObject; @@ -350,10 +372,10 @@ public: int m_id; wxObject* m_callbackUserData; bool m_skipped; - - // optimization: instead of using costly IsKindOf() we keep a flag telling - // whether we're a command event (by far the most common case) bool m_isCommandEvent; + +private: + DECLARE_ABSTRACT_CLASS(wxEvent) }; #if wxUSE_GUI @@ -379,16 +401,8 @@ public: class WXDLLEXPORT wxCommandEvent : public wxEvent { - DECLARE_DYNAMIC_CLASS(wxCommandEvent) - public: wxCommandEvent(wxEventType commandType = wxEVT_NULL, int id = 0); - ~wxCommandEvent() {} - - /* - * Accessors dependent on context - * - */ // Set/Get client data from controls void SetClientData(void* clientData) { m_clientData = clientData; } @@ -417,9 +431,9 @@ public: void SetInt(int i) { m_commandInt = i; } long GetInt() const { return m_commandInt ; } - void CopyObject(wxObject& obj) const; + virtual wxEvent *Clone() const { return new wxCommandEvent(*this); } -#ifdef WXWIN_COMPATIBILITY_2 +#if WXWIN_COMPATIBILITY_2 bool Checked() const { return IsChecked(); } #endif // WXWIN_COMPATIBILITY_2 @@ -429,6 +443,9 @@ public: long m_extraLong; // Additional information (e.g. select/deselect) void* m_clientData; // Arbitrary client data wxClientData* m_clientObject; // Arbitrary client object + +private: + DECLARE_DYNAMIC_CLASS(wxCommandEvent) }; // this class adds a possibility to react (from the user) code to a control @@ -448,13 +465,12 @@ public: // for implementation code only: is the operation allowed? bool IsAllowed() const { return m_bAllow; } - // probably useless: CopyObject() is used for deferred event - // handling but wxNotifyEvent must be processed immediately - void CopyObject(wxObject& obj) const; + virtual wxEvent *Clone() const { return new wxNotifyEvent(*this); } private: bool m_bAllow; +private: DECLARE_DYNAMIC_CLASS(wxNotifyEvent) }; @@ -473,22 +489,19 @@ private: class WXDLLEXPORT wxScrollEvent : public wxCommandEvent { - DECLARE_DYNAMIC_CLASS(wxScrollEvent) - public: wxScrollEvent(wxEventType commandType = wxEVT_NULL, int id = 0, int pos = 0, int orient = 0); - ~wxScrollEvent() {} - - /* - * Accessors - * - */ int GetOrientation() const { return (int) m_extraLong ; } int GetPosition() const { return m_commandInt ; } void SetOrientation(int orient) { m_extraLong = (long) orient; } void SetPosition(int pos) { m_commandInt = pos; } + + virtual wxEvent *Clone() const { return new wxScrollEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS(wxScrollEvent) }; // ScrollWin event class, derived fom wxEvent. wxScrollWinEvents @@ -506,26 +519,23 @@ public: class WXDLLEXPORT wxScrollWinEvent : public wxEvent { - DECLARE_DYNAMIC_CLASS(wxScrollWinEvent) - public: wxScrollWinEvent(wxEventType commandType = wxEVT_NULL, int pos = 0, int orient = 0); - ~wxScrollWinEvent() {} - - /* - * Accessors - */ int GetOrientation() const { return (int) m_extraLong ; } int GetPosition() const { return m_commandInt ; } void SetOrientation(int orient) { m_extraLong = (long) orient; } void SetPosition(int pos) { m_commandInt = pos; } - void CopyObject(wxObject& object_dest) const; + virtual wxEvent *Clone() const { return new wxScrollWinEvent(*this); } + public: - int m_commandInt; // Additional information + int m_commandInt; long m_extraLong; + +private: + DECLARE_DYNAMIC_CLASS(wxScrollWinEvent) }; // Mouse event class @@ -559,8 +569,6 @@ public: class WXDLLEXPORT wxMouseEvent : public wxEvent { - DECLARE_DYNAMIC_CLASS(wxMouseEvent) - public: wxMouseEvent(wxEventType mouseType = wxEVT_NULL); @@ -582,6 +590,9 @@ public: // Was the given button 1,2,3 or any in Down state? bool ButtonIsDown(int but) const; + // Get the button which is changing state (-1 if none) + int GetButton() const; + // Find state of shift/control keys bool ControlDown() const { return m_controlDown; } bool MetaDown() const { return m_metaDown; } @@ -688,8 +699,7 @@ public: // wheel action. Defaults to one. int GetLinesPerAction() const { return m_linesPerAction; } - - void CopyObject(wxObject& obj) const; + virtual wxEvent *Clone() const { return new wxMouseEvent(*this); } public: wxCoord m_x, m_y; @@ -706,6 +716,9 @@ public: int m_wheelRotation; int m_wheelDelta; int m_linesPerAction; + +private: + DECLARE_DYNAMIC_CLASS(wxMouseEvent) }; // Cursor set event @@ -717,7 +730,7 @@ public: class WXDLLEXPORT wxSetCursorEvent : public wxEvent { public: - wxSetCursorEvent(wxCoord x, wxCoord y) + wxSetCursorEvent(wxCoord x = 0, wxCoord y = 0) { m_eventType = wxEVT_SET_CURSOR; @@ -732,9 +745,14 @@ public: const wxCursor& GetCursor() const { return m_cursor; } bool HasCursor() const { return m_cursor.Ok(); } + virtual wxEvent *Clone() const { return new wxSetCursorEvent(*this); } + private: wxCoord m_x, m_y; wxCursor m_cursor; + +private: + DECLARE_DYNAMIC_CLASS(wxSetCursorEvent) }; // Keyboard input event class @@ -748,8 +766,6 @@ private: class WXDLLEXPORT wxKeyEvent : public wxEvent { - DECLARE_DYNAMIC_CLASS(wxKeyEvent) - public: wxKeyEvent(wxEventType keyType = wxEVT_NULL); @@ -759,7 +775,10 @@ public: bool AltDown() const { return m_altDown; } bool ShiftDown() const { return m_shiftDown; } - bool HasModifiers() const { return ControlDown() || AltDown() || MetaDown(); } + // exclude MetaDown() from HasModifiers() because NumLock under X is often + // configured as mod2 modifier, yet the key events even when it is pressed + // should be processed normally, not like Ctrl- or Alt-key + bool HasModifiers() const { return ControlDown() || AltDown(); } // get the key code: an ASCII7 char or an element of wxKeyCode enum int GetKeyCode() const { return (int)m_keyCode; } @@ -788,11 +807,29 @@ public: // Get Y position wxCoord GetY() const { return m_y; } - void CopyObject(wxObject& obj) const; - // deprecated long KeyCode() const { return m_keyCode; } + virtual wxEvent *Clone() const { return new wxKeyEvent(*this); } + + // we do need to copy wxKeyEvent sometimes (in wxTreeCtrl code, for + // example) + wxKeyEvent& operator=(const wxKeyEvent& evt) + { + m_x = evt.m_x; + m_y = evt.m_y; + + m_keyCode = evt.m_keyCode; + + m_controlDown = evt.m_controlDown; + m_shiftDown = evt.m_shiftDown; + m_altDown = evt.m_altDown; + m_metaDown = evt.m_metaDown; + m_scanCode = evt.m_scanCode; + + return *this; + } + public: wxCoord m_x, m_y; @@ -803,6 +840,9 @@ public: bool m_altDown; bool m_metaDown; bool m_scanCode; + +private: + DECLARE_DYNAMIC_CLASS(wxKeyEvent) }; // Size event class @@ -812,11 +852,7 @@ public: class WXDLLEXPORT wxSizeEvent : public wxEvent { - DECLARE_DYNAMIC_CLASS(wxSizeEvent) - public: - wxSize m_size; - wxSizeEvent() { m_eventType = wxEVT_SIZE; } wxSizeEvent(const wxSize& sz, int id = 0) : m_size(sz) @@ -824,7 +860,13 @@ public: wxSize GetSize() const { return m_size; } - void CopyObject(wxObject& obj) const; + virtual wxEvent *Clone() const { return new wxSizeEvent(*this); } + +public: + wxSize m_size; + +private: + DECLARE_DYNAMIC_CLASS(wxSizeEvent) }; // Move event class @@ -835,11 +877,7 @@ public: class WXDLLEXPORT wxMoveEvent : public wxEvent { - DECLARE_DYNAMIC_CLASS(wxMoveEvent) - public: - wxPoint m_pos; - wxMoveEvent() { m_eventType = wxEVT_MOVE; } wxMoveEvent(const wxPoint& pos, int id = 0) : m_pos(pos) @@ -847,7 +885,12 @@ public: wxPoint GetPosition() const { return m_pos; } - void CopyObject(wxObject& obj) const; + virtual wxEvent *Clone() const { return new wxMoveEvent(*this); } + + wxPoint m_pos; + +private: + DECLARE_DYNAMIC_CLASS(wxMoveEvent) }; // Paint event class @@ -864,8 +907,6 @@ public: class WXDLLEXPORT wxPaintEvent : public wxEvent { - DECLARE_DYNAMIC_CLASS(wxPaintEvent) - public: wxPaintEvent(int Id = 0) { @@ -884,6 +925,22 @@ public: g_isPainting--; } #endif // debug + + virtual wxEvent *Clone() const { return new wxPaintEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS(wxPaintEvent) +}; + +class WXDLLEXPORT wxNcPaintEvent : public wxEvent +{ +public: + wxNcPaintEvent(int id = 0) : wxEvent(id) { SetEventType(wxEVT_NC_PAINT); } + + virtual wxEvent *Clone() const { return new wxNcPaintEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS(wxNcPaintEvent) }; // Erase background event class @@ -893,16 +950,18 @@ public: class WXDLLEXPORT wxEraseEvent : public wxEvent { - DECLARE_DYNAMIC_CLASS(wxEraseEvent) - public: - wxDC *m_dc; - wxEraseEvent(int Id = 0, wxDC *dc = (wxDC *) NULL) { m_eventType = wxEVT_ERASE_BACKGROUND; m_id = Id; m_dc = dc; } + wxDC *GetDC() const { return m_dc; } - void CopyObject(wxObject& obj) const; + virtual wxEvent *Clone() const { return new wxEraseEvent(*this); } + + wxDC *m_dc; + +private: + DECLARE_DYNAMIC_CLASS(wxEraseEvent) }; // Focus event class @@ -913,11 +972,38 @@ public: class WXDLLEXPORT wxFocusEvent : public wxEvent { +public: + wxFocusEvent(wxEventType type = wxEVT_NULL, int id = 0) + { m_eventType = type; m_id = id; m_win = NULL; } + + // The window associated with this event is the window which had focus + // before for SET event and the window which will have focus for the KILL + // one. NB: it may be NULL in both cases! + wxWindow *GetWindow() const { return m_win; } + void SetWindow(wxWindow *win) { m_win = win; } + + virtual wxEvent *Clone() const { return new wxFocusEvent(*this); } + +private: + wxWindow *m_win; + +private: DECLARE_DYNAMIC_CLASS(wxFocusEvent) +}; +// wxChildFocusEvent notifies the parent that a child has got the focus: unlike +// wxFocusEvent it is propgated upwards the window chain +class WXDLLEXPORT wxChildFocusEvent : public wxCommandEvent +{ public: - wxFocusEvent(wxEventType type = wxEVT_NULL, int Id = 0) - { m_eventType = type; m_id = Id; } + wxChildFocusEvent(wxWindow *win = NULL); + + wxWindow *GetWindow() const { return (wxWindow *)GetEventObject(); } + + virtual wxEvent *Clone() const { return new wxChildFocusEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS(wxChildFocusEvent) }; // Activate event class @@ -928,17 +1014,19 @@ public: class WXDLLEXPORT wxActivateEvent : public wxEvent { - DECLARE_DYNAMIC_CLASS(wxActivateEvent) - public: wxActivateEvent(wxEventType type = wxEVT_NULL, bool active = TRUE, int Id = 0) { m_eventType = type; m_active = active; m_id = Id; } + bool GetActive() const { return m_active; } - void CopyObject(wxObject& obj) const; + virtual wxEvent *Clone() const { return new wxActivateEvent(*this); } private: bool m_active; + +private: + DECLARE_DYNAMIC_CLASS(wxActivateEvent) }; // InitDialog event class @@ -948,11 +1036,14 @@ private: class WXDLLEXPORT wxInitDialogEvent : public wxEvent { - DECLARE_DYNAMIC_CLASS(wxInitDialogEvent) - public: wxInitDialogEvent(int Id = 0) { m_eventType = wxEVT_INIT_DIALOG; m_id = Id; } + + virtual wxEvent *Clone() const { return new wxInitDialogEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS(wxInitDialogEvent) }; // Miscellaneous menu event class @@ -965,17 +1056,19 @@ public: class WXDLLEXPORT wxMenuEvent : public wxEvent { - DECLARE_DYNAMIC_CLASS(wxMenuEvent) - public: wxMenuEvent(wxEventType type = wxEVT_NULL, int id = 0) - { m_eventType = type; m_menuId = id; } + { m_eventType = type; m_menuId = id; m_id = id; } int GetMenuId() const { return m_menuId; } - void CopyObject(wxObject& obj) const; + virtual wxEvent *Clone() const { return new wxMenuEvent(*this); } + private: int m_menuId; + +private: + DECLARE_DYNAMIC_CLASS(wxMenuEvent) }; // Window close or session close event class @@ -987,8 +1080,6 @@ private: class WXDLLEXPORT wxCloseEvent : public wxEvent { - DECLARE_DYNAMIC_CLASS(wxCloseEvent) - public: wxCloseEvent(wxEventType type = wxEVT_NULL, int id = 0) { @@ -1026,7 +1117,7 @@ public: bool GetForce() const { return m_force; } #endif - void CopyObject(wxObject& obj) const; + virtual wxEvent *Clone() const { return new wxCloseEvent(*this); } protected: bool m_loggingOff; @@ -1035,6 +1126,10 @@ protected: #if WXWIN_COMPATIBILITY bool m_force; #endif + +private: + DECLARE_DYNAMIC_CLASS(wxCloseEvent) + }; /* @@ -1050,11 +1145,12 @@ public: void SetShow(bool show) { m_show = show; } bool GetShow() const { return m_show; } - void CopyObject(wxObject& obj) const; + virtual wxEvent *Clone() const { return new wxShowEvent(*this); } protected: bool m_show; +private: DECLARE_DYNAMIC_CLASS(wxShowEvent) }; @@ -1071,12 +1167,14 @@ public: // return true if the frame was iconized, false if restored bool Iconized() const { return m_iconized; } + virtual wxEvent *Clone() const { return new wxIconizeEvent(*this); } + protected: bool m_iconized; +private: DECLARE_DYNAMIC_CLASS(wxIconizeEvent) }; - /* wxEVT_MAXIMIZE */ @@ -1087,6 +1185,9 @@ public: wxMaximizeEvent(int id = 0) { m_eventType = wxEVT_MAXIMIZE; m_id = id; } + virtual wxEvent *Clone() const { return new wxMaximizeEvent(*this); } + +private: DECLARE_DYNAMIC_CLASS(wxMaximizeEvent) }; @@ -1111,8 +1212,6 @@ public: class WXDLLEXPORT wxJoystickEvent : public wxEvent { - DECLARE_DYNAMIC_CLASS(wxJoystickEvent) - public: wxPoint m_pos; int m_zPosition; @@ -1170,7 +1269,10 @@ public: { return (((but == wxJOY_BUTTON_ANY) && (m_buttonState != 0)) || ((m_buttonState & but) == but)); } - void CopyObject(wxObject& obj) const; + virtual wxEvent *Clone() const { return new wxJoystickEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS(wxJoystickEvent) }; // Drop files event class @@ -1180,23 +1282,41 @@ public: class WXDLLEXPORT wxDropFilesEvent : public wxEvent { - DECLARE_DYNAMIC_CLASS(wxDropFilesEvent) - public: int m_noFiles; wxPoint m_pos; - wxString* m_files; // Memory (de)allocated by code calling ProcessEvent + wxString* m_files; wxDropFilesEvent(wxEventType type = wxEVT_NULL, int noFiles = 0, wxString *files = (wxString *) NULL) { m_eventType = type; m_noFiles = noFiles; m_files = files; } + // we need a copy ctor to avoid deleting m_files pointer twice + wxDropFilesEvent(const wxDropFilesEvent& other) + : m_pos(other.m_pos) + { + m_noFiles = other.m_noFiles; + m_files = new wxString[m_noFiles]; + for ( int n = 0; n < m_noFiles; n++ ) + { + m_files[n] = other.m_files[n]; + } + } + + virtual ~wxDropFilesEvent() + { + delete [] m_files; + } + wxPoint GetPosition() const { return m_pos; } int GetNumberOfFiles() const { return m_noFiles; } wxString *GetFiles() const { return m_files; } - void CopyObject(wxObject& obj) const; + virtual wxEvent *Clone() const { return new wxDropFilesEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS(wxDropFilesEvent) }; // Update UI event @@ -1206,8 +1326,6 @@ public: class WXDLLEXPORT wxUpdateUIEvent : public wxCommandEvent { - DECLARE_DYNAMIC_CLASS(wxUpdateUIEvent) - public: wxUpdateUIEvent(wxWindowID commandId = 0) { @@ -1232,7 +1350,7 @@ public: void Enable(bool enable) { m_enabled = enable; m_setEnabled = TRUE; } void SetText(const wxString& text) { m_text = text; m_setText = TRUE; } - void CopyObject(wxObject& obj) const; + virtual wxEvent *Clone() const { return new wxUpdateUIEvent(*this); } protected: bool m_checked; @@ -1241,6 +1359,9 @@ protected: bool m_setText; bool m_setChecked; wxString m_text; + +private: + DECLARE_DYNAMIC_CLASS(wxUpdateUIEvent) }; /* @@ -1250,11 +1371,29 @@ protected: // TODO: shouldn't all events record the window ID? class WXDLLEXPORT wxSysColourChangedEvent : public wxEvent { - DECLARE_DYNAMIC_CLASS(wxSysColourChangedEvent) - public: wxSysColourChangedEvent() { m_eventType = wxEVT_SYS_COLOUR_CHANGED; } + + virtual wxEvent *Clone() const { return new wxSysColourChangedEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS(wxSysColourChangedEvent) +}; + +/* + wxEVT_DISPLAY_CHANGED + */ +class WXDLLEXPORT wxDisplayChangedEvent : public wxEvent +{ +private: + DECLARE_DYNAMIC_CLASS(wxDisplayChangedEvent) + +public: + wxDisplayChangedEvent() + { m_eventType = wxEVT_DISPLAY_CHANGED; } + + virtual wxEvent *Clone() const { return new wxDisplayChangedEvent(*this); } }; /* @@ -1263,8 +1402,6 @@ public: class WXDLLEXPORT wxPaletteChangedEvent : public wxEvent { - DECLARE_DYNAMIC_CLASS(wxPaletteChangedEvent) - public: wxPaletteChangedEvent(wxWindowID id = 0) : wxEvent(id) { @@ -1275,10 +1412,13 @@ public: void SetChangedWindow(wxWindow* win) { m_changedWindow = win; } wxWindow* GetChangedWindow() const { return m_changedWindow; } - void CopyObject(wxObject& obj) const; + virtual wxEvent *Clone() const { return new wxPaletteChangedEvent(*this); } protected: wxWindow* m_changedWindow; + +private: + DECLARE_DYNAMIC_CLASS(wxPaletteChangedEvent) }; /* @@ -1288,8 +1428,6 @@ protected: class WXDLLEXPORT wxQueryNewPaletteEvent : public wxEvent { - DECLARE_DYNAMIC_CLASS(wxQueryNewPaletteEvent) - public: wxQueryNewPaletteEvent(wxWindowID id = 0): wxEvent(id) { m_eventType = wxEVT_QUERY_NEW_PALETTE; m_paletteRealized = FALSE; } @@ -1298,10 +1436,13 @@ public: void SetPaletteRealized(bool realized) { m_paletteRealized = realized; } bool GetPaletteRealized() const { return m_paletteRealized; } - void CopyObject(wxObject& obj) const; + virtual wxEvent *Clone() const { return new wxQueryNewPaletteEvent(*this); } protected: bool m_paletteRealized; + +private: + DECLARE_DYNAMIC_CLASS(wxQueryNewPaletteEvent) }; /* @@ -1346,6 +1487,8 @@ public: wxWindow* GetCurrentFocus() const { return m_focus; } void SetCurrentFocus(wxWindow *win) { m_focus = win; } + virtual wxEvent *Clone() const { return new wxNavigationKeyEvent(*this); } + private: enum { @@ -1357,6 +1500,7 @@ private: long m_flags; wxWindow *m_focus; +private: DECLARE_DYNAMIC_CLASS(wxNavigationKeyEvent) }; @@ -1372,22 +1516,28 @@ private: class WXDLLEXPORT wxWindowCreateEvent : public wxCommandEvent { - DECLARE_DYNAMIC_CLASS(wxWindowCreateEvent) - public: wxWindowCreateEvent(wxWindow *win = NULL); wxWindow *GetWindow() const { return (wxWindow *)GetEventObject(); } + + virtual wxEvent *Clone() const { return new wxWindowCreateEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS(wxWindowCreateEvent) }; class WXDLLEXPORT wxWindowDestroyEvent : public wxCommandEvent { - DECLARE_DYNAMIC_CLASS(wxWindowDestroyEvent) - public: wxWindowDestroyEvent(wxWindow *win = NULL); wxWindow *GetWindow() const { return (wxWindow *)GetEventObject(); } + + virtual wxEvent *Clone() const { return new wxWindowDestroyEvent(*this); } + +private: + DECLARE_DYNAMIC_CLASS(wxWindowDestroyEvent) }; // A help event is sent when the user clicks on a window in context-help mode. @@ -1420,6 +1570,8 @@ public: const wxString& GetTarget() const { return m_target; } void SetTarget(const wxString& target) { m_target = target; } + virtual wxEvent *Clone() const { return new wxHelpEvent(*this); } + protected: wxPoint m_pos; wxString m_target; @@ -1453,6 +1605,8 @@ public: const wxPoint& GetPosition() const { return m_pos; } void SetPosition(const wxPoint& pos) { m_pos = pos; } + virtual wxEvent *Clone() const { return new wxContextMenuEvent(*this); } + protected: wxPoint m_pos; @@ -1460,8 +1614,6 @@ private: DECLARE_DYNAMIC_CLASS(wxContextMenuEvent) }; -#endif // wxUSE_GUI - // Idle event /* wxEVT_IDLE @@ -1469,8 +1621,6 @@ private: class WXDLLEXPORT wxIdleEvent : public wxEvent { - DECLARE_DYNAMIC_CLASS(wxIdleEvent) - public: wxIdleEvent() { m_eventType = wxEVT_IDLE; m_requestMore = FALSE; } @@ -1478,12 +1628,17 @@ public: void RequestMore(bool needMore = TRUE) { m_requestMore = needMore; } bool MoreRequested() const { return m_requestMore; } - void CopyObject(wxObject& obj) const; + virtual wxEvent *Clone() const { return new wxIdleEvent(*this); } protected: bool m_requestMore; + +private: + DECLARE_DYNAMIC_CLASS(wxIdleEvent) }; +#endif // wxUSE_GUI + /* TODO wxEVT_POWER, wxEVT_MOUSE_CAPTURE_CHANGED, @@ -1495,6 +1650,7 @@ protected: wxEVT_COMPARE_ITEM */ + // ============================================================================ // event handler and related classes // ============================================================================ @@ -1644,6 +1800,15 @@ public: wxObject *userData = (wxObject *) NULL ) { return Disconnect(id, -1, eventType, func, userData); } + + // User data can be associated with each wxEvtHandler + void SetClientObject( wxClientData *data ) { DoSetClientObject(data); } + wxClientData *GetClientObject() const { return DoGetClientObject(); } + + void SetClientData( void *data ) { DoSetClientData(data); } + void *GetClientData() const { return DoGetClientData(); } + + // implementation from now on virtual bool SearchEventTable(wxEventTable& table, wxEvent& event); bool SearchDynamicEventTable( wxEvent& event ); @@ -1704,6 +1869,29 @@ protected: // Is event handler enabled? bool m_enabled; + + // The user data: either an object which will be deleted by the container + // when it's deleted or some raw pointer which we do nothing with - only + // one type of data can be used with the given window (i.e. you cannot set + // the void data and then associate the container with wxClientData or vice + // versa) + union + { + wxClientData *m_clientObject; + void *m_clientData; + }; + + // what kind of data do we have? + wxClientDataType m_clientDataType; + + // client data accessors + virtual void DoSetClientObject( wxClientData *data ); + virtual wxClientData *DoGetClientObject() const; + + virtual void DoSetClientData( void *data ); + virtual void *DoGetClientData() const; + + private: DECLARE_DYNAMIC_CLASS(wxEvtHandler) }; @@ -1720,12 +1908,14 @@ typedef void (wxEvtHandler::*wxEraseEventFunction)(wxEraseEvent&); typedef void (wxEvtHandler::*wxMouseEventFunction)(wxMouseEvent&); typedef void (wxEvtHandler::*wxCharEventFunction)(wxKeyEvent&); typedef void (wxEvtHandler::*wxFocusEventFunction)(wxFocusEvent&); +typedef void (wxEvtHandler::*wxChildFocusEventFunction)(wxChildFocusEvent&); typedef void (wxEvtHandler::*wxActivateEventFunction)(wxActivateEvent&); typedef void (wxEvtHandler::*wxMenuEventFunction)(wxMenuEvent&); typedef void (wxEvtHandler::*wxJoystickEventFunction)(wxJoystickEvent&); typedef void (wxEvtHandler::*wxDropFilesEventFunction)(wxDropFilesEvent&); typedef void (wxEvtHandler::*wxInitDialogEventFunction)(wxInitDialogEvent&); typedef void (wxEvtHandler::*wxSysColourChangedFunction)(wxSysColourChangedEvent&); +typedef void (wxEvtHandler::*wxDisplayChangedFunction)(wxDisplayChangedEvent&); typedef void (wxEvtHandler::*wxUpdateUIEventFunction)(wxUpdateUIEvent&); typedef void (wxEvtHandler::*wxIdleEventFunction)(wxIdleEvent&); typedef void (wxEvtHandler::*wxCloseEventFunction)(wxCloseEvent&); @@ -1777,6 +1967,7 @@ typedef void (wxEvtHandler::*wxContextMenuEventFunction)(wxContextMenuEvent&); #define EVT_END_SESSION(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_END_SESSION, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxCloseEventFunction) & func, (wxObject *) NULL ), #define EVT_QUERY_END_SESSION(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_QUERY_END_SESSION, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxCloseEventFunction) & func, (wxObject *) NULL ), #define EVT_PAINT(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_PAINT, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxPaintEventFunction) & func, (wxObject *) NULL ), +#define EVT_NC_PAINT(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_NC_PAINT, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxPaintEventFunction) & func, (wxObject *) NULL ), #define EVT_ERASE_BACKGROUND(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_ERASE_BACKGROUND, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxEraseEventFunction) & func, (wxObject *) NULL ), #define EVT_CHAR(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_CHAR, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxCharEventFunction) & func, (wxObject *) NULL ), #define EVT_KEY_DOWN(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_KEY_DOWN, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxCharEventFunction) & func, (wxObject *) NULL ), @@ -1786,6 +1977,7 @@ typedef void (wxEvtHandler::*wxContextMenuEventFunction)(wxContextMenuEvent&); #define EVT_MENU_HIGHLIGHT_ALL(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MENU_HIGHLIGHT, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxMenuEventFunction) & func, (wxObject *) NULL ), #define EVT_SET_FOCUS(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_SET_FOCUS, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxFocusEventFunction) & func, (wxObject *) NULL ), #define EVT_KILL_FOCUS(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_KILL_FOCUS, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxFocusEventFunction) & func, (wxObject *) NULL ), +#define EVT_CHILD_FOCUS(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_CHILD_FOCUS, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxChildFocusEventFunction) & func, (wxObject *) NULL ), #define EVT_ACTIVATE(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_ACTIVATE, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxActivateEventFunction) & func, (wxObject *) NULL ), #define EVT_ACTIVATE_APP(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_ACTIVATE_APP, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxActivateEventFunction) & func, (wxObject *) NULL ), #define EVT_END_SESSION(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_END_SESSION, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxCloseEventFunction) & func, (wxObject *) NULL ), @@ -1793,6 +1985,7 @@ typedef void (wxEvtHandler::*wxContextMenuEventFunction)(wxContextMenuEvent&); #define EVT_DROP_FILES(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_DROP_FILES, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxDropFilesEventFunction) & func, (wxObject *) NULL ), #define EVT_INIT_DIALOG(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_INIT_DIALOG, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxInitDialogEventFunction) & func, (wxObject *) NULL ), #define EVT_SYS_COLOUR_CHANGED(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_SYS_COLOUR_CHANGED, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxSysColourChangedFunction) & func, (wxObject *) NULL ), +#define EVT_DISPLAY_CHANGED(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_DISPLAY_CHANGED, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxDisplayChangedFunction) & func, (wxObject *) NULL ), #define EVT_SHOW(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_SHOW, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxShowEventFunction) & func, (wxObject *) NULL ), #define EVT_MAXIMIZE(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MAXIMIZE, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxMaximizeEventFunction) & func, (wxObject *) NULL ), #define EVT_ICONIZE(func) DECLARE_EVENT_TABLE_ENTRY( wxEVT_ICONIZE, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxIconizeEventFunction) & func, (wxObject *) NULL ), @@ -1904,8 +2097,6 @@ typedef void (wxEvtHandler::*wxContextMenuEventFunction)(wxContextMenuEvent&); #define EVT_CHOICE(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_CHOICE_SELECTED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL ), #define EVT_LISTBOX(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_LISTBOX_SELECTED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL ), #define EVT_LISTBOX_DCLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL ), -#define EVT_TEXT(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_TEXT_UPDATED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL ), -#define EVT_TEXT_ENTER(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_TEXT_ENTER, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL ), #define EVT_MENU(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_MENU_SELECTED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL ), #define EVT_MENU_RANGE(id1, id2, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_MENU_SELECTED, id1, id2, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL ), #define EVT_SLIDER(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_SLIDER_UPDATED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) & fn, (wxObject *) NULL ),