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 (
"/" ) ) {
56 if (file.startsWith(element)) {
65 const QString& top_file,
66 const QStringList& includes) {
67 if (top_file.endsWith(file)) {
75 QStringList candidates{file};
77 if (file.startsWith(element)) {
78 auto short_name = file;
79 candidates.append(short_name.remove(element));
83 for (
auto cand : candidates) {
84 if (includes.contains(cand)) {
106 for (
auto const& class_name :
109 auto file =
prune_path(QString::fromStdString(obj.contained_in()));
110 auto name = QString::fromStdString(obj.full_name());
142 auto schema_file = QString::fromStdString(classdef.
p_schema_path);
144 message += QString(
"Object <i>" +
id +
"</i> is of class <i>"
145 + QString::fromStdString(obj.class_name())
146 +
"</i> defined in file <b>" + schema_file
147 +
"</b> which is not included<br>");
150 std::vector<tref> relobjs;
156 catch ( daq::dbe::config_object_retrieval_result_is_null
const & e ) {
164 for (
auto relobj : relobjs) {
165 auto file = QString::fromStdString(relobj.contained_in());
167 message += QString(
"Object <i>" +
id +
"</i> has relationship to <i>"
168 + QString::fromStdString(relobj.full_name())
169 +
"</i> in file <b>" + file
170 +
"</b> which is not included<br>");
184 QWidget::setAttribute(Qt::WA_DeleteOnClose);
189 m_ui->rstatus->setText(QString(
"RW"));
193 m_ui->rstatus->setText(QString(
"RO"));
198 setWindowTitle(
"File: " +
filename.section(
'/',-1));
204 m_ui->schema_list->setContextMenuPolicy ( Qt::ContextMenuPolicy::CustomContextMenu );
205 m_ui->data_list->setContextMenuPolicy ( Qt::ContextMenuPolicy::CustomContextMenu );
206 m_ui->object_list->setContextMenuPolicy ( Qt::ContextMenuPolicy::CustomContextMenu );
214 connect (
m_ui->schema_list, SIGNAL (customContextMenuRequested(QPoint)),
217 connect (
m_ui->data_list, SIGNAL (customContextMenuRequested(QPoint)),
219 connect (
m_ui->data_list, SIGNAL (itemActivated(QListWidgetItem*)),
222 connect (
m_ui->object_list, SIGNAL (itemActivated(QListWidgetItem*)),
224 connect (
m_ui->object_list, SIGNAL (customContextMenuRequested(QPoint)),
242 m_ui->object_list->clear();
246 for (
auto const& [obj_name, obj_ref] : omap) {
247 auto item =
new QListWidgetItem(obj_name);
248 m_ui->object_list->addItem(item);
251 m_ui->object_list->update();
263 m_ui->warningBox->setVisible(!status);
269 m_ui->message->setText(message);
270 return message.isEmpty();
276 m_ui->schema_list->clear();
277 m_ui->data_list->clear();
278 for (
auto inc: includes) {
279 auto item =
new QListWidgetItem(inc);
284 if (inc.endsWith(
".schema.xml")) {
285 m_ui->schema_list->addItem(item);
287 if (inc.endsWith(
".data.xml")) {
288 m_ui->data_list->addItem(item);
292 m_ui->schema_list->update();
293 m_ui->data_list->update();
297 if (event->key() == Qt::Key_Escape) {
300 QWidget::keyPressEvent(event);
311 auto item =
m_ui->object_list->currentItem();
316 auto name = item->text();
318 for ( QWidget * widget : QApplication::allWidgets() ) {
320 if ( oe !=
nullptr ) {
321 if (oe->objectName() == name) {
323 oe->setVisible (
true );
324 oe->activateWindow();
337 auto name =
m_ui->object_list->currentItem()->text();
346 auto name =
m_ui->object_list->currentItem()->text();
349 QInputDialog dia(
this);
350 dia.setLabelText(
"Enter new name for " + name);
351 auto code = dia.exec();
352 if (code == QDialog::Accepted) {
353 std::string new_name = dia.textValue().toStdString();
364 auto fd =
new QFileDialog (
this, tr (
"Open Data File" ),
s_data_path,
365 tr (
"XML data files (*.data.xml)" ) );
367 if (fd->result() == QDialog::Accepted) {
375 auto fd =
new QFileDialog (
this, tr (
"Open Schema File" ),
s_schema_path,
376 tr (
"XML schema files (*.schema.xml)" ) );
378 if (fd->result() == QDialog::Accepted) {
383 fd->setFileMode ( QFileDialog::ExistingFiles );
384 fd->setViewMode ( QFileDialog::Detail );
385 fd->setAcceptMode ( QFileDialog::AcceptOpen );
387 if (fd->exec() == QDialog::Accepted) {
388 auto files = fd->selectedFiles();
389 QScopedValueRollback<bool> rb(
m_updating,
true);
390 for (
auto file: files) {
400 QScopedValueRollback<bool> rb(
m_updating,
true);
403 QMessageBox::warning (
this,
"Warning",
404 QString(
"Missing schema map is corrupt and does not contain %1").arg(short_filename));
415 QScopedValueRollback<bool> rb(
m_updating,
true);
418 QMessageBox::warning (
this,
"Warning",
419 QString(
"Missing data map is corrupt and does not contain %1").arg(short_filename));
455 for ( QWidget * widget : QApplication::allWidgets() ) {
456 auto fi =
dynamic_cast<FileInfo *
> ( widget );
457 if ( fi !=
nullptr ) {
460 fi->setVisible (
true );
461 fi->activateWindow();
476 auto add =
new QAction(
"Add include file",
this);
477 connect (add, SIGNAL(triggered()),
this, SLOT (
add_schemafile()));
480 auto remove =
new QAction(
"Remove include file",
this);
486 if (
m_ui->schema_list->currentIndex().isValid()) {
496 auto info =
new QAction(tr(
"Show file info"),
this);
497 connect (info, SIGNAL(triggered()),
this, SLOT (
file_info_slot()));
501 auto add =
new QAction(
"Add include file",
this);
502 connect (add, SIGNAL(triggered()),
this, SLOT (
add_datafile()));
505 auto remove =
new QAction(
"Remove include file",
this);
511 if (
m_ui->data_list->currentIndex().isValid()) {
526 auto edit_action =
new QAction(tr(
"&Edit object"),
this);
530 auto delete_action =
new QAction(tr(
"&Delete Object"),
this );
534 auto rename_action =
new QAction(tr(
"&Rename Object"),
this );
539 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 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