moved all event handlers callign code in ProcessEventIfMatches() instead of triplicating it

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@23649 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2003-09-17 23:35:36 +00:00
parent 8c7f5f031b
commit 1c62463166
2 changed files with 135 additions and 135 deletions

View File

@@ -14,7 +14,7 @@
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) && !defined(__EMX__) #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) && !defined(__EMX__)
// Some older compilers (such as EMX) cannot handle // Some older compilers (such as EMX) cannot handle
// #pragma interface/implementation correctly, iff // #pragma interface/implementation correctly, iff
// #pragma implementation is used in _two_ translation // #pragma implementation is used in _two_ translation
// units (as created by e.g. event.cpp compiled for // units (as created by e.g. event.cpp compiled for
// libwx_base and event.cpp compiled for libwx_gui_core). // libwx_base and event.cpp compiled for libwx_gui_core).
@@ -396,7 +396,7 @@ protected:
public: public:
bool m_skipped; bool m_skipped;
bool m_isCommandEvent; bool m_isCommandEvent;
private: private:
// it needs to access our m_propagationLevel // it needs to access our m_propagationLevel
friend class WXDLLIMPEXP_BASE wxPropagateOnce; friend class WXDLLIMPEXP_BASE wxPropagateOnce;
@@ -2068,7 +2068,7 @@ struct WXDLLIMPEXP_BASE wxDynamicEventTableEntry : public wxEventTableEntryBase
int m_eventType; int m_eventType;
// Pointer to object whose function is fn - so we don't assume the // Pointer to object whose function is fn - so we don't assume the
// EventFunction is always a member of the EventHandler receiving the // EventFunction is always a member of the EventHandler receiving the
// message // message
wxEvtHandler* m_eventSink; wxEvtHandler* m_eventSink;
@@ -2107,14 +2107,14 @@ private:
public: public:
// Constructor, needs the event table it needs to hash later on. // 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 // 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 // can be that the event table is not yet full initialize, the hash
// will gets initialized when handling the first event look-up request. // will gets initialized when handling the first event look-up request.
wxEventHashTable(const wxEventTable &table); wxEventHashTable(const wxEventTable &table);
// Destructor. // Destructor.
~wxEventHashTable(); ~wxEventHashTable();
// Handle the given event, in other words search the event table hash // Handle the given event, in other words search the event table hash
// and call self->ProcessEvent() if a match was found. // and call self->ProcessEvent() if a match was found.
bool HandleEvent(wxEvent &event, wxEvtHandler *self); bool HandleEvent(wxEvent &event, wxEvtHandler *self);
@@ -2125,7 +2125,7 @@ protected:
void AddEntry(const wxEventTableEntry &entry); void AddEntry(const wxEventTableEntry &entry);
// Allocate and init with null pointers the base hash table. // Allocate and init with null pointers the base hash table.
void AllocEventTypeTable(size_t size); void AllocEventTypeTable(size_t size);
// Grow the hash table in size and transfer all items currently // Grow the hash table in size and transfer all items currently
// in the table to the correct location in the new table. // in the table to the correct location in the new table.
void GrowEventTypeTable(); void GrowEventTypeTable();
@@ -2206,20 +2206,22 @@ public:
void SetClientData( void *data ) { DoSetClientData(data); } void SetClientData( void *data ) { DoSetClientData(data); }
void *GetClientData() const { return DoGetClientData(); } void *GetClientData() const { return DoGetClientData(); }
// check if the given event table entry matches this event and call the
// handler if it does
//
// return true if the event was processed, false otherwise (no match or the
// handler decided to skip the event)
static bool ProcessEventIfMatches(const wxEventTableEntryBase& tableEntry,
wxEvtHandler *handler,
wxEvent& event);
// implementation from now on // implementation from now on
virtual bool SearchEventTable(wxEventTable& table, wxEvent& event); virtual bool SearchEventTable(wxEventTable& table, wxEvent& event);
bool SearchDynamicEventTable( wxEvent& event ); bool SearchDynamicEventTable( wxEvent& event );
#if wxUSE_THREADS #if wxUSE_THREADS
void ClearEventLocker() void ClearEventLocker();
{ #endif // wxUSE_THREADS
# if !defined(__VISAGECPP__)
delete m_eventsLocker;
m_eventsLocker = NULL;
#endif
};
#endif
private: private:
static const wxEventTableEntry sm_eventTableEntries[]; static const wxEventTableEntry sm_eventTableEntries[];
@@ -2230,7 +2232,7 @@ protected:
// This one is called before trying our own event table to allow plugging // This one is called before trying our own event table to allow plugging
// in the validators. // in the validators.
// //
// NB: This method is intentionally *not* inside wxUSE_VALIDATORS! // NB: This method is intentionally *not* inside wxUSE_VALIDATORS!
// It is part of wxBase which doesn't use validators and the code // 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 // is compiled out when building wxBase w/o GUI classes, which affects
@@ -2245,7 +2247,7 @@ 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; static wxEventHashTable sm_eventHashTable;

View File

@@ -19,7 +19,7 @@
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) && !defined(__EMX__) #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) && !defined(__EMX__)
// Some older compilers (such as EMX) cannot handle // Some older compilers (such as EMX) cannot handle
// #pragma interface/implementation correctly, iff // #pragma interface/implementation correctly, iff
// #pragma implementation is used in _two_ translation // #pragma implementation is used in _two_ translation
// units (as created by e.g. event.cpp compiled for // units (as created by e.g. event.cpp compiled for
// libwx_base and event.cpp compiled for libwx_gui_core). // libwx_base and event.cpp compiled for libwx_gui_core).
@@ -333,9 +333,9 @@ wxEvent::wxEvent(int theId, wxEventType commandType )
m_eventObject = (wxObject *) NULL; m_eventObject = (wxObject *) NULL;
m_timeStamp = 0; m_timeStamp = 0;
m_id = theId; m_id = theId;
m_skipped = FALSE; m_skipped = false;
m_callbackUserData = (wxObject *) NULL; m_callbackUserData = (wxObject *) NULL;
m_isCommandEvent = FALSE; m_isCommandEvent = false;
m_propagationLevel = wxEVENT_PROPAGATE_NONE; m_propagationLevel = wxEVENT_PROPAGATE_NONE;
} }
@@ -368,7 +368,7 @@ wxCommandEvent::wxCommandEvent(wxEventType commandType, int theId)
m_clientObject = (wxClientData *) NULL; m_clientObject = (wxClientData *) NULL;
m_extraLong = 0; m_extraLong = 0;
m_commandInt = 0; m_commandInt = 0;
m_isCommandEvent = TRUE; m_isCommandEvent = true;
// the command events are propagated upwards by default // the command events are propagated upwards by default
m_propagationLevel = wxEVENT_PROPAGATE_MAX; m_propagationLevel = wxEVENT_PROPAGATE_MAX;
@@ -394,27 +394,27 @@ bool wxUpdateUIEvent::CanUpdate(wxWindowBase *win)
if (win && if (win &&
(GetMode() == wxUPDATE_UI_PROCESS_SPECIFIED && (GetMode() == wxUPDATE_UI_PROCESS_SPECIFIED &&
((win->GetExtraStyle() & wxWS_EX_PROCESS_UI_UPDATES) == 0))) ((win->GetExtraStyle() & wxWS_EX_PROCESS_UI_UPDATES) == 0)))
return FALSE; return false;
if (sm_updateInterval == -1) if (sm_updateInterval == -1)
return FALSE; return false;
else if (sm_updateInterval == 0) else if (sm_updateInterval == 0)
return TRUE; return true;
else else
{ {
#if wxUSE_STOPWATCH && wxUSE_LONGLONG #if wxUSE_STOPWATCH && wxUSE_LONGLONG
wxLongLong now = wxGetLocalTimeMillis(); wxLongLong now = wxGetLocalTimeMillis();
if (now > (sm_lastUpdate + sm_updateInterval)) if (now > (sm_lastUpdate + sm_updateInterval))
{ {
return TRUE; return true;
} }
#else #else
// If we don't have wxStopWatch or wxLongLong, we // If we don't have wxStopWatch or wxLongLong, we
// should err on the safe side and update now anyway. // should err on the safe side and update now anyway.
return TRUE; return true;
#endif #endif
} }
return FALSE; return false;
} }
// Reset the update time to provide a delay until the next // Reset the update time to provide a delay until the next
@@ -447,9 +447,9 @@ bool wxIdleEvent::CanSend(wxWindow* win)
if (win && if (win &&
(GetMode() == wxIDLE_PROCESS_SPECIFIED && (GetMode() == wxIDLE_PROCESS_SPECIFIED &&
((win->GetExtraStyle() & wxWS_EX_PROCESS_IDLE) == 0))) ((win->GetExtraStyle() & wxWS_EX_PROCESS_IDLE) == 0)))
return FALSE; return false;
return TRUE; return true;
} }
/* /*
@@ -487,13 +487,13 @@ wxScrollWinEvent::wxScrollWinEvent(wxEventType commandType,
wxMouseEvent::wxMouseEvent(wxEventType commandType) wxMouseEvent::wxMouseEvent(wxEventType commandType)
{ {
m_eventType = commandType; m_eventType = commandType;
m_metaDown = FALSE; m_metaDown = false;
m_altDown = FALSE; m_altDown = false;
m_controlDown = FALSE; m_controlDown = false;
m_shiftDown = FALSE; m_shiftDown = false;
m_leftDown = FALSE; m_leftDown = false;
m_rightDown = FALSE; m_rightDown = false;
m_middleDown = FALSE; m_middleDown = false;
m_x = 0; m_x = 0;
m_y = 0; m_y = 0;
m_wheelRotation = 0; m_wheelRotation = 0;
@@ -540,7 +540,7 @@ bool wxMouseEvent::ButtonDClick(int but) const
wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::ButtonDClick")); wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::ButtonDClick"));
} }
return FALSE; return false;
} }
// True if was a button down event (1 = left, 2 = middle, 3 = right) // True if was a button down event (1 = left, 2 = middle, 3 = right)
@@ -561,7 +561,7 @@ bool wxMouseEvent::ButtonDown(int but) const
wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::ButtonDown")); wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::ButtonDown"));
} }
return FALSE; return false;
} }
// True if was a button up event (1 = left, 2 = middle, 3 = right) // True if was a button up event (1 = left, 2 = middle, 3 = right)
@@ -582,7 +582,7 @@ bool wxMouseEvent::ButtonUp(int but) const
wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::ButtonUp")); wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::ButtonUp"));
} }
return FALSE; return false;
} }
// True if the given button is currently changing state // True if the given button is currently changing state
@@ -602,7 +602,7 @@ bool wxMouseEvent::Button(int but) const
wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::Button")); wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::Button"));
} }
return FALSE; return false;
} }
bool wxMouseEvent::ButtonIsDown(int but) const bool wxMouseEvent::ButtonIsDown(int but) const
@@ -621,7 +621,7 @@ bool wxMouseEvent::ButtonIsDown(int but) const
wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::ButtonIsDown")); wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::ButtonIsDown"));
} }
return FALSE; return false;
} }
int wxMouseEvent::GetButton() const int wxMouseEvent::GetButton() const
@@ -653,10 +653,10 @@ wxPoint wxMouseEvent::GetLogicalPosition(const wxDC& dc) const
wxKeyEvent::wxKeyEvent(wxEventType type) wxKeyEvent::wxKeyEvent(wxEventType type)
{ {
m_eventType = type; m_eventType = type;
m_shiftDown = FALSE; m_shiftDown = false;
m_controlDown = FALSE; m_controlDown = false;
m_metaDown = FALSE; m_metaDown = false;
m_altDown = FALSE; m_altDown = false;
m_keyCode = 0; m_keyCode = 0;
m_scanCode = 0; m_scanCode = 0;
#if wxUSE_UNICODE #if wxUSE_UNICODE
@@ -721,7 +721,7 @@ static const int EVENT_TYPE_TABLE_INIT_SIZE = 31; // Not to big not to small...
wxEventHashTable::wxEventHashTable(const wxEventTable &table) wxEventHashTable::wxEventHashTable(const wxEventTable &table)
: m_table(table), : m_table(table),
m_rebuildHash(TRUE) m_rebuildHash(true)
{ {
AllocEventTypeTable(EVENT_TYPE_TABLE_INIT_SIZE); AllocEventTypeTable(EVENT_TYPE_TABLE_INIT_SIZE);
} }
@@ -746,7 +746,7 @@ bool wxEventHashTable::HandleEvent(wxEvent &event, wxEvtHandler *self)
if (m_rebuildHash) if (m_rebuildHash)
{ {
InitHashTable(); InitHashTable();
m_rebuildHash = FALSE; m_rebuildHash = false;
} }
// Find all entries for the given event type. // Find all entries for the given event type.
@@ -756,36 +756,21 @@ bool wxEventHashTable::HandleEvent(wxEvent &event, wxEvtHandler *self)
{ {
// Now start the search for an event handler // Now start the search for an event handler
// that can handle an event with the given ID. // that can handle an event with the given ID.
int eventId = event.GetId(); const wxEventTableEntryPointerArray&
const wxEventTableEntryPointerArray &eventEntryTable = eTTnode->eventEntryTable; eventEntryTable = eTTnode->eventEntryTable;
size_t n; const size_t count = eventEntryTable.GetCount();
size_t count = eventEntryTable.GetCount(); for (size_t n = 0; n < count; n++)
for (n = 0; n < count; n++)
{ {
const wxEventTableEntry* entry = eventEntryTable[n]; if ( wxEvtHandler::
int tableId1 = entry->m_id, ProcessEventIfMatches(*eventEntryTable[n], self, event) )
tableId2 = entry->m_lastId;
if ((tableId1 == -1) ||
(tableId2 == -1 && tableId1 == eventId) ||
(tableId2 != -1 &&
(eventId >= tableId1 && eventId <= tableId2)))
{ {
event.Skip(FALSE); return true;
event.m_callbackUserData = entry->m_callbackUserData;
(self->*((wxEventFunction) (entry->m_fn)))(event);
if (!event.GetSkipped())
return TRUE;
} }
} }
return FALSE;
} }
return FALSE; return false;
} }
void wxEventHashTable::InitHashTable() void wxEventHashTable::InitHashTable()
@@ -901,7 +886,7 @@ wxEvtHandler::wxEvtHandler()
{ {
m_nextHandler = (wxEvtHandler *) NULL; m_nextHandler = (wxEvtHandler *) NULL;
m_previousHandler = (wxEvtHandler *) NULL; m_previousHandler = (wxEvtHandler *) NULL;
m_enabled = TRUE; m_enabled = true;
m_dynamicEvents = (wxList *) NULL; m_dynamicEvents = (wxList *) NULL;
m_pendingEvents = (wxList *) NULL; m_pendingEvents = (wxList *) NULL;
#if wxUSE_THREADS #if wxUSE_THREADS
@@ -974,9 +959,17 @@ bool wxEvtHandler::ProcessThreadEvent(wxEvent& event)
AddPendingEvent(event); AddPendingEvent(event);
return TRUE; return true;
} }
void wxEvtHandler::ClearEventLocker()
{
#if !defined(__VISAGECPP__)
delete m_eventsLocker;
m_eventsLocker = NULL;
#endif
};
#endif // wxUSE_THREADS #endif // wxUSE_THREADS
void wxEvtHandler::AddPendingEvent(wxEvent& event) void wxEvtHandler::AddPendingEvent(wxEvent& event)
@@ -1065,6 +1058,48 @@ void wxEvtHandler::ProcessPendingEvents()
/* /*
* Event table stuff * Event table stuff
*/ */
/* static */ bool
wxEvtHandler::ProcessEventIfMatches(const wxEventTableEntryBase& entry,
wxEvtHandler *handler,
wxEvent& event)
{
int tableId1 = entry.m_id,
tableId2 = entry.m_lastId;
// match only if the event type is the same and the id is either -1 in
// the event table (meaning "any") or the event id matches the id
// specified in the event table either exactly or by falling into
// range between first and last
if ((tableId1 == -1) ||
(tableId2 == -1 && tableId1 == event.GetId()) ||
(tableId2 != -1 &&
(event.GetId() >= tableId1 && event.GetId() <= tableId2)))
{
event.Skip(false);
event.m_callbackUserData = entry.m_callbackUserData;
#if wxUSE_EXCEPTIONS
if ( wxTheApp )
{
// call the handler via wxApp method which allows the user to catch
// any exceptions which may be thrown by any handler in the program
// in one place
wxTheApp->HandleEvent(handler, (wxEventFunction)entry.m_fn, event);
}
else
#else // !wxUSE_EXCEPTIONS
{
// no need for an extra virtual function call
(handler->*((wxEventFunction) (entry.m_fn)))(event);
}
#endif // wxUSE_EXCEPTIONS
if (!event.GetSkipped())
return true;
}
return false;
}
bool wxEvtHandler::TryParent(wxEvent& event) bool wxEvtHandler::TryParent(wxEvent& event)
{ {
@@ -1076,11 +1111,11 @@ bool wxEvtHandler::TryParent(wxEvent& event)
if ( event.GetEventType() != wxEVT_IDLE ) if ( event.GetEventType() != wxEVT_IDLE )
{ {
if ( wxTheApp->ProcessEvent(event) ) if ( wxTheApp->ProcessEvent(event) )
return TRUE; return true;
} }
} }
return FALSE; return false;
} }
bool wxEvtHandler::ProcessEvent(wxEvent& event) bool wxEvtHandler::ProcessEvent(wxEvent& event)
@@ -1105,22 +1140,22 @@ bool wxEvtHandler::ProcessEvent(wxEvent& event)
// if we have a validator, it has higher priority than our own event // if we have a validator, it has higher priority than our own event
// table // table
if ( TryValidator(event) ) if ( TryValidator(event) )
return TRUE; return true;
// Handle per-instance dynamic event tables first // Handle per-instance dynamic event tables first
if ( m_dynamicEvents && SearchDynamicEventTable(event) ) if ( m_dynamicEvents && SearchDynamicEventTable(event) )
return TRUE; return true;
// Then static per-class event tables // Then static per-class event tables
if ( GetEventHashTable().HandleEvent(event, this) ) if ( GetEventHashTable().HandleEvent(event, this) )
return TRUE; return true;
} }
// Try going down the event handler chain // Try going down the event handler chain
if ( GetNextHandler() ) if ( GetNextHandler() )
{ {
if ( GetNextHandler()->ProcessEvent(event) ) if ( GetNextHandler()->ProcessEvent(event) )
return TRUE; return true;
} }
// Finally propagate the event upwards the window chain and/or to the // Finally propagate the event upwards the window chain and/or to the
@@ -1131,46 +1166,18 @@ bool wxEvtHandler::ProcessEvent(wxEvent& event)
bool wxEvtHandler::SearchEventTable(wxEventTable& table, wxEvent& event) bool wxEvtHandler::SearchEventTable(wxEventTable& table, wxEvent& event)
{ {
wxEventType eventType = event.GetEventType(); const wxEventType eventType = event.GetEventType();
int eventId = event.GetId();
// BC++ doesn't like testing for m_fn without != 0
for ( int i = 0; table.entries[i].m_fn != 0; i++ ) for ( int i = 0; table.entries[i].m_fn != 0; i++ )
{ {
// the line using reference exposes a bug in gcc: although it _seems_
// to work, it leads to weird crashes later on during program
// execution
#ifdef __GNUG__
wxEventTableEntry entry = table.entries[i];
#else
const wxEventTableEntry& entry = table.entries[i]; const wxEventTableEntry& entry = table.entries[i];
#endif
// match only if the event type is the same and the id is either -1 in
// the event table (meaning "any") or the event id matches the id
// specified in the event table either exactly or by falling into
// range between first and last
if ( eventType == entry.m_eventType ) if ( eventType == entry.m_eventType )
{ {
int tableId1 = entry.m_id, if ( ProcessEventIfMatches(entry, this, event) )
tableId2 = entry.m_lastId; return true;
if ( (tableId1 == -1) ||
(tableId2 == -1 && eventId == tableId1) ||
(tableId2 != -1 &&
(eventId >= tableId1 && eventId <= tableId2)) )
{
event.Skip(FALSE);
event.m_callbackUserData = entry.m_callbackUserData;
(this->*((wxEventFunction) (entry.m_fn)))(event);
return !event.GetSkipped();
}
} }
} }
return FALSE; return false;
} }
void wxEvtHandler::Connect( int id, int lastId, void wxEvtHandler::Connect( int id, int lastId,
@@ -1204,7 +1211,7 @@ bool wxEvtHandler::Disconnect( int id, int lastId, wxEventType eventType,
wxEvtHandler* eventSink ) wxEvtHandler* eventSink )
{ {
if (!m_dynamicEvents) if (!m_dynamicEvents)
return FALSE; return false;
wxList::compatibility_iterator node = m_dynamicEvents->GetFirst(); wxList::compatibility_iterator node = m_dynamicEvents->GetFirst();
while (node) while (node)
@@ -1226,55 +1233,46 @@ bool wxEvtHandler::Disconnect( int id, int lastId, wxEventType eventType,
delete entry->m_callbackUserData; delete entry->m_callbackUserData;
m_dynamicEvents->Erase( node ); m_dynamicEvents->Erase( node );
delete entry; delete entry;
return TRUE; return true;
} }
node = node->GetNext(); node = node->GetNext();
} }
return FALSE; return false;
} }
bool wxEvtHandler::SearchDynamicEventTable( wxEvent& event ) bool wxEvtHandler::SearchDynamicEventTable( wxEvent& event )
{ {
wxCHECK_MSG( m_dynamicEvents, FALSE, wxCHECK_MSG( m_dynamicEvents, false,
wxT("caller should check that we have dynamic events") ); wxT("caller should check that we have dynamic events") );
int commandId = event.GetId();
wxList::compatibility_iterator node = m_dynamicEvents->GetFirst(); wxList::compatibility_iterator node = m_dynamicEvents->GetFirst();
while (node) while (node)
{ {
#if WXWIN_COMPATIBILITY_EVENT_TYPES #if WXWIN_COMPATIBILITY_EVENT_TYPES
wxEventTableEntry *entry = (wxEventTableEntry*)node->GetData(); wxEventTableEntry *entry = (wxEventTableEntry*)node->GetData();
#else // !WXWIN_COMPATIBILITY_EVENT_TYPES #else // !WXWIN_COMPATIBILITY_EVENT_TYPES
wxDynamicEventTableEntry *entry = (wxDynamicEventTableEntry*)node->GetData(); wxDynamicEventTableEntry *entry = (wxDynamicEventTableEntry*)node->GetData();
#endif // WXWIN_COMPATIBILITY_EVENT_TYPES/!WXWIN_COMPATIBILITY_EVENT_TYPES #endif // WXWIN_COMPATIBILITY_EVENT_TYPES/!WXWIN_COMPATIBILITY_EVENT_TYPES
if (entry->m_fn) if (entry->m_fn)
{ {
// Match, if event spec says any id will do (id == -1) wxEvtHandler *handler =
if ( (event.GetEventType() == entry->m_eventType) &&
(entry->m_id == -1 ||
(entry->m_lastId == -1 && commandId == entry->m_id) ||
(entry->m_lastId != -1 &&
(commandId >= entry->m_id && commandId <= entry->m_lastId))) )
{
event.Skip(FALSE);
event.m_callbackUserData = entry->m_callbackUserData;
#if !WXWIN_COMPATIBILITY_EVENT_TYPES #if !WXWIN_COMPATIBILITY_EVENT_TYPES
if (entry->m_eventSink) entry->m_eventSink ? entry->m_eventSink
((entry->m_eventSink)->*((wxEventFunction) (entry->m_fn)))(event); :
else
#endif #endif
(this->*((wxEventFunction) (entry->m_fn)))(event); this;
if ( ! event.GetSkipped() ) if ( ProcessEventIfMatches(*entry, handler, event) )
return TRUE; {
return true;
} }
} }
node = node->GetNext(); node = node->GetNext();
} }
return FALSE;
return false;
}; };
void wxEvtHandler::DoSetClientObject( wxClientData *data ) void wxEvtHandler::DoSetClientObject( wxClientData *data )