IMPLEMENT_DYNAMIC_CLASS(wxEvtHandler, wxObject)
IMPLEMENT_ABSTRACT_CLASS(wxEvent, wxObject)
-IMPLEMENT_DYNAMIC_CLASS(wxIdleEvent, wxEvent)
#if wxUSE_GUI
+ IMPLEMENT_DYNAMIC_CLASS(wxIdleEvent, wxEvent)
IMPLEMENT_DYNAMIC_CLASS(wxCommandEvent, wxEvent)
IMPLEMENT_DYNAMIC_CLASS(wxNotifyEvent, wxCommandEvent)
IMPLEMENT_DYNAMIC_CLASS(wxScrollEvent, wxCommandEvent)
IMPLEMENT_DYNAMIC_CLASS(wxEraseEvent, wxEvent)
IMPLEMENT_DYNAMIC_CLASS(wxMoveEvent, wxEvent)
IMPLEMENT_DYNAMIC_CLASS(wxFocusEvent, wxEvent)
+ IMPLEMENT_DYNAMIC_CLASS(wxChildFocusEvent, wxCommandEvent)
IMPLEMENT_DYNAMIC_CLASS(wxCloseEvent, wxEvent)
IMPLEMENT_DYNAMIC_CLASS(wxShowEvent, wxEvent)
IMPLEMENT_DYNAMIC_CLASS(wxMaximizeEvent, wxEvent)
DEFINE_EVENT_TYPE(wxEVT_COMMAND_LISTBOX_SELECTED)
DEFINE_EVENT_TYPE(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED)
DEFINE_EVENT_TYPE(wxEVT_COMMAND_CHECKLISTBOX_TOGGLED)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_TEXT_UPDATED)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_TEXT_ENTER)
DEFINE_EVENT_TYPE(wxEVT_COMMAND_MENU_SELECTED)
DEFINE_EVENT_TYPE(wxEVT_COMMAND_SLIDER_UPDATED)
DEFINE_EVENT_TYPE(wxEVT_COMMAND_RADIOBOX_SELECTED)
DEFINE_EVENT_TYPE(wxEVT_RIGHT_DCLICK)
DEFINE_EVENT_TYPE(wxEVT_SET_FOCUS)
DEFINE_EVENT_TYPE(wxEVT_KILL_FOCUS)
+DEFINE_EVENT_TYPE(wxEVT_CHILD_FOCUS)
DEFINE_EVENT_TYPE(wxEVT_MOUSEWHEEL)
// Non-client mouse events
SetEventObject(win);
}
-#endif // wxUSE_GUI
-
void wxIdleEvent::CopyObject(wxObject& obj_d) const
{
wxIdleEvent *obj = (wxIdleEvent *)&obj_d;
obj->m_requestMore = m_requestMore;
}
+wxChildFocusEvent::wxChildFocusEvent(wxWindow *win)
+ : wxCommandEvent(wxEVT_CHILD_FOCUS)
+{
+ SetEventObject(win);
+}
+
+#endif // wxUSE_GUI
+
+// ----------------------------------------------------------------------------
+// wxEvtHandler
+// ----------------------------------------------------------------------------
+
/*
* Event handler
*/
m_eventsLocker = new wxCriticalSection;
# endif
#endif
+ // no client data (yet)
+ m_clientData = NULL;
+ m_clientDataType = wxClientData_None;
}
wxEvtHandler::~wxEvtHandler()
delete m_eventsLocker;
# endif
#endif
+
+ // we only delete object data, not untyped
+ if ( m_clientDataType == wxClientData_Object )
+ delete m_clientObject;
}
#if wxUSE_THREADS
bool wxEvtHandler::ProcessEvent(wxEvent& event)
{
#if wxUSE_GUI
+
+ // We have to use the actual window or processing events from wxWindowNative
+ // destructor won't work (we don't see the wxWindow class)
+#ifdef __WXDEBUG__
// check that our flag corresponds to reality
- wxASSERT_MSG( m_isWindow == IsKindOf(CLASSINFO(wxWindow)),
+ wxClassInfo* info = NULL;
+#ifdef __WXUNIVERSAL__
+# if defined(__WXMSW__)
+ info = CLASSINFO(wxWindowMSW);
+# elif defined(__WXGTK__)
+ info = CLASSINFO(wxWindowGTK);
+# elif defined(__WXMGL__)
+ info = CLASSINFO(wxWindowMGL);
+# elif defined(__WXPM__)
+ info = CLASSINFO(wxWindowOS2);
+# elif defined(__WXMAC__)
+ info = CLASSINFO(wxWindowMac);
+# elif defined(__WXMOTIF__)
+ info = CLASSINFO(wxWindowMotif);
+# endif
+#else
+ info = CLASSINFO(wxWindow);
+#endif
+
+ wxASSERT_MSG( m_isWindow == IsKindOf(info),
_T("this should [not] be a window but it is [not]") );
+#endif
+
#endif // wxUSE_GUI
// An event handler can be enabled or disabled
{
wxWindow *win = (wxWindow *)this;
- // also, don't propagate events beyond the first top level window: it
- // doesn't make sense to process dialogs events in the parent frame
- if ( !win->IsTopLevel() )
+ // honour the requests to stop propagation at this window: this is
+ // used by the dialogs, for example, to prevent processing the events
+ // from the dialog controls in the parent frame which rarely, if ever,
+ // makes sense
+ if ( !(win->GetExtraStyle() & wxWS_EX_BLOCK_EVENTS) )
{
wxWindow *parent = win->GetParent();
- if (parent && !parent->IsBeingDeleted())
+ if ( parent && !parent->IsBeingDeleted() )
return parent->GetEventHandler()->ProcessEvent(event);
}
}
return FALSE;
};
+void wxEvtHandler::DoSetClientObject( wxClientData *data )
+{
+ wxASSERT_MSG( m_clientDataType != wxClientData_Void,
+ wxT("can't have both object and void client data") );
+
+ if ( m_clientObject )
+ delete m_clientObject;
+
+ m_clientObject = data;
+ m_clientDataType = wxClientData_Object;
+}
+
+wxClientData *wxEvtHandler::DoGetClientObject() const
+{
+ // it's not an error to call GetClientObject() on a window which doesn't
+ // have client data at all - NULL will be returned
+ wxASSERT_MSG( m_clientDataType != wxClientData_Void,
+ wxT("this window doesn't have object client data") );
+
+ return m_clientObject;
+}
+
+void wxEvtHandler::DoSetClientData( void *data )
+{
+ wxASSERT_MSG( m_clientDataType != wxClientData_Object,
+ wxT("can't have both object and void client data") );
+
+ m_clientData = data;
+ m_clientDataType = wxClientData_Void;
+}
+
+void *wxEvtHandler::DoGetClientData() const
+{
+ // it's not an error to call GetClientData() on a window which doesn't have
+ // client data at all - NULL will be returned
+ wxASSERT_MSG( m_clientDataType != wxClientData_Object,
+ wxT("this window doesn't have void client data") );
+
+ return m_clientData;
+}
+
+
#if WXWIN_COMPATIBILITY
bool wxEvtHandler::OnClose()
{