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 "QmitkToolReferenceDataSelectionBox.h"
00019 #include "QmitkDataStorageComboBox.h"
00020
00021
00022 #include "mitkNodePredicateProperty.h"
00023 #include "mitkNodePredicateDataType.h"
00024 #include "mitkNodePredicateDimension.h"
00025 #include "mitkNodePredicateAnd.h"
00026 #include "mitkNodePredicateOr.h"
00027 #include "mitkNodePredicateNot.h"
00028
00029 #include "mitkRenderingManager.h"
00030
00031 QmitkToolReferenceDataSelectionBox::QmitkToolReferenceDataSelectionBox(QWidget* parent, mitk::DataStorage* storage)
00032 :QWidget(parent),
00033 m_SelfCall(false),
00034 m_DisplayMode(ListDataIfAnyToolMatches ),
00035 m_ToolGroupsForFiltering("default")
00036 {
00037 m_ToolManager = mitk::ToolManager::New( storage );
00038
00039 m_Layout = new QVBoxLayout( this );
00040 this->setLayout( m_Layout );
00041
00042 m_ReferenceDataSelectionBox = new QmitkDataStorageComboBox( this );
00043 m_Layout->addWidget(m_ReferenceDataSelectionBox);
00044
00045 connect( m_ReferenceDataSelectionBox, SIGNAL(OnSelectionChanged(const mitk::DataNode*)),
00046 this, SLOT(OnReferenceDataSelected(const mitk::DataNode*)) );
00047
00048 m_ToolManager->ReferenceDataChanged += mitk::MessageDelegate<QmitkToolReferenceDataSelectionBox>( this, &QmitkToolReferenceDataSelectionBox::OnToolManagerReferenceDataModified );
00049 }
00050
00051 QmitkToolReferenceDataSelectionBox::~QmitkToolReferenceDataSelectionBox()
00052 {
00053 m_ToolManager->ReferenceDataChanged -= mitk::MessageDelegate<QmitkToolReferenceDataSelectionBox>( this, &QmitkToolReferenceDataSelectionBox::OnToolManagerReferenceDataModified );
00054 }
00055
00056 mitk::DataStorage* QmitkToolReferenceDataSelectionBox::GetDataStorage()
00057 {
00058 return m_ToolManager->GetDataStorage();
00059 }
00060
00061 void QmitkToolReferenceDataSelectionBox::SetDataStorage(mitk::DataStorage& storage)
00062 {
00063 m_ToolManager->SetDataStorage(storage);
00064 }
00065
00066 void QmitkToolReferenceDataSelectionBox::Initialize(mitk::DataStorage* storage )
00067 {
00068 m_ReferenceDataSelectionBox->SetDataStorage( storage );
00069
00070 UpdateDataDisplay();
00071 }
00072
00073
00074 mitk::ToolManager* QmitkToolReferenceDataSelectionBox::GetToolManager()
00075 {
00076 return m_ToolManager;
00077 }
00078
00079 void QmitkToolReferenceDataSelectionBox::SetToolManager(mitk::ToolManager& newManager)
00080 {
00081 m_ToolManager->ReferenceDataChanged -= mitk::MessageDelegate<QmitkToolReferenceDataSelectionBox>( this, &QmitkToolReferenceDataSelectionBox::OnToolManagerReferenceDataModified );
00082
00083 m_ToolManager = &newManager;
00084
00085 m_ToolManager->ReferenceDataChanged += mitk::MessageDelegate<QmitkToolReferenceDataSelectionBox>( this, &QmitkToolReferenceDataSelectionBox::OnToolManagerReferenceDataModified );
00086
00087 UpdateDataDisplay();
00088 }
00089
00090 void QmitkToolReferenceDataSelectionBox::UpdateDataDisplay()
00091 {
00092 m_ReferenceDataSelectionBox->SetPredicate( GetAllPossibleReferenceImagesPredicate().GetPointer() );
00093 EnsureOnlyReferenceImageIsVisibile();
00094 }
00095
00096 void QmitkToolReferenceDataSelectionBox::OnReferenceDataSelected(const mitk::DataNode* selectedNode)
00097 {
00098 emit ReferenceNodeSelected(selectedNode);
00099
00100 m_SelfCall = true;
00101 m_ToolManager->SetReferenceData( const_cast< mitk::DataNode*>(selectedNode));
00102 m_SelfCall = false;
00103
00104 EnsureOnlyReferenceImageIsVisibile();
00105 }
00106
00107 void QmitkToolReferenceDataSelectionBox::EnsureOnlyReferenceImageIsVisibile()
00108 {
00109 mitk::DataNode* selectedNode = m_ToolManager->GetReferenceData(0);
00110
00111 mitk::DataStorage::SetOfObjects::ConstPointer allImageNodes = GetAllPossibleReferenceImages();
00112 for ( mitk::DataStorage::SetOfObjects::const_iterator nodeIter = allImageNodes->begin();
00113 nodeIter != allImageNodes->end();
00114 ++nodeIter )
00115 {
00116 mitk::DataNode* currentNode = (*nodeIter).GetPointer();
00117
00118 currentNode->SetVisibility( currentNode == selectedNode );
00119 }
00120
00121 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00122
00123 }
00124
00125 void QmitkToolReferenceDataSelectionBox::OnToolManagerReferenceDataModified()
00126 {
00127 if (m_SelfCall) return;
00128
00129 const mitk::DataNode* node = m_ToolManager->GetReferenceData(0);
00130 emit ReferenceNodeSelected(node);
00131
00132 UpdateDataDisplay();
00133 }
00134
00135 mitk::NodePredicateBase::ConstPointer QmitkToolReferenceDataSelectionBox::GetAllPossibleReferenceImagesPredicate()
00136 {
00144 std::vector< mitk::NodePredicateBase::ConstPointer > m_Predicates;
00145 m_Predicates.clear();
00146 mitk::NodePredicateBase::ConstPointer completePredicate = NULL;
00147
00148 const mitk::ToolManager::ToolVectorTypeConst allTools = m_ToolManager->GetTools();
00149
00150 for ( mitk::ToolManager::ToolVectorTypeConst::const_iterator iter = allTools.begin();
00151 iter != allTools.end();
00152 ++iter )
00153 {
00154 const mitk::Tool* tool = *iter;
00155
00156 if ( (m_ToolGroupsForFiltering.empty()) || ( m_ToolGroupsForFiltering.find( tool->GetGroup() ) != std::string::npos ) ||
00157 ( m_ToolGroupsForFiltering.find( tool->GetName() ) != std::string::npos )
00158 )
00159 {
00160 if (completePredicate)
00161 {
00162 if ( m_DisplayMode == ListDataIfAnyToolMatches )
00163 {
00164 m_Predicates.push_back( mitk::NodePredicateOr::New( completePredicate, tool->GetReferenceDataPreference() ).GetPointer() );
00165 }
00166 else
00167 {
00168 m_Predicates.push_back( mitk::NodePredicateAnd::New( completePredicate, tool->GetReferenceDataPreference() ).GetPointer() );
00169 }
00170 completePredicate = m_Predicates.back();
00171 }
00172 else
00173 {
00174 completePredicate = tool->GetReferenceDataPreference();
00175 }
00176 }
00177 }
00178
00179 return completePredicate;
00180 }
00181
00182 mitk::DataStorage::SetOfObjects::ConstPointer QmitkToolReferenceDataSelectionBox::GetAllPossibleReferenceImages()
00183 {
00184 mitk::DataStorage* dataStorage = m_ToolManager->GetDataStorage();
00185 if (!dataStorage)
00186 {
00187 return mitk::DataStorage::SetOfObjects::New().GetPointer();
00188 }
00189
00190 mitk::NodePredicateBase::ConstPointer completePredicate = GetAllPossibleReferenceImagesPredicate();
00191
00192 mitk::DataStorage::SetOfObjects::ConstPointer allObjects;
00193
00197 if (completePredicate.IsNotNull())
00198 {
00199 allObjects = dataStorage->GetSubset( completePredicate );
00200 }
00201 else
00202 {
00203 allObjects = dataStorage->GetAll();
00204 }
00205
00206 mitk::ToolManager::DataVectorType resultVector;
00207
00208 for ( mitk::DataStorage::SetOfObjects::const_iterator objectIter = allObjects->begin();
00209 objectIter != allObjects->end();
00210 ++objectIter )
00211 {
00212 mitk::DataNode* node = (*objectIter).GetPointer();
00213 resultVector.push_back( node );
00214 }
00215
00216
00217 mitk::DataStorage::SetOfObjects::ConstPointer sceneImages = dataStorage->GetSubset( completePredicate );
00218 return sceneImages;
00219 }
00220
00221 void QmitkToolReferenceDataSelectionBox::SetToolGroupsForFiltering(const std::string& groups)
00222 {
00223 m_ToolGroupsForFiltering = groups;
00224 UpdateDataDisplay();
00225 }
00226
00227 void QmitkToolReferenceDataSelectionBox::SetDisplayMode( QmitkToolReferenceDataSelectionBox::DisplayMode mode )
00228 {
00229 if (m_DisplayMode != mode)
00230 {
00231 m_DisplayMode = mode;
00232 UpdateDataDisplay();
00233 }
00234 }
00235