small optimizations: m_isWindow and m_isCommandEvent flags introduced

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1762 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 1999-02-23 22:41:37 +00:00
parent 89a43902a8
commit 193bf01364
2 changed files with 46 additions and 23 deletions

View File

@ -283,6 +283,10 @@ public:
void Skip(bool skip = TRUE) { m_skipped = skip; }
bool GetSkipped() const { return m_skipped; };
// implementation only: this test is explicitlty anti OO and this functions
// exists only for optimization purposes
bool IsCommandEvent() const { return m_isCommandEvent; }
public:
bool m_skipped;
wxObject* m_eventObject;
@ -291,6 +295,10 @@ public:
long m_timeStamp;
int m_id;
wxObject* m_callbackUserData;
// optimization: instead of using costly IsKindOf() we keep a flag telling
// whether we're a command event (by far the most common case)
bool m_isCommandEvent;
};
// Item or menu event class
@ -1182,13 +1190,19 @@ private:
static const wxEventTableEntry sm_eventTableEntries[];
protected:
static const wxEventTable sm_eventTable;
virtual const wxEventTable* GetEventTable() const;
static const wxEventTable sm_eventTable;
virtual const wxEventTable *GetEventTable() const;
protected:
wxEvtHandler* m_nextHandler;
wxEvtHandler* m_previousHandler;
bool m_enabled; // Is event handler enabled?
bool m_enabled; // Is event handler enabled?
wxList* m_dynamicEvents;
// optimization: instead of using costly IsKindOf() to decide whether we're
// a window (which is true in 99% of cases), use this flag
bool m_isWindow;
};
typedef void (wxEvtHandler::*wxEventFunction)(wxEvent&);

View File

@ -96,6 +96,7 @@ wxEvent::wxEvent(int theId)
m_id = theId;
m_skipped = FALSE;
m_callbackUserData = (wxObject *) NULL;
m_isCommandEvent = FALSE;
}
/*
@ -112,6 +113,7 @@ wxCommandEvent::wxCommandEvent(wxEventType commandType, int theId)
m_commandInt = 0;
m_id = theId;
m_commandString = (char *) NULL;
m_isCommandEvent = TRUE;
}
/*
@ -280,6 +282,7 @@ wxEvtHandler::wxEvtHandler()
m_previousHandler = (wxEvtHandler *) NULL;
m_enabled = TRUE;
m_dynamicEvents = (wxList *) NULL;
m_isWindow = FALSE;
}
wxEvtHandler::~wxEvtHandler()
@ -311,14 +314,15 @@ wxEvtHandler::~wxEvtHandler()
bool wxEvtHandler::ProcessEvent(wxEvent& event)
{
bool isWindow = IsKindOf(CLASSINFO(wxWindow));
// check that our flag corresponds to reality
wxASSERT( m_isWindow == IsKindOf(CLASSINFO(wxWindow)) );
// An event handler can be enabled or disabled
if ( GetEvtHandlerEnabled() )
{
// Handle per-instance dynamic event tables first
if (SearchDynamicEventTable( event ))
if ( m_dynamicEvents && SearchDynamicEventTable(event) )
return TRUE;
// Then static per-class event tables
@ -333,24 +337,26 @@ bool wxEvtHandler::ProcessEvent(wxEvent& event)
// THIS CAN BE CURED if PushEventHandler is used instead of
// SetEventHandler, and then processing will be passed down the
// chain of event handlers.
if ( isWindow )
if ( m_isWindow )
{
wxWindow *win = (wxWindow *)this;
// Can only use the validator of the window which
// is receiving the event
if ( (win == event.GetEventObject()) &&
win->GetValidator() &&
win->GetValidator()->ProcessEvent(event))
if ( win == event.GetEventObject() )
{
return TRUE;
wxValidator *validator = win->GetValidator();
if ( validator && validator->ProcessEvent(event) )
{
return TRUE;
}
}
}
// Search upwards through the inheritance hierarchy
while (table)
while ( table )
{
if (SearchEventTable((wxEventTable&)*table, event))
if ( SearchEventTable((wxEventTable&)*table, event) )
return TRUE;
table = table->baseTable;
}
@ -366,23 +372,25 @@ bool wxEvtHandler::ProcessEvent(wxEvent& event)
// Carry on up the parent-child hierarchy,
// but only if event is a command event: it wouldn't
// make sense for a parent to receive a child's size event, for example
if ( isWindow && event.IsKindOf(CLASSINFO(wxCommandEvent)) )
if ( m_isWindow && event.IsCommandEvent() )
{
wxWindow *win = (wxWindow *)this;
wxWindow *parent = win->GetParent();
if (parent && !parent->IsBeingDeleted())
return win->GetParent()->GetEventHandler()->ProcessEvent(event);
return parent->GetEventHandler()->ProcessEvent(event);
}
// Last try - application object.
// Special case: don't pass wxEVT_IDLE to wxApp, since it'll always swallow
// it. wxEVT_IDLE is sent explicitly to wxApp so it will be processed
// appropriately via SearchEventTable.
if ( wxTheApp && (this != wxTheApp) && (event.GetEventType() != wxEVT_IDLE)
)
if ( wxTheApp && (this != wxTheApp) )
{
if ( wxTheApp->ProcessEvent(event) )
return TRUE;
// Special case: don't pass wxEVT_IDLE to wxApp, since it'll always
// swallow it. wxEVT_IDLE is sent explicitly to wxApp so it will be
// processed appropriately via SearchEventTable.
if ( event.GetEventType() != wxEVT_IDLE )
{
if ( wxTheApp->ProcessEvent(event) )
return TRUE;
}
}
return FALSE;
@ -442,7 +450,8 @@ void wxEvtHandler::Connect( int id, int lastId,
bool wxEvtHandler::SearchDynamicEventTable( wxEvent& event )
{
if (!m_dynamicEvents) return FALSE;
wxCHECK_MSG( m_dynamicEvents, FALSE,
"caller should check that we have dynamic events" );
int commandId = event.GetId();
@ -484,5 +493,5 @@ bool wxEvtHandler::OnClose()
else
return FALSE;
}
#endif
#endif // WXWIN_COMPATIBILITY