Salome HOME
SMH: 3.0.0 preparation = merged version (POLYWORK + RTVDEBUG01) + adopation for new GUI
[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 "SUPERVGUI_CanvasCellNodePrs.h"
14
15 #include "SUIT_ResourceMgr.h"
16 #include "SUIT_Session.h"
17
18 #include <qtooltip.h>
19 #define TEXT_MARGIN 5
20
21 #define ADDNODES(NodesName,LevelHasDiffNT) \
22     ncols = nodes->NodesName.length(); \
23     for (int co=0; co<ncols; co++) {  \
24       SUPERV_CNode aCNode = SUPERV::CNode::_narrow(nodes->NodesName[co]); \
25       if (!LevelHasDiffNT) x = 50 + co * (CELL_WIDTH  + CELL_SPACE); \
26       else x += (CELL_WIDTH  + CELL_SPACE); \
27       cell = getCellNode(aCNode); \
28       if (cell == NULL) { \
29         SUPERVGUI_CanvasCellNode* aNode = new SUPERVGUI_CanvasCellNode(this, myMain, aCNode); \
30         aNode->move(x, y); \
31         aNode->show(); \
32         aNode->sync(); \
33       } else { \
34         cell->move(x, y); \
35         cell->show(); \
36       } \
37       update(); \
38     }
39
40
41
42 #define ADDCONTROLNODES(NodesName,LevelHasDiffNT) \
43     ncols = nodes->NodesName.length(); \
44     if (!LevelHasDiffNT) x = 50; \
45     else x += (CELL_WIDTH  + CELL_SPACE); \
46     for (int co=0; co<ncols; co++) {  \
47       SUPERV_CNode aCNode = SUPERV::CNode::_narrow(nodes->NodesName[co]); \
48       SUPERV_CNode aCNodeEnd = SUPERV::CNode::_narrow(nodes->NodesName[co]->Coupled()); \
49       cell = getCellNode(aCNode); \
50       if (cell == NULL) { \
51         SUPERVGUI_CanvasCellNode* aNode = new SUPERVGUI_CanvasCellNode(this, myMain, aCNode); \
52         aNode->move(x, y); \
53         aNode->show(); \
54         aNode->sync(); \
55         y += (CELL_HEIGHT + CELL_SPACE); \
56         SUPERVGUI_CanvasCellNode* aNodeEnd = new SUPERVGUI_CanvasCellEndNode(this, myMain, aCNodeEnd, aNode); \
57         aNodeEnd->move(x, y); \
58         aNodeEnd->show(); \
59         aNodeEnd->sync(); \
60       } else { \
61         cell->move(x, y); \
62         cell->show(); \
63         y += (CELL_HEIGHT + CELL_SPACE); \
64         cell = getCellNode(aCNodeEnd); \
65         cell->move(x, y); \
66         cell->show(); \
67       } \
68       update(); \
69       if (co < (ncols-1)) x += (CELL_WIDTH + CELL_SPACE); \
70     }
71
72
73 // ----------------------------------------------------------
74 // SUPERVGUI_Array on QCanvas
75 // ----------------------------------------------------------
76
77 SUPERVGUI_CanvasArray::SUPERVGUI_CanvasArray(SUPERVGUI_Main* m):
78   QCanvas(),
79   myMain(m)
80 {
81   Trace("SUPERVGUI_CanvasArray::SUPERVGUI_CanvasArray");
82   //resize(GRAPH_WIDTH, GRAPH_HEIGHT);
83   resize(800, 600);
84   setDoubleBuffering(true);
85
86   QColor aColor(MAIN_COLOR);
87   //aColor = QColor(SUIT_Session::session()->resourceMgr()->integerValue( "SUPERVGraph", "BackgroundColorRed" ), 
88   //              SUIT_Session::session()->resourceMgr()->integerValue( "SUPERVGraph", "BackgroundColorGreen" ), 
89   //              SUIT_Session::session()->resourceMgr()->integerValue( "SUPERVGraph", "BackgroundColorBlue" ) );
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 }