X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2abce4af22b27bde3677a2d433c04a94f27d2b49..e3f084fd47bf7d30722b357724e0c7701a7994f0:/interface/wx/event.h diff --git a/interface/wx/event.h b/interface/wx/event.h index f471d6cd21..6c0a98695c 100644 --- a/interface/wx/event.h +++ b/interface/wx/event.h @@ -1,262 +1,12 @@ ///////////////////////////////////////////////////////////////////////////// // Name: event.h -// Purpose: interface of wxEvtHandler, wxEventBlocker and many -// wxEvent-derived classes +// Purpose: interface of wxEvent-derived classes, +// see event_base.h for wxEvtHandler and wxEvent. // Author: wxWidgets team // RCS-ID: $Id$ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -/** - The predefined constants for the number of times we propagate event - upwards window child-parent chain. -*/ -enum wxEventPropagation -{ - /// don't propagate it at all - wxEVENT_PROPAGATE_NONE = 0, - - /// propagate it until it is processed - wxEVENT_PROPAGATE_MAX = INT_MAX -}; - -/** - The different categories for a wxEvent; see wxEvent::GetEventCategory. - - @note They are used as OR-combinable flags by wxEventLoopBase::YieldFor. -*/ -enum wxEventCategory -{ - /** - This is the category for those events which are generated to update - the appearance of the GUI but which (usually) do not comport data - processing, i.e. which do not provide input or output data - (e.g. size events, scroll events, etc). - They are events NOT directly generated by the user's input devices. - */ - wxEVT_CATEGORY_UI = 1, - - /** - This category groups those events which are generated directly from the - user through input devices like mouse and keyboard and usually result in - data to be processed from the application - (e.g. mouse clicks, key presses, etc). - */ - wxEVT_CATEGORY_USER_INPUT = 2, - - /// This category is for wxSocketEvent - wxEVT_CATEGORY_SOCKET = 4, - - /// This category is for wxTimerEvent - wxEVT_CATEGORY_TIMER = 8, - - /** - This category is for any event used to send notifications from the - secondary threads to the main one or in general for notifications among - different threads (which may or may not be user-generated). - See e.g. wxThreadEvent. - */ - wxEVT_CATEGORY_THREAD = 16, - - /** - This mask is used in wxEventLoopBase::YieldFor to specify that 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 -}; - -/** - @class wxEvent - - An event is a structure holding information about an event passed to a - callback or member function. - - wxEvent used to be a multipurpose event object, and is an abstract base class - for other event classes (see below). - - For more information about events, see the @ref overview_events overview. - - @beginWxPerlOnly - In wxPerl custom event classes should be derived from - @c Wx::PlEvent and @c Wx::PlCommandEvent. - @endWxPerlOnly - - @library{wxbase} - @category{events} - - @see wxCommandEvent, wxMouseEvent -*/ -class wxEvent : public wxObject -{ -public: - /** - Constructor. - - Notice that events are usually created by wxWidgets itself and creating - e.g. a wxPaintEvent in your code and sending it to e.g. a wxTextCtrl - will not usually affect it at all as native controls have no specific - knowledge about wxWidgets events. However you may construct objects of - specific types and pass them to wxEvtHandler::ProcessEvent() if you - want to create your own custom control and want to process its events - in the same manner as the standard ones. - - Also please notice that the order of parameters in this constructor is - different from almost all the derived classes which specify the event - type as the first argument. - - @param id - The identifier of the object (window, timer, ...) which generated - this event. - @param eventType - The unique type of event, e.g. @c wxEVT_PAINT, @c wxEVT_SIZE or - @c wxEVT_COMMAND_BUTTON_CLICKED. - */ - wxEvent(int id = 0, wxEventType eventType = wxEVT_NULL); - - /** - Returns a copy of the event. - - Any event that is posted to the wxWidgets event system for later action - (via wxEvtHandler::AddPendingEvent, wxEvtHandler::QueueEvent or wxPostEvent()) - must implement this method. - - All wxWidgets 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 wxWidgets 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: - - @code - wxEvent *Clone() const { return new MyEvent(*this); } - @endcode - */ - virtual wxEvent* Clone() const = 0; - - /** - Returns the object (usually a window) associated with the event, if any. - */ - wxObject* GetEventObject() const; - - /** - Returns the identifier of the given event type, such as @c wxEVT_COMMAND_BUTTON_CLICKED. - */ - wxEventType GetEventType() const; - - /** - Returns a generic category for this event. - wxEvent implementation returns @c wxEVT_CATEGORY_UI by default. - - This function is used to selectively process events in wxEventLoopBase::YieldFor. - */ - virtual wxEventCategory GetEventCategory() const; - - /** - Returns the identifier associated with this event, such as a button command id. - */ - int GetId() const; - - /** - Returns @true if the event handler should be skipped, @false otherwise. - */ - bool GetSkipped() const; - - /** - Gets the timestamp for the event. The timestamp is the time in milliseconds - since some fixed moment (not necessarily the standard Unix Epoch, so only - differences between the timestamps and not their absolute values usually make sense). - - @warning - wxWidgets returns a non-NULL timestamp only for mouse and key events - (see wxMouseEvent and wxKeyEvent). - */ - long GetTimestamp() const; - - /** - Returns @true if the event is or is derived from wxCommandEvent else it returns @false. - - @note exists only for optimization purposes. - */ - bool IsCommandEvent() const; - - /** - Sets the propagation level to the given value (for example returned from an - earlier call to wxEvent::StopPropagation). - */ - void ResumePropagation(int propagationLevel); - - /** - Sets the originating object. - */ - void SetEventObject(wxObject* object); - - /** - Sets the event type. - */ - void SetEventType(wxEventType type); - - /** - Sets the identifier associated with this event, such as a button command id. - */ - void SetId(int id); - - /** - Sets the timestamp for the event. - */ - void SetTimestamp(long timeStamp = 0); - - /** - Test if this event should be propagated or not, i.e. if the propagation level - is currently greater than 0. - */ - bool ShouldPropagate() const; - - /** - This method can be used inside an event handler to control whether further - event handlers bound to this event will be called after the current one returns. - - Without Skip() (or equivalently if Skip(@false) is used), the event will not - be processed any more. If Skip(@true) is called, the event processing system - continues searching for a further handler function for this event, even though - it has been processed already in the current handler. - - In general, it is recommended to skip all non-command events to allow the - default handling to take place. The command events are, however, normally not - skipped as usually a single command such as a button click or menu item - selection must only be processed by one handler. - */ - void Skip(bool skip = true); - - /** - Stop the event from propagating to its parent window. - - Returns the old propagation level value which may be later passed to - ResumePropagation() to allow propagating the event again. - */ - int StopPropagation(); - -protected: - /** - Indicates how many levels the event can propagate. - - This member is protected and should typically only be set in the constructors - of the derived classes. It may be temporarily changed by StopPropagation() - and ResumePropagation() and tested with ShouldPropagate(). - - The initial value is set to either @c wxEVENT_PROPAGATE_NONE (by default) - meaning that the event shouldn't be propagated at all or to - @c wxEVENT_PROPAGATE_MAX (for command events) meaning that it should be - propagated as much as necessary. - - Any positive number means that the event should be propagated but no more than - the given number of times. E.g. the propagation level may be set to 1 to - propagate the event to its parent only, but not to its grandparent. - */ - int m_propagationLevel; -}; /** @class wxEventBlocker @@ -341,849 +91,6 @@ public: -/** - @class wxEvtHandler - - A class that can handle events from the windowing system. - wxWindow is (and therefore all window classes are) derived from this class. - - When events are received, wxEvtHandler invokes the method listed in the - event table using itself as the object. When using multiple inheritance - it is imperative that the wxEvtHandler(-derived) class is the first - class inherited such that the @c this pointer for the overall object - will be identical to the @c this pointer of the wxEvtHandler portion. - - @library{wxbase} - @category{events} - - @see @ref overview_events_processing, wxEventBlocker, wxEventLoopBase -*/ -class wxEvtHandler : public wxObject, public wxTrackable -{ -public: - /** - Constructor. - */ - wxEvtHandler(); - - /** - Destructor. - - If the handler is part of a chain, the destructor will unlink itself - (see Unlink()). - */ - virtual ~wxEvtHandler(); - - - /** - @name Event queuing and processing - */ - //@{ - - /** - Queue event for a later processing. - - This method is similar to ProcessEvent() but while the latter is - synchronous, i.e. the event is processed immediately, before the - function returns, this one is asynchronous and returns immediately - while the event will be processed at some later time (usually during - the next event loop iteration). - - Another important difference is that this method takes ownership of the - @a event parameter, i.e. it will delete it itself. This implies that - the event should be allocated on the heap and that the pointer can't be - used any more after the function returns (as it can be deleted at any - moment). - - QueueEvent() can be used for inter-thread communication from the worker - threads to the main thread, it is safe in the sense that it uses - locking internally and avoids the problem mentioned in AddPendingEvent() - documentation by ensuring that the @a event object is not used by the - calling thread any more. Care should still be taken to avoid that some - fields of this object are used by it, notably any wxString members of - the event object must not be shallow copies of another wxString object - as this would result in them still using the same string buffer behind - the scenes. For example: - @code - void FunctionInAWorkerThread(const wxString& str) - { - wxCommandEvent* evt = new wxCommandEvent; - - // NOT evt->SetString(str) as this would be a shallow copy - evt->SetString(str.c_str()); // make a deep copy - - wxTheApp->QueueEvent( evt ); - } - @endcode - - Note that you can use wxThreadEvent instead of wxCommandEvent - to avoid this problem: - @code - void FunctionInAWorkerThread(const wxString& str) - { - wxThreadEvent evt; - evt->SetString(str); - - // wxThreadEvent::Clone() makes sure that the internal wxString - // member is not shared by other wxString instances: - wxTheApp->QueueEvent( evt.Clone() ); - } - @endcode - - Finally notice that this method automatically wakes up the event loop - if it is currently idle by calling ::wxWakeUpIdle() so there is no need - to do it manually when using it. - - @since 2.9.0 - - @param event - A heap-allocated event to be queued, QueueEvent() takes ownership - of it. This parameter shouldn't be @c NULL. - */ - virtual void QueueEvent(wxEvent *event); - - /** - Post an event to be processed later. - - This function is similar to QueueEvent() but can't be used to post - events from worker threads for the event objects with wxString fields - (i.e. in practice most of them) because of an unsafe use of the same - wxString object which happens because the wxString field in the - original @a event object and its copy made internally by this function - share the same string buffer internally. Use QueueEvent() to avoid - this. - - A copy of @a event is made by the function, so the original can be deleted - as soon as function returns (it is common that the original is created - on the stack). This requires that the wxEvent::Clone() method be - implemented by event so that it can be duplicated and stored until it - gets processed. - - @param event - Event to add to the pending events queue. - */ - virtual void AddPendingEvent(const wxEvent& event); - - /** - Processes an event, searching event tables and calling zero or more suitable - event handler function(s). - - Normally, your application would not call this function: it is called in the - wxWidgets implementation to dispatch incoming user interface events to the - framework (and application). - - However, you might need to call it if implementing new functionality - (such as a new control) where you define new event types, as opposed to - allowing the user to override virtual functions. - - Notice that you don't usually need to override ProcessEvent() to - customize the event handling, overriding the specially provided - TryBefore() and TryAfter() functions is usually enough. For example, - wxMDIParentFrame may override TryBefore() to ensure that the menu - events are processed in the active child frame before being processed - in the parent frame itself. - - The normal order of event table searching is as follows: - -# wxApp::FilterEvent() is called. If it returns anything but @c -1 - (default) the processing stops here. - -# TryBefore() is called (this is where wxValidator are taken into - account for wxWindow objects). If this returns @true, the function exits. - -# If the object is disabled (via a call to wxEvtHandler::SetEvtHandlerEnabled) - the function skips to step (7). - -# Dynamic event table of the handlers bound using Bind<>() is - searched. If a handler is found, it is executed and the function - returns @true unless the handler used wxEvent::Skip() to indicate - that it didn't handle the event in which case the search continues. - -# Static events table of the handlers bound using event table - macros is searched for this event handler. If this fails, the base - class event table is tried, and so on until no more tables - exist or an appropriate function was found. If a handler is found, - the same logic as in the previous step applies. - -# The search is applied down the entire chain of event handlers (usually the - chain has a length of one). This chain can be formed using wxEvtHandler::SetNextHandler(): - @image html overview_events_chain.png - (referring to the image, if @c A->ProcessEvent is called and it doesn't handle - the event, @c B->ProcessEvent will be called and so on...). - Note that in the case of wxWindow you can build a stack of event handlers - (see wxWindow::PushEventHandler() for more info). - If any of the handlers of the chain return @true, the function exits. - -# TryAfter() is called: for the wxWindow object this may propagate the - event to the window parent (recursively). If the event is still not - processed, ProcessEvent() on wxTheApp object is called as the last - step. - - Notice that steps (2)-(6) are performed in ProcessEventLocally() - which is called by this function. - - @param event - Event to process. - @return - @true if a suitable event handler function was found and executed, - and the function did not call wxEvent::Skip. - - @see SearchEventTable() - */ - virtual bool ProcessEvent(wxEvent& event); - - /** - Try to process the event in this handler and all those chained to it. - - As explained in ProcessEvent() documentation, the event handlers may be - chained in a doubly-linked list. This function tries to process the - event in this handler (including performing any pre-processing done in - TryBefore(), e.g. applying validators) and all those following it in - the chain until the event is processed or the chain is exhausted. - - This function is called from ProcessEvent() and, in turn, calls - TryBefore() and TryAfter(). It is not virtual and so cannot be - overridden but can, and should, be called to forward an event to - another handler instead of ProcessEvent() which would result in a - duplicate call to TryAfter(), e.g. resulting in all unprocessed events - being sent to the application object multiple times. - - @since 2.9.1 - - @param event - Event to process. - @return - @true if this handler of one of those chained to it processed the - event. - */ - bool ProcessEventLocally(wxEvent& event); - - /** - Processes an event by calling ProcessEvent() and handles any exceptions - that occur in the process. - If an exception is thrown in event handler, wxApp::OnExceptionInMainLoop is called. - - @param event - Event to process. - - @return @true if the event was processed, @false if no handler was found - or an exception was thrown. - - @see wxWindow::HandleWindowEvent - */ - bool SafelyProcessEvent(wxEvent& event); - - /** - Processes the pending events previously queued using QueueEvent() or - AddPendingEvent(); you must call this function only if you are sure - there are pending events for this handler, otherwise a @c wxCHECK - will fail. - - The real processing still happens in ProcessEvent() which is called by this - function. - - Note that this function needs a valid application object (see - wxAppConsole::GetInstance()) because wxApp holds the list of the event - handlers with pending events and this function manipulates that list. - */ - void ProcessPendingEvents(); - - /** - Deletes all events queued on this event handler using QueueEvent() or - AddPendingEvent(). - - Use with care because the events which are deleted are (obviously) not - processed and this may have unwanted consequences (e.g. user actions events - will be lost). - */ - void DeletePendingEvents(); - - /** - Searches the event table, executing an event handler function if an appropriate - one is found. - - @param table - Event table to be searched. - @param event - Event to be matched against an event table entry. - - @return @true if a suitable event handler function was found and - executed, and the function did not call wxEvent::Skip. - - @remarks This function looks through the object's event table and tries - to find an entry that will match the event. - An entry will match if: - @li The event type matches, and - @li the identifier or identifier range matches, or the event table - entry's identifier is zero. - - If a suitable function is called but calls wxEvent::Skip, this - function will fail, and searching will continue. - - @todo this function in the header is listed as an "implementation only" function; - are we sure we want to document it? - - @see ProcessEvent() - */ - virtual bool SearchEventTable(wxEventTable& table, - wxEvent& event); - - //@} - - - /** - @name Connecting and disconnecting - */ - //@{ - - /** - Connects the given function dynamically with the event handler, id and - event type. - - Notice that Bind() provides a more flexible and safer way to do the - same thing as Connect(), please use it in any new code -- while - Connect() is not formally deprecated due to its existing widespread - usage, it has no advantages compared to Bind(). - - This is an alternative to the use of static event tables. It is more - flexible as it allows to connect events generated by some object to an - event handler defined in a different object of a different class (which - is impossible to do directly with the event tables -- the events can be - only handled in another object if they are propagated upwards to it). - Do make sure to specify the correct @a eventSink when connecting to an - event of a different object. - - See @ref overview_events_bind for more detailed explanation - of this function and the @ref page_samples_event sample for usage - examples. - - This specific overload allows you to connect an event handler to a @e range - of @e source IDs. - Do not confuse @e source IDs with event @e types: source IDs identify the - event generator objects (typically wxMenuItem or wxWindow objects) while the - event @e type identify which type of events should be handled by the - given @e function (an event generator object may generate many different - types of events!). - - @param id - The first ID of the identifier range to be associated with the event - handler function. - @param lastId - The last ID of the identifier range to be associated with the event - handler function. - @param eventType - The event type to be associated with this event handler. - @param function - The event handler function. Note that this function should - be explicitly converted to the correct type which can be done using a macro - called @c wxFooEventHandler for the handler for any @c wxFooEvent. - @param userData - Data to be associated with the event table entry. - @param eventSink - Object whose member function should be called. It must be specified - when connecting an event generated by one object to a member - function of a different object. If it is omitted, @c this is used. - - @beginWxPerlOnly - In wxPerl this function takes 4 arguments: @a id, @a lastid, - @a type, @a method; if @a method is undef, the handler is - disconnected.} - @endWxPerlOnly - - @see Bind<>() - */ - void Connect(int id, int lastId, wxEventType eventType, - wxObjectEventFunction function, - wxObject* userData = NULL, - wxEvtHandler* eventSink = NULL); - - /** - See the Connect(int, int, wxEventType, wxObjectEventFunction, wxObject*, wxEvtHandler*) - overload for more info. - - This overload can be used to attach an event handler to a single source ID: - - Example: - @code - frame->Connect( wxID_EXIT, - wxEVT_COMMAND_MENU_SELECTED, - wxCommandEventHandler(MyFrame::OnQuit) ); - @endcode - - @beginWxPerlOnly - Not supported by wxPerl. - @endWxPerlOnly - */ - void Connect(int id, wxEventType eventType, - wxObjectEventFunction function, - wxObject* userData = NULL, - wxEvtHandler* eventSink = NULL); - - /** - See the Connect(int, int, wxEventType, wxObjectEventFunction, wxObject*, wxEvtHandler*) - overload for more info. - - This overload will connect the given event handler so that regardless of the - ID of the event source, the handler will be called. - - @beginWxPerlOnly - Not supported by wxPerl. - @endWxPerlOnly - */ - void Connect(wxEventType eventType, - wxObjectEventFunction function, - wxObject* userData = NULL, - wxEvtHandler* eventSink = NULL); - - /** - Disconnects the given function dynamically from the event handler, using the - specified parameters as search criteria and returning @true if a matching - function has been found and removed. - - This method can only disconnect functions which have been added using the - Connect() method. There is no way to disconnect functions connected using - the (static) event tables. - - @param eventType - The event type associated with this event handler. - @param function - The event handler function. - @param userData - Data associated with the event table entry. - @param eventSink - Object whose member function should be called. - - @beginWxPerlOnly - Not supported by wxPerl. - @endWxPerlOnly - */ - bool Disconnect(wxEventType eventType, - wxObjectEventFunction function, - wxObject* userData = NULL, - wxEvtHandler* eventSink = NULL); - - /** - See the Disconnect(wxEventType, wxObjectEventFunction, wxObject*, wxEvtHandler*) - overload for more info. - - This overload takes the additional @a id parameter. - - @beginWxPerlOnly - Not supported by wxPerl. - @endWxPerlOnly - */ - bool Disconnect(int id = wxID_ANY, - wxEventType eventType = wxEVT_NULL, - wxObjectEventFunction function = NULL, - wxObject* userData = NULL, - wxEvtHandler* eventSink = NULL); - - /** - See the Disconnect(wxEventType, wxObjectEventFunction, wxObject*, wxEvtHandler*) - overload for more info. - - This overload takes an additional range of source IDs. - - @beginWxPerlOnly - In wxPerl this function takes 3 arguments: @a id, - @a lastid, @a type. - @endWxPerlOnly - */ - bool Disconnect(int id, int lastId, - wxEventType eventType, - wxObjectEventFunction function = NULL, - wxObject* userData = NULL, - wxEvtHandler* eventSink = NULL); - //@} - - - /** - @name Binding and Unbinding - */ - //@{ - - /** - Binds the given function, functor or method dynamically with the event. - - This offers basically the same functionality as Connect(), but it is - more flexible as it also allows you to use ordinary functions and - arbitrary functors as event handlers. It is also less restrictive then - Connect() because you can use an arbitrary method as an event handler, - whereas Connect() requires a wxEvtHandler derived handler. - - See @ref overview_events_bind for more detailed explanation - of this function and the @ref page_samples_event sample for usage - examples. - - @param eventType - The event type to be associated with this event handler. - @param functor - The event handler functor. This can be an ordinary function but also - an arbitrary functor like boost::function<>. - @param id - The first ID of the identifier range to be associated with the event - handler. - @param lastId - The last ID of the identifier range to be associated with the event - handler. - @param userData - Data to be associated with the event table entry. - - @see @ref overview_cpp_rtti_disabled - - @since 2.9.0 - */ - template - void Bind(const EventTag& eventType, - Functor functor, - int id = wxID_ANY, - int lastId = wxID_ANY, - wxObject *userData = NULL); - - /** - See the Bind<>(const EventTag&, Functor, int, int, wxObject*) overload for - more info. - - This overload will bind the given method as the event handler. - - @param eventType - The event type to be associated with this event handler. - @param method - The event handler method. This can be an arbitrary method (doesn't need - to be from a wxEvtHandler derived class). - @param handler - Object whose method should be called. It must always be specified - so it can be checked at compile time whether the given method is an - actual member of the given handler. - @param id - The first ID of the identifier range to be associated with the event - handler. - @param lastId - The last ID of the identifier range to be associated with the event - handler. - @param userData - Data to be associated with the event table entry. - - @see @ref overview_cpp_rtti_disabled - - @since 2.9.0 - */ - template - void Bind(const EventTag &eventType, - void (Class::*method)(EventArg &), - EventHandler *handler, - int id = wxID_ANY, - int lastId = wxID_ANY, - wxObject *userData = NULL); - /** - Unbinds the given function, functor or method dynamically from the - event handler, using the specified parameters as search criteria and - returning @true if a matching function has been found and removed. - - This method can only unbind functions, functors or methods which have - been added using the Bind<>() method. There is no way to unbind - functions bound using the (static) event tables. - - @param eventType - The event type associated with this event handler. - @param functor - The event handler functor. This can be an ordinary function but also - an arbitrary functor like boost::function<>. - @param id - The first ID of the identifier range associated with the event - handler. - @param lastId - The last ID of the identifier range associated with the event - handler. - @param userData - Data associated with the event table entry. - - @see @ref overview_cpp_rtti_disabled - - @since 2.9.0 - */ - template - bool Unbind(const EventTag& eventType, - Functor functor, - int id = wxID_ANY, - int lastId = wxID_ANY, - wxObject *userData = NULL); - - /** - See the Unbind<>(const EventTag&, Functor, int, int, wxObject*) - overload for more info. - - This overload unbinds the given method from the event.. - - @param eventType - The event type associated with this event handler. - @param method - The event handler method associated with this event. - @param handler - Object whose method was called. - @param id - The first ID of the identifier range associated with the event - handler. - @param lastId - The last ID of the identifier range associated with the event - handler. - @param userData - Data associated with the event table entry. - - @see @ref overview_cpp_rtti_disabled - - @since 2.9.0 - */ - template - bool Unbind(const EventTag &eventType, - void (Class::*method)(EventArg&), - EventHandler *handler, - int id = wxID_ANY, - int lastId = wxID_ANY, - wxObject *userData = NULL ); - //@} - /** - @name User-supplied data - */ - //@{ - - /** - Returns user-supplied client data. - - @remarks Normally, any extra data the programmer wishes to associate with - the object should be made available by deriving a new class with - new data members. - - @see SetClientData() - */ - void* GetClientData() const; - - /** - Returns a pointer to the user-supplied client data object. - - @see SetClientObject(), wxClientData - */ - wxClientData* GetClientObject() const; - - /** - Sets user-supplied client data. - - @param data - Data to be associated with the event handler. - - @remarks Normally, any extra data the programmer wishes to associate - with the object should be made available by deriving a new - class with new data members. You must not call this method - and SetClientObject on the same class - only one of them. - - @see GetClientData() - */ - void SetClientData(void* data); - - /** - Set the client data object. Any previous object will be deleted. - - @see GetClientObject(), wxClientData - */ - void SetClientObject(wxClientData* data); - - //@} - - - /** - @name Event handler chaining - - wxEvtHandler can be arranged in a double-linked list of handlers - which is automatically iterated by ProcessEvent() if needed. - */ - //@{ - - /** - Returns @true if the event handler is enabled, @false otherwise. - - @see SetEvtHandlerEnabled() - */ - bool GetEvtHandlerEnabled() const; - - /** - Returns the pointer to the next handler in the chain. - - @see SetNextHandler(), GetPreviousHandler(), SetPreviousHandler(), - wxWindow::PushEventHandler, wxWindow::PopEventHandler - */ - wxEvtHandler* GetNextHandler() const; - - /** - Returns the pointer to the previous handler in the chain. - - @see SetPreviousHandler(), GetNextHandler(), SetNextHandler(), - wxWindow::PushEventHandler, wxWindow::PopEventHandler - */ - wxEvtHandler* GetPreviousHandler() const; - - /** - Enables or disables the event handler. - - @param enabled - @true if the event handler is to be enabled, @false if it is to be disabled. - - @remarks You can use this function to avoid having to remove the event - handler from the chain, for example when implementing a - dialog editor and changing from edit to test mode. - - @see GetEvtHandlerEnabled() - */ - void SetEvtHandlerEnabled(bool enabled); - - /** - Sets the pointer to the next handler. - - @remarks - See ProcessEvent() for more info about how the chains of event handlers - are internally used. - Also remember that wxEvtHandler uses double-linked lists and thus if you - use this function, you should also call SetPreviousHandler() on the - argument passed to this function: - @code - handlerA->SetNextHandler(handlerB); - handlerB->SetPreviousHandler(handlerA); - @endcode - - @param handler - The event handler to be set as the next handler. - Cannot be @NULL. - - @see @ref overview_events_processing - */ - virtual void SetNextHandler(wxEvtHandler* handler); - - /** - Sets the pointer to the previous handler. - All remarks about SetNextHandler() apply to this function as well. - - @param handler - The event handler to be set as the previous handler. - Cannot be @NULL. - - @see @ref overview_events_processing - */ - virtual void SetPreviousHandler(wxEvtHandler* handler); - - /** - Unlinks this event handler from the chain it's part of (if any); - then links the "previous" event handler to the "next" one - (so that the chain won't be interrupted). - - E.g. if before calling Unlink() you have the following chain: - @image html evthandler_unlink_before.png - then after calling @c B->Unlink() you'll have: - @image html evthandler_unlink_after.png - - @since 2.9.0 - */ - void Unlink(); - - /** - Returns @true if the next and the previous handler pointers of this - event handler instance are @NULL. - - @since 2.9.0 - - @see SetPreviousHandler(), SetNextHandler() - */ - bool IsUnlinked() const; - - //@} - - /** - @name Global event filters. - - Methods for working with the global list of event filters. - - Event filters can be defined to pre-process all the events that happen - in an application, see wxEventFilter documentation for more information. - */ - //@{ - - /** - Add an event filter whose FilterEvent() method will be called for each - and every event processed by wxWidgets. - - The filters are called in LIFO order and wxApp is registered as an - event filter by default. The pointer must remain valid until it's - removed with RemoveFilter() and is not deleted by wxEvtHandler. - - @since 2.9.3 - */ - static void AddFilter(wxEventFilter* filter); - - /** - Remove a filter previously installed with AddFilter(). - - It's an error to remove a filter that hadn't been previously added or - was already removed. - - @since 2.9.3 - */ - static void RemoveFilter(wxEventFilter* filter); - - //@} - -protected: - /** - Method called by ProcessEvent() before examining this object event - tables. - - This method can be overridden to hook into the event processing logic - as early as possible. You should usually call the base class version - when overriding this method, even if wxEvtHandler itself does nothing - here, some derived classes do use this method, e.g. wxWindow implements - support for wxValidator in it. - - Example: - @code - class MyClass : public BaseClass // inheriting from wxEvtHandler - { - ... - protected: - virtual bool TryBefore(wxEvent& event) - { - if ( MyPreProcess(event) ) - return true; - - return BaseClass::TryBefore(event); - } - }; - @endcode - - @see ProcessEvent() - */ - virtual bool TryBefore(wxEvent& event); - - /** - Method called by ProcessEvent() as last resort. - - This method can be overridden to implement post-processing for the - events which were not processed anywhere else. - - The base class version handles forwarding the unprocessed events to - wxApp at wxEvtHandler level and propagating them upwards the window - child-parent chain at wxWindow level and so should usually be called - when overriding this method: - @code - class MyClass : public BaseClass // inheriting from wxEvtHandler - { - ... - protected: - virtual bool TryAfter(wxEvent& event) - { - if ( BaseClass::TryAfter(event) ) - return true; - - return MyPostProcess(event); - } - }; - @endcode - - @see ProcessEvent() - */ - virtual bool TryAfter(wxEvent& event); -}; - - /** Flags for categories of keys. @@ -3469,132 +2376,6 @@ public: void SetPosition(int pos); }; -/** - See wxIdleEvent::SetMode() for more info. -*/ -enum wxIdleMode -{ - /** Send idle events to all windows */ - wxIDLE_PROCESS_ALL, - - /** Send idle events to windows that have the wxWS_EX_PROCESS_IDLE flag specified */ - wxIDLE_PROCESS_SPECIFIED -}; - - -/** - @class wxIdleEvent - - This class is used for idle events, which are generated when the system becomes - idle. Note that, unless you do something specifically, the idle events are not - sent if the system remains idle once it has become it, e.g. only a single idle - event will be generated until something else resulting in more normal events - happens and only then is the next idle event sent again. - - If you need to ensure a continuous stream of idle events, you can either use - wxIdleEvent::RequestMore method in your handler or call wxWakeUpIdle() periodically - (for example from a timer event handler), but note that both of these approaches - (and especially the first one) increase the system load and so should be avoided - if possible. - - By default, idle events are sent to all windows, including even the hidden - ones because they may be shown if some condition is met from their @c - wxEVT_IDLE (or related @c wxEVT_UPDATE_UI) handler. The children of hidden - windows do not receive idle events however as they can't change their state - in any way noticeable by the user. Finally, the global wxApp object also - receives these events, as usual, so it can be used for any global idle time - processing. - - If sending idle events to all windows is causing a significant overhead in - your application, you can call wxIdleEvent::SetMode with the value - wxIDLE_PROCESS_SPECIFIED, and set the wxWS_EX_PROCESS_IDLE extra window - style for every window which should receive idle events, all the other ones - will not receive them in this case. - - @beginEventTable{wxIdleEvent} - @event{EVT_IDLE(func)} - Process a @c wxEVT_IDLE event. - @endEventTable - - @library{wxbase} - @category{events} - - @section sec_delayed_action Delayed Action Mechanism - - wxIdleEvent can be used to perform some action "at slightly later time". - This can be necessary in several circumstances when, for whatever reason, - something can't be done in the current event handler. For example, if a - mouse event handler is called with the mouse button pressed, the mouse can - be currently captured and some operations with it -- notably capturing it - again -- might be impossible or lead to undesirable results. If you still - want to capture it, you can do it from @c wxEVT_IDLE handler when it is - called the next time instead of doing it immediately. - - This can be achieved in two different ways: when using static event tables, - you will need a flag indicating to the (always connected) idle event - handler whether the desired action should be performed. The originally - called handler would then set it to indicate that it should indeed be done - and the idle handler itself would reset it to prevent it from doing the - same action again. - - Using dynamically connected event handlers things are even simpler as the - original event handler can simply wxEvtHandler::Connect() or - wxEvtHandler::Bind() the idle event handler which would only be executed - then and could wxEvtHandler::Disconnect() or wxEvtHandler::Unbind() itself. - - - @see @ref overview_events, wxUpdateUIEvent, wxWindow::OnInternalIdle -*/ -class wxIdleEvent : public wxEvent -{ -public: - /** - Constructor. - */ - wxIdleEvent(); - - /** - Static function returning a value specifying how wxWidgets will send idle - events: to all windows, or only to those which specify that they - will process the events. - - @see SetMode(). - */ - static wxIdleMode GetMode(); - - /** - Returns @true if the OnIdle function processing this event requested more - processing time. - - @see RequestMore() - */ - bool MoreRequested() const; - - /** - Tells wxWidgets that more processing is required. - - This function can be called by an OnIdle handler for a window or window event - handler to indicate that wxApp::OnIdle should forward the OnIdle event once - more to the application windows. - - If no window calls this function during OnIdle, then the application will - remain in a passive event loop (not calling OnIdle) until a new event is - posted to the application by the windowing system. - - @see MoreRequested() - */ - void RequestMore(bool needMore = true); - - /** - Static function for specifying how wxWidgets will send idle events: to - all windows, or only to those which specify that they will process the events. - - @param mode - Can be one of the ::wxIdleMode values. - The default is wxIDLE_PROCESS_ALL. - */ - static void SetMode(wxIdleMode mode); -}; @@ -4233,218 +3014,6 @@ public: /** @addtogroup group_funcmacro_events */ //@{ -/** - A value uniquely identifying the type of the event. - - The values of this type should only be created using wxNewEventType(). - - See the macro DEFINE_EVENT_TYPE() for more info. - - @see @ref overview_events_introduction -*/ -typedef int wxEventType; - -/** - A special event type usually used to indicate that some wxEvent has yet - no type assigned. -*/ -wxEventType wxEVT_NULL; - -wxEventType wxEVT_ANY; - -/** - Generates a new unique event type. - - Usually this function is only used by wxDEFINE_EVENT() and not called - directly. -*/ -wxEventType wxNewEventType(); - -/** - Define a new event type associated with the specified event class. - - This macro defines a new unique event type @a name associated with the - event class @a cls. - - For example: - @code - wxDEFINE_EVENT(MY_COMMAND_EVENT, wxCommandEvent); - - class MyCustomEvent : public wxEvent { ... }; - wxDEFINE_EVENT(MY_CUSTOM_EVENT, MyCustomEvent); - @endcode - - @see wxDECLARE_EVENT(), @ref overview_events_custom - */ -#define wxDEFINE_EVENT(name, cls) \ - const wxEventTypeTag< cls > name(wxNewEventType()) - -/** - Declares a custom event type. - - This macro declares a variable called @a name which must be defined - elsewhere using wxDEFINE_EVENT(). - - The class @a cls must be the wxEvent-derived class associated with the - events of this type and its full declaration must be visible from the point - of use of this macro. - - For example: - @code - wxDECLARE_EVENT(MY_COMMAND_EVENT, wxCommandEvent); - - class MyCustomEvent : public wxEvent { ... }; - wxDECLARE_EVENT(MY_CUSTOM_EVENT, MyCustomEvent); - @endcode - */ -#define wxDECLARE_EVENT(name, cls) \ - wxDECLARE_EXPORTED_EVENT(wxEMPTY_PARAMETER_VALUE, name, cls) - -/** - Variant of wxDECLARE_EVENT() used for event types defined inside a shared - library. - - This is mostly used by wxWidgets internally, e.g. - @code - wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEvent) - @endcode - */ -#define wxDECLARE_EXPORTED_EVENT( expdecl, name, cls ) \ - extern const expdecl wxEventTypeTag< cls > name; - -/** - Helper macro for definition of custom event table macros. - - This macro must only be used if wxEVENTS_COMPATIBILITY_2_8 is 1, otherwise - it is better and more clear to just use the address of the function - directly as this is all this macro does in this case. However it needs to - explicitly cast @a func to @a functype, which is the type of wxEvtHandler - member function taking the custom event argument when - wxEVENTS_COMPATIBILITY_2_8 is 0. - - See wx__DECLARE_EVT0 for an example of use. - - @see @ref overview_events_custom_ownclass - */ -#define wxEVENT_HANDLER_CAST(functype, func) (&func) - -/** - This macro is used to define event table macros for handling custom - events. - - Example of use: - @code - class MyEvent : public wxEvent { ... }; - - // note that this is not necessary unless using old compilers: for the - // reasonably new ones just use &func instead of MyEventHandler(func) - typedef void (wxEvtHandler::*MyEventFunction)(MyEvent&); - #define MyEventHandler(func) wxEVENT_HANDLER_CAST(MyEventFunction, func) - - wxDEFINE_EVENT(MY_EVENT_TYPE, MyEvent); - - #define EVT_MY(id, func) \ - wx__DECLARE_EVT1(MY_EVENT_TYPE, id, MyEventHandler(func)) - - ... - - wxBEGIN_EVENT_TABLE(MyFrame, wxFrame) - EVT_MY(wxID_ANY, MyFrame::OnMyEvent) - wxEND_EVENT_TABLE() - @endcode - - @param evt - The event type to handle. - @param id - The identifier of events to handle. - @param fn - The event handler method. - */ -#define wx__DECLARE_EVT1(evt, id, fn) \ - wx__DECLARE_EVT2(evt, id, wxID_ANY, fn) - -/** - Generalized version of the wx__DECLARE_EVT1() macro taking a range of - IDs instead of a single one. - Argument @a id1 is the first identifier of the range, @a id2 is the - second identifier of the range. -*/ -#define wx__DECLARE_EVT2(evt, id1, id2, fn) \ - DECLARE_EVENT_TABLE_ENTRY(evt, id1, id2, fn, NULL), - -/** - Simplified version of the wx__DECLARE_EVT1() macro, to be used when the - event type must be handled regardless of the ID associated with the - specific event instances. -*/ -#define wx__DECLARE_EVT0(evt, fn) \ - wx__DECLARE_EVT1(evt, wxID_ANY, fn) - -/** - Use this macro inside a class declaration to declare a @e static event table - for that class. - - In the implementation file you'll need to use the wxBEGIN_EVENT_TABLE() - and the wxEND_EVENT_TABLE() macros, plus some additional @c EVT_xxx macro - to capture events. - - Note that this macro requires a final semicolon. - - @see @ref overview_events_eventtables -*/ -#define wxDECLARE_EVENT_TABLE() - -/** - Use this macro in a source file to start listing @e static event handlers - for a specific class. - - Use wxEND_EVENT_TABLE() to terminate the event-declaration block. - - @see @ref overview_events_eventtables -*/ -#define wxBEGIN_EVENT_TABLE(theClass, baseClass) - -/** - Use this macro in a source file to end listing @e static event handlers - for a specific class. - - Use wxBEGIN_EVENT_TABLE() to start the event-declaration block. - - @see @ref overview_events_eventtables -*/ -#define wxEND_EVENT_TABLE() - -/** - In a GUI application, this function posts @a event to the specified @e dest - object using wxEvtHandler::AddPendingEvent(). - - Otherwise, it dispatches @a event immediately using - wxEvtHandler::ProcessEvent(). See the respective documentation for details - (and caveats). Because of limitation of wxEvtHandler::AddPendingEvent() - this function is not thread-safe for event objects having wxString fields, - use wxQueueEvent() instead. - - @header{wx/event.h} -*/ -void wxPostEvent(wxEvtHandler* dest, const wxEvent& event); - -/** - Queue an event for processing on the given object. - - This is a wrapper around wxEvtHandler::QueueEvent(), see its documentation - for more details. - - @header{wx/event.h} - - @param dest - The object to queue the event on, can't be @c NULL. - @param event - The heap-allocated and non-@c NULL event to queue, the function takes - ownership of it. - */ -void wxQueueEvent(wxEvtHandler* dest, wxEvent *event); - - wxEventType wxEVT_COMMAND_BUTTON_CLICKED; wxEventType wxEVT_COMMAND_CHECKBOX_CLICKED;