1 // SUPERV SUPERVGUI : GUI for Supervisor component
3 // Copyright (C) 2003 OPEN CASCADE
5 // File : SUPERVGUI_Ganvas.cxx
6 // Author : Natalia KOPNOVA
10 #include "SUPERVGUI_Def.h"
11 #include "SUPERVGUI_Main.h"
12 #include "SUPERVGUI_CanvasNode.h"
13 #include "SUPERVGUI_CanvasPort.h"
14 #include "SUPERVGUI_CanvasLink.h"
15 #include "QAD_Config.h"
20 #include <sys/timeb.h>
23 #define UPDATECONTROLNODES(NodesName) \
24 n = nodes->NodesName.length(); \
25 for (int i=0; i<n; i++) { \
26 SUPERV_CNode aCNode = SUPERV::CNode::_narrow(nodes->NodesName[i]); \
27 SUPERV_CNode aCNodeEnd = SUPERV::CNode::_narrow(nodes->NodesName[i]->Coupled()); \
28 ihmNode = getNode(aCNode); \
29 if (ihmNode == NULL) { \
30 myMain->addControlNode(aCNode, aCNodeEnd, false); \
32 ihmNode->move(aCNode->X(), aCNode->Y()); \
33 ihmList->removeRef(ihmNode); \
35 ihmNode = getNode(aCNodeEnd); \
36 ihmList->removeRef(ihmNode); \
41 #define UPDATENODES(NodesName, FuncName) \
42 n = nodes->NodesName.length(); \
43 for (int i=0; i<n; i++) { \
44 SUPERV_CNode aCNode = SUPERV::CNode::_narrow(nodes->NodesName[i]); \
45 ihmNode = getNode(aCNode); \
46 if (ihmNode == NULL) { \
47 myMain->FuncName(aCNode); \
49 ihmNode->move(aCNode->X(), aCNode->Y()); \
50 ihmList->removeRef(ihmNode); \
55 #define UPDATELINK(Link) \
56 ihmLink = getLink(Link.in()); \
57 if (ihmLink == NULL) { \
58 ihmLink = new SUPERVGUI_CanvasLink(this, myMain, Link.in()); \
62 ihmList->removeRef(ihmLink); \
67 #define UPDATESTREAMLINK(Link) \
68 ihmLink = getLink(Link.in()); \
69 if (ihmLink == NULL) { \
70 ihmLink = new SUPERVGUI_CanvasStreamLink(this, myMain, Link.in()); \
74 ihmList->removeRef(ihmLink); \
80 SUPERVGUI_Canvas::SUPERVGUI_Canvas(SUPERVGUI_Main* m):
84 Trace("SUPERVGUI_Canvas::SUPERVGUI_Canvas");
85 myIsControlView = false;
86 // resize(GRAPH_WIDTH, GRAPH_HEIGHT);
88 setDoubleBuffering(true);
90 QColor aColor(MAIN_COLOR);
91 QString aRed = QAD_CONFIG->getSetting("SUPERVGraph:BackgroundColorRed");
92 QString aGreen = QAD_CONFIG->getSetting("SUPERVGraph:BackgroundColorGreen");
93 QString aBlue = QAD_CONFIG->getSetting("SUPERVGraph:BackgroundColorBlue");
94 if( (!aRed.isEmpty()) && (!aGreen.isEmpty()) && (!aBlue.isEmpty()) )
95 aColor = QColor(aRed.toInt(), aGreen.toInt(), aBlue.toInt());
96 setBackgroundColor(aColor);
100 SUPERVGUI_Canvas::~SUPERVGUI_Canvas() {
101 QObjectList* aNodeList = queryList("SUPERVGUI_CanvasNode");
102 QObjectListIt aIt(*aNodeList);
104 while ((anObj = aIt.current()) != 0) {
110 void SUPERVGUI_Canvas::addView(QCanvasView* theView)
112 QCanvas::addView(theView);
113 theView->setPaletteBackgroundColor(backgroundColor().light(120));
116 void SUPERVGUI_Canvas::setFullView()
118 myIsControlView = false;
124 void SUPERVGUI_Canvas::setControlView()
126 myIsControlView = true;
132 void SUPERVGUI_Canvas::updateNodes(bool withPorts)
134 QObjectList* aNodeList = queryList("SUPERVGUI_CanvasNode");
135 QObjectListIt aIt(*aNodeList);
136 SUPERVGUI_CanvasNode* aNode;
137 while ((aNode=(SUPERVGUI_CanvasNode*)aIt.current()) != 0) {
147 void SUPERVGUI_Canvas::updateLinks()
149 QObjectList* aLinkList = queryList("SUPERVGUI_CanvasLink");
150 QObjectListIt aIt(*aLinkList);
151 SUPERVGUI_CanvasLink* aLink;
152 while ((aLink=(SUPERVGUI_CanvasLink*)aIt.current()) != 0) {
159 void SUPERVGUI_Canvas::sync() {
160 // cout << "===> SUPERVGUI_Canvas::sync()" << endl;
161 if (SUPERV_isNull(myMain->getDataflow())) return;
163 SUPERVGUI_CanvasNode* ihmNode;
164 QObjectList* ihmList = queryList("SUPERVGUI_CanvasNode");
165 QObjectListIt it(*ihmList);
166 while ((ihmNode=(SUPERVGUI_CanvasNode*)it.current()) != 0) {
174 * Synchronizes Graph presentation with internal graph structure
176 void SUPERVGUI_Canvas::merge() {
177 // cout << "===> SUPERVGUI_Canvas::merge()" << endl;
178 if (SUPERV_isNull(myMain->getDataflow())) return;
180 SUPERVGUI_CanvasNode* ihmNode;
181 QObjectList* ihmList = queryList("SUPERVGUI_CanvasNode");
182 SUPERV_Nodes nodes = myMain->getDataflow()->Nodes();
184 MESSAGE("CNodes="<<nodes->CNodes.length());
185 MESSAGE("FNodes="<<nodes->FNodes.length());
186 MESSAGE("INodes="<<nodes->INodes.length());
187 MESSAGE("GNodes="<<nodes->GNodes.length());
188 MESSAGE("LNodes="<<nodes->LNodes.length());
189 MESSAGE("SNodes="<<nodes->SNodes.length());
190 MESSAGE("Graphs="<<nodes->Graphs.length());
193 //cout << " update nodes " << endl;
194 UPDATENODES(CNodes, addComputeNode);
195 UPDATENODES(FNodes, addComputeNode);
196 UPDATENODES(INodes, addComputeNode);
197 UPDATENODES(Graphs, addMacroNode);
198 UPDATENODES(GNodes, addGOTONode);
200 //cout << " update control nodes " << endl;
201 UPDATECONTROLNODES(LNodes);
202 UPDATECONTROLNODES(SNodes);
204 QObjectListIt it(*ihmList);
205 while ((ihmNode=(SUPERVGUI_CanvasNode*)it.current()) != 0) {
207 ihmList->removeRef(ihmNode);
213 //cout << " update links " << endl;
214 SUPERVGUI_CanvasLink* ihmLink;
215 ihmList = queryList("SUPERVGUI_CanvasLink");
217 don't work... that's a pity!
219 //SUPERV_Links links = myMain->getDataflow()->Links();
220 SUPERV_Links links = myMain->getDataflow()->GLinks();
221 //cout << "===> Number of links " << links->length() << endl;
222 for (int i = 0; i < links->length(); i++) {
223 UPDATELINK(links[i]);
227 SUPERV_StreamLinks slinks = myMain->getDataflow()->StreamLinks();
228 //cout << "===> Number of stream links " << slinks->length() << endl;
229 for (int i = 0; i < slinks->length(); i++) {
230 UPDATELINK(slinks[i]);
234 if (myMain->getDataflow()->IsStreamGraph()) {
235 SUPERV_StreamGraph aSGraph = myMain->getDataflow()->ToStreamGraph();
236 if (!SUPERV_isNull(aSGraph)) {
237 SUPERV_StreamLinks slinks = aSGraph->StreamLinks(); // <<- doesn't work!!!
238 //cout << "===> Number of stream links " << slinks->length() << endl;
239 for (int i = 0; i < slinks->length(); i++) {
240 UPDATELINK(slinks[i]);
246 // update stream links by old method until StreamLinks() fuction works
247 SUPERVGUI_CanvasPort* aPort;
248 QObjectList* aPortList = queryList("SUPERVGUI_CanvasPort");
249 QObjectListIt aPortIt(*aPortList);
250 while ((aPort=(SUPERVGUI_CanvasPort*)aPortIt.current()) != 0) {
252 if (aPort->getEngine()->IsInput() && aPort->getEngine()->IsLinked()
253 && aPort->getEngine()->Kind() == SUPERV::DataStreamParameter) {
254 if (aPort->getEngine()->Node()->Kind() == SUPERV::EndSwitchNode) {
255 SUPERV_Links aLinks = aPort->getEngine()->Links();
256 for (int i = 0; i < aLinks->length(); i++) {
257 UPDATELINK(aLinks[i]);
260 // else if (aPort->isStream()) {
261 // SUPERV_StreamLink aStreamLink = ((SUPERVGUI_CanvasStreamPortIn*)aPort)->getStreamEngine()->StreamLink();
262 // UPDATESTREAMLINK(aStreamLink);
265 SUPERV_Link aLink = aPort->getEngine()->Link();
272 it = QObjectListIt(*ihmList);
273 while ((ihmLink=(SUPERVGUI_CanvasLink*)it.current()) != 0) {
275 ihmList->removeRef(ihmLink);
279 //cout << " merge done " << endl;
282 void SUPERVGUI_Canvas::setAsFromStudy(bool theToStudy)
284 if (theToStudy) return;
286 SUPERVGUI_CanvasPortOut* aPortOut;
287 QObjectList* aPortList = queryList("SUPERVGUI_CanvasPortOut");
288 QObjectListIt aPortIt(*aPortList);
289 while ((aPortOut=(SUPERVGUI_CanvasPortOut*)aPortIt.current()) != 0) {
291 if (aPortOut->isInStudy()) {
292 aPortOut->setStudyState(theToStudy);
299 SUPERVGUI_CanvasNode* SUPERVGUI_Canvas::getNode(SUPERV::CNode_ptr theNode) const
301 return (SUPERVGUI_CanvasNode*)
302 ((SUPERVGUI_Canvas*)this)->child(theNode->Name(), "SUPERVGUI_CanvasNode");
305 SUPERVGUI_CanvasPort* SUPERVGUI_Canvas::getPort(SUPERV::Port_ptr thePort) const
307 SUPERVGUI_CanvasNode* aNode = getNode(thePort->Node());
308 if (aNode == NULL) return NULL;
310 return (SUPERVGUI_CanvasPort*)
311 aNode->child(getPortName(thePort), "SUPERVGUI_CanvasPort");
314 SUPERVGUI_CanvasLink* SUPERVGUI_Canvas::getLink(SUPERV::Link_ptr theLink) const
316 return (SUPERVGUI_CanvasLink*)
317 ((SUPERVGUI_Canvas*)this)->child(getLinkName(theLink), "SUPERVGUI_CanvasLink");
320 QString SUPERVGUI_Canvas::getPortName(SUPERV::Port_ptr thePort) const
322 QString aName(thePort->Name());
323 if (thePort->IsInput()) aName = aName + ".In";
324 else aName = aName + ".Out";
328 QString SUPERVGUI_Canvas::getLinkName(SUPERV::Link_ptr theLink) const
330 SUPERV_Port aInPort = theLink->InPort();
331 SUPERV_Port aOutPort = theLink->OutPort();
333 QString(aOutPort->Node()->Name()) + "." +
334 QString(aOutPort->Name()) + "-" +
335 QString(aInPort->Node()->Name()) + "." +
336 QString(aInPort->Name());