Salome HOME
Join modifications from branch OCC_development_for_3_2_0a2
[modules/superv.git] / src / SUPERVGUI / SUPERVGUI_Main.cxx
index 49c4b88b015ebfed807232726cb5355c68aadbac..e9160aa1dea2daba56b67fc2eb1d6e807b045127 100644 (file)
 #include <boost/shared_ptr.hpp>
 using namespace boost;
 
+// mkr : PAL8150
+#define SYNCPUTINSTUDY(NodesName)  \
+    for ( int n = 0; n < nodes->NodesName.length(); n++ ) { \
+      SUPERV_CNode aCNode = SUPERV::CNode::_narrow(nodes->NodesName[n]); \
+      SUPERV_Ports aPortList = aCNode->Ports(); \
+      for (int p = 0; p < aPortList->length(); p++) { \
+        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); \
+        } \
+      } \
+    }
+
 SUPERVGUI_Main::SUPERVGUI_Main( SUPERVGraph_ViewFrame* theParent, 
                                SUIT_Desktop* theDesktop, SUPERV_Graph theDataFlow )
      : SUPERVGraph_View(theParent),
@@ -88,6 +102,9 @@ SUPERVGUI_Main::SUPERVGUI_Main( SUPERVGraph_ViewFrame* theParent,
   } else {
     init(theDesktop);
   }
+
+  syncPutInStudy(); // mkr : PAL8150
+
   // mkr : IPAL11362
   connect(this, SIGNAL(EventToSync()), this, SLOT(onObjectCreatedDeleted()));
 }
@@ -168,7 +185,7 @@ void SUPERVGUI_Main::init(SUIT_Desktop* theDesktop) {
 
   sync();
   show();
-  if ( myLogged && !myLogFileName.isEmpty() && QFile::exists( myLogFileName ) ) {
+  if ( myLogged && !myLogFileName.isEmpty() /*&& QFile::exists( myLogFileName )*/ ) { // mkr : PAL7037
     myLogFile = fopen( myLogFileName.latin1(), "a" );
     if (  myLogFile == NULL )
       myLogged = false;
@@ -194,7 +211,7 @@ SUPERVGUI_Main::~SUPERVGUI_Main() {
     SUIT_ViewManager* aVM = it.data()->getViewManager();
     STD_Application* anApp = dynamic_cast<STD_Application*>( SUIT_Session::session()->activeApplication() );
     if ( anApp ) anApp->removeViewManager(aVM);
-    if ( aVM ) delete aVM;
+    //if ( aVM ) delete aVM; // mkr : IPAL11547
     
   }
   mySubGraphs.clear();
@@ -246,7 +263,7 @@ void SUPERVGUI_Main::filterNotification() {
       fclose( myLogFile );
     }
     myLogFile = NULL;
-    if ( myLogged && !myLogFileName.isEmpty() && QFile::exists( myLogFileName ) ) {
+    if ( myLogged && !myLogFileName.isEmpty() /*&& QFile::exists( myLogFileName )*/ ) { // mkr : PAL7037
       myLogFile = fopen( myLogFileName.latin1(), "a" );
       if (  myLogFile == NULL ) {
        myLogged = false;
@@ -489,9 +506,9 @@ void SUPERVGUI_Main::openSubGraph(SUPERV_CNode theNode, bool correct)
        if ( aStudyFrame ) {
          SUPERVGraph_ViewFrame* aViewFrame = dynamic_cast<SUPERVGraph_ViewFrame*>( aStudyFrame );
          if( aViewFrame ) {
-           /*SUPERVGUI_Main* m = */new SUPERVGUI_Main(aViewFrame, 
-                                                      aSupMod->application()->desktop(),//getDesktop(), 
-                                                      aGraph);
+           new SUPERVGUI_Main(aViewFrame, 
+                              aSupMod->application()->desktop(),//getDesktop(), 
+                              aGraph);
            //    connect(aStudyFrame, SIGNAL(sfStudyFrameClosing(QAD_StudyFrame*)), 
            //            this,  SLOT(onSubGraphClosed(QAD_StudyFrame*)));
            connect(aSupMod->application()->desktop(), SIGNAL(windowActivated( SUIT_ViewWindow* )), 
@@ -510,6 +527,18 @@ void SUPERVGUI_Main::openSubGraph(SUPERV_CNode theNode, bool correct)
   }
 }
 
+// mkr : IPAL11549
+void SUPERVGUI_Main::destroySubGraph(QString theSubGraphName)
+{
+  if ( mySubGraphs.contains(theSubGraphName) ) {
+    SUIT_ViewWindow* aStudyFrame = mySubGraphs[theSubGraphName];
+    onSubGraphClosed(aStudyFrame);
+    SUIT_ViewManager* aVM = aStudyFrame->getViewManager();
+    STD_Application* anApp = dynamic_cast<STD_Application*>( SUIT_Session::session()->activeApplication() );
+    if ( anApp ) anApp->removeViewManager(aVM);
+  }
+}
+
 bool SUPERVGUI_Main::eventFilter( QObject* o, QEvent* e)
 {
   // workaround to get close event
@@ -580,7 +609,9 @@ void SUPERVGUI_Main::onObjectCreatedDeleted()
          if ( aMainList->count() == 1 ) {
            SUPERVGUI_Main* aMain = dynamic_cast<SUPERVGUI_Main*>( aMainList->first() );
            if ( aMain )
-             if ( !QString(aMain->getDataflow()->getIOR()).compare(getDataflow()->getIOR()) // equal dataflows
+             if ( !CORBA::is_nil( aMain->getDataflow() )
+                  &&
+                  !QString(aMain->getDataflow()->getIOR()).compare(getDataflow()->getIOR()) // equal dataflows
                   && 
                   aMain != this ) // not equal mains
                aMain->getCanvas()->merge();
@@ -591,6 +622,84 @@ void SUPERVGUI_Main::onObjectCreatedDeleted()
   }
 }
 
+// mkr : PAL8150 : synchronize many views of the same dataflow ("Put In Study"/"Not In Study" operation)
+void SUPERVGUI_Main::onPutInStudy( QString* theNodePortName )
+{
+  if ( study ) {
+    if ( STD_Application* app = dynamic_cast<STD_Application*>( study->application() ) ) {
+      ViewManagerList aVMList;
+      app->viewManagers( SUPERVGraph_Viewer::Type(), aVMList );
+      SUIT_ViewManager* aVM;
+      for ( aVM = aVMList.first(); aVM; aVM = aVMList.next() ) {
+       QPtrVector<SUIT_ViewWindow> aVWList = aVM->getViews();
+       for ( int i = 0; i < aVWList.count(); i++ ) {
+         SUPERVGraph_ViewFrame* aVW = dynamic_cast<SUPERVGraph_ViewFrame*>( aVWList[i] );
+         QObjectList* aMainList = aVW->queryList("SUPERVGUI_Main");
+         if ( aMainList->count() == 1 ) {
+           SUPERVGUI_Main* aMain = dynamic_cast<SUPERVGUI_Main*>( aMainList->first() );
+           if ( aMain )
+             if ( !QString(aMain->getDataflow()->getIOR()).compare(getDataflow()->getIOR()) // equal dataflows
+                  && 
+                  aMain != this ) { // not equal mains
+               QString aNodeName = theNodePortName->left( theNodePortName->find('_') );
+               QString aPortName = theNodePortName->right( theNodePortName->length() - theNodePortName->find('_') - 1 );
+               bool anIsInStudy = dynamic_cast<SUPERVGUI_CanvasPortOut*>( getCanvas()->getPort( getDataflow()->Node( aNodeName )->GetOutPort( aPortName ) ) )->isInStudy();
+               dynamic_cast<SUPERVGUI_CanvasPortOut*>( aMain->getCanvas()->getPort( aMain->getDataflow()->Node( aNodeName )->GetOutPort( aPortName ) ) )->setStudyState( anIsInStudy );
+             }
+         }
+       }
+      }
+    }
+  }
+}
+
+// mkr : PAL8150 : synchronize many views of the same dataflow ("Display" operation for dataflow)
+void SUPERVGUI_Main::syncPutInStudy()
+{
+  if ( study ) {
+    if ( STD_Application* app = dynamic_cast<STD_Application*>( study->application() ) ) {
+      ViewManagerList aVMList;
+      app->viewManagers( SUPERVGraph_Viewer::Type(), aVMList );
+      SUIT_ViewManager* aVM;
+      for ( aVM = aVMList.first(); aVM; aVM = aVMList.next() ) {
+       QPtrVector<SUIT_ViewWindow> aVWList = aVM->getViews();
+       for ( int i = 0; i < aVWList.count(); i++ ) {
+         SUPERVGraph_ViewFrame* aVW = dynamic_cast<SUPERVGraph_ViewFrame*>( aVWList[i] );
+         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
+       
+               // check "myInStudy" field of output ports of original main (i.e. this main)
+               // and synchronize this property for nodes' output ports of dublicate main (i.e. of aMain)
+               SUPERV_Nodes nodes = aMain->getDataflow()->Nodes();
+               
+               SYNCPUTINSTUDY(CNodes);
+               SYNCPUTINSTUDY(FNodes);
+               SYNCPUTINSTUDY(INodes);
+               SYNCPUTINSTUDY(GNodes);
+               SYNCPUTINSTUDY(LNodes);
+               SYNCPUTINSTUDY(ELNodes);
+               SYNCPUTINSTUDY(SNodes);
+               SYNCPUTINSTUDY(ESNodes);
+               SYNCPUTINSTUDY(Graphs);
+
+               setRunTime( aMain->getRunTime() );
+
+               break;
+             }
+         }
+       }
+      }
+    }
+  }
+}
+
 void SUPERVGUI_Main::run( const bool andSuspend ) {
   Trace("SUPERVGUI_Main::run");
   if ( SUPERV_isNull(dataflow) ) 
@@ -654,6 +763,7 @@ void SUPERVGUI_Main::kill() {
 
 void SUPERVGUI_Main::suspendResume() {
     Trace("SUPERVGUI_Main::suspendResume");
+
     if ((SUPERV_isNull(dataflow))) return;
 
     if (dataflow->IsEditing()) {
@@ -913,7 +1023,7 @@ _PTR(SObject) SearchOrCreateSOWithName( _PTR(Study) const theStudy,
   _PTR(ChildIterator) anIterator ( theStudy->NewChildIterator(theSO) );
   for (; anIterator->More(); anIterator->Next()) {
     if (anIterator->Value()->FindAttribute(anAttr, "AttributeName")) {
-      aName = anAttr;
+      aName = _PTR(AttributeName) ( anAttr );
       if (strcmp(aName->Value().c_str(), theName) == 0) {
        aResult = anIterator->Value();
        break;
@@ -929,7 +1039,7 @@ _PTR(SObject) SearchOrCreateSOWithName( _PTR(Study) const theStudy,
   // add new SObject
   aResult = theBuilder->NewObject( theSO );
   anAttr = theBuilder->FindOrCreateAttribute(aResult, "AttributeName");
-  aName = anAttr;
+  aName = _PTR(AttributeName) ( anAttr );
   aName->SetValue(theName);
   return aResult;
 }
@@ -963,7 +1073,7 @@ _PTR(SObject) createDataflowSObj( SUIT_Study* study,
     if ( !aComponent ) { // is supervision component not found, then create it
       aComponent = aBuilder->NewComponent(STUDY_SUPERVISION);
       anAttr = aBuilder->FindOrCreateAttribute(aComponent, "AttributeName");
-      aName = anAttr;
+      aName = _PTR(AttributeName) ( anAttr );
       aName->SetValue( (( CAM_Application* )(study->application()))->moduleTitle( "SUPERV" ).latin1() );
        
       anAttr = aBuilder->FindOrCreateAttribute(aComponent, "AttributePixMap");
@@ -980,7 +1090,7 @@ _PTR(SObject) createDataflowSObj( SUIT_Study* study,
     // create dataflow SObject ("aNewDataflow_1") 
     aSO = aBuilder->NewObject(aComponent);
     anAttr =  aBuilder->FindOrCreateAttribute(aSO, "AttributeName");
-    aName = anAttr;
+    aName = _PTR(AttributeName) ( anAttr );
     aName->SetValue(dataflow->Name());
     anAttr =  aBuilder->FindOrCreateAttribute(aSO, "AttributeIOR");
     _PTR(AttributeIOR) anIORAttr ( anAttr );
@@ -1194,16 +1304,16 @@ void SUPERVGUI_Main::syncNotification() {
   long  counter;
   char* date;
   long  stamp;
-  
+
   while (notification->Receive(&graph, &node, &type, &message, &sender, &counter, &date, &stamp)) {
-//    if (isFiltered(graph, node, type, message, sender, counter, date, stamp)) {
+    if (isFiltered(graph, node, type, message, sender, counter, date, stamp)) { // mkr : PAL7037
       QString mess("");
       mess += "NOTIF: "; mess += graph;
       mess += " / "    ; mess += node;
       mess += " / "    ; mess += type;
       mess += " / "    ; mess += message;
       getMessage()->putMessage(mess.latin1());
-//    };
+    };
   };
 }
   
@@ -1213,7 +1323,13 @@ bool SUPERVGUI_Main::isFiltered(char* graph,  char* node,   char* type, char* me
   bool b = false;
   if (strcmp(getDataflow()->Name(), graph) == 0) {
     SUPERVGUI_CanvasNode* n;
-    QObjectList* nodes = queryList("SUPERVGUI_CanvasNode");
+    QObjectList* nodes;
+    // mkr : PAL7037 -->
+    if (myCurrentView == CANVASTABLE)
+      nodes = myArray->queryList("SUPERVGUI_CanvasNode");
+    else
+      nodes = myCanvas->queryList("SUPERVGUI_CanvasNode");
+    // mkr : PAL7037 <--
     QObjectListIt i(*nodes);
     while ((n=(SUPERVGUI_CanvasNode*)i.current()) != 0) {
       ++i;
@@ -1503,10 +1619,10 @@ void SUPERVGUI_Thread::run()
     SUPERV_CNode aNode = NULL;
     SUPERV::GraphEvent aEvent = SUPERV::UndefinedEvent ;
     SUPERV::GraphState aState = SUPERV::UndefinedState ;
-    
+
     // blocking function of Engine.  Return from there only after anEvent happens on node aNode
     myMain->getDataflow()->Event(aNode, aEvent, aState);
-    
+
     ProcessVoidEvent( new TMainRunEvent( this, &SUPERVGUI_Thread::main_thread_run,aNode, aEvent, aState ) );
     
   } // end of while( myIsActive )