1 // SUPERV SUPERVGUI : GUI for Supervisor component
3 // Copyright (C) 2003 OPEN CASCADE
5 // File : SUPERVGUI_CanvasPort.cxx
6 // Author : Natalia KOPNOVA
10 #include "SUPERVGUI_CanvasPort.h"
11 #include "SUPERVGUI_CanvasNode.h"
12 #include "SUPERVGUI_CanvasLink.h"
13 #include "SUPERVGUI_CanvasNodePrs.h"
14 #include "SUPERVGUI_Main.h"
15 #include "SUPERVGUI.h"
16 #include "SUPERVGUI_BrowseNodeDlg.h"
19 SUPERVGUI_CanvasPort::SUPERVGUI_CanvasPort(QObject* theParent, SUPERVGUI_Main* theMain, SUPERV::Port_ptr thePort):
25 Trace("SUPERVGUI_CanvasPort::SUPERVGUI_CanvasPort");
26 myPort = SUPERV::Port::_duplicate(thePort);
28 // setName(myPort->Name());
29 setName(myMain->getCanvas()->getPortName(thePort));
32 SUPERVGUI_CanvasPort::~SUPERVGUI_CanvasPort()
34 Trace("SUPERVGUI_CanvasPort::~SUPERVGUI_CanvasPort");
35 if (myPrs) delete myPrs;
38 QValueList<SUPERVGUI_CanvasLink*>::Iterator it;
39 for (it = myLinks.begin(); it != myLinks.end(); ++it) {
44 SUPERVGUI_CanvasPortPrs* SUPERVGUI_CanvasPort::getPrs() const
46 if (myPrs == 0) ((SUPERVGUI_CanvasPort*)this)->myPrs = createPrs();
50 SUPERVGUI_CanvasPortPrs* SUPERVGUI_CanvasPort::createPrs() const
52 return new SUPERVGUI_CanvasPortPrs(myMain->getCanvas(), (SUPERVGUI_CanvasPort*)this);
55 QPopupMenu* SUPERVGUI_CanvasPort::getPopupMenu(QWidget* theParent)
57 QPopupMenu* popup = new QPopupMenu(theParent);
58 if (myMain->isEditable()) {
59 int anItem = popup->insertItem(tr("MSG_SKETCH_LINK"), this, SLOT(sketchLink()));
60 if (myMain->getDataflow()->IsExecuting())
61 popup->setItemEnabled(anItem, false);
63 popup->setItemEnabled(anItem, !myPort->IsInput() || !myPort->IsLinked()
64 || myPort->Kind() == SUPERV::EndSwitchParameter);
65 popup->insertSeparator();
67 if ((myPort->IsEndSwitch() && myPort->IsInput()) ||
68 (myPort->IsInLine() && myPort->Node()->Kind() != SUPERV::EndLoopNode
69 && !(myPort->Node()->Kind() == SUPERV::LoopNode && !myPort->IsInput()))) {
70 popup->insertItem(tr("ITM_DEL_PORT"), this, SLOT(remove()));
73 int anItem = popup->insertItem(tr("MSG_BROWSE"), this, SLOT(browse()));
74 // if (getEngine()->IsLinked())
75 // popup->setItemEnabled(anItem, getEngine()->State() == SUPERV_Ready);
77 // popup->setItemEnabled(anItem, getEngine()->HasInput());
82 QPoint SUPERVGUI_CanvasPort::getConnectionPoint() const
84 QPoint p = getPrs()->getConnectionPoint();
86 if (!getPrs()->isVisible()) {
87 if (parent() && parent()->inherits("SUPERVGUI_CanvasNode")) {
88 SUPERVGUI_CanvasNodePrs* aNode = ((SUPERVGUI_CanvasNode*) parent())->getPrs();
89 if (myPort->IsInput())
90 p = aNode->getInConnectionPoint();
92 p = aNode->getOutConnectionPoint();
98 void SUPERVGUI_CanvasPort::update()
100 // ignore update if node itself is destroyed (critical for Start/End control nodes)
101 if (!((SUPERVGUI_CanvasNode*) parent())->isDestroyed())
102 getPrs()->update(true);
105 void SUPERVGUI_CanvasPort::sync()
110 void SUPERVGUI_CanvasPort::sketchLink()
112 myMain->getCanvasView()->startSketch(this);
115 void SUPERVGUI_CanvasPort::remove() {
116 Trace("SUPERVGUI_CanvasPort::remove");
121 void SUPERVGUI_CanvasPort::moveBy(int dx, int dy)
123 getPrs()->moveBy(dx, dy);
125 QValueList<SUPERVGUI_CanvasLink*>::Iterator it;
126 for (it = myLinks.begin(); it != myLinks.end(); ++it) {
127 (*it)->moveByPort(this, dx, dy);
131 void SUPERVGUI_CanvasPort::addLink(SUPERVGUI_CanvasLink* theLink)
133 myLinks.append(theLink);
137 void SUPERVGUI_CanvasPort::removeLink(SUPERVGUI_CanvasLink* theLink)
140 myLinks.remove(theLink);
145 void SUPERVGUI_CanvasPort::updateLinks()
147 QValueList<SUPERVGUI_CanvasLink*>::Iterator it;
148 for (it = myLinks.begin(); it != myLinks.end(); ++it) {
149 (*it)->moveByPort(this);
153 void SUPERVGUI_CanvasPort::browse()
155 QString aMes(getEngine()->IsInput()? tr("MSG_IPORT_VAL") : tr("MSG_OPORT_VAL"));
156 aMes += getEngine()->ToString();
157 QMessageBox::information(QAD_Application::getDesktop(), tr("MSG_INFO"), aMes);
161 //***********************************************************
163 //***********************************************************
164 SUPERVGUI_CanvasPortIn::SUPERVGUI_CanvasPortIn(QObject* theParent, SUPERVGUI_Main* theMain, SUPERV::Port_ptr thePort):
165 SUPERVGUI_CanvasPort(theParent, theMain, thePort)
167 Trace("SUPERVGUI_CanvasPortIn::SUPERVGUI_CanvasPortIn");
171 SUPERVGUI_CanvasPortIn::~SUPERVGUI_CanvasPortIn()
173 Trace("SUPERVGUI_CanvasPortIn::~SUPERVGUI_CanvasPortIn");
176 QPopupMenu* SUPERVGUI_CanvasPortIn::getPopupMenu(QWidget* theParent)
178 QPopupMenu* popup = SUPERVGUI_CanvasPort::getPopupMenu(theParent);
179 bool editable = getEngine()->IsInput() && (!getEngine()->IsLinked());
181 if (!getEngine()->IsGate() && editable)
182 popup->insertItem(tr("MSG_SETVALUE"), this, SLOT(setInput()));
187 void SUPERVGUI_CanvasPortIn::setValue(const char* theValue)
189 if (getEngine()->Input(Supervision.getEngine()->StringValue(theValue)))
192 QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_SETVAL"));
195 void SUPERVGUI_CanvasPortIn::setInput()
198 myDlg = new SUPERVGUI_GetValueDlg(this);
199 myDlg->installEventFilter(this);
201 if (!myDlg->isVisible())
205 myDlg->setActiveWindow();
211 bool SUPERVGUI_CanvasPortIn::eventFilter(QObject* o, QEvent* e)
213 if (o == myDlg && e->type() == QEvent::Close)
215 return SUPERVGUI_CanvasPort::eventFilter(o, e);
219 //***********************************************************
221 //***********************************************************
222 SUPERVGUI_CanvasPortOut::SUPERVGUI_CanvasPortOut(QObject* theParent, SUPERVGUI_Main* theMain, SUPERV::Port_ptr thePort):
223 SUPERVGUI_CanvasPort(theParent, theMain, thePort)
225 Trace("SUPERVGUI_CanvasPortOut::SUPERVGUI_CanvasPortOut");
229 SUPERVGUI_CanvasPortOut::~SUPERVGUI_CanvasPortOut()
231 Trace("SUPERVGUI_CanvasPortOut::~SUPERVGUI_CanvasPortOut");
234 QPopupMenu* SUPERVGUI_CanvasPortOut::getPopupMenu(QWidget* theParent)
236 QPopupMenu* popup = SUPERVGUI_CanvasPort::getPopupMenu(theParent);
238 if (!getEngine()->IsGate()) {
239 popup->insertItem(myInStudy?tr("MSG_NOT_INSTUDY"):tr("MSG_PUT_INSTUDY"),
240 this, SLOT(toStudy()));
246 void SUPERVGUI_CanvasPortOut::sync()
248 bool ok = getEngine()->State() == SUPERV_Ready;
249 if (ok && myInStudy) {
250 myInStudy = getMain()->putDataStudy(getEngine(), STUDY_PORT_OUT);
252 SUPERVGUI_CanvasPort::update();
255 void SUPERVGUI_CanvasPortOut::toStudy()
257 Trace("SUPERVGUI_CanvasPortOut::toStudy");
259 if (getMain()->getStudy()->getStudyDocument()->GetProperties()->IsLocked()) {
260 QMessageBox::warning(QAD_Application::getDesktop(), tr("WRN_WARNING"),
261 tr("WRN_STUDY_LOCKED"));
265 if (!getMain()->isFromStudy()) {
266 if (getMain()->addStudy())
267 getMain()->setAsFromStudy(true);
269 myInStudy = !myInStudy;
271 getMain()->getCanvas()->update();
276 //***********************************************************
278 //***********************************************************
279 SUPERVGUI_CanvasStreamPortIn::SUPERVGUI_CanvasStreamPortIn(QObject* theParent, SUPERVGUI_Main* theMain,
280 SUPERV::StreamPort_ptr thePort):
281 SUPERVGUI_CanvasPortIn(theParent, theMain, thePort)
283 myStreamPort = SUPERV::StreamPort::_duplicate(thePort);
286 QPopupMenu* SUPERVGUI_CanvasStreamPortIn::getPopupMenu(QWidget* theParent)
288 QPopupMenu* popup = SUPERVGUI_CanvasPortIn::getPopupMenu(theParent);
289 popup->insertItem(tr("MSG_STREAM_PARAM"),this, SLOT(setParams()));
293 void SUPERVGUI_CanvasStreamPortIn::setParams()
295 SUPERVGUI_StreamInDlg* aDlg = new SUPERVGUI_StreamInDlg(this);
301 //***********************************************************
302 // Stream Output Port
303 //***********************************************************
304 SUPERVGUI_CanvasStreamPortOut::SUPERVGUI_CanvasStreamPortOut(QObject* theParent, SUPERVGUI_Main* theMain,
305 SUPERV::StreamPort_ptr thePort):
306 SUPERVGUI_CanvasPortOut(theParent, theMain, thePort)
308 myStreamPort = SUPERV::StreamPort::_duplicate(thePort);
312 QPopupMenu* SUPERVGUI_CanvasStreamPortOut::getPopupMenu(QWidget* theParent)
314 QPopupMenu* popup = SUPERVGUI_CanvasPortOut::getPopupMenu(theParent);
315 popup->insertItem(tr("MSG_STREAM_PARAM"),this, SLOT(setParams()));
319 void SUPERVGUI_CanvasStreamPortOut::setParams()
321 SUPERVGUI_StreamOutDlg* aDlg = new SUPERVGUI_StreamOutDlg(this);