]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/event.cpp
Changed how the dynamic event tables (used for all Python wx classes,
[wxWidgets.git] / src / common / event.cpp
index 0483535a01904cdf2ef8d67bb40aaf04e59d7f60..29c728164fbed98d1daf96e482cf9db55614a697 100644 (file)
@@ -190,6 +190,7 @@ DEFINE_EVENT_TYPE(wxEVT_SCROLL_PAGEUP)
 DEFINE_EVENT_TYPE(wxEVT_SCROLL_PAGEDOWN)
 DEFINE_EVENT_TYPE(wxEVT_SCROLL_THUMBTRACK)
 DEFINE_EVENT_TYPE(wxEVT_SCROLL_THUMBRELEASE)
+DEFINE_EVENT_TYPE(wxEVT_SCROLL_ENDSCROLL)
 
 // Scroll events from wxWindow
 DEFINE_EVENT_TYPE(wxEVT_SCROLLWIN_TOP)
@@ -386,6 +387,27 @@ wxMouseEvent::wxMouseEvent(wxEventType commandType)
     m_linesPerAction = 0;
 }
 
+void wxMouseEvent::Assign(const wxMouseEvent& event)
+{
+    m_eventType = event.m_eventType;
+
+    m_x = event.m_x;
+    m_y = event.m_y;
+
+    m_leftDown = event.m_leftDown;
+    m_middleDown = event.m_middleDown;
+    m_rightDown = event.m_rightDown;
+
+    m_controlDown = event.m_controlDown;
+    m_shiftDown = event.m_shiftDown;
+    m_altDown = event.m_altDown;
+    m_metaDown = event.m_metaDown;
+
+    m_wheelRotation = event.m_wheelRotation;
+    m_wheelDelta = event.m_wheelDelta;
+    m_linesPerAction = event.m_linesPerAction;
+}
+
 // True if was a button dclick event (1 = left, 2 = middle, 3 = right)
 // or any button dclick event (but = -1)
 bool wxMouseEvent::ButtonDClick(int but) const
@@ -523,8 +545,36 @@ wxKeyEvent::wxKeyEvent(wxEventType type)
     m_altDown = FALSE;
     m_keyCode = 0;
     m_scanCode = 0;
+#if wxUSE_UNICODE
+    m_uniChar = 0;
+#endif
+}
+
+wxKeyEvent::wxKeyEvent(const wxKeyEvent& evt)
+    : wxEvent(evt)
+{
+    m_x = evt.m_x;
+    m_y = evt.m_y;
+
+    m_keyCode = evt.m_keyCode;
+
+    m_controlDown = evt.m_controlDown;
+    m_shiftDown = evt.m_shiftDown;
+    m_altDown = evt.m_altDown;
+    m_metaDown = evt.m_metaDown;
+    m_scanCode = evt.m_scanCode;
+    m_rawCode = evt.m_rawCode;
+    m_rawFlags = evt.m_rawFlags;
+
+#if wxUSE_UNICODE
+    m_uniChar = evt.m_uniChar;
+#endif
 }
 
+long wxKeyEvent::KeyCode() const
+{
+    return m_keyCode;
+}
 
 wxWindowCreateEvent::wxWindowCreateEvent(wxWindow *win)
 {
@@ -583,19 +633,19 @@ wxEvtHandler::~wxEvtHandler()
 
     if (m_dynamicEvents)
     {
-        wxNode *node = m_dynamicEvents->First();
+        wxNode *node = m_dynamicEvents->GetFirst();
         while (node)
         {
 #if WXWIN_COMPATIBILITY_EVENT_TYPES
-            wxEventTableEntry *entry = (wxEventTableEntry*)node->Data();
+            wxEventTableEntry *entry = (wxEventTableEntry*)node->GetData();
 #else // !WXWIN_COMPATIBILITY_EVENT_TYPES
-            wxDynamicEventTableEntry *entry = (wxDynamicEventTableEntry*)node->Data();
+            wxDynamicEventTableEntry *entry = (wxDynamicEventTableEntry*)node->GetData();
 #endif // WXWIN_COMPATIBILITY_EVENT_TYPES/!WXWIN_COMPATIBILITY_EVENT_TYPES
 
             if (entry->m_callbackUserData)
                 delete entry->m_callbackUserData;
             delete entry;
-            node = node->Next();
+            node = node->GetNext();
         }
         delete m_dynamicEvents;
     };
@@ -680,10 +730,10 @@ void wxEvtHandler::ProcessPendingEvents()
     wxENTER_CRIT_SECT( *m_eventsLocker);
 #endif
 
-    wxNode *node = m_pendingEvents->First();
+    wxNode *node = m_pendingEvents->GetFirst();
     while ( node )
     {
-        wxEvent *event = (wxEvent *)node->Data();
+        wxEvent *event = (wxEvent *)node->GetData();
         delete node;
 
         // In ProcessEvent, new events might get added and
@@ -701,7 +751,7 @@ void wxEvtHandler::ProcessPendingEvents()
         wxENTER_CRIT_SECT( *m_eventsLocker);
 #endif
 
-        node = m_pendingEvents->First();
+        node = m_pendingEvents->GetFirst();
     }
 
 #if defined(__VISAGECPP__)
@@ -744,12 +794,32 @@ bool wxEvtHandler::ProcessEvent(wxEvent& event)
     info = CLASSINFO(wxWindow);
 #endif
 
-    wxASSERT_MSG( m_isWindow == IsKindOf(info),
-                  wxString(GetClassInfo()->GetClassName()) + _T(" should [not] be a window but it is [not]") );
-#endif
+    if ( m_isWindow != IsKindOf(info) )
+    {
+        wxString msg = GetClassInfo()->GetClassName();
+        msg += _T(" should [not] be a window but it is [not]");
+
+        wxFAIL_MSG( msg );
+    }
+
+#endif // __WXDEBUG__
 
 #endif // wxUSE_GUI
 
+    // allow the application to hook into event processing
+    if ( wxTheApp )
+    {
+        int rc = wxTheApp->FilterEvent(event);
+        if ( rc != -1 )
+        {
+            wxASSERT_MSG( rc == 1 || rc == 0,
+                          _T("unexpected wxApp::FilterEvent return value") );
+
+            return rc != 0;
+        }
+        //else: proceed normally
+    }
+
     // An event handler can be enabled or disabled
     if ( GetEvtHandlerEnabled() )
     {
@@ -916,7 +986,8 @@ void wxEvtHandler::Connect( int id, int lastId,
     if (!m_dynamicEvents)
         m_dynamicEvents = new wxList;
 
-    m_dynamicEvents->Append( (wxObject*) entry );
+    // Insert at the front of the list so most recent additions are found first
+    m_dynamicEvents->Insert( (wxObject*) entry );
 }
 
 bool wxEvtHandler::Disconnect( int id, int lastId, wxEventType eventType,
@@ -926,13 +997,13 @@ bool wxEvtHandler::Disconnect( int id, int lastId, wxEventType eventType,
     if (!m_dynamicEvents)
         return FALSE;
 
-    wxNode *node = m_dynamicEvents->First();
+    wxNode *node = m_dynamicEvents->GetFirst();
     while (node)
     {
 #if WXWIN_COMPATIBILITY_EVENT_TYPES
-            wxEventTableEntry *entry = (wxEventTableEntry*)node->Data();
+            wxEventTableEntry *entry = (wxEventTableEntry*)node->GetData();
 #else // !WXWIN_COMPATIBILITY_EVENT_TYPES
-            wxDynamicEventTableEntry *entry = (wxDynamicEventTableEntry*)node->Data();
+            wxDynamicEventTableEntry *entry = (wxDynamicEventTableEntry*)node->GetData();
 #endif // WXWIN_COMPATIBILITY_EVENT_TYPES/!WXWIN_COMPATIBILITY_EVENT_TYPES
 
         if ((entry->m_id == id) &&
@@ -947,7 +1018,7 @@ bool wxEvtHandler::Disconnect( int id, int lastId, wxEventType eventType,
             delete entry;
             return TRUE;
         }
-        node = node->Next();
+        node = node->GetNext();
     }
     return FALSE;
 }
@@ -959,13 +1030,13 @@ bool wxEvtHandler::SearchDynamicEventTable( wxEvent& event )
 
     int commandId = event.GetId();
 
-    wxNode *node = m_dynamicEvents->First();
+    wxNode *node = m_dynamicEvents->GetFirst();
     while (node)
     {
 #if WXWIN_COMPATIBILITY_EVENT_TYPES
-            wxEventTableEntry *entry = (wxEventTableEntry*)node->Data();
+            wxEventTableEntry *entry = (wxEventTableEntry*)node->GetData();
 #else // !WXWIN_COMPATIBILITY_EVENT_TYPES
-            wxDynamicEventTableEntry *entry = (wxDynamicEventTableEntry*)node->Data();
+            wxDynamicEventTableEntry *entry = (wxDynamicEventTableEntry*)node->GetData();
 #endif // WXWIN_COMPATIBILITY_EVENT_TYPES/!WXWIN_COMPATIBILITY_EVENT_TYPES
 
         if (entry->m_fn)
@@ -982,13 +1053,11 @@ bool wxEvtHandler::SearchDynamicEventTable( wxEvent& event )
 
                 (this->*((wxEventFunction) (entry->m_fn)))(event);
 
-                if (event.GetSkipped())
-                    return FALSE;
-                else
+                if ( ! event.GetSkipped() )
                     return TRUE;
             }
         }
-        node = node->Next();
+        node = node->GetNext();
     }
     return FALSE;
 };