Salome HOME
Fix for bug PAL12236 : SIGSEGV during init function definition of LoopNode.
[modules/superv.git] / src / SUPERVGUI / SUPERVGUI_Service.cxx
index 788cd8eeaa3df87339ac569b84ccb750f8bb7aa9..a6bb0fa65b6abd018d19f324b00631ac789b22d9 100644 (file)
@@ -25,7 +25,6 @@
 //  Author : Francis KLOSS
 //  Module : SUPERV
 
-using namespace std;
 #include "SUPERVGUI_Service.h"
 #include "SUPERVGUI_Main.h"
 #include "SUPERVGUI_Library.h"
@@ -317,7 +316,7 @@ void SUPERVGUI_Service::initialise() {
        SALOME_ModuleCatalog::Service* Service = &(Interface->interfaceservicelist[k]);
        QListViewItem* myServiceItem = new QListViewItem(myInterfaceItem, (char*)Service->ServiceName);
        myServiceItem->setSelectable(true);
-       components->ensureItemVisible(myServiceItem);
+       //components->ensureItemVisible(myServiceItem);
        
        long nbPortsOut = Service->ServiceoutParameter.length();
        for (int m=0; m<nbPortsOut; m++) {
@@ -452,32 +451,36 @@ void SUPERVGUI_Service::addFactoryNode() {
        if (item->isSelected()) {
          const char* service   = item->text(0).latin1();
          const char* interface = item->parent()->text(0).latin1();
-         const char* component = anApp->moduleName(item->parent()->parent()->text(0).latin1());
-         SALOME_ModuleCatalog::Acomponent_ptr myComponent = (*aModuleCatalog)->GetComponent(component);
-         if (myComponent==NULL) {
-           QMessageBox::warning(aDesktop, tr("ERROR"), tr("MSG_CANT_CHOOSE_SERVICE"));
-         } 
-         else {
-           const SALOME_ModuleCatalog::Service* myService = myComponent->GetService(interface, service);
-           SUPERV_CNode aNode;
-           if ( myService->TypeOfNode == 0 ) { // ComputeNode
-             aNode = aMain->getDataflow()->CNode(*myService);
-             if (CORBA::is_nil( aNode ) ) {
-               QMessageBox::warning(aDesktop, tr("ERROR"), tr("MSG_CANT_CREATE_NODE"));          
-               return;
-             }
+         //const char* component = anApp->moduleName(item->parent()->parent()->text(0).latin1());
+         if ( aSupMod->getInterfaceNameMap().contains(item->parent()->text(0)) ) {
+           const char* component = aSupMod->getInterfaceNameMap().find(item->parent()->text(0)).data();
+
+           SALOME_ModuleCatalog::Acomponent_ptr myComponent = (*aModuleCatalog)->GetComponent(component);
+           if (myComponent==NULL) {
+             QMessageBox::warning(aDesktop, tr("ERROR"), tr("MSG_CANT_CHOOSE_SERVICE"));
            } 
-           else { // Factory Node
-             aNode = aMain->getDataflow()->FNode(component, interface, *myService);
-             if ( CORBA::is_nil( aNode ) ) {
-               QMessageBox::warning(aDesktop, tr("ERROR"), tr("MSG_CANT_CREATE_NODE"));          
-               return;
+           else {
+             const SALOME_ModuleCatalog::Service* myService = myComponent->GetService(interface, service);
+             SUPERV_CNode aNode;
+             if ( myService->TypeOfNode == 0 ) { // ComputeNode
+               aNode = aMain->getDataflow()->CNode(*myService);
+               if (CORBA::is_nil( aNode ) ) {
+                 QMessageBox::warning(aDesktop, tr("ERROR"), tr("MSG_CANT_CREATE_NODE"));        
+                 return;
+               }
+             } 
+             else { // Factory Node
+               aNode = aMain->getDataflow()->FNode(component, interface, *myService, myComponent->implementation_type()); // mkr : PAL11273
+               if ( CORBA::is_nil( aNode ) ) {
+                 QMessageBox::warning(aDesktop, tr("ERROR"), tr("MSG_CANT_CREATE_NODE"));        
+                 return;
+               }
              }
+             SUPERV::INode_var aDummyEndNode;
+             addNode( aNode, aDummyEndNode, myX, myY );
+             b = true;
            }
-           SUPERV::INode_var aDummyEndNode;
-           addNode( aNode, aDummyEndNode, myX, myY );
-           b = true;
-         }
+         }
        }
       }
       if ( !b ) {
@@ -507,13 +510,20 @@ void SUPERVGUI_Service::addInlineNode() {
     switch (aSel) {
     case 0: // Computation
       {        
-       SUPERV_CNode aNode = aMain->getDataflow()->INode(myScriptPane->getFuncName().latin1(), 
-                                                        (myScriptPane->getFunction()).in());
+       SUPERV_CNode aNode = 
+         aMain->getDataflow()->INode(myScriptPane->getFuncName().isEmpty() ? "" : myScriptPane->getFuncName().latin1(), 
+                                     (myScriptPane->getFunction()).in());
        if (CORBA::is_nil(aNode)) {
          QMessageBox::warning(0, tr("ERROR"), tr("MSG_CANT_CREATE_NODE"));       
          return;
        }
        SUPERV::INode_var aDummyEndNode;
+       // here we have to 
+       // 1) parse nodes' python function to find ports names
+       // 2) create ports for engine node with found names and "undefined" types
+       //    ( aNode->InPort(name,type), aNode->OutPort(name,type) )
+       // P.S. CanvasNode->createPort(...) for create presentation of port
+       //      will be called from addNode(...) (inside CanvasNode constructor)
        addNode( aNode, aDummyEndNode, myX, myY );
       }
       break;
@@ -521,9 +531,10 @@ void SUPERVGUI_Service::addInlineNode() {
     case 1: // Switch
       {
        SUPERV_INode aEndNode;
-       SUPERV_CNode aStartNode = aMain->getDataflow()->SNode(myScriptPane->getFuncName().latin1(),
-                                                             (myScriptPane->getFunction()).in(),
-                                                             aEndNode);
+       SUPERV_CNode aStartNode = 
+         aMain->getDataflow()->SNode(myScriptPane->getFuncName().isEmpty() ? "" : myScriptPane->getFuncName().latin1(),
+                                     (myScriptPane->getFunction()).in(),
+                                     aEndNode);
        if (CORBA::is_nil(aStartNode) || CORBA::is_nil(aEndNode)) {
          QMessageBox::warning(0, tr("ERROR"), tr("MSG_CANT_CREATE_NODE"));       
          return;
@@ -535,10 +546,14 @@ void SUPERVGUI_Service::addInlineNode() {
     case 2: // Loop
       {
        SUPERV_INode aEndNode;
-       SUPERV_CNode aStartNode = aMain->getDataflow()->LNode(myInitPane->getFuncName().latin1(), (myInitPane->getFunction()).in(),
-                                                             myMorePane->getFuncName().latin1(), (myMorePane->getFunction()).in(),
-                                                             myNextPane->getFuncName().latin1(), (myNextPane->getFunction()).in(),
-                                                             aEndNode);
+       SUPERV_CNode aStartNode = 
+         aMain->getDataflow()->LNode(myInitPane->getFuncName().isEmpty() ? "" : myInitPane->getFuncName().latin1(), 
+                                     (myInitPane->getFunction()).in(),
+                                     myMorePane->getFuncName().isEmpty() ? "" : myMorePane->getFuncName().latin1(), 
+                                     (myMorePane->getFunction()).in(),
+                                     myNextPane->getFuncName().isEmpty() ? "" : myNextPane->getFuncName().latin1(), 
+                                     (myNextPane->getFunction()).in(),
+                                     aEndNode);
        if (CORBA::is_nil(aStartNode) || CORBA::is_nil(aEndNode)) {
          QMessageBox::warning(0, tr("ERROR"), tr("MSG_CANT_CREATE_NODE"));       
          return;
@@ -894,21 +909,23 @@ void SUPERVGUI_PythonEditPane::autoIndentLine() {
 
     // get current cursor position and previous line (the one to be analized) 
     int pos, para, i;
+    QString spacesStr;
     myText->getCursorPosition( &para, &pos ); // pos==0, beginning of line
-    QString line = myText->text( para-1 ); // previous paragraph line
+    if ( myText->paragraphLength(para-1) > 0 ) { // mkr : IPAL9817
+      QString line = myText->text( para-1 ); // previous paragraph line
 
-    // construct a string containing all leading space characters of previous line (tabs, etc.)
-    QString spacesStr;
-    i = -1;
-    while ( line[++i].isSpace() ) // append all isSpace() characters at beginning of line to spacesStr
-      spacesStr += line[i];
-
-    // if ':' was found -- add more spaces to spacesStr
-    line = line.stripWhiteSpace();
-    if ( line[ line.length()-1 ] == ':' ) {
-      i = 0;
-      while ( i++ < N ) 
-       spacesStr += ' ';
+      // construct a string containing all leading space characters of previous line (tabs, etc.)
+      i = -1;
+      while ( line[++i].isSpace() ) // append all isSpace() characters at beginning of line to spacesStr
+       spacesStr += line[i];
+      
+      // if ':' was found -- add more spaces to spacesStr
+      line = line.stripWhiteSpace();
+      if ( line[ line.length()-1 ] == ':' ) {
+       i = 0;
+       while ( i++ < N ) 
+         spacesStr += ' ';
+      }
     }
 
     // ok, append spacesStr at the beginning of the current line = make indentation
@@ -941,6 +958,7 @@ SUPERVGUI_EditPythonDlg::SUPERVGUI_EditPythonDlg( bool isLoop )
   resize( 500, 250 );
   QVBoxLayout* aMainLayout = new QVBoxLayout(this, 7, 4);
   int a,b; // dummies for PythonEditPane, not used, since library = false and myX, myY are not used in PythonEditPane
+  myIsLoop = isLoop; // mkr : PAL12236
   if (isLoop) {
     QTabWidget* aLoopTabPane = new QTabWidget(this);
     myInitPane = new SUPERVGUI_PythonEditPane( this, false, a, b ); // library == false, since no creation of a node is needed here
@@ -965,7 +983,7 @@ SUPERVGUI_EditPythonDlg::SUPERVGUI_EditPythonDlg( bool isLoop )
   aBtnLayout->setSpacing( 6 ); aBtnLayout->setMargin( 11 );
   
   QPushButton* aOKBtn = new QPushButton( tr( "BUT_OK" ), aBtnBox );
-  connect( aOKBtn, SIGNAL( clicked() ), this, SLOT( accept() ) );
+  connect( aOKBtn, SIGNAL( clicked() ), this, SLOT( clickOnOk() ) );
   aBtnLayout->addWidget( aOKBtn );
 
   aBtnLayout->addStretch();
@@ -977,6 +995,21 @@ SUPERVGUI_EditPythonDlg::SUPERVGUI_EditPythonDlg( bool isLoop )
   aMainLayout->addWidget(aBtnBox);
 }
 
+// mkr : IPAL9817 : to avoid a SIGSEGV when INode_Impl::SetPyFunction(...)
+//                  will call with null python function name
+void SUPERVGUI_EditPythonDlg::clickOnOk()
+{
+  // mkr : PAL12236
+  bool hasEmptyName = myIsLoop ? 
+    ( getInitFuncName().isEmpty() || getMoreFuncName().isEmpty() || getNextFuncName().isEmpty() ) :
+    getFuncName().isEmpty();
+
+  if ( hasEmptyName )
+    QMessageBox::warning( SUIT_Session::session()->activeApplication()->desktop(), tr( "ERROR" ), tr( "MSG_INCORRECT_INDENT" ) );
+  else  
+    accept();
+}
+
 /**
  * Do the following actions for newly created Engine's CNode:
  * 1. Create a presentation for it (CanvasNode)
@@ -994,7 +1027,7 @@ void SUPERVGUI_Service::addNode( SUPERV::CNode_var theNode, SUPERV::INode_var th
   SUPERVGUI_Main* aMain = aSupMod->getMain();
 
   if ( !CORBA::is_nil( theNode ) && aMain ) {
-
+    
     aMain->Editing(); // PAL6170: GUI->Engine: setting "Editing" flag, why here? -> PAL7960
 
     int cx, cy;   //to appear a new node in the top-left corner of the current viewport
@@ -1018,8 +1051,9 @@ void SUPERVGUI_Service::addNode( SUPERV::CNode_var theNode, SUPERV::INode_var th
       aMain->addMacroNode( theNode );
     else if ( theNode->IsLoop() || theNode->IsSwitch() )
       aMain->addControlNode( theNode, SUPERV::CNode::_narrow( theEndNode ), true );
-    else
+    else 
       aMain->addComputeNode( theNode );
-  }  
+    aSupMod->nullifyInitialVF();
+  }
 }