0021543: EDF 1978 SMESH: Viscous layer for 2D meshes

1) Fix notifyListenersOnEvent() for the case if a listener is deleted
2) in setEventListener(), use a listener name to find an existing listener
This commit is contained in:
eap 2012-10-15 13:15:55 +00:00
parent c0f78ed06c
commit b648205fec

View File

@ -149,6 +149,17 @@ SMESHDS_SubMesh * SMESH_subMesh::GetSubMeshDS()
*/ */
//============================================================================= //=============================================================================
const SMESHDS_SubMesh * SMESH_subMesh::GetSubMeshDS() const
{
return ((SMESH_subMesh*) this )->GetSubMeshDS();
}
//=============================================================================
/*!
*
*/
//=============================================================================
SMESHDS_SubMesh* SMESH_subMesh::CreateSubMeshDS() SMESHDS_SubMesh* SMESH_subMesh::CreateSubMeshDS()
{ {
if ( !GetSubMeshDS() ) { if ( !GetSubMeshDS() ) {
@ -2078,7 +2089,8 @@ void SMESH_subMesh::SetEventListener(EventListener* listener,
*/ */
//================================================================================ //================================================================================
void SMESH_subMesh::setEventListener(EventListener* listener, EventListenerData* data) void SMESH_subMesh::setEventListener(EventListener* listener,
EventListenerData* data)
{ {
map< EventListener*, EventListenerData* >::iterator l_d = map< EventListener*, EventListenerData* >::iterator l_d =
_eventListeners.find( listener ); _eventListeners.find( listener );
@ -2089,8 +2101,20 @@ void SMESH_subMesh::setEventListener(EventListener* listener, EventListenerData*
l_d->second = data; l_d->second = data;
} }
else else
{
for ( l_d = _eventListeners.begin(); l_d != _eventListeners.end(); ++l_d )
if ( listener->GetName() == l_d->first->GetName() )
{
EventListenerData* curData = l_d->second;
if ( curData && curData != data && curData->IsDeletable() )
delete curData;
if ( l_d->first->IsDeletable() )
delete l_d->first;
_eventListeners.erase( l_d );
}
_eventListeners.insert( make_pair( listener, data )); _eventListeners.insert( make_pair( listener, data ));
} }
}
//================================================================================ //================================================================================
/*! /*!
@ -2140,16 +2164,18 @@ void SMESH_subMesh::notifyListenersOnEvent( const int event,
SMESH_Hypothesis* hyp) SMESH_Hypothesis* hyp)
{ {
map< EventListener*, EventListenerData* >::iterator l_d = _eventListeners.begin(); map< EventListener*, EventListenerData* >::iterator l_d = _eventListeners.begin();
for ( ; l_d != _eventListeners.end(); ++l_d ) for ( ; l_d != _eventListeners.end(); )
{ {
std::pair< EventListener*, EventListenerData* > li_da = *l_d; /* copy to enable removal std::pair< EventListener*, EventListenerData* > li_da = *l_d++; /* copy to enable removal
of a listener from of a listener from
_eventListeners by _eventListeners by
its ProcessEvent() */ its ProcessEvent() */
if ( li_da.first->myBusySM.insert( this ).second ) if ( li_da.first->myBusySM.insert( this ).second )
{ {
const size_t nbListenersBefore = _eventListeners.size();
li_da.first->ProcessEvent( event, eventType, this, li_da.second, hyp ); li_da.first->ProcessEvent( event, eventType, this, li_da.second, hyp );
li_da.first->myBusySM.erase( this ); if ( nbListenersBefore == _eventListeners.size() )
li_da.first->myBusySM.erase( this ); // a listener hopefully not removed
} }
} }
} }