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.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"
17 #include "SUIT_ResourceMgr.h"
18 #include "SUIT_Session.h"
23 #include <sys/timeb.h>
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); \
35 ihmNode->move(aCNode->X(), aCNode->Y()); \
36 ihmList->removeRef(ihmNode); \
38 ihmNode = getNode(aCNodeEnd); \
39 ihmList->removeRef(ihmNode); \
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); \
52 ihmNode->move(aCNode->X(), aCNode->Y()); \
53 ihmList->removeRef(ihmNode); \
58 #define UPDATELINK(Link) \
59 ihmLink = getLink(Link.in()); \
60 if (ihmLink == NULL) { \
61 ihmLink = new SUPERVGUI_CanvasLink(this, myMain, Link.in()); \
65 ihmList->removeRef(ihmLink); \
70 #define UPDATESTREAMLINK(Link) \
71 ihmLink = getLink(Link.in()); \
72 if (ihmLink == NULL) { \
73 ihmLink = new SUPERVGUI_CanvasStreamLink(this, myMain, Link.in()); \
77 ihmList->removeRef(ihmLink); \
83 SUPERVGUI_Canvas::SUPERVGUI_Canvas( SUPERVGUI_Main* m, SUIT_ResourceMgr* mgr ):
87 Trace("SUPERVGUI_Canvas::SUPERVGUI_Canvas");
88 myIsControlView = false;
89 // resize(GRAPH_WIDTH, GRAPH_HEIGHT);
91 setDoubleBuffering(true);
93 // mkr : IPAL10825 -->
94 SUPERVGUI* aSupMod = SUPERVGUI::Supervision();
96 MESSAGE("NULL Supervision module!");
99 QColor aColor = aSupMod->getIVFBackgroundColor();
100 if ( !aColor.isValid() )
101 aColor = mgr->colorValue( "SUPERVGraph", "Background", DEF_MAIN_COLOR );
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);
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);
117 while ( (anObj = aIt.current()) != 0 ) {
119 aNodeList->removeRef(anObj);
122 // asv : list returned by queryList() must be removed
126 void SUPERVGUI_Canvas::addView(QCanvasView* theView)
128 QCanvas::addView(theView);
129 theView->setPaletteBackgroundColor(backgroundColor().light(120));
132 void SUPERVGUI_Canvas::setFullView()
134 myIsControlView = false;
140 void SUPERVGUI_Canvas::setControlView()
142 myIsControlView = true;
148 void SUPERVGUI_Canvas::updateNodes(bool withPorts)
150 QObjectList* aNodeList = queryList("SUPERVGUI_CanvasNode");
151 QObjectListIt aIt(*aNodeList);
152 SUPERVGUI_CanvasNode* aNode;
153 while ((aNode=(SUPERVGUI_CanvasNode*)aIt.current()) != 0) {
163 void SUPERVGUI_Canvas::updateLinks()
165 QObjectList* aLinkList = queryList("SUPERVGUI_CanvasLink");
166 QObjectListIt aIt(*aLinkList);
167 SUPERVGUI_CanvasLink* aLink;
168 while ((aLink=(SUPERVGUI_CanvasLink*)aIt.current()) != 0) {
175 void SUPERVGUI_Canvas::sync() {
176 if (SUPERV_isNull(myMain->getDataflow())) return;
178 SUPERVGUI_CanvasNode* ihmNode;
179 QObjectList* ihmList = queryList("SUPERVGUI_CanvasNode");
180 QObjectListIt it(*ihmList);
181 while ((ihmNode=(SUPERVGUI_CanvasNode*)it.current()) != 0) {
189 * Synchronizes Graph presentation with internal graph structure
191 void SUPERVGUI_Canvas::merge() {
192 if (SUPERV_isNull(myMain->getDataflow())) return;
194 SUPERVGUI_CanvasNode* ihmNode;
195 QObjectList* ihmList = queryList("SUPERVGUI_CanvasNode");
196 SUPERV_Nodes nodes = myMain->getDataflow()->Nodes();
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());
207 UPDATENODES(CNodes, addComputeNode);
208 UPDATENODES(FNodes, addComputeNode);
209 UPDATENODES(INodes, addComputeNode);
210 UPDATENODES(Graphs, addMacroNode);
211 UPDATENODES(GNodes, addGOTONode);
213 UPDATECONTROLNODES(LNodes);
214 UPDATECONTROLNODES(SNodes);
216 QObjectListIt it(*ihmList);
217 while ((ihmNode=(SUPERVGUI_CanvasNode*)it.current()) != 0) {
219 ihmList->removeRef(ihmNode);
225 SUPERVGUI_CanvasLink* ihmLink;
226 ihmList = queryList("SUPERVGUI_CanvasLink");
228 don't work... that's a pity!
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]);
237 SUPERV_StreamLinks slinks = myMain->getDataflow()->StreamLinks();
238 for (int i = 0; i < slinks->length(); i++) {
239 UPDATELINK(slinks[i]);
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]);
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) {
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]);
268 // else if (aPort->isStream()) {
269 // SUPERV_StreamLink aStreamLink = ((SUPERVGUI_CanvasStreamPortIn*)aPort)->getStreamEngine()->StreamLink();
270 // UPDATESTREAMLINK(aStreamLink);
273 SUPERV_Link aLink = aPort->getEngine()->Link();
280 it = QObjectListIt(*ihmList);
281 while ((ihmLink=(SUPERVGUI_CanvasLink*)it.current()) != 0) {
283 ihmList->removeRef(ihmLink);
289 SUPERVGUI_CanvasNode* SUPERVGUI_Canvas::getNode(SUPERV::CNode_ptr theNode) const
291 return (SUPERVGUI_CanvasNode*)
292 ((SUPERVGUI_Canvas*)this)->child(theNode->Name(), "SUPERVGUI_CanvasNode");
295 SUPERVGUI_CanvasPort* SUPERVGUI_Canvas::getPort(SUPERV::Port_ptr thePort) const
297 SUPERVGUI_CanvasNode* aNode = getNode(thePort->Node());
298 if (aNode == NULL) return NULL;
300 return (SUPERVGUI_CanvasPort*)
301 aNode->child(getPortName(thePort), "SUPERVGUI_CanvasPort");
304 SUPERVGUI_CanvasLink* SUPERVGUI_Canvas::getLink(SUPERV::Link_ptr theLink) const
306 return (SUPERVGUI_CanvasLink*)
307 ((SUPERVGUI_Canvas*)this)->child(getLinkName(theLink), "SUPERVGUI_CanvasLink");
310 QString SUPERVGUI_Canvas::getPortName(SUPERV::Port_ptr thePort) const
312 QString aName(thePort->Name());
313 if (thePort->IsInput()) aName = aName + ".In";
314 else aName = aName + ".Out";
318 QString SUPERVGUI_Canvas::getLinkName(SUPERV::Link_ptr theLink) const
320 SUPERV_Port aInPort = theLink->InPort();
321 SUPERV_Port aOutPort = theLink->OutPort();
323 QString(aOutPort->Node()->Name()) + "." +
324 QString(aOutPort->Name()) + "-" +
325 QString(aInPort->Node()->Name()) + "." +
326 QString(aInPort->Name());