]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/event.h
added template wxScopedArray<> too
[wxWidgets.git] / include / wx / event.h
index fd6866ee584449e4b3a81f93fbaf8a43d4c003ab..db64d8c6c6aa75e5cc5d9210540165e41a99fe91 100644 (file)
@@ -94,6 +94,11 @@ typedef int wxEventType;
 // generate a new unique event type
 extern WXDLLIMPEXP_BASE wxEventType wxNewEventType();
 
 // generate a new unique event type
 extern WXDLLIMPEXP_BASE wxEventType wxNewEventType();
 
+// FIXME: currently the new events code is disabled because it creates too
+//        many problems, it should be reenabled a.s.a.p. or removed
+#undef wxEVENTS_COMPATIBILITY_2_8
+#define wxEVENTS_COMPATIBILITY_2_8 1
+
 // macros to create an event type depending on whether type safe events are
 // enabled.
 
 // macros to create an event type depending on whether type safe events are
 // enabled.
 
@@ -104,11 +109,11 @@ extern WXDLLIMPEXP_BASE wxEventType wxNewEventType();
     #define wxDECLARE_EXPORTED_EVENT( expdecl, name, type ) \
         extern const expdecl wxEventType name;
 
     #define wxDECLARE_EXPORTED_EVENT( expdecl, name, type ) \
         extern const expdecl wxEventType name;
 
-    #define wxDEFINE_EVENT_REFERENCE( name, type, value ) \
-        const wxEventType& name = value;
+    #define wxDEFINE_EVENT_ALIAS( name, type, value ) \
+        const wxEventType name = value;
 
 
-    #define wxDECLARE_EXPORTED_EVENT_REFERENCE( expdecl, name, type ) \
-        extern const expdecl wxEventType& name;
+    #define wxDECLARE_EXPORTED_EVENT_ALIAS( expdecl, name, type ) \
+        extern const expdecl wxEventType name;
 
     #define wxDECLARE_LOCAL_EVENT( name, type ) \
         wxDECLARE_EXPORTED_EVENT( wxEMPTY_PARAMETER_VALUE, name, type )
 
     #define wxDECLARE_LOCAL_EVENT( name, type ) \
         wxDECLARE_EXPORTED_EVENT( wxEMPTY_PARAMETER_VALUE, name, type )
@@ -122,11 +127,11 @@ extern WXDLLIMPEXP_BASE wxEventType wxNewEventType();
     #define wxDECLARE_EXPORTED_EVENT( expdecl, name, type ) \
         extern const expdecl wxTypedEventType< type > name;
 
     #define wxDECLARE_EXPORTED_EVENT( expdecl, name, type ) \
         extern const expdecl wxTypedEventType< type > name;
 
-    #define wxDEFINE_EVENT_REFERENCE( name, type, value ) \
-        const wxTypedEventTypeReference< type > name( value );
+    #define wxDEFINE_EVENT_ALIAS( name, type, value ) \
+        const wxTypedEventType< type > name( value );
 
 
-    #define wxDECLARE_EXPORTED_EVENT_REFERENCE( expdecl, name, type ) \
-        extern const expdecl wxTypedEventTypeReference< type > name;
+    #define wxDECLARE_EXPORTED_EVENT_ALIAS( expdecl, name, type ) \
+        extern const expdecl wxTypedEventType< type > name;
 
     #define wxDECLARE_LOCAL_EVENT( name, type ) \
         wxDECLARE_EXPORTED_EVENT( wxEMPTY_PARAMETER_VALUE, name, type )
 
     #define wxDECLARE_LOCAL_EVENT( name, type ) \
         wxDECLARE_EXPORTED_EVENT( wxEMPTY_PARAMETER_VALUE, name, type )
@@ -154,30 +159,6 @@ private:
     wxEventType m_type;
 };
 
     wxEventType m_type;
 };
 
-// Due to a bug in older wx versions wxSpinEvents were being sent with type of
-// wxEVT_SCROLL_LINEUP, wxEVT_SCROLL_LINEDOWN and wxEVT_SCROLL_THUMBTRACK. But
-// with the type-safe events in place, these event types are associated with
-// wxScrollEvent. To allow handling of spin events, new event types have been
-// defined in spinbutt.h/spinnbuttcmn.cpp. To maintain backward compatibility
-// the spin event types are being initialized with the scroll event types. But
-// this presents as with the same static initialization order problem we also
-// have for the static event tables. So we use the same solution and the
-// template definition below holds a reference to a wxEventType.
-template <typename Event>
-class WXDLLIMPEXP_BASE wxTypedEventTypeReference
-{
-public:
-    typedef Event CorrespondingEvent;
-
-    wxTypedEventTypeReference(const wxEventType& type) : m_type(type) { }
-
-    // used for static event tables
-    operator const wxEventType&() const { return m_type; }
-
-private:
-    const wxEventType &m_type;
-};
-
 #endif // !wxEVENTS_COMPATIBILITY_2_8
 
 // These are needed for the functor definitions
 #endif // !wxEVENTS_COMPATIBILITY_2_8
 
 // These are needed for the functor definitions
@@ -248,7 +229,7 @@ private:
 // value is used by the event table macros
 
 inline wxObjectEventFunctor *
 // value is used by the event table macros
 
 inline wxObjectEventFunctor *
-wxNewEventFunctor(wxEventType WXUNUSED(evtType),
+wxNewEventFunctor(const wxEventType& WXUNUSED(evtType),
                   wxObjectEventFunction method,
                   wxEvtHandler *handler = NULL)
 {
                   wxObjectEventFunction method,
                   wxEvtHandler *handler = NULL)
 {
@@ -256,7 +237,7 @@ wxNewEventFunctor(wxEventType WXUNUSED(evtType),
 }
 
 inline wxObjectEventFunctor
 }
 
 inline wxObjectEventFunctor
-wxConstructEventFunctor(wxEventType WXUNUSED(evtType),
+wxConstructEventFunctor(const wxEventType& WXUNUSED(evtType),
                         wxObjectEventFunction method,
                         wxEvtHandler *handler)
 {
                         wxObjectEventFunction method,
                         wxEvtHandler *handler)
 {
@@ -490,6 +471,7 @@ class WXDLLIMPEXP_FWD_CORE wxKeyEvent;
 class WXDLLIMPEXP_FWD_CORE wxNavigationKeyEvent;
 class WXDLLIMPEXP_FWD_CORE wxSetCursorEvent;
 class WXDLLIMPEXP_FWD_CORE wxScrollEvent;
 class WXDLLIMPEXP_FWD_CORE wxNavigationKeyEvent;
 class WXDLLIMPEXP_FWD_CORE wxSetCursorEvent;
 class WXDLLIMPEXP_FWD_CORE wxScrollEvent;
+class WXDLLIMPEXP_FWD_CORE wxSpinEvent;
 class WXDLLIMPEXP_FWD_CORE wxScrollWinEvent;
 class WXDLLIMPEXP_FWD_CORE wxSizeEvent;
 class WXDLLIMPEXP_FWD_CORE wxMoveEvent;
 class WXDLLIMPEXP_FWD_CORE wxScrollWinEvent;
 class WXDLLIMPEXP_FWD_CORE wxSizeEvent;
 class WXDLLIMPEXP_FWD_CORE wxMoveEvent;
@@ -587,6 +569,21 @@ wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLL_THUMBTRACK, wxScrollEven
 wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLL_THUMBRELEASE, wxScrollEvent)
 wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLL_CHANGED, wxScrollEvent)
 
 wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLL_THUMBRELEASE, wxScrollEvent)
 wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLL_CHANGED, wxScrollEvent)
 
+// Due to a bug in older wx versions, wxSpinEvents were being sent with type of
+// wxEVT_SCROLL_LINEUP, wxEVT_SCROLL_LINEDOWN and wxEVT_SCROLL_THUMBTRACK. But
+// with the type-safe events in place, these event types are associated with
+// wxScrollEvent. To allow handling of spin events, new event types have been
+// defined in spinbutt.h/spinnbuttcmn.cpp. To maintain backward compatibility
+// the spin event types are being initialized with the scroll event types.
+
+#if wxUSE_SPINBTN
+
+wxDECLARE_EXPORTED_EVENT_ALIAS( WXDLLIMPEXP_CORE, wxEVT_SPIN_UP,   wxSpinEvent )
+wxDECLARE_EXPORTED_EVENT_ALIAS( WXDLLIMPEXP_CORE, wxEVT_SPIN_DOWN, wxSpinEvent )
+wxDECLARE_EXPORTED_EVENT_ALIAS( WXDLLIMPEXP_CORE, wxEVT_SPIN,      wxSpinEvent )
+
+#endif
+
     // Scroll events from wxWindow
 wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLLWIN_TOP, wxScrollWinEvent)
 wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLLWIN_BOTTOM, wxScrollWinEvent)
     // Scroll events from wxWindow
 wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLLWIN_TOP, wxScrollWinEvent)
 wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_SCROLLWIN_BOTTOM, wxScrollWinEvent)
@@ -713,7 +710,7 @@ 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; }
 
-    // this function is used to create a copy of the event polymorphically and
+    // 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;
     // 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;
@@ -742,6 +739,20 @@ public:
         m_propagationLevel = propagationLevel;
     }
 
         m_propagationLevel = propagationLevel;
     }
 
+
+    // This is for internal use only and is only called by
+    // wxEvtHandler::ProcessEvent() to check whether it's the first time this
+    // event is being processed
+    bool WasProcessed()
+    {
+        if ( m_wasProcessed )
+            return true;
+
+        m_wasProcessed = true;
+
+        return false;
+    }
+
 protected:
     wxObject*         m_eventObject;
     wxEventType       m_eventType;
 protected:
     wxObject*         m_eventObject;
     wxEventType       m_eventType;
@@ -763,6 +774,12 @@ protected:
     bool              m_skipped;
     bool              m_isCommandEvent;
 
     bool              m_skipped;
     bool              m_isCommandEvent;
 
+    // initially false but becomes true as soon as WasProcessed() is called for
+    // the first time, as this is done only by ProcessEvent() it explains the
+    // variable name: it becomes true after ProcessEvent() was called at least
+    // once for this event
+    bool m_wasProcessed;
+
 protected:
     wxEvent(const wxEvent&);            // for implementing Clone()
     wxEvent& operator=(const wxEvent&); // for derived classes operator=()
 protected:
     wxEvent(const wxEvent&);            // for implementing Clone()
     wxEvent& operator=(const wxEvent&); // for derived classes operator=()
@@ -2643,14 +2660,27 @@ public:
     wxEvtHandler();
     virtual ~wxEvtHandler();
 
     wxEvtHandler();
     virtual ~wxEvtHandler();
 
+
+    // Event handler chain
+    // -------------------
+
     wxEvtHandler *GetNextHandler() const { return m_nextHandler; }
     wxEvtHandler *GetPreviousHandler() const { return m_previousHandler; }
     wxEvtHandler *GetNextHandler() const { return m_nextHandler; }
     wxEvtHandler *GetPreviousHandler() const { return m_previousHandler; }
-    void SetNextHandler(wxEvtHandler *handler) { m_nextHandler = handler; }
-    void SetPreviousHandler(wxEvtHandler *handler) { m_previousHandler = handler; }
+    virtual void SetNextHandler(wxEvtHandler *handler) { m_nextHandler = handler; }
+    virtual void SetPreviousHandler(wxEvtHandler *handler) { m_previousHandler = handler; }
 
     void SetEvtHandlerEnabled(bool enabled) { m_enabled = enabled; }
     bool GetEvtHandlerEnabled() const { return m_enabled; }
 
 
     void SetEvtHandlerEnabled(bool enabled) { m_enabled = enabled; }
     bool GetEvtHandlerEnabled() const { return m_enabled; }
 
+    void Unlink();
+    bool IsUnlinked() const;
+
+
+
+    // Event queuing and processing
+    // ----------------------------
+
+
     // Process an event right now: this can only be called from the main
     // thread, use QueueEvent() for scheduling the events for
     // processing from other threads.
     // Process an event right now: this can only be called from the main
     // thread, use QueueEvent() for scheduling the events for
     // processing from other threads.
@@ -2661,6 +2691,7 @@ public:
     // when called from C code (e.g. in GTK+ callback) when the exception
     // wouldn't correctly propagate to wxEventLoop.
     bool SafelyProcessEvent(wxEvent& event);
     // when called from C code (e.g. in GTK+ callback) when the exception
     // wouldn't correctly propagate to wxEventLoop.
     bool SafelyProcessEvent(wxEvent& event);
+        // NOTE: uses ProcessEvent()
 
     // Schedule the given event to be processed later. It takes ownership of
     // the event pointer, i.e. it will be deleted later. This is safe to call
 
     // Schedule the given event to be processed later. It takes ownership of
     // the event pointer, i.e. it will be deleted later. This is safe to call
@@ -2683,11 +2714,17 @@ public:
     }
 
     void ProcessPendingEvents();
     }
 
     void ProcessPendingEvents();
+        // NOTE: uses ProcessEvent()
 
 #if wxUSE_THREADS
     bool ProcessThreadEvent(const wxEvent& event);
 
 #if wxUSE_THREADS
     bool ProcessThreadEvent(const wxEvent& event);
+        // NOTE: uses AddPendingEvent()
 #endif
 
 #endif
 
+
+    // Connecting and disconnecting
+    // ----------------------------
+
     // Dynamic association of a member function handler with the event handler,
     // winid and event type
     void Connect(int winid,
     // Dynamic association of a member function handler with the event handler,
     // winid and event type
     void Connect(int winid,
@@ -3076,12 +3113,7 @@ public:
     void OnSinkDestroyed( wxEvtHandler *sink );
 
 
     void OnSinkDestroyed( wxEvtHandler *sink );
 
 
-    // The method processing the event in this event handler (or rather in this
-    // event handler chain as it also tries the next handler and so on), i.e.
-    // it returns true if we processed this event or false if we didn't but
-    // does not call TryParent() in the latter case. It also doesn't call
-    // wxApp::FilterEvent() before processing it, this is supposed to be done
-    // by the public ProcessEvent() only once for every event we handle.
+    // The method tries to process the event in this event handler.
     //
     // It is meant to be called from ProcessEvent() only and is not virtual,
     // additional event handlers can be hooked into the normal event processing
     //
     // It is meant to be called from ProcessEvent() only and is not virtual,
     // additional event handlers can be hooked into the normal event processing