Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "mitkDataStorageSelection.h"
00019 #include <itkCommand.h>
00020 #include <mitkBaseProperty.h>
00021 #include <mitkPropertyList.h>
00022
00023 namespace mitk
00024 {
00025
00026 DataStorageSelection::DataStorageSelection(mitk::DataStorage* _DataStorage, bool _AutoAddNodes)
00027 : m_DataStorage(0), m_Predicate(0), m_SelfCall(false), m_AutoAddNodes(_AutoAddNodes)
00028 {
00029 this->SetDataStorage(_DataStorage);
00030 }
00031
00032 DataStorageSelection::DataStorageSelection(mitk::DataStorage* _DataStorage
00033 , mitk::NodePredicateBase* _Predicate
00034 , bool _AutoAddNodes)
00035 : m_DataStorage(0), m_Predicate(_Predicate), m_SelfCall(false), m_AutoAddNodes(_AutoAddNodes)
00036 {
00037 this->SetDataStorage(_DataStorage);
00038 }
00039
00040 DataStorageSelection::~DataStorageSelection()
00041 {
00042
00043 this->SetDataStorage(0);
00044 }
00045
00046 mitk::DataStorage::Pointer DataStorageSelection::GetDataStorage() const
00047 {
00048 return m_DataStorage;
00049 }
00050
00051 mitk::NodePredicateBase::Pointer DataStorageSelection::GetPredicate() const
00052 {
00053 return m_Predicate;
00054 }
00055
00056 unsigned int DataStorageSelection::GetSize() const
00057 {
00058 return m_Nodes.size();
00059 }
00060
00061 mitk::DataNode::Pointer DataStorageSelection::GetNode() const
00062 {
00063 return this->GetNode(0);
00064 }
00065
00066 mitk::DataNode::Pointer DataStorageSelection::GetNode(unsigned int index) const
00067 {
00068 return (index < m_Nodes.size())? m_Nodes.at(index): 0;
00069 }
00070
00071 std::vector<mitk::DataNode*> DataStorageSelection::GetNodes() const
00072 {
00073 return m_Nodes;
00074 }
00075
00076
00077 bool DataStorageSelection::DoesAutoAddNodes() const
00078 {
00079 return m_AutoAddNodes;
00080 }
00081
00082 DataStorageSelection& DataStorageSelection::operator=(mitk::DataNode* node)
00083 {
00084 this->RemoveAllNodes();
00085 this->AddNode(node);
00086 return *this;
00087 }
00088
00089 DataStorageSelection& DataStorageSelection::operator=(mitk::DataNode::Pointer node)
00090 {
00091 *this = node.GetPointer();
00092 return *this;
00093 }
00094
00095 void DataStorageSelection::SetDataStorage(mitk::DataStorage* _DataStorage)
00096 {
00097
00098 if(m_DataStorage != _DataStorage)
00099 {
00100
00101 if(m_DataStorage != 0)
00102 {
00103 if(m_AutoAddNodes)
00104 this->m_DataStorage->AddNodeEvent.RemoveListener( mitk::MessageDelegate1<DataStorageSelection
00105 , const mitk::DataNode*>( this, &DataStorageSelection::AddNode ) );
00106
00107 this->m_DataStorage->RemoveNodeEvent.RemoveListener( mitk::MessageDelegate1<DataStorageSelection
00108 , const mitk::DataNode*>( this, &DataStorageSelection::RemoveNode ) );
00109
00110 m_DataStorage->RemoveObserver(m_DataStorageDeletedTag);
00111 m_DataStorageDeletedTag = 0;
00112 }
00113
00114
00115 m_DataStorage = _DataStorage;
00116
00117
00118 if(m_DataStorage != 0)
00119 {
00120
00121 if(m_AutoAddNodes)
00122 this->m_DataStorage->AddNodeEvent.AddListener( mitk::MessageDelegate1<DataStorageSelection
00123 , const mitk::DataNode*>( this, &DataStorageSelection::AddNode ) );
00124
00125 this->m_DataStorage->RemoveNodeEvent.AddListener( mitk::MessageDelegate1<DataStorageSelection
00126 , const mitk::DataNode*>( this, &DataStorageSelection::RemoveNode ) );
00127
00128 itk::MemberCommand<DataStorageSelection>::Pointer ObjectChangedCommand
00129 = itk::MemberCommand<DataStorageSelection>::New();
00130 ObjectChangedCommand->SetCallbackFunction(this, &DataStorageSelection::ObjectChanged);
00131
00132 m_DataStorageDeletedTag = m_DataStorage->AddObserver(itk::DeleteEvent(), ObjectChangedCommand);
00133 }
00134
00135 this->Reset();
00136 }
00137 }
00138
00139 void DataStorageSelection::SetPredicate(mitk::NodePredicateBase* _Predicate)
00140 {
00141
00142 if(m_Predicate != _Predicate)
00143 {
00144 m_Predicate = _Predicate;
00145 this->Reset();
00146 }
00147 }
00148
00149 void DataStorageSelection::AddNode(const mitk::DataNode* node)
00150 {
00151
00152 if(m_SelfCall)
00153 return;
00154
00155
00156 if(m_Predicate.IsNotNull() && !m_Predicate->CheckNode(node))
00157 return;
00158
00159
00160 if(std::find(m_Nodes.begin(), m_Nodes.end(), node) != m_Nodes.end())
00161 return;
00162
00163 mitk::DataNode* nonConstNode = const_cast<mitk::DataNode*>(node);
00164
00165 this->AddListener(nonConstNode);
00166
00167
00168 m_Nodes.push_back(nonConstNode);
00169
00170
00171 NodeAdded.Send(node);
00172 }
00173
00174
00175 void DataStorageSelection::RemoveNode(const mitk::DataNode* node)
00176 {
00177 if(m_SelfCall)
00178 return;
00179
00180
00181 std::vector<mitk::DataNode*>::iterator nodeIt
00182 = std::find(m_Nodes.begin(), m_Nodes.end(), node);
00183
00184 if(nodeIt == m_Nodes.end())
00185 return;
00186
00187 mitk::DataNode* nonConstNode = const_cast<mitk::DataNode*>(node);
00188
00189 this->RemoveListener(nonConstNode);
00190
00191
00192 m_Nodes.erase(nodeIt);
00193
00194 NodeRemoved.Send(node);
00195
00196 }
00197
00198 void DataStorageSelection::RemoveAllNodes()
00199 {
00200
00201
00202
00203 unsigned int i = m_Nodes.size();
00204 while(!m_Nodes.empty())
00205 {
00206 --i;
00207 this->RemoveNode(m_Nodes.at(i));
00208 }
00209 }
00210
00211 void DataStorageSelection::ObjectChanged(const itk::Object *caller, const itk::EventObject &event)
00212 {
00213 if(m_SelfCall)
00214 return;
00215
00216 const itk::DeleteEvent* delEvent = 0;
00217 const itk::ModifiedEvent* modifiedEvent = dynamic_cast<const itk::ModifiedEvent*>(&event);
00218 if(!modifiedEvent)
00219 delEvent = dynamic_cast<const itk::DeleteEvent*>(&event);
00220
00221 const mitk::BaseProperty* prop = 0;
00222 const mitk::PropertyList* propList = 0;
00223 const mitk::DataNode* node = dynamic_cast<const mitk::DataNode*>(caller);
00224 if(!node)
00225 {
00226 if((prop = dynamic_cast<const mitk::BaseProperty*>(caller)))
00227 {
00228 node = this->FindNode(prop);
00229 }
00230 else if((propList = dynamic_cast<const mitk::PropertyList*>(caller)))
00231 {
00232 node = this->FindNode(propList);
00233 }
00234 else if(dynamic_cast<const mitk::DataStorage*>(caller))
00235 {
00236 this->SetDataStorage(0);
00237 }
00238 }
00239
00240 if(prop && node)
00241 {
00242 PropertyChanged.Send(node, prop);
00243 }
00244 else if(node)
00245 {
00246 NodeChanged.Send(node);
00247 }
00248 }
00249
00250
00251 mitk::DataNode::Pointer DataStorageSelection::FindNode(const mitk::BaseProperty* prop) const
00252 {
00253 mitk::DataNode* node = 0;
00254 for(Nodes::const_iterator it=m_Nodes.begin(); it!=m_Nodes.end(); ++it)
00255 {
00256 for(mitk::PropertyList::PropertyMap::const_iterator it2
00257 = (*it)->GetPropertyList()->GetMap()->begin()
00258 ; it2 != (*it)->GetPropertyList()->GetMap()->end(); ++it2)
00259 {
00260 if(it2->second.first == prop)
00261 {
00262 node = *it;
00263 break;
00264 }
00265 }
00266 }
00267 return node;
00268 }
00269
00270 mitk::DataNode::Pointer DataStorageSelection::FindNode(const mitk::PropertyList* propList) const
00271 {
00272 mitk::DataNode* node = 0;
00273 for(Nodes::const_iterator it=m_Nodes.begin(); it!=m_Nodes.end(); ++it)
00274 {
00275 if((*it)->GetPropertyList() == propList)
00276 {
00277 node = *it;
00278 break;
00279 }
00280 }
00281 return node;
00282 }
00283
00284 void DataStorageSelection::Reset()
00285 {
00286 this->RemoveAllNodes();
00287
00288 if(m_DataStorage)
00289 {
00290 mitk::DataStorage::SetOfObjects::ConstPointer _NodeSet = 0;
00291 if(m_AutoAddNodes && m_Predicate.IsNotNull())
00292
00293 _NodeSet = m_DataStorage->GetSubset(m_Predicate);
00294
00295 else if(m_AutoAddNodes)
00296 {
00297 _NodeSet = m_DataStorage->GetAll();
00298 }
00299 else
00300 return;
00301
00302 for(mitk::DataStorage::SetOfObjects::const_iterator it=_NodeSet->begin(); it!=_NodeSet->end()
00303 ; it++)
00304 {
00305
00306 this->AddNode(*it);
00307 }
00308 }
00309 }
00310
00311 void DataStorageSelection::RemoveListener(mitk::DataNode* node)
00312 {
00313
00314 node->RemoveObserver(m_NodeModifiedObserverTags[node]);
00315 m_NodeModifiedObserverTags.erase(node);
00316
00317
00318 mitk::PropertyList* propList = node->GetPropertyList();
00319 propList->RemoveObserver(m_PropertyListModifiedObserverTags[propList]);
00320 m_PropertyListModifiedObserverTags.erase(propList);
00321 propList->RemoveObserver(m_PropertyListDeletedObserverTags[propList]);
00322 m_PropertyListDeletedObserverTags.erase(propList);
00323
00324 mitk::BaseProperty* prop = 0;
00325
00326 for(mitk::PropertyList::PropertyMap::const_iterator it=propList->GetMap()->begin()
00327 ; it!=propList->GetMap()->end()
00328 ; ++it)
00329 {
00330 prop = it->second.first;
00331 prop->RemoveObserver(m_PropertyModifiedObserverTags[prop]);
00332 m_PropertyModifiedObserverTags.erase(prop);
00333 prop->RemoveObserver(m_PropertyDeletedObserverTags[prop]);
00334 m_PropertyDeletedObserverTags.erase(prop);
00335 }
00336 }
00337
00338 void DataStorageSelection::AddListener(mitk::DataNode* node)
00339 {
00340
00341 itk::MemberCommand<DataStorageSelection>::Pointer ObjectChangedCommand
00342 = itk::MemberCommand<DataStorageSelection>::New();
00343 ObjectChangedCommand->SetCallbackFunction(this, &DataStorageSelection::ObjectChanged);
00344
00345 m_NodeModifiedObserverTags[node] = node->AddObserver(itk::ModifiedEvent()
00346 , ObjectChangedCommand);
00347
00348
00349 mitk::PropertyList* propList = node->GetPropertyList();
00350 m_PropertyListModifiedObserverTags[propList] = propList
00351 ->AddObserver(itk::ModifiedEvent(), ObjectChangedCommand);
00352 m_PropertyListDeletedObserverTags[propList] = propList
00353 ->AddObserver(itk::DeleteEvent(), ObjectChangedCommand);
00354
00355 mitk::BaseProperty* prop = 0;
00356
00357 for(mitk::PropertyList::PropertyMap::const_iterator it=propList->GetMap()->begin()
00358 ; it!=propList->GetMap()->end()
00359 ; ++it)
00360 {
00361 prop = it->second.first;
00362 m_PropertyModifiedObserverTags[prop] = prop->AddObserver(itk::ModifiedEvent()
00363 , ObjectChangedCommand);
00364 m_PropertyDeletedObserverTags[prop] = prop->AddObserver(itk::ModifiedEvent()
00365 , ObjectChangedCommand);
00366 }
00367 }
00368
00369 }