Salome HOME
Fix PAL8562: rpath (rpath-link) option needs parameter - directory to search shared...
[modules/superv.git] / src / SUPERVGUI / SUPERVGUI_CanvasArray.cxx
1 //  SUPERV SUPERVGUI : GUI for Supervisor component
2 //
3 //  Copyright (C) 2003  OPEN CASCADE
4 //
5 //  File   : SUPERVGUI_CanvasArray.cxx
6 //  Author : 
7 //  Module : SUPERV
8
9 using namespace std;
10 #include "SUPERVGUI_CanvasArray.h"
11 #include "SUPERVGUI_Main.h"
12 #include "SUPERVGUI_BrowseNodeDlg.h"
13 #include "QAD_Config.h"
14 #include "SUPERVGUI_CanvasCellNodePrs.h"
15
16 #include <qtooltip.h>
17 #define TEXT_MARGIN 5
18
19 #define ADDNODES(NodesName,LevelHasDiffNT) \
20     ncols = nodes->NodesName.length(); \
21     for (int co=0; co<ncols; co++) {  \
22       SUPERV_CNode aCNode = SUPERV::CNode::_narrow(nodes->NodesName[co]); \
23       if (!LevelHasDiffNT) x = 50 + co * (CELL_WIDTH  + CELL_SPACE); \
24       else x += (CELL_WIDTH  + CELL_SPACE); \
25       cell = getCellNode(aCNode); \
26       if (cell == NULL) { \
27         SUPERVGUI_CanvasCellNode* aNode = new SUPERVGUI_CanvasCellNode(this, myMain, aCNode); \
28         aNode->move(x, y); \
29         aNode->show(); \
30         aNode->sync(); \
31       } else { \
32         cell->move(x, y); \
33         cell->show(); \
34       } \
35       update(); \
36     }
37
38
39
40 #define ADDCONTROLNODES(NodesName,LevelHasDiffNT) \
41     ncols = nodes->NodesName.length(); \
42     if (!LevelHasDiffNT) x = 50; \
43     else x += (CELL_WIDTH  + CELL_SPACE); \
44     for (int co=0; co<ncols; co++) {  \
45       SUPERV_CNode aCNode = SUPERV::CNode::_narrow(nodes->NodesName[co]); \
46       SUPERV_CNode aCNodeEnd = SUPERV::CNode::_narrow(nodes->NodesName[co]->Coupled()); \
47       cell = getCellNode(aCNode); \
48       if (cell == NULL) { \
49         SUPERVGUI_CanvasCellNode* aNode = new SUPERVGUI_CanvasCellNode(this, myMain, aCNode); \
50         aNode->move(x, y); \
51         aNode->show(); \
52         aNode->sync(); \
53         y += (CELL_HEIGHT + CELL_SPACE); \
54         SUPERVGUI_CanvasCellNode* aNodeEnd = new SUPERVGUI_CanvasCellEndNode(this, myMain, aCNodeEnd, aNode); \
55         aNodeEnd->move(x, y); \
56         aNodeEnd->show(); \
57         aNodeEnd->sync(); \
58       } else { \
59         cell->move(x, y); \
60         cell->show(); \
61         y += (CELL_HEIGHT + CELL_SPACE); \
62         cell = getCellNode(aCNodeEnd); \
63         cell->move(x, y); \
64         cell->show(); \
65       } \
66       update(); \
67       if (co < (ncols-1)) x += (CELL_WIDTH + CELL_SPACE); \
68     }
69
70
71 // ----------------------------------------------------------
72 // SUPERVGUI_Array on QCanvas
73 // ----------------------------------------------------------
74
75 SUPERVGUI_CanvasArray::SUPERVGUI_CanvasArray(SUPERVGUI_Main* m):
76   QCanvas(),
77   myMain(m)
78 {
79   Trace("SUPERVGUI_CanvasArray::SUPERVGUI_CanvasArray");
80   //resize(GRAPH_WIDTH, GRAPH_HEIGHT);
81   resize(800, 600);
82   setDoubleBuffering(true);
83
84   QColor aColor(MAIN_COLOR);
85   QString aRed   = QAD_CONFIG->getSetting("SUPERVGraph:BackgroundColorRed");
86   QString aGreen = QAD_CONFIG->getSetting("SUPERVGraph:BackgroundColorGreen");
87   QString aBlue  = QAD_CONFIG->getSetting("SUPERVGraph:BackgroundColorBlue");
88   if( (!aRed.isEmpty()) && (!aGreen.isEmpty()) && (!aBlue.isEmpty()) )
89     aColor = QColor(aRed.toInt(), aGreen.toInt(), aBlue.toInt());
90   setBackgroundColor(aColor);
91 }
92
93 SUPERVGUI_CanvasArray::~SUPERVGUI_CanvasArray() {
94   Trace("SUPERVGUI_Array::~SUPERVGUI_CanvasArray");
95   //delete all cells which SUPERVGUI_CanvasArray contains
96   //destroy();
97   QObjectList* aCellList = queryList("SUPERVGUI_CanvasCellNode");
98   QObjectListIt aIt(*aCellList);
99   QObject* anObj;
100   while ((anObj = aIt.current()) != 0) {
101     ++aIt;
102     delete anObj;
103   }
104   delete aCellList;
105 }
106
107 void SUPERVGUI_CanvasArray::sync() {
108   if (SUPERV_isNull(myMain->getDataflow())) return;
109   
110   SUPERVGUI_CanvasCellNode* ihmNode;
111   QObjectList* ihmList = queryList("SUPERVGUI_CanvasCellNode");
112   QObjectListIt it(*ihmList);
113   while ((ihmNode=(SUPERVGUI_CanvasCellNode*)it.current()) != 0) {
114     ++it;
115     ihmNode->sync();
116   }
117   delete ihmList;
118 }
119
120 bool SUPERVGUI_CanvasArray::create() {
121   Trace("SUPERVGUI_Array::create");
122   SUPERV_Nodes nodes = myMain->getDataflow()->Nodes();
123   int aCount = 0;
124   aCount += nodes->CNodes.length();
125   aCount += nodes->FNodes.length();
126   aCount += nodes->INodes.length();
127   aCount += nodes->GNodes.length();
128   aCount += nodes->LNodes.length();
129   aCount += nodes->SNodes.length();
130   if (aCount == 0) return true;
131
132   SUPERVGUI_CanvasCellNode* cell;
133   QString         aLabel;
134   int             x, y;
135   int             nligs = myMain->getDataflow()->LevelMax();
136   int             ncols = myMain->getDataflow()->ThreadsMax();
137   
138   // there is no any calculations
139   if (ncols == 0) return false;
140
141   QPen pen(Qt::SolidLine);
142   pen.setWidth(1);
143   QBrush br(MAIN_TITLE);
144   
145   for (int co = 0; co < ncols; co++) {
146     aLabel = QString("Thread %1").arg(co);
147     QRect aRect = QRect(50 + co * (CELL_WIDTH  + CELL_SPACE), 20, CELL_WIDTH, CELL_HEIGHT);
148     QCanvasRectangle* aThread = new QCanvasRectangle(aRect, this);
149     aThread->setPen(pen);
150     aThread->setBrush(br);
151     aThread->setZ(0);
152     aThread->show();
153     
154     QCanvasText* aText = new QCanvasText(aLabel, this);
155     QRect aBRect = aText->boundingRect();
156     aText->setX(aRect.x() + aRect.width()/2 - aBRect.width()/2);
157     aText->setY(aRect.y() + aRect.height()/2 - aBRect.height()/2);
158     aText->setZ(1);
159     aText->show();
160   }
161   
162   y = 60;
163   bool LevelHasDiffNT = false;
164   for (int li = 0; li <= nligs; li++) {
165     nodes = myMain->getDataflow()->LevelNodes(li);
166     int aSumNum = nodes->CNodes.length()+nodes->FNodes.length()+nodes->INodes.length()+
167                   nodes->GNodes.length()+nodes->LNodes.length()+nodes->SNodes.length();
168     if (nodes->CNodes.length() != 0 ) {
169       ADDNODES(CNodes,LevelHasDiffNT);
170       if (aSumNum > nodes->CNodes.length())
171         LevelHasDiffNT = true;
172     }
173     if (nodes->FNodes.length() != 0 ) {
174       ADDNODES(FNodes,LevelHasDiffNT);
175       if (aSumNum > nodes->FNodes.length())
176         LevelHasDiffNT = true;
177     }
178     if (nodes->INodes.length() != 0 ) {
179       ADDNODES(INodes,LevelHasDiffNT);
180       if (aSumNum > nodes->INodes.length())
181         LevelHasDiffNT = true;
182     }
183     if (nodes->GNodes.length() != 0 ) {
184       ADDNODES(GNodes,LevelHasDiffNT);
185       if (aSumNum > nodes->GNodes.length())
186         LevelHasDiffNT = true;
187     }
188     if (nodes->LNodes.length() != 0 ) {
189       ADDCONTROLNODES(LNodes,LevelHasDiffNT);
190       if (aSumNum > nodes->LNodes.length())
191         LevelHasDiffNT = true;
192     }
193     if (nodes->SNodes.length() != 0 ) {
194       ADDCONTROLNODES(SNodes,LevelHasDiffNT);
195       if (aSumNum > nodes->SNodes.length())
196         LevelHasDiffNT = true;
197     }
198     y += (CELL_HEIGHT + CELL_SPACE);
199
200     LevelHasDiffNT = false;
201   }
202   nodeX = 50;
203   nodeY = y + CELL_HEIGHT*2;
204
205   return true;
206
207 }
208
209 void SUPERVGUI_CanvasArray::destroy() {
210   Trace("SUPERVGUI_Array::destroy");
211   
212   QObjectList* aCellList = queryList("SUPERVGUI_CanvasCellNode");
213   QObjectListIt aIt(*aCellList);
214   QObject* anObj;
215   while ((anObj = aIt.current()) != 0) {
216     ++aIt;
217     ((SUPERVGUI_CanvasCellNode*)anObj)->getPrs()->hide();
218   }
219   delete aCellList;
220
221   // mkr : delete QCanvasRectangle and QCanvasText canvas items for each Thread.
222   // Threads will be recreate when create() function is called
223   QCanvasItemList aTextList = allItems();
224   for (QCanvasItemList::Iterator aItText = aTextList.begin(); aItText != aTextList.end(); ++aItText) {
225     SUPERVGUI_CanvasCellNodePrs* aPrs = dynamic_cast<SUPERVGUI_CanvasCellNodePrs*>(*aItText);
226     if (!aPrs) {
227       (*aItText)->hide();
228       delete *aItText;
229     }
230   }
231 }
232
233 SUPERVGUI_CanvasCellNode* SUPERVGUI_CanvasArray::getCellNode(SUPERV::CNode_ptr theNode) const
234 {
235   return (SUPERVGUI_CanvasCellNode*) 
236     ((SUPERVGUI_CanvasArray*)this)->child(theNode->Name(), "SUPERVGUI_CanvasCellNode");
237 }
238
239 SUPERVGUI_CanvasCellNode* SUPERVGUI_CanvasArray::addNode(SUPERV_CNode node) {
240   Trace("SUPERVGUI_CanvasArray::addNode");
241   SUPERVGUI_CanvasCellNode* n = new SUPERVGUI_CanvasCellNode(this, myMain, node);
242   n->move(nodeX, nodeY);
243   n->show();
244   update();
245   nodeX += NODE_DX;
246   nodeY += NODE_DY;
247   n->sync();
248   return(n);
249 }