00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "QmitkDataManagerView.h"
00019
00020 #include <itkOtsuThresholdImageFilter.h>
00021
00022
00023
00024 #include "mitkDataStorageEditorInput.h"
00025 #include "mitkIDataStorageReference.h"
00026 #include "mitkNodePredicateDataType.h"
00027 #include "mitkCoreObjectFactory.h"
00028 #include "mitkPACSPlugin.h"
00029 #include "mitkDataNodeFactory.h"
00030 #include "mitkColorProperty.h"
00031 #include "mitkCommon.h"
00032 #include "mitkDelegateManager.h"
00033 #include "mitkNodePredicateData.h"
00034 #include "mitkNodePredicateNot.h"
00035 #include "mitkNodePredicateProperty.h"
00036 #include "mitkEnumerationProperty.h"
00037 #include "mitkProperties.h"
00038 #include <mitkNodePredicateAnd.h>
00039 #include <mitkITKImageImport.h>
00040 #include <mitkIDataStorageService.h>
00041
00042 #include <QmitkStdMultiWidget.h>
00043 #include <QmitkDataStorageTableModel.h>
00044 #include <QmitkPropertiesTableEditor.h>
00045 #include <QmitkStdMultiWidgetEditor.h>
00046 #include <QmitkCommonFunctionality.h>
00047 #include <QmitkDataStorageTreeModel.h>
00048 #include <QmitkNodeDescriptorManager.h>
00049 #include <QmitkCustomVariants.h>
00050 #include "src/internal/QmitkNodeTableViewKeyFilter.h"
00051 #include "src/internal/QmitkInfoDialog.h"
00052
00053 #include <berryIEditorPart.h>
00054 #include <berryIWorkbenchPage.h>
00055 #include <berryIPreferencesService.h>
00056 #include <berryPlatform.h>
00057
00058
00059 #include <QTableView>
00060 #include <QGroupBox>
00061 #include <QGridLayout>
00062 #include <QHBoxLayout>
00063 #include <QVBoxLayout>
00064 #include <QLabel>
00065 #include <QListView>
00066 #include <QMenu>
00067 #include <QAction>
00068 #include <QComboBox>
00069 #include <QApplication>
00070 #include <QCursor>
00071 #include <QHeaderView>
00072 #include <QTreeView>
00073 #include <QWidgetAction>
00074 #include <QSplitter>
00075 #include <QPushButton>
00076 #include <QMotifStyle>
00077 #include <QFileDialog>
00078 #include <QMessageBox>
00079 #include <QToolBar>
00080 #include <QKeyEvent>
00081 #include <QColor>
00082 #include <QColorDialog>
00083 #include <QSizePolicy>
00084
00085 #include "mitkDataNodeObject.h"
00086 #include "mitkIContextMenuAction.h"
00087 #include "berryIExtensionPointService.h"
00088
00089 const std::string QmitkDataManagerView::VIEW_ID = "org.mitk.views.datamanager";
00090
00091 QmitkDataManagerView::QmitkDataManagerView()
00092 {
00093 }
00094
00095
00096 QmitkDataManagerView::~QmitkDataManagerView()
00097 {
00098 berry::ISelectionService* s = GetSite()->GetWorkbenchWindow()->GetSelectionService();
00099 if(s)
00100 s->RemoveSelectionListener(m_SelectionListener);
00101 berry::IPreferencesService::Pointer prefService
00102 = berry::Platform::GetServiceRegistry()
00103 .GetServiceById<berry::IPreferencesService>(berry::IPreferencesService::ID);
00104
00105 berry::IBerryPreferences::Pointer prefs
00106 = (prefService->GetSystemPreferences()->Node(VIEW_ID))
00107 .Cast<berry::IBerryPreferences>();
00108 prefs->OnChanged.RemoveListener( berry::MessageDelegate1<QmitkDataManagerView
00109 , const berry::IBerryPreferences*>( this
00110 , &QmitkDataManagerView::OnPreferencesChanged ) );
00111 }
00112
00113 void QmitkDataManagerView::CreateQtPartControl(QWidget* parent)
00114 {
00115 m_Parent = parent;
00116
00117 berry::IPreferencesService::Pointer prefService
00118 = berry::Platform::GetServiceRegistry()
00119 .GetServiceById<berry::IPreferencesService>(berry::IPreferencesService::ID);
00120
00121 berry::IBerryPreferences::Pointer prefs
00122 = (prefService->GetSystemPreferences()->Node(VIEW_ID))
00123 .Cast<berry::IBerryPreferences>();
00124 assert( prefs );
00125 prefs->OnChanged.AddListener( berry::MessageDelegate1<QmitkDataManagerView
00126 , const berry::IBerryPreferences*>( this
00127 , &QmitkDataManagerView::OnPreferencesChanged ) );
00128
00129
00130 m_NodeTreeModel = new QmitkDataStorageTreeModel(this->GetDataStorage());
00131 m_NodeTreeModel->setParent( parent );
00132 m_NodeTreeModel->SetPlaceNewNodesOnTop(
00133 prefs->GetBool("Place new nodes on top", true) );
00134
00135
00136 m_NodeTreeView = new QTreeView;
00137 m_NodeTreeView->setSelectionMode( QAbstractItemView::ExtendedSelection );
00138 m_NodeTreeView->setSelectionBehavior( QAbstractItemView::SelectRows );
00139 m_NodeTreeView->setAlternatingRowColors(true);
00140 m_NodeTreeView->setDragEnabled(true);
00141 m_NodeTreeView->setDropIndicatorShown(true);
00142 m_NodeTreeView->setAcceptDrops(true);
00143 m_NodeTreeView->setContextMenuPolicy(Qt::CustomContextMenu);
00144 m_NodeTreeView->setModel(m_NodeTreeModel);
00145 m_NodeTreeView->installEventFilter(new QmitkNodeTableViewKeyFilter(this));
00146 QObject::connect( m_NodeTreeView, SIGNAL(customContextMenuRequested(const QPoint&))
00147 , this, SLOT(NodeTableViewContextMenuRequested(const QPoint&)) );
00148 QObject::connect( m_NodeTreeModel, SIGNAL(rowsInserted (const QModelIndex&, int, int))
00149 , this, SLOT(NodeTreeViewRowsInserted ( const QModelIndex&, int, int )) );
00150 QObject::connect( m_NodeTreeView->selectionModel()
00151 , SIGNAL( selectionChanged ( const QItemSelection &, const QItemSelection & ) )
00152 , this
00153 , SLOT( NodeSelectionChanged ( const QItemSelection &, const QItemSelection & ) ) );
00154
00155
00156 m_NodeMenu = new QMenu(m_NodeTreeView);
00157
00158
00159 m_SelectionProvider = new QmitkDataNodeSelectionProvider();
00160 m_SelectionProvider->SetItemSelectionModel(m_NodeTreeView->selectionModel());
00161 this->GetSite()->SetSelectionProvider(m_SelectionProvider);
00162
00163
00164 QmitkNodeDescriptor* unknownDataNodeDescriptor =
00165 QmitkNodeDescriptorManager::GetInstance()->GetUnknownDataNodeDescriptor();
00166
00167 QmitkNodeDescriptor* imageDataNodeDescriptor =
00168 QmitkNodeDescriptorManager::GetInstance()->GetDescriptor("Image");
00169
00170 QmitkNodeDescriptor* surfaceDataNodeDescriptor =
00171 QmitkNodeDescriptorManager::GetInstance()->GetDescriptor("Surface");
00172
00173 m_GlobalReinitAction = new QAction(QIcon(":/org.mitk.gui.qt.datamanager/Refresh_48.png"), "Global Reinit", this);
00174 QObject::connect( m_GlobalReinitAction, SIGNAL( triggered(bool) )
00175 , this, SLOT( GlobalReinit(bool) ) );
00176 unknownDataNodeDescriptor->AddAction(m_GlobalReinitAction);
00177
00178 m_SaveAction = new QAction(QIcon(":/org.mitk.gui.qt.datamanager/Save_48.png"), "Save...", this);
00179 QObject::connect( m_SaveAction, SIGNAL( triggered(bool) )
00180 , this, SLOT( SaveSelectedNodes(bool) ) );
00181 unknownDataNodeDescriptor->AddAction(m_SaveAction);
00182
00183 m_RemoveAction = new QAction(QIcon(":/org.mitk.gui.qt.datamanager/Remove_48.png"), "Remove", this);
00184 QObject::connect( m_RemoveAction, SIGNAL( triggered(bool) )
00185 , this, SLOT( RemoveSelectedNodes(bool) ) );
00186 unknownDataNodeDescriptor->AddAction(m_RemoveAction);
00187
00188 m_ReinitAction = new QAction(QIcon(":/org.mitk.gui.qt.datamanager/Refresh_48.png"), "Reinit", this);
00189 QObject::connect( m_ReinitAction, SIGNAL( triggered(bool) )
00190 , this, SLOT( ReinitSelectedNodes(bool) ) );
00191 unknownDataNodeDescriptor->AddAction(m_ReinitAction);
00192
00193
00194 berry::IExtensionPointService::Pointer extensionPointService = berry::Platform::GetExtensionPointService();
00195 berry::IConfigurationElement::vector cmActions(
00196 extensionPointService->GetConfigurationElementsFor("org.mitk.gui.qt.datamanager.contextMenuActions") );
00197 berry::IConfigurationElement::vector::iterator cmActionsIt;
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238 m_OpacitySlider = new QSlider;
00239 m_OpacitySlider->setMinimum(0);
00240 m_OpacitySlider->setMaximum(100);
00241 m_OpacitySlider->setOrientation(Qt::Horizontal);
00242 QObject::connect( m_OpacitySlider, SIGNAL( valueChanged(int) )
00243 , this, SLOT( OpacityChanged(int) ) );
00244
00245 QLabel* _OpacityLabel = new QLabel("Opacity: ");
00246 QHBoxLayout* _OpacityWidgetLayout = new QHBoxLayout;
00247 _OpacityWidgetLayout->setContentsMargins(4,4,4,4);
00248 _OpacityWidgetLayout->addWidget(_OpacityLabel);
00249 _OpacityWidgetLayout->addWidget(m_OpacitySlider);
00250 QWidget* _OpacityWidget = new QWidget;
00251 _OpacityWidget->setLayout(_OpacityWidgetLayout);
00252
00253 m_OpacityAction = new QWidgetAction(this);
00254 m_OpacityAction->setDefaultWidget(_OpacityWidget);
00255 QObject::connect( m_OpacityAction, SIGNAL( changed() )
00256 , this, SLOT( OpacityActionChanged() ) );
00257 unknownDataNodeDescriptor->AddAction(m_OpacityAction, false);
00258
00259 m_ColorButton = new QPushButton;
00260 m_ColorButton->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Minimum);
00261
00262 QObject::connect( m_ColorButton, SIGNAL( clicked() )
00263 , this, SLOT( ColorChanged() ) );
00264
00265 QLabel* _ColorLabel = new QLabel("Color: ");
00266 _ColorLabel->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
00267 QHBoxLayout* _ColorWidgetLayout = new QHBoxLayout;
00268 _ColorWidgetLayout->setContentsMargins(4,4,4,4);
00269 _ColorWidgetLayout->addWidget(_ColorLabel);
00270 _ColorWidgetLayout->addWidget(m_ColorButton);
00271 QWidget* _ColorWidget = new QWidget;
00272 _ColorWidget->setLayout(_ColorWidgetLayout);
00273
00274 m_ColorAction = new QWidgetAction(this);
00275 m_ColorAction->setDefaultWidget(_ColorWidget);
00276 QObject::connect( m_ColorAction, SIGNAL( changed() )
00277 , this, SLOT( ColorActionChanged() ) );
00278 unknownDataNodeDescriptor->AddAction(m_ColorAction, false);
00279
00280 m_TextureInterpolation = new QAction("Texture Interpolation", this);
00281 m_TextureInterpolation->setCheckable ( true );
00282 QObject::connect( m_TextureInterpolation, SIGNAL( changed() )
00283 , this, SLOT( TextureInterpolationChanged() ) );
00284 QObject::connect( m_TextureInterpolation, SIGNAL( toggled(bool) )
00285 , this, SLOT( TextureInterpolationToggled(bool) ) );
00286 imageDataNodeDescriptor->AddAction(m_TextureInterpolation, false);
00287
00288 m_SurfaceRepresentation = new QAction("Surface Representation", this);
00289 m_SurfaceRepresentation->setMenu(new QMenu);
00290
00291 QObject::connect( m_SurfaceRepresentation->menu(), SIGNAL( aboutToShow() )
00292 , this, SLOT( SurfaceRepresentationMenuAboutToShow() ) );
00293 surfaceDataNodeDescriptor->AddAction(m_SurfaceRepresentation, false);
00294
00295 m_ShowOnlySelectedNodes
00296 = new QAction(QIcon(":/org.mitk.gui.qt.datamanager/ShowSelectedNode_48.png")
00297 , "Show only selected nodes", this);
00298 QObject::connect( m_ShowOnlySelectedNodes, SIGNAL( triggered(bool) )
00299 , this, SLOT( ShowOnlySelectedNodes(bool) ) );
00300 unknownDataNodeDescriptor->AddAction(m_ShowOnlySelectedNodes);
00301
00302 m_ToggleSelectedVisibility
00303 = new QAction(QIcon(":/org.mitk.gui.qt.datamanager/InvertShowSelectedNode_48.png")
00304 , "Toggle visibility", this);
00305 QObject::connect( m_ToggleSelectedVisibility, SIGNAL( triggered(bool) )
00306 , this, SLOT( ToggleVisibilityOfSelectedNodes(bool) ) );
00307 unknownDataNodeDescriptor->AddAction(m_ToggleSelectedVisibility);
00308
00309 m_ActionShowInfoDialog
00310 = new QAction(QIcon(":/org.mitk.gui.qt.datamanager/ShowDataInfo_48.png")
00311 , "Details...", this);
00312 QObject::connect( m_ActionShowInfoDialog, SIGNAL( triggered(bool) )
00313 , this, SLOT( ShowInfoDialogForSelectedNodes(bool) ) );
00314 unknownDataNodeDescriptor->AddAction(m_ActionShowInfoDialog);
00315
00316 m_OtsuFilterAction = new QAction("Apply Otsu Filter", this);
00317 QObject::connect( m_OtsuFilterAction, SIGNAL( triggered(bool) )
00318 , this, SLOT( OtsuFilter(bool) ) );
00319
00320
00321
00322 QGridLayout* _DndFrameWidgetLayout = new QGridLayout;
00323 _DndFrameWidgetLayout->addWidget(m_NodeTreeView, 0, 0);
00324 _DndFrameWidgetLayout->setContentsMargins(0,0,0,0);
00325
00326 m_DndFrameWidget = new QmitkDnDFrameWidget(m_Parent);
00327 m_DndFrameWidget->setLayout(_DndFrameWidgetLayout);
00328
00329 QVBoxLayout* layout = new QVBoxLayout(parent);
00330 layout->addWidget(m_DndFrameWidget);
00331 layout->setContentsMargins(0,0,0,0);
00332
00333 m_Parent->setLayout(layout);
00334
00335 m_SelectionListener = new berry::SelectionChangedAdapter<QmitkDataManagerView>
00336 (this, &QmitkDataManagerView::SelectionChanged);
00337
00338 berry::ISelectionService* s = GetSite()->GetWorkbenchWindow()->GetSelectionService();
00339 s->AddSelectionListener(m_SelectionListener);
00340
00341 }
00342
00343 void QmitkDataManagerView::SetFocus()
00344 {
00345 }
00346
00347 void QmitkDataManagerView::ContextMenuActionTriggered( bool )
00348 {
00349 QAction* action = qobject_cast<QAction*> ( sender() );
00350
00351 std::map<QAction*, berry::IConfigurationElement::Pointer>::iterator it
00352 = m_ConfElements.find( action );
00353 if( it == m_ConfElements.end() )
00354 {
00355 MITK_WARN << "associated conf element for action " << action->text().toStdString() << " not found";
00356 return;
00357 }
00358 berry::IConfigurationElement::Pointer confElem = it->second;
00359 mitk::IContextMenuAction* contextMenuAction = dynamic_cast<mitk::IContextMenuAction*>
00360 (confElem->CreateExecutableExtension<mitk::IContextMenuAction>("class") );
00361 std::string className;
00362 std::string smoothed;
00363 confElem->GetAttribute("class", className);
00364 confElem->GetAttribute("smoothed", smoothed);
00365 if(className == "QmitkThresholdAction")
00366 {
00367 contextMenuAction->SetDataStorage(this->GetDataStorage());
00368 }
00369 if(className == "QmitkCreatePolygonModelAction")
00370 {
00371 contextMenuAction->SetDataStorage(this->GetDataStorage());
00372 if(smoothed == "false")
00373 {
00374 contextMenuAction->SetSmoothed(false);
00375 }
00376 else
00377 {
00378 contextMenuAction->SetSmoothed(true);
00379 }
00380 }
00381 if(className == "QmitkStatisticsAction")
00382 {
00383 contextMenuAction->SetFunctionality(this);
00384 }
00385 contextMenuAction->Run( this->GetSelectedNodes() );
00386 }
00387
00388 mitk::DataStorage::Pointer QmitkDataManagerView::GetDataStorage() const
00389 {
00390 mitk::IDataStorageService::Pointer service =
00391 berry::Platform::GetServiceRegistry().GetServiceById<mitk::IDataStorageService>(mitk::IDataStorageService::ID);
00392
00393 if (service.IsNotNull())
00394 {
00395 return service->GetDefaultDataStorage()->GetDataStorage();
00396 }
00397
00398 return 0;
00399 }
00400
00401 void QmitkDataManagerView::OnPreferencesChanged(const berry::IBerryPreferences* prefs)
00402 {
00403 m_NodeTreeModel->SetPlaceNewNodesOnTop( prefs->GetBool("Place new nodes on top", true) );
00404 }
00405
00406 void QmitkDataManagerView::NodeTableViewContextMenuRequested( const QPoint & pos )
00407 {
00408 QModelIndex selected = m_NodeTreeView->indexAt ( pos );
00409 mitk::DataNode::Pointer node = m_NodeTreeModel->GetNode(selected);
00410 std::vector<mitk::DataNode*> selectedNodes = this->GetSelectedNodes();
00411
00412 if(!selectedNodes.empty())
00413 {
00414 m_NodeMenu->clear();
00415 QList<QAction*> actions;
00416 if(selectedNodes.size() == 1 )
00417 {
00418 actions = QmitkNodeDescriptorManager::GetInstance()->GetActions(node);
00419
00420 for(QList<QAction*>::iterator it = actions.begin(); it != actions.end(); ++it)
00421 {
00422 (*it)->setData(QVariant::fromValue(node.GetPointer()));
00423 }
00424 }
00425 else
00426 actions = QmitkNodeDescriptorManager::GetInstance()->GetActions(selectedNodes);
00427
00428 m_NodeMenu->addActions(actions);
00429 m_NodeMenu->popup(QCursor::pos());
00430 }
00431 }
00432
00433 void QmitkDataManagerView::OpacityChanged(int value)
00434 {
00435 mitk::DataNode* node = m_NodeTreeModel->GetNode(m_NodeTreeView->selectionModel()->currentIndex());
00436 if(node)
00437 {
00438 float opacity = static_cast<float>(value)/100.0f;
00439 node->SetFloatProperty("opacity", opacity);
00440 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00441 }
00442
00443 MITK_INFO << "slider changed";
00444 }
00445
00446 void QmitkDataManagerView::OpacityActionChanged()
00447 {
00448 mitk::DataNode* node = m_NodeTreeModel->GetNode(m_NodeTreeView->selectionModel()->currentIndex());
00449 if(node)
00450 {
00451 float opacity = 0.0;
00452 if(node->GetFloatProperty("opacity", opacity))
00453 {
00454 m_OpacitySlider->setValue(static_cast<int>(opacity*100));
00455 }
00456 }
00457 MITK_INFO << "changed";
00458 }
00459
00460 void QmitkDataManagerView::ColorChanged()
00461 {
00462 mitk::DataNode* node = m_NodeTreeModel->GetNode(m_NodeTreeView->selectionModel()->currentIndex());
00463 if(node)
00464 {
00465 QColor color = QColorDialog::getColor();
00466 m_ColorButton->setAutoFillBackground(true);
00467 node->SetProperty("color",mitk::ColorProperty::New(color.red()/255.0,color.green()/255.0,color.blue()/255.0));
00468 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00469 }
00470
00471 MITK_INFO << "slider changed";
00472 }
00473
00474 void QmitkDataManagerView::ColorActionChanged()
00475 {
00476 mitk::DataNode* node = m_NodeTreeModel->GetNode(m_NodeTreeView->selectionModel()->currentIndex());
00477 if(node)
00478 {
00479 mitk::Color color;
00480 mitk::ColorProperty::Pointer colorProp;
00481 node->GetProperty(colorProp,"color");
00482 if(colorProp.IsNull())
00483 return;
00484 color = colorProp->GetValue();
00485
00486 QString styleSheet = "background-color:rgb(";
00487 styleSheet.append(QString::number(color[0]*255));
00488 styleSheet.append(",");
00489 styleSheet.append(QString::number(color[1]*255));
00490 styleSheet.append(",");
00491 styleSheet.append(QString::number(color[2]*255));
00492 styleSheet.append(")");
00493 m_ColorButton->setStyleSheet(styleSheet);
00494 }
00495 MITK_INFO << "changed";
00496 }
00497
00498 void QmitkDataManagerView::TextureInterpolationChanged()
00499 {
00500 mitk::DataNode* node = m_NodeTreeModel->GetNode(m_NodeTreeView->selectionModel()->currentIndex());
00501 if(node)
00502 {
00503 bool textureInterpolation = false;
00504 node->GetBoolProperty("texture interpolation", textureInterpolation);
00505 m_TextureInterpolation->setChecked(textureInterpolation);
00506 }
00507 }
00508
00509 void QmitkDataManagerView::TextureInterpolationToggled( bool checked )
00510 {
00511 mitk::DataNode* node = m_NodeTreeModel->GetNode(m_NodeTreeView->selectionModel()->currentIndex());
00512 if(node)
00513 {
00514 node->SetBoolProperty("texture interpolation", checked);
00515 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00516 }
00517
00518 }
00519
00520 void QmitkDataManagerView::SurfaceRepresentationMenuAboutToShow()
00521 {
00522 mitk::DataNode* node = m_NodeTreeModel->GetNode(m_NodeTreeView->selectionModel()->currentIndex());
00523 if(!node)
00524 return;
00525
00526 mitk::EnumerationProperty* representationProp =
00527 dynamic_cast<mitk::EnumerationProperty*> (node->GetProperty("material.representation"));
00528 if(!representationProp)
00529 return;
00530
00531
00532 m_SurfaceRepresentation->menu()->clear();
00533 QAction* tmp;
00534
00535
00536 for(mitk::EnumerationProperty::EnumConstIterator it=representationProp->Begin(); it!=representationProp->End()
00537 ; it++)
00538 {
00539 tmp = m_SurfaceRepresentation->menu()->addAction(QString::fromStdString(it->second));
00540 tmp->setCheckable(true);
00541
00542 if(it->second == representationProp->GetValueAsString())
00543 {
00544 tmp->setChecked(true);
00545 }
00546
00547 QObject::connect( tmp, SIGNAL( triggered(bool) )
00548 , this, SLOT( SurfaceRepresentationActionToggled(bool) ) );
00549 }
00550 }
00551
00552 void QmitkDataManagerView::SurfaceRepresentationActionToggled( bool )
00553 {
00554 mitk::DataNode* node = m_NodeTreeModel->GetNode(m_NodeTreeView->selectionModel()->currentIndex());
00555 if(!node)
00556 return;
00557
00558 mitk::EnumerationProperty* representationProp =
00559 dynamic_cast<mitk::EnumerationProperty*> (node->GetProperty("material.representation"));
00560 if(!representationProp)
00561 return;
00562
00563 QAction* senderAction = qobject_cast<QAction*> ( QObject::sender() );
00564
00565 if(!senderAction)
00566 return;
00567
00568 std::string activatedItem = senderAction->text().toStdString();
00569
00570 if ( activatedItem != representationProp->GetValueAsString() )
00571 {
00572 if ( representationProp->IsValidEnumerationValue( activatedItem ) )
00573 {
00574 representationProp->SetValue( activatedItem );
00575 representationProp->InvokeEvent( itk::ModifiedEvent() );
00576 representationProp->Modified();
00577
00578 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00579 }
00580 }
00581
00582 }
00583
00584 void QmitkDataManagerView::SaveSelectedNodes( bool )
00585 {
00586 QModelIndexList indexesOfSelectedRows = m_NodeTreeView->selectionModel()->selectedRows();
00587
00588 mitk::DataNode* node = 0;
00589 unsigned int indexesOfSelectedRowsSize = indexesOfSelectedRows.size();
00590 for (unsigned int i = 0; i<indexesOfSelectedRowsSize; ++i)
00591 {
00592 node = m_NodeTreeModel->GetNode(indexesOfSelectedRows.at(i));
00593
00594 if ( node != 0 )
00595 {
00596 mitk::BaseData::Pointer data = node->GetData();
00597 if (data.IsNotNull())
00598 {
00599 QString error;
00600 try
00601 {
00602 CommonFunctionality::SaveBaseData( data.GetPointer(), node->GetName().c_str() );
00603 }
00604 catch(std::exception& e)
00605 {
00606 error = e.what();
00607 }
00608 catch(...)
00609 {
00610 error = "Unknown error occured";
00611 }
00612 if( !error.isEmpty() )
00613 QMessageBox::critical( m_Parent, "Error saving...", error );
00614 }
00615 }
00616 }
00617 }
00618
00619 void QmitkDataManagerView::ReinitSelectedNodes( bool )
00620 {
00621 this->ReinitMultiWidgetEditor();
00622 std::vector<mitk::DataNode*> selectedNodes = this->GetSelectedNodes();
00623
00624 mitk::DataNode* node = 0;
00625 for (std::vector<mitk::DataNode*>::iterator it = selectedNodes.begin()
00626 ; it != selectedNodes.end(); it++)
00627 {
00628 node = *it;
00629 mitk::BaseData::Pointer basedata = node->GetData();
00630 if (basedata.IsNotNull())
00631 {
00632 mitk::RenderingManager::GetInstance()->InitializeViews(
00633 basedata->GetTimeSlicedGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true );
00634 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00635 }
00636 }
00637 }
00638
00639 void QmitkDataManagerView::RemoveSelectedNodes( bool )
00640 {
00641 QModelIndexList indexesOfSelectedRows = m_NodeTreeView->selectionModel()->selectedRows();
00642 if(indexesOfSelectedRows.size() < 1)
00643 {
00644 return;
00645 }
00646 std::vector<mitk::DataNode*> selectedNodes;
00647
00648 mitk::DataNode* node = 0;
00649 QString question = tr("Do you really want to remove ");
00650
00651 for (QModelIndexList::iterator it = indexesOfSelectedRows.begin()
00652 ; it != indexesOfSelectedRows.end(); it++)
00653 {
00654 node = m_NodeTreeModel->GetNode(*it);
00655
00656 if ( node != 0 )
00657 {
00658 selectedNodes.push_back(node);
00659 question.append(QString::fromStdString(node->GetName()));
00660 question.append(", ");
00661 }
00662 }
00663
00664 question = question.remove(question.size()-2, 2);
00665 question.append(" from data storage?");
00666
00667 QMessageBox::StandardButton answerButton = QMessageBox::question( m_Parent
00668 , tr("DataManager")
00669 , question
00670 , QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
00671
00672 if(answerButton == QMessageBox::Yes)
00673 {
00674 for (std::vector<mitk::DataNode*>::iterator it = selectedNodes.begin()
00675 ; it != selectedNodes.end(); it++)
00676 {
00677 node = *it;
00678 this->GetDataStorage()->Remove(node);
00679 this->GlobalReinit(false);
00680 }
00681 }
00682 }
00683
00684 void QmitkDataManagerView::MakeAllNodesInvisible( bool )
00685 {
00686 std::vector<mitk::DataNode*> nodes = m_NodeTreeModel->GetNodeSet();
00687
00688 for (std::vector<mitk::DataNode*>::iterator it = nodes.begin()
00689 ; it != nodes.end(); it++)
00690 {
00691 (*it)->SetVisibility(false);
00692 }
00693
00694 }
00695
00696 void QmitkDataManagerView::ShowOnlySelectedNodes( bool )
00697 {
00698 std::vector<mitk::DataNode*> selectedNodes = this->GetSelectedNodes();
00699 std::vector<mitk::DataNode*> allNodes = m_NodeTreeModel->GetNodeSet();
00700 mitk::DataNode* node = 0;
00701
00702 for (std::vector<mitk::DataNode*>::iterator it = allNodes.begin()
00703 ; it != allNodes.end(); it++)
00704 {
00705 node = *it;
00706 if(std::find(selectedNodes.begin(), selectedNodes.end(), node) == selectedNodes.end())
00707 node->SetVisibility(false);
00708 else
00709 node->SetVisibility(true);
00710 }
00711
00712 }
00713
00714 void QmitkDataManagerView::ToggleVisibilityOfSelectedNodes( bool )
00715 {
00716 std::vector<mitk::DataNode*> selectedNodes = this->GetSelectedNodes();
00717
00718 bool isVisible = false;
00719 mitk::DataNode* node = 0;
00720 for (std::vector<mitk::DataNode*>::iterator it = selectedNodes.begin()
00721 ; it != selectedNodes.end(); it++)
00722 {
00723 isVisible = false;
00724 node = *it;
00725 node->GetBoolProperty("visible", isVisible);
00726 node->SetVisibility(!isVisible);
00727 }
00728
00729 }
00730
00731 void QmitkDataManagerView::ShowInfoDialogForSelectedNodes( bool )
00732 {
00733 std::vector<mitk::DataNode*> selectedNodes = this->GetSelectedNodes();
00734
00735 QmitkInfoDialog _QmitkInfoDialog(selectedNodes, this->m_Parent);
00736 _QmitkInfoDialog.exec();
00737 }
00738
00739 void QmitkDataManagerView::Load( bool )
00740 {
00741 QStringList fileNames = QFileDialog::getOpenFileNames(NULL, "Load data", "", mitk::CoreObjectFactory::GetInstance()->GetFileExtensions());
00742 for ( QStringList::Iterator it = fileNames.begin(); it != fileNames.end(); ++it )
00743 {
00744 FileOpen((*it).toAscii(), 0);
00745 }
00746 }
00747
00748 void QmitkDataManagerView::FileOpen( const char * fileName, mitk::DataNode* parentNode )
00749 {
00750 mitk::DataNodeFactory::Pointer factory = mitk::DataNodeFactory::New();
00751
00752 try
00753 {
00754 factory->SetFileName( fileName );
00755
00756 QApplication::setOverrideCursor( QCursor(Qt::WaitCursor) );
00757
00758 factory->Update();
00759
00760 for ( unsigned int i = 0 ; i < factory->GetNumberOfOutputs( ); ++i )
00761 {
00762 mitk::DataNode::Pointer node = factory->GetOutput( i );
00763 if ( ( node.IsNotNull() ) && ( node->GetData() != NULL ) )
00764 {
00765 this->GetDataStorage()->Add(node, parentNode);
00766 mitk::BaseData::Pointer basedata = node->GetData();
00767 mitk::RenderingManager::GetInstance()->InitializeViews(
00768 basedata->GetTimeSlicedGeometry(), mitk::RenderingManager::REQUEST_UPDATE_ALL, true );
00769
00770 }
00771 }
00772 }
00773 catch ( itk::ExceptionObject & ex )
00774 {
00775 itkGenericOutputMacro( << "Exception during file open: " << ex );
00776 }
00777
00778 QApplication::restoreOverrideCursor();
00779 }
00780
00781 void QmitkDataManagerView::GlobalReinit( bool )
00782 {
00783 this->ReinitMultiWidgetEditor();
00784
00785 mitk::NodePredicateNot::Pointer pred
00786 = mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("includeInBoundingBox"
00787 , mitk::BoolProperty::New(false)));
00788
00789 mitk::DataStorage::SetOfObjects::ConstPointer rs = this->GetDataStorage()->GetSubset(pred);
00790
00791 mitk::TimeSlicedGeometry::Pointer bounds = this->GetDataStorage()->ComputeBoundingGeometry3D(rs);
00792
00793 mitk::RenderingManager::GetInstance()->InitializeViews(bounds);
00794 }
00795
00796 std::vector<mitk::DataNode*> QmitkDataManagerView::GetSelectedNodes() const
00797 {
00798 QModelIndexList indexesOfSelectedRows = m_NodeTreeView->selectionModel()->selectedRows();
00799 std::vector<mitk::DataNode*> selectedNodes;
00800
00801 mitk::DataNode* node = 0;
00802 for (QModelIndexList::iterator it = indexesOfSelectedRows.begin()
00803 ; it != indexesOfSelectedRows.end(); it++)
00804 {
00805 node = 0;
00806 node = m_NodeTreeModel->GetNode(*it);
00807
00808 if ( node != 0 )
00809 selectedNodes.push_back(node);
00810 }
00811
00812 return selectedNodes;
00813 }
00814
00815 void QmitkDataManagerView::SelectionChanged( berry::IWorkbenchPart::Pointer part , berry::ISelection::ConstPointer selection )
00816 {
00817 if(part.GetPointer() == this)
00818 return;
00819 mitk::DataNodeSelection::ConstPointer _DataNodeSelection
00820 = selection.Cast<const mitk::DataNodeSelection>();
00821
00822 if(_DataNodeSelection.IsNull())
00823 return;
00824
00825 std::vector<mitk::DataNode*> selectedNodes;
00826 mitk::DataNodeObject* _DataNodeObject = 0;
00827 mitk::DataNode* _DataNode = 0;
00828 QItemSelection newSelection;
00829
00830 m_NodeTreeView->selectionModel()->reset();
00831
00832 for(mitk::DataNodeSelection::iterator it = _DataNodeSelection->Begin();
00833 it != _DataNodeSelection->End(); ++it)
00834 {
00835 _DataNodeObject = dynamic_cast<mitk::DataNodeObject*>((*it).GetPointer());
00836 if(_DataNodeObject)
00837 _DataNode = _DataNodeObject->GetDataNode();
00838 QModelIndex treeIndex = m_NodeTreeModel->GetIndex(_DataNode);
00839 if(treeIndex.isValid())
00840 newSelection.select(treeIndex, treeIndex);
00841 }
00842 m_NodeTreeView->selectionModel()->select(newSelection, QItemSelectionModel::SelectCurrent);
00843 }
00844
00845 void QmitkDataManagerView::OtsuFilter( bool )
00846 {
00847 std::vector<mitk::DataNode*> selectedNodes = this->GetSelectedNodes();
00848
00849 mitk::DataNode* _DataNode = 0;
00850 mitk::Image::Pointer mitkImage = 0;
00851 for (std::vector<mitk::DataNode*>::iterator it = selectedNodes.begin()
00852 ; it != selectedNodes.end(); it++)
00853 {
00854 _DataNode = *it;
00855 mitkImage = dynamic_cast<mitk::Image*>( _DataNode->GetData() );
00856
00857 if(mitkImage.IsNull())
00858 continue;
00859
00860 try
00861 {
00862
00863 const unsigned short dim = 3;
00864 typedef short InputPixelType;
00865 typedef unsigned char OutputPixelType;
00866
00867 typedef itk::Image< InputPixelType, dim > InputImageType;
00868 typedef itk::Image< OutputPixelType, dim > OutputImageType;
00869
00870 typedef itk::OtsuThresholdImageFilter< InputImageType, OutputImageType > FilterType;
00871 FilterType::Pointer filter = FilterType::New();
00872
00873 filter->SetOutsideValue( 1 );
00874 filter->SetInsideValue( 0 );
00875
00876 InputImageType::Pointer itkImage;
00877 mitk::CastToItkImage(mitkImage, itkImage);
00878
00879 filter->SetInput( itkImage );
00880
00881 filter->Update();
00882
00883 mitk::DataNode::Pointer resultNode = mitk::DataNode::New();
00884 std::string nameOfResultImage = _DataNode->GetName();
00885 nameOfResultImage.append("Otsu");
00886 resultNode->SetProperty("name", mitk::StringProperty::New(nameOfResultImage) );
00887 resultNode->SetProperty("binary", mitk::BoolProperty::New(true) );
00888 resultNode->SetData( mitk::ImportItkImage ( filter->GetOutput() ) );
00889
00890 this->GetDataStorage()->Add(resultNode, _DataNode);
00891
00892 }
00893 catch( std::exception& err )
00894 {
00895 MITK_ERROR(this->GetClassName()) << err.what();
00896 }
00897
00898 }
00899 }
00900
00901 void QmitkDataManagerView::NodeTreeViewRowsInserted( const QModelIndex & parent, int, int )
00902 {
00903 m_NodeTreeView->setExpanded(parent, true);
00904
00905
00906
00907
00908
00909
00910 }
00911
00912 void QmitkDataManagerView::NodeSelectionChanged( const QItemSelection & , const QItemSelection & )
00913 {
00914 std::vector<mitk::DataNode*> nodes = m_NodeTreeModel->GetNodeSet();
00915 mitk::DataNode* node = 0;
00916
00917 for (std::vector<mitk::DataNode*>::iterator it = nodes.begin()
00918 ; it != nodes.end(); it++)
00919 {
00920 node = *it;
00921 if ( node )
00922 node->SetBoolProperty("selected", false);
00923 }
00924
00925 nodes.clear();
00926 nodes = this->GetSelectedNodes();
00927
00928 for (std::vector<mitk::DataNode*>::iterator it = nodes.begin()
00929 ; it != nodes.end(); it++)
00930 {
00931 node = *it;
00932 if ( node )
00933 node->SetBoolProperty("selected", true);
00934 }
00935
00936 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00937 }
00938
00939 void QmitkDataManagerView::ReinitMultiWidgetEditor()
00940 {
00941 berry::IEditorPart::Pointer editor =
00942 this->GetSite()->GetPage()->GetActiveEditor();
00943
00944 if (editor.Cast<QmitkStdMultiWidgetEditor>().IsNull())
00945 {
00946 mitk::IDataStorageService::Pointer service =
00947 berry::Platform::GetServiceRegistry().GetServiceById<mitk::IDataStorageService>(mitk::IDataStorageService::ID);
00948
00949 mitk::IDataStorageReference::Pointer DataStorageReference;
00950 if (service.IsNotNull())
00951 {
00952 DataStorageReference = service->GetDefaultDataStorage();
00953 }
00954 mitk::DataStorageEditorInput::Pointer editorInput;
00955 editorInput = new mitk::DataStorageEditorInput(DataStorageReference);
00956
00957 berry::IEditorPart::Pointer editor = this->GetSite()->GetPage()->OpenEditor(editorInput, QmitkStdMultiWidgetEditor::EDITOR_ID, false);
00958 }
00959 }