This form of the event cloning patch survived my

thorough stress testing.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@12476 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2001-11-18 12:42:45 +00:00
parent d5939a20fd
commit 8e72b8b517
4 changed files with 197 additions and 338 deletions

View File

@@ -25,13 +25,6 @@ event object, and is an abstract base class for other event classes (see below).
Constructor. Should not need to be used directly by an application. Constructor. Should not need to be used directly by an application.
\membersection{wxEvent::m\_eventHandle}
\member{char*}{m\_eventHandle}
Handle of an underlying windowing system event handle, such as
XEvent. Not guaranteed to be instantiated.
\membersection{wxEvent::m\_eventObject} \membersection{wxEvent::m\_eventObject}
\member{wxObject*}{m\_eventObject} \member{wxObject*}{m\_eventObject}
@@ -63,6 +56,26 @@ Set to TRUE by {\bf Skip} if this event should be skipped.
Timestamp for this event. Timestamp for this event.
\membersection{wxEvent::Clone}\label{wxeventclone}
\func{virtual wxEvent*}{Clone}{\void} const
Returns a copy of the event.
Any event that is posted to the wxWindows event system for later action (via
\helpref{wxEvtHandler::AddPendingEvent}{wxevthandleraddpendingevent} or
\helpref{wxPostEvent}{wxpostevent}) must implement this method. All wxWindows
events fully implement this method, but any derived events implemented by the
user should also implement this method just in case they (or some event
derived from them) are ever posted.
All wxWindows events implement a copy constructor, so the easiest way of
implementing the Clone function is to implement a copy constructor for
a new event (call it MyEvent) and then define the Clone function like this:
\begin{verbatim}
wxEvent *Clone(void) const { return new MyEvent(*this); }
\end{verbatim}
\membersection{wxEvent::GetEventObject} \membersection{wxEvent::GetEventObject}
\func{wxObject*}{GetEventObject}{\void} \func{wxObject*}{GetEventObject}{\void}

View File

@@ -36,9 +36,7 @@ each other.
\func{virtual void}{AddPendingEvent}{\param{wxEvent\& }{event}} \func{virtual void}{AddPendingEvent}{\param{wxEvent\& }{event}}
Adds an event to be processed later. The function will return immediately and the This function posts an event to be processed later.
event will get processed in idle time using the \helpref{wxEvtHandler::ProcessEvent}{wxevthandlerprocessevent}
method.
\wxheading{Parameters} \wxheading{Parameters}
@@ -46,26 +44,27 @@ method.
\wxheading{Remarks} \wxheading{Remarks}
Note that this requires that the event implements The difference between sending an event (using the
\helpref{CopyObject}{wxobjectcopyobject} \helpref{ProcessEvent}{wxevthandlerprocessevent} method) and posting it is
method so that the event can be duplicated and stored until it gets processed later. that in the first case the event is processed before the function returns,
Not all events in wxWindows currently fully implement this method, while in the second case, the function returns immediately and the event will
so you may have to look at the source to verify this. be processed sometime later (usually during the next event loop iteration).
This methods automatically wakes up idle handling even if the underlying window A copy of {\it event} is made by the function, so the original can be deleted
system is currently idle anyway and thus would not send any idle events. (Waking as soon as function returns (it is common that the original is created on the
up the idle handling is done calling \helpref{::wxWakeUpIdle}{wxwakeupidle}.) stack). This requires that the \helpref{wxEvent::Clone}{wxeventclone} method
be implemented by {\it event} so that it can be duplicated and stored until
it gets processed.
This is also the method to call for inter-thread communication. In This is also the method to call for inter-thread communication---it will
a multi-threaded program, you will often have to inform the main GUI thread post events safely between different threads which means that this method is
about the status of other working threads and this has to be done using this thread-safe by using critical sections where needed. In a multi-threaded
method - which also means that this method is thread safe by means of using program, you often need to inform the main GUI thread about the status of
crtical sections where needed. other working threads and such notification should be done using this method.
% VZ: bad idea IMHO - we're going to have a lot of problems with this This method automatically wakes up idle handling if the underlying window
Furthermore, it may be noted that some ports of wxWindows will probably move system is currently idle and thus would not send any idle events. (Waking
to using this method more and more in preference over calling ProcessEvent() up idle handling is done calling \helpref{::wxWakeUpIdle}{wxwakeupidle}.)
directly so as to avoid problems with reentrant code.
\membersection{wxEvtHandler::Connect}\label{wxevthandlerconnect} \membersection{wxEvtHandler::Connect}\label{wxevthandlerconnect}

View File

@@ -333,11 +333,11 @@ END_DECLARE_EVENT_TYPES()
class WXDLLEXPORT wxEvent : public wxObject class WXDLLEXPORT wxEvent : public wxObject
{ {
DECLARE_ABSTRACT_CLASS(wxEvent) protected:
wxEvent(const wxEvent&); // for implementing Clone()
public: public:
wxEvent(int id = 0); wxEvent(int id = 0, wxEventType commandType = wxEVT_NULL );
~wxEvent() {}
void SetEventType(wxEventType typ) { m_eventType = typ; } void SetEventType(wxEventType typ) { m_eventType = typ; }
wxEventType GetEventType() const { return m_eventType; } wxEventType GetEventType() const { return m_eventType; }
@@ -355,11 +355,12 @@ public:
void Skip(bool skip = TRUE) { m_skipped = skip; } void Skip(bool skip = TRUE) { m_skipped = skip; }
bool GetSkipped() const { return m_skipped; }; bool GetSkipped() const { return m_skipped; };
// implementation only: this test is explicitlty anti OO and this functions // Implementation only: this test is explicitlty anti OO and this functions
// exists only for optimization purposes // exists only for optimization purposes.
bool IsCommandEvent() const { return m_isCommandEvent; } bool IsCommandEvent() const { return m_isCommandEvent; }
void CopyObject(wxObject& object_dest) const; // specialized clone function since it is done a lot
virtual wxEvent *Clone() const { return new wxEvent(*this); }
public: public:
wxObject* m_eventObject; wxObject* m_eventObject;
@@ -368,10 +369,10 @@ public:
int m_id; int m_id;
wxObject* m_callbackUserData; wxObject* m_callbackUserData;
bool m_skipped; 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; bool m_isCommandEvent;
private:
DECLARE_ABSTRACT_CLASS(wxEvent)
}; };
#if wxUSE_GUI #if wxUSE_GUI
@@ -397,16 +398,8 @@ public:
class WXDLLEXPORT wxCommandEvent : public wxEvent class WXDLLEXPORT wxCommandEvent : public wxEvent
{ {
DECLARE_DYNAMIC_CLASS(wxCommandEvent)
public: public:
wxCommandEvent(wxEventType commandType = wxEVT_NULL, int id = 0); wxCommandEvent(wxEventType commandType = wxEVT_NULL, int id = 0);
~wxCommandEvent() {}
/*
* Accessors dependent on context
*
*/
// Set/Get client data from controls // Set/Get client data from controls
void SetClientData(void* clientData) { m_clientData = clientData; } void SetClientData(void* clientData) { m_clientData = clientData; }
@@ -435,7 +428,7 @@ public:
void SetInt(int i) { m_commandInt = i; } void SetInt(int i) { m_commandInt = i; }
long GetInt() const { return m_commandInt ; } long GetInt() const { return m_commandInt ; }
void CopyObject(wxObject& obj) const; virtual wxEvent *Clone() const { return new wxCommandEvent(*this); }
#if WXWIN_COMPATIBILITY_2 #if WXWIN_COMPATIBILITY_2
bool Checked() const { return IsChecked(); } bool Checked() const { return IsChecked(); }
@@ -447,6 +440,9 @@ public:
long m_extraLong; // Additional information (e.g. select/deselect) long m_extraLong; // Additional information (e.g. select/deselect)
void* m_clientData; // Arbitrary client data void* m_clientData; // Arbitrary client data
wxClientData* m_clientObject; // Arbitrary client object 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 // this class adds a possibility to react (from the user) code to a control
@@ -466,13 +462,12 @@ public:
// for implementation code only: is the operation allowed? // for implementation code only: is the operation allowed?
bool IsAllowed() const { return m_bAllow; } bool IsAllowed() const { return m_bAllow; }
// probably useless: CopyObject() is used for deferred event virtual wxEvent *Clone() const { return new wxNotifyEvent(*this); }
// handling but wxNotifyEvent must be processed immediately
void CopyObject(wxObject& obj) const;
private: private:
bool m_bAllow; bool m_bAllow;
private:
DECLARE_DYNAMIC_CLASS(wxNotifyEvent) DECLARE_DYNAMIC_CLASS(wxNotifyEvent)
}; };
@@ -491,22 +486,19 @@ private:
class WXDLLEXPORT wxScrollEvent : public wxCommandEvent class WXDLLEXPORT wxScrollEvent : public wxCommandEvent
{ {
DECLARE_DYNAMIC_CLASS(wxScrollEvent)
public: public:
wxScrollEvent(wxEventType commandType = wxEVT_NULL, wxScrollEvent(wxEventType commandType = wxEVT_NULL,
int id = 0, int pos = 0, int orient = 0); int id = 0, int pos = 0, int orient = 0);
~wxScrollEvent() {}
/*
* Accessors
*
*/
int GetOrientation() const { return (int) m_extraLong ; } int GetOrientation() const { return (int) m_extraLong ; }
int GetPosition() const { return m_commandInt ; } int GetPosition() const { return m_commandInt ; }
void SetOrientation(int orient) { m_extraLong = (long) orient; } void SetOrientation(int orient) { m_extraLong = (long) orient; }
void SetPosition(int pos) { m_commandInt = pos; } 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 // ScrollWin event class, derived fom wxEvent. wxScrollWinEvents
@@ -527,23 +519,19 @@ class WXDLLEXPORT wxScrollWinEvent : public wxEvent
public: public:
wxScrollWinEvent(wxEventType commandType = wxEVT_NULL, wxScrollWinEvent(wxEventType commandType = wxEVT_NULL,
int pos = 0, int orient = 0); int pos = 0, int orient = 0);
~wxScrollWinEvent() {}
/*
* Accessors
*/
int GetOrientation() const { return (int) m_extraLong ; } int GetOrientation() const { return (int) m_extraLong ; }
int GetPosition() const { return m_commandInt ; } int GetPosition() const { return m_commandInt ; }
void SetOrientation(int orient) { m_extraLong = (long) orient; } void SetOrientation(int orient) { m_extraLong = (long) orient; }
void SetPosition(int pos) { m_commandInt = pos; } void SetPosition(int pos) { m_commandInt = pos; }
void CopyObject(wxObject& object_dest) const; virtual wxEvent *Clone() const { return new wxScrollWinEvent(*this); }
public: public:
int m_commandInt; // Additional information int m_commandInt;
long m_extraLong; long m_extraLong;
private:
DECLARE_DYNAMIC_CLASS(wxScrollWinEvent) DECLARE_DYNAMIC_CLASS(wxScrollWinEvent)
}; };
@@ -708,8 +696,7 @@ public:
// wheel action. Defaults to one. // wheel action. Defaults to one.
int GetLinesPerAction() const { return m_linesPerAction; } int GetLinesPerAction() const { return m_linesPerAction; }
virtual wxEvent *Clone() const { return new wxMouseEvent(*this); }
void CopyObject(wxObject& obj) const;
public: public:
wxCoord m_x, m_y; wxCoord m_x, m_y;
@@ -740,7 +727,7 @@ private:
class WXDLLEXPORT wxSetCursorEvent : public wxEvent class WXDLLEXPORT wxSetCursorEvent : public wxEvent
{ {
public: public:
wxSetCursorEvent(wxCoord x, wxCoord y) wxSetCursorEvent(wxCoord x = 0, wxCoord y = 0)
{ {
m_eventType = wxEVT_SET_CURSOR; m_eventType = wxEVT_SET_CURSOR;
@@ -755,9 +742,14 @@ public:
const wxCursor& GetCursor() const { return m_cursor; } const wxCursor& GetCursor() const { return m_cursor; }
bool HasCursor() const { return m_cursor.Ok(); } bool HasCursor() const { return m_cursor.Ok(); }
virtual wxEvent *Clone() const { return new wxSetCursorEvent(*this); }
private: private:
wxCoord m_x, m_y; wxCoord m_x, m_y;
wxCursor m_cursor; wxCursor m_cursor;
private:
DECLARE_DYNAMIC_CLASS(wxSetCursorEvent)
}; };
// Keyboard input event class // Keyboard input event class
@@ -771,8 +763,6 @@ private:
class WXDLLEXPORT wxKeyEvent : public wxEvent class WXDLLEXPORT wxKeyEvent : public wxEvent
{ {
DECLARE_DYNAMIC_CLASS(wxKeyEvent)
public: public:
wxKeyEvent(wxEventType keyType = wxEVT_NULL); wxKeyEvent(wxEventType keyType = wxEVT_NULL);
@@ -814,11 +804,11 @@ public:
// Get Y position // Get Y position
wxCoord GetY() const { return m_y; } wxCoord GetY() const { return m_y; }
void CopyObject(wxObject& obj) const;
// deprecated // deprecated
long KeyCode() const { return m_keyCode; } long KeyCode() const { return m_keyCode; }
virtual wxEvent *Clone() const { return new wxKeyEvent(*this); }
public: public:
wxCoord m_x, m_y; wxCoord m_x, m_y;
@@ -829,6 +819,9 @@ public:
bool m_altDown; bool m_altDown;
bool m_metaDown; bool m_metaDown;
bool m_scanCode; bool m_scanCode;
private:
DECLARE_DYNAMIC_CLASS(wxKeyEvent)
}; };
// Size event class // Size event class
@@ -838,11 +831,7 @@ public:
class WXDLLEXPORT wxSizeEvent : public wxEvent class WXDLLEXPORT wxSizeEvent : public wxEvent
{ {
DECLARE_DYNAMIC_CLASS(wxSizeEvent)
public: public:
wxSize m_size;
wxSizeEvent() { m_eventType = wxEVT_SIZE; } wxSizeEvent() { m_eventType = wxEVT_SIZE; }
wxSizeEvent(const wxSize& sz, int id = 0) wxSizeEvent(const wxSize& sz, int id = 0)
: m_size(sz) : m_size(sz)
@@ -850,7 +839,13 @@ public:
wxSize GetSize() const { return m_size; } 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 // Move event class
@@ -861,11 +856,7 @@ public:
class WXDLLEXPORT wxMoveEvent : public wxEvent class WXDLLEXPORT wxMoveEvent : public wxEvent
{ {
DECLARE_DYNAMIC_CLASS(wxMoveEvent)
public: public:
wxPoint m_pos;
wxMoveEvent() { m_eventType = wxEVT_MOVE; } wxMoveEvent() { m_eventType = wxEVT_MOVE; }
wxMoveEvent(const wxPoint& pos, int id = 0) wxMoveEvent(const wxPoint& pos, int id = 0)
: m_pos(pos) : m_pos(pos)
@@ -873,7 +864,12 @@ public:
wxPoint GetPosition() const { return m_pos; } 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 // Paint event class
@@ -890,8 +886,6 @@ public:
class WXDLLEXPORT wxPaintEvent : public wxEvent class WXDLLEXPORT wxPaintEvent : public wxEvent
{ {
DECLARE_DYNAMIC_CLASS(wxPaintEvent)
public: public:
wxPaintEvent(int Id = 0) wxPaintEvent(int Id = 0)
{ {
@@ -910,6 +904,11 @@ public:
g_isPainting--; g_isPainting--;
} }
#endif // debug #endif // debug
virtual wxEvent *Clone() const { return new wxPaintEvent(*this); }
private:
DECLARE_DYNAMIC_CLASS(wxPaintEvent)
}; };
class WXDLLEXPORT wxNcPaintEvent : public wxEvent class WXDLLEXPORT wxNcPaintEvent : public wxEvent
@@ -917,6 +916,8 @@ class WXDLLEXPORT wxNcPaintEvent : public wxEvent
public: public:
wxNcPaintEvent(int id = 0) : wxEvent(id) { SetEventType(wxEVT_NC_PAINT); } wxNcPaintEvent(int id = 0) : wxEvent(id) { SetEventType(wxEVT_NC_PAINT); }
virtual wxEvent *Clone() const { return new wxNcPaintEvent(*this); }
private: private:
DECLARE_DYNAMIC_CLASS(wxNcPaintEvent) DECLARE_DYNAMIC_CLASS(wxNcPaintEvent)
}; };
@@ -928,16 +929,18 @@ private:
class WXDLLEXPORT wxEraseEvent : public wxEvent class WXDLLEXPORT wxEraseEvent : public wxEvent
{ {
DECLARE_DYNAMIC_CLASS(wxEraseEvent)
public: public:
wxDC *m_dc;
wxEraseEvent(int Id = 0, wxDC *dc = (wxDC *) NULL) wxEraseEvent(int Id = 0, wxDC *dc = (wxDC *) NULL)
{ m_eventType = wxEVT_ERASE_BACKGROUND; m_id = Id; m_dc = dc; } { m_eventType = wxEVT_ERASE_BACKGROUND; m_id = Id; m_dc = dc; }
wxDC *GetDC() const { return m_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 // Focus event class
@@ -952,17 +955,18 @@ public:
wxFocusEvent(wxEventType type = wxEVT_NULL, int id = 0) wxFocusEvent(wxEventType type = wxEVT_NULL, int id = 0)
{ m_eventType = type; m_id = id; m_win = NULL; } { m_eventType = type; m_id = id; m_win = NULL; }
// the window associated with this event is the window which had focus // 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 // before for SET event and the window which will have focus for the KILL
// one // one. NB: it may be NULL in both cases!
//
// NB: it may be NULL in both cases!
wxWindow *GetWindow() const { return m_win; } wxWindow *GetWindow() const { return m_win; }
void SetWindow(wxWindow *win) { m_win = win; } void SetWindow(wxWindow *win) { m_win = win; }
virtual wxEvent *Clone() const { return new wxFocusEvent(*this); }
private: private:
wxWindow *m_win; wxWindow *m_win;
private:
DECLARE_DYNAMIC_CLASS(wxFocusEvent) DECLARE_DYNAMIC_CLASS(wxFocusEvent)
}; };
@@ -975,6 +979,9 @@ public:
wxWindow *GetWindow() const { return (wxWindow *)GetEventObject(); } wxWindow *GetWindow() const { return (wxWindow *)GetEventObject(); }
virtual wxEvent *Clone() const { return new wxChildFocusEvent(*this); }
private:
DECLARE_DYNAMIC_CLASS(wxChildFocusEvent) DECLARE_DYNAMIC_CLASS(wxChildFocusEvent)
}; };
@@ -986,17 +993,19 @@ public:
class WXDLLEXPORT wxActivateEvent : public wxEvent class WXDLLEXPORT wxActivateEvent : public wxEvent
{ {
DECLARE_DYNAMIC_CLASS(wxActivateEvent)
public: public:
wxActivateEvent(wxEventType type = wxEVT_NULL, bool active = TRUE, int Id = 0) wxActivateEvent(wxEventType type = wxEVT_NULL, bool active = TRUE, int Id = 0)
{ m_eventType = type; m_active = active; m_id = Id; } { m_eventType = type; m_active = active; m_id = Id; }
bool GetActive() const { return m_active; } bool GetActive() const { return m_active; }
void CopyObject(wxObject& obj) const; virtual wxEvent *Clone() const { return new wxActivateEvent(*this); }
private: private:
bool m_active; bool m_active;
private:
DECLARE_DYNAMIC_CLASS(wxActivateEvent)
}; };
// InitDialog event class // InitDialog event class
@@ -1006,11 +1015,14 @@ private:
class WXDLLEXPORT wxInitDialogEvent : public wxEvent class WXDLLEXPORT wxInitDialogEvent : public wxEvent
{ {
DECLARE_DYNAMIC_CLASS(wxInitDialogEvent)
public: public:
wxInitDialogEvent(int Id = 0) wxInitDialogEvent(int Id = 0)
{ m_eventType = wxEVT_INIT_DIALOG; m_id = Id; } { 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 // Miscellaneous menu event class
@@ -1023,17 +1035,19 @@ public:
class WXDLLEXPORT wxMenuEvent : public wxEvent class WXDLLEXPORT wxMenuEvent : public wxEvent
{ {
DECLARE_DYNAMIC_CLASS(wxMenuEvent)
public: public:
wxMenuEvent(wxEventType type = wxEVT_NULL, int id = 0) wxMenuEvent(wxEventType type = wxEVT_NULL, int id = 0)
{ m_eventType = type; m_menuId = id; m_id = id; } { m_eventType = type; m_menuId = id; m_id = id; }
int GetMenuId() const { return m_menuId; } int GetMenuId() const { return m_menuId; }
void CopyObject(wxObject& obj) const; virtual wxEvent *Clone() const { return new wxMenuEvent(*this); }
private: private:
int m_menuId; int m_menuId;
private:
DECLARE_DYNAMIC_CLASS(wxMenuEvent)
}; };
// Window close or session close event class // Window close or session close event class
@@ -1045,8 +1059,6 @@ private:
class WXDLLEXPORT wxCloseEvent : public wxEvent class WXDLLEXPORT wxCloseEvent : public wxEvent
{ {
DECLARE_DYNAMIC_CLASS(wxCloseEvent)
public: public:
wxCloseEvent(wxEventType type = wxEVT_NULL, int id = 0) wxCloseEvent(wxEventType type = wxEVT_NULL, int id = 0)
{ {
@@ -1084,7 +1096,7 @@ public:
bool GetForce() const { return m_force; } bool GetForce() const { return m_force; }
#endif #endif
void CopyObject(wxObject& obj) const; virtual wxEvent *Clone() const { return new wxCloseEvent(*this); }
protected: protected:
bool m_loggingOff; bool m_loggingOff;
@@ -1093,6 +1105,10 @@ protected:
#if WXWIN_COMPATIBILITY #if WXWIN_COMPATIBILITY
bool m_force; bool m_force;
#endif #endif
private:
DECLARE_DYNAMIC_CLASS(wxCloseEvent)
}; };
/* /*
@@ -1108,11 +1124,12 @@ public:
void SetShow(bool show) { m_show = show; } void SetShow(bool show) { m_show = show; }
bool GetShow() const { return m_show; } bool GetShow() const { return m_show; }
void CopyObject(wxObject& obj) const; virtual wxEvent *Clone() const { return new wxShowEvent(*this); }
protected: protected:
bool m_show; bool m_show;
private:
DECLARE_DYNAMIC_CLASS(wxShowEvent) DECLARE_DYNAMIC_CLASS(wxShowEvent)
}; };
@@ -1129,12 +1146,14 @@ public:
// return true if the frame was iconized, false if restored // return true if the frame was iconized, false if restored
bool Iconized() const { return m_iconized; } bool Iconized() const { return m_iconized; }
virtual wxEvent *Clone() const { return new wxIconizeEvent(*this); }
protected: protected:
bool m_iconized; bool m_iconized;
private:
DECLARE_DYNAMIC_CLASS(wxIconizeEvent) DECLARE_DYNAMIC_CLASS(wxIconizeEvent)
}; };
/* /*
wxEVT_MAXIMIZE wxEVT_MAXIMIZE
*/ */
@@ -1145,6 +1164,9 @@ public:
wxMaximizeEvent(int id = 0) wxMaximizeEvent(int id = 0)
{ m_eventType = wxEVT_MAXIMIZE; m_id = id; } { m_eventType = wxEVT_MAXIMIZE; m_id = id; }
virtual wxEvent *Clone() const { return new wxMaximizeEvent(*this); }
private:
DECLARE_DYNAMIC_CLASS(wxMaximizeEvent) DECLARE_DYNAMIC_CLASS(wxMaximizeEvent)
}; };
@@ -1169,8 +1191,6 @@ public:
class WXDLLEXPORT wxJoystickEvent : public wxEvent class WXDLLEXPORT wxJoystickEvent : public wxEvent
{ {
DECLARE_DYNAMIC_CLASS(wxJoystickEvent)
public: public:
wxPoint m_pos; wxPoint m_pos;
int m_zPosition; int m_zPosition;
@@ -1228,7 +1248,10 @@ public:
{ return (((but == wxJOY_BUTTON_ANY) && (m_buttonState != 0)) || { return (((but == wxJOY_BUTTON_ANY) && (m_buttonState != 0)) ||
((m_buttonState & but) == but)); } ((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 // Drop files event class
@@ -1238,8 +1261,6 @@ public:
class WXDLLEXPORT wxDropFilesEvent : public wxEvent class WXDLLEXPORT wxDropFilesEvent : public wxEvent
{ {
DECLARE_DYNAMIC_CLASS(wxDropFilesEvent)
public: public:
int m_noFiles; int m_noFiles;
wxPoint m_pos; wxPoint m_pos;
@@ -1254,7 +1275,10 @@ public:
int GetNumberOfFiles() const { return m_noFiles; } int GetNumberOfFiles() const { return m_noFiles; }
wxString *GetFiles() const { return m_files; } wxString *GetFiles() const { return m_files; }
void CopyObject(wxObject& obj) const; virtual wxEvent *Clone() const { wxFAIL_MSG("error"); return NULL; }
private:
DECLARE_DYNAMIC_CLASS(wxDropFilesEvent)
}; };
// Update UI event // Update UI event
@@ -1264,8 +1288,6 @@ public:
class WXDLLEXPORT wxUpdateUIEvent : public wxCommandEvent class WXDLLEXPORT wxUpdateUIEvent : public wxCommandEvent
{ {
DECLARE_DYNAMIC_CLASS(wxUpdateUIEvent)
public: public:
wxUpdateUIEvent(wxWindowID commandId = 0) wxUpdateUIEvent(wxWindowID commandId = 0)
{ {
@@ -1290,7 +1312,7 @@ public:
void Enable(bool enable) { m_enabled = enable; m_setEnabled = TRUE; } void Enable(bool enable) { m_enabled = enable; m_setEnabled = TRUE; }
void SetText(const wxString& text) { m_text = text; m_setText = 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: protected:
bool m_checked; bool m_checked;
@@ -1299,6 +1321,9 @@ protected:
bool m_setText; bool m_setText;
bool m_setChecked; bool m_setChecked;
wxString m_text; wxString m_text;
private:
DECLARE_DYNAMIC_CLASS(wxUpdateUIEvent)
}; };
/* /*
@@ -1308,11 +1333,14 @@ protected:
// TODO: shouldn't all events record the window ID? // TODO: shouldn't all events record the window ID?
class WXDLLEXPORT wxSysColourChangedEvent : public wxEvent class WXDLLEXPORT wxSysColourChangedEvent : public wxEvent
{ {
DECLARE_DYNAMIC_CLASS(wxSysColourChangedEvent)
public: public:
wxSysColourChangedEvent() wxSysColourChangedEvent()
{ m_eventType = wxEVT_SYS_COLOUR_CHANGED; } { m_eventType = wxEVT_SYS_COLOUR_CHANGED; }
virtual wxEvent *Clone() const { return new wxSysColourChangedEvent(*this); }
private:
DECLARE_DYNAMIC_CLASS(wxSysColourChangedEvent)
}; };
/* /*
@@ -1321,8 +1349,6 @@ public:
class WXDLLEXPORT wxPaletteChangedEvent : public wxEvent class WXDLLEXPORT wxPaletteChangedEvent : public wxEvent
{ {
DECLARE_DYNAMIC_CLASS(wxPaletteChangedEvent)
public: public:
wxPaletteChangedEvent(wxWindowID id = 0) : wxEvent(id) wxPaletteChangedEvent(wxWindowID id = 0) : wxEvent(id)
{ {
@@ -1333,10 +1359,13 @@ public:
void SetChangedWindow(wxWindow* win) { m_changedWindow = win; } void SetChangedWindow(wxWindow* win) { m_changedWindow = win; }
wxWindow* GetChangedWindow() const { return m_changedWindow; } wxWindow* GetChangedWindow() const { return m_changedWindow; }
void CopyObject(wxObject& obj) const; virtual wxEvent *Clone() const { return new wxPaletteChangedEvent(*this); }
protected: protected:
wxWindow* m_changedWindow; wxWindow* m_changedWindow;
private:
DECLARE_DYNAMIC_CLASS(wxPaletteChangedEvent)
}; };
/* /*
@@ -1346,8 +1375,6 @@ protected:
class WXDLLEXPORT wxQueryNewPaletteEvent : public wxEvent class WXDLLEXPORT wxQueryNewPaletteEvent : public wxEvent
{ {
DECLARE_DYNAMIC_CLASS(wxQueryNewPaletteEvent)
public: public:
wxQueryNewPaletteEvent(wxWindowID id = 0): wxEvent(id) wxQueryNewPaletteEvent(wxWindowID id = 0): wxEvent(id)
{ m_eventType = wxEVT_QUERY_NEW_PALETTE; m_paletteRealized = FALSE; } { m_eventType = wxEVT_QUERY_NEW_PALETTE; m_paletteRealized = FALSE; }
@@ -1356,10 +1383,13 @@ public:
void SetPaletteRealized(bool realized) { m_paletteRealized = realized; } void SetPaletteRealized(bool realized) { m_paletteRealized = realized; }
bool GetPaletteRealized() const { return m_paletteRealized; } bool GetPaletteRealized() const { return m_paletteRealized; }
void CopyObject(wxObject& obj) const; virtual wxEvent *Clone() const { return new wxQueryNewPaletteEvent(*this); }
protected: protected:
bool m_paletteRealized; bool m_paletteRealized;
private:
DECLARE_DYNAMIC_CLASS(wxQueryNewPaletteEvent)
}; };
/* /*
@@ -1404,6 +1434,8 @@ public:
wxWindow* GetCurrentFocus() const { return m_focus; } wxWindow* GetCurrentFocus() const { return m_focus; }
void SetCurrentFocus(wxWindow *win) { m_focus = win; } void SetCurrentFocus(wxWindow *win) { m_focus = win; }
virtual wxEvent *Clone() const { return new wxNavigationKeyEvent(*this); }
private: private:
enum enum
{ {
@@ -1415,6 +1447,7 @@ private:
long m_flags; long m_flags;
wxWindow *m_focus; wxWindow *m_focus;
private:
DECLARE_DYNAMIC_CLASS(wxNavigationKeyEvent) DECLARE_DYNAMIC_CLASS(wxNavigationKeyEvent)
}; };
@@ -1430,22 +1463,28 @@ private:
class WXDLLEXPORT wxWindowCreateEvent : public wxCommandEvent class WXDLLEXPORT wxWindowCreateEvent : public wxCommandEvent
{ {
DECLARE_DYNAMIC_CLASS(wxWindowCreateEvent)
public: public:
wxWindowCreateEvent(wxWindow *win = NULL); wxWindowCreateEvent(wxWindow *win = NULL);
wxWindow *GetWindow() const { return (wxWindow *)GetEventObject(); } wxWindow *GetWindow() const { return (wxWindow *)GetEventObject(); }
virtual wxEvent *Clone() const { return new wxWindowCreateEvent(*this); }
private:
DECLARE_DYNAMIC_CLASS(wxWindowCreateEvent)
}; };
class WXDLLEXPORT wxWindowDestroyEvent : public wxCommandEvent class WXDLLEXPORT wxWindowDestroyEvent : public wxCommandEvent
{ {
DECLARE_DYNAMIC_CLASS(wxWindowDestroyEvent)
public: public:
wxWindowDestroyEvent(wxWindow *win = NULL); wxWindowDestroyEvent(wxWindow *win = NULL);
wxWindow *GetWindow() const { return (wxWindow *)GetEventObject(); } 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. // A help event is sent when the user clicks on a window in context-help mode.
@@ -1478,6 +1517,8 @@ public:
const wxString& GetTarget() const { return m_target; } const wxString& GetTarget() const { return m_target; }
void SetTarget(const wxString& target) { m_target = target; } void SetTarget(const wxString& target) { m_target = target; }
virtual wxEvent *Clone() const { return new wxHelpEvent(*this); }
protected: protected:
wxPoint m_pos; wxPoint m_pos;
wxString m_target; wxString m_target;
@@ -1511,6 +1552,8 @@ public:
const wxPoint& GetPosition() const { return m_pos; } const wxPoint& GetPosition() const { return m_pos; }
void SetPosition(const wxPoint& pos) { m_pos = pos; } void SetPosition(const wxPoint& pos) { m_pos = pos; }
virtual wxEvent *Clone() const { return new wxContextMenuEvent(*this); }
protected: protected:
wxPoint m_pos; wxPoint m_pos;
@@ -1525,8 +1568,6 @@ private:
class WXDLLEXPORT wxIdleEvent : public wxEvent class WXDLLEXPORT wxIdleEvent : public wxEvent
{ {
DECLARE_DYNAMIC_CLASS(wxIdleEvent)
public: public:
wxIdleEvent() wxIdleEvent()
{ m_eventType = wxEVT_IDLE; m_requestMore = FALSE; } { m_eventType = wxEVT_IDLE; m_requestMore = FALSE; }
@@ -1534,10 +1575,13 @@ public:
void RequestMore(bool needMore = TRUE) { m_requestMore = needMore; } void RequestMore(bool needMore = TRUE) { m_requestMore = needMore; }
bool MoreRequested() const { return m_requestMore; } bool MoreRequested() const { return m_requestMore; }
void CopyObject(wxObject& obj) const; virtual wxEvent *Clone() const { return new wxIdleEvent(*this); }
protected: protected:
bool m_requestMore; bool m_requestMore;
private:
DECLARE_DYNAMIC_CLASS(wxIdleEvent)
}; };
#endif // wxUSE_GUI #endif // wxUSE_GUI

View File

@@ -77,6 +77,7 @@ IMPLEMENT_ABSTRACT_CLASS(wxEvent, wxObject)
IMPLEMENT_DYNAMIC_CLASS(wxDropFilesEvent, wxEvent) IMPLEMENT_DYNAMIC_CLASS(wxDropFilesEvent, wxEvent)
IMPLEMENT_DYNAMIC_CLASS(wxActivateEvent, wxEvent) IMPLEMENT_DYNAMIC_CLASS(wxActivateEvent, wxEvent)
IMPLEMENT_DYNAMIC_CLASS(wxInitDialogEvent, wxEvent) IMPLEMENT_DYNAMIC_CLASS(wxInitDialogEvent, wxEvent)
IMPLEMENT_DYNAMIC_CLASS(wxSetCursorEvent, wxEvent)
IMPLEMENT_DYNAMIC_CLASS(wxSysColourChangedEvent, wxEvent) IMPLEMENT_DYNAMIC_CLASS(wxSysColourChangedEvent, wxEvent)
IMPLEMENT_DYNAMIC_CLASS(wxUpdateUIEvent, wxCommandEvent) IMPLEMENT_DYNAMIC_CLASS(wxUpdateUIEvent, wxCommandEvent)
IMPLEMENT_DYNAMIC_CLASS(wxNavigationKeyEvent, wxCommandEvent) IMPLEMENT_DYNAMIC_CLASS(wxNavigationKeyEvent, wxCommandEvent)
@@ -293,9 +294,9 @@ int wxNewEventType()
* *
*/ */
wxEvent::wxEvent(int theId) wxEvent::wxEvent(int theId, wxEventType commandType )
{ {
m_eventType = wxEVT_NULL; m_eventType = commandType;
m_eventObject = (wxObject *) NULL; m_eventObject = (wxObject *) NULL;
m_timeStamp = 0; m_timeStamp = 0;
m_id = theId; m_id = theId;
@@ -304,18 +305,15 @@ wxEvent::wxEvent(int theId)
m_isCommandEvent = FALSE; m_isCommandEvent = FALSE;
} }
void wxEvent::CopyObject(wxObject& object_dest) const wxEvent::wxEvent(const wxEvent &src)
{ {
wxEvent *obj = (wxEvent *)&object_dest; m_eventType = src.m_eventType;
wxObject::CopyObject(object_dest); m_eventObject = src.m_eventObject;
m_timeStamp = src.m_timeStamp;
obj->m_eventType = m_eventType; m_id = src.m_id;
obj->m_eventObject = m_eventObject; m_skipped = src.m_skipped;
obj->m_timeStamp = m_timeStamp; m_callbackUserData = src.m_callbackUserData;
obj->m_id = m_id; m_isCommandEvent = src.m_isCommandEvent;
obj->m_skipped = m_skipped;
obj->m_callbackUserData = m_callbackUserData;
obj->m_isCommandEvent = m_isCommandEvent;
} }
#if wxUSE_GUI #if wxUSE_GUI
@@ -326,43 +324,16 @@ void wxEvent::CopyObject(wxObject& object_dest) const
*/ */
wxCommandEvent::wxCommandEvent(wxEventType commandType, int theId) wxCommandEvent::wxCommandEvent(wxEventType commandType, int theId)
: wxEvent( theId, commandType )
{ {
m_eventType = commandType;
m_clientData = (char *) NULL; m_clientData = (char *) NULL;
m_clientObject = (wxClientData *) NULL; m_clientObject = (wxClientData *) NULL;
m_extraLong = 0; m_extraLong = 0;
m_commandInt = 0; m_commandInt = 0;
m_id = theId;
m_commandString = wxEmptyString; m_commandString = wxEmptyString;
m_isCommandEvent = TRUE; m_isCommandEvent = TRUE;
} }
void wxCommandEvent::CopyObject(wxObject& obj_d) const
{
wxCommandEvent *obj = (wxCommandEvent *)&obj_d;
wxEvent::CopyObject(obj_d);
obj->m_clientData = m_clientData;
obj->m_clientObject = m_clientObject;
obj->m_extraLong = m_extraLong;
obj->m_commandInt = m_commandInt;
obj->m_commandString = m_commandString;
}
/*
* Notify events
*/
void wxNotifyEvent::CopyObject(wxObject& obj_d) const
{
wxNotifyEvent *obj = (wxNotifyEvent *)&obj_d;
wxEvent::CopyObject(obj_d);
if (!m_bAllow) obj->Veto();
}
/* /*
* Scroll events * Scroll events
*/ */
@@ -390,16 +361,6 @@ wxScrollWinEvent::wxScrollWinEvent(wxEventType commandType,
m_commandInt = pos; m_commandInt = pos;
} }
void wxScrollWinEvent::CopyObject(wxObject& obj_d) const
{
wxScrollWinEvent *obj = (wxScrollWinEvent*)&obj_d;
wxEvent::CopyObject(obj_d);
obj->m_extraLong = m_extraLong;
obj->m_commandInt = m_commandInt;
}
/* /*
* Mouse events * Mouse events
* *
@@ -422,23 +383,6 @@ wxMouseEvent::wxMouseEvent(wxEventType commandType)
m_linesPerAction = 0; m_linesPerAction = 0;
} }
void wxMouseEvent::CopyObject(wxObject& obj_d) const
{
wxMouseEvent *obj = (wxMouseEvent *)&obj_d;
wxEvent::CopyObject(obj_d);
obj->m_metaDown = m_metaDown;
obj->m_altDown = m_altDown;
obj->m_controlDown = m_controlDown;
obj->m_shiftDown = m_shiftDown;
obj->m_leftDown = m_leftDown;
obj->m_rightDown = m_rightDown;
obj->m_middleDown = m_middleDown;
obj->m_x = m_x;
obj->m_y = m_y;
}
// True if was a button dclick event (1 = left, 2 = middle, 3 = right) // True if was a button dclick event (1 = left, 2 = middle, 3 = right)
// or any button dclick event (but = -1) // or any button dclick event (but = -1)
bool wxMouseEvent::ButtonDClick(int but) const bool wxMouseEvent::ButtonDClick(int but) const
@@ -563,7 +507,7 @@ wxPoint wxMouseEvent::GetLogicalPosition(const wxDC& dc) const
/* /*
* Keyboard events * Keyboard event
* *
*/ */
@@ -578,139 +522,6 @@ wxKeyEvent::wxKeyEvent(wxEventType type)
m_scanCode = 0; m_scanCode = 0;
} }
void wxKeyEvent::CopyObject(wxObject& obj_d) const
{
wxKeyEvent *obj = (wxKeyEvent *)&obj_d;
wxEvent::CopyObject(obj_d);
obj->m_x = m_x;
obj->m_y = m_y;
obj->m_keyCode = m_keyCode;
obj->m_shiftDown = m_shiftDown;
obj->m_controlDown = m_controlDown;
obj->m_metaDown = m_metaDown;
obj->m_altDown = m_altDown;
obj->m_keyCode = m_keyCode;
}
/*
* Misc events
*/
void wxSizeEvent::CopyObject(wxObject& obj_d) const
{
wxSizeEvent *obj = (wxSizeEvent *)&obj_d;
wxEvent::CopyObject(obj_d);
obj->m_size = m_size;
}
void wxMoveEvent::CopyObject(wxObject& obj_d) const
{
wxMoveEvent *obj = (wxMoveEvent *)&obj_d;
wxEvent::CopyObject(obj_d);
obj->m_pos = m_pos;
}
void wxEraseEvent::CopyObject(wxObject& obj_d) const
{
wxEraseEvent *obj = (wxEraseEvent *)&obj_d;
wxEvent::CopyObject(obj_d);
obj->m_dc = m_dc;
}
void wxActivateEvent::CopyObject(wxObject& obj_d) const
{
wxActivateEvent *obj = (wxActivateEvent *)&obj_d;
wxEvent::CopyObject(obj_d);
obj->m_active = m_active;
}
void wxMenuEvent::CopyObject(wxObject& obj_d) const
{
wxMenuEvent *obj = (wxMenuEvent *)&obj_d;
wxEvent::CopyObject(obj_d);
obj->m_menuId = m_menuId;
}
void wxCloseEvent::CopyObject(wxObject& obj_d) const
{
wxCloseEvent *obj = (wxCloseEvent *)&obj_d;
wxEvent::CopyObject(obj_d);
obj->m_loggingOff = m_loggingOff;
obj->m_veto = m_veto;
#if WXWIN_COMPATIBILITY
obj->m_force = m_force;
#endif
obj->m_canVeto = m_canVeto;
}
void wxShowEvent::CopyObject(wxObject& obj_d) const
{
wxShowEvent *obj = (wxShowEvent *)&obj_d;
wxEvent::CopyObject(obj_d);
obj->m_show = m_show;
}
void wxJoystickEvent::CopyObject(wxObject& obj_d) const
{
wxJoystickEvent *obj = (wxJoystickEvent *)&obj_d;
wxEvent::CopyObject(obj_d);
obj->m_pos = m_pos;
obj->m_zPosition = m_zPosition;
obj->m_buttonChange = m_buttonChange;
obj->m_buttonState = m_buttonState;
obj->m_joyStick = m_joyStick;
}
void wxDropFilesEvent::CopyObject(wxObject& obj_d) const
{
wxDropFilesEvent *obj = (wxDropFilesEvent *)&obj_d;
wxEvent::CopyObject(obj_d);
obj->m_noFiles = m_noFiles;
obj->m_pos = m_pos;
// TODO: Problem with obj->m_files. It should be deallocated by the
// destructor of the event.
}
void wxUpdateUIEvent::CopyObject(wxObject &obj_d) const
{
wxUpdateUIEvent *obj = (wxUpdateUIEvent *)&obj_d;
wxEvent::CopyObject(obj_d);
obj->m_checked = m_checked;
obj->m_enabled = m_enabled;
obj->m_text = m_text;
obj->m_setText = m_setText;
obj->m_setChecked = m_setChecked;
obj->m_setEnabled = m_setEnabled;
}
void wxPaletteChangedEvent::CopyObject(wxObject &obj_d) const
{
wxPaletteChangedEvent *obj = (wxPaletteChangedEvent *)&obj_d;
wxEvent::CopyObject(obj_d);
obj->m_changedWindow = m_changedWindow;
}
void wxQueryNewPaletteEvent::CopyObject(wxObject& obj_d) const
{
wxQueryNewPaletteEvent *obj = (wxQueryNewPaletteEvent *)&obj_d;
wxEvent::CopyObject(obj_d);
obj->m_paletteRealized = m_paletteRealized;
}
wxWindowCreateEvent::wxWindowCreateEvent(wxWindow *win) wxWindowCreateEvent::wxWindowCreateEvent(wxWindow *win)
{ {
@@ -724,14 +535,6 @@ wxWindowDestroyEvent::wxWindowDestroyEvent(wxWindow *win)
SetEventObject(win); SetEventObject(win);
} }
void wxIdleEvent::CopyObject(wxObject& obj_d) const
{
wxIdleEvent *obj = (wxIdleEvent *)&obj_d;
wxEvent::CopyObject(obj_d);
obj->m_requestMore = m_requestMore;
}
wxChildFocusEvent::wxChildFocusEvent(wxWindow *win) wxChildFocusEvent::wxChildFocusEvent(wxWindow *win)
: wxCommandEvent(wxEVT_CHILD_FOCUS) : wxCommandEvent(wxEVT_CHILD_FOCUS)
{ {