X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a405cd89a22311d3e0e644273612829258a295bc..b771d06bade79af05559648a0cb13c59dcc0f8a8:/include/wx/event.h diff --git a/include/wx/event.h b/include/wx/event.h index ee9d6b0b20..5f03364ba1 100644 --- a/include/wx/event.h +++ b/include/wx/event.h @@ -462,12 +462,10 @@ private: }; -// // Create functors for the templatized events, either allocated on the heap for -// wxNewXXX() variants (this is needed in wxEvtHandler::Connect() to store them +// wxNewXXX() variants (this is needed in wxEvtHandler::Bind<>() to store them // in dynamic event table) or just by returning them as temporary objects (this -// is enough for Disconnect() and we allocate unnecessary heap allocation like -// this) +// is enough for Unbind<>() and we avoid unnecessary heap allocation like this). // Create functors wrapping other functors (including functions): @@ -598,6 +596,8 @@ wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_COMBOBOX_SELECTED, wxCo wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_TOOL_RCLICKED, wxCommandEvent); wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_TOOL_DROPDOWN_CLICKED, wxCommandEvent); wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_TOOL_ENTER, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_COMBOBOX_DROPDOWN, wxCommandEvent); +wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_COMBOBOX_CLOSEUP, wxCommandEvent); // Thread events wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_THREAD, wxThreadEvent); @@ -811,7 +811,8 @@ enum wxEventCategory // used in wxEventLoopBase::YieldFor to specify all event categories should be processed: wxEVT_CATEGORY_ALL = wxEVT_CATEGORY_UI|wxEVT_CATEGORY_USER_INPUT|wxEVT_CATEGORY_SOCKET| \ - wxEVT_CATEGORY_TIMER|wxEVT_CATEGORY_THREAD + wxEVT_CATEGORY_TIMER|wxEVT_CATEGORY_THREAD|wxEVT_CATEGORY_UNKNOWN| \ + wxEVT_CATEGORY_CLIPBOARD }; /* @@ -2864,7 +2865,6 @@ public: // 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. @@ -2900,9 +2900,11 @@ public: void ProcessPendingEvents(); // NOTE: uses ProcessEvent() + void DeletePendingEvents(); + #if wxUSE_THREADS bool ProcessThreadEvent(const wxEvent& event); - // NOTE: uses AddPendingEvent() + // NOTE: uses AddPendingEvent(); call only from secondary threads #endif @@ -2976,26 +2978,26 @@ public: // Bind arbitrary functor (including just a function) to an event: template void Bind(const EventTag& eventType, - Functor func, + Functor functor, int winid = wxID_ANY, int lastId = wxID_ANY, wxObject *userData = NULL) { DoConnect(winid, lastId, eventType, - wxNewEventFunctor(eventType, func), + wxNewEventFunctor(eventType, functor), userData); } template bool Unbind(const EventTag& eventType, - Functor func, + Functor functor, int winid = wxID_ANY, int lastId = wxID_ANY, wxObject *userData = NULL) { return DoDisconnect(winid, lastId, eventType, - wxMakeEventFunctor(eventType, func), + wxMakeEventFunctor(eventType, functor), userData); } @@ -3003,31 +3005,29 @@ public: // Bind a method of a class (called on the specified eventSink which must // be convertible to this class) object to an event: - template - + template void Bind(const EventTag &eventType, - void (Class::*func)(EventArg &), + void (Class::*method)(EventArg &), ObjClass *eventSink, int winid = wxID_ANY, int lastId = wxID_ANY, wxObject *userData = NULL) { DoConnect(winid, lastId, eventType, - wxNewEventFunctor(eventType, func, eventSink), + wxNewEventFunctor(eventType, method, eventSink), userData); } - template - + template bool Unbind(const EventTag &eventType, - void (Class::*func)(EventArg&), + void (Class::*method)(EventArg&), ObjClass *eventSink, int winid = wxID_ANY, int lastId = wxID_ANY, wxObject *userData = NULL ) { return DoDisconnect(winid, lastId, eventType, - wxMakeEventFunctor(eventType, func, eventSink), + wxMakeEventFunctor(eventType, method, eventSink), userData); } #endif // !wxEVENTS_COMPATIBILITY_2_8 @@ -3067,7 +3067,7 @@ public: // // It is meant to be called from ProcessEvent() only and is not virtual, // additional event handlers can be hooked into the normal event processing - // logic using TryValidator() hook. + // logic using TryBefore() and TryAfter() hooks. bool ProcessEventHere(wxEvent& event); @@ -3090,21 +3090,25 @@ protected: // hooks for wxWindow used by ProcessEvent() // ----------------------------------------- - // This one is called before trying our own event table to allow plugging - // in the validators. - // - // NB: This method is intentionally *not* inside wxUSE_VALIDATORS! - // It is part of wxBase which doesn't use validators and the code - // is compiled out when building wxBase w/o GUI classes, which affects - // binary compatibility and wxBase library can't be used by GUI - // ports. - virtual bool TryValidator(wxEvent& WXUNUSED(event)) { return false; } + // this one is called before trying our own event table to allow plugging + // in the event handlers overriding the default logic, this is used by e.g. + // validators. + virtual bool TryBefore(wxEvent& event); // this one is called after failing to find the event handle in our own // table to give a chance to the other windows to process it // // base class implementation passes the event to wxTheApp - virtual bool TryParent(wxEvent& event); + virtual bool TryAfter(wxEvent& event); + +#ifdef WXWIN_COMPATIBILITY_2_8 + // deprecated method: override TryBefore() instead of this one + wxDEPRECATED_BUT_USED_INTERNALLY_INLINE( + virtual bool TryValidator(wxEvent& WXUNUSED(event)), return false; ) + + wxDEPRECATED_BUT_USED_INTERNALLY_INLINE( + virtual bool TryParent(wxEvent& event), return DoTryApp(event); ) +#endif // WXWIN_COMPATIBILITY_2_8 static const wxEventTable sm_eventTable; @@ -3152,6 +3156,9 @@ protected: wxEventConnectionRef *FindRefInTrackerList(wxEvtHandler *eventSink); private: + // pass the event to wxTheApp instance, called from TryAfter() + bool DoTryApp(wxEvent& event); + DECLARE_DYNAMIC_CLASS_NO_COPY(wxEvtHandler) }; @@ -3744,6 +3751,8 @@ typedef void (wxEvtHandler::*wxClipboardTextEventFunction)(wxClipboardTextEvent& #define EVT_TOOL_RCLICKED_RANGE(id1, id2, func) wx__DECLARE_EVT2(wxEVT_COMMAND_TOOL_RCLICKED, id1, id2, wxCommandEventHandler(func)) #define EVT_TOOL_ENTER(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_TOOL_ENTER, winid, wxCommandEventHandler(func)) #define EVT_CHECKLISTBOX(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, winid, wxCommandEventHandler(func)) +#define EVT_COMBOBOX_DROPDOWN(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_COMBOBOX_DROPDOWN, winid, wxCommandEventHandler(func)) +#define EVT_COMBOBOX_CLOSEUP(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_COMBOBOX_CLOSEUP, winid, wxCommandEventHandler(func)) // Generic command events #define EVT_COMMAND_LEFT_CLICK(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_LEFT_CLICK, winid, wxCommandEventHandler(func)) @@ -3797,6 +3806,41 @@ typedef void (wxEvtHandler::*wxClipboardTextEventFunction)(wxClipboardTextEvent& // Helper functions // ---------------------------------------------------------------------------- +// This is an ugly hack to allow the use of Bind() instead of Connect() inside +// the library code if the library was built with support for it, here is how +// it is used: +// +// class SomeEventHandlingClass : wxBIND_OR_CONNECT_HACK_BASE_CLASS +// public SomeBaseClass +// { +// public: +// SomeEventHandlingClass(wxWindow *win) +// { +// // connect to the event for the given window +// wxBIND_OR_CONNECT_HACK(win, wxEVT_SOMETHING, wxSomeEventHandler, +// SomeEventHandlingClass::OnSomeEvent, this); +// } +// +// private: +// void OnSomeEvent(wxSomeEvent&) { ... } +// }; +// +// This is *not* meant to be used by library users, it is only defined here +// (and not in a private header) because the base class must be visible from +// other public headers, please do NOT use this in your code, it will be +// removed from future wx versions without warning. +#if wxEVENTS_COMPATIBILITY_2_8 + #define wxBIND_OR_CONNECT_HACK_BASE_CLASS public wxEvtHandler, + #define wxBIND_OR_CONNECT_HACK_ONLY_BASE_CLASS : public wxEvtHandler + #define wxBIND_OR_CONNECT_HACK(w, evt, handler, func, obj) \ + win->Connect(evt, handler(func), NULL, obj) +#else // wxEVENTS_COMPATIBILITY_2_8 + #define wxBIND_OR_CONNECT_HACK_BASE_CLASS + #define wxBIND_OR_CONNECT_HACK_ONLY_BASE_CLASS + #define wxBIND_OR_CONNECT_HACK(w, evt, handler, func, obj) \ + win->Bind(evt, &func, obj) +#endif // wxEVENTS_COMPATIBILITY_2_8/!wxEVENTS_COMPATIBILITY_2_8 + #if wxUSE_GUI // Find a window with the focus, that is also a descendant of the given window.