Salome HOME
Merging with JR_ASV_2_1_0_deb_with_KERNEL_Head branch, which contains many bug fixes...
[modules/superv.git] / src / SUPERVGUI / SUPERVGUI_CanvasCellNodePrs.cxx
1 //  SUPERV SUPERVGUI : GUI for Supervisor component
2 //
3 //  Copyright (C) 2003  OPEN CASCADE
4 //
5 //  File   : SUPERVGUI_CanvasCellNodePrs.cxx
6 //  Author : 
7 //  Module : SUPERV
8
9 #include "SUPERVGUI_CanvasCellNodePrs.h"
10 #include "SUPERVGUI_Canvas.h"
11
12 #define TEXT_MARGIN 5
13
14 // ----------------------------------------------------------
15 // Cell widget of the table on QCanvas
16 // ----------------------------------------------------------
17 SUPERVGUI_CanvasCellNodePrs::SUPERVGUI_CanvasCellNodePrs(QCanvas* theCanvas, SUPERVGUI_CanvasCellNode* theNode):
18   myTitleWidth(CELL_WIDTH_PART),
19   myLabelWidth(CELL_WIDTH_PART),
20   myStatusWidth(CELL_WIDTH_PART), 
21   SUPERVGUI_CanvasNodePrs(theCanvas, theNode, true)
22 {
23   myPortVisible = false;
24 }
25
26 SUPERVGUI_CanvasCellNodePrs::~SUPERVGUI_CanvasCellNodePrs()
27 {
28 }
29
30 void SUPERVGUI_CanvasCellNodePrs::moveBy(double dx, double dy) {
31 //Trace("SUPERVGUI_CanvasCellNodePrs::moveBy");
32   int aX = (int) (x()+dx);
33   int aY = (int) (y()+dy);
34
35   int w = aX + width() + GRAPH_MARGIN;
36   int h = aY + height() + GRAPH_MARGIN;
37   if (canvas()->width() > w) w = canvas()->width();
38   if (canvas()->height() > h) h = canvas()->height();
39   if (canvas()->width() < w || canvas()->height() < h)
40     canvas()->resize(w, h);
41   QCanvasPolygonalItem::moveBy(dx, dy);
42 }
43
44 void SUPERVGUI_CanvasCellNodePrs::drawShape(QPainter& thePainter) {
45   drawTitle(thePainter);
46   drawLabel(thePainter);
47   drawStatus(thePainter);
48   drawFrame(thePainter);
49 }
50
51 void drawCellText(QPainter& thePainter, const QString& theText, 
52                   const QRect& theRect, int theHAlign = Qt::AlignAuto)
53 {
54   int flags = theHAlign | Qt::AlignVCenter;
55   QRect r(theRect.x() + TEXT_MARGIN, theRect.y(), 
56           theRect.width() - 2*TEXT_MARGIN, theRect.height());
57
58   QWMatrix aMat = thePainter.worldMatrix();
59   if (aMat.m11() != 1.0) { 
60     // for scaled picture only
61     QRect r1 = aMat.mapRect(r);
62     QFont saved = thePainter.font();
63     QFont f(saved);
64     if (f.pointSize() == -1) {
65       f.setPixelSize((int)(f.pixelSize()*aMat.m11()));
66     }
67     else {
68       f.setPointSize((int)(f.pointSize()*aMat.m11()));
69     }
70     thePainter.save();
71     QWMatrix m;
72     thePainter.setWorldMatrix(m);
73     thePainter.setFont(f);
74     thePainter.drawText(r1, flags, theText);
75     thePainter.setFont(saved);
76     thePainter.restore();
77   }
78   else {
79     thePainter.drawText(r, flags, theText);
80   }
81 }
82
83 void SUPERVGUI_CanvasCellNodePrs::drawTitle(QPainter& thePainter) {
84   QBrush saved = thePainter.brush();
85   if (getNode()->getEngine()->IsLoop() || getNode()->getEngine()->IsEndLoop()
86       ||
87       getNode()->getEngine()->IsSwitch() || getNode()->getEngine()->IsEndSwitch())
88     thePainter.setBrush(Qt::red.light());
89   else if (getNode()->getEngine()->IsGOTO())
90     thePainter.setBrush(Qt::green.light());
91   else {
92     QBrush br(MAIN_TITLE);
93     thePainter.setBrush(br);
94   }
95   drawTitleShape(thePainter);
96   thePainter.setBrush(saved);
97
98   drawCellText(thePainter, getNode()->getEngine()->Name(), getTitleRect(), Qt::AlignLeft);
99 }
100
101 void SUPERVGUI_CanvasCellNodePrs::drawLabel(QPainter& thePainter) 
102 {
103   QRect r = getLabelRect();
104
105   QPen saved = thePainter.pen();
106   thePainter.setPen(NoPen);
107   thePainter.drawRect(r);
108   thePainter.setPen(saved);
109
110   drawCellText(thePainter, getNode()->getLabelText(), r, Qt::AlignLeft);
111 }
112
113 void SUPERVGUI_CanvasCellNodePrs::drawStatus(QPainter& thePainter) 
114 {
115   QRect r = getStatusRect();
116
117   QBrush savedB = thePainter.brush();
118   thePainter.setBrush(getStatusColor());
119   drawStatusShape(thePainter);
120   thePainter.setBrush(savedB);
121
122   drawCellText(thePainter, getStatus(), r, Qt::AlignHCenter);
123 }
124
125 QRect SUPERVGUI_CanvasCellNodePrs::getTitleRect() const
126 {
127   return QRect((int)x(), (int)y(), getTitleWidth(), getTitleHeight());
128 }
129
130 QRect SUPERVGUI_CanvasCellNodePrs::getLabelRect() const
131 {
132   return QRect(((int)x())+getTitleWidth(), (int)y(), getLabelWidth(), getLabelHeight());
133 }
134
135 QRect SUPERVGUI_CanvasCellNodePrs::getStatusRect() const
136 {
137   return QRect(((int)x())+getTitleWidth()+getLabelWidth(), (int)y(),
138                getStatusWidth(), getStatusHeight());
139 }
140
141 int SUPERVGUI_CanvasCellNodePrs::getTitleWidth() const {
142   return myTitleWidth;
143 }
144
145 int SUPERVGUI_CanvasCellNodePrs::getLabelWidth() const {
146   return myLabelWidth;
147 }
148
149 int SUPERVGUI_CanvasCellNodePrs::getStatusWidth() const {
150   return myStatusWidth;
151 }
152
153 int SUPERVGUI_CanvasCellNodePrs::width() const
154 {
155   return myTitleWidth + myLabelWidth + myStatusWidth;
156 }
157
158 int SUPERVGUI_CanvasCellNodePrs::height() const
159 {
160   return getTitleHeight();
161 }
162
163 void SUPERVGUI_CanvasCellNodePrs::setState(SUPERV::GraphState theState)
164 {
165   switch(theState) {
166   case SUPERV_Waiting:
167     setStatus("Waiting");
168     setStatusColor(QColor(35, 192, 255));
169     break;
170
171   case SUPERV_Running:
172   case SUPERV::ReadyState:
173     setStatus("Running");
174     setStatusColor(QColor(32,210,32));
175     break;
176
177   case SUPERV_Suspend:
178   case SUPERV::SuspendReadyState:
179     setStatus("Suspended");
180     setStatusColor(QColor(255,180, 0));
181     break;
182
183   case SUPERV_Done:
184     setStatus("Finished");
185     setStatusColor(QColor(255, 158, 255));
186     break;
187
188   case SUPERV_Error: 
189     setStatus("Aborted");
190     setStatusColor(Qt::red);
191     break;
192
193   case SUPERV_Kill:
194     setStatus("Killed");
195     setStatusColor(Qt::red);
196     break;
197
198   case SUPERV::LoadingState:
199     setStatus("Loading");
200     setStatusColor(QColor(56,255,56));
201     break;
202
203   default:
204     setStatus("No Status");
205     setStatusColor(MAIN_BACK);
206     break;
207   }
208
209   canvas()->setChanged(getStatusRect());
210   canvas()->update();
211 }