X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c801d85f158c4cba50b588807daabdcbd0ed3853..3826db3ef5fc3ac97fb91aa11eb2381b2c96248d:/src/common/event.cpp?ds=sidebyside diff --git a/src/common/event.cpp b/src/common/event.cpp index 963aa42d42..5917d2a595 100644 --- a/src/common/event.cpp +++ b/src/common/event.cpp @@ -55,6 +55,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxInitDialogEvent, wxEvent) IMPLEMENT_DYNAMIC_CLASS(wxSysColourChangedEvent, wxEvent) IMPLEMENT_DYNAMIC_CLASS(wxIdleEvent, wxEvent) IMPLEMENT_DYNAMIC_CLASS(wxUpdateUIEvent, wxEvent) +IMPLEMENT_DYNAMIC_CLASS(wxNavigationKeyEvent, wxCommandEvent) const wxEventTable *wxEvtHandler::GetEventTable() const { return &wxEvtHandler::sm_eventTable; } @@ -76,12 +77,13 @@ const wxEventTableEntry wxEvtHandler::sm_eventTableEntries[] = { { 0, 0, 0, NULL wxEvent::wxEvent(int theId) { - m_eventType = 0; + m_eventType = wxEVT_NULL; m_eventObject = NULL; m_eventHandle = NULL; m_timeStamp = 0; m_id = theId; m_skipped = FALSE; + m_callbackUserData = NULL; } /* @@ -89,7 +91,7 @@ wxEvent::wxEvent(int theId) * */ -wxCommandEvent::wxCommandEvent(WXTYPE commandType, int theId) +wxCommandEvent::wxCommandEvent(wxEventType commandType, int theId) { m_eventType = commandType; m_clientData = NULL; @@ -103,7 +105,7 @@ wxCommandEvent::wxCommandEvent(WXTYPE commandType, int theId) * Scroll events */ -wxScrollEvent::wxScrollEvent(WXTYPE commandType, int id, int pos, int orient): +wxScrollEvent::wxScrollEvent(wxEventType commandType, int id, int pos, int orient): wxCommandEvent(commandType, id) { m_extraLong = orient; @@ -116,7 +118,7 @@ wxScrollEvent::wxScrollEvent(WXTYPE commandType, int id, int pos, int orient): * */ -wxMouseEvent::wxMouseEvent(WXTYPE commandType) +wxMouseEvent::wxMouseEvent(wxEventType commandType) { m_eventType = commandType; m_metaDown = FALSE; @@ -230,7 +232,7 @@ wxPoint wxMouseEvent::GetLogicalPosition(const wxDC& dc) const * */ -wxKeyEvent::wxKeyEvent(WXTYPE type) +wxKeyEvent::wxKeyEvent(wxEventType type) { m_eventType = type; m_shiftDown = FALSE; @@ -250,6 +252,7 @@ wxEvtHandler::wxEvtHandler(void) m_nextHandler = NULL; m_previousHandler = NULL; m_enabled = TRUE; + m_dynamicEvents = NULL; } wxEvtHandler::~wxEvtHandler(void) @@ -260,6 +263,19 @@ wxEvtHandler::~wxEvtHandler(void) if (m_nextHandler) m_nextHandler->m_previousHandler = m_previousHandler; + + if (m_dynamicEvents) + { + wxNode *node = m_dynamicEvents->First(); + while (node) + { + wxEventTableEntry *entry = (wxEventTableEntry*)node->Data(); + if (entry->m_callbackUserData) delete entry->m_callbackUserData; + delete entry; + node = node->Next(); + } + delete m_dynamicEvents; + }; } /* @@ -271,6 +287,12 @@ bool wxEvtHandler::ProcessEvent(wxEvent& event) // An event handler can be enabled or disabled if ( GetEvtHandlerEnabled() ) { + // Handle per-instance dynamic event tables first + + if (SearchDynamicEventTable( event )) return TRUE; + + // Then static per-class event tables + const wxEventTable *table = GetEventTable(); // Try the associated validator first, if this is a window. @@ -334,6 +356,8 @@ bool wxEvtHandler::SearchEventTable(wxEventTable& table, wxEvent& event) while (table.entries[i].m_fn != NULL) { + wxEventType eventType = (wxEventType) table.entries[i].m_eventType; + if ((event.GetEventType() == table.entries[i].m_eventType) && (table.entries[i].m_id == -1 || // Match, if event spec says any id will do (id == -1) (table.entries[i].m_lastId == -1 && commandId == table.entries[i].m_id) || @@ -341,7 +365,8 @@ bool wxEvtHandler::SearchEventTable(wxEventTable& table, wxEvent& event) (commandId >= table.entries[i].m_id && commandId <= table.entries[i].m_lastId)))) { event.Skip(FALSE); - + event.m_callbackUserData = table.entries[i].m_callbackUserData; + (this->*((wxEventFunction) (table.entries[i].m_fn)))(event); if ( event.GetSkipped() ) @@ -354,84 +379,59 @@ bool wxEvtHandler::SearchEventTable(wxEventTable& table, wxEvent& event) return FALSE; } -#if WXWIN_COMPATIBILITY -void wxEvtHandler::OldOnMenuCommand(int cmd) +void wxEvtHandler::Connect( int id, int lastId, + int eventType, + wxObjectEventFunction func, + wxObject *userData ) { - if (GetNextHandler()) GetNextHandler()->OldOnMenuCommand(cmd); -} - -void wxEvtHandler::OldOnMenuSelect(int cmd) -{ - if (GetNextHandler()) GetNextHandler()->OldOnMenuSelect(cmd); -} - -void wxEvtHandler::OldOnInitMenuPopup(int pos) -{ - if (GetNextHandler()) GetNextHandler()->OldOnInitMenuPopup(pos); -} - -void wxEvtHandler::OldOnScroll(wxCommandEvent& event) -{ - if (GetNextHandler()) GetNextHandler()->OldOnScroll(event); -} - -void wxEvtHandler::OldOnPaint(void) -{ - if (GetNextHandler()) GetNextHandler()->OldOnPaint(); -} -void wxEvtHandler::OldOnSize(int width, int height) -{ - if (GetNextHandler()) GetNextHandler()->OldOnSize(width, height); -} - -void wxEvtHandler::OldOnMove(int x, int y) -{ - if (GetNextHandler()) GetNextHandler()->OldOnMove(x, y); -} - -void wxEvtHandler::OldOnMouseEvent(wxMouseEvent& event) -{ - if (GetNextHandler()) GetNextHandler()->OldOnMouseEvent(event); -} - -void wxEvtHandler::OldOnChar(wxKeyEvent& event) -{ - if (GetNextHandler()) GetNextHandler()->OldOnChar(event); -} - -// Under Windows, we can intercept character input per dialog or frame -bool wxEvtHandler::OldOnCharHook(wxKeyEvent& event) -{ - if (GetNextHandler()) return GetNextHandler()->OldOnCharHook(event); - else return FALSE; -} - -void wxEvtHandler::OldOnActivate(bool active) -{ - if (GetNextHandler()) GetNextHandler()->OldOnActivate(active); -} - -void wxEvtHandler::OldOnSetFocus(void) -{ - if (GetNextHandler()) GetNextHandler()->OldOnSetFocus(); -} - -void wxEvtHandler::OldOnKillFocus(void) -{ - if (GetNextHandler()) GetNextHandler()->OldOnKillFocus(); + wxEventTableEntry *entry = new wxEventTableEntry; + entry->m_id = id; + entry->m_lastId = lastId; + entry->m_eventType = eventType; + entry->m_fn = func; + entry->m_callbackUserData = userData; + + if (!m_dynamicEvents) + m_dynamicEvents = new wxList; + + m_dynamicEvents->Append( (wxObject*) entry ); } -bool wxEvtHandler::OldOnSysColourChange(void) +bool wxEvtHandler::SearchDynamicEventTable( wxEvent& event ) { - if (GetNextHandler()) return GetNextHandler()->OldOnSysColourChange(); - return FALSE; -} + if (!m_dynamicEvents) return FALSE; + + int commandId = event.GetId(); -void wxEvtHandler::OldOnDropFiles(int n, char *files[], int x, int y) -{ - if (GetNextHandler()) GetNextHandler()->OldOnDropFiles(n, files, x, y); -} -#endif + wxNode *node = m_dynamicEvents->First(); + while (node) + { + wxEventTableEntry *entry = (wxEventTableEntry*)node->Data(); + wxEventType eventType = (wxEventType) entry->m_eventType; + + if (entry->m_fn) + { + if ((event.GetEventType() == entry->m_eventType) && + (entry->m_id == -1 || // Match, if event spec says any id will do (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; + + (this->*((wxEventFunction) (entry->m_fn)))(event); + + if (event.GetSkipped()) + return FALSE; + else + return TRUE; + } + }; + node = node->Next(); + } + return FALSE; +}; bool wxEvtHandler::OnClose(void) {