Salome HOME
db186c34dd01121d235bb8813941041ea5a533a2
[modules/superv.git] / src / SUPERVGUI / SUPERVGUI_CanvasPort.cxx
1 //  SUPERV SUPERVGUI : GUI for Supervisor component
2 //
3 //  Copyright (C) 2003  OPEN CASCADE
4 //
5 //  File   : SUPERVGUI_CanvasPort.cxx
6 //  Author : Natalia KOPNOVA
7 //  Module : SUPERV
8
9 using namespace std;
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"
17
18
19 SUPERVGUI_CanvasPort::SUPERVGUI_CanvasPort(QObject* theParent, SUPERVGUI_Main* theMain, SUPERV::Port_ptr thePort):
20     QObject(theParent),
21     myMain(theMain),
22     myPrs(0),
23     isIgnore(false)
24 {
25   Trace("SUPERVGUI_CanvasPort::SUPERVGUI_CanvasPort");
26   myPort = SUPERV::Port::_duplicate(thePort);
27
28   // setName(myPort->Name());
29   setName(myMain->getCanvas()->getPortName(thePort));
30 }
31
32 SUPERVGUI_CanvasPort::~SUPERVGUI_CanvasPort()
33 {
34   Trace("SUPERVGUI_CanvasPort::~SUPERVGUI_CanvasPort");
35   if (myPrs) delete myPrs;
36
37   isIgnore = true;
38   QValueList<SUPERVGUI_CanvasLink*>::Iterator it;
39   for (it = myLinks.begin(); it != myLinks.end(); ++it) {
40     delete *it;
41   }
42 }
43
44 SUPERVGUI_CanvasPortPrs* SUPERVGUI_CanvasPort::getPrs() const
45 {
46   if (myPrs == 0) ((SUPERVGUI_CanvasPort*)this)->myPrs = createPrs();
47   return myPrs;
48 }
49
50 SUPERVGUI_CanvasPortPrs* SUPERVGUI_CanvasPort::createPrs() const
51 {
52   return new SUPERVGUI_CanvasPortPrs(myMain->getCanvas(), (SUPERVGUI_CanvasPort*)this);
53 }
54
55 QPopupMenu* SUPERVGUI_CanvasPort::getPopupMenu(QWidget* theParent) 
56 {
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);
62     else
63       popup->setItemEnabled(anItem, !myPort->IsInput() || !myPort->IsLinked()
64                             || myPort->Kind() == SUPERV::EndSwitchParameter);
65     popup->insertSeparator();
66   }
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()));    
71   }
72
73   int anItem = popup->insertItem(tr("MSG_BROWSE"), this, SLOT(browse()));
74 //   if (getEngine()->IsLinked())
75 //     popup->setItemEnabled(anItem, getEngine()->State() == SUPERV_Ready);
76 //   else 
77 //     popup->setItemEnabled(anItem, getEngine()->HasInput());
78
79   return popup;
80 }
81
82 QPoint SUPERVGUI_CanvasPort::getConnectionPoint() const
83 {
84   QPoint p = getPrs()->getConnectionPoint();
85
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();
91       else
92         p = aNode->getOutConnectionPoint();
93     }
94   }
95   return p;
96 }
97
98 void SUPERVGUI_CanvasPort::update() 
99 {
100   // ignore update if node itself is destroyed (critical for Start/End control nodes)
101   if (!((SUPERVGUI_CanvasNode*) parent())->isDestroyed())
102     getPrs()->update(true);
103 }
104
105 void SUPERVGUI_CanvasPort::sync() 
106 {
107   getPrs()->update();
108 }
109
110 void SUPERVGUI_CanvasPort::sketchLink() 
111 {
112   myMain->getCanvasView()->startSketch(this);
113 }
114
115 void SUPERVGUI_CanvasPort::remove() {
116   Trace("SUPERVGUI_CanvasPort::remove");
117   myPort->destroy();
118   delete this;
119 }
120
121 void SUPERVGUI_CanvasPort::moveBy(int dx, int dy) 
122 {
123   getPrs()->moveBy(dx, dy);
124
125   QValueList<SUPERVGUI_CanvasLink*>::Iterator it;
126   for (it = myLinks.begin(); it != myLinks.end(); ++it) {
127     (*it)->moveByPort(this, dx, dy);
128   }
129 }
130
131 void SUPERVGUI_CanvasPort::addLink(SUPERVGUI_CanvasLink* theLink)
132 {
133   myLinks.append(theLink);
134   update();
135 }
136
137 void SUPERVGUI_CanvasPort::removeLink(SUPERVGUI_CanvasLink* theLink)
138 {
139   if (!isIgnore) {
140     myLinks.remove(theLink);
141     update();
142   }
143 }
144
145 void SUPERVGUI_CanvasPort::updateLinks() 
146 {
147   QValueList<SUPERVGUI_CanvasLink*>::Iterator it;
148   for (it = myLinks.begin(); it != myLinks.end(); ++it) {
149     (*it)->moveByPort(this);
150   }
151 }
152
153 void SUPERVGUI_CanvasPort::browse() 
154 {
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);
158 }
159
160
161 //***********************************************************
162 // Input Port
163 //***********************************************************
164 SUPERVGUI_CanvasPortIn::SUPERVGUI_CanvasPortIn(QObject* theParent, SUPERVGUI_Main* theMain, SUPERV::Port_ptr thePort):
165   SUPERVGUI_CanvasPort(theParent, theMain, thePort)
166 {
167   Trace("SUPERVGUI_CanvasPortIn::SUPERVGUI_CanvasPortIn");
168   myDlg = 0;
169 }
170
171 SUPERVGUI_CanvasPortIn::~SUPERVGUI_CanvasPortIn()
172 {
173   Trace("SUPERVGUI_CanvasPortIn::~SUPERVGUI_CanvasPortIn");
174 }
175
176 QPopupMenu* SUPERVGUI_CanvasPortIn::getPopupMenu(QWidget* theParent) 
177 {
178   QPopupMenu* popup = SUPERVGUI_CanvasPort::getPopupMenu(theParent);
179   bool editable = getEngine()->IsInput() && (!getEngine()->IsLinked());
180
181   if (!getEngine()->IsGate() && editable)
182     popup->insertItem(tr("MSG_SETVALUE"), this, SLOT(setInput()));
183
184   return popup;
185 }
186
187 void SUPERVGUI_CanvasPortIn::setValue(const char* theValue) 
188 {
189   if (getEngine()->Input(Supervision.getEngine()->StringValue(theValue)))
190     update(); // sync();
191   else
192     QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_SETVAL"));
193 }
194
195 void SUPERVGUI_CanvasPortIn::setInput() 
196 {
197   if (!myDlg) {
198     myDlg = new SUPERVGUI_GetValueDlg(this);
199     myDlg->installEventFilter(this);
200   }
201   if (!myDlg->isVisible())
202     myDlg->show();
203   else {
204     myDlg->raise();
205     myDlg->setActiveWindow();
206     myDlg->setFocus();
207   }
208   
209 }
210
211 bool SUPERVGUI_CanvasPortIn::eventFilter(QObject* o, QEvent* e)
212 {
213   if (o == myDlg && e->type() == QEvent::Close)
214     myDlg = 0;
215   return SUPERVGUI_CanvasPort::eventFilter(o, e);
216 }
217
218
219 //***********************************************************
220 // Output Port
221 //***********************************************************
222 SUPERVGUI_CanvasPortOut::SUPERVGUI_CanvasPortOut(QObject* theParent, SUPERVGUI_Main* theMain, SUPERV::Port_ptr thePort):
223   SUPERVGUI_CanvasPort(theParent, theMain, thePort)
224 {
225   Trace("SUPERVGUI_CanvasPortOut::SUPERVGUI_CanvasPortOut");
226   myInStudy = false;
227 }
228
229 SUPERVGUI_CanvasPortOut::~SUPERVGUI_CanvasPortOut()
230 {
231   Trace("SUPERVGUI_CanvasPortOut::~SUPERVGUI_CanvasPortOut");
232 }
233
234 QPopupMenu* SUPERVGUI_CanvasPortOut::getPopupMenu(QWidget* theParent) 
235 {
236   QPopupMenu* popup = SUPERVGUI_CanvasPort::getPopupMenu(theParent);
237
238   if (!getEngine()->IsGate()) {
239     popup->insertItem(myInStudy?tr("MSG_NOT_INSTUDY"):tr("MSG_PUT_INSTUDY"), 
240                       this, SLOT(toStudy()));
241   }
242
243   return popup;
244 }
245
246 void SUPERVGUI_CanvasPortOut::sync() 
247 {
248   bool ok = getEngine()->State() == SUPERV_Ready;
249   if (ok && myInStudy) {
250     myInStudy = getMain()->putDataStudy(getEngine(), STUDY_PORT_OUT);
251   }
252   SUPERVGUI_CanvasPort::update();
253 }
254
255 void SUPERVGUI_CanvasPortOut::toStudy() 
256 {
257   Trace("SUPERVGUI_CanvasPortOut::toStudy");
258
259   if (getMain()->getStudy()->getStudyDocument()->GetProperties()->IsLocked()) {
260     QMessageBox::warning(QAD_Application::getDesktop(), tr("WRN_WARNING"), 
261                          tr("WRN_STUDY_LOCKED"));
262     return;
263   }
264
265   if (!getMain()->isFromStudy()) {
266     if (getMain()->addStudy())
267       getMain()->setAsFromStudy(true);
268   }
269   myInStudy = !myInStudy;
270   sync();
271   getMain()->getCanvas()->update();
272 }
273
274
275
276 //***********************************************************
277 // Stream Input Port
278 //***********************************************************
279 SUPERVGUI_CanvasStreamPortIn::SUPERVGUI_CanvasStreamPortIn(QObject* theParent, SUPERVGUI_Main* theMain, 
280                                                            SUPERV::StreamPort_ptr thePort):
281   SUPERVGUI_CanvasPortIn(theParent, theMain, thePort)
282 {
283   myStreamPort = SUPERV::StreamPort::_duplicate(thePort);
284 }
285
286 QPopupMenu* SUPERVGUI_CanvasStreamPortIn::getPopupMenu(QWidget* theParent) 
287 {
288   QPopupMenu* popup = SUPERVGUI_CanvasPortIn::getPopupMenu(theParent);
289   popup->insertItem(tr("MSG_STREAM_PARAM"),this, SLOT(setParams()));
290   return popup;
291 }
292
293 void SUPERVGUI_CanvasStreamPortIn::setParams()
294 {
295   SUPERVGUI_StreamInDlg* aDlg = new SUPERVGUI_StreamInDlg(this);
296   aDlg->exec();
297   delete aDlg;
298 }
299
300
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)
307 {
308   myStreamPort = SUPERV::StreamPort::_duplicate(thePort);
309 }
310
311
312 QPopupMenu* SUPERVGUI_CanvasStreamPortOut::getPopupMenu(QWidget* theParent) 
313 {
314   QPopupMenu* popup = SUPERVGUI_CanvasPortOut::getPopupMenu(theParent);
315   popup->insertItem(tr("MSG_STREAM_PARAM"),this, SLOT(setParams()));
316   return popup;
317 }
318
319 void SUPERVGUI_CanvasStreamPortOut::setParams()
320 {
321   SUPERVGUI_StreamOutDlg* aDlg = new SUPERVGUI_StreamOutDlg(this);
322   aDlg->exec();
323   delete aDlg;
324 }