LCOV - code coverage report
Current view: top level - dbe/apps/SchemaEditor - SchemaMainWindow.cpp (source / functions) Coverage Total Hit
Test: code.result Lines: 0.0 % 776 0
Test Date: 2026-07-12 15:23:06 Functions: 0.0 % 52 0

            Line data    Source code
       1              : /// Including Schema Editor
       2              : #include "dbe/SchemaMainWindow.hpp"
       3              : #include "dbe/SchemaKernelWrapper.hpp"
       4              : #include "dbe/SchemaGraphicsScene.hpp"
       5              : #include "dbe/SchemaTab.hpp"
       6              : #include "dbe/SchemaClassEditor.hpp"
       7              : #include "dbe/SchemaRelationshipEditor.hpp"
       8              : #include "dbe/SchemaMethodImplementationEditor.hpp"
       9              : #include "dbe/SchemaFileInfo.hpp"
      10              : #include "dbe/SchemaStyle.hpp"
      11              : 
      12              : #include "oks/kernel.hpp"  // for CanNotSetActiveFile exception
      13              : 
      14              : /// Including Auto-Generated Files
      15              : #include "ui_SchemaMainWindow.h"
      16              : /// Including QT Headers
      17              : #include <QFileDialog>
      18              : #include <QMessageBox>
      19              : #include <QHeaderView>
      20              : #include <QPushButton>
      21              : #include <QGraphicsScene>
      22              : #include "QInputDialog"
      23              : #include <QCloseEvent>
      24              : #include <QPrinter>
      25              : #include <QPrintDialog>
      26              : #include <QSettings>
      27              : #include <QSvgGenerator>
      28              : 
      29              : //#include <format>
      30              : #include <sstream>
      31              : 
      32              : using namespace dunedaq;
      33              : using namespace dunedaq::oks;
      34              : 
      35              : 
      36            0 : dbse::SchemaMainWindow::SchemaMainWindow ( QString SchemaFile, QWidget * parent )
      37              :   : QMainWindow ( parent ),
      38            0 :     ui ( new Ui::SchemaMainWindow ),
      39            0 :     FileModel ( nullptr ),
      40            0 :     TableModel ( nullptr ),
      41            0 :     m_proxyModel ( new QSortFilterProxyModel() ),
      42            0 :     ContextMenuFileView ( nullptr ),
      43            0 :     ContextMenuTableView ( nullptr )
      44              : {
      45            0 :   InitialSettings();
      46            0 :   m_default_state = saveState();
      47            0 :   m_default_geometry = saveGeometry();
      48            0 :   m_default_size = QSize(1400, 880);
      49            0 :   QCoreApplication::setOrganizationName("dunedaq");
      50            0 :   QCoreApplication::setApplicationName("dbse");
      51            0 :   SchemaStyle::load();
      52            0 :   restore_layout();
      53              : 
      54            0 :   InitialTab();
      55            0 :   InitialTabCorner();
      56            0 :   SetController();
      57            0 :   setFocusPolicy( Qt::StrongFocus );
      58              : 
      59            0 :   OpenSchemaFile(SchemaFile);
      60            0 : }
      61              : 
      62            0 : dbse::SchemaMainWindow::~SchemaMainWindow() = default;
      63              : 
      64            0 : void dbse::SchemaMainWindow::InitialSettings()
      65              : {
      66            0 :   ui->setupUi ( this );
      67            0 :   setWindowTitle ( m_title );
      68            0 :   ui->UndoView->setStack ( KernelWrapper::GetInstance().GetUndoStack() );
      69            0 :   ui->ClassTableView->horizontalHeader()->setSectionResizeMode ( QHeaderView::Stretch );
      70            0 :   ui->ClassTableView->setDragEnabled ( true );
      71            0 :   ui->ClassTableView->setContextMenuPolicy ( Qt::ContextMenuPolicy::CustomContextMenu );
      72            0 :   ui->FileView->horizontalHeader()->setSectionResizeMode ( QHeaderView::Stretch );
      73            0 :   ui->FileView->setContextMenuPolicy ( Qt::ContextMenuPolicy::CustomContextMenu );
      74            0 :   ui->FileView->setSelectionBehavior ( QAbstractItemView::SelectRows );
      75            0 :   ui->TabWidget->setTabsClosable ( true );
      76            0 :   ui->ClassTableSearchLine->setProperty ( "placeholderText",
      77            0 :                                           QVariant ( QString ( "Search for classes regex" ) ) );
      78            0 :   ui->ClassTableSearchLine->setClearButtonEnabled(true);
      79            0 :   m_proxyModel->setFilterCaseSensitivity (Qt::CaseInsensitive);
      80              : 
      81            0 :   QString DUNEDAQ_DB_PATH = getenv ( "DUNEDAQ_DB_PATH" );
      82            0 :   auto path_list = DUNEDAQ_DB_PATH.split (QLatin1Char(':'), Qt::SkipEmptyParts );
      83            0 :   for ( QString & path : path_list ) {
      84            0 :     if ( !path.endsWith ( "/" ) ) {
      85            0 :       path.append ( "/" );
      86              :     }
      87            0 :     m_path_urls.append(QUrl::fromLocalFile(path));
      88              :   }
      89            0 : }
      90              : 
      91              : 
      92            0 : void dbse::SchemaMainWindow::InitialTab()
      93              : {
      94            0 :   add_tab();
      95            0 :   ui->TabWidget->removeTab ( 0 );
      96            0 : }
      97              : 
      98            0 : void dbse::SchemaMainWindow::InitialTabCorner()
      99              : {
     100            0 :   QPushButton * new_tab_button = new QPushButton ( "+" );
     101            0 :   new_tab_button->setToolTip("Open new schema view tab");
     102            0 :   ui->TabWidget->setCornerWidget ( new_tab_button, Qt::TopLeftCorner );
     103            0 :   connect ( new_tab_button, SIGNAL ( clicked() ), this, SLOT ( add_tab() ) );
     104            0 : }
     105              : 
     106            0 : void dbse::SchemaMainWindow::SetController()
     107              : {
     108            0 :   connect ( ui->OpenFileSchema, SIGNAL ( triggered() ), this, SLOT ( OpenSchemaFile() ) );
     109            0 :   connect ( ui->CreateNewSchema, SIGNAL ( triggered() ), this, SLOT ( CreateNewSchema() ) );
     110            0 :   connect ( ui->ShowSchema, SIGNAL ( triggered() ), this, SLOT ( show_file_info_active_schema() ) );
     111            0 :   connect ( ui->SaveSchema, SIGNAL ( triggered() ), this, SLOT ( SaveSchema() ) );
     112            0 :   connect ( ui->actionSave_layout, SIGNAL ( triggered() ), this, SLOT ( save_layout() ) );
     113            0 :   connect ( ui->actionRestore_layout, SIGNAL ( triggered() ), this, SLOT ( restore_layout() ) );
     114            0 :   connect ( ui->actionDefault_layout, SIGNAL ( triggered() ), this, SLOT ( default_layout() ) );
     115            0 :   connect ( ui->SetRelationship, SIGNAL ( triggered ( bool ) ), this,
     116              :             SLOT ( ChangeCursorRelationship ( bool ) ) );
     117            0 :   connect ( ui->SetInheritance, SIGNAL ( triggered ( bool ) ), this,
     118              :             SLOT ( ChangeCursorInheritance ( bool ) ) );
     119            0 :   connect ( ui->AddClass, SIGNAL ( triggered() ), this, SLOT ( AddNewClass() ) );
     120            0 :   connect ( ui->SaveView, SIGNAL ( triggered() ), this, SLOT ( SaveView() ) );
     121            0 :   connect ( ui->SaveViewAs, SIGNAL ( triggered() ), this, SLOT ( SaveViewAs() ) );
     122            0 :   connect ( ui->LoadView, SIGNAL ( triggered() ), this, SLOT ( LoadView() ) );
     123            0 :   connect ( ui->NameView, SIGNAL ( triggered() ), this, SLOT ( NameView() ) );
     124            0 :   connect ( ui->Exit, SIGNAL ( triggered() ), this, SLOT ( close() ) );
     125              : 
     126            0 :   connect ( ui->actionSettings, SIGNAL (triggered() ), this, SLOT ( edit_settings() ));
     127              : 
     128            0 :   connect ( ui->displayClasses, SIGNAL ( triggered ( bool ) ), ui->ClassWidget,
     129              :             SLOT ( setVisible ( bool ) ) );
     130            0 :   connect ( ui->displayDiagrams, SIGNAL ( triggered ( bool ) ), ui->TabWidget,
     131              :             SLOT ( setVisible ( bool ) ) );
     132            0 :   connect ( ui->displayInfo_tabs, SIGNAL ( triggered ( bool ) ), ui->DockWidget,
     133              :             SLOT ( setVisible ( bool ) ) );
     134            0 :   connect ( ui->displayToolbar, SIGNAL ( triggered ( bool ) ), ui->MainToolBar,
     135              :             SLOT ( setVisible ( bool ) ) );
     136            0 :   connect ( ui->displayStatus_bar, SIGNAL ( triggered ( bool ) ), ui->StatusBar,
     137              :             SLOT ( setVisible ( bool ) ) );
     138              : 
     139            0 :   connect ( ui->ClassWidget, SIGNAL ( visibilityChanged ( bool ) ), ui->displayClasses,
     140              :             SLOT ( setChecked ( bool ) ) );
     141            0 :   connect ( ui->DockWidget, SIGNAL ( visibilityChanged ( bool ) ), ui->displayInfo_tabs,
     142              :             SLOT ( setChecked ( bool ) ) );
     143            0 :   connect ( ui->MainToolBar, SIGNAL ( visibilityChanged ( bool ) ), ui->displayToolbar,
     144              :             SLOT ( setChecked ( bool ) ) );
     145              : 
     146            0 :   connect ( ui->ClassTableView, SIGNAL ( activated ( QModelIndex ) ), this,
     147              :             SLOT ( LaunchClassEditor ( QModelIndex ) ) );
     148            0 :   connect ( ui->close_tab, SIGNAL ( triggered() ), this, SLOT ( close_tab() ) );
     149              : 
     150            0 :   connect ( &KernelWrapper::GetInstance(), SIGNAL ( ClassCreated( QString ) ), this,
     151              :             SLOT ( update_models() ) );
     152            0 :   connect ( &KernelWrapper::GetInstance(), SIGNAL ( ClassUpdated ( QString ) ), this,
     153              :             SLOT ( update_models() ) );
     154            0 :   connect ( &KernelWrapper::GetInstance(), SIGNAL ( ClassRemoved ( QString ) ), this,
     155              :             SLOT ( update_models() ) );
     156            0 :   connect ( &KernelWrapper::GetInstance(), SIGNAL ( active_updated ( ) ), this,
     157              :             SLOT ( update_models() ) );
     158            0 :   connect ( ui->TabWidget, SIGNAL ( tabCloseRequested ( int ) ), this,
     159              :             SLOT ( RemoveTab ( int ) ) );
     160              : 
     161            0 :   connect ( ui->FileView, SIGNAL ( customContextMenuRequested ( QPoint ) ), this,
     162              :             SLOT ( CustomContextMenuFileView ( QPoint ) ) );
     163            0 :   connect ( ui->FileView, SIGNAL ( activated(QModelIndex) ), this, SLOT ( show_file_info(QModelIndex) ) );
     164              : 
     165              : 
     166            0 :   connect ( ui->ClassTableView, SIGNAL ( customContextMenuRequested ( QPoint ) ), this,
     167              :             SLOT ( CustomContextMenuTableView ( QPoint ) ) );
     168            0 :   connect ( ui->PrintView, SIGNAL ( triggered() ), this, SLOT ( PrintCurrentView() ) );
     169            0 :   connect ( ui->exportView, SIGNAL ( triggered() ), this, SLOT ( export_current_view() ) );
     170            0 :   connect ( ui->ClassTableSearchLine, SIGNAL( textChanged ( QString ) ), m_proxyModel, SLOT( setFilterRegExp( QString ) ) );
     171            0 :   connect ( ui->case_sensitive, SIGNAL ( stateChanged(int) ), this,
     172              :             SLOT (toggle_case_sensitive(int)) );
     173            0 : }
     174              : 
     175            0 : void dbse::SchemaMainWindow::show_file_info_active_schema()
     176              : {
     177            0 :   show_file_info(QString::fromStdString(
     178            0 :                    KernelWrapper::GetInstance().GetActiveSchema()));
     179            0 : }
     180              : 
     181            0 : void dbse::SchemaMainWindow::show_file_info()
     182              : {
     183            0 :   QModelIndex index = ui->FileView->currentIndex();
     184            0 :   show_file_info(index);
     185            0 : }
     186            0 : void dbse::SchemaMainWindow::show_file_info(QModelIndex index)
     187              : {
     188            0 :   QStringList row = FileModel->getRowFromIndex ( index );
     189            0 :   show_file_info(row.at ( 0 ));
     190            0 : }
     191            0 : void dbse::SchemaMainWindow::show_file_info(QString fn) {
     192            0 :   bool widget_found = false;
     193            0 :   for ( QWidget * widget : QApplication::allWidgets() ) {
     194            0 :     auto sfi = dynamic_cast<SchemaFileInfo *> ( widget );
     195            0 :     if ( sfi != nullptr ) {
     196            0 :       if ( (sfi->objectName() ).compare ( fn ) == 0 ) {
     197            0 :         sfi->raise();
     198            0 :         sfi->setVisible ( true );
     199            0 :         sfi->activateWindow();
     200              :         widget_found = true;
     201              :         break;
     202              :       }
     203              :     }
     204            0 :   }
     205            0 :   if ( !widget_found ) {
     206            0 :     auto info = new SchemaFileInfo(fn.toStdString());
     207            0 :     connect (info, &SchemaFileInfo::files_updated,
     208              :              this, &SchemaMainWindow::update_models);
     209            0 :     connect (info, &SchemaFileInfo::new_window,
     210              :              this, &SchemaMainWindow::connect_file_info);
     211            0 :     info->show();
     212              :   }
     213            0 : }
     214            0 : void dbse::SchemaMainWindow::connect_file_info(SchemaFileInfo* win){
     215            0 :   connect (win, &SchemaFileInfo::files_updated,
     216              :            this, &SchemaMainWindow::update_models);
     217            0 : }
     218            0 : void dbse::SchemaMainWindow::BuildFileModel()
     219              : {
     220            0 :   QStringList Headers { "File Name", "Access", "Status" };
     221              : 
     222            0 :   if ( FileModel != nullptr )
     223              :   {
     224            0 :     delete FileModel;
     225              :   }
     226            0 :   FileModel = new CustomFileModel ( Headers );
     227              : 
     228            0 :   ui->FileView->setModel ( FileModel );
     229            0 :   ui->FileView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
     230            0 :   ui->FileView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
     231            0 :   ui->FileView->horizontalHeader()->setSectionResizeMode(2, QHeaderView::ResizeToContents);
     232            0 : }
     233              : 
     234            0 : void dbse::SchemaMainWindow::BuildTableModel()
     235              : {
     236            0 :   QStringList Headers
     237            0 :   { "Class Name" };
     238              : 
     239            0 :   if ( TableModel != nullptr )
     240              :   {
     241            0 :     delete TableModel;
     242              :   }
     243            0 :   TableModel = new CustomTableModel ( Headers );
     244              : 
     245            0 :   m_proxyModel->setSourceModel(TableModel);
     246            0 :   ui->ClassTableView->setModel ( m_proxyModel );
     247            0 : }
     248              : 
     249            0 : int dbse::SchemaMainWindow::ShouldSaveViewChanges() const
     250              : {
     251            0 :   QString modified_views;
     252            0 :   for (int index=0; index<ui->TabWidget->count(); ++index) {
     253            0 :     auto tab = dynamic_cast<SchemaTab *> (ui->TabWidget->widget(index));
     254            0 :     if (tab->GetScene()->IsModified()) {
     255            0 :       auto label = ui->TabWidget->tabText(index);
     256            0 :       label = label.remove('*');
     257            0 :       modified_views.append("  " + label + "\n");
     258            0 :     }
     259              :   }
     260            0 :   if (!modified_views.isEmpty()) {
     261            0 :     QString message ( "There are unsaved changes in the schema views:\n");
     262            0 :     message.append (modified_views);
     263            0 :     message.append ("Do you want to save the changes in the schema views?\n" );
     264            0 :     return QMessageBox::question (
     265            0 :       0, tr ( "SchemaEditor" ),
     266              :       message,
     267              :       QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Discard );
     268            0 :   }
     269              : 
     270              :   return QMessageBox::Discard;
     271            0 : }
     272              : 
     273            0 : int dbse::SchemaMainWindow::ShouldSaveChanges() const
     274              : {
     275              :   // if ( KernelWrapper::GetInstance().GetUndoStack()->isClean() )
     276            0 :   auto modified = KernelWrapper::GetInstance().ModifiedSchemaFiles();
     277            0 :   if (modified.empty())
     278              :   {
     279              :     return QMessageBox::Discard;
     280              :   }
     281              : 
     282            0 :   std::string msg = "There are unsaved changes in the following files:\n\n"
     283            0 :     + modified + "Do you want to save the changes in the schema?\n";
     284            0 :   return QMessageBox::question (
     285            0 :            0, tr ( "SchemaEditor" ),
     286            0 :            QString ( msg.c_str() ),
     287            0 :            QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Save );
     288            0 : }
     289              : 
     290            0 : void dbse::SchemaMainWindow::AddNewClass()
     291              : {
     292            0 :     SchemaClassEditor::createNewClass();
     293            0 :     BuildFileModel();
     294            0 : }
     295              : 
     296            0 : void dbse::SchemaMainWindow::RemoveClass()
     297              : {
     298            0 :   QModelIndex Index = ui->ClassTableView->currentIndex();
     299            0 :   QModelIndex proxyIndex = m_proxyModel->mapToSource( Index );
     300            0 :   QStringList Row = TableModel->getRowFromIndex ( proxyIndex );
     301            0 :   OksClass * SchemaClass = KernelWrapper::GetInstance().FindClass ( Row.at (
     302            0 :                                                                       0 ).toStdString() );
     303              : 
     304            0 :   if ( SchemaClass->all_sub_classes()->size() != 0 )
     305              :   {
     306            0 :     QMessageBox::warning ( 0, "Schema editor",
     307            0 :                            QString ( "Cannot delete class because it has sub-classes." ) );
     308            0 :     return;
     309              :   }
     310            0 :   else if ( KernelWrapper::GetInstance().AnyClassReferenceThis ( SchemaClass ) )
     311              :   {
     312            0 :     QMessageBox::warning ( 0, "Schema editor",
     313            0 :                            QString ( "Cannot delete class because some classes references it." ) );
     314            0 :     return;
     315              :   }
     316              :   else
     317              :   {
     318            0 :     QString Name = QString::fromStdString ( SchemaClass->get_name() );
     319            0 :     KernelWrapper::GetInstance().PushRemoveClassCommand ( SchemaClass, SchemaClass->get_name(),
     320            0 :                                                           SchemaClass->get_description(),
     321            0 :                                                           SchemaClass->get_is_abstract() );
     322            0 :     BuildFileModel();
     323            0 :   }
     324            0 : }
     325              : 
     326            0 : void dbse::SchemaMainWindow::editClass() {
     327            0 :   QModelIndex Index = ui->ClassTableView->currentIndex();
     328            0 :   QModelIndex proxyIndex = m_proxyModel->mapToSource( Index );
     329            0 :   QStringList Row = TableModel->getRowFromIndex ( proxyIndex );
     330              : 
     331            0 :   if ( !Row.isEmpty() ) {
     332            0 :     bool widget_found = false;
     333            0 :     QString class_name = Row.at ( 0 );
     334            0 :     OksClass * class_info = KernelWrapper::GetInstance().FindClass (
     335            0 :       class_name.toStdString() );
     336              : 
     337            0 :     for ( QWidget * widget : QApplication::allWidgets() ) {
     338            0 :       auto editor = dynamic_cast<SchemaClassEditor *> ( widget );
     339            0 :       if ( editor != nullptr ) {
     340            0 :         if ( ( editor->objectName() ).compare ( class_name ) == 0 ) {
     341            0 :           editor->raise();
     342            0 :           editor->setVisible ( true );
     343            0 :           editor->activateWindow();
     344              :           widget_found = true;
     345              :         }
     346              :       }
     347            0 :     }
     348            0 :     if ( !widget_found ) {
     349            0 :       SchemaClassEditor * editor = new SchemaClassEditor ( class_info );
     350            0 :       editor->show();
     351              :     }
     352            0 :   }
     353            0 : }
     354              : 
     355            0 : void dbse::SchemaMainWindow::SetSchemaFileActive()
     356              : {
     357            0 :   QModelIndex index = ui->FileView->currentIndex();
     358            0 :   QString file = FileModel->getRowFromIndex ( index ).at(0);
     359            0 :   try {
     360            0 :     KernelWrapper::GetInstance().SetActiveSchema ( file.toStdString() );
     361              :   }
     362            0 :   catch (oks::CanNotSetActiveFile& exc) {
     363            0 :     QMessageBox::warning(0,
     364              :                          "Set Active Schema",
     365            0 :                          QString("Could not make schema active!\n\n").append(QString(exc.what())),
     366              :                          QMessageBox::Ok);
     367            0 :     return;
     368            0 :   }
     369            0 :   update_window_title(file);
     370              : 
     371              :   // In case we are highlighting classes in the active file, redraw current
     372              :   // view tab now we've changed active file
     373            0 :   SchemaTab * current_tab = dynamic_cast<SchemaTab *> ( ui->TabWidget->currentWidget() );
     374            0 :   SchemaGraphicsScene * scene = current_tab->GetScene();
     375            0 :   scene->update();
     376              : 
     377            0 :   BuildFileModel();
     378            0 : }
     379              : 
     380            0 : bool dbse::SchemaMainWindow::check_schema_file(QString qfilename){
     381            0 :   std::string filename = qfilename.toStdString();
     382            0 :   std::set<std::string> includes;
     383            0 :   KernelWrapper::GetInstance().get_all_includes(filename, includes);
     384              : 
     385            0 :   QString advice{"<br><br>Use the File info window to fix the problem."};
     386            0 :   for (auto cls: KernelWrapper::GetInstance().get_schema_classes(filename)) {
     387            0 :     auto relationships = cls->direct_relationships();
     388            0 :     if (relationships != nullptr) {
     389            0 :       for (auto rel: *relationships) {
     390            0 :         auto rel_class = rel->get_class_type();
     391            0 :         if (rel_class == nullptr) {
     392            0 :           QString warning = "<b>Warning</b> class <i>"
     393            0 :             + QString::fromStdString(cls->get_name())
     394            0 :             + "</i> has relationship "
     395            0 :             + QString::fromStdString(rel->get_name())
     396            0 :             + " referring to class <i>"
     397            0 :             + QString::fromStdString(rel->get_type())
     398            0 :             + "</i> which is not loaded<br>";
     399            0 :           QMessageBox::warning(0,
     400              :                                "Check Schema",
     401            0 :                                warning+advice,
     402              :                                QMessageBox::Ok);
     403            0 :           show_file_info(qfilename);
     404            0 :           return false;
     405            0 :         }
     406            0 :         auto file = rel_class->get_file()->get_full_file_name();
     407            0 :         if (file != filename && !includes.contains(file)) {
     408            0 :           QString warning = "<b>Warning</b> class <i>"
     409            0 :             + QString::fromStdString(cls->get_name())
     410            0 :             + "</i> has relationship "
     411            0 :             + QString::fromStdString(rel->get_name())
     412            0 :             + " referring to class <i>"
     413            0 :             + QString::fromStdString(rel->get_class_type()->get_name())
     414            0 :             + "</i> from " + QString::fromStdString(file)
     415            0 :             + " which is not included by " + qfilename;
     416            0 :           QMessageBox::warning(0,
     417              :                                "Check Schema",
     418            0 :                                warning+advice,
     419              :                                QMessageBox::Ok);
     420            0 :           show_file_info(qfilename);
     421            0 :           return false;
     422            0 :         }
     423            0 :       }
     424              :     }
     425              : 
     426            0 :     auto super_classes = cls->direct_super_classes();
     427            0 :     if (super_classes != nullptr) {
     428            0 :       for (auto sc: *super_classes) {
     429            0 :         auto sclass = KernelWrapper::GetInstance().FindClass(*sc);
     430            0 :         if (sclass == nullptr) {
     431            0 :           QString warning = "<b>Warning</b> class <i>"
     432            0 :             + QString::fromStdString(cls->get_name())
     433            0 :             + "</i> refers to super class <i>" + QString::fromStdString(*sc)
     434            0 :             + "</i> which is not known<br>";
     435            0 :           QMessageBox::warning(0,
     436              :                                "Check Schema",
     437            0 :                                warning+advice,
     438              :                                QMessageBox::Ok);
     439            0 :           show_file_info(qfilename);
     440            0 :           return false;
     441            0 :         }
     442            0 :         auto file = sclass->get_file()->get_full_file_name();
     443            0 :         if (file != filename && !includes.contains(file)) {
     444            0 :           QString warning = "<b>Warning</b> class <i>"
     445            0 :             + QString::fromStdString(cls->get_name())
     446            0 :             + "</i> refers to super class <i>" + QString::fromStdString(*sc)
     447            0 :             + "</i> from " + QString::fromStdString(file)
     448            0 :             + " which is not included by" + qfilename;
     449            0 :           QMessageBox::warning(0,
     450              :                                "Check Schema",
     451            0 :                                warning+advice,
     452              :                                QMessageBox::Ok);
     453            0 :           show_file_info(qfilename);
     454            0 :           return false;
     455            0 :         }
     456            0 :       }
     457              :     }
     458            0 :   }
     459            0 :   return true;
     460            0 : }
     461              : 
     462            0 : bool dbse::SchemaMainWindow::save_schema_file(QString filename){
     463            0 :   if (!check_schema_file(filename)) {
     464              :     return false;
     465              :   }
     466            0 :   bool status;
     467            0 :   QString message;
     468            0 :   try {
     469            0 :     KernelWrapper::GetInstance().SaveSchema (filename.toStdString());
     470            0 :     message = QString ( "File %1 saved" ).arg (filename);
     471            0 :     status = true;
     472              :   }
     473            0 :   catch (const oks::exception& exc) {
     474            0 :     message = QString ( "Failed to save file %1" ).arg (filename);
     475            0 :     status = false;
     476            0 :   }
     477            0 :   ui->StatusBar->showMessage( message );
     478            0 :   return status;
     479            0 : }
     480              : 
     481            0 : void dbse::SchemaMainWindow::SaveSchemaFile()
     482              : {
     483            0 :   QModelIndex index = ui->FileView->currentIndex();
     484            0 :   const auto file = FileModel->getRowFromIndex (index).at (0);
     485            0 :   save_schema_file (file);
     486            0 :   BuildFileModel();
     487            0 : }
     488              : 
     489            0 : void dbse::SchemaMainWindow::PrintCurrentView()
     490              : {
     491            0 :   SchemaTab * CurrentTab = dynamic_cast<SchemaTab *> ( ui->TabWidget->currentWidget() );
     492              : 
     493            0 :   if (m_printer == nullptr) {
     494            0 :     m_printer = new QPrinter;
     495              :   }
     496              : 
     497            0 :   if ( QPrintDialog ( m_printer ).exec() == QDialog::Accepted )
     498              :   {
     499            0 :     QPainter painter ( m_printer );
     500            0 :     painter.setRenderHint ( QPainter::Antialiasing );
     501              : 
     502            0 :     SchemaGraphicsScene * Scene = CurrentTab->GetScene();
     503            0 :     QGraphicsView * View = CurrentTab->GetView();
     504            0 :     Scene->render ( &painter, QRectF(), View->viewport()->rect() );
     505            0 :   }
     506            0 : }
     507            0 : void dbse::SchemaMainWindow::export_current_view(){
     508            0 :   auto tab = dynamic_cast<SchemaTab *> ( ui->TabWidget->currentWidget() );
     509              : 
     510            0 :   auto file = QFileDialog::getSaveFileName(
     511            0 :     this, tr("Export to SVG"),
     512            0 :     m_export_path,
     513            0 :     tr("SVG files (*.svg);;All files (*)"));
     514            0 :   if (file.isEmpty()) {
     515            0 :     return;
     516              :   }
     517              : 
     518            0 :   auto spos = file.lastIndexOf('/');
     519            0 :   if (spos != -1) {
     520            0 :     m_export_path = file;
     521            0 :     m_export_path.truncate(spos);
     522              :   }
     523              : 
     524            0 :   if (!file.endsWith(".svg")) {
     525            0 :     file.append(".svg");
     526              :   }
     527            0 :   QSvgGenerator generator;
     528            0 :   generator.setFileName(file);
     529            0 :   auto view = tab->GetView();
     530            0 :   auto vpr=view->viewport()->rect();
     531            0 :   generator.setSize(QSize(vpr.width(),vpr.height()));
     532            0 :   generator.setViewBox(vpr);
     533              : 
     534            0 :   QPainter painter;
     535            0 :   painter.begin(&generator);
     536            0 :   auto scene = tab->GetScene();
     537            0 :   scene->render ( &painter, QRectF(), view->viewport()->rect() );
     538            0 :   painter.end();
     539            0 : }
     540              : 
     541            0 : void dbse::SchemaMainWindow::closeEvent ( QCloseEvent * event )
     542              : {
     543            0 :   int UserChoice = ShouldSaveChanges();
     544              : 
     545            0 :   if ( UserChoice == QMessageBox::Save )
     546              :   {
     547            0 :     if (!SaveModifiedSchema()) {
     548            0 :       event->ignore();
     549            0 :       return;
     550              :     }
     551              :   }
     552            0 :   else if ( UserChoice == QMessageBox::Cancel )
     553              :   {
     554            0 :     event->ignore();
     555            0 :     return;
     556              :   }
     557              : 
     558            0 :   UserChoice = ShouldSaveViewChanges();
     559            0 :   if ( UserChoice == QMessageBox::Cancel )
     560              :   {
     561            0 :     event->ignore();
     562            0 :     return;
     563              :   }
     564              : 
     565            0 :   KernelWrapper::GetInstance().CloseAllSchema();
     566              : 
     567            0 :   if (m_save_layout_on_exit) {
     568            0 :     save_layout();
     569              :   }
     570              : 
     571            0 :   for ( QWidget * Widget : QApplication::allWidgets() )
     572              :   {
     573            0 :     Widget->close();
     574            0 :   }
     575              : 
     576            0 :   event->accept();
     577              : }
     578              : 
     579            0 : void dbse::SchemaMainWindow::update_models() {
     580            0 :   BuildFileModel();
     581            0 :   BuildTableModel();
     582            0 : }
     583              : 
     584            0 : void dbse::SchemaMainWindow::OpenSchemaFile(QString SchemaFile) {
     585            0 :   OksFile* file{nullptr};
     586            0 :   if(!SchemaFile.isEmpty()) {
     587            0 :     try {
     588            0 :       file = KernelWrapper::GetInstance().LoadSchema(SchemaFile.toStdString());
     589              : 
     590            0 :       if (m_schema_directory == QString(".")) {
     591            0 :         std::vector<std::string> fnames; 
     592            0 :         KernelWrapper::GetInstance().GetSchemaFiles(fnames);
     593            0 :         std::string dir = fnames[0].substr(0,fnames[0].find_last_of('/'));
     594            0 :         m_schema_directory.setPath(QString::fromStdString(dir));
     595            0 :       }
     596              : 
     597              : #ifdef QT_DEBUG
     598              :       /// KernelWrapper::GetInstance().ShowSchemaClasses();
     599              : #endif
     600              :     }
     601            0 :     catch(oks::exception &Ex) {
     602            0 :       QMessageBox::warning(0,
     603              :                            "Load Schema",
     604            0 :                            QString("Could not load schema!\n\n").append(QString(Ex.what())),
     605              :                            QMessageBox::Ok);
     606            0 :     }
     607              : 
     608            0 :     if (KernelWrapper::GetInstance().GetActiveSchema().empty()) {
     609            0 :       try {
     610            0 :         KernelWrapper::GetInstance().SetActiveSchema(SchemaFile.toStdString());
     611              :       }
     612            0 :       catch (oks::CanNotSetActiveFile& exc) {
     613            0 :         QMessageBox::warning(0,
     614              :                              "Load Schema",
     615            0 :                              QString("Could not make schema active!\n\n").append(QString(exc.what())),
     616              :                              QMessageBox::Ok);
     617            0 :       }
     618              :     }
     619              : 
     620            0 :     BuildTableModel();
     621            0 :     BuildFileModel();
     622              : 
     623            0 :     update_window_title(QFileInfo(SchemaFile).fileName());
     624              :     //ui->CreateNewSchema->setDisabled (true );
     625              :     //ui->OpenFileSchema->setDisabled (true );
     626            0 :     if (file != nullptr) {
     627            0 :       check_schema_file(QString::fromStdString(file->get_full_file_name()));
     628              :     }
     629              :   }
     630            0 : }
     631              : 
     632            0 : void dbse:: SchemaMainWindow::update_window_title(QString text) {
     633            0 :   m_title.remove(QRegularExpression(": --.*"));
     634            0 :   m_title.append(QString(": -- ") + text);
     635            0 :     setWindowTitle ( m_title );
     636            0 : }
     637              : 
     638            0 : void dbse::SchemaMainWindow::OpenSchemaFile()
     639              : {
     640            0 :   QFileDialog FileDialog ( this, tr ( "Open Schema File" ), ".",
     641            0 :                            tr ( "XML schema files (*.schema.xml);;All files (*)" ) );
     642            0 :   FileDialog.setAcceptMode ( QFileDialog::AcceptOpen );
     643            0 :   FileDialog.setFileMode ( QFileDialog::AnyFile );
     644            0 :   FileDialog.setViewMode ( QFileDialog::Detail );
     645            0 :   FileDialog.setDirectory ( m_schema_directory );
     646            0 :   FileDialog.setSidebarUrls(m_path_urls);
     647            0 :   QStringList FilesSelected;
     648            0 :   QString SchemaPath;
     649              : 
     650            0 :   if ( FileDialog.exec() )
     651              :   {
     652            0 :     FilesSelected = FileDialog.selectedFiles();
     653              :   }
     654              : 
     655            0 :   if ( FilesSelected.size() )
     656              :   {
     657            0 :     m_schema_directory = FileDialog.directory();
     658            0 :     SchemaPath = FilesSelected.value ( 0 );
     659              :   }
     660              : 
     661            0 :   OpenSchemaFile(SchemaPath);
     662            0 : }
     663              : 
     664            0 : bool dbse::SchemaMainWindow::SaveModifiedSchema()
     665              : {
     666            0 :   bool result = true;
     667            0 :   for (auto file: KernelWrapper::GetInstance().get_modified_schema_files()) {
     668            0 :     if (!save_schema_file(QString::fromStdString(file))) {
     669            0 :       result = false;
     670              :     }
     671            0 :   }
     672            0 :   BuildFileModel();
     673            0 :   return result;
     674              : }
     675              : 
     676            0 : void dbse::SchemaMainWindow::SaveSchema()
     677              : {
     678            0 :   auto modified = KernelWrapper::GetInstance().ModifiedSchemaFiles();
     679            0 :   if (modified.empty())
     680              :   {
     681            0 :       QMessageBox::information ( 0, "Schema editor",
     682            0 :                                  QString ( "No modified schema files need saving" ) );
     683              :       
     684              :   }
     685              :   else {
     686            0 :     SaveModifiedSchema();
     687              :   }
     688            0 :   BuildFileModel();
     689            0 : }
     690              : 
     691            0 : void dbse::SchemaMainWindow::CreateNewSchema()
     692              : {
     693            0 :   QFileDialog FileDialog (
     694            0 :     this, tr ( "Create New schema File" ), ".",
     695            0 :     tr ( "XML schema files (*.schema.xml);;All files (*)" ) );
     696            0 :   FileDialog.setAcceptMode ( QFileDialog::AcceptSave );
     697            0 :   FileDialog.setFileMode ( QFileDialog::AnyFile );
     698            0 :   FileDialog.setViewMode ( QFileDialog::Detail );
     699            0 :   FileDialog.setDirectory ( m_schema_directory );
     700            0 :   FileDialog.setSidebarUrls(m_path_urls);
     701            0 :   FileDialog.setLabelText(QFileDialog::Accept, "Create");
     702            0 :   if ( !FileDialog.exec() )
     703              :   {
     704              :     return;
     705              :   }
     706              : 
     707            0 :   QStringList FilesSelected = FileDialog.selectedFiles();
     708            0 :   if ( FilesSelected.isEmpty() )
     709              :   {
     710            0 :     QMessageBox::warning ( 0, "Schema editor",
     711            0 :                            QString ( "Please provide a name for the schema !" ) );
     712            0 :     return;
     713              :   }
     714              : 
     715            0 :   QString FileName = FilesSelected.at(0);
     716            0 :   if ( !FileName.endsWith ( ".schema.xml" ) )
     717              :   {
     718            0 :     FileName.append ( ".schema.xml" );
     719              :   }
     720              : 
     721            0 :   QFile FileInfo ( FileName );
     722            0 :   std::string FileNameStd = FileInfo.fileName().toStdString();
     723              : 
     724            0 :   try
     725              :   {
     726            0 :     KernelWrapper::GetInstance().CreateNewSchema ( FileNameStd );
     727            0 :     KernelWrapper::GetInstance().SaveSchema ( FileNameStd );
     728            0 :     BuildTableModel();
     729            0 :     BuildFileModel();
     730            0 :     ui->CreateNewSchema->setDisabled (true );
     731            0 :     ui->OpenFileSchema->setDisabled (true );
     732              :   }
     733            0 :   catch ( oks::exception & Ex )
     734              :   {
     735            0 :     QMessageBox::warning (
     736              :       0,
     737              :       "Schema editor",
     738            0 :       QString ( "Could not create file : %1.\n\n%2" ).arg ( QString::fromStdString (
     739            0 :                                                               FileNameStd ) ).arg (
     740            0 :         QString ( Ex.what() ) ) );
     741            0 :   }
     742            0 : }
     743              : 
     744            0 : void dbse::SchemaMainWindow::ChangeCursorRelationship ( bool State )
     745              : {
     746            0 :   if ( ui->SetInheritance->isChecked() )
     747              :   {
     748            0 :     ui->SetInheritance->setChecked ( false );
     749              :   }
     750              : 
     751            0 :   if ( State )
     752              :   {
     753            0 :     ui->TabWidget->setCursor ( Qt::CrossCursor );
     754              :   }
     755              :   else
     756              :   {
     757            0 :     ui->TabWidget->setCursor ( Qt::ArrowCursor );
     758              :   }
     759              : 
     760            0 :   KernelWrapper::GetInstance().SetInheritanceMode ( false );
     761            0 : }
     762              : 
     763            0 : void dbse::SchemaMainWindow::ChangeCursorInheritance ( bool State )
     764              : {
     765            0 :   if ( ui->SetRelationship->isChecked() )
     766              :   {
     767            0 :     ui->SetRelationship->setChecked ( false );
     768              :   }
     769              : 
     770            0 :   if ( State )
     771              :   {
     772            0 :     ui->TabWidget->setCursor ( Qt::CrossCursor );
     773              :   }
     774              :   else
     775              :   {
     776            0 :     ui->TabWidget->setCursor ( Qt::ArrowCursor );
     777              :   }
     778              : 
     779            0 :   KernelWrapper::GetInstance().SetInheritanceMode ( true );
     780            0 : }
     781              : 
     782            0 : void dbse::SchemaMainWindow::add_tab()
     783              : {
     784            0 :   auto index = ui->TabWidget->addTab ( new SchemaTab(), "unnamed Schema View" );
     785            0 :   ui->TabWidget->setCurrentIndex ( index );
     786            0 :   auto  tab = dynamic_cast<SchemaTab *> ( ui->TabWidget->currentWidget() );
     787            0 :   connect (tab->GetScene(), &SchemaGraphicsScene::sceneModified,
     788              :            this, &dbse::SchemaMainWindow::modifiedView);
     789            0 :   connect (tab->GetScene(), &SchemaGraphicsScene::saveRequested,
     790              :            this, &dbse::SchemaMainWindow::SaveView);
     791            0 : }
     792              : 
     793            0 : void dbse::SchemaMainWindow::modifiedView(bool modified) {
     794            0 :   auto index = ui->TabWidget->currentIndex();
     795            0 :   auto label = ui->TabWidget->tabText(index);
     796            0 :   if (modified && !label.endsWith("*")) {
     797            0 :     label += "*";
     798              :   }
     799            0 :   if (!modified && label.endsWith("*")) {
     800            0 :     label = label.remove('*');
     801              :   }
     802            0 :   ui->TabWidget->setTabText(index, label);
     803            0 : }
     804              : 
     805            0 : void dbse::SchemaMainWindow::NameView() {
     806            0 :   auto index = ui->TabWidget->currentIndex();
     807            0 :   bool ok;
     808            0 :   QString text = QInputDialog::getText(nullptr,
     809              :                                        "Schema editor: rename class view",
     810              :                                        "New view name:",
     811              :                                        QLineEdit::Normal,
     812              :                                        "New Class View",
     813            0 :                                        &ok);
     814            0 :   if(ok && !text.isEmpty()) {
     815            0 :     ui->TabWidget->setTabText(index, text);
     816            0 :     SchemaTab * CurrentTab = dynamic_cast<SchemaTab *> ( ui->TabWidget->currentWidget() );
     817            0 :     CurrentTab->setName(text);
     818              :   }
     819              : 
     820            0 :   auto newtext = ui->TabWidget->tabText(index);
     821            0 : }
     822              : 
     823            0 : void dbse::SchemaMainWindow::SaveView() {
     824            0 :   SchemaTab * tab = dynamic_cast<SchemaTab *> ( ui->TabWidget->currentWidget() );
     825            0 :   if ( tab->GetScene()->items().size() != 0 )
     826              :   {
     827            0 :     auto file_name = tab->getFileName();
     828            0 :     if (file_name == "./") {
     829            0 :       SaveViewAs();
     830            0 :       return;
     831              :     }
     832            0 :     write_view_file(file_name, tab);
     833            0 :   }
     834              : }
     835            0 : void dbse::SchemaMainWindow::SaveViewAs() {
     836            0 :   SchemaTab * CurrentTab = dynamic_cast<SchemaTab *> ( ui->TabWidget->currentWidget() );
     837            0 :   if ( CurrentTab->GetScene()->items().size() != 0 )
     838              :   {
     839            0 :     auto defName = CurrentTab->getFileName();
     840            0 :     if (defName == "./") {
     841            0 :       defName = m_view_dir;
     842              :     }
     843            0 :     QString FileName = QFileDialog::getSaveFileName (
     844            0 :       this, tr ( "Save View" ), defName,
     845            0 :       tr("View files (*.view);;All files (*)") );
     846              : 
     847            0 :     if (! FileName.isEmpty()) {
     848            0 :       auto spos = FileName.lastIndexOf('/');
     849            0 :       if (spos != -1) {
     850            0 :         m_view_dir = FileName;
     851            0 :         m_view_dir.truncate(spos);
     852              :       }
     853              : 
     854            0 :       if ( !FileName.endsWith ( ".view" ) ) {
     855            0 :         FileName.append ( ".view" );
     856              :       }
     857              : 
     858            0 :       CurrentTab->setFileName ( FileName );
     859            0 :       auto text = QFileInfo(FileName).baseName();
     860            0 :       CurrentTab->setName(text);
     861            0 :       auto index = ui->TabWidget->currentIndex();
     862            0 :       ui->TabWidget->setTabText(index, text);
     863              : 
     864            0 :       write_view_file(FileName, CurrentTab);
     865            0 :     }
     866            0 :   }
     867            0 : }
     868              : 
     869            0 : void dbse::SchemaMainWindow::write_view_file (const QString& file_name,
     870              :                                               SchemaTab* tab) {
     871            0 :   QFile file ( file_name );
     872            0 :   file.open ( QIODevice::WriteOnly );
     873              : 
     874            0 :   for ( QGraphicsItem * item : tab->GetScene()->items() ) {
     875            0 :     auto object = dynamic_cast<SchemaGraphicObject *> ( item );
     876            0 :     if ( object != nullptr ) {
     877            0 :       QString description = object->GetClassName() + ","
     878            0 :         + QString::number ( object->scenePos().x() ) + ","
     879            0 :         + QString::number ( object->scenePos().y() ) + "\n";
     880            0 :       file.write ( description.toUtf8() );
     881            0 :     }
     882              :     else {
     883            0 :       auto note = dynamic_cast<SchemaGraphicNote*> (item);
     884            0 :       if ( note != nullptr && !note->text().isEmpty()) {
     885            0 :         auto text = note->text().replace("\n", "<br>");
     886            0 :         text = text.replace(",", "<comma>");
     887            0 :         QString line = "#,"
     888            0 :           + QString::number ( note->scenePos().x() ) + ","
     889            0 :           + QString::number ( note->scenePos().y() ) + ","
     890            0 :           + text + "\n";
     891            0 :         file.write ( line.toUtf8() );
     892            0 :       }
     893              :     }
     894            0 :   }
     895              : 
     896            0 :   file.close();
     897            0 :   auto message = QString("Saved view to %1").arg(file_name);
     898            0 :   ui->StatusBar->showMessage( message );
     899            0 :   tab->GetScene()->ClearModified();
     900            0 : }
     901              : 
     902            0 : void dbse::SchemaMainWindow::LoadView() {
     903            0 :   QString ViewPath = QFileDialog::getOpenFileName (
     904              :     this,
     905            0 :     tr ("Open view file"),
     906            0 :     m_view_dir,
     907            0 :     tr("View files (*.view);;All files (*)"));
     908              : 
     909            0 :   if ( !ViewPath.isEmpty() )
     910              :   {
     911            0 :     auto spos = ViewPath.lastIndexOf('/');
     912            0 :     if (spos != -1) {
     913            0 :       m_view_dir = ViewPath;
     914            0 :       m_view_dir.truncate(spos);
     915              :     }
     916            0 :     QFile ViewFile ( ViewPath );
     917            0 :     ViewFile.open ( QIODevice::ReadOnly );
     918              : 
     919            0 :     auto text = QFileInfo(ViewPath).baseName();
     920            0 :     auto tab = dynamic_cast<SchemaTab *> ( ui->TabWidget->currentWidget() );
     921            0 :     if (!tab->getName().isEmpty() || tab->GetScene()->IsModified()) {
     922            0 :       add_tab();
     923            0 :       tab = dynamic_cast<SchemaTab *> ( ui->TabWidget->currentWidget() );
     924              :     }
     925            0 :     auto index = ui->TabWidget->currentIndex();
     926            0 :     ui->TabWidget->setTabText(index, text);
     927            0 :     tab->setName(text);
     928            0 :     tab->setFileName(ViewPath);
     929              : 
     930            0 :     QStringList ClassesNames;
     931            0 :     QList<QPointF> Positions;
     932            0 :     QList<QPointF> note_positions;
     933            0 :     QStringList notes;
     934            0 :     while ( !ViewFile.atEnd() )
     935              :     {
     936            0 :       QString Line ( ViewFile.readLine() );
     937            0 :       if (!Line.isEmpty()) {
     938            0 :         QStringList ObjectDescription = Line.split ( "," );
     939            0 :         QPointF Position;
     940            0 :         Position.setX ( ObjectDescription.at ( 1 ).toInt() );
     941            0 :         Position.setY ( ObjectDescription.at ( 2 ).toInt() );
     942            0 :         if (ObjectDescription.at ( 0 ) == "#") {
     943            0 :           note_positions.append (Position);
     944            0 :           auto note_text = ObjectDescription.at(3);
     945            0 :           if (note_text.back() == '\n') {
     946            0 :             note_text.chop(1);
     947              :           }
     948            0 :           note_text = note_text.replace("<br>", "\n");
     949            0 :           note_text = note_text.replace("<comma>", ",");
     950            0 :           notes.append ( note_text );
     951            0 :         }
     952              :         else {
     953            0 :           ClassesNames.append ( ObjectDescription.at ( 0 ) );
     954            0 :           Positions.append ( Position );
     955              :         }
     956            0 :       }
     957            0 :     }
     958            0 :     ViewFile.close();
     959              : 
     960            0 :     auto message = QString("Loaded view from %1").arg(ViewPath);
     961            0 :     ui->StatusBar->showMessage( message );
     962              : 
     963            0 :     auto scene = tab->GetScene();
     964            0 :     scene->CleanItemMap();
     965            0 :     auto missing = scene->AddItemsToScene ( ClassesNames, Positions );
     966            0 :     if (!missing.empty()) {
     967            0 :       QString warning_text{"The following classes in "};
     968            0 :       warning_text.append(QFileInfo(ViewPath).fileName());
     969            0 :       warning_text.append(" are not present in the loaded schema:\n  ");
     970            0 :       warning_text.append(missing.join(",\n  "));
     971            0 :       QMessageBox::warning(this, tr("Load View"), warning_text);
     972            0 :     }
     973            0 :     scene->ClearModified();
     974              : 
     975            0 :     scene->add_notes(notes, note_positions);
     976            0 :   }
     977            0 : }
     978              : 
     979            0 : void dbse::SchemaMainWindow::LaunchClassEditor ( QModelIndex Index )
     980              : {
     981            0 :   QModelIndex proxyIndex = m_proxyModel->mapToSource( Index );
     982            0 :   QStringList Row = TableModel->getRowFromIndex ( proxyIndex );
     983              : 
     984            0 :   if ( !Row.isEmpty() ) {
     985            0 :     SchemaClassEditor::launch(Row.at ( 0 ));
     986              :   }
     987            0 : }
     988              : 
     989            0 : void dbse::SchemaMainWindow::close_tab() {
     990            0 :   RemoveTab(ui->TabWidget->currentIndex());
     991            0 : }
     992              : 
     993            0 : void dbse::SchemaMainWindow::RemoveTab ( int index )
     994              : {
     995            0 :   if ( index == -1 ) {
     996              :     return;
     997              :   }
     998              : 
     999            0 :   auto tab = dynamic_cast<SchemaTab *> (ui->TabWidget->widget(index));
    1000            0 :   if (tab->GetScene()->IsModified()) {
    1001            0 :     auto choice = QMessageBox::question (
    1002            0 :       0, tr ( "SchemaEditor" ),
    1003            0 :       QString ( "There are unsaved changes in the schema view:\n"
    1004            0 :                 "Do you really want to delete this schema view?\n" ),
    1005              :       QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Cancel );
    1006            0 :     if (choice == QMessageBox::Cancel) {
    1007              :       return;
    1008              :     }
    1009              :   }
    1010            0 :   ui->TabWidget->removeTab ( index );
    1011            0 :   delete tab;
    1012            0 :   if ( ui->TabWidget->count() == 0 ) {
    1013            0 :     add_tab();
    1014              :   }
    1015              : }
    1016              : 
    1017            0 : void dbse::SchemaMainWindow::CustomContextMenuFileView ( QPoint Pos )
    1018              : {
    1019            0 :   if ( ContextMenuFileView == nullptr )
    1020              :   {
    1021            0 :     ContextMenuFileView = new QMenu ( this );
    1022              : 
    1023            0 :     QAction * Act = new QAction ( tr ( "Set as Active Schema" ), this );
    1024            0 :     connect ( Act, SIGNAL ( triggered() ), this, SLOT ( SetSchemaFileActive() ) );
    1025            0 :     QAction * Sav = new QAction ( tr ( "Save Schema File" ), this );
    1026            0 :     connect ( Sav, SIGNAL ( triggered() ), this, SLOT ( SaveSchemaFile() ) );
    1027            0 :     QAction * info = new QAction ( tr ( "Show file info" ), this );
    1028            0 :     connect ( info, SIGNAL ( triggered() ), this, SLOT ( show_file_info() ) );
    1029              : 
    1030            0 :     ContextMenuFileView->addAction ( info );
    1031            0 :     ContextMenuFileView->addAction ( Act );
    1032            0 :     ContextMenuFileView->addAction ( Sav );
    1033              :   }
    1034              : 
    1035            0 :   QModelIndex index = ui->FileView->currentIndex();
    1036              : 
    1037            0 :   if ( index.isValid() )
    1038              :   {
    1039            0 :     QStringList row = FileModel->getRowFromIndex ( index );
    1040            0 :     if (row.at(1) == "RW") {
    1041            0 :       ContextMenuFileView->actions().at(2)->setVisible(true);
    1042            0 :       if (!row.at(2).contains("Active")) {
    1043            0 :         ContextMenuFileView->actions().at(1)->setVisible(true);
    1044              :       }
    1045              :       else {
    1046            0 :         ContextMenuFileView->actions().at(1)->setVisible(false);
    1047              :       }
    1048              :     }
    1049              :     else {
    1050            0 :       ContextMenuFileView->actions().at(2)->setVisible(false);
    1051            0 :       ContextMenuFileView->actions().at(1)->setVisible(false);
    1052              :     }
    1053            0 :     ContextMenuFileView->exec ( ui->FileView->mapToGlobal ( Pos ) );
    1054            0 :   }
    1055            0 : }
    1056              : 
    1057            0 : void dbse::SchemaMainWindow::CustomContextMenuTableView ( QPoint Pos )
    1058              : {
    1059            0 :   if ( ContextMenuTableView == nullptr )
    1060              :   {
    1061            0 :     ContextMenuTableView = new QMenu ( this );
    1062              : 
    1063            0 :     QAction * add = new QAction ( tr ( "&Add New Class" ), this );
    1064            0 :     connect ( add, SIGNAL ( triggered() ), this, SLOT ( AddNewClass() ) );
    1065              : 
    1066            0 :     QAction * remove = new QAction ( tr ( "&Remove Selected Class" ), this );
    1067            0 :     connect ( remove, SIGNAL ( triggered() ), this, SLOT ( RemoveClass() ) );
    1068              : 
    1069            0 :     QAction * edit = new QAction ( tr ( "&Edit Selected Class" ), this );
    1070            0 :     connect ( edit, SIGNAL ( triggered() ), this, SLOT ( editClass() ) );
    1071              : 
    1072            0 :     ContextMenuTableView->addAction ( add );
    1073            0 :     ContextMenuTableView->addAction ( edit );
    1074            0 :     ContextMenuTableView->addAction ( remove );
    1075              :   }
    1076              : 
    1077            0 :   QModelIndex Index = ui->ClassTableView->currentIndex();
    1078              : 
    1079            0 :   if ( Index.isValid() )
    1080              :   {
    1081            0 :     ContextMenuTableView->exec ( ui->ClassTableView->mapToGlobal ( Pos ) );
    1082              :   }
    1083            0 : }
    1084              : 
    1085            0 : void dbse::SchemaMainWindow::toggle_case_sensitive ( int /*state*/ )
    1086              : {
    1087            0 :   if ( ui->case_sensitive->isChecked() ) {
    1088            0 :     m_proxyModel->setFilterCaseSensitivity ( Qt::CaseSensitive );
    1089              :   }
    1090              :   else {
    1091            0 :     m_proxyModel->setFilterCaseSensitivity ( Qt::CaseInsensitive );
    1092              :   }
    1093            0 : }
    1094            0 : void dbse::SchemaMainWindow::update_view() {
    1095            0 :   auto tab = dynamic_cast<SchemaTab *> ( ui->TabWidget->currentWidget() );
    1096            0 :   tab->GetScene()->update();
    1097              : 
    1098            0 :   BuildTableModel();
    1099            0 :   BuildFileModel();
    1100            0 : }
    1101              : 
    1102            0 : void dbse::SchemaMainWindow::edit_settings() {
    1103            0 :   if (m_settings == nullptr) {
    1104            0 :     m_settings = new SchemaSettings(this);
    1105            0 :     connect(m_settings, SIGNAL(settings_updated()), this, SLOT(update_view()));
    1106              :   }
    1107            0 :   m_settings->show();
    1108            0 : }
    1109              : 
    1110            0 : void dbse::SchemaMainWindow::save_layout() {
    1111            0 :   QSettings settings;
    1112            0 :   settings.beginGroup("MainWindow-layout");
    1113            0 :   settings.setValue("size", size());
    1114            0 :   settings.setValue("pos", pos());
    1115            0 :   settings.setValue("geometry", saveGeometry());
    1116            0 :   settings.setValue("state", saveState());
    1117            0 :   settings.setValue("diagrams-visible", ui->TabWidget->isVisible());
    1118            0 :   settings.setValue("statusbar-visible", ui->StatusBar->isVisible());
    1119            0 :   settings.endGroup();
    1120            0 : }
    1121              : 
    1122            0 : void dbse::SchemaMainWindow::restore_layout() {
    1123            0 :   QSettings settings;
    1124            0 :   settings.beginGroup("MainWindow-layout");
    1125            0 :   if (settings.contains("size")) {
    1126            0 :     resize(settings.value("size").toSize());
    1127              :   }
    1128            0 :   if (settings.contains("pos")) {
    1129            0 :     move(settings.value("pos").toPoint());
    1130              :   }
    1131            0 :   if (settings.contains("geometry")) {
    1132            0 :     restoreGeometry(settings.value("geometry").toByteArray());
    1133              :   }
    1134            0 :   if (settings.contains("state")) {
    1135            0 :     restoreState(settings.value("state").toByteArray());
    1136              :   }
    1137              : 
    1138            0 :   auto visible = settings.value("diagrams-visible", true).toBool();
    1139            0 :   ui->displayDiagrams->setChecked(visible);
    1140            0 :   ui->TabWidget->setVisible(visible);
    1141              : 
    1142            0 :   visible = settings.value("statusbar-visible", true).toBool();
    1143            0 :   ui->StatusBar->setVisible(visible);
    1144            0 :   ui->displayStatus_bar->setChecked(visible);
    1145              : 
    1146            0 :   ui->displayToolbar->setChecked(ui->MainToolBar->isVisible());
    1147            0 :   settings.endGroup();
    1148              : 
    1149            0 :   settings.beginGroup("MainWindow");
    1150            0 :   m_save_layout_on_exit = settings.value("saveLayout", false).toBool();
    1151            0 :   settings.endGroup();
    1152            0 : }
    1153              : 
    1154            0 : void dbse::SchemaMainWindow::default_layout() {
    1155            0 :   restoreGeometry(m_default_geometry);
    1156            0 :   restoreState(m_default_state);
    1157            0 :   resize(m_default_size);
    1158              : 
    1159            0 :   ui->displayDiagrams->setChecked(true);
    1160            0 :   ui->TabWidget->setVisible(true);
    1161            0 :   ui->StatusBar->setVisible(true);
    1162            0 :   ui->displayStatus_bar->setChecked(true);
    1163            0 : }
        

Generated by: LCOV version 2.0-1