8#include "ui_SchemaFileInfo.h"
12#include <QDialogButtonBox>
27 QWidget::setAttribute(Qt::WA_DeleteOnClose);
31 m_ui->missing_button->hide();
34 setObjectName(QString::fromStdString(
filename));
35 auto sp =
filename.find_last_of(
'/');
36 if (sp == std::string::npos) {
41 setWindowTitle(QString(
"Schema File: %1").arg(QString::fromStdString(
filename.substr(sp))));
47 m_ui->label->setPalette(pal);
52 QString DUNEDAQ_DB_PATH = getenv(
"DUNEDAQ_DB_PATH");
53 m_path_list = DUNEDAQ_DB_PATH.split(QLatin1Char(
':'), Qt::SkipEmptyParts);
55 if (!path.endsWith(
"/")) {
63 m_ui->textBrowser->hide();
67 m_ui->include_list->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
68 m_ui->class_list->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
69 connect(
m_ui->include_list, SIGNAL(itemActivated(QListWidgetItem*)),
this, SLOT(
show_file_info(QListWidgetItem*)));
74 connect(
m_ui->active_button, SIGNAL(pressed()),
this, SLOT(
set_active()));
75 connect(
m_ui->add_button, SIGNAL(pressed()),
this, SLOT(
add_include()));
81 m_ui->add_button->setEnabled(
false);
82 m_ui->active_button->setEnabled(
false);
83 m_ui->save_button->setEnabled(
false);
85 connect(
m_ui->save_button, SIGNAL(pressed()),
this, SLOT(
save_schema()));
86 connect(
m_ui->close_button, SIGNAL(pressed()),
this, SLOT(close()));
89 connect(
m_ui->class_list, SIGNAL(itemActivated(QListWidgetItem*)),
this, SLOT(
launch_class_editor(QListWidgetItem*)));
95 m_ui->include_list->clear();
99 std::set<std::string> direct_includes;
104 auto item =
new QListWidgetItem(QString::fromStdString(file));
105 item->setToolTip(QString::fromStdString(inc));
106 m_ui->include_list->addItem(item);
107 if (!direct_includes.contains(file)) {
117 m_ui->include_list->update();
125 if (relationships !=
nullptr) {
126 for (
auto rel : *relationships) {
127 auto rel_class = rel->get_class_type();
128 if (rel_class ==
nullptr) {
129 QString warning =
"<b>Warning</b> class <i>" + QString::fromStdString(cls->
get_name()) +
130 "</i> has relationship " + QString::fromStdString(rel->get_name()) +
131 " referring to class <i>" + QString::fromStdString(rel->get_type()) +
132 "</i> which is not loaded<br>";
133 m_ui->textBrowser->insertHtml(warning);
134 m_ui->textBrowser->show();
138 auto file = rel_class->get_file()->get_full_file_name();
141 QString warning =
"<b>Warning</b> class <i>" + QString::fromStdString(cls->
get_name()) +
142 "</i> has relationship " + QString::fromStdString(rel->get_name()) +
143 " referring to class <i>" + QString::fromStdString(rel->get_class_type()->get_name()) +
144 "</i> from " + QString::fromStdString(file) +
" which is not included<br>";
145 m_ui->textBrowser->insertHtml(warning);
146 m_ui->textBrowser->show();
159 if (super_classes !=
nullptr) {
160 for (
auto sc : *super_classes) {
162 if (sclass ==
nullptr) {
163 QString warning =
"<b>Warning</b> class <i>" + QString::fromStdString(cls->
get_name()) +
164 "</i> refers to super class <i>" + QString::fromStdString(*sc) +
165 "</i> which is not known<br>";
166 m_ui->textBrowser->insertHtml(warning);
167 m_ui->textBrowser->show();
171 auto file = sclass->get_file()->get_full_file_name();
174 QString warning =
"<b>Warning</b> class <i>" + QString::fromStdString(cls->
get_name()) +
175 "</i> refers to super class <i>" + QString::fromStdString(*sc) +
"</i> from " +
176 QString::fromStdString(file) +
" which is not included<br>";
177 m_ui->textBrowser->insertHtml(warning);
178 m_ui->textBrowser->show();
189 std::cout <<
"Removing include file " <<
filename <<
"\n";
196 for (
auto cls : classes) {
198 if (cls->get_file()->get_full_file_name() !=
filename) {
199 auto relationships = cls->direct_relationships();
200 if (relationships !=
nullptr) {
201 for (
auto rel : *relationships) {
202 auto file = rel->get_class_type()->get_file()->get_full_file_name();
203 if (!temp_files.contains(file)) {
204 auto message = QString(
"Cannot remove %1 as class %2 has relationship to its %3 class")
205 .arg(QString::fromStdString(
filename))
206 .arg(QString::fromStdString(cls->get_name()))
207 .arg(QString::fromStdString(rel->get_class_type()->get_name()));
208 QMessageBox::warning(0,
"Schema editor", message);
213 auto super_classes = cls->direct_super_classes();
214 if (super_classes !=
nullptr) {
215 for (
auto sc : *super_classes) {
217 auto file = sclass->get_file()->get_full_file_name();
218 if (!temp_files.contains(file)) {
219 auto message = QString(
"Cannot remove %1 as class %2 has superclass %3 in %1")
220 .arg(QString::fromStdString(
filename))
221 .arg(QString::fromStdString(cls->get_name()))
222 .arg(QString::fromStdString(*sc));
223 QMessageBox::warning(0,
"Schema editor", message);
234 QMessageBox::warning(0,
"Schema editor", QString::fromStdString(exc.
what()));
245 auto item =
m_ui->include_list->currentItem();
246 std::string fn = item->text().toStdString();
265 if (event->key() == Qt::Key_Escape) {
268 QWidget::keyPressEvent(event);
280 m_ui->class_list->clear();
281 m_ui->textBrowser->clear();
283 for (
auto cls : classes) {
284 auto item =
new QListWidgetItem(QString::fromStdString(cls->get_name()));
299 m_ui->class_list->addItem(item);
301 m_ui->class_summary->setText(QString(
"Total of %1 classes").arg(classes.size()));
313 m_ui->missing_button->setEnabled(
false);
314 m_ui->missing_button->hide();
316 m_ui->missing_button->setEnabled(
true);
317 m_ui->missing_button->show();
338 QMessageBox::warning(0,
340 QString(
"Failed to save file %1").arg(
m_filename.c_str()).append(QString(exc.
what())),
352 status.append(
"Read/Write");
354 status.append(
"Read only");
357 status.append(
" Modified");
359 m_ui->save_button->setEnabled(
true);
361 m_ui->save_button->setEnabled(
false);
364 m_ui->save_button->setEnabled(
false);
368 status.append(
" Active");
369 m_ui->active_button->setEnabled(
false);
371 m_ui->active_button->setEnabled(
true);
373 m_ui->status->setText(status);
379 auto fd =
new QFileDialog(
this, tr(
"Open File"),
".", tr(
"XML schema files (*.schema.xml)"));
380 fd->setFileMode(QFileDialog::ExistingFiles);
381 fd->setViewMode(QFileDialog::Detail);
382 fd->setAcceptMode(QFileDialog::AcceptOpen);
385 auto files = fd->selectedFiles();
386 for (
auto file : files) {
397 std::cout <<
"\nAdding missing include files:\n";
405 m_ui->textBrowser->clear();
406 m_ui->textBrowser->hide();
417 if (file.starts_with(element.toStdString())) {
418 file = file.substr(element.size());
427 std::cout <<
" " << file <<
"\n";
431 }
catch (std::exception& exc) {
433 QString(
"Failed to add %1 to included files, %2").arg(QString::fromStdString(file)).arg(exc.what());
434 QMessageBox::warning(0,
"Schema editor", message);
445 QAction* add =
new QAction(tr(
"Add New Include File"),
this);
446 connect(add, SIGNAL(triggered()),
this, SLOT(
add_include()));
447 QAction* remove =
new QAction(tr(
"Remove Selected Include File"),
this);
448 connect(remove, SIGNAL(triggered()),
this, SLOT(
remove_include()));
452 QAction* info =
new QAction(tr(
"Show file info"),
this);
458 if (
m_ui->include_list->currentIndex().isValid()) {
469 QAction* add =
new QAction(tr(
"&Add New Class"),
this);
470 connect(add, SIGNAL(triggered()),
this, SLOT(
add_new_class()));
472 QAction* remove =
new QAction(tr(
"&Remove Selected Class"),
this);
473 connect(remove, SIGNAL(triggered()),
this, SLOT(
remove_class()));
475 QAction* edit =
new QAction(tr(
"&Edit Selected Class"),
this);
476 connect(edit, SIGNAL(triggered()),
this, SLOT(
edit_class()));
478 QAction* move =
new QAction(tr(
"&Move Selected Class"),
this);
479 connect(move, SIGNAL(triggered()),
this, SLOT(
move_class()));
487 if (
m_ui->class_list->currentIndex().isValid()) {
506 auto item =
m_ui->class_list->currentItem();
507 QString cn = item->text();
510 QMessageBox::warning(0,
"Schema editor", QString(
"Cannot delete class because it has sub-classes."));
513 QMessageBox::warning(0,
"Schema editor", QString(
"Cannot delete class because some other classes references it."));
520 m_ui->class_list->update();
529 auto qfn = QString::fromStdString(
m_filename);
530 auto text = QString(
"Could not make schema file %1 active!\n\n").arg(qfn);
531 QMessageBox::warning(0,
"Set Active Schema", text.append(QString(exc.
what())), QMessageBox::Ok);
541 auto item =
m_ui->include_list->currentItem();
542 std::string fn = item->text().toStdString();
560 auto item =
new QListWidgetItem(nc);
561 m_ui->class_list->addItem(item);
562 m_ui->class_list->sortItems();
563 m_ui->class_list->setCurrentItem(item);
564 m_ui->class_list->update();
582 bool widget_found =
false;
583 for (QWidget* widget : QApplication::allWidgets()) {
585 if (sfi !=
nullptr) {
586 if ((sfi->objectName()).compare(fn) == 0) {
588 sfi->setVisible(
true);
589 sfi->activateWindow();
static KernelWrapper & GetInstance()
void SetActiveSchema(const std::string &ActiveSchema)
dunedaq::oks::OksClass * FindClass(std::string ClassName) const
void RemoveInclude(std::string schemaFile, std::string IncludeFile) const
void SaveSchema(const std::string &file) const
void PushRemoveClassCommand(dunedaq::oks::OksClass *Class, std::string ClassName, std::string ClassDescription, bool Abstract)
void AddInclude(std::string schemaFile, std::string IncludeFile) const
void get_all_includes(const std::string &FileName, std::set< std::string > &IncludedFiles)
std::vector< dunedaq::oks::OksClass * > get_schema_classes(std::string &filename)
void get_direct_includes(const std::string &FileName, std::set< std::string > &IncludedFiles)
static void launch(QString class_name)
static QString createNewClass()
void new_window(SchemaFileInfo *win)
void add_missing_includes()
std::string prune_path(std::string file)
bool check_relationships(dunedaq::oks::OksClass *cls)
void launch_class_editor(QListWidgetItem *)
bool check_superclasses(dunedaq::oks::OksClass *cls)
std::set< std::string > m_missing_includes
QList< QUrl > m_path_urls
SchemaFileInfo(std::string filename, QWidget *parent=0)
void class_updated(QString class_name)
void show_file_info(QString fn)
void keyPressEvent(QKeyEvent *event) override
void add_file(std::string file)
void activate_include_context_menu(QPoint point)
void set_schemafile_active()
std::set< std::string > m_all_includes
Ui::SchemaFileInfo * m_ui
void activate_class_context_menu(QPoint point)
Failed to set active file.
Cannot remove include file. Such exception is thrown when OKS cannot remove include file.
bool get_is_abstract() const noexcept
const FList * all_sub_classes() const noexcept
const std::string & get_name() const noexcept
const std::list< OksRelationship * > * direct_relationships() const noexcept
const std::string & get_description() const noexcept
const std::list< std::string * > * direct_super_classes() const noexcept
virtual const char * what() const noexcept
static QColor get_color(const QString &item, const QString &group)