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