]> SALOME platform Git repositories - modules/superv.git/blob - src/SUPERVGUI/SUPERVGUI_Canvas.cxx
Salome HOME
Join modifications from branch BR_3_1_0deb
[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.h"
11 #include "SUPERVGUI_Def.h"
12 #include "SUPERVGUI_Main.h"
13 #include "SUPERVGUI_CanvasNode.h"
14 #include "SUPERVGUI_CanvasPort.h"
15 #include "SUPERVGUI_CanvasLink.h"
16
17 #include "SUIT_ResourceMgr.h"
18 #include "SUIT_Session.h"
19
20 //#define CHECKTIME
21
22 #ifdef CHECKTIME
23 #include <sys/timeb.h>
24 #endif
25
26 #define UPDATECONTROLNODES(NodesName)  \
27     n = nodes->NodesName.length(); \
28     for (int i=0; i<n; i++) { \
29       SUPERV_CNode aCNode = SUPERV::CNode::_narrow(nodes->NodesName[i]); \
30       SUPERV_CNode aCNodeEnd = SUPERV::CNode::_narrow(nodes->NodesName[i]->Coupled()); \
31       ihmNode = getNode(aCNode); \
32       if (ihmNode == NULL) { \
33         myMain->addControlNode(aCNode, aCNodeEnd, false); \
34       } else { \
35         ihmNode->move(aCNode->X(), aCNode->Y()); \
36         ihmList->removeRef(ihmNode); \
37         ihmNode->merge(); \
38         ihmNode = getNode(aCNodeEnd); \
39         ihmList->removeRef(ihmNode); \
40         ihmNode->merge(); \
41       } \
42     }
43
44 #define UPDATENODES(NodesName, FuncName)   \
45     n = nodes->NodesName.length(); \
46     for (int i=0; i<n; i++) { \
47       SUPERV_CNode aCNode = SUPERV::CNode::_narrow(nodes->NodesName[i]); \
48       ihmNode = getNode(aCNode); \
49       if (ihmNode == NULL) { \
50         myMain->FuncName(aCNode); \
51       } else { \
52         ihmNode->move(aCNode->X(), aCNode->Y()); \
53         ihmList->removeRef(ihmNode); \
54         ihmNode->merge(); \
55       } \
56     }
57
58 #define UPDATELINK(Link)   \
59     ihmLink = getLink(Link.in()); \
60     if (ihmLink == NULL) { \
61       ihmLink = new SUPERVGUI_CanvasLink(this, myMain, Link.in()); \
62       ihmLink->show(); \
63     } \
64     else { \
65       ihmList->removeRef(ihmLink); \
66       ihmLink->merge(); \
67     }
68
69 /*
70 #define UPDATESTREAMLINK(Link)   \
71     ihmLink = getLink(Link.in()); \
72     if (ihmLink == NULL) { \
73       ihmLink = new SUPERVGUI_CanvasStreamLink(this, myMain, Link.in()); \
74       ihmLink->show(); \
75     } \
76     else { \
77       ihmList->removeRef(ihmLink); \
78       ihmLink->merge(); \
79     }
80 */
81
82
83 SUPERVGUI_Canvas::SUPERVGUI_Canvas( SUPERVGUI_Main* m, SUIT_ResourceMgr* mgr ):
84     QCanvas(),
85     myMain(m)
86 {
87   Trace("SUPERVGUI_Canvas::SUPERVGUI_Canvas");
88   myIsControlView = false;
89   // resize(GRAPH_WIDTH, GRAPH_HEIGHT);
90   resize(1050, 750);
91   setDoubleBuffering(true);
92
93   // mkr : IPAL10825 -->
94   SUPERVGUI* aSupMod = SUPERVGUI::Supervision();
95   if ( !aSupMod ) {
96     MESSAGE("NULL Supervision module!");
97     return;
98   }
99   QColor aColor =  aSupMod->getIVFBackgroundColor();
100   if ( !aColor.isValid() )
101     aColor = mgr->colorValue( "SUPERVGraph", "Background", DEF_MAIN_COLOR );
102   // <--
103      
104   //aColor = QColor(SUIT_Session::session()->resourceMgr()->integerValue( "SUPERVGraph", "BackgroundColorRed" ), 
105   //              SUIT_Session::session()->resourceMgr()->integerValue( "SUPERVGraph", "BackgroundColorGreen" ), 
106   //              SUIT_Session::session()->resourceMgr()->integerValue( "SUPERVGraph", "BackgroundColorBlue" ) );
107   setBackgroundColor(aColor);
108 }
109
110
111 SUPERVGUI_Canvas::~SUPERVGUI_Canvas() {
112   // asv : 17.01.05 : why delete its own children (CanvasNode-s)?
113   // they must be destroyed automatically.
114   QObjectList* aNodeList = queryList("SUPERVGUI_CanvasNode");
115   QObjectListIt aIt(*aNodeList);
116   QObject* anObj;
117   while ( (anObj = aIt.current()) != 0 ) {
118     ++aIt;
119     aNodeList->removeRef(anObj);
120     delete anObj;
121   }
122   // asv : list returned by queryList() must be removed
123   delete aNodeList;
124 }
125
126 void SUPERVGUI_Canvas::addView(QCanvasView* theView)
127 {
128   QCanvas::addView(theView);
129   theView->setPaletteBackgroundColor(backgroundColor().light(120));
130 }
131
132 void SUPERVGUI_Canvas::setFullView() 
133 {
134   myIsControlView = false;
135   updateNodes(true);
136   updateLinks();
137   update();
138 }
139
140 void SUPERVGUI_Canvas::setControlView() 
141 {
142   myIsControlView = true;
143   updateNodes(false);
144   updateLinks();
145   update();
146 }
147
148 void SUPERVGUI_Canvas::updateNodes(bool withPorts) 
149 {
150   QObjectList* aNodeList = queryList("SUPERVGUI_CanvasNode");
151   QObjectListIt aIt(*aNodeList);
152   SUPERVGUI_CanvasNode* aNode;
153   while ((aNode=(SUPERVGUI_CanvasNode*)aIt.current()) != 0) {
154     ++aIt;
155     if (withPorts)
156       aNode->showAll();
157     else
158       aNode->hideAll();
159   }
160   delete aNodeList;
161 }
162
163 void SUPERVGUI_Canvas::updateLinks() 
164 {
165   QObjectList* aLinkList = queryList("SUPERVGUI_CanvasLink");
166   QObjectListIt aIt(*aLinkList);
167   SUPERVGUI_CanvasLink* aLink;
168   while ((aLink=(SUPERVGUI_CanvasLink*)aIt.current()) != 0) {
169     ++aIt;
170     aLink->merge();
171   }
172   delete aLinkList;
173 }
174
175 void SUPERVGUI_Canvas::sync() {
176   if (SUPERV_isNull(myMain->getDataflow())) return;
177       
178   SUPERVGUI_CanvasNode* ihmNode;
179   QObjectList* ihmList = queryList("SUPERVGUI_CanvasNode");
180   QObjectListIt it(*ihmList);
181   while ((ihmNode=(SUPERVGUI_CanvasNode*)it.current()) != 0) {
182     ++it;
183     ihmNode->sync();
184   }
185   delete ihmList;
186 }
187
188 /** 
189  * Synchronizes Graph presentation with internal graph structure
190  */
191 void SUPERVGUI_Canvas::merge() {
192   if (SUPERV_isNull(myMain->getDataflow())) return;
193       
194   SUPERVGUI_CanvasNode* ihmNode;
195   QObjectList* ihmList = queryList("SUPERVGUI_CanvasNode");
196   SUPERV_Nodes nodes = myMain->getDataflow()->Nodes();
197
198   MESSAGE("CNodes="<<nodes->CNodes.length());
199   MESSAGE("FNodes="<<nodes->FNodes.length());
200   MESSAGE("INodes="<<nodes->INodes.length());
201   MESSAGE("GNodes="<<nodes->GNodes.length());
202   MESSAGE("LNodes="<<nodes->LNodes.length());
203   MESSAGE("SNodes="<<nodes->SNodes.length());
204   MESSAGE("Graphs="<<nodes->Graphs.length());
205
206   int n;
207   UPDATENODES(CNodes, addComputeNode);
208   UPDATENODES(FNodes, addComputeNode);
209   UPDATENODES(INodes, addComputeNode);
210   UPDATENODES(Graphs, addMacroNode);
211   UPDATENODES(GNodes, addGOTONode);
212
213   UPDATECONTROLNODES(LNodes);    
214   UPDATECONTROLNODES(SNodes);
215
216   QObjectListIt it(*ihmList);
217   while ((ihmNode=(SUPERVGUI_CanvasNode*)it.current()) != 0) {
218     ++it;
219     ihmList->removeRef(ihmNode);
220     delete ihmNode;
221   }
222   delete ihmList;
223
224   // update links
225   SUPERVGUI_CanvasLink* ihmLink;
226   ihmList = queryList("SUPERVGUI_CanvasLink");
227   /*
228   don't work... that's a pity!
229   */
230   //SUPERV_Links links = myMain->getDataflow()->Links();
231   SUPERV_Links links = myMain->getDataflow()->GLinks();
232   for (int i = 0; i < links->length(); i++) {
233     UPDATELINK(links[i]);
234   }
235
236   /*
237   SUPERV_StreamLinks slinks = myMain->getDataflow()->StreamLinks();
238   for (int i = 0; i < slinks->length(); i++) {
239     UPDATELINK(slinks[i]);
240   }
241   */
242   /*
243   if (myMain->getDataflow()->IsStreamGraph()) {
244     SUPERV_StreamGraph aSGraph = myMain->getDataflow()->ToStreamGraph();
245     if (!SUPERV_isNull(aSGraph)) {
246       SUPERV_StreamLinks slinks = aSGraph->StreamLinks(); // <<- doesn't work!!!
247       for (int i = 0; i < slinks->length(); i++) {
248         UPDATELINK(slinks[i]);
249       }
250     }
251   }
252   */
253
254   // update stream links by old method until StreamLinks() fuction works
255   SUPERVGUI_CanvasPort* aPort;
256   QObjectList* aPortList = queryList("SUPERVGUI_CanvasPort");
257   QObjectListIt aPortIt(*aPortList);
258   while ((aPort=(SUPERVGUI_CanvasPort*)aPortIt.current()) != 0) {
259     ++aPortIt;
260     if (aPort->getEngine()->IsInput() && aPort->getEngine()->IsLinked() 
261         && aPort->getEngine()->Kind() == SUPERV::DataStreamParameter) {
262       if (aPort->getEngine()->Node()->Kind() == SUPERV::EndSwitchNode) {
263         SUPERV_Links aLinks = aPort->getEngine()->Links();
264         for (int i = 0; i < aLinks->length(); i++) {
265           UPDATELINK(aLinks[i]);
266         }
267       }
268 //    else if (aPort->isStream()) {
269 //      SUPERV_StreamLink aStreamLink = ((SUPERVGUI_CanvasStreamPortIn*)aPort)->getStreamEngine()->StreamLink();
270 //      UPDATESTREAMLINK(aStreamLink);
271 //    }
272       else {
273         SUPERV_Link aLink = aPort->getEngine()->Link();
274         UPDATELINK(aLink);
275       }
276     }
277   }
278   delete aPortList;
279
280   it = QObjectListIt(*ihmList);
281   while ((ihmLink=(SUPERVGUI_CanvasLink*)it.current()) != 0) {
282     ++it;
283     ihmList->removeRef(ihmLink);
284     delete ihmLink;
285   }
286   delete ihmList;
287 }
288
289 SUPERVGUI_CanvasNode* SUPERVGUI_Canvas::getNode(SUPERV::CNode_ptr theNode) const
290 {
291   return (SUPERVGUI_CanvasNode*) 
292     ((SUPERVGUI_Canvas*)this)->child(theNode->Name(), "SUPERVGUI_CanvasNode");
293 }
294
295 SUPERVGUI_CanvasPort* SUPERVGUI_Canvas::getPort(SUPERV::Port_ptr thePort) const
296 {
297   SUPERVGUI_CanvasNode* aNode = getNode(thePort->Node());
298   if (aNode == NULL) return NULL;
299
300   return (SUPERVGUI_CanvasPort*) 
301     aNode->child(getPortName(thePort), "SUPERVGUI_CanvasPort");
302 }
303
304 SUPERVGUI_CanvasLink* SUPERVGUI_Canvas::getLink(SUPERV::Link_ptr theLink) const
305 {
306   return (SUPERVGUI_CanvasLink*) 
307     ((SUPERVGUI_Canvas*)this)->child(getLinkName(theLink), "SUPERVGUI_CanvasLink");
308 }
309
310 QString SUPERVGUI_Canvas::getPortName(SUPERV::Port_ptr thePort) const
311 {
312   QString aName(thePort->Name());
313   if (thePort->IsInput()) aName = aName + ".In";
314   else aName = aName + ".Out";
315   return aName;
316 }
317
318 QString SUPERVGUI_Canvas::getLinkName(SUPERV::Link_ptr theLink) const
319 {
320   SUPERV_Port aInPort = theLink->InPort();
321   SUPERV_Port aOutPort = theLink->OutPort();
322   QString aName = 
323     QString(aOutPort->Node()->Name()) + "." +
324     QString(aOutPort->Name()) + "-" +
325     QString(aInPort->Node()->Name()) + "." +
326     QString(aInPort->Name());
327   return aName;
328 }