X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSUPERVGUI%2FSUPERVGUI_Main.cxx;h=e7317460b29ac65c494ec039d415999c36315a4b;hb=f441336925314db813aa70e5879a46493ede10e5;hp=5184f7cc629905b37f65b36f9c0b34bcc8baf7ad;hpb=9635da77b73ee96a34309274718134a8e44240ea;p=modules%2Fsuperv.git diff --git a/src/SUPERVGUI/SUPERVGUI_Main.cxx b/src/SUPERVGUI/SUPERVGUI_Main.cxx index 5184f7c..e731746 100644 --- a/src/SUPERVGUI/SUPERVGUI_Main.cxx +++ b/src/SUPERVGUI/SUPERVGUI_Main.cxx @@ -26,6 +26,7 @@ // Module : SUPERV using namespace std; + #include "QAD_Splitter.h" #include "QAD_LeftFrame.h" #include "QAD_ObjectBrowser.h" @@ -34,97 +35,31 @@ using namespace std; #include "QAD_Message.h" #include "QAD_FileDlg.h" #include "QAD_Application.h" -#include "SUPERVGUI_Def.h" #include "QAD_RightFrame.h" +#include "QAD_SpinBoxDbl.h" +#include "QAD_MessageBox.h" + +#include "NOTIFICATION.hxx" +#include "SALOME_Event.hxx" +#include "SALOMEGUI_ImportOperation.h" #include "SUPERVGraph_ViewFrame.h" -#include -#include -#include "SUPERVGUI_Main.h" + #include "SUPERVGUI.h" -#include "SUPERVGUI_ComputeNode.h" -#include "SUPERVGUI_ControlNode.h" -#include "NOTIFICATION.hxx" +#include "SUPERVGUI_Def.h" +#include "SUPERVGUI_Main.h" #include "SUPERVGUI_Notification.h" -#include "SALOMEGUI_ImportOperation.h" #include "SUPERVGUI_Information.h" +#include "SUPERVGUI_CanvasControlNode.h" +#include "SUPERVGUI_CanvasPort.h" +#include +#include +#include +#include +#include -SUPERVGUI_Main::SUPERVGUI_Main(SUPERVGraph_ViewFrame* theParent, QAD_Desktop* theDesktop, bool fromIOR) - : SUPERVGraph_View(theParent), - myLogged( false ), - myFiltered( false ), - myLogFileName( QString::null ), - myLogFile( NULL ), - myWarning( false ), - myStep( false ), - myTrace( false ), - myVerbose( false ) -{ - Trace("SUPERVGUI_Main::SUPERVGUI_Main (new)"); - theParent->setViewWidget(this); - if (fromIOR) { - //SUPERVGUI_Main* am = Supervision.getMain(); - QAD_ObjectBrowser* ob = ((QAD_StudyFrame*)(theDesktop->getMainFrame()->activeWindow()))->getLeftFrame()->getObjectBrowser(); - // if (am == 0) { - // ob = ((QAD_StudyFrame*)(theDesktop->getMainFrame()->activeWindow()))->getLeftFrame()->getObjectBrowser(); - //} else { - //ob = am->objectBrowser; - //}; - QAD_ObjectBrowserItem* item = (QAD_ObjectBrowserItem*)(ob->getListView()->currentItem()); - SALOMEDS::SObject_var obj = theDesktop->getActiveStudy()->getStudyDocument()->FindObjectID(item->getEntry().latin1()); - SALOMEDS::GenericAttribute_var anAttr; - if (obj->FindAttribute(anAttr, "AttributeIOR")) { - SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - Standard_CString ior = anIOR->Value(); - dataflow = (*Supervision.getEngine())->getGraph(ior); - if (SUPERV_isNull(dataflow)) { - QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_ACCESS_BAD_IOR")); - close(); - } else { - init(theDesktop); - } - } else { - QMessageBox::warning(0, tr("ERROR"), tr("MSG_NOACCESS_BY_IOR")); - close(); - } - } else { - dataflow = (*Supervision.getEngine())->Graph(MAIN_NEW); - if (SUPERV_isNull(dataflow)) { - QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_CREATE_DF")); - close(); - } else { - init(theDesktop); - } - } -} - -SUPERVGUI_Main::SUPERVGUI_Main(SUPERVGraph_ViewFrame* theParent, QAD_Desktop* theDesktop, bool isModify, const char* f) - : SUPERVGraph_View(theParent), - myLogged( false ), - myFiltered( false ), - myLogFileName( QString::null ), - myLogFile( NULL ), - myWarning( false ), - myStep( false ), - myTrace( false ), - myVerbose( false ) -{ - Trace("SUPERVGUI_Main::SUPERVGUI_Main (file)") - theParent->setViewWidget(this); - if (isModify) { - dataflow = (*Supervision.getEngine())->Graph(f); - } else { - dataflow = (*Supervision.getEngine())->GraphE(f); - } - if (SUPERV_isNull(dataflow)) { - QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_BAD_FILE").arg(f)); - close(); - } else { - init(theDesktop); - } -} -SUPERVGUI_Main::SUPERVGUI_Main(SUPERVGraph_ViewFrame* theParent, QAD_Desktop* theDesktop, SUPERV_Graph cp) +SUPERVGUI_Main::SUPERVGUI_Main(SUPERVGraph_ViewFrame* theParent, QAD_Desktop* theDesktop, SUPERV_Graph theDataFlow ) : SUPERVGraph_View(theParent), myLogged( false ), myFiltered( false ), @@ -133,12 +68,12 @@ SUPERVGUI_Main::SUPERVGUI_Main(SUPERVGraph_ViewFrame* theParent, QAD_Desktop* th myWarning( false ), myStep( false ), myTrace( false ), - myVerbose( false ) + myVerbose( false ), + myGUIEventLoopFinished( true ) { Trace("SUPERVGUI_Main::SUPERVGUI_Main (copy)"); theParent->setViewWidget(this); - // dataflow = cp->Copy(); - dataflow = cp; + dataflow = theDataFlow; if (SUPERV_isNull(dataflow)) { QMessageBox::warning(0, tr("ERROR"), tr("MSG_CANT_COPY")); close(); @@ -155,98 +90,103 @@ void SUPERVGUI_Main::init(QAD_Desktop* theDesktop) { choosing = false; myIsLocked = false; - myIsKilled = false; - //myIsRunned = false; - myCurrentView = GRAPH; + myThread = new SUPERVGUI_Thread(); + myThread->setMain(this); + + myCurrentView = CANVAS; myIsFromStudy = false; + myLastGraph = 0; study = theDesktop->getActiveStudy(); - timer = new QTimer(this); - connect(timer, SIGNAL(timeout()), this, SLOT(execute())); - - SALOMEDS::Study_var studyDoc = study->getStudyDocument(); - SALOMEDS::StudyBuilder_var builder = studyDoc->NewBuilder(); - SALOMEDS::SComponent_var father = studyDoc->FindComponent(STUDY_SUPERVISION); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - SALOMEDS::AttributePixMap_var aPixmap; - if (father->_is_nil()) { - QAD_Operation* op = new SALOMEGUI_ImportOperation( study ); - op->start(); - father = builder->NewComponent(STUDY_SUPERVISION); - anAttr = builder->FindOrCreateAttribute(father, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - // aName->SetValue("Supervision"); - aName->SetValue( QAD_Application::getDesktop()->getComponentUserName( "SUPERV" ) ); - - - - anAttr = builder->FindOrCreateAttribute(father, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - aPixmap->SetPixMap( "ICON_OBJBROWSER_Supervision" ); - - builder->DefineComponentInstance(father, *Supervision.getEngine()); - op->finish(); - }; + + SALOMEDS::Study_var studyDoc = study->getStudyDocument(); + bool aLocked = studyDoc->GetProperties()->IsLocked(); + SALOMEDS::StudyBuilder_var builder = studyDoc->NewBuilder(); + SALOMEDS::SComponent_var father = studyDoc->FindComponent(STUDY_SUPERVISION); + SALOMEDS::GenericAttribute_var anAttr; + SALOMEDS::AttributeName_var aName; + SALOMEDS::AttributePixMap_var aPixmap; + if (father->_is_nil()) { + QAD_Operation* op = new SALOMEGUI_ImportOperation( study ); + op->start(); + if (aLocked) studyDoc->GetProperties()->SetLocked(false); + father = builder->NewComponent(STUDY_SUPERVISION); + anAttr = builder->FindOrCreateAttribute(father, "AttributeName"); + aName = SALOMEDS::AttributeName::_narrow(anAttr); + aName->SetValue(QAD_Application::getDesktop()->getComponentUserName( "SUPERV" ) ); + + anAttr = builder->FindOrCreateAttribute(father, "AttributePixMap"); + aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); + aPixmap->SetPixMap( "ICON_OBJBROWSER_Supervision" ); + + builder->DefineComponentInstance(father, Supervision.getEngine()); + if (aLocked) studyDoc->GetProperties()->SetLocked(true); + op->finish(); + }; - objectBrowser = study->getActiveStudyFrame()->getLeftFrame()->getObjectBrowser(); + objectBrowser = study->getActiveStudyFrame()->getLeftFrame()->getObjectBrowser(); + myArray = new SUPERVGUI_CanvasArray(this); + myArrayView = new SUPERVGUI_ArrayView(myArray, this); - graph = new SUPERVGUI_Graph(this); - array = new SUPERVGUI_Array(this); + myCanvas = new SUPERVGUI_Canvas(this); + myCanvasView = new SUPERVGUI_CanvasView(myCanvas, this); + + message = study->getActiveStudyFrame()->getRightFrame()->getMessage(); + notification = new NOTIFICATION_Consumer(); - message = study->getActiveStudyFrame()->getRightFrame()->getMessage(); - notification = new NOTIFICATION_Consumer(); + QBoxLayout * layout = new QVBoxLayout(this); + layout->setMargin(0); + layout->setSpacing(0); + layout->addWidget(myCanvasView); + layout->addWidget(myArrayView); - QBoxLayout * layout = new QVBoxLayout(this); - layout->setMargin(0); - layout->setSpacing(0); - layout->addWidget(graph); - layout->addWidget(array); + if (myCurrentView == CANVAS || myCurrentView == CONTROLFLOW) { + myCanvas->merge(); + } - sync(); - show(); - if ( myLogged && !myLogFileName.isEmpty() && QFile::exists( myLogFileName ) ) { - myLogFile = fopen( myLogFileName.latin1(), "a" ); - if ( myLogFile == NULL ) - myLogged = false; - } + sync(); + show(); + if ( myLogged && !myLogFileName.isEmpty() && QFile::exists( myLogFileName ) ) { + myLogFile = fopen( myLogFileName.latin1(), "a" ); + if ( myLogFile == NULL ) + myLogged = false; + } + myTimer = new QTimer( this ); + connect( myTimer, SIGNAL(timeout()), this, SLOT(checkExecution()) ); } SUPERVGUI_Main::~SUPERVGUI_Main() { Trace("SUPERVGUI_Main::~SUPERVGUI_Main"); - if ( myLogFile != NULL) { - fclose( myLogFile ); + + // close all opened SubGraphs + QMap::iterator it; + for (it = mySubGraphs.begin(); it != mySubGraphs.end(); ++it) { + it.data()->removeEventFilter(this); + it.data()->disconnect(); + it.data()->close(); + + QAD_Study* aStudy = it.data()->getStudy(); + aStudy->removeStudyFrame(it.data()); } - graph->removeLinks(); - delete notification; // kloss : nota bene : quand un datalow est detruit : verifier que les canaux de notification sont aussi detruit - if (!SUPERV_isNull(dataflow)) { - if (dataflow->IsExecuting()) { - if (QMessageBox::warning(QAD_Application::getDesktop(), tr("WARNING"), - tr("MSG_DF_RUNNING"), - tr("MSG_DF_EXECUTION"), - tr("MSG_DF_KILL")) == 1) { - dataflow->Kill(); - } - } + mySubGraphs.clear(); + mySubGraphMap.clear(); + /* + QAD_StudyFrame* aSubGraph; + for (aSubGraph = mySubGraphs.first(); aSubGraph; aSubGraph = mySubGraphs.next()) { + aSubGraph->removeEventFilter(this); + aSubGraph->close(); } -} + */ -void SUPERVGUI_Main::StartTimer(const char* m) { - Trace("SUPERVGUI_Main::StartTimer") - if (!timer->isActive()) { - timer->start(5); - message->setMessage(m); - }; -} + if ( myLogFile != NULL) { + fclose( myLogFile ); + } + + // delete notification; // kloss : nota bene : quand un datalow est detruit : verifier que les canaux de notification sont aussi detruit + notification->_remove_ref(); // kloss : nota bene : quand un datalow est detruit : verifier que les canaux de notification sont aussi detruit -void SUPERVGUI_Main::StopTimer(const char* m) { - Trace("SUPERVGUI_Main::StopTimer") - if (timer->isActive()) { - timer->stop(); - syncNotification(); - message->setMessage(m); - sync(); - }; + delete myCanvas; + delete myArray; } void SUPERVGUI_Main::filterNotification() { @@ -282,140 +222,140 @@ void SUPERVGUI_Main::filterNotification() { } void SUPERVGUI_Main::syncAsync() { - Trace("SUPERVGUI_Main::syncAsync") + Trace("SUPERVGUI_Main::syncAsync"); QTimer::singleShot(1, this, SLOT(sync())); } /** - * Called by timer when dataflow is executing + * Called by thread when dataflow is executing */ -void SUPERVGUI_Main::execute() { - SUPERV_CNode aNode; - SUPERV::GraphEvent aEvent; - SUPERV::GraphState aState; - dataflow->EventNoW(aNode, aEvent, aState); - if ((aEvent == SUPERV::NoEvent) && (aState == SUPERV::NoState)) return; - - if (!SUPERV_isNull(aNode)) { - SUPERVGUI_Node* aNodePrs; - if (myCurrentView == TABLE) { - aNodePrs = (SUPERVGUI_Node*) array->child(aNode->Name(), "SUPERVGUI_Node"); - } else { - aNodePrs = (SUPERVGUI_Node*) graph->child(aNode->Name(), "SUPERVGUI_Node"); +void SUPERVGUI_Main::execute( char * theNodeName, SUPERV::GraphState theNodeState ) { + if (myCurrentView == CANVAS || myCurrentView == CONTROLFLOW) { + SUPERVGUI_CanvasNode* aNode = (SUPERVGUI_CanvasNode*) myCanvas->child(theNodeName, "SUPERVGUI_CanvasNode"); + if ( aNode ) { + aNode->sync(); } - if (aNodePrs) - aNodePrs->sync(); } - switch (dataflow->State()) { - case SUPERV_Editing : - StopTimer(dataflow->IsReadOnly()? tr("MSG_GRAPH_READONLY"): tr("MSG_GRAPH_EDITING")); - break; - - case SUPERV_Suspend : - StopTimer(tr("MSG_GRAPH_SUSPENDED")); - break; - - case SUPERV_Done : - StopTimer(tr("MSG_GRAPH_FINISHED")); - break; - - case SUPERV_Error : - StopTimer(tr("MSG_GRAPH_ABORTED")); - break; - - case SUPERV_Kill : - StopTimer(tr("MSG_GRAPH_KILLED")); - break; - + else if (myCurrentView == CANVASTABLE) { + SUPERVGUI_CanvasCellNode* aNode = (SUPERVGUI_CanvasCellNode*) myArray->child(theNodeName, "SUPERVGUI_CanvasCellNode"); + if (aNode) aNode->sync(); } -} - - -void SUPERVGUI_Main::sync() { - Trace("SUPERVGUI_Main::sync") - if ((SUPERV_isNull(dataflow))) return; - QString t = tr("GRAPH_TITLE"); - - t += dataflow->Name(); - setCaption(t); - - study->updateObjBrowser(); - if (myCurrentView == TABLE) { - array->sync(); - } else { - graph->sync(); - } + // asv : 26.01.05 : Bug PAL7164 : puting out-value to study if the "put_to_Study" flag is set on a + // CanvasPort the functionality was moved from SUPERVGUI_CanvasPortOut::sync() method please, see + // comment in that method for details. + if ( theNodeState == SUPERV::DoneState ) { + SUPERVGUI_CanvasNode* aNode = (SUPERVGUI_CanvasNode*) myCanvas->child(theNodeName, "SUPERVGUI_CanvasNode"); + if ( aNode ) { + //cout << " *** theNode " << theNodeName << " received DONE_STATE *** " << endl; + SUPERVGUI_CanvasPortOut* aPortOut; + QObjectList* aPortList = aNode->queryList("SUPERVGUI_CanvasPortOut"); + QObjectListIt aPortIt(*aPortList); + while ((aPortOut=(SUPERVGUI_CanvasPortOut*)aPortIt.current()) != 0) { + ++aPortIt; + if ( aPortOut->isInStudy() && aPortOut->getEngine()->State() == SUPERV::ReadyState ) { + //cout << " *** " << theNodeName << "[" << aPortOut->name() << "]--> goes into study *** " << endl; + putDataStudy( aPortOut->getEngine(), STUDY_PORT_OUT ); + } + } + delete aPortList; + } + //else //normal case if Node is not found is when node is a graph! it can receive DoneState as well! + // MESSAGE( "ERROR in SUPERVGUI_Main::execute() : CanvasNode \"" << theNodeName << "\" NOT FOUND in myCanvas" ); + } } -void SUPERVGUI_Main::showTable() { - if (myCurrentView == TABLE) return; +void SUPERVGUI_Main::sync() { + Trace("SUPERVGUI_Main::sync"); + if ((SUPERV_isNull(dataflow))) + return; + QString t = tr("GRAPH_TITLE"); + + t += dataflow->Name(); + setCaption(t); - if (array->create()) { - myCurrentView = TABLE; - graph->hide(); + study->updateObjBrowser(); + if (myCurrentView == CANVASTABLE) { + myArray->sync(); + myArray->update(); + } else { + myCanvas->sync(); + myCanvas->update(); } - sync(); } +void SUPERVGUI_Main::showCanvasTable() { + if (myCurrentView == CANVASTABLE) + return; -void SUPERVGUI_Main::showFullGraph() { - if (myCurrentView == TABLE) { - array->destroy(); - graph->show(); + if (myArray->create()) { + myCanvasView->hide(); + myArrayView->show(); + myCurrentView = CANVASTABLE; } - myCurrentView = GRAPH; - graph->sync(); - graph->setFullView(); + sync(); } - void SUPERVGUI_Main::showContolFlow() { - if (myCurrentView == TABLE) { - array->destroy(); - graph->show(); + bool merge = false; + if (myCurrentView == CANVASTABLE) { + myArrayView->hide(); + myArray->destroy(); + merge = true; } myCurrentView = CONTROLFLOW; - graph->sync(); - graph->setControlView(); + myCanvas->setControlView(); + if (merge) { + myCanvas->merge(); + myCanvasView->show(); + } } +void SUPERVGUI_Main::showCanvas() { + if (myCurrentView == CANVAS) + return; -bool SUPERVGUI_Main::exportDataflow(QString theFile) { - Trace("SUPERVGUI_Main::exportDataflow"); - if ((SUPERV_isNull(dataflow))) return false; - - if (!theFile.isEmpty()) { - if (!dataflow->Export(theFile.latin1())) { - QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_BAD_WRITING")); - return false; - } + bool merge = false; + if (myCurrentView == CANVASTABLE) { + myArrayView->hide(); + myArray->destroy(); + merge = true; + } + myCurrentView = CANVAS; + myCanvas->setFullView(); + if (merge) { + myCanvas->merge(); + myCanvasView->show(); } - return true; } void SUPERVGUI_Main::insertFile() { - Trace("SUPERVGUI_Main::insertFile") + Trace("SUPERVGUI_Main::insertFile"); if ((SUPERV_isNull(dataflow))) return; + Editing(); // PAL6170: GUI->Engine: setting "Editing" flag + QString f = QAD_FileDlg::getFileName(QAD_Application::getDesktop(), "", "*.xml", tr("MSG_GRAPH_INSERT"), true); if (!f.isEmpty()) { - if (dataflow->Import(f.latin1())) { - if (myCurrentView == TABLE) { - array->destroy(); - array->create(); - } - sync(); - } else { - QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_BAD_FILE").arg(f)); - }; - }; + if (dataflow->Import(f.latin1())) { + if (myCurrentView == CANVASTABLE) { + myArray->destroy(); + myArray->create(); + } + else { // (myCurrentView == CANVAS || myCurrentView == CONTROLFLOW) { + myCanvas->merge(); + } + sync(); + } else { + QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_BAD_FILE").arg(f)); + } + } } void SUPERVGUI_Main::copy() { @@ -428,51 +368,155 @@ void SUPERVGUI_Main::copy() { SUPERVGraph_ViewFrame* aViewFrame = dynamic_cast (aStudyFrame->getRightFrame()->getViewFrame()); if(aViewFrame){ - SUPERV_Graph aNewGraph = dataflow->Copy(); + SUPERV_Graph aNewGraph; // = dataflow->StreamCopy(); + if (dataflow->IsStreamGraph()) { + SUPERV_StreamGraph aSGraph = dataflow->ToStreamGraph(); + if (SUPERV_isNull(aSGraph)) { + QMessageBox::warning(QAD_Application::getDesktop(), tr("WARNING"), tr("MSG_CANT_COPY")); + return; + } + aNewGraph = aSGraph->StreamCopy(); + } + else { + aNewGraph = dataflow->Copy(); + } QString aNewName(tr("MSG_COPY_PREFIX").arg(++myCopyNum)); aNewName += dataflow->Name(); aNewGraph->SetName(aNewName); - SUPERVGUI_Main* m = new SUPERVGUI_Main(aViewFrame, + /*SUPERVGUI_Main* m = */new SUPERVGUI_Main(aViewFrame, Supervision.getDesktop(), aNewGraph); study->showFrame(aStudyFrame); } } +void SUPERVGUI_Main::openSubGraph(SUPERV_CNode theNode, bool correct) +{ + if (theNode->IsMacro()) { + // get SubGraph from MacroNode + SUPERV_Graph aMacro = SUPERV::Graph::_narrow(theNode); + SUPERV_Graph aGraph; + if (aMacro->IsStreamMacro()) + aGraph = aMacro->StreamObjRef(); + else + aGraph = aMacro->FlowObjRef(); + + // display SubGraph + if (SUPERV_isNull(aGraph)) { + QMessageBox::warning(QAD_Application::getDesktop(), tr("WARNING"), tr("MSG_NOACCESS")); + return; + } + else { + QString aGraphName = aGraph->Name(); + QAD_StudyFrame* aStudyFrame; + if (mySubGraphs.contains(aGraphName)) { + aStudyFrame = mySubGraphs[aGraphName]; + aStudyFrame->setActiveWindow(); + aStudyFrame->setFocus(); + } + else { + aStudyFrame = Supervision.createGraph(); + if (aStudyFrame) { + SUPERVGraph_ViewFrame* aViewFrame = dynamic_cast + (aStudyFrame->getRightFrame()->getViewFrame()); + if(aViewFrame) { + /*SUPERVGUI_Main* m = */new SUPERVGUI_Main(aViewFrame, + Supervision.getDesktop(), + aGraph); + // connect(aStudyFrame, SIGNAL(sfStudyFrameClosing(QAD_StudyFrame*)), + // this, SLOT(onSubGraphClosed(QAD_StudyFrame*))); + connect(aStudyFrame, SIGNAL(sfStudyFrameActivated(QAD_StudyFrame*)), + this, SLOT(onSubGraphActivated(QAD_StudyFrame*))); + aStudyFrame->installEventFilter(this); + + mySubGraphs.insert(aGraphName, aStudyFrame); + mySubGraphMap.insert(aGraphName, theNode->Name()); + + } + } + } + study->showFrame(aStudyFrame); + if (!correct) myLastGraph = aStudyFrame; + } + } +} + +bool SUPERVGUI_Main::eventFilter( QObject* o, QEvent* e) +{ + // workaround to get close event + if (o->inherits("QAD_StudyFrame") && e->type() == QEvent::Close) { + QAD_StudyFrame* aFrame = (QAD_StudyFrame*) o; + onSubGraphClosed(aFrame); + } + return SUPERVGraph_View::eventFilter(o, e); +} + +// workaround to fix PAL6255 -> opened SubGraph is not on top +void SUPERVGUI_Main::onSubGraphActivated(QAD_StudyFrame* theStudyFrame) +{ + if (myLastGraph) { + QAD_StudyFrame* aFrame = myLastGraph; + myLastGraph = 0; + aFrame->setActiveWindow(); + aFrame->setFocus(); + } +} + +void SUPERVGUI_Main::onSubGraphClosed(QAD_StudyFrame* theStudyFrame) +{ + QAD_ViewFrame* viewFrame = theStudyFrame->getRightFrame()->getViewFrame(); + if(SUPERVGraph_ViewFrame* supervFrame = dynamic_cast(viewFrame)){ + theStudyFrame->removeEventFilter(this); + disconnect(theStudyFrame, 0, this, 0); + + SUPERVGraph_View* view = supervFrame->getViewWidget(); + SUPERVGUI_Main* aGraph = dynamic_cast(view); + if (aGraph) { + QString aGraphName = aGraph->getDataflow()->Name(); + QMap::iterator it = mySubGraphMap.find(aGraphName); + if (it != mySubGraphMap.end()) { + QString aNodeName = it.data(); + SUPERVGUI_CanvasNode* aNode = (SUPERVGUI_CanvasNode*) + myCanvas->child(aNodeName, "SUPERVGUI_CanvasNode"); + if (aNode) { + aNode->merge(); + myCanvas->update(); + } + mySubGraphMap.remove(it); + } + mySubGraphs.remove(aGraphName); + } + } +} + void SUPERVGUI_Main::run() { - Trace("SUPERVGUI_Main::run") + Trace("SUPERVGUI_Main::run"); if ((SUPERV_isNull(dataflow))) return; if (dataflow->IsEditing()) { if (!dataflow->IsValid()) { QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_DF_NOTVALID")); - } else if (!dataflow->IsExecutable()) { + } + else if (!dataflow->IsExecutable()) { QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_DF_NOTEXECUTABLE")); - } else if (graph->isAnyLinkCreating()) { + } + else if (myCanvasView->isAnyLinkCreating()) { QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CRL_NOTCOMPLETE")); - } else { + } + else { myRunTime = QDateTime::currentDateTime(); - if (myIsKilled) { - //if (myIsRunned) { - if (!dataflow->ReRun()) { - QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_DF_BADEXECUTE")); - } else { - StartTimer(tr("MSG_GRAPH_STARTED")); - syncNotification(); - sync(); - } - } else { - if (!dataflow->Run()) { - QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_DF_BADEXECUTE")); - } else { - StartTimer(tr("MSG_GRAPH_STARTED")); - syncNotification(); - //myIsRunned = true; - sync(); + if ( !dataflow->Run() ) { + QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_DF_BADEXECUTE")); + if ( dataflow->State() == SUPERV::ErrorState ) { + kill(); } + } + else { + myThread->startThread(tr("MSG_GRAPH_STARTED")); } } - } else { + } + else { QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_DF_RUNNING")); } } @@ -480,80 +524,78 @@ void SUPERVGUI_Main::run() { void SUPERVGUI_Main::startExecute() { - Trace("SUPERVGUI_Main::startExecute") + Trace("SUPERVGUI_Main::startExecute"); if ((SUPERV_isNull(dataflow))) return; if (dataflow->IsEditing()) { if (!dataflow->IsValid()) { QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_DF_NOTVALID")); - } else if (!dataflow->IsExecutable()) { + } + else if (!dataflow->IsExecutable()) { QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_DF_NOTEXECUTABLE")); - } else if (graph->isAnyLinkCreating()) { + } + else if (myCanvasView->isAnyLinkCreating()) { QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CRL_NOTCOMPLETE")); - } else { + } + else { myRunTime = QDateTime::currentDateTime(); - if (myIsKilled) { - //if (myIsRunned) { - if (!dataflow->ReStart()) { - QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_DF_BADEXECUTE")); - } else { - StartTimer(tr("MSG_GRAPH_STARTED")); - syncNotification(); - } - } + if (!dataflow->Start()) { + QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_DF_BADEXECUTE")); + } else { - if (!dataflow->Start()) { - QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_DF_BADEXECUTE")); - } else { - StartTimer(tr("MSG_GRAPH_STARTED")); - syncNotification(); - } + myThread->startThread(tr("MSG_GRAPH_STARTED")); } } - } else { + } + else { QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_DF_RUNNING")); } } void SUPERVGUI_Main::kill() { - Trace("SUPERVGUI_Main::kill") - if ((SUPERV_isNull(dataflow))) return; + Trace("SUPERVGUI_Main::kill"); + if ((SUPERV_isNull(dataflow))) + return; - if (dataflow->IsEditing()) { - QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_DF_NOTRUNNING")); - } else if (dataflow->Kill()) { - myIsKilled = true; - sync(); - } else { - QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANTKILL_DF")); - } + if (dataflow->IsEditing()) { + QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_DF_NOTRUNNING")); + } + else if (dataflow->Kill()) { + myThread->stopThread(tr("MSG_GRAPH_KILLED")); + sync(); + } + else { + QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANTKILL_DF")); + } } void SUPERVGUI_Main::suspendResume() { - Trace("SUPERVGUI_Main::suspendResume") + Trace("SUPERVGUI_Main::suspendResume"); if ((SUPERV_isNull(dataflow))) return; if (dataflow->IsEditing()) { QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_DF_NOTRUNNING")); } else if (dataflow->State() == SUPERV_Suspend) { if (dataflow->Resume()) { - message->setMessage(tr("MSG_DF_RESUMED")); - sync(); + myThread->startThread(tr("MSG_DF_RESUMED")); } else { QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_RESUME")); } } else { if (dataflow->Suspend()) { sync(); + myThread->stopThread(tr("MSG_GRAPH_SUSPENDED")); } else { QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_SUSPEND")); } } } - +/* asv : 15.12.04 : commented out stopRestart() in Main and CanvasNode because it's not called from anywhere, + the comment from kloss below may be explaining it, but it's in French and I do not understand it.. + It also calls deprecated method of Engine: ReStart(). void SUPERVGUI_Main::stopRestart() { // kloss : a reviser et a connecter dans le popup du dataflow (pas de creation de bouton) - Trace("SUPERVGUI_Main::stopRestart") + Trace("SUPERVGUI_Main::stopRestart"); if ((SUPERV_isNull(dataflow))) return; if (dataflow->IsEditing()) { @@ -573,52 +615,46 @@ void SUPERVGUI_Main::stopRestart() { // kloss : a reviser et a connecter dans le }; }; } - +*/ void SUPERVGUI_Main::addNode() { Trace("SUPERVGUI_Main::addNode"); - if (SUPERV_isNull(dataflow)) return; + bool error = SUPERV_isNull( dataflow ); + if ( error ) + return; - if (dataflow->IsExecuting()) { - if (QMessageBox::warning(QAD_Application::getDesktop(), - tr("WARNING"), tr("MSG_GRAPH_ISRUN"), - QMessageBox::Yes, QMessageBox::No) == QMessageBox::No) { - return; - } else { + if ( dataflow->IsExecuting() ) { + error = QAD_MessageBox::warn2( QAD_Application::getDesktop(), // 0=Yes, 1=No + tr("WARNING"), tr("MSG_GRAPH_ISRUN"), tr( "BUT_YES" ), tr( "BUT_NO" ), 0, 1, 0 ); + if ( error ) // user selected NOT to kill dataflow and NOT to add new node + return; + else // user selected to kill the dataflow and add new node after that kill(); - } } + + Editing(); // PAL6170: GUI->Engine: setting "Editing" flag + Supervision.getBrowser()->choose(); } - - /** * Add Computation node */ void SUPERVGUI_Main::addComputeNode(SUPERV_CNode theNode) { - //cout<<"### X="<X()<<" Y="<Y()<viewport(), this, theNode); - graph->ResizeGraph(aNode, theNode->X(), theNode->Y()); - graph->addChild(aNode, theNode->X(), theNode->Y()); - aNode->sync(); - } - break; + case CANVASTABLE: + myArray->destroy(); + myArray->create(); + break; + case CANVAS: case CONTROLFLOW: { - SUPERVGUI_Node* aNode = new SUPERVGUI_ComputeNode(graph->viewport(), this, theNode); - aNode->hideAll(); - graph->ResizeGraph(aNode, theNode->X(), theNode->Y()); - graph->addChild(aNode, theNode->X(), theNode->Y()); - aNode->sync(); + SUPERVGUI_CanvasNode* aNode = new SUPERVGUI_CanvasComputeNode(myCanvas, this, theNode); + aNode->move(theNode->X(), theNode->Y()); + if (myCurrentView == CONTROLFLOW) aNode->hideAll(); + aNode->show(); + myCanvas->update(); } break; - case TABLE: - array->destroy(); - array->create(); - break; } } @@ -627,27 +663,20 @@ void SUPERVGUI_Main::addComputeNode(SUPERV_CNode theNode) { */ void SUPERVGUI_Main::addGOTONode(SUPERV_CNode theNode) { switch (myCurrentView) { - case GRAPH: - { - SUPERVGUI_Node* aNode = new SUPERVGUI_GotoNode(graph->viewport(), this, theNode); - graph->ResizeGraph(aNode, theNode->X(), theNode->Y()); - graph->addChild(aNode, theNode->X(), theNode->Y()); - aNode->sync(); - } + case CANVASTABLE: + myArray->destroy(); + myArray->create(); break; + case CANVAS: case CONTROLFLOW: { - SUPERVGUI_Node* aNode = new SUPERVGUI_GotoNode(graph->viewport(), this, theNode); - aNode->hideAll(); - graph->ResizeGraph(aNode, theNode->X(), theNode->Y()); - graph->addChild(aNode, theNode->X(), theNode->Y()); - aNode->sync(); + SUPERVGUI_CanvasNode* aNode = new SUPERVGUI_CanvasGotoNode(myCanvas, this, theNode); + aNode->move(theNode->X(), theNode->Y()); + if (myCurrentView == CONTROLFLOW) aNode->hideAll(); + aNode->show(); + myCanvas->update(); } break; - case TABLE: - array->destroy(); - array->create(); - break; } } @@ -656,95 +685,100 @@ void SUPERVGUI_Main::addGOTONode(SUPERV_CNode theNode) { */ void SUPERVGUI_Main::addControlNode(SUPERV_CNode theStartNode, SUPERV_CNode theEndNode, bool Update) { switch (myCurrentView) { - case GRAPH: + case CANVASTABLE: + myArray->destroy(); + myArray->create(); + break; + case CANVAS: + case CONTROLFLOW: { - SUPERVGUI_StartControlNode* aStartPrs = - new SUPERVGUI_StartControlNode(graph->viewport(), this, theStartNode); - SUPERVGUI_EndControlNode* aEndPrs = - new SUPERVGUI_EndControlNode(graph->viewport(), this, theEndNode, aStartPrs); - - graph->ResizeGraph(aStartPrs, theStartNode->X(), theStartNode->Y()); - graph->addChild(aStartPrs, theStartNode->X(), theStartNode->Y()); - graph->ResizeGraph(aEndPrs, theEndNode->X(), theEndNode->Y()); - graph->addChild(aEndPrs, theEndNode->X(), theEndNode->Y()); - if (Update) { - aStartPrs->updateLinksPrs(); - aEndPrs->updateLinksPrs(); - } - aStartPrs->sync(); - aEndPrs->sync(); - graph->repaintContents(); + SUPERVGUI_CanvasStartNode* aStartNode = new SUPERVGUI_CanvasStartNode(myCanvas, this, theStartNode); + aStartNode->move(theStartNode->X(), theStartNode->Y()); + if (myCurrentView == CONTROLFLOW) aStartNode->hideAll(); + + SUPERVGUI_CanvasEndNode* aEndNode = new SUPERVGUI_CanvasEndNode(myCanvas, this, theEndNode, aStartNode); + aEndNode->move(theEndNode->X(), theEndNode->Y()); + if (myCurrentView == CONTROLFLOW) aEndNode->hideAll(); + + aStartNode->show(); + aEndNode->show(); + myCanvas->update(); } break; + } +} + + +/** + * Add Macro node + */ +void SUPERVGUI_Main::addMacroNode(SUPERV_CNode theNode) { + switch (myCurrentView) { + case CANVASTABLE: + myArray->destroy(); + myArray->create(); + break; + case CANVAS: case CONTROLFLOW: { - SUPERVGUI_StartControlNode* aStartPrs = - new SUPERVGUI_StartControlNode(graph->viewport(), this, theStartNode); - SUPERVGUI_EndControlNode* aEndPrs = - new SUPERVGUI_EndControlNode(graph->viewport(), this, theEndNode, aStartPrs); - - aStartPrs->hideAll(); - aEndPrs->hideAll(); - - graph->ResizeGraph(aStartPrs, theStartNode->X(), theStartNode->Y()); - graph->addChild(aStartPrs, theStartNode->X(), theStartNode->Y()); - graph->ResizeGraph(aEndPrs, theEndNode->X(), theEndNode->Y()); - graph->addChild(aEndPrs, theEndNode->X(), theEndNode->Y()); - if (Update) { - aStartPrs->updateLinksPrs(); - aEndPrs->updateLinksPrs(); - } - aStartPrs->sync(); - aEndPrs->sync(); - graph->repaintContents(); + SUPERVGUI_CanvasNode* aNode = new SUPERVGUI_CanvasMacroNode(myCanvas, this, theNode); + aNode->move(theNode->X(), theNode->Y()); + if (myCurrentView == CONTROLFLOW) aNode->hideAll(); + aNode->show(); + myCanvas->update(); } break; - case TABLE: - array->destroy(); - array->create(); - break; } } +SUPERVGUI_CanvasArray* SUPERVGUI_Main::getCanvasArray() { + Trace("SUPERVGUI_Main::getCanvasArray"); + return(myArray); +} +SUPERVGUI_ArrayView* SUPERVGUI_Main::getArrayView() { + Trace("SUPERVGUI_Main::getArrayView"); + return(myArrayView); +} -SUPERVGUI_Graph* SUPERVGUI_Main::getGraph() { - Trace("SUPERVGUI_Main::getGraph") - return(graph); +SUPERVGUI_Canvas* SUPERVGUI_Main::getCanvas() { + Trace("SUPERVGUI_Main::getCanvas"); + return(myCanvas); } -SUPERVGUI_Array* SUPERVGUI_Main::getArray() { - Trace("SUPERVGUI_Main::getArray") - return(array); +SUPERVGUI_CanvasView* SUPERVGUI_Main::getCanvasView() { + Trace("SUPERVGUI_Main::getCanvasView"); + return(myCanvasView); } SUPERV_Graph SUPERVGUI_Main::getDataflow() { - Trace("SUPERVGUI_Main::getDataflow") - return(dataflow); + Trace("SUPERVGUI_Main::getDataflow"); + return(dataflow); } QAD_Message* SUPERVGUI_Main::getMessage() { - Trace("SUPERVGUI_Main::getMessage") - return(message); + Trace("SUPERVGUI_Main::getMessage"); + return(message); } QAD_Study* SUPERVGUI_Main::getStudy() { - Trace("SUPERVGUI_Main::getStudy") - return(study); + Trace("SUPERVGUI_Main::getStudy"); + return(study); } bool SUPERVGUI_Main::isArrayShown() { - Trace("SUPERVGUI_Main::isArrayShown") - return(myCurrentView == TABLE); + Trace("SUPERVGUI_Main::isArrayShown"); + return(myCurrentView == CANVASTABLE); } void SUPERVGUI_Main::showPopup(QPopupMenu* p, QMouseEvent* e) { Trace("SUPERVGUI_Main::showPopup"); // To check is Supervision active? if (myIsLocked) return; + //if (dataflow->IsExecuting()) return; - // if (QAD_Application::getDesktop()->getActiveComponent().compare(STUDY_SUPERVISION) !=0) return; - if (QAD_Application::getDesktop()->getActiveComponent().compare( QAD_Application::getDesktop()->getComponentUserName( "SUPERV" ) ) !=0) return; + //if (QAD_Application::getDesktop()->getActiveComponent().compare(STUDY_SUPERVISION) !=0) return; + if (QAD_Application::getDesktop()->getActiveComponent().compare(QAD_Application::getDesktop()->getComponentUserName( "SUPERV" ) ) !=0) return; checkIsInStudy(); if (e->button() == RightButton) { @@ -759,10 +793,6 @@ void SUPERVGUI_Main::changeInformation() { if (aDlg->exec() ) sync(); delete aDlg; - /* Trace("SUPERVGUI_Main::changeInformation") - if (Supervision.information(SUPERV::CNode::_narrow(dataflow), dataflow->IsReadOnly())) { - sync(); - }*/ } // returns false, if can't add dataflow into the study @@ -770,14 +800,19 @@ bool SUPERVGUI_Main::addStudy() { Trace("SUPERVGUI_Main::addStudy"); if (myIsFromStudy) return false; if ((SUPERV_isNull(dataflow))) return false; - + SALOMEDS::Study_var aStudy = study->getStudyDocument(); + bool aLocked = aStudy->GetProperties()->IsLocked(); + // asv : 23.11.04 : if the study is locked -- then we can't put anything in it. + // fix for PAL6852. + if ( aLocked ) + return false; + SALOMEDS::StudyBuilder_var aBuilder = aStudy->NewBuilder(); SALOMEDS::GenericAttribute_var anAttr; SALOMEDS::AttributeName_var aName; SALOMEDS::AttributeIOR_var anIORAttr; SALOMEDS::AttributePixMap_var aPixmap; - bool aLocked = aStudy->GetProperties()->IsLocked(); QAD_Operation* op = new SALOMEGUI_ImportOperation( study ); // searching dataflow @@ -787,18 +822,17 @@ bool SUPERVGUI_Main::addStudy() { if (aComponent->_is_nil()) { // is supervision component not found, then create it QAD_Operation* anOperation = new SALOMEGUI_ImportOperation( study ); anOperation->start(); - if (aLocked) aStudy->GetProperties()->SetLocked(false); + //if (aLocked) aStudy->GetProperties()->SetLocked(false); aComponent = aBuilder->NewComponent(STUDY_SUPERVISION); anAttr = aBuilder->FindOrCreateAttribute(aComponent, "AttributeName"); aName = SALOMEDS::AttributeName::_narrow(anAttr); - //aName->SetValue("Supervision"); - aName->SetValue( QAD_Application::getDesktop()->getComponentUserName( "SUPERV" ) ); - + //aName->SetValue(STUDY_SUPERVISION); + aName->SetValue(QAD_Application::getDesktop()->getComponentUserName( "SUPERV" ) ); anAttr = aBuilder->FindOrCreateAttribute(aComponent, "AttributePixMap"); aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); aPixmap->SetPixMap( "ICON_OBJBROWSER_Supervision" ); - aBuilder->DefineComponentInstance(aComponent, *Supervision.getEngine()); - if (aLocked) aStudy->GetProperties()->SetLocked(true); + aBuilder->DefineComponentInstance(aComponent, Supervision.getEngine()); + //if (aLocked) aStudy->GetProperties()->SetLocked(true); anOperation->finish(); } op->start(); @@ -810,7 +844,7 @@ bool SUPERVGUI_Main::addStudy() { anIORAttr = SALOMEDS::AttributeIOR::_narrow(anAttr); anIORAttr->SetValue(dataflow->getIOR()); op->finish(); - if (aLocked) return false; + //if (aLocked) return false; } sync(); @@ -822,7 +856,7 @@ bool SUPERVGUI_Main::addStudy() { void SUPERVGUI_Main::chooseData(QListViewItem* item) { - Trace("SUPERVGUI_Main::chooseData") + Trace("SUPERVGUI_Main::chooseData"); if (choosing) { QString id = ((QAD_ObjectBrowserItem*)item)->getEntry(); if (!id.isEmpty()) { @@ -833,7 +867,11 @@ void SUPERVGUI_Main::chooseData(QListViewItem* item) { if (object->FindAttribute(anAttr, "AttributeIOR")) { anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); ior = anIOR->Value(); - portIn->setValue(ior); + + // asv : 13.12.04 : commented out use of portIn field, but it seems that it + // should be replaced with some analogious code... selection of IOR was done - + // put its value into port. + //portIn->setValue(ior); // stop selection choosing = false; @@ -845,19 +883,10 @@ void SUPERVGUI_Main::chooseData(QListViewItem* item) { } } -void SUPERVGUI_Main::setData(SUPERVGUI_PortIn* p) { - Trace("SUPERVGUI_Main::setData") - portIn = p; - choosing = true; - setCursor(forbiddenCursor); - objectBrowser->setCursor(pointingHandCursor); - Supervision.putInfo(tr("MSG_CHOOSE_DATA")); -} - SALOMEDS::SObject_var SearchOrCreateSOWithName(const SALOMEDS::Study_var theStudy, const SALOMEDS::SObject_var theSO, const char* theName, - QAD_Operation* theOperation, + //QAD_Operation* theOperation, bool* theStarted) { SALOMEDS::SObject_var aResult; SALOMEDS::AttributeName_var aName; @@ -876,11 +905,12 @@ SALOMEDS::SObject_var SearchOrCreateSOWithName(const SALOMEDS::Study_var theStud } if (!aResult->_is_nil()) return aResult; // add new SObject + SALOMEDS::StudyBuilder_var aBuilder = theStudy->NewBuilder(); if (!*theStarted) { *theStarted = true; - theOperation->start(); + //theOperation->start(); + aBuilder->NewCommand(); } - SALOMEDS::StudyBuilder_var aBuilder = theStudy->NewBuilder(); aResult = aBuilder->NewObject(theSO); anAttr = aBuilder->FindOrCreateAttribute(aResult, "AttributeName"); aName = SALOMEDS::AttributeName::_narrow(anAttr); @@ -891,41 +921,51 @@ SALOMEDS::SObject_var SearchOrCreateSOWithName(const SALOMEDS::Study_var theStud bool SUPERVGUI_Main::putDataStudy(SUPERV_Port p, const char* inout) { Trace("SUPERVGUI_Main::putDataStudy"); + // static variable to ensure that only one instance (thread) is executing this function static bool isIn = false; - if (isIn) return true; else isIn = true; + if (isIn) + return true; + else + isIn = true; SALOMEDS::Study_var aStudy = study->getStudyDocument(); + bool aLocked = aStudy->GetProperties()->IsLocked(); + // asv : 23.11.04 : if the study is locked -- then we can't put anything in it. + // fix for PAL6852. + if ( aLocked ) { + isIn = false; + return false; + } + SALOMEDS::StudyBuilder_var aBuilder = aStudy->NewBuilder(); SALOMEDS::GenericAttribute_var anAttr; SALOMEDS::AttributeName_var aName; SALOMEDS::AttributeIOR_var anIORAttr; SALOMEDS::AttributePixMap_var aPixmap; bool aTransaction = false; - bool aLocked = aStudy->GetProperties()->IsLocked(); - QAD_Operation* op = new SALOMEGUI_ImportOperation( study ); // searching dataflow SALOMEDS::SObject_var aSO = aStudy->FindObjectIOR(dataflow->getIOR()); if (aSO->_is_nil()) { // create new dataflow SObject SALOMEDS::SComponent_ptr aComponent = aStudy->FindComponent(STUDY_SUPERVISION); if (aComponent->_is_nil()) { // is supervision component not found, then create it - QAD_Operation* anOperation = new SALOMEGUI_ImportOperation( study ); - anOperation->start(); - if (aLocked) aStudy->GetProperties()->SetLocked(false); + aBuilder->NewCommand(); + //if (aLocked) aStudy->GetProperties()->SetLocked(false); aComponent = aBuilder->NewComponent(STUDY_SUPERVISION); anAttr = aBuilder->FindOrCreateAttribute(aComponent, "AttributeName"); aName = SALOMEDS::AttributeName::_narrow(anAttr); - aName->SetValue( QAD_Application::getDesktop()->getComponentUserName( "SUPERV" ) ); + //aName->SetValue(STUDY_SUPERVISION); + aName->SetValue(QAD_Application::getDesktop()->getComponentUserName( "SUPERV" ) ); anAttr = aBuilder->FindOrCreateAttribute(aComponent, "AttributePixMap"); aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); aPixmap->SetPixMap( "ICON_OBJBROWSER_Supervision" ); - aBuilder->DefineComponentInstance(aComponent, *Supervision.getEngine()); - if (aLocked) aStudy->GetProperties()->SetLocked(true); - anOperation->finish(); + aBuilder->DefineComponentInstance(aComponent, Supervision.getEngine()); + //if (aLocked) aStudy->GetProperties()->SetLocked(true); + aBuilder->CommitCommand(); } aTransaction = true; - op->start(); + aBuilder->NewCommand(); aSO = aBuilder->NewObject(aComponent); anAttr = aBuilder->FindOrCreateAttribute(aSO, "AttributeName"); aName = SALOMEDS::AttributeName::_narrow(anAttr); @@ -934,17 +974,14 @@ bool SUPERVGUI_Main::putDataStudy(SUPERV_Port p, const char* inout) { anIORAttr = SALOMEDS::AttributeIOR::_narrow(anAttr); anIORAttr->SetValue(dataflow->getIOR()); } + aSO = SearchOrCreateSOWithName(aStudy, aSO, // get run time SO - QString("Run ") + myRunTime.toString() , op, &aTransaction); - aSO = SearchOrCreateSOWithName(aStudy, aSO, p->Node()->Name(), op, &aTransaction); // get node SO - aSO = SearchOrCreateSOWithName(aStudy, aSO, inout, op, &aTransaction); // get in/out SO - aSO = SearchOrCreateSOWithName(aStudy, aSO, p->Name(), op, &aTransaction); // get port SO + QString("Run ") + myRunTime.toString(), &aTransaction); + aSO = SearchOrCreateSOWithName(aStudy, aSO, p->Node()->Name(), &aTransaction); // get node SO + aSO = SearchOrCreateSOWithName(aStudy, aSO, inout, &aTransaction); // get in/out SO + aSO = SearchOrCreateSOWithName(aStudy, aSO, p->Name(), &aTransaction); // get port SO - if (aLocked) { - if (aTransaction) op->finish(); - isIn = false; - return false; - } + if (aTransaction) aBuilder->CommitCommand(); anAttr = aBuilder->FindOrCreateAttribute(aSO, "AttributeIOR"); anIORAttr = SALOMEDS::AttributeIOR::_narrow(anAttr); @@ -972,12 +1009,12 @@ bool SUPERVGUI_Main::putDataStudy(SUPERV_Port p, const char* inout) { if (!aTransaction) { aTmpSO = aSO; aTransaction = true; - op->start(); + aBuilder->NewCommand(); } - aTmpSO = aDriver->PublishInStudy(aStudy, aTmpSO, anObject, ""); + aTmpSO = aDriver->PublishInStudy(aStudy, aTmpSO, anObject, /*anObject->Name()*/""); aBuilder->Addreference(aSO, aTmpSO); } else { // can't publish object: abort transaction - if (aTransaction) op->abort(); + if (aTransaction) aBuilder->AbortCommand(); isIn = false; return false; } @@ -989,13 +1026,15 @@ bool SUPERVGUI_Main::putDataStudy(SUPERV_Port p, const char* inout) { } else { if (!aTransaction) { aTransaction = true; - op->start(); + aBuilder->NewCommand(); } anIORAttr->SetValue(p->ToString()); // ior attribute already set for the prevoius condition } - if (aTransaction) op->finish(); - study->updateObjBrowser(); + if (aTransaction) + aBuilder->CommitCommand(); + if (!myThread->running()) + study->updateObjBrowser(); isIn = false; return true; } @@ -1003,28 +1042,27 @@ bool SUPERVGUI_Main::putDataStudy(SUPERV_Port p, const char* inout) { void SUPERVGUI_Main::ActivatePanning() { - if (graph->isVisible()) { - graph->ActivatePanning(); - } else if (array->isVisible()) { - array->ActivatePanning(); + if (myCanvasView->isVisible()) { + myCanvasView->ActivatePanning(); + } else if (myArrayView->isVisible()) { + myArrayView->ActivatePanning(); } } void SUPERVGUI_Main::ResetView() { - if (graph->isVisible()) { - graph->ResetView(); - } else if (array->isVisible()) { - array->ResetView(); + if (myCanvasView->isVisible()) { + myCanvasView->ResetView(); + } else if (myArrayView->isVisible()) { + myArrayView->ResetView(); } } void SUPERVGUI_Main::setAsFromStudy(bool theToStudy) { myIsFromStudy = theToStudy; - graph->setAsFromStudy(theToStudy); - array->setAsFromStudy(theToStudy); + myCanvas->setAsFromStudy(theToStudy); } void SUPERVGUI_Main::checkIsInStudy() { @@ -1076,10 +1114,10 @@ bool SUPERVGUI_Main::isFiltered(char* graph, char* node, char* type, char* me Trace("SUPERVGUI_Main::isFiltered"); bool b = false; if (strcmp(getDataflow()->Name(), graph) == 0) { - SUPERVGUI_Node* n; - QObjectList* nodes = queryList("SUPERVGUI_Node"); + SUPERVGUI_CanvasNode* n; + QObjectList* nodes = queryList("SUPERVGUI_CanvasNode"); QObjectListIt i(*nodes); - while ((n=(SUPERVGUI_Node*)i.current()) != 0) { + while ((n=(SUPERVGUI_CanvasNode*)i.current()) != 0) { ++i; if (strcmp(n->name(), node) == 0) { if (strcmp(type, NOTIF_WARNING) == 0) { @@ -1103,12 +1141,402 @@ bool SUPERVGUI_Main::isFiltered(char* graph, char* node, char* type, char* me return( b ); } +void SUPERVGUI_Main::closeEvent(QCloseEvent* e) { + e->accept(); +} void SUPERVGUI_Main::setPaletteBackgroundColor(const QColor& color) { - array->setPaletteBackgroundColor(color); - graph->setPaletteBackgroundColor(color); + + myCanvas->setBackgroundColor(color); + myCanvasView->setPaletteBackgroundColor(color.light()); + myArray->setBackgroundColor(color); + myArrayView->setPaletteBackgroundColor(color.light()); SUPERVGraph_View::setPaletteBackgroundColor(color); } +QPtrList< char * > SUPERVGUI_Main::getEventNodes() { + return myEventNodes; +} + +void SUPERVGUI_Main::setEventNodes(QPtrList< char * > theEventNodes) { + myEventNodes = theEventNodes; +} + +QPtrList< SUPERV::GraphState > SUPERVGUI_Main::getStates() { + return myStates; +} + +void SUPERVGUI_Main::setStates(QPtrList< SUPERV::GraphState > theStates) { + myStates = theStates; +} + +int SUPERVGUI_Main::getNodesNumber() { + //create a list of nodes of the graph + SUPERV_Nodes nodes = getDataflow()->Nodes(); + int RetVal = nodes->CNodes.length() + nodes->FNodes.length() + + nodes->INodes.length() + nodes->GNodes.length() + + nodes->LNodes.length() + nodes->SNodes.length(); + return RetVal; +} + +SUPERVGUI_Thread* SUPERVGUI_Main::getMyThread() { + return myThread; +} + +void SUPERVGUI_Main::startTimer() { + myTimer->start(500); +} + +void SUPERVGUI_Main::executionFinished() { + getStudy()->updateObjBrowser(); + myCanvas->update(); + myArray->update(); +} + +void SUPERVGUI_Main::checkExecution() { + if (myThread->finished()) { + myTimer->stop(); + executionFinished(); + } +} + +/** + * Editing() is to be called by any operation in GUI before modification of a datamodel + * (add/remove ports or nodes, etc.). It is used to resolve inconsistancies between 2 data models + * in Engine: Editor and Executor. During and after execution, the values of ports and statuses of nodes + * are taken from Executor data model. But when user starts editing the graph - these changes must + * be applied to Editor data model. This function destroys Executor data model and moves to Editor. + */ +void SUPERVGUI_Main::Editing() { + if ( !SUPERV_isNull( dataflow ) ) + dataflow->Editing(); + + // updata GUI, Nodes' statuses and Ports' values could change. + sync(); +} + +void SUPERVGUI_Main::removeArrayChild(SUPERV::CNode_ptr theNode) +{ + // mkr: since the deletion of the node allow only in CANVAS view, + // it is necessary to remove the CanvasArray's children, which + // have the same CNode engine as deleting node. This CNode is given + // as argument + if (myArray) { + const QObjectList* aChList = myArray->children(); + if ( aChList ) { // asv 27.01.05 : fix for 7817 + QObjectListIt aItChList(*aChList); + SUPERVGUI_CanvasNode* anObjNode; + while ((anObjNode = (SUPERVGUI_CanvasNode*)aItChList.current()) != 0) { + ++aItChList; + if ((QString(anObjNode->getEngine()->Name())).compare(QString(theNode->Name())) == 0) { + myArray->removeChild(anObjNode); + delete anObjNode; + } + } + } // end of if ( ChList ) + } +} + +/******************************* SUPERVGUI_Thread class ****************************************/ +SUPERVGUI_Thread::SUPERVGUI_Thread() + :QThread() +{ + myIsActive = false; +} + +SUPERVGUI_Thread::~SUPERVGUI_Thread() +{ + //it is a virtual destructor and needs to be determine here +} + +void SUPERVGUI_Thread::startThread(const char* m) +{ + if (!myIsActive) { + myIsActive = true; + //QThread::start(); + this->start(); + myMain->getMessage()->setMessage(m); + myMain->sync(); + } +} + +void SUPERVGUI_Thread::stopThread(const char* m) +{ + myMain->getMessage()->setMessage(m); +} + +void SUPERVGUI_Thread::setMain(SUPERVGUI_Main* theMain) +{ + myMain = theMain; +} + +void SUPERVGUI_Thread::KillThread(bool theValue) +{ + myMutex.lock(); + myIsActive = !(theValue); + myMutex.unlock(); +} + +typedef TVoidMemFun2ArgEvent TNodeSyncEvent; + +void SUPERVGUI_Thread::run() +{ + SUPERV_CNode aNode = NULL; + SUPERV::GraphEvent aEvent = SUPERV::UndefinedEvent ; + SUPERV::GraphState aState = SUPERV::UndefinedState ; + + SUPERV_CNode aPrevNode = NULL; + SUPERV::GraphEvent aPrevEvent = SUPERV::UndefinedEvent ; + SUPERV::GraphState aPrevState = SUPERV::UndefinedState ; + + char * aName; + char * aPrevName; + + QPtrList< char * > anEventNodes; + QPtrList< SUPERV::GraphState > aStates; + + myMain->startTimer(); + + myMain->myGUIEventLoopFinished = false; + + while(myIsActive) { + myMain->getDataflow()->Event(aNode, aEvent, aState); + + if (aEvent == SUPERV::UndefinedEvent && aState == SUPERV::UndefinedState + || + aEvent == SUPERV::NoEvent && aState == SUPERV::NoState + || + aEvent == SUPERV::KillEvent && aState == SUPERV::KillState) { + + if (myMain->getEventNodes().count()) { + myMain->removeEventNodes(); + } + if (myMain->getStates().count()) { + myMain->removeStates(); + } + myIsActive = false; + } + else { + if ( aNode != NULL && !CORBA::is_nil( aNode ) ) { + aName = aNode->Name(); + } + + if ( aPrevNode == NULL || CORBA::is_nil( aPrevNode ) ) { //first initialize aPrev... variables + anEventNodes = myMain->getEventNodes(); + anEventNodes.append( &aName ) ; + myMain->setEventNodes(anEventNodes); + + aStates = myMain->getStates(); + aStates.append( &aState ) ; + myMain->setStates(aStates); + } + else { + if ( aEvent == aPrevEvent && aState == aPrevState) { + QString aNameStr = aName; + QString aPrevNameStr = aPrevName; + if ( aNameStr != aPrevNameStr ) { + anEventNodes = myMain->getEventNodes(); + anEventNodes.append( &aName ) ; + myMain->setEventNodes(anEventNodes); + + aStates = myMain->getStates(); + aStates.append( &aState ) ; + myMain->setStates(aStates); + } + } + else { + anEventNodes = myMain->getEventNodes(); + anEventNodes.append( &aName ) ; + myMain->setEventNodes(anEventNodes); + + aStates = myMain->getStates(); + aStates.append( &aState ) ; + myMain->setStates(aStates); + } + } + } + if (!myIsActive) { + switch (myMain->getDataflow()->State()) { + case SUPERV_Editing : + stopThread(myMain->getDataflow()->IsReadOnly()? tr("MSG_GRAPH_READONLY"): tr("MSG_GRAPH_EDITING")); + break; + + case SUPERV_Suspend : + stopThread(tr("MSG_GRAPH_SUSPENDED")); + break; + + case SUPERV_Done : + stopThread(tr("MSG_GRAPH_FINISHED")); + break; + + case SUPERV_Error : + stopThread(tr("MSG_GRAPH_ABORTED")); + break; + + case SUPERV_Kill: + stopThread(tr("MSG_GRAPH_KILLED")); + break; + } + + break; + } + if ( myMain->getEventNodes().count() ) { + //if list not empty call execute() -> sync() + char * aNodeName = *(myMain->getEventNodes().getFirst()); + SUPERV::GraphState aNodeState = *(myMain->getStates().getFirst()); + + // It is PROHIBITED to deal with widgets in a secondary thread, so event posting is used here + ProcessVoidEvent( new TNodeSyncEvent( myMain, &SUPERVGUI_Main::execute, aNodeName, aNodeState ) ); + + myMain->removeFirstEN(); + myMain->removeFirstS(); + } + + aPrevNode = aNode; + aPrevEvent = aEvent; + aPrevState = aState; + + if ( aPrevNode == NULL || CORBA::is_nil( aPrevNode ) ) + aPrevName = ""; + else + aPrevName = aPrevNode->Name(); + + //usleep(10); + //msleep(5); + } + // VSR: 04/12/03 ---> update object browser ufter finishing +// qApp->lock(); +// myMain->getStudy()->updateObjBrowser(); +// qApp->unlock(); + // VSR: 04/12/03 <--- + + myMain->myGUIEventLoopFinished = true; + + QThread::exit(); +} + +/******************************* SUPERVGUI_DSGraphParameters class ****************************************/ +/*! + Constructor +*/ +SUPERVGUI_DSGraphParameters::SUPERVGUI_DSGraphParameters(SUPERV_Graph theGraph, bool isReadOnly) + : QDialog( QAD_Application::getDesktop(), "", true, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ) +{ + Trace("SUPERVGUI_DSGraphParameters::SUPERVGUI_DSGraphParameters"); + setCaption( tr( "TLT_DSGRAPHPARAMS" ) ); + setSizeGripEnabled( true ); + myGraph = theGraph; + + QGridLayout* TopLayout = new QGridLayout( this ); + TopLayout->setSpacing( 6 ); + TopLayout->setMargin( 11 ); + + QGroupBox* TopGroup = new QGroupBox( this, "TopGroup" ); + TopGroup->setColumnLayout(0, Qt::Vertical ); + TopGroup->layout()->setSpacing( 0 ); + TopGroup->layout()->setMargin( 0 ); + QGridLayout* TopGroupLayout = new QGridLayout( TopGroup->layout() ); + TopGroupLayout->setAlignment( Qt::AlignTop ); + TopGroupLayout->setSpacing( 6 ); + TopGroupLayout->setMargin( 11 ); + + // DeltaTime + QLabel* DeltaTimeL = new QLabel( tr( "DELTATIME_LBL" ), TopGroup ); + TopGroupLayout->addWidget( DeltaTimeL, 0, 0 ); + + myDeltaTime = new QAD_SpinBoxDbl( TopGroup, 0.0, 1.0, 0.1); + myDeltaTime->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + TopGroupLayout->addWidget( myDeltaTime, 0, 1 ); + + // TimeOut + QLabel* TimeOutL = new QLabel( tr( "TIMEOUT_LBL" ), TopGroup); + TopGroupLayout->addWidget( TimeOutL, 1, 0 ); + + myTimeOut = new QLineEdit( TopGroup ); + myTimeOut->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + myTimeOut->setValidator( new QIntValidator(this) ); + myTimeOut->setMinimumSize( 100, 0 ); + myTimeOut->setReadOnly( isReadOnly ); + TopGroupLayout->addWidget( myTimeOut, 1, 1 ); + + // DataStreamTrace + QLabel* DataStreamTraceL = new QLabel( tr( "DATASTREAMTRACE_LBL" ), TopGroup); + TopGroupLayout->addWidget( DataStreamTraceL, 2, 0 ); + + myDataStreamTrace = new QComboBox( TopGroup ); + myDataStreamTrace->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + myDataStreamTrace->insertItem("WithoutTrace"); + myDataStreamTrace->insertItem("SummaryTrace"); + myDataStreamTrace->insertItem("DetailedTrace"); + TopGroupLayout->addWidget( myDataStreamTrace, 2, 1 ); + + QGroupBox* GroupButtons = new QGroupBox( this, "GroupButtons" ); + GroupButtons->setColumnLayout(0, Qt::Vertical ); + GroupButtons->layout()->setSpacing( 0 ); + GroupButtons->layout()->setMargin( 0 ); + QGridLayout* GroupButtonsLayout = new QGridLayout( GroupButtons->layout() ); + GroupButtonsLayout->setAlignment( Qt::AlignTop ); + GroupButtonsLayout->setSpacing( 6 ); + GroupButtonsLayout->setMargin( 11 ); + + QPushButton* okB = new QPushButton( tr( "BUT_OK" ), GroupButtons ); + QPushButton* cancelB = new QPushButton( tr( "BUT_CANCEL" ), GroupButtons ); + + GroupButtonsLayout->addWidget( okB, 0, 0 ); + GroupButtonsLayout->addItem ( new QSpacerItem( 5, 5, QSizePolicy::Expanding, QSizePolicy::Minimum ), 0, 1 ); + GroupButtonsLayout->addWidget( cancelB, 0, 2 ); + + TopLayout->addWidget( TopGroup, 0, 0 ); + TopLayout->addWidget( GroupButtons, 1, 0 ); + + connect( okB, SIGNAL( clicked() ), this, SLOT( accept() ) ); + connect( cancelB, SIGNAL( clicked() ), this, SLOT( reject() ) ); + + setData(); +} + +/*! + Destructor +*/ +SUPERVGUI_DSGraphParameters::~SUPERVGUI_DSGraphParameters() { + Trace("SUPERVGUI_DSGraphParameters::~SUPERVGUI_DSGraphParameters"); +} + +/*! + Sets data function +*/ +void SUPERVGUI_DSGraphParameters::setData() { + double aDeltaTime; + long aTimeOut; + SUPERV::KindOfDataStreamTrace aDataStreamTrace; + +// myGraph->StreamParams(aTimeOut, aDataStreamTrace, aDeltaTime); + if (myGraph->IsStreamGraph()) { + SUPERV_StreamGraph aSGraph = myGraph->ToStreamGraph(); + if (!SUPERV_isNull(aSGraph)) + aSGraph->StreamParams(aTimeOut, aDataStreamTrace, aDeltaTime); + } + + myDeltaTime->setValue(aDeltaTime); + myTimeOut->setText(QString("%1").arg(aTimeOut)); + myDataStreamTrace->setCurrentItem((int)aDataStreamTrace); +} + +/*! + button slot +*/ +void SUPERVGUI_DSGraphParameters::accept() { +// myGraph->SetStreamParams( myTimeOut->text().toLong(), +// (SUPERV::KindOfDataStreamTrace) myDataStreamTrace->currentItem(), +// myDeltaTime->value()); + if (myGraph->IsStreamGraph()) { + SUPERV_StreamGraph aSGraph = myGraph->ToStreamGraph(); + if (!SUPERV_isNull(aSGraph)) + aSGraph->SetStreamParams( myTimeOut->text().toLong(), + (SUPERV::KindOfDataStreamTrace) myDataStreamTrace->currentItem(), + myDeltaTime->value()); + } + QDialog::accept(); +}