Salome HOME
Join modifications from BR_Dev_For_4_0 tag V4_1_1.
[modules/superv.git] / src / SUPERVGUI / SUPERVGUI_Service.cxx
index 7a42fb6676a961e60fe8b6c667ae3256ad938d12..9d9c9d27d673c1f7401c3e4f1f88b1571ab627a3 100644 (file)
@@ -117,6 +117,8 @@ SUPERVGUI_Service::SUPERVGUI_Service(SALOME_NamingService* ns):
   aBaseLayoutV->setSpacing(10);
 
   QHBoxLayout* aBaseLayout = new QHBoxLayout(aCorbaPane); //!!
+  aBaseLayout->setMargin(5);
+  aBaseLayout->setSpacing(10);
  
   components = new QListView(aCorbaPane);
   components->addColumn(tr("COL_COMPONENTS"));
@@ -127,6 +129,7 @@ SUPERVGUI_Service::SUPERVGUI_Service(SALOME_NamingService* ns):
   components->setColumnAlignment(3, AlignLeft);
   components->setSelectionMode(QListView::Extended);
   components->setRootIsDecorated(true);
+
 //  aBaseLayout->addWidget(components);
   aBaseLayoutV->addWidget(components); //!!
 
@@ -137,11 +140,16 @@ SUPERVGUI_Service::SUPERVGUI_Service(SALOME_NamingService* ns):
 //NRI   connect(aComputeCBtn, SIGNAL(clicked()), this, SLOT(addComputeNode())); //!!
 //NRI   aComputeCBtn->setDefault(false); 
 
-  QPushButton* aComputeBtn = new QPushButton(tr("TIT_ADDFNODE"), aCorbaPane);
-  connect(aComputeBtn, SIGNAL(clicked()), this, SLOT(addFactoryNode()));
-  aComputeBtn->setDefault(true); 
+  QPushButton* aComputeBtnDef = new QPushButton(tr("TIT_ADDFNODE"), aCorbaPane);
+  connect(aComputeBtnDef, SIGNAL(clicked()), this, SLOT(addFactoryNodeDef()));
+  aComputeBtnDef->setDefault(true); 
+
+  QPushButton* aComputeBtnCust = new QPushButton(tr("TIT_ADDFNODE_CUST"), aCorbaPane);
+  connect(aComputeBtnCust, SIGNAL(clicked()), this, SLOT(addFactoryNodeCust()));
+  aComputeBtnCust->setDefault(true); 
 
-  aBaseLayout->addWidget(aComputeBtn);
+  aBaseLayout->addWidget(aComputeBtnDef);
+  aBaseLayout->addWidget(aComputeBtnCust);
   //NRI  aBaseLayout->addWidget(aComputeCBtn); //!!
 
   aBaseLayoutV->insertLayout(-1, aBaseLayout);
@@ -255,22 +263,22 @@ SUPERVGUI_Service::SUPERVGUI_Service(SALOME_NamingService* ns):
 }
 
 
-char* getDataStreamParameterName(int aType)
+char* getDataStreamParameterName(const char * aType)
 {
-  switch(aType) {
-  case 1:
+  QString type (aType);
+
+  if (aType == "int") // 1
     return "integer";
-  case 2:
+  if (aType == "float") // 2
     return "float";
-  case 3:
+  if (aType == "double") // 3
     return "double";
-  case 4:
+  if (aType == "string") // 4
     return "string";
-  case 6:
+  if (aType == "bool") // 6 ??
     return "boolean";
-  default:
-    return "unknown";
-  }
+
+  return "unknown";
 }
 
 void SUPERVGUI_Service::initialise() {
@@ -328,10 +336,11 @@ void SUPERVGUI_Service::initialise() {
 
        long nbStreamPortsOut = Service->ServiceoutDataStreamParameter.length();
        for (int m=0; m<nbStreamPortsOut; m++) {
-         SALOME_ModuleCatalog::ServicesDataStreamParameter* PortOut = &(Service->ServiceoutDataStreamParameter[m]);
+         SALOME_ModuleCatalog::ServicesDataStreamParameter* PortOut =
+            &(Service->ServiceoutDataStreamParameter[m]);
          QListViewItem* myPortOutItem = 
            new QListViewItem(myServiceItem, (char*)PortOut->Parametername, 
-                             getDataStreamParameterName(PortOut->Parametertype), "DataStream Out");
+                              getDataStreamParameterName(PortOut->Parametertype), "DataStream Out");
          myPortOutItem->setSelectable(false);
        }
        
@@ -420,7 +429,7 @@ void SUPERVGUI_Service::addComputeNode() {
   }
 }
 
-void SUPERVGUI_Service::addFactoryNode() {
+void SUPERVGUI_Service::addFactoryNodeDef() {
   SUIT_Desktop* aDesktop = SUIT_Session::session()->activeApplication()->desktop();
   CAM_Application* anApp = ( CAM_Application* )(SUIT_Session::session()->activeApplication());
   if ( !anApp ) return;
@@ -452,8 +461,10 @@ void SUPERVGUI_Service::addFactoryNode() {
          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());
-         if ( aSupMod->getInterfaceNameMap().contains(item->parent()->text(0)) ) {
-           const char* component = aSupMod->getInterfaceNameMap().find(item->parent()->text(0)).data();
+         // mkr : PAL13135 -->
+         if ( aSupMod->getInterfaceNameMap().contains(item->parent()->parent()->text(0)) ) {
+           const char* component = aSupMod->getInterfaceNameMap().find(item->parent()->parent()->text(0)).data();
+           // mkr : PAL13135 <--
 
            SALOME_ModuleCatalog::Acomponent_ptr myComponent = (*aModuleCatalog)->GetComponent(component);
            if (myComponent==NULL) {
@@ -490,6 +501,115 @@ void SUPERVGUI_Service::addFactoryNode() {
   }
 }
 
+void SUPERVGUI_Service::addFactoryNodeCust() {
+  SUIT_Desktop* aDesktop = SUIT_Session::session()->activeApplication()->desktop();
+  CAM_Application* anApp = ( CAM_Application* )(SUIT_Session::session()->activeApplication());
+  if ( !anApp ) return;
+
+  SUPERVGUI* aSupMod = SUPERVGUI::Supervision();
+  if ( !aSupMod ) {
+    MESSAGE("NULL Supervision module!");
+    return;
+  }
+
+  SUPERVGUI_Main* aMain = aSupMod->getMain();
+  if (aMain==0) {
+    QMessageBox::warning(aDesktop, tr("WARNING"), tr("MSG_NO_SUPERVISION_WINDOW"));
+  } else if (!aMain->isEditable()) {
+    QMessageBox::warning(aDesktop, tr("ERROR"), tr("MSG_CANT_CREATE_NODE"));     
+  } else {
+    CORBA::Object_ptr obj  = naming->Resolve("/Kernel/ModulCatalog");
+    SALOME_ModuleCatalog::ModuleCatalog_var* aModuleCatalog = new SALOME_ModuleCatalog::ModuleCatalog_var;
+    *aModuleCatalog = SALOME_ModuleCatalog::ModuleCatalog::_narrow(obj);
+    if (CORBA::is_nil(*aModuleCatalog)) {
+      QMessageBox::warning(aDesktop, tr("ERROR"), tr("MSG_CANT_CHOOSE_SERVICE"));
+    } else {
+      QListViewItem*        item;
+      bool                  b = false;
+      
+      QListViewItemIterator iSel(components);
+      int count = 0;
+      for (; iSel.current(); ++iSel) { // check : how many objects are selected (single or multi)
+       item = iSel.current();
+       if (item->isSelected()) count++;
+       if ( count > 1) break;
+      }
+          
+      QListViewItemIterator i(components);
+      QString anAuthor, aContainer, aComment;
+      bool DoneSetting = false;
+      int aRes = 0;
+      for (; i.current(); ++i) {
+       item = i.current();
+       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());
+         // mkr : PAL13135 -->
+         if ( aSupMod->getInterfaceNameMap().contains(item->parent()->parent()->text(0)) ) {
+           const char* component = aSupMod->getInterfaceNameMap().find(item->parent()->parent()->text(0)).data();
+           // mkr : PAL13135 <--
+
+           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;
+               }
+             } 
+             else { // Factory Node
+
+               SUPERVGUI_CustomSettings* aCSDialog = 0;
+               if ( count > 1 && !DoneSetting) { // multi selection
+                 DoneSetting = true;
+                 aCSDialog = new SUPERVGUI_CustomSettings(item, true, myComponent->implementation_type());
+               }
+               else if ( count == 1 ) // single selection
+                 aCSDialog = new SUPERVGUI_CustomSettings(item, false, myComponent->implementation_type());
+               
+               if ( aCSDialog ) {
+                 aRes = aCSDialog->exec();
+                 if (aRes) {
+                   anAuthor = aCSDialog->Author();
+                   aContainer = aCSDialog->Container();
+                   aComment = aCSDialog->Comment();
+                 }
+                 delete aCSDialog;
+               }
+               
+               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;
+               }
+
+               if (aRes) {
+                 aNode->SetAuthor(anAuthor.latin1());
+                 SUPERV::FNode::_narrow(aNode)->SetContainer(aContainer.latin1());
+                 aNode->SetComment(aComment.latin1());
+               }
+               
+             }
+             SUPERV::INode_var aDummyEndNode;
+             addNode( aNode, aDummyEndNode, myX, myY );
+             b = true;
+           }
+         }
+       }
+      }
+      if ( !b ) {
+       QMessageBox::warning(aDesktop, tr("WARNING"), tr("MSG_NONODE_TOADD"));
+      }
+    }
+  }
+}
 
 void SUPERVGUI_Service::addInlineNode() {
   SUPERVGUI* aSupMod = SUPERVGUI::Supervision();
@@ -704,9 +824,9 @@ void SUPERVGUI_Service::tabChanged(QWidget* theWidget) {
 
 
 
-//*****************************************************
+//*****************************************************/
 //  Pane for Python script editing
-//*****************************************************
+//*****************************************************/
 SUPERVGUI_PythonEditPane::SUPERVGUI_PythonEditPane( QWidget* theParent, const bool isNodeCreation, int& theX, int& theY ) 
   : myIsWithLibrary( isNodeCreation ), 
     QFrame( theParent ),
@@ -877,8 +997,10 @@ SUPERV_Strings SUPERVGUI_PythonEditPane::getFunction() {
     // it's user's responsibility to enter correct Python code, we don't do anything with it.
     // if (..) -- initial, while(..) -- my improvement, but also commented out -- needless.
     //if (!aLine.right(1).compare(" ")) // replaced with the line below -- loop
-    //while (aLine.at(aLine.length()-1).isSpace()) // remove trailing spaces
-    //  aLine = aLine.remove(aLine.length()-1,1);
+    // uncommented by mkr to fix bugs IPAL12363, IPAL12885 -->
+    while (aLine.at(aLine.length()-1).isSpace()) // remove trailing spaces
+      aLine = aLine.remove(aLine.length()-1,1);
+    // <--
     aStrings[i] = CORBA::string_dup(aLine.latin1());
   }
   return aStrings._retn();
@@ -918,7 +1040,7 @@ void SUPERVGUI_PythonEditPane::autoIndentLine() {
       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 ] == ':' ) {
@@ -1057,3 +1179,166 @@ void SUPERVGUI_Service::addNode( SUPERV::CNode_var theNode, SUPERV::INode_var th
   }
 }
 
+/*!
+  Constructor
+*/
+SUPERVGUI_CustomSettings::SUPERVGUI_CustomSettings(QListViewItem* theItem,
+                                                  bool isMultiSel,
+                                                  bool isCimpl)
+     : QDialog( SUIT_Session::session()->activeApplication()->desktop(), "", true, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ) 
+{
+  Trace("SUPERVGUI_CustomSettings::SUPERVGUI_CustomSettings");
+
+  SUPERVGUI* aSupMod = SUPERVGUI::Supervision();
+  if ( !aSupMod ) {
+    MESSAGE("NULL Supervision module!");
+    return;
+  }
+
+  SUIT_Desktop* aDesktop = SUIT_Session::session()->activeApplication()->desktop();
+
+  setSizeGripEnabled( true );
+
+  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 );
+
+  QLabel* authL = new QLabel( tr( "AUTHOR_LBL" ), TopGroup); 
+  authV = new QLineEdit( TopGroup );
+  authV->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+  authV->setMinimumSize( 200, 0 );
+  authV->setText( "" );
+
+  contL = new QLabel( tr( "CONTAINER_LBL" ), TopGroup ); 
+  contV = new QLineEdit( TopGroup );
+  contV->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+  contV->setMinimumSize( 200, 0 );
+  
+  QLabel* commL = new QLabel( tr( "COMMENT_LBL" ), TopGroup); 
+  commV = new QMultiLineEdit( TopGroup );
+  commV->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
+  commV->setMinimumSize( 200, 100 );
+
+  if ( !aSupMod->getInterfaceNameMap().contains(theItem->parent()->parent()->text(0)) ) {
+    QMessageBox::warning(aDesktop, tr("WARNING"), tr("MSG_NONODE_TOADD"));
+    return;
+  }
+  const char* component = aSupMod->getInterfaceNameMap().find(theItem->parent()->parent()->text(0)).data();
+
+  QString aNodeDefComment;
+  if ( !isMultiSel ) {
+    // 1) set caption
+    const char* service = theItem->text(0).latin1();
+    aNodeDefComment = QString(service) + QString(tr("COMMENT_FROM")) + QString(component);
+    setCaption( tr( "TLT_CUSTOMPARAMETERS_SINGLE" ) + aNodeDefComment );
+  }
+  else {
+    // 1) set caption
+    aNodeDefComment = QString("Factory Node");
+    setCaption( tr( "TLT_CUSTOMPARAMETERS_MULTI" ) );
+  }
+  
+  // 2) set Container
+  SUPERVGUI_Main* aMain = aSupMod->getMain();
+  if (aMain==0) {
+    QMessageBox::warning(aDesktop, tr("WARNING"), tr("MSG_NO_SUPERVISION_WINDOW"));
+    return;
+  }
+  const char* aContainer = aMain->getDataflow()->ContainerNameForComponent(component);
+  if ( aContainer && strlen(aContainer) > 0 )
+    contV->setText( QString(aContainer) );
+  else if ( isCimpl ) // C++ implementation
+    contV->setText( QString(aMain->getDataflow()->DefaultCContainerName()) );
+  else // Python implementation
+    contV->setText( QString(aMain->getDataflow()->DefaultPythonContainerName()) );
+
+  // 3) set comment
+  commV->setText( aNodeDefComment );
+
+  TopGroupLayout->addWidget( authL, 1, 0 );
+  TopGroupLayout->addWidget( authV, 1, 1 );
+  TopGroupLayout->addWidget( contL, 2, 0 );
+  TopGroupLayout->addWidget( contV, 2, 1 );
+  TopGroupLayout->addWidget( commL, 7, 0 );
+  TopGroupLayout->addMultiCellWidget( commV, 7, 8, 1, 1 );
+  TopGroupLayout->addItem( new QSpacerItem( 5, 5, QSizePolicy::Minimum, QSizePolicy::Expanding  ), 8, 0 );
+  TopGroupLayout->setColStretch( 1, 5 );
+
+  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 );
+  connect( okB,     SIGNAL( clicked() ), this, SLOT( okButton() ) );
+  QPushButton* cancelB = new QPushButton( tr( "BUT_CANCEL" ), GroupButtons );
+  connect( cancelB, SIGNAL( clicked() ), this, SLOT( koButton() ) );
+
+  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 );
+  TopLayout->setRowStretch( 0, 1 );
+  TopLayout->setRowStretch( 1, 0 );
+
+  resize(370,200);
+}
+
+/*!
+  Destructor
+*/
+SUPERVGUI_CustomSettings::~SUPERVGUI_CustomSettings() {
+  Trace("SUPERVGUI_CustomSettings::~SUPERVGUI_CustomSettings");
+}
+
+/*!
+  Get author
+*/
+QString SUPERVGUI_CustomSettings::Author() {
+  return authV->text();
+}
+
+/*!
+  Get container
+*/
+QString SUPERVGUI_CustomSettings::Container() {
+  return contV->text();
+}
+
+/*!
+  Get comment
+*/
+QString SUPERVGUI_CustomSettings::Comment() {
+  return commV->text();
+}
+
+/*!
+  <OK> button slot
+*/
+void SUPERVGUI_CustomSettings::okButton() {
+  Trace("SUPERVGUI_CustomSettings::okButton");
+  accept();
+}
+
+/*!
+  <Cancel> button slot
+*/
+void SUPERVGUI_CustomSettings::koButton() {
+  Trace("SUPERVGUI_CustomSettings::koButton");
+  reject();
+}