24 #include "internal/org_mitk_gui_qt_application_Activator.h" 26 #include <ui_QmitkPreferencesDialog.h> 28 #include <QFileDialog> 29 #include <QMessageBox> 30 #include <QPushButton> 38 static std::vector<std::string>
splitString(
const std::string &s,
char delim=
' ')
40 std::vector < std::string > elems;
41 std::stringstream ss(s);
43 while (std::getline(ss, item, delim))
45 elems.push_back(item);
50 class QmitkPreferencesDialogPrivate :
public Ui::QmitkPreferencesDialog
59 PrefPage(QString _id, QString _name, QString _category
61 : id(_id), name(_name), category(_category), className(_className), keywords(_keywords),
62 prefPage(
nullptr), confElem(_confElem), treeWidgetItem(
nullptr)
66 {
return id == other.id; }
69 {
return name < other.name; }
78 QTreeWidgetItem* treeWidgetItem;
81 QmitkPreferencesDialogPrivate()
89 QList<berry::IConfigurationElement::Pointer>::iterator prefPagesIt;
91 QList<berry::IConfigurationElement::Pointer>::iterator keywordRefsIt;
93 for (prefPagesIt = prefPages.begin(); prefPagesIt != prefPages.end(); ++prefPagesIt)
95 QString
id = (*prefPagesIt)->GetAttribute(
"id");
96 QString name = (*prefPagesIt)->GetAttribute(
"name");
97 QString className = (*prefPagesIt)->GetAttribute(
"class");
98 if(!
id.isEmpty() && !name.isEmpty() && !className.isEmpty())
100 QString keywordLabels;
102 QString category = (*prefPagesIt)->GetAttribute(
"category");
104 QList<berry::IConfigurationElement::Pointer> keywordRefs = (*prefPagesIt)->GetChildren(
"keywordreference");
105 for (keywordRefsIt = keywordRefs.begin()
106 ; keywordRefsIt != keywordRefs.end(); ++keywordRefsIt)
108 QString keywordRefId = (*keywordRefsIt)->GetAttribute(
"id");
110 for (QList<berry::IConfigurationElement::Pointer>::iterator keywordExtsIt = keywordExts.begin();
111 keywordExtsIt != keywordExts.end(); ++keywordExtsIt)
113 QString keywordId = (*keywordExtsIt)->GetAttribute(
"id");
114 if(keywordId == keywordRefId)
117 QString currLabel = (*keywordExtsIt)->GetAttribute(
"label");
118 currLabel = currLabel.toLower();
119 if (!currLabel.isEmpty()) keywordLabels += QString(
" ") + currLabel;
136 QList<PrefPage> m_PrefPages;
142 : QDialog(parent, f), d(new QmitkPreferencesDialogPrivate)
147 QObject::connect(
d->m_Keyword, SIGNAL(textChanged(QString)),
this, SLOT(
OnKeywordTextChanged(QString)));
151 QPushButton* importButton =
d->buttonBox->addButton(
"Import...", QDialogButtonBox::ActionRole);
154 QPushButton* exportButton =
d->buttonBox->addButton(
"Export...", QDialogButtonBox::ActionRole);
169 for(QList<QmitkPreferencesDialogPrivate::PrefPage>::iterator it =
d->m_PrefPages.begin(); it !=
d->m_PrefPages.end(); ++it)
173 d->m_PreferencesTree->setCurrentItem(it->treeWidgetItem);
181 int answer = QMessageBox::question(
this,
"Importing Preferences" 182 ,
"All existing preferences will be overwritten!\nAre you sure that you want to import other preferences?", QMessageBox::Yes | QMessageBox::No );
183 if(answer == QMessageBox::No)
190 if(berryPrefService !=
nullptr)
192 static QString importDir =
"";
193 QString fileName = QFileDialog::getOpenFileName(
this, tr(
"Choose file to import preferences"),
194 importDir, tr(
"XML files (*.xml)"));
196 if(!fileName.isEmpty())
198 importDir = QFileInfo(fileName).absoluteDir().path();
204 MITK_INFO(
"QmitkPreferencesDialog") <<
"Preferences successfully imported from " << fileName;
208 catch (Poco::Exception& pe)
210 QMessageBox::critical(
this,
"Error Importing", pe.message().c_str());
211 MITK_ERROR(
"QmitkPreferencesDialog") << pe.what();
213 catch (std::exception& e)
215 QMessageBox::critical(
this,
"Error Importing", e.what());
216 MITK_ERROR(
"QmitkPreferencesDialog") << e.what();
226 if(berryPrefService !=
nullptr)
229 static QString exportDir =
"";
230 QString fileName = QFileDialog::getSaveFileName(
this, tr(
"Choose file to export preferences"),
231 exportDir, tr(
"XML files (*.xml)"));
233 if(!fileName.isEmpty())
235 if(QFileInfo(fileName).suffix() !=
".xml")
239 exportDir = QFileInfo(fileName).absoluteDir().path();
241 MITK_INFO(
"QmitkPreferencesDialog") <<
"Preferences successfully exported to " << fileName;
245 catch (Poco::Exception& pe)
247 QMessageBox::critical(
this,
"Error Exporting", pe.message().c_str());
248 MITK_ERROR(
"QmitkPreferencesDialog") << pe.what();
250 catch (std::exception& e)
252 QMessageBox::critical(
this,
"Error Exporting", e.what());
253 MITK_ERROR(
"QmitkPreferencesDialog") << e.what();
261 for(QList<QmitkPreferencesDialogPrivate::PrefPage>::iterator it =
d->m_PrefPages.begin(); it !=
d->m_PrefPages.end(); ++it)
263 prefPage = it->prefPage;
320 if(
d->m_PreferencesTree ==
nullptr)
324 QList<QTreeWidgetItem *> selectedItems =
d->m_PreferencesTree->selectedItems();
325 if(selectedItems.size()>0)
328 d->m_CurrentPage = 0;
330 for(QList<QmitkPreferencesDialogPrivate::PrefPage>::iterator it =
d->m_PrefPages.begin(); it !=
d->m_PrefPages.end(); ++it, ++
d->m_CurrentPage)
332 if(it->treeWidgetItem == selectedItems.at(0))
334 d->m_Headline->setText(it->name);
335 if(it->prefPage ==
nullptr)
340 it->prefPage->CreateQtControl(
d->m_PreferencesPanel);
341 d->m_PreferencesPanel->addWidget(it->prefPage->GetQtControl());
343 d->m_PreferencesPanel->setCurrentWidget(it->prefPage->GetQtControl());
353 if(
d->m_PreferencesTree ==
nullptr)
356 d->m_PreferencesTree->sortByColumn(0, Qt::AscendingOrder);
359 QString keyword =
d->m_Keyword->text().toLower();
361 map<QString, QTreeWidgetItem*> items;
362 std::list< QList<QmitkPreferencesDialogPrivate::PrefPage>::iterator > deferredItems;
364 for (QList<QmitkPreferencesDialogPrivate::PrefPage>::iterator it =
d->m_PrefPages.begin();
365 it !=
d->m_PrefPages.end(); ++it)
367 if (it->treeWidgetItem ==
nullptr)
369 if (it->category.isEmpty())
371 it->treeWidgetItem =
new QTreeWidgetItem(
d->m_PreferencesTree);
372 it->treeWidgetItem->setText(0, it->name);
373 items[it->id] = it->treeWidgetItem;
378 deferredItems.push_back(it);
385 auto currentItem = deferredItems.begin();
387 while (currentItem != deferredItems.end())
389 auto currentItemContent = *currentItem;
390 if (items[currentItemContent->category] !=
nullptr)
392 currentItemContent->treeWidgetItem =
new QTreeWidgetItem(items[currentItemContent->category]);
393 currentItemContent->treeWidgetItem->setText(0, currentItemContent->name);
394 items[currentItemContent->id] = currentItemContent->treeWidgetItem;
396 deferredItems.erase(currentItem);
397 currentItem = deferredItems.begin();
405 if (!deferredItems.empty())
407 MITK_ERROR <<
"Unknown preference category. They are added top-level.";
409 for (
const auto ¤tItemContent : deferredItems)
411 currentItemContent->treeWidgetItem =
new QTreeWidgetItem(
d->m_PreferencesTree);
412 currentItemContent->treeWidgetItem->setText(0, currentItemContent->name);
413 items[currentItemContent->id] = currentItemContent->treeWidgetItem;
422 if(!keyword.isEmpty())
424 for (QList<QmitkPreferencesDialogPrivate::PrefPage>::iterator it =
d->m_PrefPages.begin();
425 it !=
d->m_PrefPages.end(); ++it)
427 it->treeWidgetItem->setHidden(
true);
432 for (QList<QmitkPreferencesDialogPrivate::PrefPage>::iterator it =
d->m_PrefPages.begin();
433 it !=
d->m_PrefPages.end(); ++it)
436 if(!keyword.isEmpty())
439 vector<string> keywordsAvailable =
splitString(keyword.toUtf8().constData());
440 bool foundAll =
true;
443 for(
unsigned int i = 0; i < keywordsAvailable.size(); i++)
445 if (it->keywords.indexOf(QString::fromStdString(keywordsAvailable[i])) == -1)
455 QTreeWidgetItem* treeWidgetParent = it->treeWidgetItem->parent();
456 while(treeWidgetParent!=
nullptr)
458 treeWidgetParent->setHidden(
false);
459 treeWidgetParent->setExpanded(
true);
460 treeWidgetParent = treeWidgetParent->parent();
463 it->treeWidgetItem->setHidden(
false);
464 QFont f = it->treeWidgetItem->font(0);
466 it->treeWidgetItem->setFont(0, f);
471 QFont f = it->treeWidgetItem->font(0);
473 it->treeWidgetItem->setFont(0, f);
474 it->treeWidgetItem->setHidden(
false);
478 if(
d->m_PrefPages.size()>0)
480 if(
d->m_PrefPages.front().treeWidgetItem !=
nullptr)
481 d->m_PrefPages.front().treeWidgetItem->setSelected(
true);
484 d->m_PreferencesTree->expandAll();
virtual void Init(IWorkbench::Pointer workbench)=0
virtual void ExportPreferences(const QString &f, const QString &name="")=0
static std::vector< std::string > splitString(const std::string &s, char delim=' ')
bool operator<(const StaticParameterMap::ValueType &a, const StaticParameterMap::ValueType &b)
Compares two var lists and returns true if the first list's first item is lower than the second one's...
virtual SmartPointer< IPreferences > GetSystemPreferences()=0
virtual bool PerformOk()=0
MITKCORE_EXPORT bool operator==(const InteractionEvent &a, const InteractionEvent &b)
virtual QList< SmartPointer< IConfigurationElement > > GetConfigurationElementsFor(const QString &extensionPointId) const =0
QScopedPointer< QmitkPreferencesDialogPrivate > d
void OnImportButtonClicked()
virtual void PerformCancel()=0
~QmitkPreferencesDialog() override
void OnExportButtonClicked()
void SetSelectedPage(const QString &id)
void OnKeywordEditingFinished()
virtual void ImportPreferences(const QString &f, const QString &name="")=0
QmitkPreferencesDialog(QWidget *parent=nullptr, Qt::WindowFlags f=nullptr)
void OnKeywordTextChanged(const QString &s)
void OnPreferencesTreeItemSelectionChanged()