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 "SUPERVGUI_ManagePortsDlg.h"
18 #include "SALOMEGUI_NameDlg.h"
19 #include "SUPERVGUI_Information.h"
21 #include "SUPERVGUI_CanvasControlNode.h"
26 SUPERVGUI_CanvasNode::SUPERVGUI_CanvasNode(QObject* theParent, SUPERVGUI_Main* theMain, SUPERV_CNode theNode, bool theIsCell):
38 Trace("SUPERVGUI_CanvasNode::SUPERVGUI_CanvasNode");
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());
79 QCanvasItemList anIL2 = ((QCanvas*)parent())->allItems();
80 cout<<" ===> 1 conatructor CanvasNode : CanvasArray has "<<anIL2.count()<<" children!"<<endl;
83 SUPERVGUI_CanvasNode::~SUPERVGUI_CanvasNode()
86 if (myPrs) delete myPrs;
89 void SUPERVGUI_CanvasNode::setDestroyed()
95 SUPERVGUI_CanvasNodePrs* SUPERVGUI_CanvasNode::getPrs() const
98 ((SUPERVGUI_CanvasNode*)this)->myPrs = createPrs();
103 SUPERVGUI_CanvasNodePrs* SUPERVGUI_CanvasNode::createPrs() const
105 return new SUPERVGUI_CanvasNodePrs(myMain->getCanvas(), (SUPERVGUI_CanvasNode*)this);
108 void SUPERVGUI_CanvasNode::createPort(SUPERV::Port_ptr thePort) const
110 SUPERVGUI_CanvasPort* aPort = 0;
111 if (thePort->IsInput())
112 aPort = new SUPERVGUI_CanvasPortIn((SUPERVGUI_CanvasNode*)this, myMain, thePort);
114 aPort = new SUPERVGUI_CanvasPortOut((SUPERVGUI_CanvasNode*)this, myMain, thePort);
117 connect(aPort, SIGNAL(destroyed(QObject*)), this, SLOT(onDestroyed(QObject*)));
118 if (!isIgnore) getPrs()->updatePorts();
122 void SUPERVGUI_CanvasNode::createStreamPort(SUPERV::StreamPort_ptr thePort) const
124 SUPERVGUI_CanvasPort* aPort = 0;
125 if (thePort->IsInput())
126 aPort = new SUPERVGUI_CanvasStreamPortIn((SUPERVGUI_CanvasNode*)this, myMain, thePort);
128 aPort = new SUPERVGUI_CanvasStreamPortOut((SUPERVGUI_CanvasNode*)this, myMain, thePort);
131 connect(aPort, SIGNAL(destroyed(QObject*)), this, SLOT(onDestroyed(QObject*)));
132 if (!isIgnore) getPrs()->updatePorts();
136 void SUPERVGUI_CanvasNode::onDestroyed(QObject* theObject)
139 removeChild(theObject); // signal is sent before removing the object
140 getPrs()->updatePorts();
144 QPopupMenu* SUPERVGUI_CanvasNode::getPopupMenu(QWidget* theParent)
146 QPopupMenu* popup = new QPopupMenu(theParent);
147 if (myMain->getDataflow()->IsExecuting()) {
148 popup->insertItem((myNode->IsSuspended()?tr("MSG_RESUME"):tr("MSG_SUSPEND")),
149 this, SLOT(suspendResume()));
150 popup->insertItem(tr("MSG_KILL"), this, SLOT(kill()));
153 if (myMain->isEditable() && getNodeType() != SUPERV::EndLoopNode
154 && getNodeType() != SUPERV::EndSwitchNode) {
155 popup->insertItem(tr("MSG_RENAME"), this, SLOT(rename()));
156 myDeleteItem = popup->insertItem(tr("MSG_DELETE"), this, SLOT(remove()));
157 popup->insertSeparator();
159 popup->insertItem(tr("MSG_BROWSE"), this, SLOT(browse()));
161 if (getNodeType() != SUPERV::EndLoopNode &&
162 getNodeType() != SUPERV::EndSwitchNode)
163 popup->insertItem(tr("MSG_CHANGE_INFO"), this, SLOT(changeInformation()));
165 if (myMain->isEditable() && getNodeType() != SUPERV::FactoryNode
166 && getNodeType() != SUPERV::ComputingNode
167 && getNodeType() != SUPERV::EndLoopNode
168 && getNodeType() != SUPERV::MacroNode) {
169 QPopupMenu* addPortMenu = new QPopupMenu(theParent);
170 addPortMenu->insertItem( tr( "MNU_INPUT" ), this, SLOT(addInputPort()));
171 if (getNodeType() != SUPERV::LoopNode)
172 addPortMenu->insertItem( tr( "MNU_OUTPUT" ), this, SLOT(addOutputPort()));
174 popup->insertSeparator();
175 if ((getNodeType() != SUPERV::EndSwitchNode))
176 popup->insertItem( tr( "MNU_EDIT_FUNC" ), this, SLOT(editFunction()));
177 popup->insertItem( tr( "MNU_ADD_PORT" ), addPortMenu);
178 popup->insertItem( tr( "MNU_MANAGE_PORTS" ), this, SLOT(managePorts()));
185 void SUPERVGUI_CanvasNode::show()
190 void SUPERVGUI_CanvasNode::showAll()
195 void SUPERVGUI_CanvasNode::hideAll()
200 void SUPERVGUI_CanvasNode::switchLabel()
202 getPrs()->setLabelVisible(!getPrs()->isLabelVisible());
205 void SUPERVGUI_CanvasNode::switchPorts()
207 getPrs()->setPortVisible(!getPrs()->isPortVisible());
210 void SUPERVGUI_CanvasNode::move(int x, int y)
212 // myNode->Coords(x, y); // <<<- done inside Prs to reflect item movement by mouse press
213 if (x > GRAPH_MAX) x = (int) getPrs()->x();
214 if (y > GRAPH_MAX) y = (int) getPrs()->y();
215 getPrs()->move(x, y);
218 void SUPERVGUI_CanvasNode::merge()
220 //MESSAGE("===> SUPERVGUI_CanvasNode::merge() " << myNode->Name());
221 // synchronize port list
224 SUPERVGUI_CanvasPort* aPort;
225 QObjectList* aPortList = queryList("SUPERVGUI_CanvasPort");
226 //cout << " get port list... " ;
227 SUPERV_Ports aPorts = myNode->Ports();
228 //cout << aPorts->length() << endl;
229 for (int i = 0; i < aPorts->length(); i++) {
230 aPort = (SUPERVGUI_CanvasPort*)
231 child(myMain->getCanvas()->getPortName(aPorts[i].in()), "SUPERVGUI_CanvasPort");
233 //cout << " update port " << aPort->name() << endl;
234 aPortList->removeRef(aPort);
238 //cout << " create port " << myMain->getCanvas()->getPortName(aPorts[i].in()) << endl;
239 createPort(aPorts[i].in());
244 //cout << " get stream port list... " ;
245 SUPERV_StreamPorts aStreamPorts = myNode->StreamPorts();
246 //cout << aStreamPorts->length() << endl;
247 for (int i = 0; i < aStreamPorts->length(); i++) {
248 aPort = (SUPERVGUI_CanvasPort*)
249 child(myMain->getCanvas()->getPortName(aStreamPorts[i].in()), "SUPERVGUI_CanvasPort");
251 //cout << " update stream port " << aPort->name() << endl;
252 aPortList->removeRef(aPort);
256 //cout << " create stream port " << myMain->getCanvas()->getPortName(aStreamPorts[i].in()) << endl;
257 createPort(aStreamPorts[i].in());
262 //cout << " remove inexistant " << endl;
263 QObjectListIt it(*aPortList);
264 while ((aPort=(SUPERVGUI_CanvasPort*)it.current()) != 0) {
266 aPortList->removeRef(aPort);
272 if (update) getPrs()->updatePorts();
274 sync(); // update node state also
277 void SUPERVGUI_CanvasNode::sync()
279 //MESSAGE("===> SUPERVGUI_CanvasNode::sync() " << myNode->Name() << ", state " << myNode->State());
281 //if myNode is a MacroNode then set it state to state of its subgraph
282 if (myNode->IsMacro() && myMain->getDataflow()->IsExecuting()) {
283 // get SubGraph from MacroNode
284 SUPERV_Graph aMacro = SUPERV::Graph::_narrow(myNode);
285 if (!SUPERV_isNull(aMacro)) {
287 if (aMacro->IsStreamMacro())
288 aGraph = aMacro->StreamObjRef();
290 aGraph = aMacro->FlowObjRef();
291 if (!SUPERV_isNull(aGraph)) {
292 if (aGraph->State() != SUPERV::UndefinedState && aGraph->State() != SUPERV::NoState)
293 getPrs()->setState(aGraph->State());
295 getPrs()->setState(myNode->State());
300 getPrs()->setState(myNode->State());
302 // update child ports
303 const QObjectList* list = children();
305 QObjectListIt it(*list);
306 while (QObject* obj = it.current()) {
308 if (obj->inherits("SUPERVGUI_CanvasPort")) {
309 ((SUPERVGUI_CanvasPort*)obj)->sync();
315 void SUPERVGUI_CanvasNode::syncOnEvent(SUPERV::GraphState theStateFromEvent)
317 getPrs()->setState(theStateFromEvent);
320 bool SUPERVGUI_CanvasNode::setNodeName(QString aName)
322 bool result = myNode->SetName(aName.latin1());
324 setName(myNode->Name());
325 getPrs()->updateInfo();
326 // TODO: update name of all the links to this node
329 QMessageBox::warning( QAD_Application::getDesktop(), tr( "ERROR" ), tr( "MSG_CANT_RENAMENODE" ) );
334 void SUPERVGUI_CanvasNode::rename()
336 QString aName = SALOMEGUI_NameDlg::getName(QAD_Application::getDesktop(), myNode->Name());
337 if (!aName.isEmpty()) {
342 void SUPERVGUI_CanvasNode::remove() {
343 Trace("SUPERVGUI_CanvasNode::remove");
344 SUPERVGUI_Canvas* aCanvas = myMain->getCanvas();
351 void SUPERVGUI_CanvasNode::suspendResume() {
352 Trace("SUPERVGUI_CanvasNode::suspendResume");
353 int n = queryList("SUPERVGUI_CanvasNode")->count();
354 if (myNode->IsSuspended()) {
355 if (!((n==1)? myMain->getDataflow()->Resume() : myNode->Resume())) {
356 QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_RESUMENODE"));
360 myMain->getMyThread()->startThread(tr("MSG_NODE_RESUMED1")+myNode->Name()+tr("MSG_NODE_RESUMED2"));
363 if (!((n==1)? myMain->getDataflow()->Suspend() : myNode->Suspend())) {
364 QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_SUSPENDNODE"));
366 syncOnEvent(SUPERV::SuspendReadyState);
367 myMain->getMyThread()->stopThread(tr("MSG_NODE_SUSPENDED1")+myNode->Name()+tr("MSG_NODE_SUSPENDED2"));
372 void SUPERVGUI_CanvasNode::kill() {
373 Trace("SUPERVGUI_CanvasNode::kill");
374 int n = queryList("SUPERVGUI_CanvasNode")->count();
375 if (!((n==1)? myMain->getDataflow()->Kill() : myNode->Kill())) {
376 QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_KILLNODE"));
378 syncOnEvent(SUPERV_Kill);
379 myMain->getMyThread()->stopThread(tr("MSG_NODE_KILLED1")+myNode->Name()+tr("MSG_NODE_KILLED2"));
383 void SUPERVGUI_CanvasNode::stopRestart() {
384 Trace("SUPERVGUI_CanvasNode::stopRestart");
386 int n = queryList("SUPERVGUI_CanvasNode")->count();
387 if ((myNode->State() == SUPERV_Stop) || (myNode->State() == SUPERV_Kill)) {
388 if (!((n==1)? myMain->getDataflow()->Run() : myNode->ReStart())) {
389 QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_RESTARTNODE"));
392 if (!((n==1)? myMain->getDataflow()->Stop() : myNode->Stop())) {
393 QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_STOPNODE"));
398 void SUPERVGUI_CanvasNode::changeInformation() {
399 SUPERVGUI_Information* aDlg = new SUPERVGUI_Information(myNode, !myMain->isEditable());
401 QString aName = myNode->Name();
402 if (!aName.isEmpty() && myMain->isEditable())
408 void SUPERVGUI_CanvasNode::configure()
410 Trace("SUPERVGUI_CanvasNode::configure");
411 QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_NOT_IMPLEMENTED")); // kloss : a faire : lancer l'ihm DATA
414 void SUPERVGUI_CanvasNode::showPython()
416 Trace("SUPERVGUI_CanvasNode::showPython");
417 SUPERVGUI_Python cp(myMain->getStudy()->get_PyInterp(), !myMain->isEditable());
421 bool SUPERVGUI_CanvasNode::isWarning()
423 Trace("SUPERVGUI_CanvasNode::isWarning");
427 bool SUPERVGUI_CanvasNode::isStep()
429 Trace("SUPERVGUI_CanvasNode::isStep");
433 bool SUPERVGUI_CanvasNode::isTrace()
435 Trace("SUPERVGUI_CanvasNode::isTrace");
439 bool SUPERVGUI_CanvasNode::isVerbose()
441 Trace("SUPERVGUI_CanvasNode::isVerbose");
445 void SUPERVGUI_CanvasNode::setWarning(bool b)
447 Trace("SUPERVGUI_CanvasNode::setWarning");
451 void SUPERVGUI_CanvasNode::setStep(bool b)
453 Trace("SUPERVGUI_CanvasNode::setStep");
457 void SUPERVGUI_CanvasNode::setTrace(bool b)
459 Trace("SUPERVGUI_CanvasNode::setTrace");
463 void SUPERVGUI_CanvasNode::setVerbose(bool b)
465 Trace("SUPERVGUI_CanvasNode::setVerbose");
470 void SUPERVGUI_CanvasNode::browse()
473 myBrowseDlg = new SUPERVGUI_BrowseNodeDlg(this);
474 myBrowseDlg->installEventFilter(this);
476 if (!myBrowseDlg->isVisible())
479 myBrowseDlg->raise();
480 myBrowseDlg->setActiveWindow();
481 myBrowseDlg->setFocus();
485 bool SUPERVGUI_CanvasNode::eventFilter( QObject* o, QEvent* e )
487 if (o == myBrowseDlg && e->type() == QEvent::Close)
489 return QObject::eventFilter(o, e);
492 QStringList SUPERVGUI_CanvasNode::getPortsNamesIN(SUPERV_INode theNode, bool theInputPorts)
495 if (!SUPERV_isNull(theNode)) {
496 SUPERV_Ports aPorts = theNode->Ports();
497 for (int i=0; i<aPorts->length(); i++) {
499 if (aPorts[i]->IsInput()) aPNList.append(QString(aPorts[i]->Name()));
502 if (!aPorts[i]->IsInput()) aPNList.append(QString(aPorts[i]->Name()));
508 SUPERV_Port SUPERVGUI_CanvasNode::createInPort()
510 SUPERV_INode aNode = getInlineNode();
511 if (SUPERV_isNull(aNode)) {
512 MESSAGE("SUPERVGUI_CanvasNode::createInPort: Node is wrong type");
515 SUPERVGUI_PortParamsDlg* aDlg = new SUPERVGUI_PortParamsDlg(getPortsNamesIN(aNode,true));
517 SUPERV_Port aPort = aNode->InPort(aDlg->getName().latin1(),
518 aDlg->getType().latin1());
526 SUPERV_Port SUPERVGUI_CanvasNode::createOutPort()
528 SUPERV_INode aNode = getInlineNode();
529 if (SUPERV_isNull(aNode)) {
530 MESSAGE("SUPERVGUI_CanvasNode::createOutPort: Node is wrong type");
534 SUPERVGUI_PortParamsDlg* aDlg = new SUPERVGUI_PortParamsDlg(getPortsNamesIN(aNode,false));
536 SUPERV_Port aPort = aNode->OutPort(aDlg->getName().latin1(),
537 aDlg->getType().latin1());
545 void SUPERVGUI_CanvasNode::addInputPort() {
546 SUPERV_Port aPort = createInPort();
547 if (aPort == NULL) return;
549 createPort(aPort.in());
553 void SUPERVGUI_CanvasNode::addOutputPort() {
554 SUPERV_Port aPort = createOutPort();
555 if (aPort == NULL) return;
557 createPort(aPort.in());
561 void SUPERVGUI_CanvasNode::editFunction()
563 if (getNodeType() == SUPERV::LoopNode) {
564 SUPERVGUI_EditPythonDlg* aDlg = new SUPERVGUI_EditPythonDlg(true);
565 SUPERV_LNode aLNode = getLoopNode();
566 aDlg->setInitFunction(aLNode->PyInit());
567 aDlg->setMoreFunction(aLNode->PyMore());
568 aDlg->setNextFunction(aLNode->PyNext());
570 aLNode->SetPyInit(aDlg->getInitFuncName().latin1(), (aDlg->getInitFunction()).in());
571 aLNode->SetPyMore(aDlg->getMoreFuncName().latin1(), (aDlg->getMoreFunction()).in());
572 aLNode->SetPyNext(aDlg->getNextFuncName().latin1(), (aDlg->getNextFunction()).in());
577 SUPERVGUI_EditPythonDlg* aDlg = new SUPERVGUI_EditPythonDlg();
578 SUPERV_INode aINode = getInlineNode();
579 aDlg->setFunction(aINode->PyFunction());
581 aINode->SetPyFunction(aDlg->getFuncName().latin1(), (aDlg->getFunction()).in());
588 * Called on "Edit ports" popup menu command. See SUPERVGUI_ManagePortsDlg.h
589 * for detailed description of the functionality
591 void SUPERVGUI_CanvasNode::managePorts() {
592 SUPERVGUI_ManagePortsDlg* aDlg = new SUPERVGUI_ManagePortsDlg( this );