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");
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());
79 SUPERVGUI_CanvasNode::~SUPERVGUI_CanvasNode()
82 if (myPrs) delete myPrs;
85 void SUPERVGUI_CanvasNode::setDestroyed()
91 SUPERVGUI_CanvasNodePrs* SUPERVGUI_CanvasNode::getPrs() const
94 ((SUPERVGUI_CanvasNode*)this)->myPrs = createPrs();
99 SUPERVGUI_CanvasNodePrs* SUPERVGUI_CanvasNode::createPrs() const
101 return new SUPERVGUI_CanvasNodePrs(myMain->getCanvas(), (SUPERVGUI_CanvasNode*)this);
104 void SUPERVGUI_CanvasNode::createPort(SUPERV::Port_ptr thePort) const
106 SUPERVGUI_CanvasPort* aPort = 0;
107 if (thePort->IsInput())
108 aPort = new SUPERVGUI_CanvasPortIn((SUPERVGUI_CanvasNode*)this, myMain, thePort);
110 aPort = new SUPERVGUI_CanvasPortOut((SUPERVGUI_CanvasNode*)this, myMain, thePort);
113 connect(aPort, SIGNAL(destroyed(QObject*)), this, SLOT(onDestroyed(QObject*)));
114 if (!isIgnore) getPrs()->updatePorts();
118 void SUPERVGUI_CanvasNode::createStreamPort(SUPERV::StreamPort_ptr thePort) const
120 SUPERVGUI_CanvasPort* aPort = 0;
121 if (thePort->IsInput())
122 aPort = new SUPERVGUI_CanvasStreamPortIn((SUPERVGUI_CanvasNode*)this, myMain, thePort);
124 aPort = new SUPERVGUI_CanvasStreamPortOut((SUPERVGUI_CanvasNode*)this, myMain, thePort);
127 connect(aPort, SIGNAL(destroyed(QObject*)), this, SLOT(onDestroyed(QObject*)));
128 if (!isIgnore) getPrs()->updatePorts();
132 void SUPERVGUI_CanvasNode::onDestroyed(QObject* theObject)
135 removeChild(theObject); // signal is sent before removing the object
136 getPrs()->updatePorts();
140 QPopupMenu* SUPERVGUI_CanvasNode::getPopupMenu(QWidget* theParent)
142 QPopupMenu* popup = new QPopupMenu(theParent);
143 if (myMain->getDataflow()->IsExecuting()) {
144 popup->insertItem((myNode->IsSuspended()?tr("MSG_RESUME"):tr("MSG_SUSPEND")),
145 this, SLOT(suspendResume()));
146 popup->insertItem(tr("MSG_KILL"), this, SLOT(kill()));
149 if (myMain->isEditable() && getNodeType() != SUPERV::EndLoopNode
150 && getNodeType() != SUPERV::EndSwitchNode) {
151 popup->insertItem(tr("MSG_RENAME"), this, SLOT(rename()));
152 popup->insertItem(tr("MSG_DELETE"), this, SLOT(remove()));
153 popup->insertSeparator();
155 popup->insertItem(tr("MSG_BROWSE"), this, SLOT(browse()));
157 if (getNodeType() != SUPERV::EndLoopNode &&
158 getNodeType() != SUPERV::EndSwitchNode)
159 popup->insertItem(tr("MSG_CHANGE_INFO"), this, SLOT(changeInformation()));
161 if (myMain->isEditable() && getNodeType() != SUPERV::FactoryNode
162 && getNodeType() != SUPERV::ComputingNode
163 && getNodeType() != SUPERV::EndLoopNode
164 && getNodeType() != SUPERV::MacroNode) {
165 QPopupMenu* addPortMenu = new QPopupMenu(theParent);
166 addPortMenu->insertItem("Input", this, SLOT(addInputPort()));
167 if (getNodeType() != SUPERV::LoopNode)
168 addPortMenu->insertItem("Output", this, SLOT(addOutputPort()));
170 popup->insertSeparator();
171 if ((getNodeType() != SUPERV::EndSwitchNode))
172 popup->insertItem("Edit Function", this, SLOT(editFunction()));
173 popup->insertItem("Add Port", addPortMenu);
180 void SUPERVGUI_CanvasNode::show()
185 void SUPERVGUI_CanvasNode::showAll()
190 void SUPERVGUI_CanvasNode::hideAll()
195 void SUPERVGUI_CanvasNode::switchLabel()
197 getPrs()->setLabelVisible(!getPrs()->isLabelVisible());
200 void SUPERVGUI_CanvasNode::switchPorts()
202 getPrs()->setPortVisible(!getPrs()->isPortVisible());
205 void SUPERVGUI_CanvasNode::move(int x, int y)
207 // myNode->Coords(x, y); // <<<- done inside Prs to reflect item movement by mouse press
208 if (x > GRAPH_MAX) x = (int) getPrs()->x();
209 if (y > GRAPH_MAX) y = (int) getPrs()->y();
210 getPrs()->move(x, y);
213 void SUPERVGUI_CanvasNode::merge()
215 //MESSAGE("===> SUPERVGUI_CanvasNode::merge() " << myNode->Name());
216 // synchronize port list
219 SUPERVGUI_CanvasPort* aPort;
220 QObjectList* aPortList = queryList("SUPERVGUI_CanvasPort");
221 //cout << " get port list... " ;
222 SUPERV_Ports aPorts = myNode->Ports();
223 //cout << aPorts->length() << endl;
224 for (int i = 0; i < aPorts->length(); i++) {
225 aPort = (SUPERVGUI_CanvasPort*)
226 child(myMain->getCanvas()->getPortName(aPorts[i].in()), "SUPERVGUI_CanvasPort");
228 //cout << " update port " << aPort->name() << endl;
229 aPortList->removeRef(aPort);
233 //cout << " create port " << myMain->getCanvas()->getPortName(aPorts[i].in()) << endl;
234 createPort(aPorts[i].in());
239 //cout << " get stream port list... " ;
240 SUPERV_StreamPorts aStreamPorts = myNode->StreamPorts();
241 //cout << aStreamPorts->length() << endl;
242 for (int i = 0; i < aStreamPorts->length(); i++) {
243 aPort = (SUPERVGUI_CanvasPort*)
244 child(myMain->getCanvas()->getPortName(aStreamPorts[i].in()), "SUPERVGUI_CanvasPort");
246 //cout << " update stream port " << aPort->name() << endl;
247 aPortList->removeRef(aPort);
251 //cout << " create stream port " << myMain->getCanvas()->getPortName(aStreamPorts[i].in()) << endl;
252 createPort(aStreamPorts[i].in());
257 //cout << " remove inexistant " << endl;
258 QObjectListIt it(*aPortList);
259 while ((aPort=(SUPERVGUI_CanvasPort*)it.current()) != 0) {
261 aPortList->removeRef(aPort);
267 if (update) getPrs()->updatePorts();
269 sync(); // update node state also
272 void SUPERVGUI_CanvasNode::sync()
274 //MESSAGE("===> SUPERVGUI_CanvasNode::sync() " << myNode->Name() << ", state " << myNode->State());
276 //if myNode is a MacroNode then set it state to state of its subgraph
277 if (myNode->IsMacro() && myMain->getDataflow()->IsExecuting()) {
278 // get SubGraph from MacroNode
279 SUPERV_Graph aMacro = SUPERV::Graph::_narrow(myNode);
280 if (!SUPERV_isNull(aMacro)) {
282 if (aMacro->IsStreamMacro())
283 aGraph = aMacro->StreamObjRef();
285 aGraph = aMacro->FlowObjRef();
286 if (!SUPERV_isNull(aGraph)) {
287 if (aGraph->State() != SUPERV::UndefinedState && aGraph->State() != SUPERV::NoState)
288 getPrs()->setState(aGraph->State());
290 getPrs()->setState(myNode->State());
295 getPrs()->setState(myNode->State());
297 // update child ports
298 const QObjectList* list = children();
300 QObjectListIt it(*list);
301 while (QObject* obj = it.current()) {
303 if (obj->inherits("SUPERVGUI_CanvasPort")) {
304 ((SUPERVGUI_CanvasPort*)obj)->sync();
310 void SUPERVGUI_CanvasNode::syncOnEvent(SUPERV::GraphState theStateFromEvent)
312 getPrs()->setState(theStateFromEvent);
315 bool SUPERVGUI_CanvasNode::setNodeName(QString aName)
317 bool result = myNode->SetName(aName.latin1());
319 setName(myNode->Name());
320 getPrs()->updateInfo();
321 // TODO: update name of all the links to this node
324 QMessageBox::warning( QAD_Application::getDesktop(), tr( "ERROR" ), tr( "MSG_CANT_RENAMENODE" ) );
329 void SUPERVGUI_CanvasNode::rename()
331 QString aName = SALOMEGUI_NameDlg::getName(QAD_Application::getDesktop(), myNode->Name());
332 if (!aName.isEmpty()) {
337 void SUPERVGUI_CanvasNode::remove() {
338 Trace("SUPERVGUI_CanvasNode::remove");
339 SUPERVGUI_Canvas* aCanvas = myMain->getCanvas();
346 void SUPERVGUI_CanvasNode::suspendResume() {
347 Trace("SUPERVGUI_CanvasNode::suspendResume");
348 int n = queryList("SUPERVGUI_CanvasNode")->count();
349 if (myNode->IsSuspended()) {
350 if (!((n==1)? myMain->getDataflow()->Resume() : myNode->Resume())) {
351 QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_RESUMENODE"));
355 myMain->getMyThread()->startThread(tr("MSG_NODE_RESUMED1")+myNode->Name()+tr("MSG_NODE_RESUMED2"));
358 if (!((n==1)? myMain->getDataflow()->Suspend() : myNode->Suspend())) {
359 QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_SUSPENDNODE"));
361 syncOnEvent(SUPERV::SuspendReadyState);
362 myMain->getMyThread()->stopThread(tr("MSG_NODE_SUSPENDED1")+myNode->Name()+tr("MSG_NODE_SUSPENDED2"));
367 void SUPERVGUI_CanvasNode::kill() {
368 Trace("SUPERVGUI_CanvasNode::kill");
369 int n = queryList("SUPERVGUI_CanvasNode")->count();
370 if (!((n==1)? myMain->getDataflow()->Kill() : myNode->Kill())) {
371 QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_KILLNODE"));
373 syncOnEvent(SUPERV_Kill);
374 myMain->getMyThread()->stopThread(tr("MSG_NODE_KILLED1")+myNode->Name()+tr("MSG_NODE_KILLED2"));
378 void SUPERVGUI_CanvasNode::stopRestart() {
379 Trace("SUPERVGUI_CanvasNode::stopRestart");
381 int n = queryList("SUPERVGUI_CanvasNode")->count();
382 if ((myNode->State() == SUPERV_Stop) || (myNode->State() == SUPERV_Kill)) {
383 if (!((n==1)? myMain->getDataflow()->Run() : myNode->ReStart())) {
384 QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_RESTARTNODE"));
387 if (!((n==1)? myMain->getDataflow()->Stop() : myNode->Stop())) {
388 QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_STOPNODE"));
393 void SUPERVGUI_CanvasNode::changeInformation() {
394 SUPERVGUI_Information* aDlg = new SUPERVGUI_Information(myNode, !myMain->isEditable());
396 QString aName = myNode->Name();
397 if (!aName.isEmpty() && myMain->isEditable())
403 void SUPERVGUI_CanvasNode::configure()
405 Trace("SUPERVGUI_CanvasNode::configure");
406 QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_NOT_IMPLEMENTED")); // kloss : a faire : lancer l'ihm DATA
409 void SUPERVGUI_CanvasNode::showPython()
411 Trace("SUPERVGUI_CanvasNode::showPython");
412 SUPERVGUI_Python cp(myMain->getStudy()->get_PyInterp(), !myMain->isEditable());
416 bool SUPERVGUI_CanvasNode::isWarning()
418 Trace("SUPERVGUI_CanvasNode::isWarning");
422 bool SUPERVGUI_CanvasNode::isStep()
424 Trace("SUPERVGUI_CanvasNode::isStep");
428 bool SUPERVGUI_CanvasNode::isTrace()
430 Trace("SUPERVGUI_CanvasNode::isTrace");
434 bool SUPERVGUI_CanvasNode::isVerbose()
436 Trace("SUPERVGUI_CanvasNode::isVerbose");
440 void SUPERVGUI_CanvasNode::setWarning(bool b)
442 Trace("SUPERVGUI_CanvasNode::setWarning");
446 void SUPERVGUI_CanvasNode::setStep(bool b)
448 Trace("SUPERVGUI_CanvasNode::setStep");
452 void SUPERVGUI_CanvasNode::setTrace(bool b)
454 Trace("SUPERVGUI_CanvasNode::setTrace");
458 void SUPERVGUI_CanvasNode::setVerbose(bool b)
460 Trace("SUPERVGUI_CanvasNode::setVerbose");
465 void SUPERVGUI_CanvasNode::browse()
468 myBrowseDlg = new SUPERVGUI_BrowseNodeDlg(this);
469 myBrowseDlg->installEventFilter(this);
471 if (!myBrowseDlg->isVisible())
474 myBrowseDlg->raise();
475 myBrowseDlg->setActiveWindow();
476 myBrowseDlg->setFocus();
480 bool SUPERVGUI_CanvasNode::eventFilter( QObject* o, QEvent* e )
482 if (o == myBrowseDlg && e->type() == QEvent::Close)
484 return QObject::eventFilter(o, e);
487 QStringList SUPERVGUI_CanvasNode::getPortsNamesIN(SUPERV_INode theNode, bool theInputPorts)
490 if (!SUPERV_isNull(theNode)) {
491 SUPERV_Ports aPorts = theNode->Ports();
492 for (int i=0; i<aPorts->length(); i++) {
494 if (aPorts[i]->IsInput()) aPNList.append(QString(aPorts[i]->Name()));
497 if (!aPorts[i]->IsInput()) aPNList.append(QString(aPorts[i]->Name()));
503 SUPERV_Port SUPERVGUI_CanvasNode::createInPort()
505 SUPERV_INode aNode = getInlineNode();
506 if (SUPERV_isNull(aNode)) {
507 MESSAGE("SUPERVGUI_CanvasNode::createInPort: Node is wrong type");
510 SUPERVGUI_PortParamsDlg* aDlg = new SUPERVGUI_PortParamsDlg(getPortsNamesIN(aNode,true));
512 SUPERV_Port aPort = aNode->InPort(aDlg->getName().latin1(),
513 aDlg->getType().latin1());
521 SUPERV_Port SUPERVGUI_CanvasNode::createOutPort()
523 SUPERV_INode aNode = getInlineNode();
524 if (SUPERV_isNull(aNode)) {
525 MESSAGE("SUPERVGUI_CanvasNode::createOutPort: Node is wrong type");
529 SUPERVGUI_PortParamsDlg* aDlg = new SUPERVGUI_PortParamsDlg(getPortsNamesIN(aNode,false));
531 SUPERV_Port aPort = aNode->OutPort(aDlg->getName().latin1(),
532 aDlg->getType().latin1());
540 void SUPERVGUI_CanvasNode::addInputPort() {
541 SUPERV_Port aPort = createInPort();
542 if (aPort == NULL) return;
544 createPort(aPort.in());
548 void SUPERVGUI_CanvasNode::addOutputPort() {
549 SUPERV_Port aPort = createOutPort();
550 if (aPort == NULL) return;
552 createPort(aPort.in());
556 void SUPERVGUI_CanvasNode::editFunction()
558 if (getNodeType() == SUPERV::LoopNode) {
559 SUPERVGUI_EditPythonDlg* aDlg = new SUPERVGUI_EditPythonDlg(true);
560 SUPERV_LNode aLNode = getLoopNode();
561 aDlg->setInitFunction(aLNode->PyInit());
562 aDlg->setMoreFunction(aLNode->PyMore());
563 aDlg->setNextFunction(aLNode->PyNext());
565 aLNode->SetPyInit(aDlg->getInitFuncName().latin1(), (aDlg->getInitFunction()).in());
566 aLNode->SetPyMore(aDlg->getMoreFuncName().latin1(), (aDlg->getMoreFunction()).in());
567 aLNode->SetPyNext(aDlg->getNextFuncName().latin1(), (aDlg->getNextFunction()).in());
572 SUPERVGUI_EditPythonDlg* aDlg = new SUPERVGUI_EditPythonDlg();
573 SUPERV_INode aINode = getInlineNode();
574 aDlg->setFunction(aINode->PyFunction());
576 aINode->SetPyFunction(aDlg->getFuncName().latin1(), (aDlg->getFunction()).in());