1 // SUPERV SUPERVGUI : GUI for Supervisor component
3 // Copyright (C) 2003 OPEN CASCADE
5 // File : SUPERVGUI_CanvasNode.cxx
6 // Author : Natalia KOPNOVA
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"
20 #include "SUPERVGUI_CanvasControlNode.h"
25 SUPERVGUI_CanvasNode::SUPERVGUI_CanvasNode(QObject* theParent, SUPERVGUI_Main* theMain, SUPERV_CNode theNode, bool theIsCell):
37 Trace("SUPERVGUI_CanvasNode::SUPERVGUI_CanvasNode");
39 setName(myNode->Name());
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());
48 else if (myNode->IsMacro()) {
49 aNewComment = tr("COMMENT_MNODE");
52 aNewComment = tr("COMMENT_CNODE");
54 if (aComment.isEmpty()) {
55 myNode->SetComment(aNewComment.latin1());
58 myLabelText = aNewComment;
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());
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());
78 QCanvasItemList anIL2 = ((QCanvas*)parent())->allItems();
79 cout<<" ===> 1 conatructor CanvasNode : CanvasArray has "<<anIL2.count()<<" children!"<<endl;
82 SUPERVGUI_CanvasNode::~SUPERVGUI_CanvasNode()
85 if (myPrs) delete myPrs;
88 void SUPERVGUI_CanvasNode::setDestroyed()
94 SUPERVGUI_CanvasNodePrs* SUPERVGUI_CanvasNode::getPrs() const
97 ((SUPERVGUI_CanvasNode*)this)->myPrs = createPrs();
102 SUPERVGUI_CanvasNodePrs* SUPERVGUI_CanvasNode::createPrs() const
104 return new SUPERVGUI_CanvasNodePrs(myMain->getCanvas(), (SUPERVGUI_CanvasNode*)this);
107 void SUPERVGUI_CanvasNode::createPort(SUPERV::Port_ptr thePort) const
109 SUPERVGUI_CanvasPort* aPort = 0;
110 if (thePort->IsInput())
111 aPort = new SUPERVGUI_CanvasPortIn((SUPERVGUI_CanvasNode*)this, myMain, thePort);
113 aPort = new SUPERVGUI_CanvasPortOut((SUPERVGUI_CanvasNode*)this, myMain, thePort);
116 connect(aPort, SIGNAL(destroyed(QObject*)), this, SLOT(onDestroyed(QObject*)));
117 if (!isIgnore) getPrs()->updatePorts();
121 void SUPERVGUI_CanvasNode::createStreamPort(SUPERV::StreamPort_ptr thePort) const
123 SUPERVGUI_CanvasPort* aPort = 0;
124 if (thePort->IsInput())
125 aPort = new SUPERVGUI_CanvasStreamPortIn((SUPERVGUI_CanvasNode*)this, myMain, thePort);
127 aPort = new SUPERVGUI_CanvasStreamPortOut((SUPERVGUI_CanvasNode*)this, myMain, thePort);
130 connect(aPort, SIGNAL(destroyed(QObject*)), this, SLOT(onDestroyed(QObject*)));
131 if (!isIgnore) getPrs()->updatePorts();
135 void SUPERVGUI_CanvasNode::onDestroyed(QObject* theObject)
138 removeChild(theObject); // signal is sent before removing the object
139 getPrs()->updatePorts();
143 QPopupMenu* SUPERVGUI_CanvasNode::getPopupMenu(QWidget* theParent)
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()));
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();
158 popup->insertItem(tr("MSG_BROWSE"), this, SLOT(browse()));
160 if (getNodeType() != SUPERV::EndLoopNode &&
161 getNodeType() != SUPERV::EndSwitchNode)
162 popup->insertItem(tr("MSG_CHANGE_INFO"), this, SLOT(changeInformation()));
164 popup->insertSeparator();
165 popup->insertItem( tr( "MNU_EDIT_FUNC" ), this, SLOT(editFunction()));
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()));
176 popup->insertItem( tr( "MNU_ADD_PORT" ), addPortMenu);
177 popup->insertItem( tr( "MNU_MANAGE_PORTS" ), this, SLOT(managePorts()));
184 void SUPERVGUI_CanvasNode::show()
189 void SUPERVGUI_CanvasNode::showAll()
194 void SUPERVGUI_CanvasNode::hideAll()
199 void SUPERVGUI_CanvasNode::switchLabel()
201 getPrs()->setLabelVisible(!getPrs()->isLabelVisible());
204 void SUPERVGUI_CanvasNode::switchPorts()
206 getPrs()->setPortVisible(!getPrs()->isPortVisible());
209 void SUPERVGUI_CanvasNode::move(int x, int y)
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);
217 void SUPERVGUI_CanvasNode::merge()
219 //MESSAGE("===> SUPERVGUI_CanvasNode::merge() " << myNode->Name());
220 // synchronize port list
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");
232 //cout << " update port " << aPort->name() << endl;
233 aPortList->removeRef(aPort);
237 //cout << " create port " << myMain->getCanvas()->getPortName(aPorts[i].in()) << endl;
238 createPort(aPorts[i].in());
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");
250 //cout << " update stream port " << aPort->name() << endl;
251 aPortList->removeRef(aPort);
255 //cout << " create stream port " << myMain->getCanvas()->getPortName(aStreamPorts[i].in()) << endl;
256 createPort(aStreamPorts[i].in());
261 //cout << " remove inexistant " << endl;
262 QObjectListIt it(*aPortList);
263 while ((aPort=(SUPERVGUI_CanvasPort*)it.current()) != 0) {
265 aPortList->removeRef(aPort);
271 if (update) getPrs()->updatePorts();
273 sync(); // update node state also
276 void SUPERVGUI_CanvasNode::sync() {
277 //MESSAGE("===> SUPERVGUI_CanvasNode::sync() " << myNode->Name() << ", state " << myNode->State());
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)) {
286 if (aMacro->IsStreamMacro())
287 aGraph = aMacro->StreamObjRef();
289 aGraph = aMacro->FlowObjRef();
290 if (!SUPERV_isNull(aGraph)) {
291 if (aGraph->State() != SUPERV::UndefinedState && aGraph->State() != SUPERV::NoState)
292 getPrs()->setState(aGraph->State());
294 getPrs()->setState(myNode->State());
299 SUPERV::GraphState aState = myNode->State();
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);
309 // update child ports
310 const QObjectList* list = children();
312 QObjectListIt it(*list);
313 while (QObject* obj = it.current()) {
315 if (obj->inherits("SUPERVGUI_CanvasPort")) {
316 ((SUPERVGUI_CanvasPort*)obj)->sync();
322 void SUPERVGUI_CanvasNode::syncOnEvent(SUPERV::GraphState theStateFromEvent)
324 getPrs()->setState(theStateFromEvent);
327 bool SUPERVGUI_CanvasNode::setNodeName(QString aName) {
328 bool result = myNode->SetName(aName.latin1());
330 setName(myNode->Name());
331 getPrs()->updateInfo();
332 // TODO: update name of all the links to this node
335 QMessageBox::warning( QAD_Application::getDesktop(), tr( "ERROR" ), tr( "MSG_CANT_RENAMENODE" ) );
340 void SUPERVGUI_CanvasNode::rename() {
341 QString aName = SALOMEGUI_NameDlg::getName(QAD_Application::getDesktop(), myNode->Name());
342 if (!aName.isEmpty()) {
347 void SUPERVGUI_CanvasNode::remove() {
348 myMain->Editing(); // PAL6170: GUI->Engine: setting "Editing" flag
350 Trace("SUPERVGUI_CanvasNode::remove");
351 SUPERVGUI_Canvas* aCanvas = myMain->getCanvas();
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"));
367 myMain->getMyThread()->startThread(tr("MSG_NODE_RESUMED1")+myNode->Name()+tr("MSG_NODE_RESUMED2"));
370 if (!((n==1)? myMain->getDataflow()->Suspend() : myNode->Suspend())) {
371 QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_SUSPENDNODE"));
373 syncOnEvent(SUPERV::SuspendReadyState);
374 myMain->getMyThread()->stopThread(tr("MSG_NODE_SUSPENDED1")+myNode->Name()+tr("MSG_NODE_SUSPENDED2"));
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"));
385 syncOnEvent(SUPERV_Kill);
386 myMain->getMyThread()->stopThread(tr("MSG_NODE_KILLED1")+myNode->Name()+tr("MSG_NODE_KILLED2"));
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");
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"));
400 if (!((n==1)? myMain->getDataflow()->Stop() : myNode->Stop())) {
401 QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_STOPNODE"));
406 void SUPERVGUI_CanvasNode::changeInformation() {
407 SUPERVGUI_Information* aDlg = new SUPERVGUI_Information(myNode, !myMain->isEditable());
409 QString aName = myNode->Name();
410 if (!aName.isEmpty() && myMain->isEditable())
416 /* asv : 13.12.04 : The functions below are not called from anywhere, so commenting them out...
417 void SUPERVGUI_CanvasNode::configure()
419 Trace("SUPERVGUI_CanvasNode::configure");
420 QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_NOT_IMPLEMENTED")); // kloss : a faire : lancer l'ihm DATA
423 void SUPERVGUI_CanvasNode::showPython()
425 Trace("SUPERVGUI_CanvasNode::showPython");
426 SUPERVGUI_Python cp(myMain->getStudy()->get_PyInterp(), !myMain->isEditable());
431 bool SUPERVGUI_CanvasNode::isWarning()
433 Trace("SUPERVGUI_CanvasNode::isWarning");
437 bool SUPERVGUI_CanvasNode::isStep()
439 Trace("SUPERVGUI_CanvasNode::isStep");
443 bool SUPERVGUI_CanvasNode::isTrace()
445 Trace("SUPERVGUI_CanvasNode::isTrace");
449 bool SUPERVGUI_CanvasNode::isVerbose()
451 Trace("SUPERVGUI_CanvasNode::isVerbose");
455 void SUPERVGUI_CanvasNode::setWarning(bool b)
457 Trace("SUPERVGUI_CanvasNode::setWarning");
461 void SUPERVGUI_CanvasNode::setStep(bool b)
463 Trace("SUPERVGUI_CanvasNode::setStep");
467 void SUPERVGUI_CanvasNode::setTrace(bool b)
469 Trace("SUPERVGUI_CanvasNode::setTrace");
473 void SUPERVGUI_CanvasNode::setVerbose(bool b)
475 Trace("SUPERVGUI_CanvasNode::setVerbose");
480 void SUPERVGUI_CanvasNode::browse()
482 myMain->Editing(); // PAL6170: GUI->Engine: setting "Editing" flag
484 myBrowseDlg = new SUPERVGUI_BrowseNodeDlg(this);
485 myBrowseDlg->installEventFilter(this);
487 if (!myBrowseDlg->isVisible())
490 myBrowseDlg->raise();
491 myBrowseDlg->setActiveWindow();
492 myBrowseDlg->setFocus();
496 bool SUPERVGUI_CanvasNode::eventFilter( QObject* o, QEvent* e )
498 if (o == myBrowseDlg && e->type() == QEvent::Close)
500 return QObject::eventFilter(o, e);
503 QStringList SUPERVGUI_CanvasNode::getPortsNamesIN(SUPERV_INode theNode, bool theInputPorts)
506 if (!SUPERV_isNull(theNode)) {
507 SUPERV_Ports aPorts = theNode->Ports();
508 for (int i=0; i<aPorts->length(); i++) {
510 if (aPorts[i]->IsInput()) aPNList.append(QString(aPorts[i]->Name()));
513 if (!aPorts[i]->IsInput()) aPNList.append(QString(aPorts[i]->Name()));
519 SUPERV_Port SUPERVGUI_CanvasNode::createInPort()
521 SUPERV_INode aNode = getInlineNode();
522 if (SUPERV_isNull(aNode)) {
523 MESSAGE("SUPERVGUI_CanvasNode::createInPort: Node is wrong type");
526 SUPERVGUI_PortParamsDlg* aDlg = new SUPERVGUI_PortParamsDlg(getPortsNamesIN(aNode,true));
528 SUPERV_Port aPort = aNode->InPort(aDlg->getName().latin1(),
529 aDlg->getType().latin1());
537 SUPERV_Port SUPERVGUI_CanvasNode::createOutPort()
539 SUPERV_INode aNode = getInlineNode();
540 if (SUPERV_isNull(aNode)) {
541 MESSAGE("SUPERVGUI_CanvasNode::createOutPort: Node is wrong type");
545 SUPERVGUI_PortParamsDlg* aDlg = new SUPERVGUI_PortParamsDlg(getPortsNamesIN(aNode,false));
547 SUPERV_Port aPort = aNode->OutPort(aDlg->getName().latin1(),
548 aDlg->getType().latin1());
556 void SUPERVGUI_CanvasNode::addInputPort() {
557 myMain->Editing(); // PAL6170: GUI->Engine: setting "Editing" flag
559 SUPERV_Port aPort = createInPort();
560 if (aPort == NULL) return;
562 createPort(aPort.in());
566 void SUPERVGUI_CanvasNode::addOutputPort() {
567 myMain->Editing(); // PAL6170: GUI->Engine: setting "Editing" flag
569 SUPERV_Port aPort = createOutPort();
570 if (aPort == NULL) return;
572 createPort(aPort.in());
576 void SUPERVGUI_CanvasNode::editFunction() {
577 myMain->Editing(); // PAL6170: GUI->Engine: setting "Editing" flag
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());
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());
593 SUPERVGUI_EditPythonDlg* aDlg = new SUPERVGUI_EditPythonDlg();
594 SUPERV_INode aINode = getInlineNode();
595 aDlg->setFunction(aINode->PyFunction());
597 aINode->SetPyFunction(aDlg->getFuncName().latin1(), (aDlg->getFunction()).in());
604 * Called on "Edit ports" popup menu command. See SUPERVGUI_ManagePortsDlg.h
605 * for detailed description of the functionality
607 void SUPERVGUI_CanvasNode::managePorts() {
608 myMain->Editing(); // PAL6170: GUI->Engine: setting "Editing" flag
610 SUPERVGUI_ManagePortsDlg* aDlg = new SUPERVGUI_ManagePortsDlg( this );