improvements to wxWeakRef and related classes
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51187 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -406,13 +406,15 @@ wxCommandEvent::wxCommandEvent(wxEventType commandType, int theId)
|
||||
|
||||
wxString wxCommandEvent::GetString() const
|
||||
{
|
||||
if(m_eventType != wxEVT_COMMAND_TEXT_UPDATED || !m_eventObject)
|
||||
if (m_eventType != wxEVT_COMMAND_TEXT_UPDATED || !m_eventObject)
|
||||
{
|
||||
return m_cmdString;
|
||||
}
|
||||
else
|
||||
{
|
||||
#if wxUSE_TEXTCTRL
|
||||
wxTextCtrl *txt = wxDynamicCast(m_eventObject, wxTextCtrl);
|
||||
if(txt)
|
||||
if ( txt )
|
||||
return txt->GetValue();
|
||||
else
|
||||
#endif // wxUSE_TEXTCTRL
|
||||
@@ -1012,44 +1014,6 @@ void wxEventHashTable::GrowEventTypeTable()
|
||||
delete[] oldEventTypeTable;
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxEventConnectionRef
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// Below functions are mostly short but kept in cpp file to simplify setting
|
||||
// breakpoints (GDB)
|
||||
wxEventConnectionRef::wxEventConnectionRef(wxEvtHandler *src, wxEvtHandler *sink)
|
||||
: m_src(src), m_sink(sink), m_refCount(1)
|
||||
{
|
||||
wxASSERT( m_sink );
|
||||
m_sink->AddNode( this );
|
||||
}
|
||||
|
||||
wxEventConnectionRef::~wxEventConnectionRef()
|
||||
{
|
||||
}
|
||||
|
||||
void wxEventConnectionRef::OnObjectDestroy( )
|
||||
{
|
||||
if( m_src )
|
||||
m_src->OnSinkDestroyed( m_sink );
|
||||
// It is safe to delete this tracker object here
|
||||
delete this;
|
||||
}
|
||||
|
||||
void wxEventConnectionRef::DecRef( )
|
||||
{
|
||||
if( !--m_refCount )
|
||||
{
|
||||
// The sink holds the only external pointer to this object
|
||||
if( m_sink )
|
||||
m_sink->RemoveNode(this);
|
||||
delete this;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxEvtHandler
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -1089,19 +1053,20 @@ wxEvtHandler::~wxEvtHandler()
|
||||
{
|
||||
wxDynamicEventTableEntry *entry = (wxDynamicEventTableEntry*)*it;
|
||||
|
||||
// Remove ourselves from sink destructor notifications
|
||||
// Remove ourselves from sink destructor notifications
|
||||
// (this has usually been been done, in wxTrackable destructor)
|
||||
wxEvtHandler *eventSink = entry->m_eventSink;
|
||||
if( eventSink )
|
||||
if ( eventSink )
|
||||
{
|
||||
wxEventConnectionRef *pecr = FindRefInTrackerList( eventSink );
|
||||
if( pecr )
|
||||
{
|
||||
eventSink->RemoveNode( pecr );
|
||||
delete pecr;
|
||||
}
|
||||
wxEventConnectionRef * const
|
||||
evtConnRef = FindRefInTrackerList(eventSink);
|
||||
if ( evtConnRef )
|
||||
{
|
||||
eventSink->RemoveNode(evtConnRef);
|
||||
delete evtConnRef;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (entry->m_callbackUserData)
|
||||
delete entry->m_callbackUserData;
|
||||
delete entry;
|
||||
@@ -1117,7 +1082,7 @@ wxEvtHandler::~wxEvtHandler()
|
||||
if ( wxPendingEvents )
|
||||
{
|
||||
#if wxUSE_THREADS
|
||||
if(wxPendingEventsLocker)
|
||||
if (wxPendingEventsLocker)
|
||||
wxENTER_CRIT_SECT(*wxPendingEventsLocker);
|
||||
#endif
|
||||
|
||||
@@ -1130,7 +1095,7 @@ wxEvtHandler::~wxEvtHandler()
|
||||
//else: we weren't in this list at all, it's ok
|
||||
|
||||
#if wxUSE_THREADS
|
||||
if(wxPendingEventsLocker)
|
||||
if (wxPendingEventsLocker)
|
||||
wxLEAVE_CRIT_SECT(*wxPendingEventsLocker);
|
||||
#endif
|
||||
}
|
||||
@@ -1401,15 +1366,15 @@ void wxEvtHandler::Connect( int id, int lastId,
|
||||
|
||||
// Insert at the front of the list so most recent additions are found first
|
||||
m_dynamicEvents->Insert( (wxObject*) entry );
|
||||
|
||||
// Make sure we get to know when a sink is destroyed
|
||||
if( eventSink )
|
||||
|
||||
// Make sure we get to know when a sink is destroyed
|
||||
if ( eventSink )
|
||||
{
|
||||
wxEventConnectionRef *pecr = FindRefInTrackerList( eventSink );
|
||||
if( pecr )
|
||||
pecr->IncRef( );
|
||||
wxEventConnectionRef *evtConnRef = FindRefInTrackerList(eventSink);
|
||||
if ( evtConnRef )
|
||||
evtConnRef->IncRef( );
|
||||
else
|
||||
pecr = new wxEventConnectionRef(this,eventSink);
|
||||
evtConnRef = new wxEventConnectionRef(this, eventSink);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1422,11 +1387,11 @@ bool wxEvtHandler::Disconnect( int id, int lastId, wxEventType eventType,
|
||||
return false;
|
||||
|
||||
// Remove connection from tracker node (wxEventConnectionRef)
|
||||
if( eventSink )
|
||||
if ( eventSink )
|
||||
{
|
||||
wxEventConnectionRef *pecr = FindRefInTrackerList( eventSink );
|
||||
if( pecr )
|
||||
pecr->DecRef( );
|
||||
wxEventConnectionRef *evtConnRef = FindRefInTrackerList(eventSink);
|
||||
if ( evtConnRef )
|
||||
evtConnRef->DecRef();
|
||||
}
|
||||
|
||||
wxList::compatibility_iterator node = m_dynamicEvents->GetFirst();
|
||||
@@ -1519,37 +1484,36 @@ void *wxEvtHandler::DoGetClientData() const
|
||||
return m_clientData;
|
||||
}
|
||||
|
||||
// A helper func to find an wxEventConnectionRef object
|
||||
wxEventConnectionRef* wxEvtHandler::FindRefInTrackerList( wxEvtHandler *eventSink )
|
||||
// A helper to find an wxEventConnectionRef object
|
||||
wxEventConnectionRef *
|
||||
wxEvtHandler::FindRefInTrackerList(wxEvtHandler *eventSink)
|
||||
{
|
||||
wxASSERT(eventSink);
|
||||
for( wxTrackerNode *ptn=eventSink->GetFirst(); ptn; ptn=ptn->m_nxt )
|
||||
for ( wxTrackerNode *node = eventSink->GetFirst(); node; node = node->m_nxt )
|
||||
{
|
||||
// Only want wxEventConnectionRef nodes here
|
||||
if( ptn->GetType()!=wxTrackerNode::EventConnectionRef )
|
||||
continue;
|
||||
wxEventConnectionRef *pecr = static_cast<wxEventConnectionRef*>(ptn);
|
||||
if( pecr && pecr->m_src==this )
|
||||
// we only want wxEventConnectionRef nodes here
|
||||
wxEventConnectionRef *evtConnRef = node->ToEventConnection();
|
||||
if ( evtConnRef && evtConnRef->m_src == this )
|
||||
{
|
||||
wxASSERT( pecr->m_sink==eventSink );
|
||||
return pecr;
|
||||
wxASSERT( evtConnRef->m_sink==eventSink );
|
||||
return evtConnRef;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void wxEvtHandler::OnSinkDestroyed( wxEvtHandler *sink )
|
||||
{
|
||||
wxASSERT(m_dynamicEvents);
|
||||
|
||||
|
||||
// remove all connections with this sink
|
||||
wxList::compatibility_iterator node = m_dynamicEvents->GetFirst(), node_nxt;
|
||||
while (node)
|
||||
{
|
||||
wxDynamicEventTableEntry *entry = (wxDynamicEventTableEntry*)node->GetData();
|
||||
node_nxt = node->GetNext();
|
||||
|
||||
if( entry->m_eventSink==sink )
|
||||
|
||||
if ( entry->m_eventSink==sink )
|
||||
{
|
||||
if (entry->m_callbackUserData)
|
||||
delete entry->m_callbackUserData;
|
||||
|
Reference in New Issue
Block a user