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:
@@ -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;
|
||||||
|
@@ -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 )
|
||||||
|
Reference in New Issue
Block a user