diff --git a/Plugins/PluginList.cmake b/Plugins/PluginList.cmake
index c529e1d9df..d05f61bb36 100644
--- a/Plugins/PluginList.cmake
+++ b/Plugins/PluginList.cmake
@@ -1,111 +1,112 @@
# Plug-ins must be ordered according to their dependencies
set(MITK_PLUGINS
org.blueberry.core.runtime:ON
org.blueberry.core.expressions:OFF
org.blueberry.core.commands:OFF
org.blueberry.core.jobs:OFF
org.blueberry.ui.qt:OFF
org.blueberry.ui.qt.help:ON
org.blueberry.ui.qt.log:ON
org.blueberry.ui.qt.objectinspector:OFF
#org.blueberry.test:ON
#org.blueberry.uitest:ON
#Testing/org.blueberry.core.runtime.tests:ON
#Testing/org.blueberry.osgi.tests:ON
org.mitk.core.services:ON
org.mitk.gui.common:ON
org.mitk.planarfigure:ON
org.mitk.core.ext:OFF
org.mitk.core.jobs:OFF
org.mitk.gui.qt.application:ON
org.mitk.gui.qt.coreapplication:OFF
org.mitk.gui.qt.ext:OFF
org.mitk.gui.qt.extapplication:OFF
org.mitk.gui.qt.common:ON
org.mitk.gui.qt.stdmultiwidgeteditor:ON
org.mitk.gui.qt.common.legacy:OFF
org.mitk.gui.qt.cmdlinemodules:OFF
org.mitk.gui.qt.diffusionimagingapp:OFF
org.mitk.gui.qt.datamanager:ON
org.mitk.gui.qt.datamanagerlight:OFF
org.mitk.gui.qt.datastorageviewertest:OFF
org.mitk.gui.qt.properties:ON
org.mitk.gui.qt.basicimageprocessing:OFF
org.mitk.gui.qt.dicom:OFF
org.mitk.gui.qt.dicominspector:OFF
org.mitk.gui.qt.diffusionimaging:OFF
org.mitk.gui.qt.diffusionimaging.connectomics:OFF
org.mitk.gui.qt.diffusionimaging.denoising:OFF
org.mitk.gui.qt.diffusionimaging.fiberfox:OFF
org.mitk.gui.qt.diffusionimaging.fiberprocessing:OFF
org.mitk.gui.qt.diffusionimaging.ivim:OFF
org.mitk.gui.qt.diffusionimaging.odfpeaks:OFF
org.mitk.gui.qt.diffusionimaging.partialvolume:OFF
org.mitk.gui.qt.diffusionimaging.preprocessing:OFF
org.mitk.gui.qt.diffusionimaging.reconstruction:OFF
org.mitk.gui.qt.diffusionimaging.registration:OFF
org.mitk.gui.qt.diffusionimaging.tbss:OFF
org.mitk.gui.qt.diffusionimaging.tractography:OFF
org.mitk.gui.qt.diffusionimaging.python:OFF
org.mitk.gui.qt.dosevisualization:OFF
org.mitk.gui.qt.geometrytools:OFF
org.mitk.gui.qt.igtexamples:OFF
org.mitk.gui.qt.igttracking:OFF
org.mitk.gui.qt.lasercontrol:OFF
org.mitk.gui.qt.openigtlink:OFF
org.mitk.gui.qt.imagecropper:OFF
org.mitk.gui.qt.imagenavigator:ON
org.mitk.gui.qt.viewnavigator:OFF
org.mitk.gui.qt.materialeditor:OFF
org.mitk.gui.qt.measurementtoolbox:OFF
org.mitk.gui.qt.moviemaker:OFF
org.mitk.gui.qt.pointsetinteraction:OFF
org.mitk.gui.qt.pointsetinteractionmultispectrum:OFF
org.mitk.gui.qt.python:OFF
org.mitk.gui.qt.remeshing:OFF
org.mitk.gui.qt.segmentation:OFF
org.mitk.gui.qt.aicpregistration:OFF
org.mitk.gui.qt.renderwindowmanager:OFF
org.mitk.gui.qt.toftutorial:OFF
org.mitk.gui.qt.tofutil:OFF
org.mitk.gui.qt.tubegraph:OFF
org.mitk.gui.qt.ugvisualization:OFF
org.mitk.gui.qt.photoacoustics.pausviewer:OFF
org.mitk.gui.qt.photoacoustics.imageprocessing:OFF
org.mitk.gui.qt.photoacoustics.simulation:OFF
org.mitk.gui.qt.ultrasound:OFF
org.mitk.gui.qt.volumevisualization:OFF
org.mitk.gui.qt.eventrecorder:OFF
org.mitk.gui.qt.xnat:OFF
org.mitk.gui.qt.igt.app.echotrack:OFF
org.mitk.gui.qt.spectrocamrecorder:OFF
org.mitk.gui.qt.classificationsegmentation:OFF
org.mitk.gui.qt.overlaymanager:OFF
org.mitk.gui.qt.igt.app.hummelprotocolmeasurements:OFF
org.mitk.gui.qt.multilabelsegmentation:OFF
org.mitk.matchpoint.core.helper:OFF
org.mitk.gui.qt.matchpoint.algorithm.browser:OFF
org.mitk.gui.qt.matchpoint.algorithm.control:OFF
org.mitk.gui.qt.matchpoint.algorithm.batch:OFF
org.mitk.gui.qt.matchpoint.mapper:OFF
org.mitk.gui.qt.matchpoint.framereg:OFF
org.mitk.gui.qt.matchpoint.visualizer:OFF
org.mitk.gui.qt.matchpoint.evaluator:OFF
org.mitk.gui.qt.matchpoint.manipulator:OFF
org.mitk.gui.qt.preprocessing.resampling:OFF
org.mitk.gui.qt.cest:OFF
org.mitk.gui.qt.fit.demo:OFF
org.mitk.gui.qt.fit.inspector:OFF
org.mitk.gui.qt.fit.genericfitting:OFF
org.mitk.gui.qt.pharmacokinetics.mri:OFF
org.mitk.gui.qt.pharmacokinetics.pet:OFF
org.mitk.gui.qt.pharmacokinetics.simulation:OFF
org.mitk.gui.qt.pharmacokinetics.curvedescriptor:OFF
org.mitk.gui.qt.pharmacokinetics.concentration.mri:OFF
+ org.mitk.gui.qt.dynamicmappers:ON
)
diff --git a/Plugins/org.mitk.gui.qt.dynamicmappers/CMakeLists.txt b/Plugins/org.mitk.gui.qt.dynamicmappers/CMakeLists.txt
new file mode 100644
index 0000000000..15215a3ef3
--- /dev/null
+++ b/Plugins/org.mitk.gui.qt.dynamicmappers/CMakeLists.txt
@@ -0,0 +1,7 @@
+project(org_mitk_gui_qt_dynamicmappers)
+
+mitk_create_plugin(
+ EXPORT_DIRECTIVE RTDOSEVISUALIZATION_EXPORT
+ EXPORTED_INCLUDE_SUFFIXES src
+ MODULE_DEPENDS MitkDynamicMappers
+)
diff --git a/Plugins/org.mitk.gui.qt.dynamicmappers/files.cmake b/Plugins/org.mitk.gui.qt.dynamicmappers/files.cmake
new file mode 100644
index 0000000000..98e1eac207
--- /dev/null
+++ b/Plugins/org.mitk.gui.qt.dynamicmappers/files.cmake
@@ -0,0 +1,41 @@
+set(SRC_CPP_FILES
+)
+
+set(INTERNAL_CPP_FILES
+ org_mitk_gui_qt_dynamicmappers_Activator.cpp
+ DynamicMappersView.cpp
+)
+
+set(UI_FILES
+ src/internal/DynamicMappersViewControls.ui
+)
+
+set(MOC_H_FILES
+ src/internal/org_mitk_gui_qt_dynamicmappers_Activator.h
+ src/internal/DynamicMappersView.h
+)
+
+# list of resource files which can be used by the plug-in
+# system without loading the plug-ins shared library,
+# for example the icon used in the menu and tabs for the
+# plug-in views in the workbench
+set(CACHED_RESOURCE_FILES
+ resources/iso.png
+ plugin.xml
+)
+
+# list of Qt .qrc files which contain additional resources
+# specific to this plugin
+set(QRC_FILES
+
+)
+
+set(CPP_FILES )
+
+foreach(file ${SRC_CPP_FILES})
+ set(CPP_FILES ${CPP_FILES} src/${file})
+endforeach(file ${SRC_CPP_FILES})
+
+foreach(file ${INTERNAL_CPP_FILES})
+ set(CPP_FILES ${CPP_FILES} src/internal/${file})
+endforeach(file ${INTERNAL_CPP_FILES})
diff --git a/Plugins/org.mitk.gui.qt.dynamicmappers/manifest_headers.cmake b/Plugins/org.mitk.gui.qt.dynamicmappers/manifest_headers.cmake
new file mode 100644
index 0000000000..6775f0fdf1
--- /dev/null
+++ b/Plugins/org.mitk.gui.qt.dynamicmappers/manifest_headers.cmake
@@ -0,0 +1,5 @@
+set(Plugin-Name "DynamicMappers")
+set(Plugin-Version "0.1")
+set(Plugin-Vendor "DKFZ, Software development for Integrated Diagnostic and Therapy")
+set(Plugin-ContactAddress "simon.jung@dkfz-heidelberg.de")
+set(Require-Plugin org.mitk.gui.qt.common org.commontk.eventadmin)
diff --git a/Plugins/org.mitk.gui.qt.dynamicmappers/plugin.xml b/Plugins/org.mitk.gui.qt.dynamicmappers/plugin.xml
new file mode 100644
index 0000000000..766c7189a6
--- /dev/null
+++ b/Plugins/org.mitk.gui.qt.dynamicmappers/plugin.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/Plugins/org.mitk.gui.qt.dynamicmappers/resources/iso.png b/Plugins/org.mitk.gui.qt.dynamicmappers/resources/iso.png
new file mode 100644
index 0000000000..dbe8dccdcf
Binary files /dev/null and b/Plugins/org.mitk.gui.qt.dynamicmappers/resources/iso.png differ
diff --git a/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/DynamicMappersView.cpp b/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/DynamicMappersView.cpp
new file mode 100644
index 0000000000..570afd2da1
--- /dev/null
+++ b/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/DynamicMappersView.cpp
@@ -0,0 +1,167 @@
+/*===================================================================
+
+The Medical Imaging Interaction Toolkit (MITK)
+
+Copyright (c) German Cancer Research Center,
+Division of Medical and Biological Informatics.
+All rights reserved.
+
+This software is distributed WITHOUT ANY WARRANTY; without
+even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.
+
+See LICENSE.txt or http://www.mitk.org for details.
+
+===================================================================*/
+
+#include "DynamicMappersView.h"
+#include
+#include
+#include
+#include
+
+DynamicMappersView::DynamicMappersView() : m_Parent(nullptr), m_Controls(Ui::DynamicMappersViewControls()) {}
+
+void DynamicMappersView::RefreshServiceList()
+{
+ auto mapperInfoCollection = mitk::DynamicMappers::GetInstance()->GetRegisteredServiceInfo();
+ if (mapperInfoCollection.empty())
+ return;
+
+ QStringList header = {"id", "name", "dataType", "module", "scope", "slot", "priority"};
+ m_Controls.mapperInfoTableWidget->clear();
+ m_Controls.mapperInfoTableWidget->setColumnCount(header.size());
+ m_Controls.mapperInfoTableWidget->setHorizontalHeaderLabels(header);
+ m_Controls.mapperInfoTableWidget->setRowCount(mapperInfoCollection.size());
+ for (unsigned int y = 0; y < mapperInfoCollection.size(); ++y)
+ {
+ const auto mapperInfo = mapperInfoCollection[y];
+
+ m_Controls.mapperInfoTableWidget->setItem(
+ y, header.indexOf("id"), new QTableWidgetItem(QString::number(mapperInfo.id)));
+ m_Controls.mapperInfoTableWidget->setItem(
+ y, header.indexOf("name"), new QTableWidgetItem(QString::fromStdString(mapperInfo.name)));
+ m_Controls.mapperInfoTableWidget->setItem(
+ y, header.indexOf("dataType"), new QTableWidgetItem(QString::fromStdString(mapperInfo.dataType)));
+ m_Controls.mapperInfoTableWidget->setItem(
+ y, header.indexOf("module"), new QTableWidgetItem(QString::fromStdString(mapperInfo.module)));
+ m_Controls.mapperInfoTableWidget->setItem(
+ y, header.indexOf("scope"), new QTableWidgetItem(QString::fromStdString(mapperInfo.scope)));
+ m_Controls.mapperInfoTableWidget->setItem(
+ y, header.indexOf("slot"), new QTableWidgetItem(QString::number(mapperInfo.slot)));
+ m_Controls.mapperInfoTableWidget->setItem(
+ y, header.indexOf("priority"), new QTableWidgetItem(QString::number(mapperInfo.priority)));
+ }
+ for (auto item : m_Controls.mapperInfoTableWidget->findItems("", Qt::MatchContains))
+ {
+ item->setFlags(item->flags() ^ Qt::ItemIsEditable ^ Qt::ItemIsSelectable);
+ }
+}
+
+void DynamicMappersView::OnAddMapperServiceClicked()
+{
+ const auto path =
+ QFileDialog::getOpenFileName(nullptr, "Open mapper service", "", "Mapper Services (*.dll)").toStdString();
+ mitk::DynamicMappers::GetInstance()->LoadSharedLibrary(path);
+ this->RefreshServiceList();
+ this->RefreshServiceSelector();
+}
+
+void DynamicMappersView::OnUnloadClicked()
+{
+ mitk::DynamicMappers::GetInstance()->UnloadAllSharedLibraries();
+ mitk::RenderingManager::GetInstance()->RequestUpdateAll();
+ this->RefreshServiceList();
+ this->RefreshServiceSelector();
+}
+
+void DynamicMappersView::OnServiceSelectionChanged(QString newText)
+{
+ if (m_SelectedNode.IsNull())
+ return;
+
+ QStringList info = newText.split('\t');
+ if (info.empty())
+ return;
+
+ bool conversionSuccess;
+ const int id = info[0].toInt(&conversionSuccess);
+ if (!conversionSuccess)
+ return;
+
+ mitk::DynamicMappers::GetInstance()->ChangeMapperService(m_SelectedNode, id);
+ mitk::RenderingManager::GetInstance()->RequestUpdateAll();
+}
+
+void DynamicMappersView::CreateQtPartControl(QWidget *parent)
+{
+ m_Parent = parent;
+ m_Controls.setupUi(parent);
+
+ connect(m_Controls.addBtn, SIGNAL(clicked()), this, SLOT(OnAddMapperServiceClicked()));
+ connect(
+ m_Controls.cbServiceSelector, SIGNAL(currentTextChanged(QString)), this, SLOT(OnServiceSelectionChanged(QString)));
+ connect(m_Controls.unloadBtn, SIGNAL(clicked()), this, SLOT(OnUnloadClicked()));
+ m_Parent->setEnabled(false);
+}
+
+void DynamicMappersView::SetFocus()
+{
+ m_Parent->setEnabled(true);
+ this->RefreshServiceList();
+}
+
+void DynamicMappersView::RefreshServiceSelector()
+{
+ m_Controls.cbServiceSelector->clear();
+ if (m_SelectedNode.IsNull())
+ {
+ m_Controls.lblNodeName->setText("Select a node to change the mapper");
+ return;
+ }
+
+ m_Controls.lblNodeName->setText(QString::fromStdString(m_SelectedNode->GetName()));
+
+ QStringList serviceElements;
+ auto mapperInfoCollection = mitk::DynamicMappers::GetInstance()->GetRegisteredServiceInfo();
+ for (auto &mapperInfo : mapperInfoCollection)
+ {
+ if (mapperInfo.dataType == m_SelectedNode->GetData()->GetNameOfClass())
+ {
+ QString serviceId = QString::number(mapperInfo.id);
+ QString slotId = QString::number(mapperInfo.slot);
+ QString serviceName = QString::fromStdString(mapperInfo.name);
+
+ QString info = serviceId.append('\t').append("\tslot_").append(slotId);
+
+ bool conversionSuccess = false;
+ auto currentMapper = m_SelectedNode->GetMapper(slotId.toInt(&conversionSuccess));
+ if (!conversionSuccess || nullptr == currentMapper)
+ {
+ continue;
+ }
+ if (serviceName == currentMapper->GetNameOfClass())
+ {
+ // If we got the currently used mapper service add it directly so it is the default selection
+ m_Controls.cbServiceSelector->addItem(info);
+ }
+ else
+ {
+ // All other mapper services are loaded collectively in the end
+ serviceElements.append(info);
+ }
+ }
+ }
+ if (m_Controls.cbServiceSelector->count() == 0)
+ {
+ m_Controls.cbServiceSelector->addItem("Internal Mapper used");
+ }
+ m_Controls.cbServiceSelector->addItems(serviceElements);
+}
+
+void DynamicMappersView::OnSelectionChanged(berry::IWorkbenchPart::Pointer part,
+ const QList &nodes)
+{
+ m_SelectedNode = nodes.empty() ? nullptr : nodes.front();
+ RefreshServiceSelector();
+}
diff --git a/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/DynamicMappersView.h b/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/DynamicMappersView.h
new file mode 100644
index 0000000000..f1d0b769fc
--- /dev/null
+++ b/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/DynamicMappersView.h
@@ -0,0 +1,56 @@
+/*===================================================================
+
+The Medical Imaging Interaction Toolkit (MITK)
+
+Copyright (c) German Cancer Research Center,
+Division of Medical and Biological Informatics.
+All rights reserved.
+
+This software is distributed WITHOUT ANY WARRANTY; without
+even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.
+
+See LICENSE.txt or http://www.mitk.org for details.
+
+===================================================================*/
+
+
+#ifndef DynamicMappersView_h
+#define DynamicMappersView_h
+
+#include
+#include
+
+class DynamicMappersView : public QmitkAbstractView
+{
+ // this is needed for all Qt objects that should have a Qt meta-object
+ // (everything that derives from QObject and wants to have signal/slots)
+ Q_OBJECT
+
+public:
+
+ DynamicMappersView();
+ virtual ~DynamicMappersView() = default;
+
+ void RefreshServiceList();
+
+ public slots:
+ void OnServiceSelectionChanged(QString newText);
+ void OnAddMapperServiceClicked();
+ void OnUnloadClicked();
+
+protected:
+
+ virtual void CreateQtPartControl(QWidget *parent) override;
+ virtual void SetFocus() override;
+ void RefreshServiceSelector();
+
+private:
+ void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override;
+
+ QWidget* m_Parent;
+ Ui::DynamicMappersViewControls m_Controls;
+ mitk::DataNode::Pointer m_SelectedNode;
+};
+
+#endif // DynamicMappersView_h
diff --git a/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/DynamicMappersViewControls.ui b/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/DynamicMappersViewControls.ui
new file mode 100644
index 0000000000..0e26193a35
--- /dev/null
+++ b/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/DynamicMappersViewControls.ui
@@ -0,0 +1,74 @@
+
+
+ DynamicMappersViewControls
+
+
+
+ 0
+ 0
+ 421
+ 651
+
+
+
+
+ 0
+ 0
+
+
+
+ QmitkTemplate
+
+
+
+ 5
+
+
+ 5
+
+
+ 5
+
+
+ 5
+
+
+ 5
+
+ -
+
+
+ -
+
+
-
+
+
+ Select a node to change the mapper
+
+
+
+ -
+
+
+
+
+ -
+
+
+ Add mapper service ...
+
+
+
+ -
+
+
+ Unload shared libraries (loaded through this plugin)
+
+
+
+
+
+
+
+
+
diff --git a/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/org_mitk_gui_qt_dynamicmappers_Activator.cpp b/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/org_mitk_gui_qt_dynamicmappers_Activator.cpp
new file mode 100644
index 0000000000..a5b3148e79
--- /dev/null
+++ b/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/org_mitk_gui_qt_dynamicmappers_Activator.cpp
@@ -0,0 +1,44 @@
+/*===================================================================
+
+The Medical Imaging Interaction Toolkit (MITK)
+
+Copyright (c) German Cancer Research Center,
+Division of Medical and Biological Informatics.
+All rights reserved.
+
+This software is distributed WITHOUT ANY WARRANTY; without
+even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.
+
+See LICENSE.txt or http://www.mitk.org for details.
+
+===================================================================*/
+
+
+#include "org_mitk_gui_qt_dynamicmappers_Activator.h"
+#include "DynamicMappersView.h"
+
+namespace mitk {
+
+ ctkPluginContext* org_mitk_gui_qt_dynamicmappers_Activator::m_Context = nullptr;
+
+ void org_mitk_gui_qt_dynamicmappers_Activator::start(ctkPluginContext* context)
+ {
+ BERRY_REGISTER_EXTENSION_CLASS(DynamicMappersView, context);
+
+ m_Context = context;
+ }
+
+ void org_mitk_gui_qt_dynamicmappers_Activator::stop(ctkPluginContext* context)
+ {
+ Q_UNUSED(context);
+
+ m_Context = nullptr;
+ }
+
+ ctkPluginContext* org_mitk_gui_qt_dynamicmappers_Activator::GetContext()
+ {
+ return m_Context;
+ }
+
+}
diff --git a/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/org_mitk_gui_qt_dynamicmappers_Activator.h b/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/org_mitk_gui_qt_dynamicmappers_Activator.h
new file mode 100644
index 0000000000..42cd0e23f0
--- /dev/null
+++ b/Plugins/org.mitk.gui.qt.dynamicmappers/src/internal/org_mitk_gui_qt_dynamicmappers_Activator.h
@@ -0,0 +1,47 @@
+/*===================================================================
+
+The Medical Imaging Interaction Toolkit (MITK)
+
+Copyright (c) German Cancer Research Center,
+Division of Medical and Biological Informatics.
+All rights reserved.
+
+This software is distributed WITHOUT ANY WARRANTY; without
+even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.
+
+See LICENSE.txt or http://www.mitk.org for details.
+
+===================================================================*/
+
+
+#ifndef org_mitk_gui_qt_dynamicmappers_Activator_h
+#define org_mitk_gui_qt_dynamicmappers_Activator_h
+
+#include
+
+namespace mitk {
+
+ class org_mitk_gui_qt_dynamicmappers_Activator :
+ public QObject, public ctkPluginActivator
+ {
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "org_mitk_gui_qt_dynamicmappers")
+ Q_INTERFACES(ctkPluginActivator)
+
+ public:
+
+ void start(ctkPluginContext* context);
+ void stop(ctkPluginContext* context);
+
+ static ctkPluginContext* GetContext();
+
+ private:
+
+ static ctkPluginContext* m_Context;
+
+ }; // org_mitk_gui_qt_dynamicmappers_Activator
+
+}
+
+#endif // org_mitk_gui_qt_dynamicmappers_Activator_h