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 "mitkToolManager.h"
00019 #include "mitkGlobalInteraction.h"
00020 #include "mitkCoreObjectFactory.h"
00021
00022 #include <itkObjectFactoryBase.h>
00023 #include <itkCommand.h>
00024
00025 #include <list>
00026
00027 mitk::ToolManager::ToolManager(DataStorage* storage)
00028 :m_ActiveTool(NULL),
00029 m_ActiveToolID(-1),
00030 m_RegisteredClients(0),
00031 m_DataStorage(storage)
00032 {
00033 CoreObjectFactory::GetInstance();
00034
00035
00036 std::list<itk::LightObject::Pointer> thingsThatClaimToBeATool = itk::ObjectFactoryBase::CreateAllInstance("mitkTool");
00037
00038
00039 for ( std::list<itk::LightObject::Pointer>::iterator iter = thingsThatClaimToBeATool.begin();
00040 iter != thingsThatClaimToBeATool.end();
00041 ++iter )
00042 {
00043 if ( Tool* tool = dynamic_cast<Tool*>( iter->GetPointer() ) )
00044 {
00045 tool->SetToolManager(this);
00046 tool->ErrorMessage += MessageDelegate1<mitk::ToolManager, std::string>( this, &ToolManager::OnToolErrorMessage );
00047 tool->GeneralMessage += MessageDelegate1<mitk::ToolManager, std::string>( this, &ToolManager::OnGeneralToolMessage );
00048 m_Tools.push_back( tool );
00049 }
00050 }
00051
00052
00053 }
00054
00055 mitk::ToolManager::~ToolManager()
00056 {
00057 if (m_ActiveTool)
00058 {
00059 m_ActiveTool->Deactivated();
00060 GlobalInteraction::GetInstance()->RemoveListener( m_ActiveTool );
00061
00062 m_ActiveTool = NULL;
00063 m_ActiveToolID = -1;
00064
00065 ActiveToolChanged.Send();
00066 }
00067 for ( NodeTagMapType::iterator observerTagMapIter = m_ReferenceDataObserverTags.begin(); observerTagMapIter != m_ReferenceDataObserverTags.end(); ++observerTagMapIter )
00068 {
00069 observerTagMapIter->first->RemoveObserver( observerTagMapIter->second );
00070 }
00071 }
00072
00073 void mitk::ToolManager::OnToolErrorMessage(std::string s)
00074 {
00075 this->ToolErrorMessage(s);
00076 }
00077
00078 void mitk::ToolManager::OnGeneralToolMessage(std::string s)
00079 {
00080 this->GeneralToolMessage(s);
00081 }
00082
00083
00084 const mitk::ToolManager::ToolVectorTypeConst mitk::ToolManager::GetTools()
00085 {
00086 ToolVectorTypeConst resultList;
00087
00088 for ( ToolVectorType::iterator iter = m_Tools.begin();
00089 iter != m_Tools.end();
00090 ++iter )
00091 {
00092 resultList.push_back( iter->GetPointer() );
00093 }
00094
00095 return resultList;
00096 }
00097
00098 mitk::Tool* mitk::ToolManager::GetToolById(int id)
00099 {
00100 try
00101 {
00102 return m_Tools.at(id);
00103 }
00104 catch(std::exception&)
00105 {
00106 return NULL;
00107 }
00108 }
00109
00110 bool mitk::ToolManager::ActivateTool(int id)
00111 {
00112
00113
00114
00115 if ( GetToolById( id ) == m_ActiveTool ) return true;
00116
00117 static int nextTool = -1;
00118 nextTool = id;
00119
00120
00121 static bool inActivateTool = false;
00122 if (inActivateTool)
00123 {
00124
00125 return true;
00126 }
00127 inActivateTool = true;
00128
00129 while ( nextTool != m_ActiveToolID )
00130 {
00131
00132 if (m_ActiveTool)
00133 {
00134 m_ActiveTool->Deactivated();
00135 GlobalInteraction::GetInstance()->RemoveListener( m_ActiveTool );
00136 }
00137
00138 m_ActiveTool = GetToolById( nextTool );
00139 m_ActiveToolID = m_ActiveTool ? nextTool : -1;
00140
00141 ActiveToolChanged.Send();
00142
00143 if (m_ActiveTool)
00144 {
00145 if (m_RegisteredClients)
00146 {
00147 m_ActiveTool->Activated();
00148 GlobalInteraction::GetInstance()->AddListener( m_ActiveTool );
00149 }
00150 }
00151 }
00152
00153 inActivateTool = false;
00154 return (m_ActiveTool != NULL);
00155 }
00156
00157 void mitk::ToolManager::SetReferenceData(DataVectorType data)
00158 {
00159 if (data != m_ReferenceData)
00160 {
00161
00162 for ( DataVectorType::iterator dataIter = m_ReferenceData.begin(); dataIter != m_ReferenceData.end(); ++dataIter )
00163 {
00164 NodeTagMapType::iterator searchIter = m_ReferenceDataObserverTags.find( *dataIter );
00165 if ( searchIter != m_ReferenceDataObserverTags.end() )
00166 {
00167
00168 (*dataIter)->RemoveObserver( searchIter->second );
00169 }
00170 }
00171
00172 m_ReferenceData = data;
00173
00174
00175
00176 m_ReferenceDataObserverTags.clear();
00177 for ( DataVectorType::iterator dataIter = m_ReferenceData.begin(); dataIter != m_ReferenceData.end(); ++dataIter )
00178 {
00179
00180 itk::MemberCommand<ToolManager>::Pointer command = itk::MemberCommand<ToolManager>::New();
00181 command->SetCallbackFunction( this, &ToolManager::OnOneOfTheReferenceDataDeleted );
00182 command->SetCallbackFunction( this, &ToolManager::OnOneOfTheReferenceDataDeletedConst );
00183 m_ReferenceDataObserverTags.insert( std::pair<DataNode*, unsigned long>( (*dataIter), (*dataIter)->AddObserver( itk::DeleteEvent(), command ) ) );
00184 }
00185
00186 ReferenceDataChanged.Send();
00187 }
00188 }
00189
00190 void mitk::ToolManager::OnOneOfTheReferenceDataDeletedConst(const itk::Object* caller, const itk::EventObject& e)
00191 {
00192 OnOneOfTheReferenceDataDeleted( const_cast<itk::Object*>(caller), e );
00193 }
00194
00195 void mitk::ToolManager::OnOneOfTheReferenceDataDeleted(itk::Object* caller, const itk::EventObject& itkNotUsed(e))
00196 {
00197
00198 DataVectorType v;
00199
00200 for (DataVectorType::iterator dataIter = m_ReferenceData.begin(); dataIter != m_ReferenceData.end(); ++dataIter )
00201 {
00202
00203 if ( (void*)(*dataIter) != (void*)caller )
00204 {
00205 v.push_back( *dataIter );
00206
00207 }
00208 else
00209 {
00210
00211 m_ReferenceDataObserverTags.erase( *dataIter );
00212 }
00213 }
00214 this->SetReferenceData( v );
00215 }
00216
00217 void mitk::ToolManager::SetReferenceData(DataNode* data)
00218 {
00219
00220 DataVectorType v;
00221 if (data)
00222 {
00223 v.push_back(data);
00224 }
00225 SetReferenceData(v);
00226 }
00227
00228 void mitk::ToolManager::SetWorkingData(DataVectorType data)
00229 {
00230 if ( data != m_WorkingData )
00231 {
00232
00233 for ( DataVectorType::iterator dataIter = m_WorkingData.begin(); dataIter != m_WorkingData.end(); ++dataIter )
00234 {
00235 NodeTagMapType::iterator searchIter = m_WorkingDataObserverTags.find( *dataIter );
00236 if ( searchIter != m_WorkingDataObserverTags.end() )
00237 {
00238
00239 (*dataIter)->RemoveObserver( searchIter->second );
00240 }
00241 }
00242
00243 m_WorkingData = data;
00244
00245
00246
00247 m_WorkingDataObserverTags.clear();
00248 for ( DataVectorType::iterator dataIter = m_WorkingData.begin(); dataIter != m_WorkingData.end(); ++dataIter )
00249 {
00250
00251 itk::MemberCommand<ToolManager>::Pointer command = itk::MemberCommand<ToolManager>::New();
00252 command->SetCallbackFunction( this, &ToolManager::OnOneOfTheWorkingDataDeleted );
00253 command->SetCallbackFunction( this, &ToolManager::OnOneOfTheWorkingDataDeletedConst );
00254 m_WorkingDataObserverTags.insert( std::pair<DataNode*, unsigned long>( (*dataIter), (*dataIter)->AddObserver( itk::DeleteEvent(), command ) ) );
00255 }
00256
00257 WorkingDataChanged.Send();
00258 }
00259 }
00260
00261 void mitk::ToolManager::OnOneOfTheWorkingDataDeletedConst(const itk::Object* caller, const itk::EventObject& e)
00262 {
00263 OnOneOfTheWorkingDataDeleted( const_cast<itk::Object*>(caller), e );
00264 }
00265
00266 void mitk::ToolManager::OnOneOfTheWorkingDataDeleted(itk::Object* caller, const itk::EventObject& itkNotUsed(e))
00267 {
00268
00269 DataVectorType v;
00270
00271 for (DataVectorType::iterator dataIter = m_WorkingData.begin(); dataIter != m_WorkingData.end(); ++dataIter )
00272 {
00273
00274 if ( (void*)(*dataIter) != (void*)caller )
00275 {
00276 v.push_back( *dataIter );
00277
00278 }
00279 else
00280 {
00281
00282 m_WorkingDataObserverTags.erase( *dataIter );
00283 }
00284 }
00285 this->SetWorkingData( v );
00286 }
00287
00288
00289 void mitk::ToolManager::SetWorkingData(DataNode* data)
00290 {
00291 DataVectorType v;
00292
00293 if (data)
00294 {
00295 v.push_back(data);
00296 }
00297
00298 SetWorkingData(v);
00299 }
00300
00301 void mitk::ToolManager::SetRoiData(DataVectorType data)
00302 {
00303 if (data != m_RoiData)
00304 {
00305
00306 for ( DataVectorType::iterator dataIter = m_RoiData.begin(); dataIter != m_RoiData.end(); ++dataIter )
00307 {
00308 NodeTagMapType::iterator searchIter = m_RoiDataObserverTags.find( *dataIter );
00309 if ( searchIter != m_RoiDataObserverTags.end() )
00310 {
00311
00312 (*dataIter)->RemoveObserver( searchIter->second );
00313 }
00314 }
00315
00316 m_RoiData = data;
00317
00318
00319
00320 m_RoiDataObserverTags.clear();
00321 for ( DataVectorType::iterator dataIter = m_RoiData.begin(); dataIter != m_RoiData.end(); ++dataIter )
00322 {
00323
00324 itk::MemberCommand<ToolManager>::Pointer command = itk::MemberCommand<ToolManager>::New();
00325 command->SetCallbackFunction( this, &ToolManager::OnOneOfTheRoiDataDeleted );
00326 command->SetCallbackFunction( this, &ToolManager::OnOneOfTheRoiDataDeletedConst );
00327 m_RoiDataObserverTags.insert( std::pair<DataNode*, unsigned long>( (*dataIter), (*dataIter)->AddObserver( itk::DeleteEvent(), command ) ) );
00328 }
00329 RoiDataChanged.Send();
00330 }
00331 }
00332
00333 void mitk::ToolManager::SetRoiData(DataNode* data)
00334 {
00335 DataVectorType v;
00336
00337 if(data)
00338 {
00339 v.push_back(data);
00340 }
00341 this->SetRoiData(v);
00342 }
00343
00344 void mitk::ToolManager::OnOneOfTheRoiDataDeletedConst(const itk::Object* caller, const itk::EventObject& e)
00345 {
00346 OnOneOfTheRoiDataDeleted( const_cast<itk::Object*>(caller), e );
00347 }
00348
00349 void mitk::ToolManager::OnOneOfTheRoiDataDeleted(itk::Object* caller, const itk::EventObject& itkNotUsed(e))
00350 {
00351
00352 DataVectorType v;
00353
00354 for (DataVectorType::iterator dataIter = m_RoiData.begin(); dataIter != m_RoiData.end(); ++dataIter )
00355 {
00356
00357 if ( (void*)(*dataIter) != (void*)caller )
00358 {
00359 v.push_back( *dataIter );
00360
00361 }
00362 else
00363 {
00364
00365 m_RoiDataObserverTags.erase( *dataIter );
00366 }
00367 }
00368 this->SetRoiData( v );
00369 }
00370
00371 mitk::ToolManager::DataVectorType mitk::ToolManager::GetReferenceData()
00372 {
00373 return m_ReferenceData;
00374 }
00375
00376 mitk::DataNode* mitk::ToolManager::GetReferenceData(int idx)
00377 {
00378 try
00379 {
00380 return m_ReferenceData.at(idx);
00381 }
00382 catch(std::exception&)
00383 {
00384 return NULL;
00385 }
00386 }
00387
00388 mitk::ToolManager::DataVectorType mitk::ToolManager::GetWorkingData()
00389 {
00390 return m_WorkingData;
00391 }
00392
00393 mitk::ToolManager::DataVectorType mitk::ToolManager::GetRoiData()
00394 {
00395 return m_RoiData;
00396 }
00397
00398 mitk::DataNode* mitk::ToolManager::GetRoiData(int idx)
00399 {
00400 try
00401 {
00402 return m_RoiData.at(idx);
00403 }
00404 catch(std::exception&)
00405 {
00406 return NULL;
00407 }
00408 }
00409
00410 mitk::DataStorage* mitk::ToolManager::GetDataStorage()
00411 {
00412 if ( m_DataStorage.IsNotNull() )
00413 {
00414 return m_DataStorage;
00415 }
00416 else
00417 {
00418 return NULL;
00419 }
00420 }
00421
00422 void mitk::ToolManager::SetDataStorage(DataStorage& storage)
00423 {
00424 m_DataStorage = &storage;
00425 }
00426
00427
00428
00429 mitk::DataNode* mitk::ToolManager::GetWorkingData(int idx)
00430 {
00431 try
00432 {
00433 return m_WorkingData.at(idx);
00434 }
00435 catch(std::exception&)
00436 {
00437 return NULL;
00438 }
00439 }
00440
00441 int mitk::ToolManager::GetActiveToolID()
00442 {
00443 return m_ActiveToolID;
00444 }
00445
00446 mitk::Tool* mitk::ToolManager::GetActiveTool()
00447 {
00448 return m_ActiveTool;
00449 }
00450
00451 void mitk::ToolManager::RegisterClient()
00452 {
00453 if ( m_RegisteredClients == 0 )
00454 {
00455 if ( m_ActiveTool )
00456 {
00457 m_ActiveTool->Activated();
00458 GlobalInteraction::GetInstance()->AddListener( m_ActiveTool );
00459 }
00460 }
00461
00462 ++m_RegisteredClients;
00463 }
00464
00465 void mitk::ToolManager::UnregisterClient()
00466 {
00467 --m_RegisteredClients;
00468
00469 if ( m_RegisteredClients == 0 )
00470 {
00471 if ( m_ActiveTool )
00472 {
00473 m_ActiveTool->Deactivated();
00474 GlobalInteraction::GetInstance()->RemoveListener( m_ActiveTool );
00475 }
00476 }
00477 }
00478
00479 int mitk::ToolManager::GetToolID( const Tool* tool )
00480 {
00481 int id(0);
00482 for ( ToolVectorType::iterator iter = m_Tools.begin();
00483 iter != m_Tools.end();
00484 ++iter, ++id )
00485 {
00486 if ( tool == iter->GetPointer() )
00487 {
00488 return id;
00489 }
00490 }
00491 return -1;
00492 }
00493