]> SALOME platform Git repositories - modules/superv.git/blobdiff - src/SUPERVGUI/SUPERVGUI_Main.cxx
Salome HOME
Join modifications from BR_Dev_For_4_0 tag V4_1_1.
[modules/superv.git] / src / SUPERVGUI / SUPERVGUI_Main.cxx
index e9160aa1dea2daba56b67fc2eb1d6e807b045127..c0dd3ea434f4a7108a5fcac8b5992b326cd95bcd 100644 (file)
@@ -17,7 +17,7 @@
 //  License along with this library; if not, write to the Free Software 
 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
 // 
-//  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 //
 //
@@ -74,7 +74,7 @@ using namespace boost;
         SUPERV::Port_ptr aPort = aPortList[p].in(); \
         if ( !aPort->IsInput() && !aPort->IsGate() ) { \
           bool aInStudy = dynamic_cast<SUPERVGUI_CanvasPortOut*>( aMain->getCanvas()->getPort(aPort) )->isInStudy(); \
-          dynamic_cast<SUPERVGUI_CanvasPortOut*>( getCanvas()->getPort( getDataflow()->Node(aCNode->Name())->Port(aPort->Name()) ) )->setStudyState(aInStudy); \
+          dynamic_cast<SUPERVGUI_CanvasPortOut*>( getCanvas()->getPort( getDataflow()->Node(aCNode->Name())->GetOutPort(aPort->Name()) ) )->setStudyState(aInStudy); \
         } \
       } \
     }
@@ -163,13 +163,13 @@ void SUPERVGUI_Main::init(SUIT_Desktop* theDesktop) {
   SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( study->application() );
 
   objectBrowser = app->objectBrowser();
-    
+
   myArray = new SUPERVGUI_CanvasArray( this, resMgr() );
   myArrayView = new SUPERVGUI_ArrayView( myArray, this );
 
   myCanvas = new SUPERVGUI_Canvas( this, resMgr() );
   myCanvasView = new SUPERVGUI_CanvasView(myCanvas, this);
-  
+
   message = app->logWindow();
   notification = new NOTIFICATION_Consumer();
 
@@ -350,6 +350,11 @@ void SUPERVGUI_Main::sync() {
   //if ( aSupMod ) aSupMod->updateObjBrowser();
   //else MESSAGE("NULL Supervision module!");
 
+  // update "Save" icon and menu state, if dataflow is published
+  _PTR(Study) aStudy = ((SalomeApp_Study*)study)->studyDS();
+  _PTR(SObject)  aSO = aStudy->FindObjectIOR(dataflow->getIOR());
+  if (aSO) SUPERVGUI_Main::setModifiedFlag();  
+
   if (myCurrentView == CANVASTABLE) {
     myArray->sync();
     myArray->update();
@@ -597,7 +602,7 @@ void SUPERVGUI_Main::onShowToolbar()
 void SUPERVGUI_Main::onObjectCreatedDeleted()
 {
   if ( study ) {
-    if ( STD_Application* app = dynamic_cast<STD_Application*>( study->application() ) ) {
+    if ( LightApp_Application* app = dynamic_cast<LightApp_Application*>( study->application() ) ) {
       ViewManagerList aVMList;
       app->viewManagers( SUPERVGraph_Viewer::Type(), aVMList );
       SUIT_ViewManager* aVM;
@@ -608,16 +613,20 @@ void SUPERVGUI_Main::onObjectCreatedDeleted()
          QObjectList* aMainList = aVW->queryList("SUPERVGUI_Main");
          if ( aMainList->count() == 1 ) {
            SUPERVGUI_Main* aMain = dynamic_cast<SUPERVGUI_Main*>( aMainList->first() );
-           if ( aMain )
-             if ( !CORBA::is_nil( aMain->getDataflow() )
-                  &&
-                  !QString(aMain->getDataflow()->getIOR()).compare(getDataflow()->getIOR()) // equal dataflows
-                  && 
-                  aMain != this ) // not equal mains
+           if ( aMain ) {
+             if (aMain != this &&
+                  !CORBA::is_nil(aMain->getDataflow()) &&
+                  !QString(aMain->getDataflow()->getIOR()).compare(getDataflow()->getIOR())) // equal dataflows
                aMain->getCanvas()->merge();
+            }
          }
        }
       }
+
+      // update "Save" icon and menu state, if dataflow is published
+      //_PTR(Study) aStudy = ((SalomeApp_Study*)study)->studyDS();
+      //_PTR(SObject)  aSO = aStudy->FindObjectIOR(dataflow->getIOR());
+      //if (aSO) SUPERVGUI_Main::setModifiedFlag();  
     }
   }
 }
@@ -649,6 +658,7 @@ void SUPERVGUI_Main::onPutInStudy( QString* theNodePortName )
          }
        }
       }
+      //SUPERVGUI_Main::setModifiedFlag();
     }
   }
 }
@@ -727,9 +737,11 @@ void SUPERVGUI_Main::run( const bool andSuspend ) {
       myRunTime = QDateTime::currentDateTime();
       const bool result = andSuspend ? dataflow->Start() : dataflow->Run();
       if ( !result ) {
-       QMessageBox::warning(SUIT_Session::session()->activeApplication()->desktop(), tr("ERROR"), tr("MSG_DF_BADEXECUTE"));
+       // PAL12902
+       QMessageBox::warning(SUIT_Session::session()->activeApplication()->desktop(), tr("ERROR"), tr("MSG_DF_BADEXECUTE") + QString(" : ") + QString(dataflow->Messages()));
        if ( dataflow->State() == SUPERV::ErrorState ) {
-         kill();
+         // PAL12902
+         if ( !dataflow->IsEditing() ) kill();
        }
       } 
       else {
@@ -753,7 +765,9 @@ void SUPERVGUI_Main::kill() {
     QMessageBox::warning(SUIT_Session::session()->activeApplication()->desktop(), tr("ERROR"), tr("MSG_DF_NOTRUNNING"));
   } 
   else if (dataflow->Kill()) {
-    getMessage()->putMessage( tr("MSG_GRAPH_KILLED") );
+    // IPAL9273, 9369, 9731 : to avoid two equal messages about killing dataflow
+    //                        execution in the Message Console
+    //getMessage()->putMessage( tr("MSG_GRAPH_KILLED") );
     sync();
   } 
   else {
@@ -836,7 +850,7 @@ void SUPERVGUI_Main::addComputeNode(SUPERV_CNode theNode) {
   case CANVAS:
   case CONTROLFLOW: 
     {
-      SUPERVGUI_CanvasNode* aNode = new SUPERVGUI_CanvasComputeNode( resMgr(), myCanvas, this, theNode);
+      SUPERVGUI_CanvasNode* aNode = SUPERVGUI_CanvasComputeNode::Create(resMgr(), myCanvas, this, theNode);
       aNode->move(theNode->X(), theNode->Y());
       if (myCurrentView == CONTROLFLOW) aNode->hideAll();
       aNode->show();
@@ -858,7 +872,7 @@ void SUPERVGUI_Main::addGOTONode(SUPERV_CNode theNode) {
   case CANVAS:
   case CONTROLFLOW: 
     {
-      SUPERVGUI_CanvasNode* aNode = new SUPERVGUI_CanvasGotoNode( resMgr(), myCanvas, this, theNode);
+      SUPERVGUI_CanvasNode* aNode = SUPERVGUI_CanvasGotoNode::Create(resMgr(), myCanvas, this, theNode);
       aNode->move(theNode->X(), theNode->Y());
       if (myCurrentView == CONTROLFLOW) aNode->hideAll();
       aNode->show();
@@ -871,7 +885,8 @@ void SUPERVGUI_Main::addGOTONode(SUPERV_CNode theNode) {
 /**
  * Add Control node
  */
-void SUPERVGUI_Main::addControlNode(SUPERV_CNode theStartNode, SUPERV_CNode theEndNode, bool Update) {
+void SUPERVGUI_Main::addControlNode(SUPERV_CNode theStartNode, SUPERV_CNode theEndNode, bool Update)
+{
   switch (myCurrentView) {
   case CANVASTABLE:
     myArray->destroy();
@@ -880,11 +895,13 @@ void SUPERVGUI_Main::addControlNode(SUPERV_CNode theStartNode, SUPERV_CNode theE
   case CANVAS:
   case CONTROLFLOW: 
     {
-      SUPERVGUI_CanvasStartNode* aStartNode = new SUPERVGUI_CanvasStartNode( resMgr(), myCanvas, this, theStartNode);
+      SUPERVGUI_CanvasStartNode* aStartNode =
+        SUPERVGUI_CanvasStartNode::Create(resMgr(), myCanvas, this, theStartNode);
       aStartNode->move(theStartNode->X(), theStartNode->Y());
       if (myCurrentView == CONTROLFLOW) aStartNode->hideAll();
 
-      SUPERVGUI_CanvasEndNode* aEndNode = new SUPERVGUI_CanvasEndNode( resMgr(), myCanvas, this, theEndNode, aStartNode);
+      SUPERVGUI_CanvasEndNode* aEndNode =
+        SUPERVGUI_CanvasEndNode::Create(resMgr(), myCanvas, this, theEndNode, aStartNode);
       aEndNode->move(theEndNode->X(), theEndNode->Y());
       if (myCurrentView == CONTROLFLOW) aEndNode->hideAll();
 
@@ -909,7 +926,7 @@ void SUPERVGUI_Main::addMacroNode(SUPERV_CNode theNode) {
   case CANVAS:
   case CONTROLFLOW: 
     {
-      SUPERVGUI_CanvasNode* aNode = new SUPERVGUI_CanvasMacroNode( resMgr(), myCanvas, this, theNode);
+      SUPERVGUI_CanvasNode* aNode = SUPERVGUI_CanvasMacroNode::Create(resMgr(), myCanvas, this, theNode);
       aNode->move(theNode->X(), theNode->Y());
       if (myCurrentView == CONTROLFLOW) aNode->hideAll();
       aNode->show();
@@ -1118,6 +1135,8 @@ void SUPERVGUI_Main::addDataflowToStudy() {
 
     if ( !myThread->running() )
       aSupMod->updateObjBrowser();
+
+    aSupMod->getApp()->updateActions();  
   }
   else {
     MESSAGE( "ERROR: failed to find or create dataflow SObject" );
@@ -1270,7 +1289,9 @@ bool SUPERVGUI_Main::putDataStudy( SUPERV_Port p, const char* inout ) {
       aSupMod->updateObjBrowser();
   }
   else MESSAGE("NULL Supervision module!");
-  
+
+  SalomeApp_Application* app = (SalomeApp_Application*)(SUIT_Session::session()->activeApplication());
+  if(app) app->updateActions();  
   isIn = false;
   return true;
 }
@@ -1492,6 +1513,32 @@ void SUPERVGUI_Main::resizeView( QResizeEvent* theEvent )
       getCanvasArray()->resize( theEvent->size().width(), theEvent->size().height() );
 }
 
+/*!
+  Sets a modified flag in an active study
+ */
+void SUPERVGUI_Main::setModifiedFlag()
+{
+  SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>(SUIT_Session::session()->activeApplication());
+  if(app) {
+    SalomeApp_Study* study = dynamic_cast<SalomeApp_Study*>(app->activeStudy());
+    if(study) {
+      _PTR(Study) studyDS = study->studyDS();
+      _PTR(SComponent) sco = studyDS->FindComponent(STUDY_SUPERVISION);
+      if(sco) {
+       _PTR(StudyBuilder) builder = studyDS->NewBuilder();
+       _PTR(GenericAttribute) ga;
+       ga = builder->FindOrCreateAttribute(sco, "AttributeParameter");
+       _PTR(AttributeParameter) ap(ga);
+       if(ap) {
+         ap->SetBool("SUPERVISOR_MODIFIED_FLAG",1);
+         app->updateActions();
+       }
+      }
+    }
+  }
+}
+
+
 /******************************* SUPERVGUI_Thread class ****************************************/
 SUPERVGUI_Thread::SUPERVGUI_Thread()
      :QThread()
@@ -1561,6 +1608,7 @@ void SUPERVGUI_Thread::main_thread_run(SUPERV_CNode& aNode, SUPERV::GraphEvent&
 {
     // in case node "said" something during changing state through notification mechanism - output it
     myMain->syncNotification();
+    myMain->sync(); // mkr : NPAL14881
     
     // "kill" or undefined event came
     if (( aEvent == SUPERV::UndefinedEvent && aState == SUPERV::UndefinedState ) ||
@@ -1585,6 +1633,7 @@ void SUPERVGUI_Thread::main_thread_run(SUPERV_CNode& aNode, SUPERV::GraphEvent&
 
     // execution is finished.  just set a "finished" message(s)
     if ( !myIsActive ) {
+      QString aMess;
       switch ( myMain->getDataflow()->State() ) {
       case SUPERV_Editing :     
        myMain->getMessage()->putMessage( myMain->getDataflow()->IsReadOnly()? 
@@ -1598,6 +1647,14 @@ void SUPERVGUI_Thread::main_thread_run(SUPERV_CNode& aNode, SUPERV::GraphEvent&
        break;  
       case SUPERV_Error :
        myMain->getMessage()->putMessage( tr("MSG_GRAPH_ABORTED") );
+       // PAL12866 -->
+       aMess = QString(myMain->getDataflow()->Messages());
+       if ( !aMess.isEmpty() ) {
+        myMain->getMessage()->putMessage( tr("MSG_DF_BADEXECUTE") + QString(" : ") + aMess );
+        QMessageBox::warning(SUIT_Session::session()->activeApplication()->desktop(), tr("ERROR"), 
+                             tr("MSG_DF_BADEXECUTE") + QString(" : ") + aMess);
+       }
+       // PAL12866 <--
        break;  
       case SUPERV_Kill:
        myMain->getMessage()->putMessage( tr("MSG_GRAPH_KILLED") );
@@ -1721,8 +1778,8 @@ SUPERVGUI_DSGraphParameters::~SUPERVGUI_DSGraphParameters() {
   Sets data function
 */
 void SUPERVGUI_DSGraphParameters::setData() {
-  double aDeltaTime;
-  long aTimeOut;
+  CORBA::Double aDeltaTime;
+  CORBA::Long aTimeOut;
   SUPERV::KindOfDataStreamTrace aDataStreamTrace;
 
 //  myGraph->StreamParams(aTimeOut, aDataStreamTrace, aDeltaTime);
@@ -1753,3 +1810,4 @@ void SUPERVGUI_DSGraphParameters::accept() {
   }
   QDialog::accept();
 }
+