X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5d53c76bab8fd8ddd178f45fe8dc0c37a9f90c4a..56b79cb98da2e2e3024fce6f6313546577c34821:/include/wx/event.h diff --git a/include/wx/event.h b/include/wx/event.h index 2831bc3f86..8ffac8587d 100644 --- a/include/wx/event.h +++ b/include/wx/event.h @@ -23,9 +23,7 @@ #include "wx/gdicmn.h" #endif -#if wxUSE_THREADS - #include "wx/thread.h" -#endif +#include "wx/thread.h" // ---------------------------------------------------------------------------- // forward declarations @@ -46,6 +44,219 @@ class WXDLLEXPORT wxList; typedef int wxEventType; +#if defined(__VISAGECPP__) && __IBMCPP__ >= 400 +// must define these static for VA or else you get multiply defined symbols everywhere +static const wxEventType wxEVT_NULL = 0; +static const wxEventType wxEVT_FIRST = 10000; + +static const wxEventType wxEVT_COMMAND_BUTTON_CLICKED = wxEVT_FIRST + 1; +static const wxEventType wxEVT_COMMAND_CHECKBOX_CLICKED = wxEVT_FIRST + 2; +static const wxEventType wxEVT_COMMAND_CHOICE_SELECTED = wxEVT_FIRST + 3; +static const wxEventType wxEVT_COMMAND_LISTBOX_SELECTED = wxEVT_FIRST + 4; +static const wxEventType wxEVT_COMMAND_LISTBOX_DOUBLECLICKED = wxEVT_FIRST + 5; +static const wxEventType wxEVT_COMMAND_CHECKLISTBOX_TOGGLED = wxEVT_FIRST + 6; +static const wxEventType wxEVT_COMMAND_TEXT_UPDATED = wxEVT_FIRST + 7; +static const wxEventType wxEVT_COMMAND_TEXT_ENTER = wxEVT_FIRST + 8; +static const wxEventType wxEVT_COMMAND_MENU_SELECTED = wxEVT_FIRST + 9; +static const wxEventType wxEVT_COMMAND_TOOL_CLICKED = wxEVT_COMMAND_MENU_SELECTED; +static const wxEventType wxEVT_COMMAND_SLIDER_UPDATED = wxEVT_FIRST + 10; +static const wxEventType wxEVT_COMMAND_RADIOBOX_SELECTED = wxEVT_FIRST + 11; +static const wxEventType wxEVT_COMMAND_RADIOBUTTON_SELECTED = wxEVT_FIRST + 12; +//static const wxEventType wxEVT_COMMAND_SCROLLBAR_UPDATED is now obsolete since we use wxEVT_SCROLL... events +static const wxEventType wxEVT_COMMAND_SCROLLBAR_UPDATED = wxEVT_FIRST + 13; +static const wxEventType wxEVT_COMMAND_VLBOX_SELECTED = wxEVT_FIRST + 14; +static const wxEventType wxEVT_COMMAND_COMBOBOX_SELECTED = wxEVT_FIRST + 15; +static const wxEventType wxEVT_COMMAND_TOOL_RCLICKED = wxEVT_FIRST + 16; +static const wxEventType wxEVT_COMMAND_TOOL_ENTER = wxEVT_FIRST + 17; +static const wxEventType wxEVT_COMMAND_SPINCTRL_UPDATED = wxEVT_FIRST + 18; + +/* Sockets send events, too */ +static const wxEventType wxEVT_SOCKET = wxEVT_FIRST + 50; + +/* Mouse event types */ +static const wxEventType wxEVT_LEFT_DOWN = wxEVT_FIRST + 100; +static const wxEventType wxEVT_LEFT_UP = wxEVT_FIRST + 101; +static const wxEventType wxEVT_MIDDLE_DOWN = wxEVT_FIRST + 102; +static const wxEventType wxEVT_MIDDLE_UP = wxEVT_FIRST + 103; +static const wxEventType wxEVT_RIGHT_DOWN = wxEVT_FIRST + 104; +static const wxEventType wxEVT_RIGHT_UP = wxEVT_FIRST + 105; +static const wxEventType wxEVT_MOTION = wxEVT_FIRST + 106; +static const wxEventType wxEVT_ENTER_WINDOW = wxEVT_FIRST + 107; +static const wxEventType wxEVT_LEAVE_WINDOW = wxEVT_FIRST + 108; +static const wxEventType wxEVT_LEFT_DCLICK = wxEVT_FIRST + 109; +static const wxEventType wxEVT_MIDDLE_DCLICK = wxEVT_FIRST + 110; +static const wxEventType wxEVT_RIGHT_DCLICK = wxEVT_FIRST + 111; +static const wxEventType wxEVT_SET_FOCUS = wxEVT_FIRST + 112; +static const wxEventType wxEVT_KILL_FOCUS = wxEVT_FIRST + 113; + + /* Non-client mouse events */ +static const wxEventType wxEVT_NC_LEFT_DOWN = wxEVT_FIRST + 200; +static const wxEventType wxEVT_NC_LEFT_UP = wxEVT_FIRST + 201; +static const wxEventType wxEVT_NC_MIDDLE_DOWN = wxEVT_FIRST + 202; +static const wxEventType wxEVT_NC_MIDDLE_UP = wxEVT_FIRST + 203; +static const wxEventType wxEVT_NC_RIGHT_DOWN = wxEVT_FIRST + 204; +static const wxEventType wxEVT_NC_RIGHT_UP = wxEVT_FIRST + 205; +static const wxEventType wxEVT_NC_MOTION = wxEVT_FIRST + 206; +static const wxEventType wxEVT_NC_ENTER_WINDOW = wxEVT_FIRST + 207; +static const wxEventType wxEVT_NC_LEAVE_WINDOW = wxEVT_FIRST + 208; +static const wxEventType wxEVT_NC_LEFT_DCLICK = wxEVT_FIRST + 209; +static const wxEventType wxEVT_NC_MIDDLE_DCLICK = wxEVT_FIRST + 210; +static const wxEventType wxEVT_NC_RIGHT_DCLICK = wxEVT_FIRST + 211; + +/* Character input event type */ +static const wxEventType wxEVT_CHAR = wxEVT_FIRST + 212; +static const wxEventType wxEVT_CHAR_HOOK = wxEVT_FIRST + 213; +static const wxEventType wxEVT_NAVIGATION_KEY = wxEVT_FIRST + 214; +static const wxEventType wxEVT_KEY_DOWN = wxEVT_FIRST + 215; +static const wxEventType wxEVT_KEY_UP = wxEVT_FIRST + 216; + + /* + * wxScrollbar and wxSlider event identifiers + */ +static const wxEventType wxEVT_SCROLL_TOP = wxEVT_FIRST + 300; +static const wxEventType wxEVT_SCROLL_BOTTOM = wxEVT_FIRST + 301; +static const wxEventType wxEVT_SCROLL_LINEUP = wxEVT_FIRST + 302; +static const wxEventType wxEVT_SCROLL_LINEDOWN = wxEVT_FIRST + 303; +static const wxEventType wxEVT_SCROLL_PAGEUP = wxEVT_FIRST + 304; +static const wxEventType wxEVT_SCROLL_PAGEDOWN = wxEVT_FIRST + 305; +static const wxEventType wxEVT_SCROLL_THUMBTRACK = wxEVT_FIRST + 306; + + /* + * Scroll events from wxWindow + */ +static const wxEventType wxEVT_SCROLLWIN_TOP = wxEVT_FIRST + 320; +static const wxEventType wxEVT_SCROLLWIN_BOTTOM = wxEVT_FIRST + 321; +static const wxEventType wxEVT_SCROLLWIN_LINEUP = wxEVT_FIRST + 322; +static const wxEventType wxEVT_SCROLLWIN_LINEDOWN = wxEVT_FIRST + 323; +static const wxEventType wxEVT_SCROLLWIN_PAGEUP = wxEVT_FIRST + 324; +static const wxEventType wxEVT_SCROLLWIN_PAGEDOWN = wxEVT_FIRST + 325; +static const wxEventType wxEVT_SCROLLWIN_THUMBTRACK = wxEVT_FIRST + 326; + + /* + * System events + */ +static const wxEventType wxEVT_SIZE = wxEVT_FIRST + 400; +static const wxEventType wxEVT_MOVE = wxEVT_FIRST + 401; +static const wxEventType wxEVT_CLOSE_WINDOW = wxEVT_FIRST + 402; +static const wxEventType wxEVT_END_SESSION = wxEVT_FIRST + 403; +static const wxEventType wxEVT_QUERY_END_SESSION = wxEVT_FIRST + 404; +static const wxEventType wxEVT_ACTIVATE_APP = wxEVT_FIRST + 405; +static const wxEventType wxEVT_POWER = wxEVT_FIRST + 406; +static const wxEventType wxEVT_ACTIVATE = wxEVT_FIRST + 409; +static const wxEventType wxEVT_CREATE = wxEVT_FIRST + 410; +static const wxEventType wxEVT_DESTROY = wxEVT_FIRST + 411; +static const wxEventType wxEVT_SHOW = wxEVT_FIRST + 412; +static const wxEventType wxEVT_ICONIZE = wxEVT_FIRST + 413; +static const wxEventType wxEVT_MAXIMIZE = wxEVT_FIRST + 414; +static const wxEventType wxEVT_MOUSE_CAPTURE_CHANGED = wxEVT_FIRST + 415; +static const wxEventType wxEVT_PAINT = wxEVT_FIRST + 416; +static const wxEventType wxEVT_ERASE_BACKGROUND = wxEVT_FIRST + 417; +static const wxEventType wxEVT_NC_PAINT = wxEVT_FIRST + 418; +static const wxEventType wxEVT_PAINT_ICON = wxEVT_FIRST + 419; +static const wxEventType wxEVT_MENU_CHAR = wxEVT_FIRST + 420; +static const wxEventType wxEVT_MENU_INIT = wxEVT_FIRST + 421; +static const wxEventType wxEVT_MENU_HIGHLIGHT = wxEVT_FIRST + 422; +static const wxEventType wxEVT_POPUP_MENU_INIT = wxEVT_FIRST + 423; +static const wxEventType wxEVT_CONTEXT_MENU = wxEVT_FIRST + 424; +static const wxEventType wxEVT_SYS_COLOUR_CHANGED = wxEVT_FIRST + 425; +static const wxEventType wxEVT_SETTING_CHANGED = wxEVT_FIRST + 426; +static const wxEventType wxEVT_QUERY_NEW_PALETTE = wxEVT_FIRST + 427; +static const wxEventType wxEVT_PALETTE_CHANGED = wxEVT_FIRST + 428; +static const wxEventType wxEVT_JOY_BUTTON_DOWN = wxEVT_FIRST + 429; +static const wxEventType wxEVT_JOY_BUTTON_UP = wxEVT_FIRST + 430; +static const wxEventType wxEVT_JOY_MOVE = wxEVT_FIRST + 431; +static const wxEventType wxEVT_JOY_ZMOVE = wxEVT_FIRST + 432; +static const wxEventType wxEVT_DROP_FILES = wxEVT_FIRST + 433; +static const wxEventType wxEVT_DRAW_ITEM = wxEVT_FIRST + 434; +static const wxEventType wxEVT_MEASURE_ITEM = wxEVT_FIRST + 435; +static const wxEventType wxEVT_COMPARE_ITEM = wxEVT_FIRST + 436; +static const wxEventType wxEVT_INIT_DIALOG = wxEVT_FIRST + 437; +static const wxEventType wxEVT_IDLE = wxEVT_FIRST + 438; +static const wxEventType wxEVT_UPDATE_UI = wxEVT_FIRST + 439; + + /* System misc. */ +static const wxEventType wxEVT_END_PROCESS = wxEVT_FIRST + 440; + + /* Dial up events */ +static const wxEventType wxEVT_DIALUP_CONNECTED = wxEVT_FIRST + 450; +static const wxEventType wxEVT_DIALUP_DISCONNECTED = wxEVT_FIRST + 451; + + /* Generic command events */ + /* Note: a click is a higher-level event than button down/up */ +static const wxEventType wxEVT_COMMAND_LEFT_CLICK = wxEVT_FIRST + 500; +static const wxEventType wxEVT_COMMAND_LEFT_DCLICK = wxEVT_FIRST + 501; +static const wxEventType wxEVT_COMMAND_RIGHT_CLICK = wxEVT_FIRST + 502; +static const wxEventType wxEVT_COMMAND_RIGHT_DCLICK = wxEVT_FIRST + 503; +static const wxEventType wxEVT_COMMAND_SET_FOCUS = wxEVT_FIRST + 504; +static const wxEventType wxEVT_COMMAND_KILL_FOCUS = wxEVT_FIRST + 505; +static const wxEventType wxEVT_COMMAND_ENTER = wxEVT_FIRST + 506; + + /* Tree control event types */ +static const wxEventType wxEVT_COMMAND_TREE_BEGIN_DRAG = wxEVT_FIRST + 600; +static const wxEventType wxEVT_COMMAND_TREE_BEGIN_RDRAG = wxEVT_FIRST + 601; +static const wxEventType wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT = wxEVT_FIRST + 602; +static const wxEventType wxEVT_COMMAND_TREE_END_LABEL_EDIT = wxEVT_FIRST + 603; +static const wxEventType wxEVT_COMMAND_TREE_DELETE_ITEM = wxEVT_FIRST + 604; +static const wxEventType wxEVT_COMMAND_TREE_GET_INFO = wxEVT_FIRST + 605; +static const wxEventType wxEVT_COMMAND_TREE_SET_INFO = wxEVT_FIRST + 606; +static const wxEventType wxEVT_COMMAND_TREE_ITEM_EXPANDED = wxEVT_FIRST + 607; +static const wxEventType wxEVT_COMMAND_TREE_ITEM_EXPANDING = wxEVT_FIRST + 608; +static const wxEventType wxEVT_COMMAND_TREE_ITEM_COLLAPSED = wxEVT_FIRST + 609; +static const wxEventType wxEVT_COMMAND_TREE_ITEM_COLLAPSING = wxEVT_FIRST + 610; +static const wxEventType wxEVT_COMMAND_TREE_SEL_CHANGED = wxEVT_FIRST + 611; +static const wxEventType wxEVT_COMMAND_TREE_SEL_CHANGING = wxEVT_FIRST + 612; +static const wxEventType wxEVT_COMMAND_TREE_KEY_DOWN = wxEVT_FIRST + 613; +static const wxEventType wxEVT_COMMAND_TREE_ITEM_ACTIVATED = wxEVT_FIRST + 614; +static const wxEventType wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK = wxEVT_FIRST + 615; +static const wxEventType wxEVT_COMMAND_TREE_ITEM_MIDDLE_CLICK = wxEVT_FIRST + 616; + + /* List control event types */ +static const wxEventType wxEVT_COMMAND_LIST_BEGIN_DRAG = wxEVT_FIRST + 700; +static const wxEventType wxEVT_COMMAND_LIST_BEGIN_RDRAG = wxEVT_FIRST + 701; +static const wxEventType wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT = wxEVT_FIRST + 702; +static const wxEventType wxEVT_COMMAND_LIST_END_LABEL_EDIT = wxEVT_FIRST + 703; +static const wxEventType wxEVT_COMMAND_LIST_DELETE_ITEM = wxEVT_FIRST + 704; +static const wxEventType wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS = wxEVT_FIRST + 705; +static const wxEventType wxEVT_COMMAND_LIST_GET_INFO = wxEVT_FIRST + 706; +static const wxEventType wxEVT_COMMAND_LIST_SET_INFO = wxEVT_FIRST + 707; +static const wxEventType wxEVT_COMMAND_LIST_ITEM_SELECTED = wxEVT_FIRST + 708; +static const wxEventType wxEVT_COMMAND_LIST_ITEM_DESELECTED = wxEVT_FIRST + 709; +static const wxEventType wxEVT_COMMAND_LIST_KEY_DOWN = wxEVT_FIRST + 710; +static const wxEventType wxEVT_COMMAND_LIST_INSERT_ITEM = wxEVT_FIRST + 711; +static const wxEventType wxEVT_COMMAND_LIST_COL_CLICK = wxEVT_FIRST + 712; +static const wxEventType wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK = wxEVT_FIRST + 713; +static const wxEventType wxEVT_COMMAND_LIST_ITEM_MIDDLE_CLICK = wxEVT_FIRST + 714; +static const wxEventType wxEVT_COMMAND_LIST_ITEM_ACTIVATED = wxEVT_FIRST + 715; + + /* Tab and notebook control event types */ +static const wxEventType wxEVT_COMMAND_TAB_SEL_CHANGED = wxEVT_FIRST + 800; +static const wxEventType wxEVT_COMMAND_TAB_SEL_CHANGING = wxEVT_FIRST + 801; +static const wxEventType wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED = wxEVT_FIRST + 802; +static const wxEventType wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING = wxEVT_FIRST + 803; + +/* Splitter events */ +static const wxEventType wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED = wxEVT_FIRST + 850; +static const wxEventType wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGING = wxEVT_FIRST + 851; +static const wxEventType wxEVT_COMMAND_SPLITTER_DOUBLECLICKED = wxEVT_FIRST + 852; +static const wxEventType wxEVT_COMMAND_SPLITTER_UNSPLIT = wxEVT_FIRST + 853; + +/* Wizard events */ +static const wxEventType wxEVT_WIZARD_PAGE_CHANGED = wxEVT_FIRST + 900; +static const wxEventType wxEVT_WIZARD_PAGE_CHANGING = wxEVT_FIRST + 901; +static const wxEventType wxEVT_WIZARD_CANCEL = wxEVT_FIRST + 902; + +/* Calendar events */ +static const wxEventType wxEVT_CALENDAR_SEL_CHANGED = wxEVT_FIRST + 950; +static const wxEventType wxEVT_CALENDAR_DAY_CHANGED = wxEVT_FIRST + 951; +static const wxEventType wxEVT_CALENDAR_MONTH_CHANGED = wxEVT_FIRST + 952; +static const wxEventType wxEVT_CALENDAR_YEAR_CHANGED = wxEVT_FIRST + 953; +static const wxEventType wxEVT_CALENDAR_DOUBLECLICKED = wxEVT_FIRST + 954; +static const wxEventType wxEVT_CALENDAR_WEEKDAY_CLICKED = wxEVT_FIRST + 955; + +static const wxEventType wxEVT_USER_FIRST = wxEVT_FIRST + 2000; + +#else // everybody else + const wxEventType wxEVT_NULL = 0; const wxEventType wxEVT_FIRST = 10000; @@ -68,6 +279,7 @@ const wxEventType wxEVT_COMMAND_VLBOX_SELECTED = wxEVT_FIRST + 14; const wxEventType wxEVT_COMMAND_COMBOBOX_SELECTED = wxEVT_FIRST + 15; const wxEventType wxEVT_COMMAND_TOOL_RCLICKED = wxEVT_FIRST + 16; const wxEventType wxEVT_COMMAND_TOOL_ENTER = wxEVT_FIRST + 17; +const wxEventType wxEVT_COMMAND_SPINCTRL_UPDATED = wxEVT_FIRST + 18; /* Sockets send events, too */ const wxEventType wxEVT_SOCKET = wxEVT_FIRST + 50; @@ -251,7 +463,17 @@ const wxEventType wxEVT_WIZARD_PAGE_CHANGED = wxEVT_FIRST + 900; const wxEventType wxEVT_WIZARD_PAGE_CHANGING = wxEVT_FIRST + 901; const wxEventType wxEVT_WIZARD_CANCEL = wxEVT_FIRST + 902; -const wxEventType wxEVT_USER_FIRST = wxEVT_FIRST + 2000; +/* Calendar events */ +const wxEventType wxEVT_CALENDAR_SEL_CHANGED = wxEVT_FIRST + 950; +const wxEventType wxEVT_CALENDAR_DAY_CHANGED = wxEVT_FIRST + 951; +const wxEventType wxEVT_CALENDAR_MONTH_CHANGED = wxEVT_FIRST + 952; +const wxEventType wxEVT_CALENDAR_YEAR_CHANGED = wxEVT_FIRST + 953; +const wxEventType wxEVT_CALENDAR_DOUBLECLICKED = wxEVT_FIRST + 954; +const wxEventType wxEVT_CALENDAR_WEEKDAY_CLICKED = wxEVT_FIRST + 955; + +const wxEventType wxEVT_USER_FIRST = wxEVT_FIRST + 2000; + +#endif // for VisualAge C++ V4.0 /* Compatibility */ @@ -437,6 +659,10 @@ public: // for implementation code only: is the operation allowed? bool IsAllowed() const { return m_bAllow; } + // probably useless: CopyObject() is used for deferred event + // handling but wxNotifyEvent must be processed immediately + void CopyObject(wxObject& obj) const; + private: bool m_bAllow; @@ -471,8 +697,14 @@ public: int GetOrientation() const { return (int) m_extraLong ; } int GetPosition() const { return m_commandInt ; } + bool IsScrolling() const { return m_isScrolling; } void SetOrientation(int orient) { m_extraLong = (long) orient; } void SetPosition(int pos) { m_commandInt = pos; } + void SetScrolling(bool isScrolling) { m_isScrolling = isScrolling; } + + void CopyObject(wxObject& obj) const; +public: + bool m_isScrolling; }; // ScrollWin event class, derived fom wxEvent. wxScrollWinEvents @@ -502,13 +734,16 @@ public: int GetOrientation() const { return (int) m_extraLong ; } int GetPosition() const { return m_commandInt ; } + bool IsScrolling() const { return m_isScrolling; } void SetOrientation(int orient) { m_extraLong = (long) orient; } void SetPosition(int pos) { m_commandInt = pos; } + void SetScrolling(bool isScrolling) { m_isScrolling = isScrolling; } void CopyObject(wxObject& object_dest) const; public: int m_commandInt; // Additional information - long m_extraLong; + long m_extraLong; + bool m_isScrolling; }; // Mouse event class @@ -607,8 +842,23 @@ public: bool Leaving() const { return (m_eventType == wxEVT_LEAVE_WINDOW); } // Find the position of the event - void GetPosition(long *xpos, long *ypos) const { *xpos = m_x; *ypos = m_y; } - void Position(long *xpos, long *ypos) const { *xpos = m_x; *ypos = m_y; } + void GetPosition(wxCoord *xpos, wxCoord *ypos) const + { + if (xpos) + *xpos = m_x; + if (ypos) + *ypos = m_y; + } + +#ifndef __WIN16__ + void GetPosition(long *xpos, long *ypos) const + { + if (xpos) + *xpos = (long)m_x; + if (ypos) + *ypos = (long)m_y; + } +#endif // Find the position of the event wxPoint GetPosition() const { return wxPoint(m_x, m_y); } @@ -618,6 +868,14 @@ public: // Compatibility #if WXWIN_COMPATIBILITY + void Position(long *xpos, long *ypos) const + { + if (xpos) + *xpos = (long)m_x; + if (ypos) + *ypos = (long)m_y; + } + void Position(float *xpos, float *ypos) const { *xpos = (float) m_x; *ypos = (float) m_y; @@ -633,8 +891,8 @@ public: void CopyObject(wxObject& obj) const; public: - long m_x; - long m_y; + wxCoord m_x, m_y; + bool m_leftDown; bool m_middleDown; bool m_rightDown; @@ -669,24 +927,36 @@ public: long KeyCode() const { return m_keyCode; } // Find the position of the event + void GetPosition(wxCoord *xpos, wxCoord *ypos) const + { + if (xpos) *xpos = m_x; + if (ypos) *ypos = m_y; + } + +#ifndef __WIN16__ void GetPosition(long *xpos, long *ypos) const - { *xpos = m_x; *ypos = m_y; } + { + if (xpos) *xpos = (long)m_x; + if (ypos) *ypos = (long)m_y; + } +#endif wxPoint GetPosition() const { return wxPoint(m_x, m_y); } // Get X position - long GetX() const { return m_x; } + wxCoord GetX() const { return m_x; } // Get Y position - long GetY() const { return m_y; } + wxCoord GetY() const { return m_y; } void CopyObject(wxObject& obj) const; public: - long m_x; - long m_y; + wxCoord m_x, m_y; + long m_keyCode; + bool m_controlDown; bool m_shiftDown; bool m_altDown; @@ -1193,27 +1463,56 @@ protected: Event generated by dialog navigation keys wxEVT_NAVIGATION_KEY */ -// must derive from command event to be propagated to the parent -class WXDLLEXPORT wxNavigationKeyEvent : public wxCommandEvent +// NB: don't derive from command event to avoid being propagated to the parent +class WXDLLEXPORT wxNavigationKeyEvent : public wxEvent { - DECLARE_DYNAMIC_CLASS(wxNavigationKeyEvent) - public: - wxNavigationKeyEvent() : wxCommandEvent(wxEVT_NAVIGATION_KEY) { } + wxNavigationKeyEvent() + { + SetEventType(wxEVT_NAVIGATION_KEY); + + m_flags = IsForward | Propagate; // defaults are for TAB + m_focus = (wxWindow *)NULL; + } // direction: forward (true) or backward (false) - bool GetDirection() const { return m_commandInt == 1; } - void SetDirection(bool bForward) { m_commandInt = bForward; } + bool GetDirection() const + { return (m_flags & IsForward) != 0; } + void SetDirection(bool bForward) + { if ( bForward ) m_flags |= IsForward; else m_flags &= ~IsForward; } // it may be a window change event (MDI, notebook pages...) or a control // change event - bool IsWindowChange() const { return m_extraLong == 1; } - void SetWindowChange(bool bIs) { m_extraLong = bIs; } + bool IsWindowChange() const + { return (m_flags & WinChange) != 0; } + void SetWindowChange(bool bIs) + { if ( bIs ) m_flags |= WinChange; else m_flags &= ~WinChange; } + + // some navigation events are meant to be propagated upwards (Windows + // convention is to do this for TAB events) while others should always + // cycle inside the panel/radiobox/whatever we're current inside + bool ShouldPropagate() const + { return (m_flags & Propagate) != 0; } + void SetPropagate(bool bDoIt) + { if ( bDoIt ) m_flags |= Propagate; else m_flags &= ~Propagate; } // the child which has the focus currently (may be NULL - use // wxWindow::FindFocus then) - wxWindow* GetCurrentFocus() const { return (wxWindow *)m_clientData; } - void SetCurrentFocus(wxWindow *win) { m_clientData = (void *)win; } + wxWindow* GetCurrentFocus() const { return m_focus; } + void SetCurrentFocus(wxWindow *win) { m_focus = win; } + +private: + enum + { + IsForward = 0x0001, + WinChange = 0x0002, + Propagate = 0x0004 + }; + + long m_flags; + wxWindow *m_focus; + + DECLARE_DYNAMIC_CLASS(wxNavigationKeyEvent) }; // Window creation/destruction events: the first is sent as soon as window is @@ -1281,6 +1580,10 @@ protected: wxEVT_COMPARE_ITEM */ +// ============================================================================ +// event handler and related classes +// ============================================================================ + typedef void (wxObject::*wxObjectEventFunction)(wxEvent&); struct WXDLLEXPORT wxEventTableEntry @@ -1314,31 +1617,22 @@ public: void SetNextHandler(wxEvtHandler *handler) { m_nextHandler = handler; } void SetPreviousHandler(wxEvtHandler *handler) { m_previousHandler = handler; } - void SetEvtHandlerEnabled(bool en) { m_enabled = en; } + void SetEvtHandlerEnabled(bool enabled) { m_enabled = enabled; } bool GetEvtHandlerEnabled() const { return m_enabled; } -#if WXWIN_COMPATIBILITY_2 - virtual void OnCommand(wxWindow& WXUNUSED(win), - wxCommandEvent& WXUNUSED(event)) - { - wxFAIL_MSG(wxT("shouldn't be called any more")); - } + // process an event right now + virtual bool ProcessEvent(wxEvent& event); - // Called if child control has no callback function - virtual long Default() - { return GetNextHandler() ? GetNextHandler()->Default() : 0; }; -#endif // WXWIN_COMPATIBILITY_2 + // add an event to be processed later + void AddPendingEvent(wxEvent& event); -#if WXWIN_COMPATIBILITY - virtual bool OnClose(); -#endif + // process all pending events + void ProcessPendingEvents(); + // add a #if wxUSE_THREADS bool ProcessThreadEvent(wxEvent& event); - void ProcessPendingEvents(); #endif - virtual bool ProcessEvent(wxEvent& event); - virtual bool SearchEventTable(wxEventTable& table, wxEvent& event); // Dynamic association of a member function handler with the event handler, // id and event type @@ -1352,14 +1646,50 @@ public: wxObject *userData = (wxObject *) NULL ) { Connect(id, -1, eventType, func, userData); } + bool Disconnect( int id, int lastId = -1, wxEventType eventType = wxEVT_NULL, + wxObjectEventFunction func = NULL, + wxObject *userData = (wxObject *) NULL ); + + // Convenience function: take just one id + bool Disconnect( int id, wxEventType eventType = wxEVT_NULL, + wxObjectEventFunction func = NULL, + wxObject *userData = (wxObject *) NULL ) + { return Disconnect(id, -1, eventType, func, userData); } + + // implementation from now on + virtual bool SearchEventTable(wxEventTable& table, wxEvent& event); bool SearchDynamicEventTable( wxEvent& event ); #if wxUSE_THREADS - void ClearEventLocker() { delete m_eventsLocker; m_eventsLocker = NULL; }; + void ClearEventLocker() + { +# if !defined(__VISAGECPP__) + delete m_eventsLocker; + m_eventsLocker = NULL; +#endif + }; +#endif + + // old stuff + +#if WXWIN_COMPATIBILITY_2 + virtual void OnCommand(wxWindow& WXUNUSED(win), + wxCommandEvent& WXUNUSED(event)) + { + wxFAIL_MSG(wxT("shouldn't be called any more")); + } + + // Called if child control has no callback function + virtual long Default() + { return GetNextHandler() ? GetNextHandler()->Default() : 0; }; +#endif // WXWIN_COMPATIBILITY_2 + +#if WXWIN_COMPATIBILITY + virtual bool OnClose(); #endif private: - static const wxEventTableEntry sm_eventTableEntries[]; + static const wxEventTableEntry sm_eventTableEntries[]; protected: static const wxEventTable sm_eventTable; @@ -1369,16 +1699,22 @@ protected: protected: wxEvtHandler* m_nextHandler; wxEvtHandler* m_previousHandler; - bool m_enabled; // Is event handler enabled? wxList* m_dynamicEvents; wxList* m_pendingEvents; #if wxUSE_THREADS +#if defined (__VISAGECPP__) + wxCriticalSection m_eventsLocker; +# else wxCriticalSection* m_eventsLocker; +# endif #endif // 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; + + // Is event handler enabled? + bool m_enabled; }; typedef void (wxEvtHandler::*wxEventFunction)(wxEvent&); @@ -1614,6 +1950,17 @@ const wxEventTableEntry theClass::sm_eventTableEntries[] = { \ #define EVT_UPDATE_UI(id, func) \ { wxEVT_UPDATE_UI, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxUpdateUIEventFunction) & func, (wxObject *) NULL },\ +// ---------------------------------------------------------------------------- +// Global data +// ---------------------------------------------------------------------------- + +// for pending event processing - notice that there is intentionally no +// WXDLLEXPORT here +extern wxList *wxPendingEvents; +#if wxUSE_THREADS + extern wxCriticalSection *wxPendingEventsLocker; +#endif + // ---------------------------------------------------------------------------- // Helper functions // ----------------------------------------------------------------------------