]> SALOME platform Git repositories - modules/superv.git/blob - src/SUPERVGUI/SUPERVGUI_Node.cxx
Salome HOME
Merge with OCC_development_01
[modules/superv.git] / src / SUPERVGUI / SUPERVGUI_Node.cxx
1 //  SUPERV SUPERVGUI : GUI for Supervisor component
2 //
3 //  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
5 // 
6 //  This library is free software; you can redistribute it and/or 
7 //  modify it under the terms of the GNU Lesser General Public 
8 //  License as published by the Free Software Foundation; either 
9 //  version 2.1 of the License. 
10 // 
11 //  This library is distributed in the hope that it will be useful, 
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of 
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
14 //  Lesser General Public License for more details. 
15 // 
16 //  You should have received a copy of the GNU Lesser General Public 
17 //  License along with this library; if not, write to the Free Software 
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
19 // 
20 //  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
21 //
22 //
23 //
24 //  File   : SUPERVGUI_Node.cxx
25 //  Author : Francis KLOSS
26 //  Module : SUPERV
27
28 using namespace std;
29 #include "SUPERVGUI_Node.h"
30 #include "SUPERVGUI_Main.h"
31 #include "SUPERVGUI_Python.h"
32 #include "SUPERVGUI.h"
33 #include "SUPERVGUI_BrowseNodeDlg.h"
34 #include "SALOMEGUI_NameDlg.h"
35 #include "SUPERVGUI_Information.h"
36 #include "SUPERVGUI_ComputeNode.h"
37 #include "SUPERVGUI_ControlNode.h"
38
39 #include <qlayout.h>
40 #include <qlabel.h>
41 #include <qlineedit.h>
42 #include <qpushbutton.h>
43 #include <qhbox.h>
44 #include <qgroupbox.h>
45 #include <qtooltip.h>
46
47
48
49 SUPERVGUI_Node::SUPERVGUI_Node(QWidget* theParent, SUPERVGUI_Main* theMain, SUPERV_CNode theNode):
50     QFrame(theParent, "", WDestructiveClose),
51     myMain(theMain),
52     myNode(theNode),
53     warning(true),
54     step(true),
55     trace(true),
56     verbose(true),
57     aBrowseDlg(0)
58 {
59   Trace("SUPERVGUI_Node::SUPERVGUI_Node");
60   QPalette BackColor = QPalette(MAIN_BACK);
61   setPalette(BackColor);
62
63   setName(myNode->Name());
64   //myTitle = new SUPERVGUI_Label(0, LABEL_WIDTH, LABEL_HEIGHT, name(), QLabel::AlignLeft);
65   //connect(myTitle, SIGNAL(MousePress(QMouseEvent*)), this, SLOT(showPopup(QMouseEvent*)));
66   //myTitle->hide();
67
68   myStatus = new SUPERVGUI_Label(0, LABEL_WIDTH/2, LABEL_HEIGHT, "", QLabel::AlignHCenter);
69   myTime = new SUPERVGUI_Label(0, LABEL_WIDTH/2, LABEL_HEIGHT, "00:00:00", QLabel::AlignHCenter);
70   myStatus->hide();
71   myTime->hide();
72
73   connect(myStatus, SIGNAL(MousePress(QMouseEvent*)), this, SLOT(showPopup(QMouseEvent*)));
74   connect(myTime,   SIGNAL(MousePress(QMouseEvent*)), this, SLOT(showPopup(QMouseEvent*)));
75
76   //create common popup
77   myPopup = new QPopupMenu(this);
78   if (myMain->isEditable() && getNodeType() != SUPERV::EndLoopNode 
79                            && getNodeType() != SUPERV::EndSwitchNode) {
80     myRenameItem  = myPopup->insertItem(tr("MSG_RENAME"), this, SLOT(rename()));
81     myDeleteItem = myPopup->insertItem(tr("MSG_DELETE"), this, SLOT(remove()));
82     mySeparatorId = myPopup->insertSeparator();
83   }
84   myPopup->insertItem(tr("MSG_BROWSE"), this, SLOT(browse()));
85   if ((getNodeType() != SUPERV::EndLoopNode) && (getNodeType() != SUPERV::EndSwitchNode))
86     myPopup->insertItem(tr("MSG_CHANGE_INFO"), this, SLOT(changeInformation()));
87   //myPopup->insertItem(tr("MSG_CONFIGURE"),   this, SLOT(configure()));
88
89   if (myMain->isEditable() && (getNodeType() != SUPERV::FactoryNode)
90                            && (getNodeType() != SUPERV::ComputingNode)) {
91     if ((getNodeType() != SUPERV::EndLoopNode)) {
92       QPopupMenu* aAddPortMnu = new QPopupMenu(this);
93       aAddPortMnu->insertItem("Input", this, SLOT(addInputPort()));
94       if (getNodeType() != SUPERV::LoopNode)
95         aAddPortMnu->insertItem("Output", this, SLOT(addOutputPort()));
96       
97       myPopup->insertSeparator();
98       if ((getNodeType() != SUPERV::EndSwitchNode))
99         myPopup->insertItem("Edit Function", this, SLOT(editFunction()));
100       myPopup->insertItem("Add Port", aAddPortMnu);
101     }
102   }
103
104   // create execution popup
105   myRunPopup = new QPopupMenu(this);
106   mySuspendItem = myRunPopup->insertItem(tr("MSG_SUSPEND"),     this, SLOT(suspendResume()));
107   myKillItem = myRunPopup->insertItem(tr("MSG_KILL"),        this, SLOT(kill()));
108   //myStopItem = myRunPopup->insertItem(tr("MSG_STOP"),        this, SLOT(stopRestart()));
109
110   setState(myNode->State());
111 }
112
113 SUPERVGUI_Node::~SUPERVGUI_Node()
114 {
115   Trace("SUPERVGUI_Node::~SUPERVGUI_Node")
116 }
117
118
119 void SUPERVGUI_Node::sync() {
120   // asv : 18.11.04 : fix for 6170 : after execution is finished, nodes' status must be reset.
121   //                  this code here seems to be executed only in Table View (array).
122   SUPERV::GraphState aState = myNode->State();
123   if ( !myMain->getDataflow()->IsExecuting() && myMain->IsGUIEventLoopFinished() && 
124        (aState == SUPERV::DoneState || aState == SUPERV::KillState || aState == SUPERV::StopState ) )
125     aState = SUPERV::EditingState;
126
127   setState( aState );
128 }
129
130 void SUPERVGUI_Node::syncOnEvent(SUPERV::GraphState theStateFromEvent) {
131   setState(theStateFromEvent);
132 }
133
134 void SUPERVGUI_Node::setState(SUPERV::GraphState theState)
135 {
136   MESSAGE("NodeState="<<theState);
137   myRunPopup->changeItem(mySuspendItem, tr("MSG_SUSPEND"));
138   myRunPopup->setItemEnabled(mySuspendItem, true);
139   myRunPopup->setItemEnabled(myStopItem, false);
140
141   switch (theState) {
142   case SUPERV_Waiting:
143     myStatus->setText("Waiting");
144     myStatus->setPaletteBackgroundColor(QColor(35, 192, 255));
145     break;
146   case SUPERV_Running:
147   case SUPERV::ReadyState:
148     myStatus->setText("Running");
149     myStatus->setPaletteBackgroundColor(QColor(32,210,32));
150     myRunPopup->changeItem(myStopItem, tr("MSG_STOP"));
151     myRunPopup->setItemEnabled(myStopItem, true);
152     break;
153   case SUPERV_Suspend:
154   case SUPERV::SuspendReadyState:
155     myStatus->setText("Suspended");
156     myStatus->setPaletteBackgroundColor(QColor(255,180, 0));
157     myRunPopup->changeItem(mySuspendItem, tr("MSG_RESUME"));
158     break;
159   case SUPERV_Done:
160     myStatus->setText("Finished");
161     myStatus->setPaletteBackgroundColor(QColor(255, 158, 255));
162     myRunPopup->setItemEnabled(mySuspendItem, false);
163     myRunPopup->changeItem(myStopItem, tr("MSG_RESTART"));
164     myRunPopup->setItemEnabled(myStopItem, true);
165     break;
166   case SUPERV_Error: 
167     myStatus->setText("Aborted");
168     myStatus->setPaletteBackgroundColor(red);
169     myRunPopup->setItemEnabled(mySuspendItem, false);
170     myRunPopup->changeItem(myStopItem, tr("MSG_RESTART"));
171     myRunPopup->setItemEnabled(myStopItem, true);
172     break;
173   case SUPERV_Kill:
174     myStatus->setText("Killed");
175     myStatus->setPaletteBackgroundColor(red);
176     myRunPopup->setItemEnabled(mySuspendItem, false);
177     myRunPopup->changeItem(myStopItem, tr("MSG_RESTART"));
178     myRunPopup->setItemEnabled(myStopItem, true);
179     break;
180   default:
181     myStatus->setText("No Status");
182     myStatus->setPaletteBackgroundColor(QColor(NODE_RED, NODE_GREEN, NODE_BLUE));
183     myRunPopup->setItemEnabled(mySuspendItem, false);
184     break;
185   }
186   myTime->setPaletteBackgroundColor(myStatus->paletteBackgroundColor());
187   long sec = myNode->CpuUsed();
188   //    sec++;
189   char hms[9];
190   long s = sec/3600;
191   hms[0]=(char)(((s/10)%10)+48);
192   hms[1]=(char)((s%10)+48);
193   hms[2]=':';
194   sec = sec%3600;
195   s = sec/60;
196   hms[3]=(char)((s/10)+48);
197   hms[4]=(char)((s%10)+48);
198   hms[5]=':';
199   sec = sec%60;
200   hms[6]=(char)((sec/10)+48);
201   hms[7]=(char)((sec%10)+48);
202   hms[8]='\0';
203   myTime->setText(hms);  
204 }
205
206 void SUPERVGUI_Node::rename()
207 {
208   QString nm = SALOMEGUI_NameDlg::getName( QAD_Application::getDesktop(), myNode->Name() );
209   if ( !nm.isEmpty() ) {
210     setNodeName(nm);
211   }
212 }
213
214
215 void SUPERVGUI_Node::remove() {
216   Trace("SUPERVGUI_Node::remove");
217   deleteLinks();
218   myNode->destroy();
219   myMain->getGraph()->deleteNode(this);
220 }
221
222 void SUPERVGUI_Node::suspendResume() {
223   Trace("SUPERVGUI_Node::suspendResume");
224   int n = queryList("SUPERVGUI_Node")->count(); 
225   if (myNode->IsSuspended()) {
226     if (!((n==1)? myMain->getDataflow()->Resume() : myNode->Resume())) {
227       QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_RESUMENODE"));
228     }
229     else {
230       myMain->getMyThread()->startThread(tr("MSG_NODE_RESUMED1")+myNode->Name()+tr("MSG_NODE_RESUMED2"));
231     }
232   } else {
233     if (!((n==1)? myMain->getDataflow()->Suspend() : myNode->Suspend())) {
234       QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_SUSPENDNODE"));
235     } else {
236       myStatus->setPaletteBackgroundColor(QColor(255,180, 0));
237       myTime->setPaletteBackgroundColor(QColor(255,180, 0));
238       myMain->getMyThread()->stopThread(tr("MSG_NODE_SUSPENDED1")+myNode->Name()+tr("MSG_NODE_SUSPENDED2"));
239     }
240   }
241 }
242
243 void SUPERVGUI_Node::kill() {
244   Trace("SUPERVGUI_Node::kill");
245   int n = queryList("SUPERVGUI_Node")->count(); 
246   if (!((n==1)? myMain->getDataflow()->Kill() : myNode->Kill())) {
247     QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_KILLNODE"));
248   } else {
249     myStatus->setPaletteBackgroundColor(Qt::red);
250     myTime->setPaletteBackgroundColor(Qt::red);
251     myMain->getMyThread()->stopThread(tr("MSG_NODE_KILLED1")+myNode->Name()+tr("MSG_NODE_KILLED2"));
252   }
253 }
254
255 void SUPERVGUI_Node::stopRestart() {
256   Trace("SUPERVGUI_Node::stopRestart");
257   
258   int n = queryList("SUPERVGUI_Node")->count(); 
259   if ((myNode->State() == SUPERV_Stop) || (myNode->State() == SUPERV_Kill)) {
260     if (!((n==1)? myMain->getDataflow()->Run() : myNode->ReStart())) {
261       QMessageBox::warning(QAD_Application::getDesktop(),  tr("ERROR"), tr("MSG_CANT_RESTARTNODE"));
262     }
263   } else {
264     if (!((n==1)? myMain->getDataflow()->Stop() : myNode->Stop())) {
265       QMessageBox::warning(QAD_Application::getDesktop(),  tr("ERROR"), tr("MSG_CANT_STOPNODE"));
266     }
267   }
268 }
269
270 void SUPERVGUI_Node::changeInformation() {
271   SUPERVGUI_Information* aDlg = new SUPERVGUI_Information(myNode, !myMain->isEditable());
272   if (aDlg->exec() )
273     sync();
274   delete aDlg;
275   if (myNode->IsGOTO()) {
276     QString nmGT = myNode->Name();
277     if ( !nmGT.isEmpty() ) {
278       setNodeName(nmGT);
279     }
280   }
281   if (myMain->isEditable()) {
282     if (myMain->isArrayShown()) {  //Table View
283       if (myNode->IsLoop() || myNode->IsSwitch()) { //for synchronic names changing
284         QString nmA = myNode->Name();
285         if ( !nmA.isEmpty() ) {
286           setNodeName(nmA);
287           QString aStrA(tr("ENDNODE_PREFIX"));
288           aStrA+=nmA;
289           (dynamic_cast<SUPERVGUI_Cell*>(this))->getPairCell()->getTitle()->setText(aStrA);
290           (dynamic_cast<SUPERVGUI_Cell*>(this))->getPairCell()->setNodeName(aStrA);
291           // QToolTip::remove((dynamic_cast<SUPERVGUI_Cell*>(this))->getPairCell()->getTitle());
292           QToolTip::add((dynamic_cast<SUPERVGUI_Cell*>(this))->getPairCell()->getTitle(),
293                         (dynamic_cast<SUPERVGUI_Cell*>(this))->getPairCell()->getTitle()->text());
294
295         }
296       }
297       // QToolTip::remove((dynamic_cast<SUPERVGUI_Cell*>(this))->getTitle());
298       QToolTip::add((dynamic_cast<SUPERVGUI_Cell*>(this))->getTitle(),
299                     (dynamic_cast<SUPERVGUI_Cell*>(this))->getTitle()->text());
300       QToolTip::add((dynamic_cast<SUPERVGUI_Cell*>(this))->getComponent(),
301                     (dynamic_cast<SUPERVGUI_Cell*>(this))->getComponent()->text());
302     }
303     else {  //Graph View
304       if (myNode->IsLoop() || myNode->IsSwitch()) { //for synchronic names changing
305         QString nm = myNode->Name();
306         if ( !nm.isEmpty() ) {
307           setNodeName(nm);
308           QString aStr(tr("ENDNODE_PREFIX"));
309           aStr+=nm;
310           (dynamic_cast<SUPERVGUI_StartControlNode*>(this))->getEndNode()->setNodeName(aStr);
311         }
312       }
313       else {
314         if (!(myNode->IsGOTO())) {
315           // QToolTip::remove((dynamic_cast<SUPERVGUI_ComputeNode*>(this))->getCommLabel());
316           QToolTip::add((dynamic_cast<SUPERVGUI_ComputeNode*>(this))->getCommLabel(),
317                         (dynamic_cast<SUPERVGUI_ComputeNode*>(this))->getCommLabel()->text());
318           QToolTip::add((dynamic_cast<SUPERVGUI_ComputeNode*>(this))->getTitleLabel(),
319                         (dynamic_cast<SUPERVGUI_ComputeNode*>(this))->getTitleLabel()->text());
320         }
321       }
322     }
323   }
324   /*    Trace("SUPERVGUI_Node::changeInformation")
325     if (Supervision.information(myNode, !myMain->isEditable())) {
326         myMain->syncAsync();
327         };*/
328 }
329
330 void SUPERVGUI_Node::configure() {
331     Trace("SUPERVGUI_Node::configure")
332     QMessageBox::warning(QAD_Application::getDesktop(),  tr("ERROR"), tr("MSG_NOT_IMPLEMENTED")); // kloss : a faire : lancer l'ihm DATA
333 }
334
335 void SUPERVGUI_Node::showPython() {
336     Trace("SUPERVGUI_Node::showPython")
337     SUPERVGUI_Python cp(myMain->getStudy()->get_PyInterp(), !myMain->isEditable());
338     cp.exec();
339 }
340
341 void SUPERVGUI_Node::showPopup(QMouseEvent* e) {
342   Trace("SUPERVGUI_Node::showPopup");
343   if (myMain->getDataflow()->IsExecuting())
344     myMain->showPopup(myRunPopup, e);
345   else
346     myMain->showPopup(myPopup, e);
347 }
348
349
350 void SUPERVGUI_Node::mousePressEvent(QMouseEvent* e) {
351   if (!myMain->getDataflow()->IsExecuting())
352     myMain->showPopup(myPopup, e);
353 }
354
355
356 bool SUPERVGUI_Node::isWarning() {
357     Trace("SUPERVGUI_Node::isWarning")
358     return(warning);
359 }
360
361 bool SUPERVGUI_Node::isStep() {
362     Trace("SUPERVGUI_Node::isStep")
363     return(step);
364 }
365
366 bool SUPERVGUI_Node::isTrace() {
367     Trace("SUPERVGUI_Node::isTrace")
368     return(trace);
369 }
370
371 bool SUPERVGUI_Node::isVerbose() {
372     Trace("SUPERVGUI_Node::isVerbose")
373     return(verbose);
374 }
375
376 void SUPERVGUI_Node::setWarning(bool b) {
377     Trace("SUPERVGUI_Node::setWarning")
378     warning = b;
379 }
380
381 void SUPERVGUI_Node::setStep(bool b) {
382     Trace("SUPERVGUI_Node::setStep")
383     step = b;
384 }
385
386 void SUPERVGUI_Node::setTrace(bool b) {
387     Trace("SUPERVGUI_Node::setTrace")
388     trace = b;
389 }
390
391 void SUPERVGUI_Node::setVerbose(bool b) {
392     Trace("SUPERVGUI_Node::setVerbose")
393     verbose = b;
394 }
395
396
397 void SUPERVGUI_Node::browse() {
398   if ( !aBrowseDlg ) {
399     aBrowseDlg = new SUPERVGUI_BrowseNodeDlg(this);
400     aBrowseDlg->installEventFilter( this );
401   }
402   if ( !aBrowseDlg->isVisible() )
403     aBrowseDlg->show();
404   else {
405     aBrowseDlg->raise();
406     aBrowseDlg->setActiveWindow();
407     aBrowseDlg->setFocus();
408   }
409 }
410
411 bool SUPERVGUI_Node::eventFilter( QObject* o, QEvent* e )
412 {
413   if ( o == aBrowseDlg && e->type() == QEvent::Close )
414     aBrowseDlg = 0;
415   return QFrame::eventFilter( o, e );
416 }
417
418
419 void SUPERVGUI_Node::setNodeName(QString aName) {
420   if ( myNode->SetName(aName.latin1())) {
421     setName(myNode->Name());
422     //myTitle->setText(aName);
423   } else 
424     QMessageBox::warning( QAD_Application::getDesktop(), tr( "ERROR" ), tr( "MSG_CANT_RENAMENODE" ) );
425 }
426
427 QStringList SUPERVGUI_Node::getPortsNamesIN(SUPERV_INode theNode, bool theInputPorts)
428 {
429   QStringList aPNList;
430   if (!SUPERV_isNull(theNode)) {
431     SUPERV_Ports aPorts = theNode->Ports();
432     for (int i=0; i<aPorts->length(); i++) {
433       if (theInputPorts) {
434         if (aPorts[i]->IsInput()) aPNList.append(QString(aPorts[i]->Name()));
435       }
436       else 
437         if (!aPorts[i]->IsInput()) aPNList.append(QString(aPorts[i]->Name()));
438     }
439   }
440   return aPNList;
441 }
442
443 SUPERV_Port SUPERVGUI_Node::createInPort() {
444   SUPERV_INode aNode = getInlineNode();
445   if (SUPERV_isNull(aNode)) {
446     MESSAGE("SUPERVGUI_Node::createInPort: Node is wrong type");
447     return NULL;
448   }
449   
450   SUPERVGUI_PortParamsDlg* aDlg = new SUPERVGUI_PortParamsDlg(getPortsNamesIN(aNode,true));
451   if (aDlg->exec()) {
452     SUPERV_Port aPort = aNode->InPort(aDlg->getName().latin1(),
453                                       aDlg->getType().latin1());    
454     delete aDlg;
455     return aPort;
456   }
457   delete aDlg;
458   return NULL;
459 }
460
461
462 SUPERV_Port SUPERVGUI_Node::createOutPort() {
463   SUPERV_INode aNode = getInlineNode();
464   if (SUPERV_isNull(aNode)) {
465     MESSAGE("SUPERVGUI_Node::createInPort: Node is wrong type");
466     return NULL;
467   }
468   
469   SUPERVGUI_PortParamsDlg* aDlg = new SUPERVGUI_PortParamsDlg(getPortsNamesIN(aNode,false));
470   if (aDlg->exec()) {
471     SUPERV_Port aPort = aNode->OutPort(aDlg->getName().latin1(),
472                                        aDlg->getType().latin1());
473     delete aDlg;
474     return aPort;
475   }
476   delete aDlg;
477   return NULL;
478 }
479
480
481
482 void SUPERVGUI_Node::addInputPort() {
483   createInPort();
484 }
485
486
487 void SUPERVGUI_Node::addOutputPort() {
488   createOutPort();
489 }
490
491
492 void SUPERVGUI_Node::editFunction() {
493   if (getNodeType() == SUPERV::LoopNode) {
494     SUPERVGUI_EditPythonDlg* aDlg = new SUPERVGUI_EditPythonDlg(true);
495     SUPERV_LNode aLNode = getLoopNode();
496     aDlg->setInitFunction(aLNode->PyInit());
497     aDlg->setMoreFunction(aLNode->PyMore());
498     aDlg->setNextFunction(aLNode->PyNext());
499     if (aDlg->exec()) {
500       aLNode->SetPyInit(aDlg->getInitFuncName().latin1(), (aDlg->getInitFunction()).in());
501       aLNode->SetPyMore(aDlg->getMoreFuncName().latin1(), (aDlg->getMoreFunction()).in());
502       aLNode->SetPyNext(aDlg->getNextFuncName().latin1(), (aDlg->getNextFunction()).in());
503     }
504     delete aDlg;
505   } else {
506     SUPERVGUI_EditPythonDlg* aDlg = new SUPERVGUI_EditPythonDlg();
507     SUPERV_INode aINode = getInlineNode();
508     aDlg->setFunction(aINode->PyFunction());
509     if (aDlg->exec()) {
510       aINode->SetPyFunction(aDlg->getFuncName().latin1(), (aDlg->getFunction()).in());
511     }
512     delete aDlg;
513   }
514 }
515
516
517
518
519
520
521 /*!
522  * Port parameters dialog definition
523  */
524
525 static const char* MyTypeStrings[] = 
526   {"string", "boolean", "char", "short", "int", "long", "float", "double", "objref"};
527
528 SUPERVGUI_PortParamsDlg::SUPERVGUI_PortParamsDlg(const QStringList& thePortsNames)
529   : QDialog(QAD_Application::getDesktop(), 0, true, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu  ),
530     myPortsNames(thePortsNames)
531 {
532   setSizeGripEnabled( true );
533   setCaption("Port parameters");
534
535   QGridLayout* aBaseLayout = new QGridLayout( this );
536   aBaseLayout->setMargin( 11 ); aBaseLayout->setSpacing( 6 );
537
538   QLabel* aNameLbl = new QLabel("Port Name", this );
539   aBaseLayout->addWidget(aNameLbl, 0, 0);
540
541   myNameTxt = new QLineEdit( this );
542   aNameLbl->setBuddy( myNameTxt );
543   aBaseLayout->addWidget(myNameTxt, 0, 1);
544   
545   QLabel* aTypeLbl = new QLabel("Value Type", this );
546   aBaseLayout->addWidget(aTypeLbl, 1, 0);
547  
548   myTypeTxt = new QComboBox( this );
549   aTypeLbl->setBuddy( myTypeTxt );
550   myTypeTxt->insertStrList( MyTypeStrings );
551   aBaseLayout->addWidget(myTypeTxt, 1, 1);
552  
553   QGroupBox* aBtnBox = new QGroupBox( this );
554   aBtnBox->setColumnLayout( 0, Qt::Vertical );
555   aBtnBox->layout()->setSpacing( 0 ); aBtnBox->layout()->setMargin( 0 );
556   QHBoxLayout* aBtnLayout = new QHBoxLayout( aBtnBox->layout() );
557   aBtnLayout->setAlignment( Qt::AlignTop );
558   aBtnLayout->setSpacing( 6 ); aBtnLayout->setMargin( 11 );
559
560   aBaseLayout->addMultiCellWidget( aBtnBox, 2, 2, 0, 1 );
561
562   QPushButton* aOKBtn = new QPushButton( tr( "BUT_OK" ), aBtnBox );
563   connect( aOKBtn, SIGNAL( clicked() ), this, SLOT( clickOnOk() ) );
564   aBtnLayout->addWidget( aOKBtn );
565
566   aBtnLayout->addStretch();
567
568   QPushButton* aCancelBtn = new QPushButton( tr("BUT_CANCEL"), aBtnBox );
569   connect( aCancelBtn, SIGNAL( clicked() ), this, SLOT( reject() ) );
570   aBtnLayout->addWidget( aCancelBtn );
571 }
572
573 void SUPERVGUI_PortParamsDlg::clickOnOk()
574 {
575   if (getName().isEmpty() || getType().isEmpty())
576     QMessageBox::warning( QAD_Application::getDesktop(), tr( "ERROR" ), tr( "MSG_CANT_CREATE_PORT" ) );
577   else if (myPortsNames.contains(getName()))
578     QMessageBox::warning( QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_PORT_EXIST") );
579   else  
580     accept();
581 }