9#include "ui_FileInfo.h"
12#include <QInputDialog>
13#include <QListWidgetItem>
15#include <QScopedValueRollback>
32 QString DUNEDAQ_DB_PATH = getenv (
"DUNEDAQ_DB_PATH" );
35 auto path_list = DUNEDAQ_DB_PATH.split (QLatin1Char(
':'), Qt::SkipEmptyParts );
36 for ( QString & path : path_list ) {
37 char* rpath = realpath(path.toStdString().c_str(), NULL);
38 path = QString(rpath);
41 if (! path.isEmpty()) {
42 if ( !path.endsWith (
"/" ) ) {
50 dbpath.truncate(dbpath.lastIndexOf(
"/")+1);
55 char* rpath_cd = realpath(
".", NULL);
56 auto path_cd = QString(rpath_cd);
68 if (file.startsWith(element)) {
77 const QString& top_file,
78 const QStringList& includes) {
79 if (top_file.endsWith(file)) {
87 QStringList candidates{file};
89 if (file.startsWith(element)) {
90 auto short_name = file;
91 candidates.append(short_name.remove(element));
95 for (
auto cand : candidates) {
96 if (includes.contains(cand)) {
118 for (
auto const& class_name :
121 auto file =
prune_path(QString::fromStdString(obj.contained_in()));
122 auto name = QString::fromStdString(obj.full_name());
154 auto schema_file = QString::fromStdString(classdef.
p_schema_path);
156 message += QString(
"Object <i>" +
id +
"</i> is of class <i>"
157 + QString::fromStdString(obj.class_name())
158 +
"</i> defined in file <b>" + schema_file
159 +
"</b> which is not included<br>");
162 std::vector<tref> relobjs;
168 catch ( daq::dbe::config_object_retrieval_result_is_null
const & e ) {
176 for (
auto relobj : relobjs) {
177 auto file = QString::fromStdString(relobj.contained_in());
179 message += QString(
"Object <i>" +
id +
"</i> has relationship to <i>"
180 + QString::fromStdString(relobj.full_name())
181 +
"</i> in file <b>" + file
182 +
"</b> which is not included<br>");
196 QWidget::setAttribute(Qt::WA_DeleteOnClose);
201 m_ui->rstatus->setText(QString(
"RW"));
205 m_ui->rstatus->setText(QString(
"RO"));
210 setWindowTitle(
"File: " +
filename.section(
'/',-1));
216 m_ui->schema_list->setContextMenuPolicy ( Qt::ContextMenuPolicy::CustomContextMenu );
217 m_ui->data_list->setContextMenuPolicy ( Qt::ContextMenuPolicy::CustomContextMenu );
218 m_ui->object_list->setContextMenuPolicy ( Qt::ContextMenuPolicy::CustomContextMenu );
226 connect (
m_ui->schema_list, SIGNAL (customContextMenuRequested(QPoint)),
229 connect (
m_ui->data_list, SIGNAL (customContextMenuRequested(QPoint)),
231 connect (
m_ui->data_list, SIGNAL (itemActivated(QListWidgetItem*)),
234 connect (
m_ui->object_list, SIGNAL (itemActivated(QListWidgetItem*)),
236 connect (
m_ui->object_list, SIGNAL (customContextMenuRequested(QPoint)),
254 m_ui->object_list->clear();
258 for (
auto const& [obj_name, obj_ref] : omap) {
259 auto item =
new QListWidgetItem(obj_name);
260 m_ui->object_list->addItem(item);
263 m_ui->object_list->update();
275 m_ui->warningBox->setVisible(!status);
281 m_ui->message->setText(message);
282 return message.isEmpty();
288 m_ui->schema_list->clear();
289 m_ui->data_list->clear();
290 for (
auto inc: includes) {
291 auto item =
new QListWidgetItem(inc);
296 if (inc.endsWith(
".schema.xml")) {
297 m_ui->schema_list->addItem(item);
299 if (inc.endsWith(
".data.xml")) {
300 m_ui->data_list->addItem(item);
304 m_ui->schema_list->update();
305 m_ui->data_list->update();
309 if (event->key() == Qt::Key_Escape) {
312 QWidget::keyPressEvent(event);
323 auto item =
m_ui->object_list->currentItem();
328 auto name = item->text();
330 for ( QWidget * widget : QApplication::allWidgets() ) {
332 if ( oe !=
nullptr ) {
333 if (oe->objectName() == name) {
335 oe->setVisible (
true );
336 oe->activateWindow();
349 auto name =
m_ui->object_list->currentItem()->text();
358 auto name =
m_ui->object_list->currentItem()->text();
361 QInputDialog dia(
this);
362 dia.setLabelText(
"Enter new name for " + name);
363 auto code = dia.exec();
364 if (code == QDialog::Accepted) {
365 std::string new_name = dia.textValue().toStdString();
376 auto fd =
new QFileDialog (
this, tr (
"Open Data File" ),
s_data_path,
377 tr (
"XML data files (*.data.xml)" ) );
379 if (fd->result() == QDialog::Accepted) {
387 auto fd =
new QFileDialog (
this, tr (
"Open Schema File" ),
s_schema_path,
388 tr (
"XML schema files (*.schema.xml)" ) );
390 if (fd->result() == QDialog::Accepted) {
395 fd->setFileMode ( QFileDialog::ExistingFiles );
396 fd->setViewMode ( QFileDialog::Detail );
397 fd->setAcceptMode ( QFileDialog::AcceptOpen );
399 if (fd->exec() == QDialog::Accepted) {
400 auto files = fd->selectedFiles();
401 QScopedValueRollback<bool> rb(
m_updating,
true);
402 for (
auto file: files) {
412 QScopedValueRollback<bool> rb(
m_updating,
true);
415 QMessageBox::warning (
this,
"Warning",
416 QString(
"Missing schema map is corrupt and does not contain %1").arg(short_filename));
427 QScopedValueRollback<bool> rb(
m_updating,
true);
430 QMessageBox::warning (
this,
"Warning",
431 QString(
"Missing data map is corrupt and does not contain %1").arg(short_filename));
467 for ( QWidget * widget : QApplication::allWidgets() ) {
468 auto fi =
dynamic_cast<FileInfo *
> ( widget );
469 if ( fi !=
nullptr ) {
472 fi->setVisible (
true );
473 fi->activateWindow();
488 auto add =
new QAction(
"Add include file",
this);
489 connect (add, SIGNAL(triggered()),
this, SLOT (
add_schemafile()));
492 auto remove =
new QAction(
"Remove include file",
this);
498 if (
m_ui->schema_list->currentIndex().isValid()) {
508 auto info =
new QAction(tr(
"Show file info"),
this);
509 connect (info, SIGNAL(triggered()),
this, SLOT (
file_info_slot()));
513 auto add =
new QAction(
"Add include file",
this);
514 connect (add, SIGNAL(triggered()),
this, SLOT (
add_datafile()));
517 auto remove =
new QAction(
"Remove include file",
this);
523 if (
m_ui->data_list->currentIndex().isValid()) {
538 auto edit_action =
new QAction(tr(
"&Edit object"),
this);
542 auto delete_action =
new QAction(tr(
"&Delete Object"),
this );
546 auto rename_action =
new QAction(tr(
"&Rename Object"),
this );
551 if (
m_ui->object_list->currentIndex().isValid()) {
static bool match_path(const QString &file, const QString &top_file, const QStringList &includes)
static QList< QUrl > get_path_urls()
static QString prune_path(QString file)
void keyPressEvent(QKeyEvent *event) override
static void parse_all_objects()
void add_missing_datafiles()
static QStringList get_path_list()
void activate_data_context_menu(QPoint point)
void rename_object_slot()
void remove_datafile_slot()
void activate_schema_context_menu(QPoint point)
static std::map< QString, std::set< QString > > s_missing_data_map
void add_includefile(QFileDialog *fd)
void delete_object_slot()
static QStringList s_path_list
void activate_object_context_menu(QPoint point)
static std::map< QString, std::set< QString > > s_missing_schema_map
static QString check_file_includes(const QString &file)
static void setup_paths()
static QString s_data_path
void remove_schemafile_slot()
FileInfo(QString filename, QWidget *parent=0)
static QList< QUrl > s_path_urls
void add_missing_schemafiles()
static QString s_schema_path
static std::map< QString, std::map< QString, const tref > > s_obj_map
static void show_file_info(const QString &filename)
void remove_includefile(const QString &file)
static MainWindow * findthis()
static QColor FileReadOnlyForeground
static QColor FileReadOnlyBackground
static bool check_file_rw(const QString &FileName)
static QString dbfullname()
static QStringList inclusions_singlefile(QString const &)
static std::vector< dbe::inner::configobject::tref > objects(std::string const &cname, bool const keep_inherited=true)
static dunedaq::conffwk::class_t definition(std::string const &cn, bool direct_only)
void remove(QString const &db, QString const &fn)
void add(QString const &db, QString const &fn)
bool renobj(inner::configobject::tref obj, std::string const &newuuid, QUuid const &src)
bool delobj(inner::configobject::tref obj, QUuid const &src)
T relation(tref item, dunedaq::conffwk::relationship_t const &relation)
bool is_simple(dunedaq::conffwk::relationship_t const &)
const std::vector< relationship_t > p_relationships
std::string p_schema_path