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

@@ -19,7 +19,7 @@
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) && !defined(__EMX__)
// 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
// units (as created by e.g. event.cpp compiled for
// 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_timeStamp = 0;
m_id = theId;
m_skipped = FALSE;
m_skipped = false;
m_callbackUserData = (wxObject *) NULL;
m_isCommandEvent = FALSE;
m_isCommandEvent = false;
m_propagationLevel = wxEVENT_PROPAGATE_NONE;
}
@@ -368,7 +368,7 @@ wxCommandEvent::wxCommandEvent(wxEventType commandType, int theId)
m_clientObject = (wxClientData *) NULL;
m_extraLong = 0;
m_commandInt = 0;
m_isCommandEvent = TRUE;
m_isCommandEvent = true;
// the command events are propagated upwards by default
m_propagationLevel = wxEVENT_PROPAGATE_MAX;
@@ -394,27 +394,27 @@ bool wxUpdateUIEvent::CanUpdate(wxWindowBase *win)
if (win &&
(GetMode() == wxUPDATE_UI_PROCESS_SPECIFIED &&
((win->GetExtraStyle() & wxWS_EX_PROCESS_UI_UPDATES) == 0)))
return FALSE;
return false;
if (sm_updateInterval == -1)
return FALSE;
return false;
else if (sm_updateInterval == 0)
return TRUE;
return true;
else
{
#if wxUSE_STOPWATCH && wxUSE_LONGLONG
wxLongLong now = wxGetLocalTimeMillis();
if (now > (sm_lastUpdate + sm_updateInterval))
{
return TRUE;
return true;
}
#else
// If we don't have wxStopWatch or wxLongLong, we
// should err on the safe side and update now anyway.
return TRUE;
return true;
#endif
}
return FALSE;
return false;
}
// Reset the update time to provide a delay until the next
@@ -447,9 +447,9 @@ bool wxIdleEvent::CanSend(wxWindow* win)
if (win &&
(GetMode() == wxIDLE_PROCESS_SPECIFIED &&
((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)
{
m_eventType = commandType;
m_metaDown = FALSE;
m_altDown = FALSE;
m_controlDown = FALSE;
m_shiftDown = FALSE;
m_leftDown = FALSE;
m_rightDown = FALSE;
m_middleDown = FALSE;
m_metaDown = false;
m_altDown = false;
m_controlDown = false;
m_shiftDown = false;
m_leftDown = false;
m_rightDown = false;
m_middleDown = false;
m_x = 0;
m_y = 0;
m_wheelRotation = 0;
@@ -540,7 +540,7 @@ bool wxMouseEvent::ButtonDClick(int but) const
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)
@@ -561,7 +561,7 @@ bool wxMouseEvent::ButtonDown(int but) const
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)
@@ -582,7 +582,7 @@ bool wxMouseEvent::ButtonUp(int but) const
wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::ButtonUp"));
}
return FALSE;
return false;
}
// 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"));
}
return FALSE;
return false;
}
bool wxMouseEvent::ButtonIsDown(int but) const
@@ -621,7 +621,7 @@ bool wxMouseEvent::ButtonIsDown(int but) const
wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::ButtonIsDown"));
}
return FALSE;
return false;
}
int wxMouseEvent::GetButton() const
@@ -653,10 +653,10 @@ wxPoint wxMouseEvent::GetLogicalPosition(const wxDC& dc) const
wxKeyEvent::wxKeyEvent(wxEventType type)
{
m_eventType = type;
m_shiftDown = FALSE;
m_controlDown = FALSE;
m_metaDown = FALSE;
m_altDown = FALSE;
m_shiftDown = false;
m_controlDown = false;
m_metaDown = false;
m_altDown = false;
m_keyCode = 0;
m_scanCode = 0;
#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)
: m_table(table),
m_rebuildHash(TRUE)
m_rebuildHash(true)
{
AllocEventTypeTable(EVENT_TYPE_TABLE_INIT_SIZE);
}
@@ -746,7 +746,7 @@ bool wxEventHashTable::HandleEvent(wxEvent &event, wxEvtHandler *self)
if (m_rebuildHash)
{
InitHashTable();
m_rebuildHash = FALSE;
m_rebuildHash = false;
}
// 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
// that can handle an event with the given ID.
int eventId = event.GetId();
const wxEventTableEntryPointerArray &eventEntryTable = eTTnode->eventEntryTable;
const wxEventTableEntryPointerArray&
eventEntryTable = eTTnode->eventEntryTable;
size_t n;
size_t count = eventEntryTable.GetCount();
for (n = 0; n < count; n++)
const size_t count = eventEntryTable.GetCount();
for (size_t n = 0; n < count; n++)
{
const wxEventTableEntry* entry = eventEntryTable[n];
int tableId1 = entry->m_id,
tableId2 = entry->m_lastId;
if ((tableId1 == -1) ||
(tableId2 == -1 && tableId1 == eventId) ||
(tableId2 != -1 &&
(eventId >= tableId1 && eventId <= tableId2)))
if ( wxEvtHandler::
ProcessEventIfMatches(*eventEntryTable[n], self, event) )
{
event.Skip(FALSE);
event.m_callbackUserData = entry->m_callbackUserData;
(self->*((wxEventFunction) (entry->m_fn)))(event);
if (!event.GetSkipped())
return TRUE;
return true;
}
}
return FALSE;
}
return FALSE;
return false;
}
void wxEventHashTable::InitHashTable()
@@ -901,7 +886,7 @@ wxEvtHandler::wxEvtHandler()
{
m_nextHandler = (wxEvtHandler *) NULL;
m_previousHandler = (wxEvtHandler *) NULL;
m_enabled = TRUE;
m_enabled = true;
m_dynamicEvents = (wxList *) NULL;
m_pendingEvents = (wxList *) NULL;
#if wxUSE_THREADS
@@ -974,9 +959,17 @@ bool wxEvtHandler::ProcessThreadEvent(wxEvent& event)
AddPendingEvent(event);
return TRUE;
return true;
}
void wxEvtHandler::ClearEventLocker()
{
#if !defined(__VISAGECPP__)
delete m_eventsLocker;
m_eventsLocker = NULL;
#endif
};
#endif // wxUSE_THREADS
void wxEvtHandler::AddPendingEvent(wxEvent& event)
@@ -1065,6 +1058,48 @@ void wxEvtHandler::ProcessPendingEvents()
/*
* 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)
{
@@ -1076,11 +1111,11 @@ bool wxEvtHandler::TryParent(wxEvent& event)
if ( event.GetEventType() != wxEVT_IDLE )
{
if ( wxTheApp->ProcessEvent(event) )
return TRUE;
return true;
}
}
return FALSE;
return false;
}
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
// table
if ( TryValidator(event) )
return TRUE;
return true;
// Handle per-instance dynamic event tables first
if ( m_dynamicEvents && SearchDynamicEventTable(event) )
return TRUE;
return true;
// Then static per-class event tables
if ( GetEventHashTable().HandleEvent(event, this) )
return TRUE;
return true;
}
// Try going down the event handler chain
if ( GetNextHandler() )
{
if ( GetNextHandler()->ProcessEvent(event) )
return TRUE;
return true;
}
// 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)
{
wxEventType eventType = event.GetEventType();
int eventId = event.GetId();
// BC++ doesn't like testing for m_fn without != 0
const wxEventType eventType = event.GetEventType();
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];
#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 )
{
int tableId1 = entry.m_id,
tableId2 = entry.m_lastId;
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();
}
if ( ProcessEventIfMatches(entry, this, event) )
return true;
}
}
return FALSE;
return false;
}
void wxEvtHandler::Connect( int id, int lastId,
@@ -1204,7 +1211,7 @@ bool wxEvtHandler::Disconnect( int id, int lastId, wxEventType eventType,
wxEvtHandler* eventSink )
{
if (!m_dynamicEvents)
return FALSE;
return false;
wxList::compatibility_iterator node = m_dynamicEvents->GetFirst();
while (node)
@@ -1226,55 +1233,46 @@ bool wxEvtHandler::Disconnect( int id, int lastId, wxEventType eventType,
delete entry->m_callbackUserData;
m_dynamicEvents->Erase( node );
delete entry;
return TRUE;
return true;
}
node = node->GetNext();
}
return FALSE;
return false;
}
bool wxEvtHandler::SearchDynamicEventTable( wxEvent& event )
{
wxCHECK_MSG( m_dynamicEvents, FALSE,
wxCHECK_MSG( m_dynamicEvents, false,
wxT("caller should check that we have dynamic events") );
int commandId = event.GetId();
wxList::compatibility_iterator node = m_dynamicEvents->GetFirst();
while (node)
{
#if WXWIN_COMPATIBILITY_EVENT_TYPES
wxEventTableEntry *entry = (wxEventTableEntry*)node->GetData();
wxEventTableEntry *entry = (wxEventTableEntry*)node->GetData();
#else // !WXWIN_COMPATIBILITY_EVENT_TYPES
wxDynamicEventTableEntry *entry = (wxDynamicEventTableEntry*)node->GetData();
wxDynamicEventTableEntry *entry = (wxDynamicEventTableEntry*)node->GetData();
#endif // WXWIN_COMPATIBILITY_EVENT_TYPES/!WXWIN_COMPATIBILITY_EVENT_TYPES
if (entry->m_fn)
{
// Match, if event spec says any id will do (id == -1)
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;
wxEvtHandler *handler =
#if !WXWIN_COMPATIBILITY_EVENT_TYPES
if (entry->m_eventSink)
((entry->m_eventSink)->*((wxEventFunction) (entry->m_fn)))(event);
else
entry->m_eventSink ? entry->m_eventSink
:
#endif
(this->*((wxEventFunction) (entry->m_fn)))(event);
this;
if ( ! event.GetSkipped() )
return TRUE;
if ( ProcessEventIfMatches(*entry, handler, event) )
{
return true;
}
}
node = node->GetNext();
}
return FALSE;
return false;
};
void wxEvtHandler::DoSetClientObject( wxClientData *data )