#ifndef _WX_EVENT_H__
#define _WX_EVENT_H__
-#if defined(__GNUG__) && !defined(__APPLE__)
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) && !defined(__EMX__)
+// Some older compilers (such as EMX) cannot handle
+// #pragma interface/implementation correctly, iff
+// #pragma implementation is used in _two_ translation
+// units (as created by e.g. event.cpp compiled for
+// libwx_base and event.cpp compiled for libwx_gui_core).
+// So we must not use those pragmas for those compilers in
+// such files.
#pragma interface "event.h"
#endif
extern const wxEventType WXDLLIMPEXP_CORE wxEVT_COMMAND_TEXT_UPDATED;
#endif
-#if WXWIN_COMPATIBILITY
-
-#define wxEVENT_TYPE_BUTTON_COMMAND wxEVT_COMMAND_BUTTON_CLICKED
-#define wxEVENT_TYPE_CHECKBOX_COMMAND wxEVT_COMMAND_CHECKBOX_CLICKED
-#define wxEVENT_TYPE_CHOICE_COMMAND wxEVT_COMMAND_CHOICE_SELECTED
-#define wxEVENT_TYPE_LISTBOX_COMMAND wxEVT_COMMAND_LISTBOX_SELECTED
-#define wxEVENT_TYPE_LISTBOX_DCLICK_COMMAND wxEVT_COMMAND_LISTBOX_DOUBLECLICKED
-#define wxEVENT_TYPE_TEXT_COMMAND wxEVT_COMMAND_TEXT_UPDATED
-#define wxEVENT_TYPE_MULTITEXT_COMMAND wxEVT_COMMAND_TEXT_UPDATED
-#define wxEVENT_TYPE_MENU_COMMAND wxEVT_COMMAND_MENU_SELECTED
-#define wxEVENT_TYPE_SLIDER_COMMAND wxEVT_COMMAND_SLIDER_UPDATED
-#define wxEVENT_TYPE_RADIOBOX_COMMAND wxEVT_COMMAND_RADIOBOX_SELECTED
-#define wxEVENT_TYPE_RADIOBUTTON_COMMAND wxEVT_COMMAND_RADIOBUTTON_SELECTED
-#define wxEVENT_TYPE_TEXT_ENTER_COMMAND wxEVT_COMMAND_TEXT_ENTER
-#define wxEVENT_TYPE_SET_FOCUS wxEVT_SET_FOCUS
-#define wxEVENT_TYPE_KILL_FOCUS wxEVT_KILL_FOCUS
-#define wxEVENT_TYPE_SCROLLBAR_COMMAND wxEVT_COMMAND_SCROLLBAR_UPDATED
-#define wxEVENT_TYPE_VIRT_LISTBOX_COMMAND wxEVT_COMMAND_VLBOX_SELECTED
-#define wxEVENT_TYPE_COMBOBOX_COMMAND wxEVT_COMMAND_COMBOBOX_SELECTED
-
-#define wxEVENT_TYPE_LEFT_DOWN wxEVT_LEFT_DOWN
-#define wxEVENT_TYPE_LEFT_UP wxEVT_LEFT_UP
-#define wxEVENT_TYPE_MIDDLE_DOWN wxEVT_MIDDLE_DOWN
-#define wxEVENT_TYPE_MIDDLE_UP wxEVT_MIDDLE_UP
-#define wxEVENT_TYPE_RIGHT_DOWN wxEVT_RIGHT_DOWN
-#define wxEVENT_TYPE_RIGHT_UP wxEVT_RIGHT_UP
-#define wxEVENT_TYPE_MOTION wxEVT_MOTION
-#define wxEVENT_TYPE_ENTER_WINDOW wxEVT_ENTER_WINDOW
-#define wxEVENT_TYPE_LEAVE_WINDOW wxEVT_LEAVE_WINDOW
-#define wxEVENT_TYPE_LEFT_DCLICK wxEVT_LEFT_DCLICK
-#define wxEVENT_TYPE_MIDDLE_DCLICK wxEVT_MIDDLE_DCLICK
-#define wxEVENT_TYPE_RIGHT_DCLICK wxEVT_RIGHT_DCLICK
-#define wxEVENT_TYPE_CHAR wxEVT_CHAR
-#define wxEVENT_TYPE_SCROLL_TOP wxEVT_SCROLL_TOP
-#define wxEVENT_TYPE_SCROLL_BOTTOM wxEVT_SCROLL_BOTTOM
-#define wxEVENT_TYPE_SCROLL_LINEUP wxEVT_SCROLL_LINEUP
-#define wxEVENT_TYPE_SCROLL_LINEDOWN wxEVT_SCROLL_LINEDOWN
-#define wxEVENT_TYPE_SCROLL_PAGEUP wxEVT_SCROLL_PAGEUP
-#define wxEVENT_TYPE_SCROLL_PAGEDOWN wxEVT_SCROLL_PAGEDOWN
-#define wxEVENT_TYPE_SCROLL_THUMBTRACK wxEVT_SCROLL_THUMBTRACK
-#define wxEVENT_TYPE_SCROLL_ENDSCROLL wxEVT_SCROLL_ENDSCROLL
-
-#endif // WXWIN_COMPATIBILITY
-
// the predefined constants for the number of times we propagate event
// upwards window child-parent chain
enum Propagation_state
public:
bool m_skipped;
bool m_isCommandEvent;
-
+
private:
// it needs to access our m_propagationLevel
friend class WXDLLIMPEXP_BASE wxPropagateOnce;
virtual wxEvent *Clone() const { return new wxCommandEvent(*this); }
-#if WXWIN_COMPATIBILITY_2
- bool Checked() const { return IsChecked(); }
-#endif // WXWIN_COMPATIBILITY_2
-
public:
wxString m_commandString; // String event argument
int m_commandInt;
enum
{
wxMOUSE_BTN_ANY = -1,
- wxMOUSE_BTN_NONE = -1,
- wxMOUSE_BTN_LEFT = 0,
- wxMOUSE_BTN_MIDDLE = 1,
- wxMOUSE_BTN_RIGHT = 2
+ wxMOUSE_BTN_NONE = 0,
+ wxMOUSE_BTN_LEFT = 1,
+ wxMOUSE_BTN_MIDDLE = 2,
+ wxMOUSE_BTN_RIGHT = 3
};
class WXDLLIMPEXP_CORE wxMouseEvent : public wxEvent
// Was it a button event? (*doesn't* mean: is any button *down*?)
bool IsButton() const { return Button(wxMOUSE_BTN_ANY); }
- // Was it a down event from button 1, 2 or 3 or any?
+ // Was it a down event from this (or any) button?
bool ButtonDown(int but = wxMOUSE_BTN_ANY) const;
- // Was it a dclick event from button 1, 2 or 3 or any?
+ // Was it a dclick event from this (or any) button?
bool ButtonDClick(int but = wxMOUSE_BTN_ANY) const;
- // Was it a up event from button 1, 2 or 3 or any?
+ // Was it a up event from this (or any) button?
bool ButtonUp(int but = wxMOUSE_BTN_ANY) const;
- // Was the given button 1,2,3 or any changing state?
+ // Was the given button?
bool Button(int but) const;
- // Was the given button 1,2,3 or any in Down state?
+ // Was the given button in Down state?
bool ButtonIsDown(int but) const;
// Get the button which is changing state (wxMOUSE_BTN_NONE if none)
// True if a button is down and the mouse is moving
bool Dragging() const
{
- return ((m_eventType == wxEVT_MOTION) &&
- (LeftIsDown() || MiddleIsDown() || RightIsDown()));
+ return (m_eventType == wxEVT_MOTION) && ButtonIsDown(wxMOUSE_BTN_ANY);
}
// True if the mouse is moving, and no button is down
- bool Moving() const { return (m_eventType == wxEVT_MOTION); }
+ bool Moving() const
+ {
+ return (m_eventType == wxEVT_MOTION) && !ButtonIsDown(wxMOUSE_BTN_ANY);
+ }
// True if the mouse is just entering the window
bool Entering() const { return (m_eventType == wxEVT_ENTER_WINDOW); }
// Find the logical position of the event given the DC
wxPoint GetLogicalPosition(const wxDC& dc) const;
- // 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;
- }
-#endif // WXWIN_COMPATIBILITY
-
// Get X position
wxCoord GetX() const { return m_x; }
: wxEvent(winid, type),
m_loggingOff(TRUE),
m_veto(FALSE), // should be FALSE by default
- m_canVeto(TRUE)
- {
-#if WXWIN_COMPATIBILITY
- m_force = FALSE;
-#endif // WXWIN_COMPATIBILITY
- }
+ m_canVeto(TRUE) {}
+
wxCloseEvent(const wxCloseEvent & event)
: wxEvent(event),
m_loggingOff(event.m_loggingOff),
m_veto(event.m_veto),
- m_canVeto(event.m_canVeto)
- {
-#if WXWIN_COMPATIBILITY
- m_force = event.m_force;
-#endif // WXWIN_COMPATIBILITY
- }
+ m_canVeto(event.m_canVeto) {}
void SetLoggingOff(bool logOff) { m_loggingOff = logOff; }
bool GetLoggingOff() const { return m_loggingOff; }
bool CanVeto() const { return m_canVeto; }
bool GetVeto() const { return m_canVeto && m_veto; }
-#if WXWIN_COMPATIBILITY
- // This is probably obsolete now, since we use CanVeto instead, in
- // both OnCloseWindow and OnQueryEndSession.
- // m_force == ! m_canVeto i.e., can't veto means we must force it to close.
- void SetForce(bool force) { m_force = force; }
- bool GetForce() const { return m_force; }
-#endif
-
virtual wxEvent *Clone() const { return new wxCloseEvent(*this); }
protected:
bool m_loggingOff;
bool m_veto, m_canVeto;
-#if WXWIN_COMPATIBILITY
- bool m_force;
-#endif
-
private:
DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxCloseEvent)
public:
wxNavigationKeyEvent()
: wxEvent(0, wxEVT_NAVIGATION_KEY),
- m_flags(IsForward | Propagate), // defaults are for TAB
+ m_flags(IsForward), // defaults are for TAB
m_focus((wxWindow *)NULL)
- { }
+ {
+ m_propagationLevel = wxEVENT_PROPAGATE_NONE;
+ }
wxNavigationKeyEvent(const wxNavigationKeyEvent& event)
: wxEvent(event),
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 m_focus; }
enum
{
IsForward = 0x0001,
- WinChange = 0x0002,
- Propagate = 0x0004
+ WinChange = 0x0002
};
long m_flags;
int m_eventType;
// Pointer to object whose function is fn - so we don't assume the
- // EventFunction is always a member of the EventHandler receiving the
+ // EventFunction is always a member of the EventHandler receiving the
// message
wxEvtHandler* m_eventSink;
// wxEventHashTable: a helper of wxEvtHandler to speed up wxEventTable lookups.
// ----------------------------------------------------------------------------
-WX_DEFINE_ARRAY_NO_PTR(const wxEventTableEntry*, wxEventTableEntryPointerArray);
+WX_DEFINE_ARRAY_PTR(const wxEventTableEntry*, wxEventTableEntryPointerArray);
class WXDLLIMPEXP_BASE wxEvtHandler;
class WXDLLIMPEXP_BASE wxEventHashTable
public:
// Constructor, needs the event table it needs to hash later on.
- // Note: hashing of the event table is not done in the constructor as it
- // can be that the event table is not yet full initialize, the hash
+ // Note: hashing of the event table is not done in the constructor as it
+ // can be that the event table is not yet full initialize, the hash
// will gets initialized when handling the first event look-up request.
wxEventHashTable(const wxEventTable &table);
// Destructor.
~wxEventHashTable();
- // Handle the given event, in other words search the event table hash
+ // Handle the given event, in other words search the event table hash
// and call self->ProcessEvent() if a match was found.
bool HandleEvent(wxEvent &event, wxEvtHandler *self);
+ // Clear table
+ void Clear();
+
+ // Clear all tables
+ static void ClearAll();
+
protected:
// Init the hash table with the entries of the static event table.
void InitHashTable();
void AddEntry(const wxEventTableEntry &entry);
// Allocate and init with null pointers the base hash table.
void AllocEventTypeTable(size_t size);
- // Grow the hash table in size and transfer all items currently
+ // Grow the hash table in size and transfer all items currently
// in the table to the correct location in the new table.
void GrowEventTypeTable();
size_t m_size;
EventTypeTablePointer *m_eventTypeTable;
+ static wxEventHashTable* sm_first;
+ wxEventHashTable* m_previous;
+ wxEventHashTable* m_next;
+
DECLARE_NO_COPY_CLASS(wxEventHashTable)
};
// process all pending events
void ProcessPendingEvents();
- // add a
#if wxUSE_THREADS
bool ProcessThreadEvent(wxEvent& event);
#endif
void SetClientData( void *data ) { DoSetClientData(data); }
void *GetClientData() const { return DoGetClientData(); }
+ // check if the given event table entry matches this event and call the
+ // handler if it does
+ //
+ // return true if the event was processed, false otherwise (no match or the
+ // handler decided to skip the event)
+ static bool ProcessEventIfMatches(const wxEventTableEntryBase& tableEntry,
+ wxEvtHandler *handler,
+ wxEvent& event);
// implementation from now on
virtual bool SearchEventTable(wxEventTable& table, wxEvent& event);
bool SearchDynamicEventTable( wxEvent& event );
#if wxUSE_THREADS
- 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"));
- }
+ void ClearEventLocker();
+#endif // wxUSE_THREADS
- // 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
+ // Avoid problems at exit by cleaning up static hash table gracefully
+ void ClearEventHashTable() { GetEventHashTable().Clear(); }
private:
static const wxEventTableEntry sm_eventTableEntries[];
// hooks for wxWindow used by ProcessEvent()
// -----------------------------------------
- // this one is called before trying our own event table to allow plugging
- // in the validators
-#if wxUSE_VALIDATORS
+ // This one is called before trying our own event table to allow plugging
+ // in the validators.
+ //
+ // NB: This method is intentionally *not* inside wxUSE_VALIDATORS!
+ // It is part of wxBase which doesn't use validators and the code
+ // is compiled out when building wxBase w/o GUI classes, which affects
+ // binary compatiblity and wxBase library can't be used by GUI
+ // ports.
virtual bool TryValidator(wxEvent& WXUNUSED(event)) { return false; }
-#endif // wxUSE_VALIDATORS
// this one is called after failing to find the event handle in our own
// table to give a chance to the other windows to process it
virtual bool TryParent(wxEvent& event);
- static const wxEventTable sm_eventTable;
+ static const wxEventTable sm_eventTable;
virtual const wxEventTable *GetEventTable() const;
static wxEventHashTable sm_eventHashTable;