00001 #include "vtkObjectSet.h" 00002 #include "vtkObjectObserver.h" 00003 00004 #include <vtkCommand.h> 00005 #include <vtkSmartPointer.h> 00006 #include <vtkCallbackCommand.h> 00007 00008 vtkObjectSet::vtkObjectSet() 00009 { 00010 } 00011 00012 vtkObjectSet::~vtkObjectSet() 00013 { 00014 00015 } 00016 00017 void vtkObjectSet::AddObserver( vtkObjectObserver* observer ) 00018 { 00019 m_vtkObjectObservers.insert(observer); 00020 } 00021 00022 void vtkObjectSet::RemoveObserver( vtkObjectObserver* observer ) 00023 { 00024 m_vtkObjectObservers.erase(observer); 00025 } 00026 00027 void vtkObjectSet::AddObject ( vtkObject * obj ) 00028 { 00029 // if add object, add observer for modified and delete event 00030 std::pair<std::set<const vtkObject *>::iterator, bool> res = m_Objects.insert(obj); 00031 00032 if(res.second) 00033 { 00034 vtkSmartPointer<vtkCallbackCommand> modifiedCallback = 00035 vtkSmartPointer<vtkCallbackCommand>::New(); 00036 modifiedCallback->SetCallback ( vtkObjectSet::OnObjectModified ); 00037 modifiedCallback->SetClientData(this); 00038 00039 m_ObjectModifiedTags[obj] = obj->AddObserver 00040 ( vtkCommand::ModifiedEvent, modifiedCallback ); 00041 m_ObjectDeleteTags[obj] = obj->AddObserver 00042 ( vtkCommand::DeleteEvent, modifiedCallback ); 00043 } 00044 } 00045 00046 void vtkObjectSet::RemoveObject ( vtkObject * obj ) 00047 { 00048 // if object removed, remove observer and tags for modified and delete event 00049 std::set<const vtkObject *>::size_type deletedObjs = m_Objects.erase(obj); 00050 00051 if(deletedObjs > 0) 00052 { 00053 obj->RemoveObserver(m_ObjectModifiedTags[obj]); 00054 obj->RemoveObserver(m_ObjectDeleteTags[obj]); 00055 00056 m_ObjectModifiedTags.erase(obj); 00057 m_ObjectDeleteTags.erase(obj); 00058 } 00059 } 00060 00061 void vtkObjectSet::OnObjectModified(vtkObject* caller, unsigned long eid 00062 , void* clientdata, void * /*calldata*/) 00063 { 00064 // if event == modified event, inform objectobservers 00065 // else: call RemoveObject() or remove objectobserver and inform objectobservers 00066 00067 vtkObjectSet* instance = static_cast<vtkObjectSet*>( clientdata ); 00068 00069 for(std::set<vtkObjectObserver*>::iterator it = instance->m_vtkObjectObservers.begin(); 00070 it != instance->m_vtkObjectObservers.end(); ++it) 00071 eid == vtkCommand::ModifiedEvent ? (*it)->OnModified( caller ): 00072 (*it)->OnDeleted( caller ); 00073 00074 if(eid != vtkCommand::ModifiedEvent) 00075 instance->RemoveObject( caller ); 00076 }