]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/event.h
Patch #826420, and also adapted to new SWIG
[wxWidgets.git] / include / wx / event.h
index 324cba4a3d03542633a589b2f08f4bb260972d93..f7ac632150bb2e5512ac22c02cede31c3ac9983b 100644 (file)
 #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
 
@@ -292,50 +299,6 @@ END_DECLARE_EVENT_TYPES()
     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
@@ -433,7 +396,7 @@ protected:
 public:
     bool              m_skipped;
     bool              m_isCommandEvent;
-    
+
 private:
     // it needs to access our m_propagationLevel
     friend class WXDLLIMPEXP_BASE wxPropagateOnce;
@@ -554,10 +517,6 @@ public:
 
     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;
@@ -701,10 +660,10 @@ private:
 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
@@ -717,19 +676,19 @@ public:
     // 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)
@@ -763,12 +722,14 @@ public:
     // 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); }
@@ -801,22 +762,6 @@ public:
     // 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; }
 
@@ -1312,22 +1257,13 @@ public:
         : 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; }
@@ -1345,24 +1281,12 @@ public:
     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)
 
@@ -1809,9 +1733,11 @@ class WXDLLIMPEXP_CORE wxNavigationKeyEvent : public wxEvent
 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),
@@ -1832,14 +1758,6 @@ public:
     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; }
@@ -1851,8 +1769,7 @@ private:
     enum
     {
         IsForward = 0x0001,
-        WinChange = 0x0002,
-        Propagate = 0x0004
+        WinChange = 0x0002
     };
 
     long m_flags;
@@ -2146,7 +2063,7 @@ struct WXDLLIMPEXP_BASE wxDynamicEventTableEntry : public wxEventTableEntryBase
     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;
 
@@ -2169,7 +2086,7 @@ struct WXDLLIMPEXP_BASE wxEventTable
 // 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
@@ -2185,17 +2102,23 @@ private:
 
 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();
@@ -2203,7 +2126,7 @@ protected:
     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();
 
@@ -2214,6 +2137,10 @@ protected:
     size_t                 m_size;
     EventTypeTablePointer *m_eventTypeTable;
 
+    static wxEventHashTable* sm_first;
+    wxEventHashTable* m_previous;
+    wxEventHashTable* m_next;
+
     DECLARE_NO_COPY_CLASS(wxEventHashTable)
 };
 
@@ -2244,7 +2171,6 @@ public:
     // process all pending events
     void ProcessPendingEvents();
 
-    // add a
 #if wxUSE_THREADS
     bool ProcessThreadEvent(wxEvent& event);
 #endif
@@ -2275,6 +2201,7 @@ public:
                   wxEvtHandler *eventSink = (wxEvtHandler *) NULL )
         { return Disconnect(winid, wxID_ANY, eventType, func, userData, eventSink); }
 
+    wxList* GetDynamicEventTable() const { return m_dynamicEvents ; }
 
     // User data can be associated with each wxEvtHandler
     void SetClientObject( wxClientData *data ) { DoSetClientObject(data); }
@@ -2283,38 +2210,25 @@ public:
     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[];
@@ -2323,11 +2237,15 @@ protected:
     // 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
@@ -2336,7 +2254,7 @@ protected:
     virtual bool TryParent(wxEvent& event);
 
 
-    static const wxEventTable sm_eventTable;    
+    static const wxEventTable sm_eventTable;
     virtual const wxEventTable *GetEventTable() const;
 
     static wxEventHashTable   sm_eventHashTable;