]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/event.h
[start of] cleanup uxtheme support code
[wxWidgets.git] / include / wx / event.h
index 809db844b7ec4310d2e3050dce05ed417700b988..61a06340532546d89bad1ceed8c8f64c6a8aa2c3 100644 (file)
@@ -9,8 +9,8 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifndef _WX_EVENTH__
-#define _WX_EVENTH__
+#ifndef _WX_EVENT_H__
+#define _WX_EVENT_H__
 
 #if defined(__GNUG__) && !defined(__APPLE__)
     #pragma interface "event.h"
 
 #if defined(__GNUG__) && !defined(__APPLE__)
     #pragma interface "event.h"
@@ -27,6 +27,8 @@
 
 #include "wx/thread.h"
 
 
 #include "wx/thread.h"
 
+#include "wx/dynarray.h"
+
 // ----------------------------------------------------------------------------
 // forward declarations
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // forward declarations
 // ----------------------------------------------------------------------------
@@ -86,6 +88,8 @@ typedef int wxEventType;
 #define DECLARE_EVENT_TABLE_ENTRY(type, winid, idLast, fn, obj) \
     wxEventTableEntry(type, winid, idLast, fn, obj)
 
 #define DECLARE_EVENT_TABLE_ENTRY(type, winid, idLast, fn, obj) \
     wxEventTableEntry(type, winid, idLast, fn, obj)
 
+#define EMPTY_PARAMETER_VALUE /* Fake macro parameter value */
+
 #define BEGIN_DECLARE_EVENT_TYPES()
 #define END_DECLARE_EVENT_TYPES()
 #define DECLARE_EXPORTED_EVENT_TYPE(expdecl, name, value) \
 #define BEGIN_DECLARE_EVENT_TYPES()
 #define END_DECLARE_EVENT_TYPES()
 #define DECLARE_EXPORTED_EVENT_TYPE(expdecl, name, value) \
@@ -93,7 +97,7 @@ typedef int wxEventType;
 #define DECLARE_EVENT_TYPE(name, value) \
     DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_CORE, name, value)
 #define DECLARE_LOCAL_EVENT_TYPE(name, value) \
 #define DECLARE_EVENT_TYPE(name, value) \
     DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_CORE, name, value)
 #define DECLARE_LOCAL_EVENT_TYPE(name, value) \
-    DECLARE_EXPORTED_EVENT_TYPE(/* */, name, value)
+    DECLARE_EXPORTED_EVENT_TYPE(EMPTY_PARAMETER_VALUE, name, value)
 #define DEFINE_EVENT_TYPE(name) const wxEventType name = wxNewEventType();
 #define DEFINE_LOCAL_EVENT_TYPE(name) DEFINE_EVENT_TYPE(name)
 
 #define DEFINE_EVENT_TYPE(name) const wxEventType name = wxNewEventType();
 #define DEFINE_LOCAL_EVENT_TYPE(name) DEFINE_EVENT_TYPE(name)
 
@@ -331,6 +335,17 @@ END_DECLARE_EVENT_TYPES()
 
 #endif // WXWIN_COMPATIBILITY
 
 
 #endif // WXWIN_COMPATIBILITY
 
+// the predefined constants for the number of times we propagate event
+// upwards window child-parent chain
+enum Propagation_state
+{
+    // don't propagate it at all
+    wxEVENT_PROPAGATE_NONE = 0,
+
+    // propagate it until it is processed
+    wxEVENT_PROPAGATE_MAX = INT_MAX
+};
+
 /*
  * wxWindows events, covering all interesting things that might happen
  * (button clicking, resizing, setting text in widgets, etc.).
 /*
  * wxWindows events, covering all interesting things that might happen
  * (button clicking, resizing, setting text in widgets, etc.).
@@ -370,30 +385,112 @@ public:
     void Skip(bool skip = TRUE) { m_skipped = skip; }
     bool GetSkipped() const { return m_skipped; };
 
     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.
-    bool IsCommandEvent() const { return m_isCommandEvent; }
-
     // 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;
 
     // 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;
 
+    // Implementation only: this test is explicitlty anti OO and this functions
+    // exists only for optimization purposes.
+    bool IsCommandEvent() const { return m_isCommandEvent; }
+
+    // Determine if this event should be propagating to the parent window.
+    bool ShouldPropagate() const
+        { return m_propagationLevel != wxEVENT_PROPAGATE_NONE; }
+
+    // Stop an event from propagating to its parent window, returns the old
+    // propagation level value
+    int StopPropagation()
+    {
+        int propagationLevel = m_propagationLevel;
+        m_propagationLevel = wxEVENT_PROPAGATE_NONE;
+        return propagationLevel;
+    }
+
+    // Resume the event propagation by restoring the propagation level
+    // (returned by StopPropagation())
+    void ResumePropagation(int propagationLevel)
+    {
+        m_propagationLevel = propagationLevel;
+    }
+
 public:
     wxObject*         m_eventObject;
     wxEventType       m_eventType;
     long              m_timeStamp;
     int               m_id;
     wxObject*         m_callbackUserData;
 public:
     wxObject*         m_eventObject;
     wxEventType       m_eventType;
     long              m_timeStamp;
     int               m_id;
     wxObject*         m_callbackUserData;
+
+protected:
+    // the propagation level: while it is positive, we propagate the event to
+    // the parent window (if any)
+    //
+    // this one doesn't have to be public, we don't have to worry about
+    // backwards compatibility as it is new
+    int               m_propagationLevel;
+
+public:
     bool              m_skipped;
     bool              m_isCommandEvent;
     bool              m_skipped;
     bool              m_isCommandEvent;
-
+    
 private:
 private:
+    // it needs to access our m_propagationLevel
+    friend class WXDLLIMPEXP_BASE wxPropagateOnce;
+
     DECLARE_ABSTRACT_CLASS(wxEvent)
 };
 
     DECLARE_ABSTRACT_CLASS(wxEvent)
 };
 
+/*
+ * Helper class to temporarily change an event not to propagate.
+ */
+class WXDLLIMPEXP_BASE wxPropagationDisabler
+{
+public:
+    wxPropagationDisabler(wxEvent& event) : m_event(event)
+    {
+        m_propagationLevelOld = m_event.StopPropagation();
+    }
+
+    ~wxPropagationDisabler()
+    {
+        m_event.ResumePropagation(m_propagationLevelOld);
+    }
+
+private:
+    wxEvent& m_event;
+    int m_propagationLevelOld;
+
+    DECLARE_NO_COPY_CLASS(wxPropagationDisabler)
+};
+
+/*
+ * Another one to temporarily lower propagation level.
+ */
+class WXDLLIMPEXP_BASE wxPropagateOnce
+{
+public:
+    wxPropagateOnce(wxEvent& event) : m_event(event)
+    {
+        wxASSERT_MSG( m_event.m_propagationLevel > 0,
+                        _T("shouldn't be used unless ShouldPropagate()!") );
+
+        m_event.m_propagationLevel--;
+    }
+
+    ~wxPropagateOnce()
+    {
+        m_event.m_propagationLevel++;
+    }
+
+private:
+    wxEvent& m_event;
+
+    DECLARE_NO_COPY_CLASS(wxPropagateOnce)
+};
+
 #if wxUSE_GUI
 
 #if wxUSE_GUI
 
+
 // Item or menu event class
 /*
  wxEVT_COMMAND_BUTTON_CLICKED
 // Item or menu event class
 /*
  wxEVT_COMMAND_BUTTON_CLICKED
@@ -415,9 +512,6 @@ private:
 
 class WXDLLIMPEXP_CORE wxCommandEvent : public wxEvent
 {
 
 class WXDLLIMPEXP_CORE wxCommandEvent : public wxEvent
 {
-private:
-    wxCommandEvent& operator=(const wxCommandEvent& event);
-
 public:
     wxCommandEvent(wxEventType commandType = wxEVT_NULL, int winid = 0);
 
 public:
     wxCommandEvent(wxEventType commandType = wxEVT_NULL, int winid = 0);
 
@@ -471,7 +565,7 @@ public:
     wxClientData*     m_clientObject;  // Arbitrary client object
 
 private:
     wxClientData*     m_clientObject;  // Arbitrary client object
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxCommandEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(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
@@ -502,7 +596,7 @@ private:
     bool m_bAllow;
 
 private:
     bool m_bAllow;
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxNotifyEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxNotifyEvent)
 };
 
 // Scroll event class, derived form wxCommandEvent. wxScrollEvents are
 };
 
 // Scroll event class, derived form wxCommandEvent. wxScrollEvents are
@@ -533,7 +627,7 @@ public:
     virtual wxEvent *Clone() const { return new wxScrollEvent(*this); }
 
 private:
     virtual wxEvent *Clone() const { return new wxScrollEvent(*this); }
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxScrollEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxScrollEvent)
 };
 
 // ScrollWin event class, derived fom wxEvent. wxScrollWinEvents
 };
 
 // ScrollWin event class, derived fom wxEvent. wxScrollWinEvents
@@ -570,7 +664,7 @@ public:
     long              m_extraLong;
 
 private:
     long              m_extraLong;
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxScrollWinEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxScrollWinEvent)
 };
 
 // Mouse event class
 };
 
 // Mouse event class
@@ -811,7 +905,7 @@ private:
     wxCursor m_cursor;
 
 private:
     wxCursor m_cursor;
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxSetCursorEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxSetCursorEvent)
 };
 
 // Keyboard input event class
 };
 
 // Keyboard input event class
@@ -958,7 +1052,7 @@ public:
     wxRect m_rect; // Used for wxEVT_SIZING
 
 private:
     wxRect m_rect; // Used for wxEVT_SIZING
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxSizeEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxSizeEvent)
 };
 
 // Move event class
 };
 
 // Move event class
@@ -995,7 +1089,7 @@ public:
     wxRect m_rect;
 
 private:
     wxRect m_rect;
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxMoveEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxMoveEvent)
 };
 
 // Paint event class
 };
 
 // Paint event class
@@ -1032,7 +1126,7 @@ public:
     virtual wxEvent *Clone() const { return new wxPaintEvent(*this); }
 
 private:
     virtual wxEvent *Clone() const { return new wxPaintEvent(*this); }
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxPaintEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxPaintEvent)
 };
 
 class WXDLLIMPEXP_CORE wxNcPaintEvent : public wxEvent
 };
 
 class WXDLLIMPEXP_CORE wxNcPaintEvent : public wxEvent
@@ -1045,7 +1139,7 @@ public:
     virtual wxEvent *Clone() const { return new wxNcPaintEvent(*this); }
 
 private:
     virtual wxEvent *Clone() const { return new wxNcPaintEvent(*this); }
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxNcPaintEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxNcPaintEvent)
 };
 
 // Erase background event class
 };
 
 // Erase background event class
@@ -1055,9 +1149,6 @@ private:
 
 class WXDLLIMPEXP_CORE wxEraseEvent : public wxEvent
 {
 
 class WXDLLIMPEXP_CORE wxEraseEvent : public wxEvent
 {
-private:
-    wxEraseEvent& operator=(const wxEraseEvent& event);
-
 public:
     wxEraseEvent(int Id = 0, wxDC *dc = (wxDC *) NULL)
         : wxEvent(Id, wxEVT_ERASE_BACKGROUND),
 public:
     wxEraseEvent(int Id = 0, wxDC *dc = (wxDC *) NULL)
         : wxEvent(Id, wxEVT_ERASE_BACKGROUND),
@@ -1076,7 +1167,7 @@ public:
     wxDC *m_dc;
 
 private:
     wxDC *m_dc;
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxEraseEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxEraseEvent)
 };
 
 // Focus event class
 };
 
 // Focus event class
@@ -1087,9 +1178,6 @@ private:
 
 class WXDLLIMPEXP_CORE wxFocusEvent : public wxEvent
 {
 
 class WXDLLIMPEXP_CORE wxFocusEvent : public wxEvent
 {
-private:
-    wxFocusEvent& operator=(const wxFocusEvent& event);
-
 public:
     wxFocusEvent(wxEventType type = wxEVT_NULL, int winid = 0)
         : wxEvent(winid, type)
 public:
     wxFocusEvent(wxEventType type = wxEVT_NULL, int winid = 0)
         : wxEvent(winid, type)
@@ -1111,11 +1199,11 @@ private:
     wxWindow *m_win;
 
 private:
     wxWindow *m_win;
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxFocusEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxFocusEvent)
 };
 
 // wxChildFocusEvent notifies the parent that a child has got the focus: unlike
 };
 
 // wxChildFocusEvent notifies the parent that a child has got the focus: unlike
-// wxFocusEvent it is propgated upwards the window chain
+// wxFocusEvent it is propagated upwards the window chain
 class WXDLLIMPEXP_CORE wxChildFocusEvent : public wxCommandEvent
 {
 public:
 class WXDLLIMPEXP_CORE wxChildFocusEvent : public wxCommandEvent
 {
 public:
@@ -1126,7 +1214,7 @@ public:
     virtual wxEvent *Clone() const { return new wxChildFocusEvent(*this); }
 
 private:
     virtual wxEvent *Clone() const { return new wxChildFocusEvent(*this); }
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxChildFocusEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxChildFocusEvent)
 };
 
 // Activate event class
 };
 
 // Activate event class
@@ -1153,7 +1241,7 @@ private:
     bool m_active;
 
 private:
     bool m_active;
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxActivateEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxActivateEvent)
 };
 
 // InitDialog event class
 };
 
 // InitDialog event class
@@ -1171,7 +1259,7 @@ public:
     virtual wxEvent *Clone() const { return new wxInitDialogEvent(*this); }
 
 private:
     virtual wxEvent *Clone() const { return new wxInitDialogEvent(*this); }
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxInitDialogEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxInitDialogEvent)
 };
 
 // Miscellaneous menu event class
 };
 
 // Miscellaneous menu event class
@@ -1186,7 +1274,7 @@ class WXDLLIMPEXP_CORE wxMenuEvent : public wxEvent
 public:
     wxMenuEvent(wxEventType type = wxEVT_NULL, int winid = 0, wxMenu* menu = NULL)
         : wxEvent(winid, type)
 public:
     wxMenuEvent(wxEventType type = wxEVT_NULL, int winid = 0, wxMenu* menu = NULL)
         : wxEvent(winid, type)
-        { m_menuId = winid; m_menu = NULL; }
+        { m_menuId = winid; m_menu = menu; }
     wxMenuEvent(const wxMenuEvent & event)
         : wxEvent(event)
     { m_menuId = event.m_menuId; m_menu = event.m_menu; }
     wxMenuEvent(const wxMenuEvent & event)
         : wxEvent(event)
     { m_menuId = event.m_menuId; m_menu = event.m_menu; }
@@ -1206,7 +1294,7 @@ private:
     int     m_menuId;
     wxMenu* m_menu;
 
     int     m_menuId;
     wxMenu* m_menu;
 
-    DECLARE_DYNAMIC_CLASS(wxMenuEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxMenuEvent)
 };
 
 // Window close or session close event class
 };
 
 // Window close or session close event class
@@ -1275,7 +1363,7 @@ protected:
 #endif
 
 private:
 #endif
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxCloseEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxCloseEvent)
 
 };
 
 
 };
 
@@ -1302,7 +1390,7 @@ protected:
     bool m_show;
 
 private:
     bool m_show;
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxShowEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxShowEvent)
 };
 
 /*
 };
 
 /*
@@ -1328,7 +1416,7 @@ protected:
     bool m_iconized;
 
 private:
     bool m_iconized;
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxIconizeEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxIconizeEvent)
 };
 /*
  wxEVT_MAXIMIZE
 };
 /*
  wxEVT_MAXIMIZE
@@ -1344,7 +1432,7 @@ public:
     virtual wxEvent *Clone() const { return new wxMaximizeEvent(*this); }
 
 private:
     virtual wxEvent *Clone() const { return new wxMaximizeEvent(*this); }
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxMaximizeEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxMaximizeEvent)
 };
 
 // Joystick event class
 };
 
 // Joystick event class
@@ -1442,7 +1530,7 @@ public:
     virtual wxEvent *Clone() const { return new wxJoystickEvent(*this); }
 
 private:
     virtual wxEvent *Clone() const { return new wxJoystickEvent(*this); }
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxJoystickEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxJoystickEvent)
 };
 
 // Drop files event class
 };
 
 // Drop files event class
@@ -1452,9 +1540,6 @@ private:
 
 class WXDLLIMPEXP_CORE wxDropFilesEvent : public wxEvent
 {
 
 class WXDLLIMPEXP_CORE wxDropFilesEvent : public wxEvent
 {
-private:
-    wxDropFilesEvent& operator=(const wxDropFilesEvent& event);
-
 public:
     int       m_noFiles;
     wxPoint   m_pos;
 public:
     int       m_noFiles;
     wxPoint   m_pos;
@@ -1495,7 +1580,7 @@ public:
     virtual wxEvent *Clone() const { return new wxDropFilesEvent(*this); }
 
 private:
     virtual wxEvent *Clone() const { return new wxDropFilesEvent(*this); }
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxDropFilesEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxDropFilesEvent)
 };
 
 // Update UI event
 };
 
 // Update UI event
@@ -1588,7 +1673,7 @@ protected:
     static wxUpdateUIMode   sm_updateMode;
 
 private:
     static wxUpdateUIMode   sm_updateMode;
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxUpdateUIEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxUpdateUIEvent)
 };
 
 /*
 };
 
 /*
@@ -1606,7 +1691,7 @@ public:
     virtual wxEvent *Clone() const { return new wxSysColourChangedEvent(*this); }
 
 private:
     virtual wxEvent *Clone() const { return new wxSysColourChangedEvent(*this); }
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxSysColourChangedEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxSysColourChangedEvent)
 };
 
 /*
 };
 
 /*
@@ -1617,9 +1702,6 @@ private:
 
 class WXDLLIMPEXP_CORE wxMouseCaptureChangedEvent : public wxEvent
 {
 
 class WXDLLIMPEXP_CORE wxMouseCaptureChangedEvent : public wxEvent
 {
-private:
-    wxMouseCaptureChangedEvent operator=(const wxMouseCaptureChangedEvent& event);
-
 public:
     wxMouseCaptureChangedEvent(wxWindowID winid = 0, wxWindow* gainedCapture = NULL)
         : wxEvent(winid, wxEVT_MOUSE_CAPTURE_CHANGED),
 public:
     wxMouseCaptureChangedEvent(wxWindowID winid = 0, wxWindow* gainedCapture = NULL)
         : wxEvent(winid, wxEVT_MOUSE_CAPTURE_CHANGED),
@@ -1637,7 +1719,8 @@ public:
 
 private:
     wxWindow* m_gainedCapture;
 
 private:
     wxWindow* m_gainedCapture;
-    DECLARE_DYNAMIC_CLASS(wxMouseCaptureChangedEvent)
+
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxMouseCaptureChangedEvent)
 };
 
 /*
 };
 
 /*
@@ -1646,7 +1729,7 @@ private:
 class WXDLLIMPEXP_CORE wxDisplayChangedEvent : public wxEvent
 {
 private:
 class WXDLLIMPEXP_CORE wxDisplayChangedEvent : public wxEvent
 {
 private:
-    DECLARE_DYNAMIC_CLASS(wxDisplayChangedEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxDisplayChangedEvent)
 
 public:
     wxDisplayChangedEvent()
 
 public:
     wxDisplayChangedEvent()
@@ -1662,9 +1745,6 @@ public:
 
 class WXDLLIMPEXP_CORE wxPaletteChangedEvent : public wxEvent
 {
 
 class WXDLLIMPEXP_CORE wxPaletteChangedEvent : public wxEvent
 {
-private:
-    wxPaletteChangedEvent& operator=(const wxPaletteChangedEvent& event);
-
 public:
     wxPaletteChangedEvent(wxWindowID winid = 0)
         : wxEvent(winid, wxEVT_PALETTE_CHANGED),
 public:
     wxPaletteChangedEvent(wxWindowID winid = 0)
         : wxEvent(winid, wxEVT_PALETTE_CHANGED),
@@ -1685,7 +1765,7 @@ protected:
     wxWindow*     m_changedWindow;
 
 private:
     wxWindow*     m_changedWindow;
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxPaletteChangedEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxPaletteChangedEvent)
 };
 
 /*
 };
 
 /*
@@ -1715,7 +1795,7 @@ protected:
     bool m_paletteRealized;
 
 private:
     bool m_paletteRealized;
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxQueryNewPaletteEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxQueryNewPaletteEvent)
 };
 
 /*
 };
 
 /*
@@ -1725,9 +1805,6 @@ private:
 // NB: don't derive from command event to avoid being propagated to the parent
 class WXDLLIMPEXP_CORE wxNavigationKeyEvent : public wxEvent
 {
 // NB: don't derive from command event to avoid being propagated to the parent
 class WXDLLIMPEXP_CORE wxNavigationKeyEvent : public wxEvent
 {
-private:
-    wxNavigationKeyEvent& operator=(const wxNavigationKeyEvent& event);
-
 public:
     wxNavigationKeyEvent()
         : wxEvent(0, wxEVT_NAVIGATION_KEY),
 public:
     wxNavigationKeyEvent()
         : wxEvent(0, wxEVT_NAVIGATION_KEY),
@@ -1781,7 +1858,7 @@ private:
     wxWindow *m_focus;
 
 private:
     wxWindow *m_focus;
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxNavigationKeyEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxNavigationKeyEvent)
 };
 
 // Window creation/destruction events: the first is sent as soon as window is
 };
 
 // Window creation/destruction events: the first is sent as soon as window is
@@ -1804,7 +1881,7 @@ public:
     virtual wxEvent *Clone() const { return new wxWindowCreateEvent(*this); }
 
 private:
     virtual wxEvent *Clone() const { return new wxWindowCreateEvent(*this); }
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxWindowCreateEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxWindowCreateEvent)
 };
 
 class WXDLLIMPEXP_CORE wxWindowDestroyEvent : public wxCommandEvent
 };
 
 class WXDLLIMPEXP_CORE wxWindowDestroyEvent : public wxCommandEvent
@@ -1817,7 +1894,7 @@ public:
     virtual wxEvent *Clone() const { return new wxWindowDestroyEvent(*this); }
 
 private:
     virtual wxEvent *Clone() const { return new wxWindowDestroyEvent(*this); }
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxWindowDestroyEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(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.
@@ -1862,7 +1939,7 @@ protected:
     wxString  m_link;
 
 private:
     wxString  m_link;
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxHelpEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxHelpEvent)
 };
 
 // A Context event is sent when the user right clicks on a window or
 };
 
 // A Context event is sent when the user right clicks on a window or
@@ -1897,7 +1974,7 @@ protected:
     wxPoint   m_pos;
 
 private:
     wxPoint   m_pos;
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxContextMenuEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxContextMenuEvent)
 };
 
 // Idle event
 };
 
 // Idle event
@@ -1952,7 +2029,7 @@ protected:
     static wxIdleMode sm_idleMode;
 
 private:
     static wxIdleMode sm_idleMode;
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxIdleEvent)
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxIdleEvent)
 };
 
 #endif // wxUSE_GUI
 };
 
 #endif // wxUSE_GUI
@@ -2045,6 +2122,9 @@ struct WXDLLIMPEXP_BASE wxEventTableEntry : public wxEventTableEntryBase
     // objects will have been initialized (including the event type constants)
     // and so it will have the correct value when it is needed
     const int& m_eventType;
     // objects will have been initialized (including the event type constants)
     // and so it will have the correct value when it is needed
     const int& m_eventType;
+
+private:
+    wxEventTableEntry& operator=(const wxEventTableEntry&);
 };
 
 class WXDLLIMPEXP_BASE wxEvtHandler;
 };
 
 class WXDLLIMPEXP_BASE wxEvtHandler;
@@ -2068,6 +2148,8 @@ struct WXDLLIMPEXP_BASE wxDynamicEventTableEntry : public wxEventTableEntryBase
     // EventFunction is always a member of the EventHandler receiving the 
     // message
     wxEvtHandler* m_eventSink;
     // EventFunction is always a member of the EventHandler receiving the 
     // message
     wxEvtHandler* m_eventSink;
+
+    DECLARE_NO_COPY_CLASS(wxDynamicEventTableEntry)
 };
 
 #endif // !WXWIN_COMPATIBILITY_EVENT_TYPES
 };
 
 #endif // !WXWIN_COMPATIBILITY_EVENT_TYPES
@@ -2082,6 +2164,58 @@ struct WXDLLIMPEXP_BASE wxEventTable
     const wxEventTableEntry *entries; // bottom of entry array
 };
 
     const wxEventTableEntry *entries; // bottom of entry array
 };
 
+// ----------------------------------------------------------------------------
+// wxEventHashTable: a helper of wxEvtHandler to speed up wxEventTable lookups.
+// ----------------------------------------------------------------------------
+
+WX_DEFINE_ARRAY_NO_PTR(const wxEventTableEntry*, wxEventTableEntryPointerArray);
+class WXDLLIMPEXP_BASE wxEvtHandler;
+
+class WXDLLIMPEXP_BASE wxEventHashTable
+{
+private:
+    // Internal data structs
+    struct EventTypeTable
+    {
+        wxEventType                   eventType;
+        wxEventTableEntryPointerArray eventEntryTable;
+    };
+    typedef EventTypeTable* EventTypeTablePointer;
+
+public:
+    // Constructor, needs the event table it needs to hash later on.
+    // Note: hashing of the event table is not done in the constructor as it 
+    //       can be that the event table is not yet full initialize, the hash 
+    //       will gets initialized when handling the first event look-up request.
+    wxEventHashTable(const wxEventTable &table);
+    // Destructor.
+    ~wxEventHashTable();
+
+    // Handle the given event, in other words search the event table hash 
+    // and call self->ProcessEvent() if a match was found.
+    bool HandleEvent(wxEvent &event, wxEvtHandler *self);
+
+protected:
+    // Init the hash table with the entries of the static event table.
+    void InitHashTable();
+    // Helper funtion of InitHashTable() to insert 1 entry into the hash table.
+    void AddEntry(const wxEventTableEntry &entry);
+    // Allocate and init with null pointers the base hash table.
+    void AllocEventTypeTable(size_t size);
+    // Grow the hash table in size and transfer all items currently 
+    // in the table to the correct location in the new table.
+    void GrowEventTypeTable();
+
+protected:
+    const wxEventTable    &m_table;
+    bool                   m_rebuildHash;
+
+    size_t                 m_size;
+    EventTypeTablePointer *m_eventTypeTable;
+
+    DECLARE_NO_COPY_CLASS(wxEventHashTable)
+};
+
 // ----------------------------------------------------------------------------
 // wxEvtHandler: the base class for all objects handling wxWindows events
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // wxEvtHandler: the base class for all objects handling wxWindows events
 // ----------------------------------------------------------------------------
@@ -2201,10 +2335,12 @@ protected:
     virtual bool TryParent(wxEvent& event);
 
 
     virtual bool TryParent(wxEvent& event);
 
 
-    static const wxEventTable sm_eventTable;
-
+    static const wxEventTable sm_eventTable;    
     virtual const wxEventTable *GetEventTable() const;
 
     virtual const wxEventTable *GetEventTable() const;
 
+    static wxEventHashTable   sm_eventHashTable;
+    virtual wxEventHashTable& GetEventHashTable() const;
+
     wxEvtHandler*       m_nextHandler;
     wxEvtHandler*       m_previousHandler;
     wxList*             m_dynamicEvents;
     wxEvtHandler*       m_nextHandler;
     wxEvtHandler*       m_previousHandler;
     wxList*             m_dynamicEvents;
@@ -2244,8 +2380,7 @@ protected:
     virtual void *DoGetClientData() const;
 
 private:
     virtual void *DoGetClientData() const;
 
 private:
-    DECLARE_NO_COPY_CLASS(wxEvtHandler)
-    DECLARE_DYNAMIC_CLASS(wxEvtHandler)
+    DECLARE_DYNAMIC_CLASS_NO_COPY(wxEvtHandler)
 };
 
 // Post a message to the given eventhandler which will be processed during the
 };
 
 // Post a message to the given eventhandler which will be processed during the
@@ -2303,16 +2438,22 @@ typedef void (wxEvtHandler::*wxMouseCaptureChangedEventFunction)(wxMouseCaptureC
         static const wxEventTableEntry sm_eventTableEntries[]; \
     protected: \
         static const wxEventTable        sm_eventTable; \
         static const wxEventTableEntry sm_eventTableEntries[]; \
     protected: \
         static const wxEventTable        sm_eventTable; \
-        virtual const wxEventTable*        GetEventTable() const;
+        virtual const wxEventTable*      GetEventTable() const; \
+        static wxEventHashTable          sm_eventHashTable; \
+        virtual wxEventHashTable&        GetEventHashTable() const;
 
 // N.B.: when building DLL with Borland C++ 5.5 compiler, you must initialize
 //       sm_eventTable before using it in GetEventTable() or the compiler gives
 //       E2233 (see http://groups.google.com/groups?selm=397dcc8a%241_2%40dnews)
 
 // N.B.: when building DLL with Borland C++ 5.5 compiler, you must initialize
 //       sm_eventTable before using it in GetEventTable() or the compiler gives
 //       E2233 (see http://groups.google.com/groups?selm=397dcc8a%241_2%40dnews)
+
 #define BEGIN_EVENT_TABLE(theClass, baseClass) \
     const wxEventTable theClass::sm_eventTable = \
         { &baseClass::sm_eventTable, &theClass::sm_eventTableEntries[0] }; \
     const wxEventTable *theClass::GetEventTable() const \
         { return &theClass::sm_eventTable; } \
 #define BEGIN_EVENT_TABLE(theClass, baseClass) \
     const wxEventTable theClass::sm_eventTable = \
         { &baseClass::sm_eventTable, &theClass::sm_eventTableEntries[0] }; \
     const wxEventTable *theClass::GetEventTable() const \
         { return &theClass::sm_eventTable; } \
+    wxEventHashTable theClass::sm_eventHashTable(theClass::sm_eventTable); \
+    wxEventHashTable &theClass::GetEventHashTable() const \
+        { return theClass::sm_eventHashTable; } \
     const wxEventTableEntry theClass::sm_eventTableEntries[] = { \
 
 #define END_EVENT_TABLE() DECLARE_EVENT_TABLE_ENTRY( wxEVT_NULL, 0, 0, 0, 0 ) };
     const wxEventTableEntry theClass::sm_eventTableEntries[] = { \
 
 #define END_EVENT_TABLE() DECLARE_EVENT_TABLE_ENTRY( wxEVT_NULL, 0, 0, 0, 0 ) };
@@ -2573,5 +2714,5 @@ wxWindow* wxFindFocusDescendant(wxWindow* ancestor);
 
 #endif // wxUSE_GUI
 
 
 #endif // wxUSE_GUI
 
-#endif
-        // _WX_EVENTH__
+#endif // _WX_EVENT_H__
+