Salome HOME
Merge with version on tag OCC-V2_1_0d
[modules/superv.git] / src / SUPERVGUI / SUPERVGUI_Canvas.cxx
1 //  SUPERV SUPERVGUI : GUI for Supervisor component
2 //
3 //  Copyright (C) 2003  OPEN CASCADE
4 //
5 //  File   : SUPERVGUI_Ganvas.cxx
6 //  Author : Natalia KOPNOVA
7 //  Module : SUPERV
8
9 using namespace std;
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"
16
17 //#define CHECKTIME
18
19 #ifdef CHECKTIME
20 #include <sys/timeb.h>
21 #endif
22
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); \
31       } else { \
32         ihmNode->move(aCNode->X(), aCNode->Y()); \
33         ihmList->removeRef(ihmNode); \
34         ihmNode->merge(); \
35         ihmNode = getNode(aCNodeEnd); \
36         ihmList->removeRef(ihmNode); \
37         ihmNode->merge(); \
38       } \
39     }
40
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); \
48       } else { \
49         ihmNode->move(aCNode->X(), aCNode->Y()); \
50         ihmList->removeRef(ihmNode); \
51         ihmNode->merge(); \
52       } \
53     }
54
55 #define UPDATELINK(Link)   \
56     ihmLink = getLink(Link.in()); \
57     if (ihmLink == NULL) { \
58       ihmLink = new SUPERVGUI_CanvasLink(this, myMain, Link.in()); \
59       ihmLink->show(); \
60     } \
61     else { \
62       ihmList->removeRef(ihmLink); \
63       ihmLink->merge(); \
64     }
65
66 /*
67 #define UPDATESTREAMLINK(Link)   \
68     ihmLink = getLink(Link.in()); \
69     if (ihmLink == NULL) { \
70       ihmLink = new SUPERVGUI_CanvasStreamLink(this, myMain, Link.in()); \
71       ihmLink->show(); \
72     } \
73     else { \
74       ihmList->removeRef(ihmLink); \
75       ihmLink->merge(); \
76     }
77 */
78
79
80 SUPERVGUI_Canvas::SUPERVGUI_Canvas(SUPERVGUI_Main* m):
81     QCanvas(),
82     myMain(m)
83 {
84   Trace("SUPERVGUI_Canvas::SUPERVGUI_Canvas");
85   myIsControlView = false;
86   // resize(GRAPH_WIDTH, GRAPH_HEIGHT);
87   resize(800, 600);
88   setDoubleBuffering(true);
89
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);
97 }
98
99
100 SUPERVGUI_Canvas::~SUPERVGUI_Canvas() {
101   QObjectList* aNodeList = queryList("SUPERVGUI_CanvasNode");
102   QObjectListIt aIt(*aNodeList);
103   QObject* anObj;
104   while ((anObj = aIt.current()) != 0) {
105     ++aIt;
106     delete anObj;
107   }
108 }
109
110 void SUPERVGUI_Canvas::addView(QCanvasView* theView)
111 {
112   QCanvas::addView(theView);
113   theView->setPaletteBackgroundColor(backgroundColor().light(120));
114 }
115
116 void SUPERVGUI_Canvas::setFullView() 
117 {
118   myIsControlView = false;
119   updateNodes(true);
120   updateLinks();
121   update();
122 }
123
124 void SUPERVGUI_Canvas::setControlView() 
125 {
126   myIsControlView = true;
127   updateNodes(false);
128   updateLinks();
129   update();
130 }
131
132 void SUPERVGUI_Canvas::updateNodes(bool withPorts) 
133 {
134   QObjectList* aNodeList = queryList("SUPERVGUI_CanvasNode");
135   QObjectListIt aIt(*aNodeList);
136   SUPERVGUI_CanvasNode* aNode;
137   while ((aNode=(SUPERVGUI_CanvasNode*)aIt.current()) != 0) {
138     ++aIt;
139     if (withPorts)
140       aNode->showAll();
141     else
142       aNode->hideAll();
143   }
144   delete aNodeList;
145 }
146
147 void SUPERVGUI_Canvas::updateLinks() 
148 {
149   QObjectList* aLinkList = queryList("SUPERVGUI_CanvasLink");
150   QObjectListIt aIt(*aLinkList);
151   SUPERVGUI_CanvasLink* aLink;
152   while ((aLink=(SUPERVGUI_CanvasLink*)aIt.current()) != 0) {
153     ++aIt;
154     aLink->merge();
155   }
156   delete aLinkList;
157 }
158
159 void SUPERVGUI_Canvas::sync() {
160   //  MESSAGE("===> SUPERVGUI_Canvas::sync()");
161   if (SUPERV_isNull(myMain->getDataflow())) return;
162       
163   SUPERVGUI_CanvasNode* ihmNode;
164   QObjectList* ihmList = queryList("SUPERVGUI_CanvasNode");
165   QObjectListIt it(*ihmList);
166   while ((ihmNode=(SUPERVGUI_CanvasNode*)it.current()) != 0) {
167     ++it;
168     ihmNode->sync();
169   }
170   delete ihmList;
171 }
172
173 /** 
174  * Synchronizes Graph presentation with internal graph structure
175  */
176 void SUPERVGUI_Canvas::merge() {
177   //  MESSAGE("===> SUPERVGUI_Canvas::merge()");
178   if (SUPERV_isNull(myMain->getDataflow())) return;
179       
180   SUPERVGUI_CanvasNode* ihmNode;
181   QObjectList* ihmList = queryList("SUPERVGUI_CanvasNode");
182   SUPERV_Nodes nodes = myMain->getDataflow()->Nodes();
183
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());
191
192   int n;
193   UPDATENODES(CNodes, addComputeNode);
194   UPDATENODES(FNodes, addComputeNode);
195   UPDATENODES(INodes, addComputeNode);
196   UPDATENODES(Graphs, addMacroNode);
197   UPDATENODES(GNodes, addGOTONode);
198
199   UPDATECONTROLNODES(LNodes);    
200   UPDATECONTROLNODES(SNodes);
201
202   QObjectListIt it(*ihmList);
203   while ((ihmNode=(SUPERVGUI_CanvasNode*)it.current()) != 0) {
204     ++it;
205     ihmList->removeRef(ihmNode);
206     delete ihmNode;
207   }
208   delete ihmList;
209
210   // update links
211   SUPERVGUI_CanvasLink* ihmLink;
212   ihmList = queryList("SUPERVGUI_CanvasLink");
213   /*
214   don't work... that's a pity!
215   */
216   //SUPERV_Links links = myMain->getDataflow()->Links();
217   SUPERV_Links links = myMain->getDataflow()->GLinks();
218   for (int i = 0; i < links->length(); i++) {
219     UPDATELINK(links[i]);
220   }
221
222   /*
223   SUPERV_StreamLinks slinks = myMain->getDataflow()->StreamLinks();
224   for (int i = 0; i < slinks->length(); i++) {
225     UPDATELINK(slinks[i]);
226   }
227   */
228   /*
229   if (myMain->getDataflow()->IsStreamGraph()) {
230     SUPERV_StreamGraph aSGraph = myMain->getDataflow()->ToStreamGraph();
231     if (!SUPERV_isNull(aSGraph)) {
232       SUPERV_StreamLinks slinks = aSGraph->StreamLinks(); // <<- doesn't work!!!
233       for (int i = 0; i < slinks->length(); i++) {
234         UPDATELINK(slinks[i]);
235       }
236     }
237   }
238   */
239
240   // update stream links by old method until StreamLinks() fuction works
241   SUPERVGUI_CanvasPort* aPort;
242   QObjectList* aPortList = queryList("SUPERVGUI_CanvasPort");
243   QObjectListIt aPortIt(*aPortList);
244   while ((aPort=(SUPERVGUI_CanvasPort*)aPortIt.current()) != 0) {
245     ++aPortIt;
246     if (aPort->getEngine()->IsInput() && aPort->getEngine()->IsLinked() 
247         && aPort->getEngine()->Kind() == SUPERV::DataStreamParameter) {
248       if (aPort->getEngine()->Node()->Kind() == SUPERV::EndSwitchNode) {
249         SUPERV_Links aLinks = aPort->getEngine()->Links();
250         for (int i = 0; i < aLinks->length(); i++) {
251           UPDATELINK(aLinks[i]);
252         }
253       }
254 //    else if (aPort->isStream()) {
255 //      SUPERV_StreamLink aStreamLink = ((SUPERVGUI_CanvasStreamPortIn*)aPort)->getStreamEngine()->StreamLink();
256 //      UPDATESTREAMLINK(aStreamLink);
257 //    }
258       else {
259         SUPERV_Link aLink = aPort->getEngine()->Link();
260         UPDATELINK(aLink);
261       }
262     }
263   }
264   delete aPortList;
265
266   it = QObjectListIt(*ihmList);
267   while ((ihmLink=(SUPERVGUI_CanvasLink*)it.current()) != 0) {
268     ++it;
269     ihmList->removeRef(ihmLink);
270     delete ihmLink;
271   }
272   delete ihmList;
273 }
274
275 void SUPERVGUI_Canvas::setAsFromStudy(bool theToStudy)
276 {
277   if (theToStudy) return;
278   
279   SUPERVGUI_CanvasPortOut* aPortOut;
280   QObjectList* aPortList = queryList("SUPERVGUI_CanvasPortOut");
281   QObjectListIt aPortIt(*aPortList);
282   while ((aPortOut=(SUPERVGUI_CanvasPortOut*)aPortIt.current()) != 0) {
283     ++aPortIt;
284     if (aPortOut->isInStudy()) {
285       aPortOut->setStudyState(theToStudy);
286       aPortOut->sync();
287     }
288   }
289   delete aPortList;
290 }
291
292 SUPERVGUI_CanvasNode* SUPERVGUI_Canvas::getNode(SUPERV::CNode_ptr theNode) const
293 {
294   return (SUPERVGUI_CanvasNode*) 
295     ((SUPERVGUI_Canvas*)this)->child(theNode->Name(), "SUPERVGUI_CanvasNode");
296 }
297
298 SUPERVGUI_CanvasPort* SUPERVGUI_Canvas::getPort(SUPERV::Port_ptr thePort) const
299 {
300   SUPERVGUI_CanvasNode* aNode = getNode(thePort->Node());
301   if (aNode == NULL) return NULL;
302
303   return (SUPERVGUI_CanvasPort*) 
304     aNode->child(getPortName(thePort), "SUPERVGUI_CanvasPort");
305 }
306
307 SUPERVGUI_CanvasLink* SUPERVGUI_Canvas::getLink(SUPERV::Link_ptr theLink) const
308 {
309   return (SUPERVGUI_CanvasLink*) 
310     ((SUPERVGUI_Canvas*)this)->child(getLinkName(theLink), "SUPERVGUI_CanvasLink");
311 }
312
313 QString SUPERVGUI_Canvas::getPortName(SUPERV::Port_ptr thePort) const
314 {
315   QString aName(thePort->Name());
316   if (thePort->IsInput()) aName = aName + ".In";
317   else aName = aName + ".Out";
318   return aName;
319 }
320
321 QString SUPERVGUI_Canvas::getLinkName(SUPERV::Link_ptr theLink) const
322 {
323   SUPERV_Port aInPort = theLink->InPort();
324   SUPERV_Port aOutPort = theLink->OutPort();
325   QString aName = 
326     QString(aOutPort->Node()->Name()) + "." +
327     QString(aOutPort->Name()) + "-" +
328     QString(aInPort->Node()->Name()) + "." +
329     QString(aInPort->Name());
330   return aName;
331 }