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_Python.h"
15 #include "SUPERVGUI.h"
16 #include "SUPERVGUI_BrowseNodeDlg.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):
37 Trace("SUPERVGUI_CanvasNode::SUPERVGUI_CanvasNode");
38 //cout << "===> SUPERVGUI_CanvasNode " << myNode->Name() << endl;
40 setName(myNode->Name());
42 QString aComment(myNode->Comment());
43 QString aNewComment = aComment;
44 if (getNodeType() == SUPERV::FactoryNode) {
45 aNewComment = QString(myNode->Service()->ServiceName) +
46 QString(tr("COMMENT_FROM")) +
47 QString(getFactoryNode()->GetComponentName());
49 else if (myNode->IsMacro()) {
50 aNewComment = tr("COMMENT_MNODE");
53 aNewComment = tr("COMMENT_CNODE");
55 if (aComment.isEmpty()) {
56 myNode->SetComment(aNewComment.latin1());
59 myLabelText = aNewComment;
63 //cout << " get port list... " ;
64 SUPERV_Ports aPortList = myNode->Ports();
65 //cout << aPortList->length() << endl;
66 for (int i = 0; i < aPortList->length(); i++) {
67 createPort(aPortList[i].in());
70 //cout << " get stream port list... " ;
71 SUPERV_StreamPorts aStreamPortList = myNode->StreamPorts();
72 //cout << aStreamPortList->length() << endl;
73 for (int i = 0; i < aStreamPortList->length(); i++) {
74 createStreamPort(aStreamPortList[i].in());
78 //cout << "<=== SUPERVGUI_CanvasNode " << myNode->Name() << endl;
81 SUPERVGUI_CanvasNode::~SUPERVGUI_CanvasNode()
84 if (myPrs) delete myPrs;
87 void SUPERVGUI_CanvasNode::setDestroyed()
93 SUPERVGUI_CanvasNodePrs* SUPERVGUI_CanvasNode::getPrs() const
96 ((SUPERVGUI_CanvasNode*)this)->myPrs = createPrs();
101 SUPERVGUI_CanvasNodePrs* SUPERVGUI_CanvasNode::createPrs() const
103 return new SUPERVGUI_CanvasNodePrs(myMain->getCanvas(), (SUPERVGUI_CanvasNode*)this);
106 void SUPERVGUI_CanvasNode::createPort(SUPERV::Port_ptr thePort) const
108 SUPERVGUI_CanvasPort* aPort = 0;
109 if (thePort->IsInput())
110 aPort = new SUPERVGUI_CanvasPortIn((SUPERVGUI_CanvasNode*)this, myMain, thePort);
112 aPort = new SUPERVGUI_CanvasPortOut((SUPERVGUI_CanvasNode*)this, myMain, thePort);
115 connect(aPort, SIGNAL(destroyed(QObject*)), this, SLOT(onDestroyed(QObject*)));
116 if (!isIgnore) getPrs()->updatePorts();
120 void SUPERVGUI_CanvasNode::createStreamPort(SUPERV::StreamPort_ptr thePort) const
122 SUPERVGUI_CanvasPort* aPort = 0;
123 if (thePort->IsInput())
124 aPort = new SUPERVGUI_CanvasStreamPortIn((SUPERVGUI_CanvasNode*)this, myMain, thePort);
126 aPort = new SUPERVGUI_CanvasStreamPortOut((SUPERVGUI_CanvasNode*)this, myMain, thePort);
129 connect(aPort, SIGNAL(destroyed(QObject*)), this, SLOT(onDestroyed(QObject*)));
130 if (!isIgnore) getPrs()->updatePorts();
134 void SUPERVGUI_CanvasNode::onDestroyed(QObject* theObject)
137 removeChild(theObject); // signal is sent before removing the object
138 getPrs()->updatePorts();
142 QPopupMenu* SUPERVGUI_CanvasNode::getPopupMenu(QWidget* theParent)
144 QPopupMenu* popup = new QPopupMenu(theParent);
145 if (myMain->getDataflow()->IsExecuting()) {
146 popup->insertItem((myNode->IsSuspended()?tr("MSG_RESUME"):tr("MSG_SUSPEND")),
147 this, SLOT(suspendResume()));
148 popup->insertItem(tr("MSG_KILL"), this, SLOT(kill()));
151 if (myMain->isEditable() && getNodeType() != SUPERV::EndLoopNode
152 && getNodeType() != SUPERV::EndSwitchNode) {
153 popup->insertItem(tr("MSG_RENAME"), this, SLOT(rename()));
154 popup->insertItem(tr("MSG_DELETE"), this, SLOT(remove()));
155 popup->insertSeparator();
157 popup->insertItem(tr("MSG_BROWSE"), this, SLOT(browse()));
159 if (getNodeType() != SUPERV::EndLoopNode &&
160 getNodeType() != SUPERV::EndSwitchNode)
161 popup->insertItem(tr("MSG_CHANGE_INFO"), this, SLOT(changeInformation()));
163 if (myMain->isEditable() && getNodeType() != SUPERV::FactoryNode
164 && getNodeType() != SUPERV::ComputingNode
165 && getNodeType() != SUPERV::EndLoopNode
166 && getNodeType() != SUPERV::MacroNode) {
167 QPopupMenu* addPortMenu = new QPopupMenu(theParent);
168 addPortMenu->insertItem("Input", this, SLOT(addInputPort()));
169 if (getNodeType() != SUPERV::LoopNode)
170 addPortMenu->insertItem("Output", this, SLOT(addOutputPort()));
172 popup->insertSeparator();
173 if ((getNodeType() != SUPERV::EndSwitchNode))
174 popup->insertItem("Edit Function", this, SLOT(editFunction()));
175 popup->insertItem("Add Port", addPortMenu);
182 void SUPERVGUI_CanvasNode::show()
187 void SUPERVGUI_CanvasNode::showAll()
192 void SUPERVGUI_CanvasNode::hideAll()
197 void SUPERVGUI_CanvasNode::switchLabel()
199 getPrs()->setLabelVisible(!getPrs()->isLabelVisible());
202 void SUPERVGUI_CanvasNode::switchPorts()
204 getPrs()->setPortVisible(!getPrs()->isPortVisible());
207 void SUPERVGUI_CanvasNode::move(int x, int y)
209 // myNode->Coords(x, y); // <<<- done inside Prs to reflect item movement by mouse press
210 if (x > GRAPH_MAX) x = (int) getPrs()->x();
211 if (y > GRAPH_MAX) y = (int) getPrs()->y();
212 getPrs()->move(x, y);
215 void SUPERVGUI_CanvasNode::merge()
217 //cout << "===> SUPERVGUI_CanvasNode::merge() " << myNode->Name() << endl;
218 // synchronize port list
221 SUPERVGUI_CanvasPort* aPort;
222 QObjectList* aPortList = queryList("SUPERVGUI_CanvasPort");
223 //cout << " get port list... " ;
224 SUPERV_Ports aPorts = myNode->Ports();
225 //cout << aPorts->length() << endl;
226 for (int i = 0; i < aPorts->length(); i++) {
227 aPort = (SUPERVGUI_CanvasPort*)
228 child(myMain->getCanvas()->getPortName(aPorts[i].in()), "SUPERVGUI_CanvasPort");
230 //cout << " update port " << aPort->name() << endl;
231 aPortList->removeRef(aPort);
235 //cout << " create port " << myMain->getCanvas()->getPortName(aPorts[i].in()) << endl;
236 createPort(aPorts[i].in());
241 //cout << " get stream port list... " ;
242 SUPERV_StreamPorts aStreamPorts = myNode->StreamPorts();
243 //cout << aStreamPorts->length() << endl;
244 for (int i = 0; i < aStreamPorts->length(); i++) {
245 aPort = (SUPERVGUI_CanvasPort*)
246 child(myMain->getCanvas()->getPortName(aStreamPorts[i].in()), "SUPERVGUI_CanvasPort");
248 //cout << " update stream port " << aPort->name() << endl;
249 aPortList->removeRef(aPort);
253 //cout << " create stream port " << myMain->getCanvas()->getPortName(aStreamPorts[i].in()) << endl;
254 createPort(aStreamPorts[i].in());
259 //cout << " remove inexistant " << endl;
260 QObjectListIt it(*aPortList);
261 while ((aPort=(SUPERVGUI_CanvasPort*)it.current()) != 0) {
263 aPortList->removeRef(aPort);
269 if (update) getPrs()->updatePorts();
271 sync(); // update node state also
274 void SUPERVGUI_CanvasNode::sync()
276 //cout << "===> SUPERVGUI_CanvasNode::sync() " << myNode->Name() << ", state " << myNode->State() << endl;
278 //if myNode is a MacroNode then set it state to state of its subgraph
279 if (myNode->IsMacro() && myMain->getDataflow()->IsExecuting()) {
280 // get SubGraph from MacroNode
281 SUPERV_Graph aMacro = SUPERV::Graph::_narrow(myNode);
282 if (!SUPERV_isNull(aMacro)) {
284 if (aMacro->IsStreamMacro())
285 aGraph = aMacro->StreamObjRef();
287 aGraph = aMacro->FlowObjRef();
288 if (!SUPERV_isNull(aGraph)) {
289 if (aGraph->State() != SUPERV::UndefinedState && aGraph->State() != SUPERV::NoState)
290 getPrs()->setState(aGraph->State());
292 getPrs()->setState(myNode->State());
297 getPrs()->setState(myNode->State());
299 // update child ports
300 const QObjectList* list = children();
302 QObjectListIt it(*list);
303 while (QObject* obj = it.current()) {
305 if (obj->inherits("SUPERVGUI_CanvasPort")) {
306 ((SUPERVGUI_CanvasPort*)obj)->sync();
312 void SUPERVGUI_CanvasNode::syncOnEvent(SUPERV::GraphState theStateFromEvent)
314 getPrs()->setState(theStateFromEvent);
317 bool SUPERVGUI_CanvasNode::setNodeName(QString aName)
319 bool result = myNode->SetName(aName.latin1());
321 setName(myNode->Name());
322 getPrs()->updateInfo();
323 // TODO: update name of all the links to this node
326 QMessageBox::warning( QAD_Application::getDesktop(), tr( "ERROR" ), tr( "MSG_CANT_RENAMENODE" ) );
331 void SUPERVGUI_CanvasNode::rename()
333 QString aName = SALOMEGUI_NameDlg::getName(QAD_Application::getDesktop(), myNode->Name());
334 if (!aName.isEmpty()) {
339 void SUPERVGUI_CanvasNode::remove() {
340 Trace("SUPERVGUI_CanvasNode::remove");
341 SUPERVGUI_Canvas* aCanvas = myMain->getCanvas();
348 void SUPERVGUI_CanvasNode::suspendResume() {
349 Trace("SUPERVGUI_CanvasNode::suspendResume");
350 int n = queryList("SUPERVGUI_CanvasNode")->count();
351 if (myNode->IsSuspended()) {
352 if (!((n==1)? myMain->getDataflow()->Resume() : myNode->Resume())) {
353 QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_RESUMENODE"));
357 myMain->getMyThread()->startThread(tr("MSG_NODE_RESUMED1")+myNode->Name()+tr("MSG_NODE_RESUMED2"));
360 if (!((n==1)? myMain->getDataflow()->Suspend() : myNode->Suspend())) {
361 QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_SUSPENDNODE"));
363 syncOnEvent(SUPERV::SuspendReadyState);
364 myMain->getMyThread()->stopThread(tr("MSG_NODE_SUSPENDED1")+myNode->Name()+tr("MSG_NODE_SUSPENDED2"));
369 void SUPERVGUI_CanvasNode::kill() {
370 Trace("SUPERVGUI_CanvasNode::kill");
371 int n = queryList("SUPERVGUI_CanvasNode")->count();
372 if (!((n==1)? myMain->getDataflow()->Kill() : myNode->Kill())) {
373 QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_KILLNODE"));
375 syncOnEvent(SUPERV_Kill);
376 myMain->getMyThread()->stopThread(tr("MSG_NODE_KILLED1")+myNode->Name()+tr("MSG_NODE_KILLED2"));
380 void SUPERVGUI_CanvasNode::stopRestart() {
381 Trace("SUPERVGUI_CanvasNode::stopRestart");
383 int n = queryList("SUPERVGUI_CanvasNode")->count();
384 if ((myNode->State() == SUPERV_Stop) || (myNode->State() == SUPERV_Kill)) {
385 if (!((n==1)? myMain->getDataflow()->Run() : myNode->ReStart())) {
386 QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_RESTARTNODE"));
389 if (!((n==1)? myMain->getDataflow()->Stop() : myNode->Stop())) {
390 QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_STOPNODE"));
395 void SUPERVGUI_CanvasNode::changeInformation() {
396 SUPERVGUI_Information* aDlg = new SUPERVGUI_Information(myNode, !myMain->isEditable());
398 QString aName = myNode->Name();
399 if (!aName.isEmpty() && myMain->isEditable())
405 void SUPERVGUI_CanvasNode::configure()
407 Trace("SUPERVGUI_CanvasNode::configure");
408 QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_NOT_IMPLEMENTED")); // kloss : a faire : lancer l'ihm DATA
411 void SUPERVGUI_CanvasNode::showPython()
413 Trace("SUPERVGUI_CanvasNode::showPython");
414 SUPERVGUI_Python cp(myMain->getStudy()->get_PyInterp(), !myMain->isEditable());
418 bool SUPERVGUI_CanvasNode::isWarning()
420 Trace("SUPERVGUI_CanvasNode::isWarning");
424 bool SUPERVGUI_CanvasNode::isStep()
426 Trace("SUPERVGUI_CanvasNode::isStep");
430 bool SUPERVGUI_CanvasNode::isTrace()
432 Trace("SUPERVGUI_CanvasNode::isTrace");
436 bool SUPERVGUI_CanvasNode::isVerbose()
438 Trace("SUPERVGUI_CanvasNode::isVerbose");
442 void SUPERVGUI_CanvasNode::setWarning(bool b)
444 Trace("SUPERVGUI_CanvasNode::setWarning");
448 void SUPERVGUI_CanvasNode::setStep(bool b)
450 Trace("SUPERVGUI_CanvasNode::setStep");
454 void SUPERVGUI_CanvasNode::setTrace(bool b)
456 Trace("SUPERVGUI_CanvasNode::setTrace");
460 void SUPERVGUI_CanvasNode::setVerbose(bool b)
462 Trace("SUPERVGUI_CanvasNode::setVerbose");
467 void SUPERVGUI_CanvasNode::browse()
470 myBrowseDlg = new SUPERVGUI_BrowseNodeDlg(this);
471 myBrowseDlg->installEventFilter(this);
473 if (!myBrowseDlg->isVisible())
476 myBrowseDlg->raise();
477 myBrowseDlg->setActiveWindow();
478 myBrowseDlg->setFocus();
482 bool SUPERVGUI_CanvasNode::eventFilter( QObject* o, QEvent* e )
484 if (o == myBrowseDlg && e->type() == QEvent::Close)
486 return QObject::eventFilter(o, e);
489 SUPERV_Port SUPERVGUI_CanvasNode::createInPort()
491 SUPERVGUI_PortParamsDlg* aDlg = new SUPERVGUI_PortParamsDlg();
493 if (aDlg->getName().isEmpty() || aDlg->getType().isEmpty()) {
494 QMessageBox::warning( QAD_Application::getDesktop(), tr( "ERROR" ), tr( "MSG_CANT_CREATE_PORT" ) );
497 SUPERV_INode aNode = getInlineNode();
498 if (SUPERV_isNull(aNode)) {
499 MESSAGE("SUPERVGUI_CanvasNode::createInPort: Node is wrong type");
502 SUPERV_Ports aPorts = aNode->Ports();
503 for (int i=0; i<aPorts->length(); i++) {
504 if (aPorts[i]->IsInput() && aDlg->getName() == QString(aPorts[i]->Name())){
505 QMessageBox::warning(0, tr("ERROR"), tr("MSG_PORT_EXIST"));
509 SUPERV_Port aPort = aNode->InPort(aDlg->getName().latin1(),
510 aDlg->getType().latin1());
518 SUPERV_Port SUPERVGUI_CanvasNode::createOutPort()
520 SUPERVGUI_PortParamsDlg* aDlg = new SUPERVGUI_PortParamsDlg();
522 SUPERV_INode aNode = getInlineNode();
523 if (SUPERV_isNull(aNode)) {
524 MESSAGE("SUPERVGUI_CanvasNode::createOutPort: Node is wrong type");
527 SUPERV_Ports aPorts = aNode->Ports();
528 for (int i=0; i<aPorts->length(); i++) {
529 if (!aPorts[i]->IsInput() && aDlg->getName() == QString(aPorts[i]->Name())){
530 QMessageBox::warning(0, tr("ERROR"), tr("MSG_PORT_EXIST"));
534 SUPERV_Port aPort = aNode->OutPort(aDlg->getName().latin1(),
535 aDlg->getType().latin1());
543 void SUPERVGUI_CanvasNode::addInputPort() {
544 SUPERV_Port aPort = createInPort();
545 if (aPort == NULL) return;
547 createPort(aPort.in());
551 void SUPERVGUI_CanvasNode::addOutputPort() {
552 SUPERV_Port aPort = createOutPort();
553 if (aPort == NULL) return;
555 createPort(aPort.in());
559 void SUPERVGUI_CanvasNode::editFunction()
561 if (getNodeType() == SUPERV::LoopNode) {
562 SUPERVGUI_EditPythonDlg* aDlg = new SUPERVGUI_EditPythonDlg(true);
563 SUPERV_LNode aLNode = getLoopNode();
564 aDlg->setInitFunction(aLNode->PyInit());
565 aDlg->setMoreFunction(aLNode->PyMore());
566 aDlg->setNextFunction(aLNode->PyNext());
568 aLNode->SetPyInit(aDlg->getInitFuncName().latin1(), (aDlg->getInitFunction()).in());
569 aLNode->SetPyMore(aDlg->getMoreFuncName().latin1(), (aDlg->getMoreFunction()).in());
570 aLNode->SetPyNext(aDlg->getNextFuncName().latin1(), (aDlg->getNextFunction()).in());
575 SUPERVGUI_EditPythonDlg* aDlg = new SUPERVGUI_EditPythonDlg();
576 SUPERV_INode aINode = getInlineNode();
577 aDlg->setFunction(aINode->PyFunction());
579 aINode->SetPyFunction(aDlg->getFuncName().latin1(), (aDlg->getFunction()).in());