Salome HOME
Porting SMESH module to Qt 4
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_MeshInfosDlg.cxx
1 // SMESH SMESHGUI : GUI for SMESH component
2 //
3 // Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
5 //
6 // This library is free software; you can redistribute it and/or 
7 // modify it under the terms of the GNU Lesser General Public 
8 // License as published by the Free Software Foundation; either 
9 // version 2.1 of the License. 
10 //
11 // This library is distributed in the hope that it will be useful, 
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
14 // Lesser General Public License for more details. 
15 //
16 // You should have received a copy of the GNU Lesser General Public 
17 // License along with this library; if not, write to the Free Software 
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 // File   : SMESHGUI_MeshInfosDlg.cxx
23 // Author : Nicolas BARBEROU
24 //
25
26 // SMESH includes
27 #include "SMESHGUI_MeshInfosDlg.h"
28
29 #include "SMESHGUI.h"
30 #include "SMESHGUI_Utils.h"
31
32 // SALOME GUI includes
33 #include <SUIT_Desktop.h>
34 #include <SUIT_ResourceMgr.h>
35 #include <SUIT_OverrideCursor.h>
36 #include <SUIT_Session.h>
37 #include <SUIT_MessageBox.h>
38
39 #include <LightApp_SelectionMgr.h>
40 #include <LightApp_Application.h>
41 #include <SALOME_ListIO.hxx>
42
43 // SALOME KERNEL includes
44 #include <SALOMEDSClient_Study.hxx>
45
46 // Qt includes
47 #include <QGroupBox>
48 #include <QLabel>
49 #include <QFrame>
50 #include <QStackedWidget>
51 #include <QVBoxLayout>
52 #include <QHBoxLayout>
53 #include <QGridLayout>
54 #include <QPushButton>
55 #include <QKeyEvent>
56
57 // IDL includes
58 #include <SALOMEconfig.h>
59 #include CORBA_SERVER_HEADER(SMESH_Mesh)
60 #include CORBA_SERVER_HEADER(SMESH_Group)
61
62 #define COLONIZE(str)   (QString(str).contains(":") > 0 ? QString(str) : QString(str) + " :" )
63 #define SPACING 6
64 #define MARGIN  11
65
66 //=================================================================================
67 // function : SMESHGUI_MeshInfosDlg()
68 // purpose  : Constructor
69 //=================================================================================
70 SMESHGUI_MeshInfosDlg::SMESHGUI_MeshInfosDlg(SMESHGUI* theModule): 
71   QDialog(SMESH::GetDesktop(theModule)),
72   mySelectionMgr(SMESH::GetSelectionMgr(theModule)),
73   mySMESHGUI(theModule)
74 {
75   setModal( false );
76   setAttribute( Qt::WA_DeleteOnClose, true );
77   setWindowTitle(tr("SMESH_MESHINFO_TITLE"));
78   setSizeGripEnabled(true);
79
80   myStartSelection = true;
81   myIsActiveWindow = true;
82
83   QVBoxLayout* aTopLayout = new QVBoxLayout(this);
84   aTopLayout->setSpacing(SPACING);  aTopLayout->setMargin(MARGIN);
85
86   // select button & label
87   QPixmap image0(SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH",tr("ICON_SELECT")));
88   mySelectBtn = new QPushButton(this);
89   mySelectBtn->setIcon(image0);
90
91   mySelectLab = new QLabel(this);
92   mySelectLab->setAlignment(Qt::AlignCenter);
93   QFont fnt = mySelectLab->font(); fnt.setBold(true);
94   mySelectLab->setFont(fnt);
95
96   QHBoxLayout* aSelectLayout = new QHBoxLayout;
97   aSelectLayout->setMargin(0); aSelectLayout->setSpacing(0);
98   aSelectLayout->addWidget(mySelectBtn);
99   aSelectLayout->addWidget(mySelectLab);
100
101   // top widget stack
102   myWGStack = new QStackedWidget(this);
103
104   // no valid selection
105   QWidget* myBadWidget = new QWidget(myWGStack);
106   QVBoxLayout* aBadLayout = new QVBoxLayout(myBadWidget);
107   QLabel* myBadLab = new QLabel(tr("SMESH_BAD_SELECTION"), myBadWidget);
108   myBadLab->setAlignment(Qt::AlignCenter);
109   myBadLab->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
110   aBadLayout->addWidget(myBadLab);
111   myWGStack->addWidget(myBadWidget);
112
113   // mesh
114   myMeshWidget = new QWidget(myWGStack);
115   QGridLayout* aMeshLayout = new QGridLayout(myMeshWidget);
116   aMeshLayout->setSpacing(SPACING);  aMeshLayout->setMargin(0);
117   myWGStack->addWidget(myMeshWidget);
118
119   // --> name
120   QLabel* myMeshNameLab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_NAME")), myMeshWidget);
121   myMeshName    = new QLabel(myMeshWidget);
122   myMeshName->setMinimumWidth(100);
123   QFrame* line1 = new QFrame(myMeshWidget);
124   line1->setFrameStyle(QFrame::HLine | QFrame::Sunken);
125
126   // --> nodes
127   QLabel* myMeshNbNodesLab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_NODES")), myMeshWidget);
128   myMeshNbNodes    = new QLabel(myMeshWidget);
129   myMeshNbNodes->setMinimumWidth(100);
130
131   // --> header with orders
132   QLabel* myMeshOrder0Lab = new QLabel(tr("SMESH_MESHINFO_ORDER0"), myMeshWidget);
133   QLabel* myMeshOrder1Lab = new QLabel(tr("SMESH_MESHINFO_ORDER1"), myMeshWidget);
134   QLabel* myMeshOrder2Lab = new QLabel(tr("SMESH_MESHINFO_ORDER2"), myMeshWidget);
135   QFont fnti = myMeshOrder0Lab->font(); fnti.setItalic(true);
136   myMeshOrder0Lab->setFont(fnti);
137   myMeshOrder1Lab->setFont(fnti);
138   myMeshOrder2Lab->setFont(fnti);
139
140   // --> edges
141   QLabel* myMeshNbEdgesLab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_EDGES")), myMeshWidget);
142   myMeshNbEdges    = new QLabel(myMeshWidget);
143   myMeshNbEdges->setMinimumWidth(100);
144   myMeshNbEdges1   = new QLabel(myMeshWidget);
145   myMeshNbEdges1->setMinimumWidth(100);
146   myMeshNbEdges2   = new QLabel(myMeshWidget);
147   myMeshNbEdges2->setMinimumWidth(100);
148
149   // --> faces
150   myMeshFacesGroup = new QGroupBox(tr("SMESH_MESHINFO_FACES"), myMeshWidget);
151   QGridLayout* myMeshFacesGroupLayout = new QGridLayout(myMeshFacesGroup);
152   myMeshFacesGroupLayout->setSpacing(SPACING);  myMeshFacesGroupLayout->setMargin(MARGIN);
153
154   // --> faces --> total
155   QLabel* myMeshNbFacesLab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_TOTAL")), myMeshFacesGroup);
156   myMeshNbFacesLab->setFont(fnt);
157   myMeshNbFaces    = new QLabel(myMeshFacesGroup);
158   myMeshNbFaces->setMinimumWidth(100);
159   myMeshNbFaces->setFont(fnt);
160   myMeshNbFaces1   = new QLabel(myMeshFacesGroup);
161   myMeshNbFaces1->setMinimumWidth(100);
162   myMeshNbFaces1->setFont(fnt);
163   myMeshNbFaces2   = new QLabel(myMeshFacesGroup);
164   myMeshNbFaces2->setMinimumWidth(100);
165   myMeshNbFaces2->setFont(fnt);
166
167   // --> faces --> triangles
168   QLabel* myMeshNbTrianglesLab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_TRIANGLES")), myMeshFacesGroup);
169   myMeshNbTriangles    = new QLabel(myMeshFacesGroup);
170   myMeshNbTriangles->setMinimumWidth(100);
171   myMeshNbTriangles1   = new QLabel(myMeshFacesGroup);
172   myMeshNbTriangles1->setMinimumWidth(100);
173   myMeshNbTriangles2   = new QLabel(myMeshFacesGroup);
174   myMeshNbTriangles2->setMinimumWidth(100);
175
176   // --> faces --> quadrangles
177   QLabel* myMeshNbQuadranglesLab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_QUADRANGLES")), myMeshFacesGroup);
178   myMeshNbQuadrangles    = new QLabel(myMeshFacesGroup);
179   myMeshNbQuadrangles->setMinimumWidth(100);
180   myMeshNbQuadrangles1   = new QLabel(myMeshFacesGroup);
181   myMeshNbQuadrangles1->setMinimumWidth(100);
182   myMeshNbQuadrangles2   = new QLabel(myMeshFacesGroup);
183   myMeshNbQuadrangles2->setMinimumWidth(100);
184
185   // --> faces --> polygons
186   QLabel* myMeshNbPolygonesLab = new QLabel( COLONIZE( tr( "SMESH_MESHINFO_POLYGONES" ) ), myMeshFacesGroup );
187   myMeshNbPolygones      = new QLabel( myMeshFacesGroup );
188   myMeshNbPolygones->setMinimumWidth( 100 );
189
190   myMeshFacesGroupLayout->addWidget(myMeshNbFacesLab,       0, 0);
191   myMeshFacesGroupLayout->addWidget(myMeshNbFaces,          0, 1);
192   myMeshFacesGroupLayout->addWidget(myMeshNbFaces1,         0, 2);
193   myMeshFacesGroupLayout->addWidget(myMeshNbFaces2,         0, 3);
194   myMeshFacesGroupLayout->addWidget(myMeshNbTrianglesLab,   1, 0);
195   myMeshFacesGroupLayout->addWidget(myMeshNbTriangles,      1, 1);
196   myMeshFacesGroupLayout->addWidget(myMeshNbTriangles1,     1, 2);
197   myMeshFacesGroupLayout->addWidget(myMeshNbTriangles2,     1, 3);
198   myMeshFacesGroupLayout->addWidget(myMeshNbQuadranglesLab, 2, 0);
199   myMeshFacesGroupLayout->addWidget(myMeshNbQuadrangles,    2, 1);
200   myMeshFacesGroupLayout->addWidget(myMeshNbQuadrangles1,   2, 2);
201   myMeshFacesGroupLayout->addWidget(myMeshNbQuadrangles2,   2, 3);
202   myMeshFacesGroupLayout->addWidget(myMeshNbPolygonesLab,   3, 0);
203   myMeshFacesGroupLayout->addWidget(myMeshNbPolygones,      3, 1);
204   
205   // --> volumes
206   myMeshVolumesGroup = new QGroupBox(tr("SMESH_MESHINFO_VOLUMES"), myMeshWidget);
207   QGridLayout* myMeshVolumesGroupLayout = new QGridLayout(myMeshVolumesGroup);
208   myMeshVolumesGroupLayout->setSpacing(SPACING);  myMeshVolumesGroupLayout->setMargin(MARGIN);
209
210   // --> volumes --> total
211   QLabel* myMeshNbVolumesLab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_TOTAL")), myMeshVolumesGroup);
212   myMeshNbVolumesLab->setFont(fnt);
213   myMeshNbVolumes    = new QLabel(myMeshVolumesGroup);
214   myMeshNbVolumes->setMinimumWidth(100);
215   myMeshNbVolumes->setFont(fnt);
216   myMeshNbVolumes1   = new QLabel(myMeshVolumesGroup);
217   myMeshNbVolumes1->setMinimumWidth(100);
218   myMeshNbVolumes1->setFont(fnt);
219   myMeshNbVolumes2   = new QLabel(myMeshVolumesGroup);
220   myMeshNbVolumes2->setMinimumWidth(100);
221   myMeshNbVolumes2->setFont(fnt);
222
223   // --> volumes --> tetrahedrons
224   QLabel* myMeshNbTetraLab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_TETRAS")), myMeshVolumesGroup);
225   myMeshNbTetra    = new QLabel(myMeshVolumesGroup);
226   myMeshNbTetra->setMinimumWidth(100);
227   myMeshNbTetra1   = new QLabel(myMeshVolumesGroup);
228   myMeshNbTetra1->setMinimumWidth(100);
229   myMeshNbTetra2   = new QLabel(myMeshVolumesGroup);
230   myMeshNbTetra2->setMinimumWidth(100);
231
232   // --> volumes --> hexahedrons
233   QLabel* myMeshNbHexaLab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_HEXAS")), myMeshVolumesGroup);
234   myMeshNbHexa    = new QLabel(myMeshVolumesGroup);
235   myMeshNbHexa->setMinimumWidth(100);
236   myMeshNbHexa1   = new QLabel(myMeshVolumesGroup);
237   myMeshNbHexa1->setMinimumWidth(100);
238   myMeshNbHexa2   = new QLabel(myMeshVolumesGroup);
239   myMeshNbHexa2->setMinimumWidth(100);
240
241   // --> volumes --> prisms
242   QLabel* myMeshNbPrismLab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_PRISMS")), myMeshVolumesGroup);
243   myMeshNbPrism    = new QLabel(myMeshVolumesGroup);
244   myMeshNbPrism->setMinimumWidth(100);
245   myMeshNbPrism1   = new QLabel(myMeshVolumesGroup);
246   myMeshNbPrism1->setMinimumWidth(100);
247   myMeshNbPrism2   = new QLabel(myMeshVolumesGroup);
248   myMeshNbPrism2->setMinimumWidth(100);
249
250   // --> volumes --> pyramids
251   QLabel* myMeshNbPyraLab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_PYRAS")), myMeshVolumesGroup);
252   myMeshNbPyra    = new QLabel(myMeshVolumesGroup);
253   myMeshNbPyra->setMinimumWidth(100);
254   myMeshNbPyra1   = new QLabel(myMeshVolumesGroup);
255   myMeshNbPyra1->setMinimumWidth(100);
256   myMeshNbPyra2   = new QLabel(myMeshVolumesGroup);
257   myMeshNbPyra2->setMinimumWidth(100);
258
259   // --> volumes --> polyherones
260   QLabel* myMeshNbPolyhedronesLab = new QLabel( COLONIZE( tr( "SMESH_MESHINFO_POLYEDRES" ) ), myMeshVolumesGroup );
261   myMeshNbPolyhedrones = new QLabel( myMeshVolumesGroup );
262   myMeshNbPolyhedrones->setMinimumWidth( 100 );
263
264   myMeshVolumesGroupLayout->addWidget(myMeshNbVolumesLab,      0, 0);
265   myMeshVolumesGroupLayout->addWidget(myMeshNbVolumes,         0, 1);
266   myMeshVolumesGroupLayout->addWidget(myMeshNbVolumes1,        0, 2);
267   myMeshVolumesGroupLayout->addWidget(myMeshNbVolumes2,        0, 3);
268   myMeshVolumesGroupLayout->addWidget(myMeshNbTetraLab,        1, 0);
269   myMeshVolumesGroupLayout->addWidget(myMeshNbTetra,           1, 1);
270   myMeshVolumesGroupLayout->addWidget(myMeshNbTetra1,          1, 2);
271   myMeshVolumesGroupLayout->addWidget(myMeshNbTetra2,          1, 3);
272   myMeshVolumesGroupLayout->addWidget(myMeshNbHexaLab,         2, 0);
273   myMeshVolumesGroupLayout->addWidget(myMeshNbHexa,            2, 1);
274   myMeshVolumesGroupLayout->addWidget(myMeshNbHexa1,           2, 2);
275   myMeshVolumesGroupLayout->addWidget(myMeshNbHexa2,           2, 3);
276   myMeshVolumesGroupLayout->addWidget(myMeshNbPrismLab,        3, 0);
277   myMeshVolumesGroupLayout->addWidget(myMeshNbPrism,           3, 1);
278   myMeshVolumesGroupLayout->addWidget(myMeshNbPrism1,          3, 2);
279   myMeshVolumesGroupLayout->addWidget(myMeshNbPrism2,          3, 3);
280   myMeshVolumesGroupLayout->addWidget(myMeshNbPyraLab,         4, 0);
281   myMeshVolumesGroupLayout->addWidget(myMeshNbPyra,            4, 1);
282   myMeshVolumesGroupLayout->addWidget(myMeshNbPyra1,           4, 2);
283   myMeshVolumesGroupLayout->addWidget(myMeshNbPyra2,           4, 3);
284   myMeshVolumesGroupLayout->addWidget(myMeshNbPolyhedronesLab, 5, 0);
285   myMeshVolumesGroupLayout->addWidget(myMeshNbPolyhedrones,    5, 1);
286
287   aMeshLayout->addWidget(myMeshNameLab,      0, 0);
288   aMeshLayout->addWidget(myMeshName,         0, 1);
289   aMeshLayout->addWidget(line1,              1, 0, 1, 2);
290   aMeshLayout->addWidget(myMeshNbNodesLab,   2, 0);
291   aMeshLayout->addWidget(myMeshNbNodes,      2, 1);
292   aMeshLayout->addWidget(myMeshOrder0Lab,    3, 1);
293   aMeshLayout->addWidget(myMeshOrder1Lab,    3, 2);
294   aMeshLayout->addWidget(myMeshOrder2Lab,    3, 3);
295   aMeshLayout->addWidget(myMeshNbEdgesLab,   4, 0);
296   aMeshLayout->addWidget(myMeshNbEdges,      4, 1);
297   aMeshLayout->addWidget(myMeshNbEdges1,     4, 2);
298   aMeshLayout->addWidget(myMeshNbEdges2,     4, 3);
299   aMeshLayout->addWidget(myMeshFacesGroup,   5, 0, 1, 4);
300   aMeshLayout->addWidget(myMeshVolumesGroup, 6, 0, 1, 4);
301   aMeshLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding), 7, 0);
302
303   // submesh
304   mySubMeshWidget = new QWidget(myWGStack);
305   QGridLayout* aSubMeshLayout = new QGridLayout(mySubMeshWidget);
306   aSubMeshLayout->setSpacing(SPACING);  aSubMeshLayout->setMargin(0);
307   myWGStack->addWidget(mySubMeshWidget);
308
309   // --> name
310   QLabel* mySubMeshNameLab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_NAME")), mySubMeshWidget);
311   mySubMeshName    = new QLabel(mySubMeshWidget);
312   mySubMeshName->setMinimumWidth(100);
313   QFrame* line2 = new QFrame(mySubMeshWidget);
314   line2->setFrameStyle(QFrame::HLine | QFrame::Sunken);
315
316   // --> nodes
317   QLabel* mySubMeshNbNodesLab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_NODES")), mySubMeshWidget);
318   mySubMeshNbNodes    = new QLabel(mySubMeshWidget);
319   mySubMeshNbNodes->setMinimumWidth(100);
320
321   // --> elements
322   mySubMeshElementsGroup = new QGroupBox(tr("SMESH_MESHINFO_ELEMENTS"), mySubMeshWidget);
323   QGridLayout* mySubMeshElementsGroupLayout = new QGridLayout(mySubMeshElementsGroup);
324   mySubMeshElementsGroupLayout->setSpacing(SPACING);  mySubMeshElementsGroupLayout->setMargin(MARGIN);
325
326   // --> elements --> total
327   QLabel* mySubMeshNbElementsLab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_TOTAL")), mySubMeshElementsGroup);
328   mySubMeshNbElementsLab->setFont(fnt);
329   mySubMeshNbElements    = new QLabel(mySubMeshElementsGroup);
330   mySubMeshNbElements->setMinimumWidth(100);
331   mySubMeshNbElements->setFont(fnt);
332
333   // --> elements --> edges
334   QLabel* mySubMeshNbEdgesLab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_EDGES")), mySubMeshElementsGroup);
335   mySubMeshNbEdges    = new QLabel(mySubMeshElementsGroup);
336   mySubMeshNbEdges->setMinimumWidth(100);
337
338   // --> elements --> faces
339   QLabel* mySubMeshNbFacesLab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_FACES")), mySubMeshElementsGroup);
340   mySubMeshNbFaces    = new QLabel(mySubMeshElementsGroup);
341   mySubMeshNbFaces->setMinimumWidth(100);
342
343   // --> elements --> volumes
344   QLabel* mySubMeshNbVolumesLab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_VOLUMES")), mySubMeshElementsGroup);
345   mySubMeshNbVolumes    = new QLabel(mySubMeshElementsGroup);
346   mySubMeshNbVolumes->setMinimumWidth(100);
347
348   mySubMeshElementsGroupLayout->addWidget(mySubMeshNbElementsLab, 0, 0);
349   mySubMeshElementsGroupLayout->addWidget(mySubMeshNbElements,    0, 1);
350   mySubMeshElementsGroupLayout->addWidget(mySubMeshNbEdgesLab,    1, 0);
351   mySubMeshElementsGroupLayout->addWidget(mySubMeshNbEdges,       1, 1);
352   mySubMeshElementsGroupLayout->addWidget(mySubMeshNbFacesLab,    2, 0);
353   mySubMeshElementsGroupLayout->addWidget(mySubMeshNbFaces,       2, 1);
354   mySubMeshElementsGroupLayout->addWidget(mySubMeshNbVolumesLab,  3, 0);
355   mySubMeshElementsGroupLayout->addWidget(mySubMeshNbVolumes,     3, 1);
356
357   aSubMeshLayout->addWidget(mySubMeshNameLab,       0, 0);
358   aSubMeshLayout->addWidget(mySubMeshName,          0, 1);
359   aSubMeshLayout->addWidget(line2,                  1, 0, 1, 2);
360   aSubMeshLayout->addWidget(mySubMeshNbNodesLab,    2, 0);
361   aSubMeshLayout->addWidget(mySubMeshNbNodes,       2, 1);
362   aSubMeshLayout->addWidget(mySubMeshElementsGroup, 3, 0, 1, 2);
363   aSubMeshLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding), 4, 0);
364
365   // group
366   myGroupWidget = new QWidget(myWGStack);
367   QGridLayout* myGroupWidgetLayout = new QGridLayout(myGroupWidget);
368   myGroupWidgetLayout->setSpacing(SPACING);  myGroupWidgetLayout->setMargin(0);
369   myWGStack->addWidget(myGroupWidget);
370
371   // --> name
372   QLabel* myGroupNameLab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_NAME")), myGroupWidget);
373   myGroupName = new QLabel(myGroupWidget);
374   myGroupName->setMinimumWidth(100);
375   QFrame* line3 = new QFrame(myGroupWidget);
376   line3->setFrameStyle(QFrame::HLine | QFrame::Sunken);
377
378   // --> type
379   QLabel* myGroupTypeLab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_TYPE")), myGroupWidget);
380   myGroupType = new QLabel(myGroupWidget);
381   myGroupType->setMinimumWidth(100);
382
383   // --> number of entities
384   QLabel* myGroupNbLab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_ENTITIES")), myGroupWidget);
385   myGroupNb = new QLabel(myGroupWidget);
386   myGroupNb->setMinimumWidth(100);
387
388   myGroupWidgetLayout->addWidget(myGroupNameLab, 0, 0);
389   myGroupWidgetLayout->addWidget(myGroupName,    0, 1);
390   myGroupWidgetLayout->addWidget(line3,          1, 0, 1, 2);
391   myGroupWidgetLayout->addWidget(myGroupTypeLab, 2, 0);
392   myGroupWidgetLayout->addWidget(myGroupType,    2, 1);
393   myGroupWidgetLayout->addWidget(myGroupNbLab,   3, 0);
394   myGroupWidgetLayout->addWidget(myGroupNb,      3, 1);
395   myGroupWidgetLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding), 4, 0);
396
397   // buttons
398   myButtonsGroup = new QGroupBox(this);
399   QHBoxLayout* myButtonsGroupLayout = new QHBoxLayout(myButtonsGroup);
400   myButtonsGroupLayout->setSpacing(SPACING); myButtonsGroupLayout->setMargin(MARGIN);
401
402   // buttons --> OK and Help buttons
403   myOkBtn = new QPushButton(tr("SMESH_BUT_OK" ), myButtonsGroup);
404   myOkBtn->setAutoDefault(true); myOkBtn->setDefault(true);
405   myHelpBtn = new QPushButton(tr("SMESH_BUT_HELP" ), myButtonsGroup);
406   myHelpBtn->setAutoDefault(true);
407
408   myButtonsGroupLayout->addWidget(myOkBtn);
409   myButtonsGroupLayout->addSpacing(10);
410   myButtonsGroupLayout->addStretch();
411   myButtonsGroupLayout->addWidget(myHelpBtn);
412
413   aTopLayout->addLayout(aSelectLayout);
414   aTopLayout->addWidget(myWGStack);
415   aTopLayout->addWidget(myButtonsGroup);
416
417   mySMESHGUI->SetActiveDialogBox(this);
418
419   // connect signals
420   connect(myOkBtn,                 SIGNAL(clicked()),                      this, SLOT(close()));
421   connect( myHelpBtn,              SIGNAL(clicked()),                      this, SLOT(onHelp()));
422   connect(mySelectBtn,             SIGNAL(clicked()),                      this, SLOT(onStartSelection()));
423   connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()),        this, SLOT(close()));
424   connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
425   connect(mySelectionMgr,          SIGNAL(currentSelectionChanged()),      this, SLOT(onSelectionChanged()));
426
427   // init dialog with current selection
428   onSelectionChanged();
429
430   myHelpFileName = "mesh_infos_page.html#advanced_mesh_infos_anchor";
431 }
432
433 //=================================================================================
434 // function : ~SMESHGUI_MeshInfosDlg()
435 // purpose  : Destructor
436 //=================================================================================
437 SMESHGUI_MeshInfosDlg::~SMESHGUI_MeshInfosDlg()
438 {
439 }
440
441 //=================================================================================
442 // function : DumpMeshInfos()
443 // purpose  : 
444 //=================================================================================
445 void SMESHGUI_MeshInfosDlg::DumpMeshInfos()
446 {
447   SUIT_OverrideCursor wc;
448
449   SALOME_ListIO aList;
450   mySelectionMgr->selectedObjects(aList);
451
452   int nbSel = aList.Extent();
453   if (nbSel == 1) {
454     myStartSelection = false;
455     mySelectLab->setText("");
456     Handle(SALOME_InteractiveObject) IObject = aList.First();
457     _PTR(SObject) aSO = SMESH::GetActiveStudyDocument()->FindObjectID(IObject->getEntry());
458     if (aSO) {
459       //CORBA::Object_var anObject = aSO->GetObject();
460       CORBA::Object_var anObject = SMESH::SObjectToObject(aSO);
461       if (!CORBA::is_nil(anObject)) {
462         SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow(anObject);
463         if (!aMesh->_is_nil()) {
464           myWGStack->setCurrentWidget(myMeshWidget);
465           setWindowTitle(tr("SMESH_MESHINFO_TITLE") + " [" + tr("SMESH_OBJECT_MESH") + "]");
466           myMeshName->setText(aSO->GetName().c_str());
467           myMeshNbNodes->setNum((int)aMesh->NbNodes());
468           myMeshNbEdges->setNum((int)aMesh->NbEdges());
469           myMeshNbEdges1->setNum((int)aMesh->NbEdgesOfOrder(SMESH::ORDER_LINEAR));
470           myMeshNbEdges2->setNum((int)aMesh->NbEdgesOfOrder(SMESH::ORDER_QUADRATIC));
471           myMeshNbFaces->setNum((int)aMesh->NbFaces());
472           myMeshNbFaces1->setNum((int)aMesh->NbFacesOfOrder(SMESH::ORDER_LINEAR));
473           myMeshNbFaces2->setNum((int)aMesh->NbFacesOfOrder(SMESH::ORDER_QUADRATIC));
474           myMeshNbTriangles->setNum((int)aMesh->NbTriangles());
475           myMeshNbTriangles1->setNum((int)aMesh->NbTrianglesOfOrder(SMESH::ORDER_LINEAR));
476           myMeshNbTriangles2->setNum((int)aMesh->NbTrianglesOfOrder(SMESH::ORDER_QUADRATIC));
477           myMeshNbQuadrangles->setNum((int)aMesh->NbQuadrangles());
478           myMeshNbQuadrangles1->setNum((int)aMesh->NbQuadranglesOfOrder(SMESH::ORDER_LINEAR));
479           myMeshNbQuadrangles2->setNum((int)aMesh->NbQuadranglesOfOrder(SMESH::ORDER_QUADRATIC));
480           myMeshNbPolygones->setNum( (int)aMesh->NbPolygons() );
481           myMeshNbVolumes->setNum((int)aMesh->NbVolumes());
482           myMeshNbVolumes1->setNum((int)aMesh->NbVolumesOfOrder(SMESH::ORDER_LINEAR));
483           myMeshNbVolumes2->setNum((int)aMesh->NbVolumesOfOrder(SMESH::ORDER_QUADRATIC));
484           myMeshNbTetra->setNum((int)aMesh->NbTetras());
485           myMeshNbTetra1->setNum((int)aMesh->NbTetrasOfOrder(SMESH::ORDER_LINEAR));
486           myMeshNbTetra2->setNum((int)aMesh->NbTetrasOfOrder(SMESH::ORDER_QUADRATIC));
487           myMeshNbHexa->setNum((int)aMesh->NbHexas());
488           myMeshNbHexa1->setNum((int)aMesh->NbHexasOfOrder(SMESH::ORDER_LINEAR));
489           myMeshNbHexa2->setNum((int)aMesh->NbHexasOfOrder(SMESH::ORDER_QUADRATIC));
490           myMeshNbPrism->setNum((int)aMesh->NbPrisms());
491           myMeshNbPrism1->setNum((int)aMesh->NbPrismsOfOrder(SMESH::ORDER_LINEAR));
492           myMeshNbPrism2->setNum((int)aMesh->NbPrismsOfOrder(SMESH::ORDER_QUADRATIC));
493           myMeshNbPyra->setNum((int)aMesh->NbPyramids());
494           myMeshNbPyra1->setNum((int)aMesh->NbPyramidsOfOrder(SMESH::ORDER_LINEAR));
495           myMeshNbPyra2->setNum((int)aMesh->NbPyramidsOfOrder(SMESH::ORDER_QUADRATIC));
496           myMeshNbPolyhedrones->setNum( (int)aMesh->NbPolyhedrons() );
497           return;
498         }
499         SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow(anObject);
500         if (!aSubMesh->_is_nil()) {
501           myWGStack->setCurrentWidget(mySubMeshWidget);
502           setWindowTitle(tr("SMESH_MESHINFO_TITLE") + " [" + tr("SMESH_SUBMESH") + "]");
503           mySubMeshName->setText(aSO->GetName().c_str());
504           mySubMeshNbNodes->setNum((int)aSubMesh->GetNumberOfNodes(true));
505           mySubMeshNbElements->setNum((int)aSubMesh->GetNumberOfElements());
506           mySubMeshNbEdges->setNum((int)(aSubMesh->GetElementsByType(SMESH::EDGE)->length()));
507           mySubMeshNbFaces->setNum((int)(aSubMesh->GetElementsByType(SMESH::FACE)->length()));
508           mySubMeshNbVolumes->setNum((int)(aSubMesh->GetElementsByType(SMESH::VOLUME)->length()));
509           return;
510         }
511         SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(anObject);
512         if (!aGroup->_is_nil()) {
513           myWGStack->setCurrentWidget(myGroupWidget);
514           setWindowTitle(tr("SMESH_MESHINFO_TITLE") + " [" + tr("SMESH_GROUP") + "]");
515           myGroupName->setText(aSO->GetName().c_str());
516           int aType = aGroup->GetType();
517           QString strType;
518           switch (aType) {
519           case SMESH::NODE:
520             strType = "SMESH_MESHINFO_NODES"; break;
521           case SMESH::EDGE:
522             strType = "SMESH_MESHINFO_EDGES"; break;
523           case SMESH::FACE:
524             strType = "SMESH_MESHINFO_FACES"; break;
525           case SMESH::VOLUME:
526             strType = "SMESH_MESHINFO_VOLUMES"; break;
527           default:
528             strType = "SMESH_MESHINFO_ALL_TYPES"; break;
529           }
530
531           myGroupType->setText(tr(strType.toLatin1().data()));
532           myGroupNb->setNum((int)aGroup->Size());
533           return;
534         }
535       }
536     }
537   }
538   myWGStack->setCurrentIndex(0);
539   setWindowTitle(tr("SMESH_MESHINFO_TITLE"));
540 }
541
542 //=================================================================================
543 // function : SelectionIntoArgument()
544 // purpose  : Called when selection has changed
545 //=================================================================================
546 void SMESHGUI_MeshInfosDlg::onSelectionChanged()
547 {
548   if (myStartSelection)
549     DumpMeshInfos();
550 }
551
552 //=================================================================================
553 // function : closeEvent()
554 // purpose  :
555 //=================================================================================
556 void SMESHGUI_MeshInfosDlg::closeEvent(QCloseEvent* e)
557 {
558   mySMESHGUI->ResetState();
559   QDialog::closeEvent(e);
560 }
561
562 //=================================================================================
563 // function : windowActivationChange()
564 // purpose  : called when window is activated/deactivated
565 //=================================================================================
566 void SMESHGUI_MeshInfosDlg::windowActivationChange(bool oldActive)
567 {
568   QDialog::windowActivationChange(oldActive);
569   if (isActiveWindow() && myIsActiveWindow != isActiveWindow())
570     ActivateThisDialog();
571   myIsActiveWindow = isActiveWindow();
572 }
573
574 //=================================================================================
575 // function : DeactivateActiveDialog()
576 // purpose  :
577 //=================================================================================
578 void SMESHGUI_MeshInfosDlg::DeactivateActiveDialog()
579 {
580   disconnect(mySelectionMgr, 0, this, 0);
581 }
582
583 //=================================================================================
584 // function : ActivateThisDialog()
585 // purpose  :
586 //=================================================================================
587 void SMESHGUI_MeshInfosDlg::ActivateThisDialog()
588 {
589   /* Emit a signal to deactivate any active dialog */
590   mySMESHGUI->EmitSignalDeactivateDialog();
591   connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(onSelectionChanged()));
592 }
593
594 //=================================================================================
595 // function : onStartSelection()
596 // purpose  : starts selection
597 //=================================================================================
598 void SMESHGUI_MeshInfosDlg::onStartSelection()
599 {
600   myStartSelection = true;
601   onSelectionChanged();
602   myStartSelection = true;
603   mySelectLab->setText(tr("INF_SELECT_OBJECT"));
604 }
605
606 //=================================================================================
607 // function : onHelp()
608 // purpose  :
609 //=================================================================================
610 void SMESHGUI_MeshInfosDlg::onHelp()
611 {
612   LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
613   if (app) 
614     app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
615   else {
616     QString platform;
617 #ifdef WIN32
618     platform = "winapplication";
619 #else
620     platform = "application";
621 #endif
622     SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
623                              tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
624                              arg(app->resourceMgr()->stringValue("ExternalBrowser", 
625                                                                  platform)).
626                              arg(myHelpFileName));
627   }
628 }
629
630 //=================================================================================
631 // function : keyPressEvent()
632 // purpose  :
633 //=================================================================================
634 void SMESHGUI_MeshInfosDlg::keyPressEvent( QKeyEvent* e )
635 {
636   QDialog::keyPressEvent( e );
637   if ( e->isAccepted() )
638     return;
639
640   if ( e->key() == Qt::Key_F1 ) {
641     e->accept();
642     onHelp();
643   }
644 }