Salome HOME
Point 2.8 of "SUPERVISOR: Current status - bugs/improvements":
[modules/superv.git] / src / SUPERVGUI / SUPERVGUI_CanvasNode.cxx
1 //  SUPERV SUPERVGUI : GUI for Supervisor component
2 //
3 //  Copyright (C) 2003  OPEN CASCADE
4 //
5 //  File   : SUPERVGUI_CanvasNode.cxx
6 //  Author : Natalia KOPNOVA
7 //  Module : SUPERV
8
9 using namespace std;
10 #include "SUPERVGUI_CanvasNode.h"
11 #include "SUPERVGUI_CanvasNodePrs.h"
12 #include "SUPERVGUI_CanvasPort.h"
13 #include "SUPERVGUI_Main.h"
14 #include "SUPERVGUI.h"
15 #include "SUPERVGUI_BrowseNodeDlg.h"
16 #include "SUPERVGUI_ManagePortsDlg.h"
17 #include "SALOMEGUI_NameDlg.h"
18 #include "SUPERVGUI_Information.h"
19 /*
20 #include "SUPERVGUI_CanvasControlNode.h"
21
22 #include <qtooltip.h>
23 */
24
25 SUPERVGUI_CanvasNode::SUPERVGUI_CanvasNode(QObject* theParent, SUPERVGUI_Main* theMain, SUPERV_CNode theNode, bool theIsCell):
26     QObject(theParent),
27     myMain(theMain),
28     myNode(theNode),
29     myPrs(0),
30     myDestroyed(false),
31     warning(true),
32     step(true),
33     trace(true),
34     verbose(true),
35     myBrowseDlg(0)
36 {
37   Trace("SUPERVGUI_CanvasNode::SUPERVGUI_CanvasNode");
38
39   setName(myNode->Name());
40
41   QString aComment(myNode->Comment());
42   QString aNewComment = aComment;
43   if (getNodeType() == SUPERV::FactoryNode) {
44     aNewComment = QString(myNode->Service()->ServiceName) +
45       QString(tr("COMMENT_FROM")) +
46       QString(getFactoryNode()->GetComponentName());
47   }
48   else if (myNode->IsMacro()) {
49     aNewComment = tr("COMMENT_MNODE");
50   }
51   else {
52     aNewComment = tr("COMMENT_CNODE");
53   }
54   if (aComment.isEmpty()) {
55     myNode->SetComment(aNewComment.latin1());
56   }
57
58   myLabelText = aNewComment;
59
60   // create node ports
61   isIgnore = true;
62   //cout << "     get port list... " ;
63   SUPERV_Ports aPortList = myNode->Ports();
64   //cout << aPortList->length() << endl;
65   for (int i = 0; i < aPortList->length(); i++) {
66     createPort(aPortList[i].in());
67   }
68
69   //cout << "     get stream port list... " ;
70   SUPERV_StreamPorts aStreamPortList = myNode->StreamPorts();
71   //cout << aStreamPortList->length() << endl;
72   for (int i = 0; i < aStreamPortList->length(); i++) {
73     createStreamPort(aStreamPortList[i].in());
74   }
75
76   isIgnore = false;
77
78   QCanvasItemList anIL2 = ((QCanvas*)parent())->allItems();
79   cout<<" ===> 1 conatructor CanvasNode : CanvasArray has "<<anIL2.count()<<" children!"<<endl;
80 }
81
82 SUPERVGUI_CanvasNode::~SUPERVGUI_CanvasNode()
83 {
84   isIgnore = true;
85   if (myPrs) delete myPrs;
86 }
87
88 void SUPERVGUI_CanvasNode::setDestroyed()
89 {
90   myDestroyed = true;
91   getPrs()->hide();
92 }
93
94 SUPERVGUI_CanvasNodePrs* SUPERVGUI_CanvasNode::getPrs() const
95 {
96   if (myPrs == 0) {
97     ((SUPERVGUI_CanvasNode*)this)->myPrs = createPrs();
98   }
99   return myPrs;
100 }
101
102 SUPERVGUI_CanvasNodePrs* SUPERVGUI_CanvasNode::createPrs() const
103 {
104   return new SUPERVGUI_CanvasNodePrs(myMain->getCanvas(), (SUPERVGUI_CanvasNode*)this);
105 }
106
107 void SUPERVGUI_CanvasNode::createPort(SUPERV::Port_ptr thePort) const
108 {
109   SUPERVGUI_CanvasPort* aPort = 0;
110   if (thePort->IsInput())
111     aPort = new SUPERVGUI_CanvasPortIn((SUPERVGUI_CanvasNode*)this, myMain, thePort);
112   else
113     aPort = new SUPERVGUI_CanvasPortOut((SUPERVGUI_CanvasNode*)this, myMain, thePort);
114
115   if (aPort) {
116     connect(aPort, SIGNAL(destroyed(QObject*)), this, SLOT(onDestroyed(QObject*)));
117     if (!isIgnore) getPrs()->updatePorts();
118   }
119 }
120
121 void SUPERVGUI_CanvasNode::createStreamPort(SUPERV::StreamPort_ptr thePort) const
122 {
123   SUPERVGUI_CanvasPort* aPort = 0;
124   if (thePort->IsInput())
125     aPort = new SUPERVGUI_CanvasStreamPortIn((SUPERVGUI_CanvasNode*)this, myMain, thePort);
126   else
127     aPort = new SUPERVGUI_CanvasStreamPortOut((SUPERVGUI_CanvasNode*)this, myMain, thePort);
128
129   if (aPort) {
130     connect(aPort, SIGNAL(destroyed(QObject*)), this, SLOT(onDestroyed(QObject*)));
131     if (!isIgnore) getPrs()->updatePorts();
132   }
133 }
134
135 void SUPERVGUI_CanvasNode::onDestroyed(QObject* theObject)
136 {
137   if (!isIgnore) {
138     removeChild(theObject); // signal is sent before removing the object
139     getPrs()->updatePorts();
140   }
141 }
142
143 QPopupMenu* SUPERVGUI_CanvasNode::getPopupMenu(QWidget* theParent) 
144 {
145   QPopupMenu* popup = new QPopupMenu(theParent);
146   if (myMain->getDataflow()->IsExecuting()) {
147     popup->insertItem((myNode->IsSuspended()?tr("MSG_RESUME"):tr("MSG_SUSPEND")),
148                       this, SLOT(suspendResume()));
149     popup->insertItem(tr("MSG_KILL"), this, SLOT(kill()));
150   }
151   else {
152     if (myMain->isEditable() && getNodeType() != SUPERV::EndLoopNode
153                              && getNodeType() != SUPERV::EndSwitchNode) {
154       popup->insertItem(tr("MSG_RENAME"), this, SLOT(rename()));
155       myDeleteItem = popup->insertItem(tr("MSG_DELETE"), this, SLOT(remove()));
156       popup->insertSeparator();
157     }
158     popup->insertItem(tr("MSG_BROWSE"), this, SLOT(browse()));
159
160     if (getNodeType() != SUPERV::EndLoopNode && 
161         getNodeType() != SUPERV::EndSwitchNode)
162       popup->insertItem(tr("MSG_CHANGE_INFO"), this, SLOT(changeInformation()));
163
164     popup->insertSeparator();
165     popup->insertItem( tr( "MNU_EDIT_FUNC" ), this, SLOT(editFunction()));
166     
167     if (myMain->isEditable() && getNodeType() != SUPERV::FactoryNode
168                              && getNodeType() != SUPERV::ComputingNode
169                              && getNodeType() != SUPERV::EndLoopNode
170                              && getNodeType() != SUPERV::MacroNode) {
171       QPopupMenu* addPortMenu = new QPopupMenu(theParent);
172       addPortMenu->insertItem( tr( "MNU_INPUT" ), this, SLOT(addInputPort()));
173       if (getNodeType() != SUPERV::LoopNode)
174         addPortMenu->insertItem( tr( "MNU_OUTPUT" ), this, SLOT(addOutputPort()));
175       
176       popup->insertItem( tr( "MNU_ADD_PORT" ), addPortMenu);
177       popup->insertItem( tr( "MNU_MANAGE_PORTS" ), this, SLOT(managePorts()));
178     }
179   }
180
181   return popup;
182 }
183
184 void SUPERVGUI_CanvasNode::show() 
185 {
186   getPrs()->show();
187 }
188
189 void SUPERVGUI_CanvasNode::showAll() 
190 {
191   getPrs()->showAll();
192 }
193
194 void SUPERVGUI_CanvasNode::hideAll() 
195 {
196   getPrs()->hideAll();
197 }
198
199 void SUPERVGUI_CanvasNode::switchLabel()
200 {
201   getPrs()->setLabelVisible(!getPrs()->isLabelVisible());
202 }
203
204 void SUPERVGUI_CanvasNode::switchPorts()
205 {
206   getPrs()->setPortVisible(!getPrs()->isPortVisible());
207 }
208
209 void SUPERVGUI_CanvasNode::move(int x, int y)
210 {
211   //  myNode->Coords(x, y); //  <<<- done inside Prs to reflect item movement by mouse press
212   if (x > GRAPH_MAX) x = (int) getPrs()->x();
213   if (y > GRAPH_MAX) y = (int) getPrs()->y();
214   getPrs()->move(x, y);
215 }
216
217 void SUPERVGUI_CanvasNode::merge() 
218 {
219   //MESSAGE("===> SUPERVGUI_CanvasNode::merge() " << myNode->Name());
220   // synchronize port list
221   bool update = false;
222   isIgnore = true;
223   SUPERVGUI_CanvasPort* aPort;
224   QObjectList* aPortList = queryList("SUPERVGUI_CanvasPort");
225   //cout << "     get port list... " ;
226   SUPERV_Ports aPorts = myNode->Ports();
227   //cout << aPorts->length() << endl;
228   for (int i = 0; i < aPorts->length(); i++) {
229     aPort = (SUPERVGUI_CanvasPort*) 
230       child(myMain->getCanvas()->getPortName(aPorts[i].in()), "SUPERVGUI_CanvasPort");
231     if (aPort) {
232   //cout << "     update port " << aPort->name() << endl;
233       aPortList->removeRef(aPort);
234       aPort->update();
235     }
236     else {
237   //cout << "     create port " << myMain->getCanvas()->getPortName(aPorts[i].in()) << endl;
238       createPort(aPorts[i].in());
239       update = true;
240     }
241   }
242
243   //cout << "     get stream port list... " ;
244   SUPERV_StreamPorts aStreamPorts = myNode->StreamPorts();
245   //cout << aStreamPorts->length() << endl;
246   for (int i = 0; i < aStreamPorts->length(); i++) {
247     aPort = (SUPERVGUI_CanvasPort*) 
248       child(myMain->getCanvas()->getPortName(aStreamPorts[i].in()), "SUPERVGUI_CanvasPort");
249     if (aPort) {
250   //cout << "     update stream port " << aPort->name() << endl;
251       aPortList->removeRef(aPort);
252       aPort->update();
253     }
254     else {
255   //cout << "     create stream port " << myMain->getCanvas()->getPortName(aStreamPorts[i].in()) << endl;
256       createPort(aStreamPorts[i].in());
257       update = true;
258     }
259   }
260
261   //cout << "     remove inexistant " << endl;
262   QObjectListIt it(*aPortList);
263   while ((aPort=(SUPERVGUI_CanvasPort*)it.current()) != 0) {
264     ++it;
265     aPortList->removeRef(aPort);
266     delete aPort;
267     update = true;
268   }
269   delete aPortList;
270   isIgnore = false;
271   if (update) getPrs()->updatePorts();
272
273   sync(); // update node state also
274 }
275
276 void SUPERVGUI_CanvasNode::sync()  {
277   //MESSAGE("===> SUPERVGUI_CanvasNode::sync() " << myNode->Name() << ", state " << myNode->State());
278
279   const bool isExecuting = myMain->getDataflow()->IsExecuting();
280   //if myNode is a MacroNode then set it state to state of its subgraph
281   if ( myNode->IsMacro() && isExecuting ) {
282     // get SubGraph from MacroNode
283     SUPERV_Graph aMacro = SUPERV::Graph::_narrow(myNode);
284     if (!SUPERV_isNull(aMacro)) {
285       SUPERV_Graph aGraph;
286       if (aMacro->IsStreamMacro())
287         aGraph = aMacro->StreamObjRef();
288       else
289         aGraph = aMacro->FlowObjRef();
290       if (!SUPERV_isNull(aGraph)) {
291         if (aGraph->State() != SUPERV::UndefinedState && aGraph->State() != SUPERV::NoState)
292           getPrs()->setState(aGraph->State());
293         else 
294           getPrs()->setState(myNode->State());
295       }
296     }
297   }
298   else {
299     SUPERV::GraphState aState = myNode->State();
300
301     // asv : 18.11.04 : fix for 6170 : after execution is finished, nodes' status must be reset.
302     // asv : 13.12.04 : commented out setting EditingState.  See 2.21.
303     //if ( !isExecuting && myMain->IsGUIEventLoopFinished() && (aState == SUPERV::DoneState || 
304     //  aState == SUPERV::KillState || aState == SUPERV::StopState ) )
305     //  aState = SUPERV::EditingState;
306     getPrs()->setState(aState);
307   }
308   
309   // update child ports
310   const QObjectList* list = children();
311   if (list) {
312     QObjectListIt it(*list);
313     while (QObject* obj = it.current()) {
314       ++it;
315       if (obj->inherits("SUPERVGUI_CanvasPort")) {
316         ((SUPERVGUI_CanvasPort*)obj)->sync();
317       }
318     }
319   }
320 }
321
322 void SUPERVGUI_CanvasNode::syncOnEvent(SUPERV::GraphState theStateFromEvent) 
323 {
324   getPrs()->setState(theStateFromEvent);
325 }
326
327 bool SUPERVGUI_CanvasNode::setNodeName(QString aName)  {
328   bool result = myNode->SetName(aName.latin1());
329   if (result) {
330     setName(myNode->Name());
331     getPrs()->updateInfo();
332     // TODO: update name of all the links to this node
333   } 
334   else {
335     QMessageBox::warning( QAD_Application::getDesktop(), tr( "ERROR" ), tr( "MSG_CANT_RENAMENODE" ) );
336   }
337   return result;
338 }
339
340 void SUPERVGUI_CanvasNode::rename()  {
341   QString aName = SALOMEGUI_NameDlg::getName(QAD_Application::getDesktop(), myNode->Name());
342   if (!aName.isEmpty()) {
343     setNodeName(aName);
344   }
345 }
346
347 void SUPERVGUI_CanvasNode::remove() {
348   myMain->Editing(); // PAL6170: GUI->Engine: setting "Editing" flag 
349
350   Trace("SUPERVGUI_CanvasNode::remove");
351   SUPERVGUI_Canvas* aCanvas = myMain->getCanvas();
352   setDestroyed();
353   myNode->destroy();
354   delete this;
355   aCanvas->update();
356 }
357
358 void SUPERVGUI_CanvasNode::suspendResume() {
359   Trace("SUPERVGUI_CanvasNode::suspendResume");
360   int n = queryList("SUPERVGUI_CanvasNode")->count(); 
361   if (myNode->IsSuspended()) {
362     if (!((n==1)? myMain->getDataflow()->Resume() : myNode->Resume())) {
363       QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_RESUMENODE"));
364     }
365     else {
366       sync();
367       myMain->getMyThread()->startThread(tr("MSG_NODE_RESUMED1")+myNode->Name()+tr("MSG_NODE_RESUMED2"));
368     }
369   } else {
370     if (!((n==1)? myMain->getDataflow()->Suspend() : myNode->Suspend())) {
371       QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_SUSPENDNODE"));
372     } else {
373       syncOnEvent(SUPERV::SuspendReadyState);
374       myMain->getMyThread()->stopThread(tr("MSG_NODE_SUSPENDED1")+myNode->Name()+tr("MSG_NODE_SUSPENDED2"));
375     }
376   }
377 }
378
379 void SUPERVGUI_CanvasNode::kill() {
380   Trace("SUPERVGUI_CanvasNode::kill");
381   int n = queryList("SUPERVGUI_CanvasNode")->count(); 
382   if (!((n==1)? myMain->getDataflow()->Kill() : myNode->Kill())) {
383     QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_KILLNODE"));
384   } else {
385     syncOnEvent(SUPERV_Kill);
386     myMain->getMyThread()->stopThread(tr("MSG_NODE_KILLED1")+myNode->Name()+tr("MSG_NODE_KILLED2"));
387   }
388 }
389 /* asv : 15.12.04 : commented out stopRestart() in Main and CanvasNode because it's not called from anywhere,
390    the comment from kloss (in Main.cxx) may be explaining it, but it's in French and I do not understand it..
391 void SUPERVGUI_CanvasNode::stopRestart() {
392   Trace("SUPERVGUI_CanvasNode::stopRestart");
393   
394   int n = queryList("SUPERVGUI_CanvasNode")->count(); 
395   if ((myNode->State() == SUPERV_Stop) || (myNode->State() == SUPERV_Kill)) {
396     if (!((n==1)? myMain->getDataflow()->Run() : myNode->ReStart())) {
397       QMessageBox::warning(QAD_Application::getDesktop(),  tr("ERROR"), tr("MSG_CANT_RESTARTNODE"));
398     }
399   } else {
400     if (!((n==1)? myMain->getDataflow()->Stop() : myNode->Stop())) {
401       QMessageBox::warning(QAD_Application::getDesktop(),  tr("ERROR"), tr("MSG_CANT_STOPNODE"));
402     }
403   }
404 }
405 */
406 void SUPERVGUI_CanvasNode::changeInformation() {
407   SUPERVGUI_Information* aDlg = new SUPERVGUI_Information(myNode, !myMain->isEditable());
408   if (aDlg->exec()) {
409     QString aName = myNode->Name();
410     if (!aName.isEmpty() && myMain->isEditable())
411       setNodeName(aName);
412   }
413   delete aDlg;
414 }
415
416 /* asv : 13.12.04 : The functions below are not called from anywhere, so commenting them out...
417 void SUPERVGUI_CanvasNode::configure() 
418 {
419   Trace("SUPERVGUI_CanvasNode::configure");
420   QMessageBox::warning(QAD_Application::getDesktop(),  tr("ERROR"), tr("MSG_NOT_IMPLEMENTED")); // kloss : a faire : lancer l'ihm DATA
421 }
422
423 void SUPERVGUI_CanvasNode::showPython() 
424 {
425   Trace("SUPERVGUI_CanvasNode::showPython");
426   SUPERVGUI_Python cp(myMain->getStudy()->get_PyInterp(), !myMain->isEditable());
427   cp.exec();
428 }
429 */
430
431 bool SUPERVGUI_CanvasNode::isWarning() 
432 {
433   Trace("SUPERVGUI_CanvasNode::isWarning");
434   return(warning);
435 }
436
437 bool SUPERVGUI_CanvasNode::isStep() 
438 {
439   Trace("SUPERVGUI_CanvasNode::isStep");
440   return(step);
441 }
442
443 bool SUPERVGUI_CanvasNode::isTrace() 
444 {
445   Trace("SUPERVGUI_CanvasNode::isTrace");
446   return(trace);
447 }
448
449 bool SUPERVGUI_CanvasNode::isVerbose() 
450 {
451   Trace("SUPERVGUI_CanvasNode::isVerbose");
452   return(verbose);
453 }
454
455 void SUPERVGUI_CanvasNode::setWarning(bool b) 
456 {
457   Trace("SUPERVGUI_CanvasNode::setWarning");
458   warning = b;
459 }
460
461 void SUPERVGUI_CanvasNode::setStep(bool b) 
462 {
463   Trace("SUPERVGUI_CanvasNode::setStep");
464   step = b;
465 }
466
467 void SUPERVGUI_CanvasNode::setTrace(bool b) 
468 {
469   Trace("SUPERVGUI_CanvasNode::setTrace");
470   trace = b;
471 }
472
473 void SUPERVGUI_CanvasNode::setVerbose(bool b) 
474 {
475   Trace("SUPERVGUI_CanvasNode::setVerbose");
476   verbose = b;
477 }
478
479
480 void SUPERVGUI_CanvasNode::browse() 
481 {
482   myMain->Editing(); // PAL6170: GUI->Engine: setting "Editing" flag 
483   if (!myBrowseDlg) {
484     myBrowseDlg = new SUPERVGUI_BrowseNodeDlg(this);
485     myBrowseDlg->installEventFilter(this);
486   }
487   if (!myBrowseDlg->isVisible())
488     myBrowseDlg->show();
489   else {
490     myBrowseDlg->raise();
491     myBrowseDlg->setActiveWindow();
492     myBrowseDlg->setFocus();
493   }
494 }
495
496 bool SUPERVGUI_CanvasNode::eventFilter( QObject* o, QEvent* e )
497 {
498   if (o == myBrowseDlg && e->type() == QEvent::Close)
499     myBrowseDlg = 0;
500   return QObject::eventFilter(o, e);
501 }
502
503 QStringList SUPERVGUI_CanvasNode::getPortsNamesIN(SUPERV_INode theNode, bool theInputPorts)
504 {
505   QStringList aPNList;
506   if (!SUPERV_isNull(theNode)) {
507     SUPERV_Ports aPorts = theNode->Ports();
508     for (int i=0; i<aPorts->length(); i++) {
509       if (theInputPorts) {
510         if (aPorts[i]->IsInput()) aPNList.append(QString(aPorts[i]->Name()));
511       }
512       else 
513         if (!aPorts[i]->IsInput()) aPNList.append(QString(aPorts[i]->Name()));
514     }
515   }
516   return aPNList;
517 }
518
519 SUPERV_Port SUPERVGUI_CanvasNode::createInPort() 
520 {
521   SUPERV_INode aNode = getInlineNode();
522   if (SUPERV_isNull(aNode)) {
523     MESSAGE("SUPERVGUI_CanvasNode::createInPort: Node is wrong type");
524     return NULL;
525   }
526   SUPERVGUI_PortParamsDlg* aDlg = new SUPERVGUI_PortParamsDlg(getPortsNamesIN(aNode,true));
527   if (aDlg->exec()) {
528     SUPERV_Port aPort = aNode->InPort(aDlg->getName().latin1(),
529                                       aDlg->getType().latin1());    
530     delete aDlg;
531     return aPort;
532   }
533   delete aDlg;
534   return NULL;
535 }
536
537 SUPERV_Port SUPERVGUI_CanvasNode::createOutPort() 
538 {
539   SUPERV_INode aNode = getInlineNode();
540   if (SUPERV_isNull(aNode)) {
541     MESSAGE("SUPERVGUI_CanvasNode::createOutPort: Node is wrong type");
542     return NULL;
543   }
544   
545   SUPERVGUI_PortParamsDlg* aDlg = new SUPERVGUI_PortParamsDlg(getPortsNamesIN(aNode,false));
546   if (aDlg->exec()) {
547     SUPERV_Port aPort = aNode->OutPort(aDlg->getName().latin1(),
548                                        aDlg->getType().latin1());
549     delete aDlg;
550     return aPort;
551   }
552   delete aDlg;
553   return NULL;
554 }
555
556 void SUPERVGUI_CanvasNode::addInputPort() {
557   myMain->Editing(); // PAL6170: GUI->Engine: setting "Editing" flag 
558
559   SUPERV_Port aPort = createInPort();
560   if (aPort == NULL) return;
561
562   createPort(aPort.in());
563 }
564
565
566 void SUPERVGUI_CanvasNode::addOutputPort() {
567   myMain->Editing(); // PAL6170: GUI->Engine: setting "Editing" flag 
568
569   SUPERV_Port aPort = createOutPort();
570   if (aPort == NULL) return;
571
572   createPort(aPort.in());
573 }
574
575
576 void SUPERVGUI_CanvasNode::editFunction()  {
577   myMain->Editing(); // PAL6170: GUI->Engine: setting "Editing" flag 
578
579   if (getNodeType() == SUPERV::LoopNode) {
580     SUPERVGUI_EditPythonDlg* aDlg = new SUPERVGUI_EditPythonDlg(true);
581     SUPERV_LNode aLNode = getLoopNode();
582     aDlg->setInitFunction(aLNode->PyInit());
583     aDlg->setMoreFunction(aLNode->PyMore());
584     aDlg->setNextFunction(aLNode->PyNext());
585     if (aDlg->exec()) {
586       aLNode->SetPyInit(aDlg->getInitFuncName().latin1(), (aDlg->getInitFunction()).in());
587       aLNode->SetPyMore(aDlg->getMoreFuncName().latin1(), (aDlg->getMoreFunction()).in());
588       aLNode->SetPyNext(aDlg->getNextFuncName().latin1(), (aDlg->getNextFunction()).in());
589     }
590     delete aDlg;
591   } 
592   else {
593     SUPERVGUI_EditPythonDlg* aDlg = new SUPERVGUI_EditPythonDlg();
594     SUPERV_INode aINode = getInlineNode();
595     aDlg->setFunction(aINode->PyFunction());
596     if (aDlg->exec()) {
597       aINode->SetPyFunction(aDlg->getFuncName().latin1(), (aDlg->getFunction()).in());
598     }
599     delete aDlg;
600   }
601 }
602
603 /** 
604  * Called on "Edit ports" popup menu command. See SUPERVGUI_ManagePortsDlg.h
605  * for detailed description of the functionality
606  */
607 void SUPERVGUI_CanvasNode::managePorts() {
608   myMain->Editing(); // PAL6170: GUI->Engine: setting "Editing" flag 
609
610   SUPERVGUI_ManagePortsDlg* aDlg = new SUPERVGUI_ManagePortsDlg( this );
611   aDlg->exec();
612   delete aDlg;
613 }