+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();
+ }
+}
+
+void SUPERVGUI_Main::Editing() {
+ if ( !SUPERV_isNull( dataflow ) )
+ dataflow->Editing();
+}
+
+/******************************* 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<SUPERVGUI_Main, char*, SUPERV::GraphState> 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);
+}
+
+/*!
+ <OK> 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();
+}