fix VC6 ICE; don't call the function which doesn't compare the objects operator==() (see #10000)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@58049 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2009-01-12 16:51:14 +00:00
parent eed7443b52
commit 03f3617bf3
2 changed files with 61 additions and 62 deletions

View File

@@ -199,9 +199,12 @@ class WXDLLIMPEXP_BASE wxEventFunctor
public: public:
virtual ~wxEventFunctor(); virtual ~wxEventFunctor();
// this operator is used to actually invoke the event handler
virtual void operator()(wxEvtHandler *, wxEvent &) = 0; virtual void operator()(wxEvtHandler *, wxEvent &) = 0;
virtual bool operator==(const wxEventFunctor& other) const = 0; // this function tests whether this functor is matched, for the purpose of
// finding it in an event table in Disconnect(), by the given func
virtual bool Matches(const wxEventFunctor& func) const = 0;
virtual wxEvtHandler *GetHandler() const { return NULL; } virtual wxEvtHandler *GetHandler() const { return NULL; }
@@ -225,13 +228,12 @@ public:
(realHandler->*m_method)(event); (realHandler->*m_method)(event);
} }
virtual bool operator==(const wxEventFunctor& other) const virtual bool Matches(const wxEventFunctor& other) const
{ {
wxEvtHandler * const handler = other.GetHandler(); wxEvtHandler * const handler = other.GetHandler();
const wxObjectEventFunction method = other.GetMethod();
return (m_handler == handler || !handler) && return (m_handler == handler || !handler) &&
(m_method == method || !method); (m_method == other.GetMethod());
} }
virtual wxEvtHandler *GetHandler() const { return m_handler; } virtual wxEvtHandler *GetHandler() const { return m_handler; }
@@ -242,6 +244,24 @@ private:
wxObjectEventFunction m_method; wxObjectEventFunction m_method;
}; };
// Create a functor for the legacy events: handler can be NULL
inline wxObjectEventFunctor *
wxNewEventFunctor(wxEventType WXUNUSED(evtType),
wxObjectEventFunction method,
wxEvtHandler *handler)
{
return new wxObjectEventFunctor(method, handler);
}
inline wxObjectEventFunctor
wxConstructEventFunctor(wxEventType WXUNUSED(evtType),
wxObjectEventFunction method,
wxEvtHandler *handler)
{
return wxObjectEventFunctor(method, handler);
}
#if !wxEVENTS_COMPATIBILITY_2_8 #if !wxEVENTS_COMPATIBILITY_2_8
template <typename EventType> template <typename EventType>
@@ -262,7 +282,7 @@ public:
( *m_handler )( dynamic_cast< typename EventType::CorrespondingEvent & >( event )); ( *m_handler )( dynamic_cast< typename EventType::CorrespondingEvent & >( event ));
} }
virtual bool operator == ( const wxEventFunctor &right ) const virtual bool Matches( const wxEventFunctor &right ) const
{ {
wxEventFunctorFunction const &other = dynamic_cast< wxEventFunctorFunction const & >( right ); wxEventFunctorFunction const &other = dynamic_cast< wxEventFunctorFunction const & >( right );
@@ -307,7 +327,7 @@ public:
( realHandler->*m_method )( dynamic_cast< typename EventType::CorrespondingEvent & >( event )); ( realHandler->*m_method )( dynamic_cast< typename EventType::CorrespondingEvent & >( event ));
} }
virtual bool operator == ( const wxEventFunctor &right ) const virtual bool Matches( const wxEventFunctor &right ) const
{ {
wxEventFunctorMethod const &other = dynamic_cast< wxEventFunctorMethod const & >( right ); wxEventFunctorMethod const &other = dynamic_cast< wxEventFunctorMethod const & >( right );
@@ -355,7 +375,7 @@ public:
m_functor( dynamic_cast< typename EventType::CorrespondingEvent & >( event )); m_functor( dynamic_cast< typename EventType::CorrespondingEvent & >( event ));
} }
virtual bool operator == ( const wxEventFunctor &right ) const virtual bool Matches( const wxEventFunctor &right ) const
{ {
wxEventFunctorAdapter const &other = dynamic_cast< wxEventFunctorAdapter const & >( right ); wxEventFunctorAdapter const &other = dynamic_cast< wxEventFunctorAdapter const & >( right );
@@ -366,28 +386,6 @@ private:
Functor m_functor; Functor m_functor;
}; };
#endif // wxEVENTS_COMPATIBILITY_2_8
// Create a functor for the legacy events:
inline wxObjectEventFunctor *
wxNewEventFunctor(wxEventType WXUNUSED(evtType),
wxObjectEventFunction method,
wxEvtHandler *handler = NULL)
{
return new wxObjectEventFunctor(method, handler);
}
inline wxObjectEventFunctor
wxConstructEventFunctor(wxEventType WXUNUSED(evtType),
wxObjectEventFunction method,
wxEvtHandler *handler = NULL)
{
return wxObjectEventFunctor(method, handler);
}
#if !wxEVENTS_COMPATIBILITY_2_8
// //
// Create functors for the templatized events (needed in wxEvtHandler::Connect): // Create functors for the templatized events (needed in wxEvtHandler::Connect):
// //
@@ -1495,7 +1493,7 @@ private:
class WXDLLIMPEXP_CORE wxEraseEvent : public wxEvent class WXDLLIMPEXP_CORE wxEraseEvent : public wxEvent
{ {
public: public:
wxEraseEvent(int Id = 0, wxDC *dc = (wxDC *) NULL) wxEraseEvent(int Id = 0, wxDC *dc = NULL)
: wxEvent(Id, wxEVT_ERASE_BACKGROUND), : wxEvent(Id, wxEVT_ERASE_BACKGROUND),
m_dc(dc) m_dc(dc)
{ } { }
@@ -1890,7 +1888,7 @@ public:
wxDropFilesEvent(wxEventType type = wxEVT_NULL, wxDropFilesEvent(wxEventType type = wxEVT_NULL,
int noFiles = 0, int noFiles = 0,
wxString *files = (wxString *) NULL) wxString *files = NULL)
: wxEvent(0, type), : wxEvent(0, type),
m_noFiles(noFiles), m_noFiles(noFiles),
m_pos(), m_pos(),
@@ -2123,7 +2121,7 @@ class WXDLLIMPEXP_CORE wxPaletteChangedEvent : public wxEvent
public: public:
wxPaletteChangedEvent(wxWindowID winid = 0) wxPaletteChangedEvent(wxWindowID winid = 0)
: wxEvent(winid, wxEVT_PALETTE_CHANGED), : wxEvent(winid, wxEVT_PALETTE_CHANGED),
m_changedWindow((wxWindow *) NULL) m_changedWindow(NULL)
{ } { }
wxPaletteChangedEvent(const wxPaletteChangedEvent& event) wxPaletteChangedEvent(const wxPaletteChangedEvent& event)
@@ -2184,7 +2182,7 @@ public:
wxNavigationKeyEvent() wxNavigationKeyEvent()
: wxEvent(0, wxEVT_NAVIGATION_KEY), : wxEvent(0, wxEVT_NAVIGATION_KEY),
m_flags(IsForward | FromTab), // defaults are for TAB m_flags(IsForward | FromTab), // defaults are for TAB
m_focus((wxWindow *)NULL) m_focus(NULL)
{ {
m_propagationLevel = wxEVENT_PROPAGATE_NONE; m_propagationLevel = wxEVENT_PROPAGATE_NONE;
} }
@@ -2695,8 +2693,8 @@ public:
int lastId, int lastId,
wxEventType eventType, wxEventType eventType,
wxObjectEventFunction func, wxObjectEventFunction func,
wxObject *userData = (wxObject *) NULL, wxObject *userData = NULL,
wxEvtHandler *eventSink = (wxEvtHandler *) NULL) wxEvtHandler *eventSink = NULL)
{ {
wxObjectEventFunctor *functor = wxNewEventFunctor( eventType, func, eventSink ); wxObjectEventFunctor *functor = wxNewEventFunctor( eventType, func, eventSink );
@@ -2707,23 +2705,23 @@ public:
void Connect(int winid, void Connect(int winid,
wxEventType eventType, wxEventType eventType,
wxObjectEventFunction func, wxObjectEventFunction func,
wxObject *userData = (wxObject *) NULL, wxObject *userData = NULL,
wxEvtHandler *eventSink = (wxEvtHandler *) NULL) wxEvtHandler *eventSink = NULL)
{ Connect(winid, wxID_ANY, eventType, func, userData, eventSink); } { Connect(winid, wxID_ANY, eventType, func, userData, eventSink); }
// Even more convenient: without id (same as using id of wxID_ANY) // Even more convenient: without id (same as using id of wxID_ANY)
void Connect(wxEventType eventType, void Connect(wxEventType eventType,
wxObjectEventFunction func, wxObjectEventFunction func,
wxObject *userData = (wxObject *) NULL, wxObject *userData = NULL,
wxEvtHandler *eventSink = (wxEvtHandler *) NULL) wxEvtHandler *eventSink = NULL)
{ Connect(wxID_ANY, wxID_ANY, eventType, func, userData, eventSink); } { Connect(wxID_ANY, wxID_ANY, eventType, func, userData, eventSink); }
bool Disconnect(int winid, bool Disconnect(int winid,
int lastId, int lastId,
wxEventType eventType, wxEventType eventType,
wxObjectEventFunction func = NULL, wxObjectEventFunction func = NULL,
wxObject *userData = (wxObject *) NULL, wxObject *userData = NULL,
wxEvtHandler *eventSink = (wxEvtHandler *) NULL) wxEvtHandler *eventSink = NULL)
{ {
wxObjectEventFunctor functor = wxConstructEventFunctor( eventType, func, eventSink ); wxObjectEventFunctor functor = wxConstructEventFunctor( eventType, func, eventSink );
@@ -2733,14 +2731,14 @@ public:
bool Disconnect(int winid = wxID_ANY, bool Disconnect(int winid = wxID_ANY,
wxEventType eventType = wxEVT_NULL, wxEventType eventType = wxEVT_NULL,
wxObjectEventFunction func = NULL, wxObjectEventFunction func = NULL,
wxObject *userData = (wxObject *) NULL, wxObject *userData = NULL,
wxEvtHandler *eventSink = (wxEvtHandler *) NULL) wxEvtHandler *eventSink = NULL)
{ return Disconnect(winid, wxID_ANY, eventType, func, userData, eventSink); } { return Disconnect(winid, wxID_ANY, eventType, func, userData, eventSink); }
bool Disconnect(wxEventType eventType, bool Disconnect(wxEventType eventType,
wxObjectEventFunction func, wxObjectEventFunction func,
wxObject *userData = (wxObject *) NULL, wxObject *userData = NULL,
wxEvtHandler *eventSink = (wxEvtHandler *) NULL) wxEvtHandler *eventSink = NULL)
{ return Disconnect(wxID_ANY, eventType, func, userData, eventSink); } { return Disconnect(wxID_ANY, eventType, func, userData, eventSink); }
@@ -3059,12 +3057,13 @@ public:
// implementation from now on // implementation from now on
// -------------------------- // --------------------------
// check if the given event table entry matches this event and call the // check if the given event table entry matches this event by id (the check
// handler if it does // for the event type should be done by caller) and call the handler if it
// does
// //
// return true if the event was processed, false otherwise (no match or the // return true if the event was processed, false otherwise (no match or the
// handler decided to skip the event) // handler decided to skip the event)
static bool ProcessEventIfMatches(const wxEventTableEntryBase& tableEntry, static bool ProcessEventIfMatchesId(const wxEventTableEntryBase& tableEntry,
wxEvtHandler *handler, wxEvtHandler *handler,
wxEvent& event); wxEvent& event);

View File

@@ -895,13 +895,11 @@ bool wxEventHashTable::HandleEvent(wxEvent &event, wxEvtHandler *self)
const size_t count = eventEntryTable.GetCount(); const size_t count = eventEntryTable.GetCount();
for (size_t n = 0; n < count; n++) for (size_t n = 0; n < count; n++)
{ {
if ( wxEvtHandler:: const wxEventTableEntry& entry = *eventEntryTable[n];
ProcessEventIfMatches(*eventEntryTable[n], self, event) ) if ( wxEvtHandler::ProcessEventIfMatchesId(entry, self, event) )
{
return true; return true;
} }
} }
}
return false; return false;
} }
@@ -1198,7 +1196,7 @@ void wxEvtHandler::ProcessPendingEvents()
* Event table stuff * Event table stuff
*/ */
/* static */ bool /* static */ bool
wxEvtHandler::ProcessEventIfMatches(const wxEventTableEntryBase& entry, wxEvtHandler::ProcessEventIfMatchesId(const wxEventTableEntryBase& entry,
wxEvtHandler *handler, wxEvtHandler *handler,
wxEvent& event) wxEvent& event)
{ {
@@ -1358,7 +1356,7 @@ bool wxEvtHandler::SearchEventTable(wxEventTable& table, wxEvent& event)
const wxEventTableEntry& entry = table.entries[i]; const wxEventTableEntry& entry = table.entries[i];
if ( eventType == entry.m_eventType ) if ( eventType == entry.m_eventType )
{ {
if ( ProcessEventIfMatches(entry, this, event) ) if ( ProcessEventIfMatchesId(entry, this, event) )
return true; return true;
} }
} }
@@ -1419,7 +1417,7 @@ wxEvtHandler::Unsubscribe(int id,
if ((entry->m_id == id) && if ((entry->m_id == id) &&
((entry->m_lastId == lastId) || (lastId == wxID_ANY)) && ((entry->m_lastId == lastId) || (lastId == wxID_ANY)) &&
((entry->m_eventType == eventType) || (eventType == wxEVT_NULL)) && ((entry->m_eventType == eventType) || (eventType == wxEVT_NULL)) &&
(*entry->m_fn == func) && entry->m_fn->Matches(func) &&
((entry->m_callbackUserData == userData) || !userData)) ((entry->m_callbackUserData == userData) || !userData))
{ {
delete entry->m_callbackUserData; delete entry->m_callbackUserData;
@@ -1446,10 +1444,12 @@ bool wxEvtHandler::SearchDynamicEventTable( wxEvent& event )
// call Disconnect() invalidating the current node // call Disconnect() invalidating the current node
node = node->GetNext(); node = node->GetNext();
if ((event.GetEventType() == entry->m_eventType) && (entry->m_fn != 0)) if ( event.GetEventType() == entry->m_eventType )
{ {
wxEvtHandler *handler = entry->m_fn->GetHandler() ? entry->m_fn->GetHandler() : this; wxEvtHandler *handler = entry->m_fn->GetHandler();
if ( ProcessEventIfMatches(*entry, handler, event) ) if ( !handler )
handler = this;
if ( ProcessEventIfMatchesId(*entry, handler, event) )
return true; return true;
} }
} }