]> SALOME platform Git repositories - modules/superv.git/blob - src/SUPERVGUI/SUPERVGUI_Node.cxx
Salome HOME
NRI : Merge from 1.2c.
[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   setState(myNode->State());
121 }
122
123
124 void SUPERVGUI_Node::setState(SUPERV::GraphState theState)
125 {
126   MESSAGE("NodeState="<<theState);
127   myRunPopup->changeItem(mySuspendItem, tr("MSG_SUSPEND"));
128   myRunPopup->setItemEnabled(mySuspendItem, true);
129   myRunPopup->setItemEnabled(myStopItem, false);
130
131   switch (theState) {
132   case SUPERV_Waiting:
133     myStatus->setText("Waiting");
134     myStatus->setPaletteBackgroundColor(QColor(35, 192, 255));
135     break;
136   case SUPERV_Running:
137     myStatus->setText("Running");
138     myStatus->setPaletteBackgroundColor(QColor(32,210,32));
139     myRunPopup->changeItem(myStopItem, tr("MSG_STOP"));
140     myRunPopup->setItemEnabled(myStopItem, true);
141     break;
142   case SUPERV_Suspend:
143   case SUPERV::SuspendReadyState:
144     myStatus->setText("Suspended");
145     myStatus->setPaletteBackgroundColor(QColor(255,180, 0));
146     myRunPopup->changeItem(mySuspendItem, tr("MSG_RESUME"));
147     break;
148   case SUPERV_Done:
149     myStatus->setText("Finished");
150     myStatus->setPaletteBackgroundColor(QColor(255, 158, 255));
151     myRunPopup->setItemEnabled(mySuspendItem, false);
152     myRunPopup->changeItem(myStopItem, tr("MSG_RESTART"));
153     myRunPopup->setItemEnabled(myStopItem, true);
154     break;
155   case SUPERV_Error: 
156     myStatus->setText("Aborted");
157     myStatus->setPaletteBackgroundColor(red);
158     myRunPopup->setItemEnabled(mySuspendItem, false);
159     myRunPopup->changeItem(myStopItem, tr("MSG_RESTART"));
160     myRunPopup->setItemEnabled(myStopItem, true);
161     break;
162   case SUPERV_Kill:
163     myStatus->setText("Killed");
164     myStatus->setPaletteBackgroundColor(red);
165     myRunPopup->setItemEnabled(mySuspendItem, false);
166     myRunPopup->changeItem(myStopItem, tr("MSG_RESTART"));
167     myRunPopup->setItemEnabled(myStopItem, true);
168     break;
169   default:  
170     //cout<<"### Node state = "<<theState<<endl;
171     myStatus->setText("No Status");
172     myStatus->setPaletteBackgroundColor(QColor(NODE_RED, NODE_GREEN, NODE_BLUE));
173     myRunPopup->setItemEnabled(mySuspendItem, false);
174     break;
175   }
176   myTime->setPaletteBackgroundColor(myStatus->paletteBackgroundColor());
177   long sec = myNode->CpuUsed();
178   //    sec++;
179   char hms[9];
180   long s = sec/3600;
181   hms[0]=(char)(((s/10)%10)+48);
182   hms[1]=(char)((s%10)+48);
183   hms[2]=':';
184   sec = sec%3600;
185   s = sec/60;
186   hms[3]=(char)((s/10)+48);
187   hms[4]=(char)((s%10)+48);
188   hms[5]=':';
189   sec = sec%60;
190   hms[6]=(char)((sec/10)+48);
191   hms[7]=(char)((sec%10)+48);
192   hms[8]='\0';
193   myTime->setText(hms);  
194 }
195
196 void SUPERVGUI_Node::rename()
197 {
198   QString nm = SALOMEGUI_NameDlg::getName( QAD_Application::getDesktop(), myNode->Name() );
199   if ( !nm.isEmpty() ) {
200     setNodeName(nm);
201   }
202 }
203
204
205 void SUPERVGUI_Node::remove() {
206   Trace("SUPERVGUI_Node::remove");
207   deleteLinks();
208   myNode->destroy();
209   myMain->getGraph()->deleteNode(this);
210 }
211
212 void SUPERVGUI_Node::suspendResume() {
213   Trace("SUPERVGUI_Node::suspendResume");
214   int n = queryList("SUPERVGUI_Node")->count(); 
215   if (myNode->IsSuspended()) {
216     if (!((n==1)? myMain->getDataflow()->Resume() : myNode->Resume())) {
217       QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_RESUMENODE"));
218     }
219   } else {
220     if (!((n==1)? myMain->getDataflow()->Suspend() : myNode->Suspend())) {
221       QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_SUSPENDNODE"));
222     } else {
223       myStatus->setPaletteBackgroundColor(QColor(255,180, 0));
224       myTime->setPaletteBackgroundColor(QColor(255,180, 0));
225     }
226   }
227 }
228
229 void SUPERVGUI_Node::kill() {
230   Trace("SUPERVGUI_Node::kill");
231   int n = queryList("SUPERVGUI_Node")->count(); 
232   if (!((n==1)? myMain->getDataflow()->Kill() : myNode->Kill())) {
233     QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_KILLNODE"));
234   } else {
235     myStatus->setPaletteBackgroundColor(Qt::red);
236     myTime->setPaletteBackgroundColor(Qt::red);
237   }
238 }
239
240 void SUPERVGUI_Node::stopRestart() {
241   Trace("SUPERVGUI_Node::stopRestart");
242   
243   int n = queryList("SUPERVGUI_Node")->count(); 
244   if ((myNode->State() == SUPERV_Stop) || (myNode->State() == SUPERV_Kill)) {
245     if (!((n==1)? myMain->getDataflow()->Run() : myNode->ReStart())) {
246       QMessageBox::warning(QAD_Application::getDesktop(),  tr("ERROR"), tr("MSG_CANT_RESTARTNODE"));
247     }
248   } else {
249     if (!((n==1)? myMain->getDataflow()->Stop() : myNode->Stop())) {
250       QMessageBox::warning(QAD_Application::getDesktop(),  tr("ERROR"), tr("MSG_CANT_STOPNODE"));
251     }
252   }
253 }
254
255 void SUPERVGUI_Node::changeInformation() {
256   SUPERVGUI_Information* aDlg = new SUPERVGUI_Information(myNode, !myMain->isEditable());
257   if (aDlg->exec() )
258     sync();
259   delete aDlg;
260   if (myNode->IsGOTO()) {
261     QString nmGT = myNode->Name();
262     if ( !nmGT.isEmpty() ) {
263       setNodeName(nmGT);
264     }
265   }
266   if (myMain->isEditable()) {
267     if (myMain->isArrayShown()) {  //Table View
268       if (myNode->IsLoop() || myNode->IsSwitch()) { //for synchronic names changing
269         QString nmA = myNode->Name();
270         if ( !nmA.isEmpty() ) {
271           setNodeName(nmA);
272           QString aStrA(tr("ENDNODE_PREFIX"));
273           aStrA+=nmA;
274           (dynamic_cast<SUPERVGUI_Cell*>(this))->getPairCell()->getTitle()->setText(aStrA);
275           (dynamic_cast<SUPERVGUI_Cell*>(this))->getPairCell()->setNodeName(aStrA);
276           // QToolTip::remove((dynamic_cast<SUPERVGUI_Cell*>(this))->getPairCell()->getTitle());
277           QToolTip::add((dynamic_cast<SUPERVGUI_Cell*>(this))->getPairCell()->getTitle(),
278                         (dynamic_cast<SUPERVGUI_Cell*>(this))->getPairCell()->getTitle()->text());
279
280         }
281       }
282       // QToolTip::remove((dynamic_cast<SUPERVGUI_Cell*>(this))->getTitle());
283       QToolTip::add((dynamic_cast<SUPERVGUI_Cell*>(this))->getTitle(),
284                     (dynamic_cast<SUPERVGUI_Cell*>(this))->getTitle()->text());
285       QToolTip::add((dynamic_cast<SUPERVGUI_Cell*>(this))->getComponent(),
286                     (dynamic_cast<SUPERVGUI_Cell*>(this))->getComponent()->text());
287     }
288     else {  //Graph View
289       if (myNode->IsLoop() || myNode->IsSwitch()) { //for synchronic names changing
290         QString nm = myNode->Name();
291         if ( !nm.isEmpty() ) {
292           setNodeName(nm);
293           QString aStr(tr("ENDNODE_PREFIX"));
294           aStr+=nm;
295           (dynamic_cast<SUPERVGUI_StartControlNode*>(this))->getEndNode()->setNodeName(aStr);
296         }
297       }
298       else {
299         if (!(myNode->IsGOTO())) {
300           // QToolTip::remove((dynamic_cast<SUPERVGUI_ComputeNode*>(this))->getCommLabel());
301           QToolTip::add((dynamic_cast<SUPERVGUI_ComputeNode*>(this))->getCommLabel(),
302                         (dynamic_cast<SUPERVGUI_ComputeNode*>(this))->getCommLabel()->text());
303           QToolTip::add((dynamic_cast<SUPERVGUI_ComputeNode*>(this))->getTitleLabel(),
304                         (dynamic_cast<SUPERVGUI_ComputeNode*>(this))->getTitleLabel()->text());
305         }
306       }
307     }
308   }
309   /*    Trace("SUPERVGUI_Node::changeInformation")
310     if (Supervision.information(myNode, !myMain->isEditable())) {
311         myMain->syncAsync();
312         };*/
313 }
314
315 void SUPERVGUI_Node::configure() {
316     Trace("SUPERVGUI_Node::configure")
317     QMessageBox::warning(QAD_Application::getDesktop(),  tr("ERROR"), tr("MSG_NOT_IMPLEMENTED")); // kloss : a faire : lancer l'ihm DATA
318 }
319
320 void SUPERVGUI_Node::showPython() {
321     Trace("SUPERVGUI_Node::showPython")
322     SUPERVGUI_Python cp(myMain->getStudy()->get_PyInterp(), !myMain->isEditable());
323     cp.exec();
324 }
325
326 void SUPERVGUI_Node::showPopup(QMouseEvent* e) {
327   Trace("SUPERVGUI_Node::showPopup");
328   if (myMain->getDataflow()->IsExecuting())
329     myMain->showPopup(myRunPopup, e);
330   else
331     myMain->showPopup(myPopup, e);
332 }
333
334
335 void SUPERVGUI_Node::mousePressEvent(QMouseEvent* e) {
336   myMain->showPopup(myPopup, e);
337 }
338
339
340 bool SUPERVGUI_Node::isWarning() {
341     Trace("SUPERVGUI_Node::isWarning")
342     return(warning);
343 }
344
345 bool SUPERVGUI_Node::isStep() {
346     Trace("SUPERVGUI_Node::isStep")
347     return(step);
348 }
349
350 bool SUPERVGUI_Node::isTrace() {
351     Trace("SUPERVGUI_Node::isTrace")
352     return(trace);
353 }
354
355 bool SUPERVGUI_Node::isVerbose() {
356     Trace("SUPERVGUI_Node::isVerbose")
357     return(verbose);
358 }
359
360 void SUPERVGUI_Node::setWarning(bool b) {
361     Trace("SUPERVGUI_Node::setWarning")
362     warning = b;
363 }
364
365 void SUPERVGUI_Node::setStep(bool b) {
366     Trace("SUPERVGUI_Node::setStep")
367     step = b;
368 }
369
370 void SUPERVGUI_Node::setTrace(bool b) {
371     Trace("SUPERVGUI_Node::setTrace")
372     trace = b;
373 }
374
375 void SUPERVGUI_Node::setVerbose(bool b) {
376     Trace("SUPERVGUI_Node::setVerbose")
377     verbose = b;
378 }
379
380
381 void SUPERVGUI_Node::browse() {
382   if ( !aBrowseDlg ) {
383     aBrowseDlg = new SUPERVGUI_BrowseNodeDlg(this);
384     aBrowseDlg->installEventFilter( this );
385   }
386   if ( !aBrowseDlg->isVisible() )
387     aBrowseDlg->show();
388   else {
389     aBrowseDlg->raise();
390     aBrowseDlg->setActiveWindow();
391     aBrowseDlg->setFocus();
392   }
393 }
394
395 bool SUPERVGUI_Node::eventFilter( QObject* o, QEvent* e )
396 {
397   if ( o == aBrowseDlg && e->type() == QEvent::Close )
398     aBrowseDlg = 0;
399   return QFrame::eventFilter( o, e );
400 }
401
402
403 void SUPERVGUI_Node::setNodeName(QString aName) {
404   if ( myNode->SetName(aName.latin1())) {
405     setName(myNode->Name());
406     //myTitle->setText(aName);
407   } else 
408     QMessageBox::warning( QAD_Application::getDesktop(), tr( "ERROR" ), tr( "MSG_CANT_RENAMENODE" ) );
409 }
410
411
412 SUPERV_Port SUPERVGUI_Node::createInPort() {
413   SUPERVGUI_PortParamsDlg* aDlg = new SUPERVGUI_PortParamsDlg();
414   if (aDlg->exec()) {
415     if (aDlg->getName().isEmpty() || aDlg->getType().isEmpty()) {
416       QMessageBox::warning( QAD_Application::getDesktop(), tr( "ERROR" ), tr( "MSG_CANT_CREATE_PORT" ) );
417       return NULL;
418     }
419     SUPERV_INode aNode = getInlineNode();
420     if (SUPERV_isNull(aNode)) {
421       MESSAGE("SUPERVGUI_Node::createInPort: Node is wrong type");
422       return NULL;
423     }
424     SUPERV_Ports aPorts = aNode->Ports();
425     for (int i=0; i<aPorts->length(); i++) {
426       if (aDlg->getName() == QString(aPorts[i]->Name())){
427         QMessageBox::warning(0, tr("ERROR"), tr("MSG_PORT_EXIST"));
428         return NULL;
429       }
430     }
431     SUPERV_Port aPort = aNode->InPort(aDlg->getName().latin1(),
432                                       aDlg->getType().latin1());    
433     delete aDlg;
434     return aPort;
435   }
436   delete aDlg;
437   return NULL;
438 }
439
440
441 SUPERV_Port SUPERVGUI_Node::createOutPort() {
442   SUPERVGUI_PortParamsDlg* aDlg = new SUPERVGUI_PortParamsDlg();
443   if (aDlg->exec()) {
444     SUPERV_INode aNode = getInlineNode();
445     if (SUPERV_isNull(aNode)) {
446       MESSAGE("SUPERVGUI_Node::createInPort: Node is wrong type");
447       return NULL;
448     }
449     SUPERV_Ports aPorts = aNode->Ports();
450     for (int i=0; i<aPorts->length(); i++) {
451       if (aDlg->getName() == QString(aPorts[i]->Name())){
452         QMessageBox::warning(0, tr("ERROR"), tr("MSG_PORT_EXIST"));
453         return NULL;
454       }
455     }
456     SUPERV_Port aPort = aNode->OutPort(aDlg->getName().latin1(),
457                                        aDlg->getType().latin1());
458     delete aDlg;
459     return aPort;
460   }
461   delete aDlg;
462   return NULL;
463 }
464
465
466
467 void SUPERVGUI_Node::addInputPort() {
468   createInPort();
469 }
470
471
472 void SUPERVGUI_Node::addOutputPort() {
473   createOutPort();
474 }
475
476
477 void SUPERVGUI_Node::editFunction() {
478   if (getNodeType() == SUPERV::LoopNode) {
479     SUPERVGUI_EditPythonDlg* aDlg = new SUPERVGUI_EditPythonDlg(true);
480     SUPERV_LNode aLNode = getLoopNode();
481     aDlg->setInitFunction(aLNode->PyInit());
482     aDlg->setMoreFunction(aLNode->PyMore());
483     aDlg->setNextFunction(aLNode->PyNext());
484     if (aDlg->exec()) {
485       aLNode->SetPyInit(aDlg->getInitFuncName().latin1(), (aDlg->getInitFunction()).in());
486       aLNode->SetPyMore(aDlg->getMoreFuncName().latin1(), (aDlg->getMoreFunction()).in());
487       aLNode->SetPyNext(aDlg->getNextFuncName().latin1(), (aDlg->getNextFunction()).in());
488     }
489     delete aDlg;
490   } else {
491     SUPERVGUI_EditPythonDlg* aDlg = new SUPERVGUI_EditPythonDlg();
492     SUPERV_INode aINode = getInlineNode();
493     aDlg->setFunction(aINode->PyFunction());
494     if (aDlg->exec()) {
495       aINode->SetPyFunction(aDlg->getFuncName().latin1(), (aDlg->getFunction()).in());
496     }
497     delete aDlg;
498   }
499 }
500
501
502
503
504
505
506 /*!
507  * Port parameters dialog definition
508  */
509
510 static const char* MyTypeStrings[] = 
511   {"string", "boolean", "char", "short", "int", "long", "float", "double", "objref"};
512
513 SUPERVGUI_PortParamsDlg::SUPERVGUI_PortParamsDlg()
514   : QDialog(QAD_Application::getDesktop(), 0, true, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu  )
515 {
516   setSizeGripEnabled( true );
517   setCaption("Port parameters");
518
519   QGridLayout* aBaseLayout = new QGridLayout( this );
520   aBaseLayout->setMargin( 11 ); aBaseLayout->setSpacing( 6 );
521
522   QLabel* aNameLbl = new QLabel("Port Name", this );
523   aBaseLayout->addWidget(aNameLbl, 0, 0);
524
525   myNameTxt = new QLineEdit( this );
526   aNameLbl->setBuddy( myNameTxt );
527   aBaseLayout->addWidget(myNameTxt, 0, 1);
528   
529   QLabel* aTypeLbl = new QLabel("Value Type", this );
530   aBaseLayout->addWidget(aTypeLbl, 1, 0);
531  
532   myTypeTxt = new QComboBox( this );
533   aTypeLbl->setBuddy( myTypeTxt );
534   myTypeTxt->insertStrList( MyTypeStrings );
535   aBaseLayout->addWidget(myTypeTxt, 1, 1);
536  
537   QGroupBox* aBtnBox = new QGroupBox( this );
538   aBtnBox->setColumnLayout( 0, Qt::Vertical );
539   aBtnBox->layout()->setSpacing( 0 ); aBtnBox->layout()->setMargin( 0 );
540   QHBoxLayout* aBtnLayout = new QHBoxLayout( aBtnBox->layout() );
541   aBtnLayout->setAlignment( Qt::AlignTop );
542   aBtnLayout->setSpacing( 6 ); aBtnLayout->setMargin( 11 );
543
544   aBaseLayout->addMultiCellWidget( aBtnBox, 2, 2, 0, 1 );
545
546   QPushButton* aOKBtn = new QPushButton( tr( "BUT_OK" ), aBtnBox );
547   connect( aOKBtn, SIGNAL( clicked() ), this, SLOT( accept() ) );
548   aBtnLayout->addWidget( aOKBtn );
549
550   aBtnLayout->addStretch();
551
552   QPushButton* aCancelBtn = new QPushButton( tr("BUT_CANCEL"), aBtnBox );
553   connect( aCancelBtn, SIGNAL( clicked() ), this, SLOT( reject() ) );
554   aBtnLayout->addWidget( aCancelBtn );
555 }