IMPLEMENT_DYNAMIC_CLASS(wxEvtHandler, wxObject)
IMPLEMENT_ABSTRACT_CLASS(wxEvent, wxObject)
IMPLEMENT_DYNAMIC_CLASS(wxCommandEvent, wxEvent)
+IMPLEMENT_DYNAMIC_CLASS(wxNotifyEvent, wxCommandEvent)
IMPLEMENT_DYNAMIC_CLASS(wxScrollEvent, wxCommandEvent)
IMPLEMENT_DYNAMIC_CLASS(wxMouseEvent, wxEvent)
IMPLEMENT_DYNAMIC_CLASS(wxKeyEvent, wxEvent)
IMPLEMENT_DYNAMIC_CLASS(wxInitDialogEvent, wxEvent)
IMPLEMENT_DYNAMIC_CLASS(wxSysColourChangedEvent, wxEvent)
IMPLEMENT_DYNAMIC_CLASS(wxIdleEvent, wxEvent)
-IMPLEMENT_DYNAMIC_CLASS(wxUpdateUIEvent, wxEvent)
+IMPLEMENT_DYNAMIC_CLASS(wxUpdateUIEvent, wxCommandEvent)
+IMPLEMENT_DYNAMIC_CLASS(wxNavigationKeyEvent, wxCommandEvent)
+IMPLEMENT_DYNAMIC_CLASS(wxPaletteChangedEvent, wxEvent)
+IMPLEMENT_DYNAMIC_CLASS(wxQueryNewPaletteEvent, wxEvent)
const wxEventTable *wxEvtHandler::GetEventTable() const { return &wxEvtHandler::sm_eventTable; }
const wxEventTable wxEvtHandler::sm_eventTable =
- { NULL, &wxEvtHandler::sm_eventTableEntries[0] };
+ { (const wxEventTable *) NULL, &wxEvtHandler::sm_eventTableEntries[0] };
-const wxEventTableEntry wxEvtHandler::sm_eventTableEntries[] = { { 0, 0, 0, NULL } };
+const wxEventTableEntry wxEvtHandler::sm_eventTableEntries[] = { { 0, 0, 0,
+#ifdef __SGI_CC__
+// stupid SGI compiler --- offer aug 98
+ 0L }
+#else
+ NULL }
+#endif
+};
#endif
wxEvent::wxEvent(int theId)
{
- m_eventType = 0;
- m_eventObject = NULL;
- m_eventHandle = NULL;
+ m_eventType = wxEVT_NULL;
+ m_eventObject = (wxObject *) NULL;
+ m_eventHandle = (char *) NULL;
m_timeStamp = 0;
m_id = theId;
m_skipped = FALSE;
+ m_callbackUserData = (wxObject *) NULL;
}
/*
*
*/
-wxCommandEvent::wxCommandEvent(WXTYPE commandType, int theId)
+wxCommandEvent::wxCommandEvent(wxEventType commandType, int theId)
{
m_eventType = commandType;
- m_clientData = NULL;
+ m_clientData = (char *) NULL;
+ m_clientObject = (wxClientData *) NULL;
m_extraLong = 0;
m_commandInt = 0;
m_id = theId;
- m_commandString = NULL;
+ m_commandString = (char *) NULL;
}
/*
* 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;
*
*/
-wxMouseEvent::wxMouseEvent(WXTYPE 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_x = 0;
+ m_y = 0;
}
// True if was a button dclick event (1 = left, 2 = middle, 3 = right)
// Find the logical position of the event given the DC
wxPoint wxMouseEvent::GetLogicalPosition(const wxDC& dc) const
{
- wxPoint pt(dc.DeviceToLogicalX(m_x), dc.DeviceToLogicalY(m_y));
- return pt;
+ wxPoint pt(dc.DeviceToLogicalX(m_x), dc.DeviceToLogicalY(m_y));
+ return pt;
}
*
*/
-wxKeyEvent::wxKeyEvent(WXTYPE type)
+wxKeyEvent::wxKeyEvent(wxEventType type)
{
m_eventType = type;
m_shiftDown = FALSE;
wxEvtHandler::wxEvtHandler(void)
{
- m_clientData = NULL;
- m_nextHandler = NULL;
- m_previousHandler = NULL;
+ m_nextHandler = (wxEvtHandler *) NULL;
+ m_previousHandler = (wxEvtHandler *) NULL;
m_enabled = TRUE;
+ m_dynamicEvents = (wxList *) NULL;
}
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;
+ };
}
/*
// 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.
// chain of event handlers.
if (IsKindOf(CLASSINFO(wxWindow)))
{
- 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))
- return TRUE;
+ 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))
+ return TRUE;
}
// Search upwards through the inheritance hierarchy
// Try going down the event handler chain
if ( GetNextHandler() )
{
- if ( GetNextHandler()->ProcessEvent(event) )
- return TRUE;
+ if ( GetNextHandler()->ProcessEvent(event) )
+ return TRUE;
}
// Carry on up the parent-child hierarchy,
if (IsKindOf(CLASSINFO(wxWindow)) && event.IsKindOf(CLASSINFO(wxCommandEvent)))
{
wxWindow *win = (wxWindow *)this;
- wxWindow *parent = win->GetParent();
+ wxWindow *parent = win->GetParent();
if (parent && !parent->IsBeingDeleted())
return win->GetParent()->GetEventHandler()->ProcessEvent(event);
}
- // Last try - application object
- if (wxTheApp && this != wxTheApp && wxTheApp->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) && wxTheApp->ProcessEvent(event))
return TRUE;
else
return FALSE;
{
int i = 0;
int commandId = event.GetId();
-
- while (table.entries[i].m_fn != NULL)
+
+ // BC++ doesn't like while (table.entries[i].m_fn)
+
+ while (table.entries[i].m_fn != 0L)
{
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 && commandId <= table.entries[i].m_lastId))))
{
- event.Skip(FALSE);
-
+ event.Skip(FALSE);
+ event.m_callbackUserData = table.entries[i].m_callbackUserData;
+
(this->*((wxEventFunction) (table.entries[i].m_fn)))(event);
- if ( event.GetSkipped() )
- return FALSE;
- else
+ if ( event.GetSkipped() )
+ return FALSE;
+ else
return TRUE;
}
i ++;
return FALSE;
}
-#if WXWIN_COMPATIBILITY
-void wxEvtHandler::OldOnMenuCommand(int cmd)
-{
- 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)
+void wxEvtHandler::Connect( int id, int lastId,
+ int eventType,
+ wxObjectEventFunction func,
+ wxObject *userData )
{
- 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();
+
+ 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)
{