Salome HOME
Start "Create group" with selected GEOM object occurs crash
[modules/smesh.git] / src / SMESHGUI / SMESHGUI.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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
21 //
22 //  File   : SMESHGUI.cxx
23 //  Author : Nicolas REJNERI
24 //  Module : SMESH
25 //  $Header$
26
27 #include "SMESHGUI.h"
28 #include "SMESHGUI_InitMeshDlg.h"
29 #include "SMESHGUI_AddSubMeshDlg.h"
30 #include "SMESHGUI_NodesDlg.h"
31 #include "SMESHGUI_TransparencyDlg.h"
32 #include "SMESHGUI_ClippingDlg.h"
33 #include "SMESHGUI_GroupDlg.h"
34 #include "SMESHGUI_RemoveNodesDlg.h"
35 #include "SMESHGUI_RemoveElementsDlg.h"
36 #include "SMESHGUI_MeshInfosDlg.h"
37 #include "SMESHGUI_StandardMeshInfosDlg.h"
38 #include "SMESHGUI_Preferences_ColorDlg.h"
39 #include "SMESHGUI_Preferences_ScalarBarDlg.h"
40 #include "SMESHGUI_Preferences_SelectionDlg.h"
41 #include "SMESHGUI_Hypotheses.h"
42 #include "SMESHGUI_HypothesesUtils.h"
43 #include "SMESHGUI_MoveNodesDlg.h"
44 #include "SMESHGUI_AddMeshElementDlg.h"
45 #include "SMESHGUI_EditHypothesesDlg.h"
46 #include "SMESHGUI_CreateHypothesesDlg.h"
47 #include "SMESHGUI_FilterDlg.h"
48 #include "SMESHGUI_FilterLibraryDlg.h"
49 #include "SMESHGUI_SingleEditDlg.h"
50 #include "SMESHGUI_MultiEditDlg.h"
51 #include "SMESHGUI_GroupOpDlg.h"
52 #include "SMESHGUI_DeleteGroupDlg.h"
53 #include "SMESHGUI_SmoothingDlg.h"
54 #include "SMESHGUI_RenumberingDlg.h"
55 #include "SMESHGUI_ExtrusionDlg.h"
56 #include "SMESHGUI_ExtrusionAlongPathDlg.h"
57 #include "SMESHGUI_RevolutionDlg.h"
58 #include "SMESHGUI_TranslationDlg.h"
59 #include "SMESHGUI_RotationDlg.h"
60 #include "SMESHGUI_SymmetryDlg.h"
61 #include "SMESHGUI_SewingDlg.h"
62 #include "SMESHGUI_MergeNodesDlg.h"
63 #include "SMESHGUI_MeshPatternDlg.h"
64 #include "SMESHGUI_PrecisionDlg.h"
65 #include "SMESHGUI_Selection.h"
66 #include "SMESHGUI_CreatePolyhedralVolumeDlg.h"
67
68 #include <SVTK_InteractorStyle.h>
69 #include <SVTK_RenderWindowInteractor.h>
70
71 #include "SMESH_Actor.h"
72 #include "SMESH_Object.h"
73 #include "SMESH_TypeFilter.hxx"
74
75 #include "SUIT_Tools.h"
76 #include "SUIT_MessageBox.h"
77 #include "SUIT_ResourceMgr.h"
78 #include "SUIT_FileDlg.h"
79 #include "SUIT_Desktop.h"
80 #include "SUIT_ResourceMgr.h"
81 #include "SUIT_OverrideCursor.h"
82 #include "SUIT_Study.h"
83 #include "SUIT_Session.h"
84
85 #include "SALOME_NamingService.hxx"
86 #include "SALOME_ListIteratorOfListIO.hxx"
87 #include "SALOME_InteractiveObject.hxx"
88 #include "SALOME_ListIO.hxx"
89 #include <SALOME_LifeCycleCORBA.hxx>
90
91 #include "OB_Browser.h"
92
93 #include "QtxPopupMgr.h"
94
95 #include "SalomeApp_Application.h"
96 #include "SalomeApp_NameDlg.h"
97 #include "SalomeApp_DataOwner.h"
98 #include "SalomeApp_ImportOperation.h"
99 #include "SalomeApp_Tools.h"
100 #include "SalomeApp_Study.h"
101 #include "SalomeApp_VTKSelector.h"
102
103 #include <SVTK_ViewWindow.h>
104 #include <SVTK_ViewModel.h>
105
106 #include <VTKViewer_ViewManager.h>
107
108 #include "SMESHGUI_Utils.h"
109 #include "SMESHGUI_GEOMGenUtils.h"
110 #include "SMESHGUI_MeshUtils.h"
111 #include "SMESHGUI_GroupUtils.h"
112 #include "SMESHGUI_FilterUtils.h"
113 #include "SMESHGUI_PatternUtils.h"
114 #include "SMESHGUI_VTKUtils.h"
115
116 #include "SALOMEconfig.h"
117 #include CORBA_CLIENT_HEADER(SALOMEDS_Attributes)
118
119 // QT Includes
120 #define  INCLUDE_MENUITEM_DEF
121 #include <qapplication.h>
122 #include <qlineedit.h>
123 #include <qmenudata.h>
124 #include <qmenubar.h>
125 #include <qpopupmenu.h>
126 #include <qfont.h>
127 #include <qstring.h>
128 #include <qpainter.h>
129 #include <qcheckbox.h>
130 #include <qcolordialog.h>
131 #include <qspinbox.h>
132 #include <qlist.h>
133 #include <qwidget.h>
134 #include <qevent.h>
135 #include <qaction.h>
136 #include <qradiobutton.h>
137
138 #include <boost/shared_ptr.hpp>
139
140 #include <vtkRenderer.h>
141 #include <vtkRenderWindow.h>
142 #include <vtkActorCollection.h>
143 #include <vtkScalarBarActor.h>
144 #include <vtkUnstructuredGrid.h>
145
146 #include "utilities.h"
147
148 #include "SALOMEDS_Study.hxx"
149 #include "SALOMEDSClient_StudyBuilder.hxx"
150 #include "SALOMEDSClient_SComponent.hxx"
151
152 using namespace std;
153
154 namespace{
155   // Decalarations
156   //=============================================================
157   void ImportMeshesFromFile(SMESH::SMESH_Gen_ptr theComponentMesh,
158                             int theCommandID);
159
160   void ExportMeshToFile(int theCommandID);
161
162   void SetDisplayMode(int theCommandID);
163
164   void SetDisplayEntity(int theCommandID);
165
166   void Control( int theCommandID );
167
168   void SetDisplaySettings();
169
170
171   // Definitions
172   //=============================================================
173   void ImportMeshesFromFile(SMESH::SMESH_Gen_ptr theComponentMesh,
174                             int theCommandID)
175   {
176     QStringList filter;
177     string myExtension;
178   
179     if(theCommandID == 113){
180       filter.append(QObject::tr("MED files (*.med)"));
181       filter.append(QObject::tr("All files (*)"));
182     }else if (theCommandID == 112){
183       filter.append(QObject::tr("IDEAS files (*.unv)"));
184     }else if (theCommandID == 111){
185       filter.append(QObject::tr("DAT files (*.dat)"));
186     }
187     QString filename = SUIT_FileDlg::getFileName(SMESHGUI::desktop(),
188                                                 "",
189                                                 filter,
190                                                 QObject::tr("Import mesh"),
191                                                 true);
192     if(!filename.isEmpty()) {
193       SUIT_OverrideCursor wc;
194       _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
195
196       try {
197         SMESH::mesh_array_var aMeshes = new SMESH::mesh_array;
198         switch ( theCommandID ) {
199         case 112:
200           {
201             aMeshes->length( 1 );
202             aMeshes[0] = theComponentMesh->CreateMeshesFromUNV(filename.latin1());
203             break;
204           }
205         case 113:
206           {
207             SMESH::DriverMED_ReadStatus res;
208             aMeshes = theComponentMesh->CreateMeshesFromMED(filename.latin1(),res);
209             if ( res != SMESH::DRS_OK ) {
210               wc.suspend();
211               SUIT_MessageBox::warn1(SMESHGUI::desktop(),
212                                     QObject::tr("SMESH_WRN_WARNING"),
213                                     QObject::tr(QString("SMESH_DRS_%1").arg(res)),
214                                     QObject::tr("SMESH_BUT_OK"));
215               aMeshes->length( 0 );
216               wc.resume();
217             }
218             break;
219           }
220         }
221
222         bool isEmpty = false;
223         for ( int i = 0, iEnd = aMeshes->length(); i < iEnd; i++ ) {
224           _PTR(SObject) aMeshSO = SMESH::FindSObject( aMeshes[i] );
225           if ( aMeshSO ) {
226             _PTR(StudyBuilder) aBuilder = aStudy->NewBuilder();
227             _PTR(AttributePixMap) aPixmap = aBuilder->FindOrCreateAttribute( aMeshSO, "AttributePixMap" );
228             aPixmap->SetPixMap("ICON_SMESH_TREE_MESH_IMPORTED");
229             if ( theCommandID == 112 ) // mesh names aren't taken from the file for UNV import
230               SMESH::SetName( aMeshSO, QFileInfo(filename).fileName() );
231           } else
232             isEmpty = true;
233         }
234
235         if ( isEmpty ) {
236           wc.suspend();
237           SUIT_MessageBox::warn1(SMESHGUI::desktop(),
238                                 QObject::tr("SMESH_WRN_WARNING"),
239                                 QObject::tr("SMESH_DRS_EMPTY"),
240                                 QObject::tr("SMESH_BUT_OK"));
241           wc.resume();
242         }
243       }
244       catch (const SALOME::SALOME_Exception& S_ex){
245         wc.suspend();
246         SalomeApp_Tools::QtCatchCorbaException(S_ex);
247         wc.resume();
248       }
249     }
250   }
251
252
253   void ExportMeshToFile( int theCommandID )
254   {
255     SalomeApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
256     SALOME_ListIO selected;
257     if( aSel )
258       aSel->selectedObjects( selected );
259
260     if(selected.Extent()){
261       Handle(SALOME_InteractiveObject) anIObject = selected.First();
262       SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(anIObject);
263       if ( !aMesh->_is_nil() ) {
264         QString aFilter, aTitle = QObject::tr("Export mesh");
265         QMap<QString, SMESH::MED_VERSION> aFilterMap;
266         switch ( theCommandID ) {
267         case 125:
268         case 122:
269           aFilterMap.insert( QObject::tr("MED 2.1 (*.med)"), SMESH::MED_V2_1 );
270           aFilterMap.insert( QObject::tr("MED 2.2 (*.med)"), SMESH::MED_V2_2 );
271           break;
272         case 124:
273         case 121:
274           aFilter = QObject::tr("DAT files (*.dat)");
275           break;
276         case 126:
277         case 123: {
278           if(aMesh->NbPyramids()){
279             int aRet = SUIT_MessageBox::warn2(SMESHGUI::desktop(),
280                                              QObject::tr("SMESH_WRN_WARNING"),
281                                              QObject::tr("SMESH_EXPORT_UNV").arg(anIObject->getName()),
282                                              QObject::tr("SMESH_BUT_YES"),
283                                              QObject::tr("SMESH_BUT_NO"),
284                                              0,1,0);
285             if(aRet)
286               return;
287           }
288           aFilter = QObject::tr("IDEAS files (*.unv)");
289           break;
290         default:
291           return;
292         }}
293
294         QString aFilename;
295         SMESH::MED_VERSION aFormat;
296
297         if ( theCommandID != 122 && theCommandID != 125 )
298           aFilename = SUIT_FileDlg::getFileName(SMESHGUI::desktop(), "", aFilter, aTitle, false);
299         else
300           {
301             QStringList filters;
302             for ( QMap<QString, SMESH::MED_VERSION>::const_iterator it = aFilterMap.begin(); it != aFilterMap.end(); ++it )
303               filters.push_back( it.key() );
304             
305             SUIT_FileDlg* fd = new SUIT_FileDlg( SMESHGUI::desktop(), false, true, true );
306             fd->setCaption( aTitle );
307             fd->setFilters( filters );
308             fd->exec();
309             aFilename = fd->selectedFile();
310             aFormat = aFilterMap[fd->selectedFilter()];
311             delete fd;
312           }
313         if ( !aFilename.isEmpty() ) {
314           // Check whether the file already exists and delete it if yes
315           QFile aFile( aFilename );
316           if ( aFile.exists() )
317             aFile.remove();
318           SUIT_OverrideCursor wc;
319           switch ( theCommandID ) {
320           case 125:
321           case 122:
322             aMesh->ExportToMED( aFilename.latin1(), false, aFormat ); // currently, automatic groups are never created
323             break;
324           case 124:
325           case 121:
326             aMesh->ExportDAT( aFilename.latin1() );
327             break;
328           case 126:
329           case 123:
330             aMesh->ExportUNV( aFilename.latin1() );
331             break;
332           default:
333             break;
334           }
335         }
336       }
337     }
338   }
339
340   inline void InverseEntityMode(unsigned int& theOutputMode,
341                                 unsigned int theMode)
342   {
343     bool anIsNotPresent = ~theOutputMode & theMode;
344     if(anIsNotPresent)
345       theOutputMode |= theMode;
346     else
347       theOutputMode &= ~theMode;
348   }
349
350   void SetDisplayEntity(int theCommandID){
351     SalomeApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
352     SALOME_ListIO selected;
353     if( aSel )
354       aSel->selectedObjects( selected );
355
356     if(selected.Extent() >= 1){
357       SALOME_ListIteratorOfListIO It( selected );
358       for(; It.More(); It.Next()){
359         Handle(SALOME_InteractiveObject) IObject = It.Value();
360         if(IObject->hasEntry()){
361           if(SMESH_Actor *anActor = SMESH::FindActorByEntry(IObject->getEntry())){
362             unsigned int aMode = anActor->GetEntityMode();
363             switch(theCommandID){
364             case 217:
365               InverseEntityMode(aMode,SMESH_Actor::eEdges);
366               break;
367             case 218:
368               InverseEntityMode(aMode,SMESH_Actor::eFaces);
369               break;
370             case 219:
371               InverseEntityMode(aMode,SMESH_Actor::eVolumes);
372               break;
373             case 220:
374               aMode = SMESH_Actor::eAllEntity;
375               break;
376             }
377             if(aMode)
378               anActor->SetEntityMode(aMode);
379           }
380         }
381       }
382     }
383   }
384
385   void SetDisplayMode(int theCommandID){
386     SalomeApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
387     SALOME_ListIO selected;
388     if( aSel )
389       aSel->selectedObjects( selected );
390
391     if(selected.Extent() >= 1){
392       switch(theCommandID){
393       case 1134:{
394         SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog();
395         new SMESHGUI_ClippingDlg( SMESHGUI::GetSMESHGUI(), "", false );
396         return;
397       }
398       case 1133:{
399         SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog();
400         new SMESHGUI_TransparencyDlg( SMESHGUI::GetSMESHGUI(), "", false );
401         return;
402       }}
403       SALOME_ListIteratorOfListIO It( selected );
404       for(; It.More(); It.Next()){
405         Handle(SALOME_InteractiveObject) IObject = It.Value();
406         if(IObject->hasEntry()){
407           if(SMESH_Actor *anActor = SMESH::FindActorByEntry(IObject->getEntry())){
408             switch(theCommandID){
409             case 211:
410               anActor->SetRepresentation(SMESH_Actor::eEdge);
411               break;
412             case 212:
413               anActor->SetRepresentation(SMESH_Actor::eSurface);
414               break;
415             case 213:
416               if(anActor->IsShrunk())
417                 anActor->UnShrink();
418               else
419                 anActor->SetShrink();
420               break;
421             case 215:
422               anActor->SetRepresentation(SMESH_Actor::ePoint);
423               break;
424             case 1132:{
425               float color[3];
426               anActor->GetSufaceColor(color[0], color[1], color[2]);
427               int c0 = int (color[0] * 255);
428               int c1 = int (color[1] * 255);
429               int c2 = int (color[2] * 255);
430               QColor c(c0, c1, c2);
431
432               float edgecolor[3];
433               anActor->GetEdgeColor(edgecolor[0], edgecolor[1], edgecolor[2]);
434               c0 = int (edgecolor[0] * 255);
435               c1 = int (edgecolor[1] * 255);
436               c2 = int (edgecolor[2] * 255);
437               QColor e(c0, c1, c2);
438
439               float backfacecolor[3];
440               anActor->GetBackSufaceColor(backfacecolor[0], backfacecolor[1], backfacecolor[2]);
441               c0 = int (backfacecolor[0] * 255);
442               c1 = int (backfacecolor[1] * 255);
443               c2 = int (backfacecolor[2] * 255);
444               QColor b(c0, c1, c2);
445
446               float nodecolor[3];
447               anActor->GetNodeColor(nodecolor[0], nodecolor[1], nodecolor[2]);
448               c0 = int (nodecolor[0] * 255);
449               c1 = int (nodecolor[1] * 255);
450               c2 = int (nodecolor[2] * 255);
451               QColor n(c0, c1, c2);
452
453               int Edgewidth = (int)anActor->GetLineWidth();
454               if(Edgewidth == 0)
455                 Edgewidth = 1;
456               int intValue = int(anActor->GetNodeSize());
457               float Shrink = anActor->GetShrinkFactor();
458
459               SMESHGUI_Preferences_ColorDlg *aDlg =
460                 new SMESHGUI_Preferences_ColorDlg( SMESHGUI::GetSMESHGUI(), "" );
461               aDlg->SetColor(1, c);
462               aDlg->SetColor(2, e);
463               aDlg->SetColor(3, n);
464               aDlg->SetColor(4, b);
465               aDlg->SetIntValue(1, Edgewidth);
466               aDlg->SetIntValue(2, intValue);
467               aDlg->SetIntValue(3, int(Shrink*100.));
468               if(aDlg->exec()){
469                 QColor color = aDlg->GetColor(1);
470                 QColor edgecolor = aDlg->GetColor(2);
471                 QColor nodecolor = aDlg->GetColor(3);
472                 QColor backfacecolor = aDlg->GetColor(4);
473                 /* actor color and backface color */
474                 anActor->SetSufaceColor(float (color.red()) / 255.,
475                                          float (color.green()) / 255.,
476                                          float (color.blue()) / 255.);
477                 anActor->SetBackSufaceColor(float (backfacecolor.red()) / 255.,
478                                              float (backfacecolor.green()) / 255.,
479                                              float (backfacecolor.blue()) / 255.);
480
481                 /* edge color */
482                 anActor->SetEdgeColor(float (edgecolor.red()) / 255.,
483                                        float (edgecolor.green()) / 255.,
484                                        float (edgecolor.blue()) / 255.);
485
486                 /* Shrink factor and size edges */
487                 anActor->SetShrinkFactor(aDlg->GetIntValue(3) / 100.);
488                 anActor->SetLineWidth(aDlg->GetIntValue(1));
489
490                 /* Nodes color and size */
491                 anActor->SetNodeColor(float (nodecolor.red()) / 255.,
492                                float (nodecolor.green()) / 255.,
493                                        float (nodecolor.blue()) / 255.);
494                 anActor->SetNodeSize(aDlg->GetIntValue(2));
495
496                 delete aDlg;
497               }
498               break;
499             }}
500           }
501         }
502       }
503       SMESH::RepaintCurrentView();
504     }
505   }
506
507
508   void SetDisplaySettings()
509   {
510     SUIT_ResourceMgr* mgr = SMESHGUI::resourceMgr();
511     if( !mgr )
512       return;
513
514     SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog();
515     SMESHGUI_Preferences_ColorDlg *aDlg =
516       new SMESHGUI_Preferences_ColorDlg( SMESHGUI::GetSMESHGUI(), "" );
517
518     QColor color = mgr->colorValue( "SMESH", "SettingsFillColor", QColor(0, 170, 255) );
519     aDlg->SetColor(1, color);
520
521     color = mgr->colorValue( "SMESH", "SettingsOutlineColor", QColor(0, 170, 255) );
522     aDlg->SetColor(2, color);
523
524     color = mgr->colorValue( "SMESH", "SettingsNodeColor", Qt::red );
525     aDlg->SetColor(3, color);
526
527     color = mgr->colorValue( "SMESH", "SettingsBackFaceColor", Qt::blue );
528     aDlg->SetColor(4, color);
529
530     int iVal = mgr->integerValue( "SMESH", "SettingsWidth", 1 );
531     aDlg->SetIntValue(1, iVal);
532
533     iVal = mgr->integerValue( "SMESH", "SettingsNodesSize", 3 );
534     aDlg->SetIntValue(2, iVal);
535
536     iVal = mgr->integerValue( "SMESH", "SettingsShrinkCoeff", 75 );
537     aDlg->SetIntValue(3, iVal);
538
539     if (aDlg->exec()) {
540       mgr->setValue( "SMESH", "SettingsFillColor", aDlg->GetColor(1) );
541       mgr->setValue( "SMESH", "SettingsOutlineColor", aDlg->GetColor(2) );
542       mgr->setValue( "SMESH", "SettingsNodeColor", aDlg->GetColor(3) );
543       mgr->setValue( "SMESH", "SettingsBackFaceColor", aDlg->GetColor(4) );
544
545       mgr->setValue( "SMESH", "SettingsWidth", aDlg->GetIntValue(1) );
546       mgr->setValue( "SMESH", "SettingsNodesSize", aDlg->GetIntValue(2) );
547       mgr->setValue( "SMESH", "SettingsShrinkCoeff", aDlg->GetIntValue(3) );
548     }
549     
550     delete aDlg;
551   }
552
553   
554   void Control( int theCommandID )
555   {
556     SalomeApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
557     SALOME_ListIO selected;
558     if( aSel )
559       aSel->selectedObjects( selected );
560
561     if( !selected.IsEmpty() ){
562       Handle(SALOME_InteractiveObject) anIO = selected.First();
563       if(!anIO.IsNull()){
564         QString aTitle;
565         SMESH_Actor::eControl aControl = SMESH_Actor::eNone;
566         if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIO->getEntry())){
567           switch ( theCommandID ){
568           case 6001:
569             aTitle = QObject::tr( "LENGTH_EDGES" );
570             aControl = SMESH_Actor::eLength;
571             break;
572           case 6018:
573             aTitle = QObject::tr( "LENGTH2D_EDGES" );
574             aControl = SMESH_Actor::eLength2D;
575             break;
576           case 6002:
577             aTitle = QObject::tr( "FREE_EDGES" );
578             aControl = SMESH_Actor::eFreeEdges;
579             break;
580           case 6003:
581             aTitle = QObject::tr( "FREE_BORDERS" );
582             aControl = SMESH_Actor::eFreeBorders;
583             break;
584           case 6004:
585             aTitle = QObject::tr( "MULTI_BORDERS" );
586             aControl = SMESH_Actor::eMultiConnection;
587             break;
588           case 6019:
589             aTitle = QObject::tr( "MULTI2D_BORDERS" );
590             aControl = SMESH_Actor::eMultiConnection2D;
591             break;
592           case 6011:
593             aTitle = QObject::tr( "AREA_ELEMENTS" );
594             aControl = SMESH_Actor::eArea;
595             break;
596           case 6012:
597             aTitle = QObject::tr( "TAPER_ELEMENTS" );
598             aControl = SMESH_Actor::eTaper;
599             break;
600           case 6013:
601             aTitle = QObject::tr( "ASPECTRATIO_ELEMENTS" );
602             aControl = SMESH_Actor::eAspectRatio;
603             break;
604           case 6017:
605             aTitle = QObject::tr( "ASPECTRATIO_3D_ELEMENTS" );
606             aControl = SMESH_Actor::eAspectRatio3D;
607             break;
608           case 6014:
609             aTitle = QObject::tr( "MINIMUMANGLE_ELEMENTS" );
610             aControl = SMESH_Actor::eMinimumAngle;
611             break;
612           case 6015:
613             aTitle = QObject::tr( "WARP_ELEMENTS" );
614             aControl = SMESH_Actor::eWarping;
615             break;
616           case 6016:
617             aTitle = QObject::tr( "SKEW_ELEMENTS" );
618             aControl = SMESH_Actor::eSkew;
619             break;
620           }
621           anActor->SetControlMode(aControl);
622           anActor->GetScalarBarActor()->SetTitle(aTitle.latin1());
623         }
624       }
625     }
626   }
627
628
629   bool CheckOIType(const Handle(SALOME_InteractiveObject) & theIO,
630                    MeshObjectType                           theType,
631                    const QString                            theInTypeName,
632                    QString &                                theOutTypeName)
633   {
634     SMESH_TypeFilter aTypeFilter( theType );
635     QString entry;
636     if( !theIO.IsNull() )
637     {
638       entry = theIO->getEntry();
639       SalomeApp_DataOwner owner( entry );
640       if ( aTypeFilter.isOk( &owner )) {
641         theOutTypeName = theInTypeName;
642         return true;
643       }
644     }
645     return false;
646   }
647
648
649   QString CheckTypeObject(const Handle(SALOME_InteractiveObject) & theIO)
650   {
651     _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
652     _PTR(SObject) aSObj = aStudy->FindObjectID(theIO->getEntry());
653     if (aSObj) {
654       _PTR(SComponent) aSComp = aSObj->GetFatherComponent();
655       CORBA::String_var anID = aSComp->GetID().c_str();
656       if (!strcmp(anID.in(),theIO->getEntry()))
657         return "Component";
658     }
659
660     QString aTypeName;
661     if (
662         CheckOIType ( theIO, HYPOTHESIS,    "Hypothesis", aTypeName ) ||
663         CheckOIType ( theIO, ALGORITHM,     "Algorithm",  aTypeName ) ||
664         CheckOIType ( theIO, MESH,          "Mesh",       aTypeName ) ||
665         CheckOIType ( theIO, SUBMESH,       "SubMesh",    aTypeName ) ||
666         CheckOIType ( theIO, GROUP,         "Group",      aTypeName )
667         )
668       return aTypeName;
669
670     return "NoType";
671   }
672
673
674   QString CheckHomogeneousSelection()
675   {
676     //SUIT_Study* aStudy = SMESH::GetActiveStudy();
677     SalomeApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
678     SALOME_ListIO selected;
679     if( aSel )
680       aSel->selectedObjects( selected );
681
682     QString RefType = CheckTypeObject(selected.First());
683     SALOME_ListIteratorOfListIO It(selected);
684     for (; It.More(); It.Next())
685       {
686         Handle(SALOME_InteractiveObject) IObject = It.Value();
687         QString Type = CheckTypeObject(IObject);
688         if (Type.compare(RefType) != 0)
689           return "Heterogeneous Selection";
690       }
691
692     return RefType;
693   }
694
695   void OnEditDelete()
696   {
697     // VSR 17/11/04: check if all objects selected belong to SMESH component --> start
698     SalomeApp_SelectionMgr* aSel = SMESHGUI::selectionMgr();
699     SALOME_ListIO selected; aSel->selectedObjects( selected );
700
701     QString aParentComponent = QString::null;
702     for( SALOME_ListIteratorOfListIO anIt( selected ); anIt.More(); anIt.Next() )
703     {
704       QString cur = anIt.Value()->getComponentDataType();
705       if( aParentComponent.isNull() )
706         aParentComponent = cur;
707       else if( !aParentComponent.isEmpty() && aParentComponent!=cur )
708         aParentComponent = "";
709     }
710
711     if ( aParentComponent != SMESHGUI::GetSMESHGUI()->name() )  {
712       SUIT_MessageBox::warn1 ( SMESHGUI::desktop(),
713                               QObject::tr("ERR_ERROR"),
714                               QObject::tr("NON_SMESH_OBJECTS_SELECTED").arg( SMESHGUI::GetSMESHGUI()->moduleName() ),
715                               QObject::tr("BUT_OK") );
716       return;
717     }
718     // VSR 17/11/04: check if all objects selected belong to SMESH component <-- finish
719     if (SUIT_MessageBox::warn2
720         (SMESHGUI::desktop(),
721          QObject::tr("SMESH_WRN_WARNING"),
722          QObject::tr("SMESH_REALLY_DELETE"),
723          QObject::tr("SMESH_BUT_YES"), QObject::tr("SMESH_BUT_NO"), 1, 0, 0) != 1)
724       return;
725
726     SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() );
727     SUIT_ViewManager* vm = anApp->activeViewManager();
728     int nbSf = vm->getViewsCount();
729
730     _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
731     _PTR(StudyBuilder) aStudyBuilder = aStudy->NewBuilder();
732     _PTR(GenericAttribute) anAttr;
733     _PTR(AttributeIOR) anIOR;
734
735     SALOME_ListIteratorOfListIO It(selected);
736
737     aStudyBuilder->NewCommand();  // There is a transaction
738     for(; It.More(); It.Next()){
739       Handle(SALOME_InteractiveObject) IObject = It.Value();
740       if(IObject->hasEntry()){
741         _PTR(SObject) SO = aStudy->FindObjectID(IObject->getEntry());
742
743         /* Erase child graphical objects */
744         _PTR(ChildIterator) it = aStudy->NewChildIterator(SO);
745         for(it->InitEx(true); it->More(); it->Next()){
746           _PTR(SObject) CSO = it->Value();
747           if(CSO->FindAttribute(anAttr, "AttributeIOR")){
748             anIOR = anAttr;
749
750             QPtrVector<SUIT_ViewWindow> aViews = vm->getViews();
751             for(int i = 0; i < nbSf; i++){
752               SUIT_ViewWindow *sf = aViews[i];
753               CORBA::String_var anEntry = CSO->GetID().c_str();
754               if(SMESH_Actor* anActor = SMESH::FindActorByEntry(sf,anEntry.in())){
755                 SMESH::RemoveActor(sf,anActor);
756               }
757             }
758           }
759         }
760
761         /* Erase main graphical object */
762         QPtrVector<SUIT_ViewWindow> aViews = vm->getViews();
763         for(int i = 0; i < nbSf; i++){
764           SUIT_ViewWindow *sf = aViews[i];
765           if(SMESH_Actor* anActor = SMESH::FindActorByEntry(sf,IObject->getEntry())){
766             SMESH::RemoveActor(sf,anActor);
767           }
768         }
769
770         // Remove object(s) from data structures
771         _PTR(SObject) obj = aStudy->FindObjectID(IObject->getEntry());
772         if(obj){
773           SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( SMESH::SObjectToObject( obj ) );
774           SMESH::SMESH_subMesh_var   aSubMesh = SMESH::SMESH_subMesh::_narrow( SMESH::SObjectToObject( obj ) );
775
776           if ( !aGroup->_is_nil() ) {                          // DELETE GROUP
777             SMESH::SMESH_Mesh_var aMesh = aGroup->GetMesh();
778             aMesh->RemoveGroup( aGroup );
779           }
780           else if ( !aSubMesh->_is_nil() ) {                   // DELETE SUBMESH
781             SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather();
782             aMesh->RemoveSubMesh( aSubMesh );
783           }
784           else {// default action: remove SObject from the study
785             // san - it's no use opening a transaction here until UNDO/REDO is provided in SMESH
786             //SUIT_Operation *op = new SALOMEGUI_ImportOperation(myActiveStudy);
787             //op->start();
788             aStudyBuilder->RemoveObjectWithChildren( obj );
789             //op->finish();
790           }
791         }
792
793       } /* IObject->hasEntry() */
794     } /* more/next */
795     aStudyBuilder->CommitCommand();
796
797     /* Clear any previous selection */
798     SALOME_ListIO l1;
799     aSel->setSelectedObjects( l1 );
800
801     SMESHGUI::GetSMESHGUI()->updateObjBrowser();
802   }
803 }
804
805 //=============================================================================
806 /*!
807  *
808  */
809 //=============================================================================
810 class CustomItem : public QCustomMenuItem
811 {
812 public:
813   CustomItem(const QString& s, const QFont& f) : myString(s), myFont(f) {}
814   ~CustomItem() {}
815
816   void paint(QPainter* p, const QColorGroup& cg, bool act, bool /*enabled*/, int x, int y, int w, int h)
817   {
818     p->save();
819     p->fillRect( x, y, w, h, act ? cg.highlight() : cg.mid() );
820     p->setPen( act ? cg.highlightedText() : cg.buttonText() );
821     p->setFont( myFont );
822     p->drawText( x, y, w, h, AlignHCenter | AlignVCenter | ShowPrefix | DontClip | SingleLine, myString );
823     p->restore();
824   }
825
826   QSize sizeHint()
827   {
828     return QFontMetrics( myFont ).size( AlignHCenter | AlignVCenter | ShowPrefix | DontClip | SingleLine, myString );
829   }
830
831   bool fullSpan() const
832   {
833     return true;
834   }
835
836 private:
837   QString myString;
838   QFont   myFont;
839 };
840
841 extern "C" {
842   Standard_EXPORT CAM_Module* createModule()
843   {
844     return SMESHGUI::GetSMESHGUI();
845   }
846 }
847
848 SMESH::SMESH_Gen_var SMESHGUI::myComponentSMESH = SMESH::SMESH_Gen::_nil();
849
850 //=============================================================================
851 /*!
852  *
853  */
854 //=============================================================================
855 SMESHGUI::SMESHGUI() :
856   SalomeApp_Module( "SMESH" )
857 {
858   if ( CORBA::is_nil( myComponentSMESH ) )
859   {
860     SALOME_LifeCycleCORBA* ls = new SALOME_LifeCycleCORBA( getApp()->namingService() );
861     Engines::Component_var comp = ls->FindOrLoad_Component( "FactoryServer", "SMESH" );
862     myComponentSMESH = SMESH::SMESH_Gen::_narrow( comp );
863   }
864
865   myActiveDialogBox = 0 ;
866   myState = -1 ;
867
868   SMESH::GetFilterManager();
869   SMESH::GetPattern();
870   
871   /* load resources for all available meshers */
872   SMESH::InitAvailableHypotheses();
873 }
874
875 //=============================================================================
876 /*!
877  *
878  */
879 //=============================================================================
880 SMESHGUI::~SMESHGUI()
881 {
882   SMESH::GetFilterManager()->Destroy();
883 }
884
885 //=============================================================================
886 /*!
887  *
888  */
889 //=============================================================================
890 SalomeApp_SelectionMgr* SMESHGUI::selectionMgr()
891 {
892   SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() );
893   if( anApp )
894     return dynamic_cast<SalomeApp_SelectionMgr*>( anApp->selectionMgr() );
895   else
896     return 0;
897 }
898
899 //=============================================================================
900 /*!
901  *
902  */
903 //=============================================================================
904 SUIT_ResourceMgr* SMESHGUI::resourceMgr()
905 {
906   return dynamic_cast<SUIT_ResourceMgr*>( SUIT_Session::session()->resourceMgr() );
907 }
908
909 //=============================================================================
910 /*!
911  *
912  */
913 //=============================================================================
914 SMESHGUI* SMESHGUI::GetSMESHGUI()
915 {
916   static SMESHGUI* aSMESHGUI = NULL;
917   if( !aSMESHGUI )
918     aSMESHGUI = new SMESHGUI();
919
920   if(_PTR(Study) aStudy = SMESH::GetActiveStudyDocument())
921     GetSMESHGen()->SetCurrentStudy( _CAST(Study,aStudy)->GetStudy() );
922
923   SUIT_ResourceMgr* mgr = resourceMgr();
924   if( mgr )
925   /* Automatic Update flag */
926     aSMESHGUI->myAutomaticUpdate = ( mgr->stringValue( "SMESH", "AutomaticUpdate" ).compare( "true" ) == 0 );
927
928   return aSMESHGUI;
929 }
930
931 extern "C"
932 {
933   Standard_EXPORT SMESHGUI* GetComponentGUI() {
934     return SMESHGUI::GetSMESHGUI();
935   }
936 }
937
938 //=============================================================================
939 /*!
940  *
941  */
942 //=============================================================================
943 void SMESHGUI::SetState(int aState)
944 {
945   myState = aState;
946 }
947
948 //=============================================================================
949 /*!
950  *
951  */
952 //=============================================================================
953 void SMESHGUI::ResetState()
954 {
955   myState = -1;
956 }
957
958 //=============================================================================
959 /*!
960  *
961  */
962 //=============================================================================
963 void SMESHGUI::EmitSignalDeactivateDialog()
964 {
965   emit SignalDeactivateActiveDialog();
966 }
967
968 //=============================================================================
969 /*!
970  *
971  */
972 //=============================================================================
973 void SMESHGUI::EmitSignalStudyFrameChanged()
974 {
975   emit SignalStudyFrameChanged();
976 }
977
978 //=============================================================================
979 /*!
980  *
981  */
982 //=============================================================================
983 void SMESHGUI::EmitSignalCloseAllDialogs()
984 {
985   emit SignalCloseAllDialogs();
986 }
987
988 //=============================================================================
989 /*!
990  *
991  */
992 //=============================================================================
993 QDialog *SMESHGUI::GetActiveDialogBox()
994 {
995   return myActiveDialogBox;
996 }
997
998 //=============================================================================
999 /*!
1000  *
1001  */
1002 //=============================================================================
1003 void SMESHGUI::SetActiveDialogBox(QDialog * aDlg)
1004 {
1005   myActiveDialogBox = (QDialog *) aDlg;
1006   return;
1007 }
1008
1009 //=============================================================================
1010 /*!
1011  *
1012  */
1013 //=============================================================================
1014 SUIT_Desktop* SMESHGUI::desktop()
1015 {
1016   SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() );
1017   if( app )
1018     return app->desktop();
1019   else
1020     return 0;
1021 }
1022
1023 //=============================================================================
1024 /*!
1025  *
1026  */
1027 //=============================================================================
1028 SalomeApp_Study* SMESHGUI::activeStudy()
1029 {
1030   SUIT_Application* app = SUIT_Session::session()->activeApplication();
1031   if( app )
1032     return dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
1033   else
1034     return NULL;
1035 }
1036
1037 //=============================================================================
1038 /*!
1039  *
1040  */
1041 //=============================================================================
1042 bool SMESHGUI::DefineDlgPosition(QWidget * aDlg, int &x, int &y)
1043 {
1044   /* Here the position is on the bottom right corner - 10 */
1045   // aDlg->resize(QSize().expandedTo(aDlg->minimumSizeHint()));
1046   aDlg->adjustSize();
1047   SUIT_Desktop *PP = desktop();
1048   x = abs(PP->x() + PP->size().width() - aDlg->size().width() - 10);
1049   y = abs(PP->y() + PP->size().height() - aDlg->size().height() - 10);
1050   return true;
1051 }
1052
1053 //=============================================================================
1054 /*!
1055  *
1056  */
1057 //=============================================================================
1058 static int isStudyLocked(_PTR(Study) theStudy){
1059   return theStudy->GetProperties()->IsLocked();
1060 }
1061
1062 static bool checkLock(_PTR(Study) theStudy) {
1063   if (isStudyLocked(theStudy)) {
1064     SUIT_MessageBox::warn1 ( SMESHGUI::desktop(),
1065                            QObject::tr("WRN_WARNING"),
1066                            QObject::tr("WRN_STUDY_LOCKED"),
1067                            QObject::tr("BUT_OK") );
1068     return true;
1069   }
1070   return false;
1071 }
1072
1073 //=======================================================================
1074 //function : CheckActiveStudyLocked
1075 //purpose  :
1076 //=======================================================================
1077
1078 bool SMESHGUI::isActiveStudyLocked()
1079 {
1080   _PTR(Study) aStudy = activeStudy()->studyDS();
1081   return checkLock( aStudy );
1082 }
1083
1084 //=============================================================================
1085 /*!
1086  *
1087  */
1088 //=============================================================================
1089 bool SMESHGUI::OnGUIEvent( int theCommandID )
1090 {
1091   SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( application() );
1092   if( !anApp )
1093     return false;
1094
1095   _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); //Document OCAF de l'etude active
1096   SUIT_ResourceMgr* mgr = resourceMgr();
1097   if( !mgr )
1098     return false;
1099
1100   SUIT_ViewWindow* view = application()->desktop()->activeWindow();
1101   SVTK_ViewWindow* vtkwnd = dynamic_cast<SVTK_ViewWindow*>( view );
1102
1103   QAction* act = action( theCommandID );
1104
1105   switch (theCommandID) {
1106   case 33:                                      // DELETE
1107     if(checkLock(aStudy)) break;
1108     ::OnEditDelete();
1109     break;
1110
1111   case 113:                                     // IMPORT
1112   case 112:
1113   case 111:
1114     {
1115       if(checkLock(aStudy)) break;
1116       ::ImportMeshesFromFile(GetSMESHGen(),theCommandID);
1117       break;
1118     }
1119
1120   case 122:                                     // EXPORT MED
1121   case 121:
1122   case 123:
1123   case 124:
1124   case 125:
1125   case 126:
1126     {
1127       ::ExportMeshToFile(theCommandID);
1128       break;
1129     }
1130
1131   case 200:                                     // SCALAR BAR
1132     {
1133       SalomeApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1134       SALOME_ListIO selected;
1135       if( aSel )
1136         aSel->selectedObjects( selected );
1137
1138       if( selected.Extent() ) {
1139         Handle(SALOME_InteractiveObject) anIO = selected.First();
1140         if( anIO->hasEntry() ) {
1141           if( SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() ) ) {
1142             anActor->SetControlMode( SMESH_Actor::eNone );
1143           }
1144         }
1145       }
1146       break;
1147     }
1148   case 201:
1149     {
1150       SMESHGUI_Preferences_ScalarBarDlg::ScalarBarProperties( this );
1151       break;
1152     }
1153
1154   case 1134: // Clipping
1155   case 1133: // Tranparency
1156   case 1132: // Colors / Size
1157
1158     // Display Mode
1159   case 215: // Nodes
1160   case 213: // Nodes
1161   case 212: // Nodes
1162   case 211: // Nodes
1163     ::SetDisplayMode(theCommandID);
1164   break;
1165
1166     // Display Entity
1167   case 217: // Edges
1168   case 218: // Faces
1169   case 219: // Volumes
1170   case 220: // All Entity
1171     ::SetDisplayEntity(theCommandID);
1172   break;
1173
1174   case 214:                                     // UPDATE
1175     {
1176       if(checkLock(aStudy)) break;
1177       SMESH::UpdateView();
1178
1179       SALOME_ListIO l;
1180       SalomeApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1181       aSel->setSelectedObjects( l );
1182       break;
1183     }
1184
1185   case 300:                                     // ERASE
1186   case 301:                                     // DISPLAY
1187   case 302:                                     // DISPLAY ONLY
1188     {
1189       SMESH::EDisplaing anAction;
1190       switch(theCommandID){
1191       case 300: anAction = SMESH::eErase; break;
1192       case 301: anAction = SMESH::eDisplay; break;
1193       case 302: anAction = SMESH::eDisplayOnly; break;
1194       }
1195
1196       SalomeApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1197       SALOME_ListIO selected;
1198       if( aSel )
1199         aSel->selectedObjects( selected );
1200
1201       if ( vtkwnd ) {
1202         SALOME_ListIteratorOfListIO It(selected);
1203         for (; It.More(); It.Next()) {
1204           Handle(SALOME_InteractiveObject) IOS = It.Value();
1205           if (IOS->hasEntry()) {
1206             SMESH::UpdateView(anAction,IOS->getEntry());
1207           }
1208         }
1209       }
1210       SALOME_ListIO l1;
1211       aSel->setSelectedObjects( l1 );
1212       break;
1213     }
1214
1215   case 400:                                     // NODES
1216     {
1217       if(checkLock(aStudy)) break;
1218
1219       if ( vtkwnd ) {
1220         EmitSignalDeactivateDialog();
1221
1222         new SMESHGUI_NodesDlg(this);
1223       }
1224       else {
1225         SUIT_MessageBox::warn1(desktop(),
1226                               tr("SMESH_WRN_WARNING"), 
1227                               tr("SMESH_WRN_VIEWER_VTK"),
1228                               tr("SMESH_BUT_OK"));
1229       }
1230       break;
1231     }
1232
1233   case 2151:  // FILTER
1234   {
1235     if ( vtkwnd )
1236     {
1237       EmitSignalDeactivateDialog();
1238       new SMESHGUI_FilterDlg( this, SMESH::EDGE );
1239     }
1240     break;
1241   }
1242
1243   case 406:                                     // MOVE NODE
1244     {
1245       if ( !vtkwnd )
1246       {
1247         SUIT_MessageBox::warn1( desktop(), tr( "SMESH_WRN_WARNING" ),
1248           tr( "NOT_A_VTK_VIEWER" ),tr( "SMESH_BUT_OK" ) );
1249         break;
1250       }
1251
1252       if(checkLock(aStudy)) break;
1253       new SMESHGUI_MoveNodesDlg(this);
1254       break;
1255     }
1256
1257   case 701:                                     // COMPUTE MESH
1258     {
1259       if(checkLock(aStudy)) break;
1260       if ( vtkwnd ) {
1261         SalomeApp_SelectionMgr *Sel = selectionMgr();
1262         SALOME_ListIO selected; Sel->selectedObjects( selected );
1263
1264         int nbSel = selected.Extent();
1265         if (nbSel != 1){
1266           break;
1267         }
1268
1269         SMESH::SMESH_Mesh_var aMesh;
1270         SMESH::SMESH_subMesh_var aSubMesh;
1271         Handle(SALOME_InteractiveObject) IObject = selected.First();
1272         if (IObject->hasEntry()){
1273           _PTR(SObject) aMeshSObj = aStudy->FindObjectID(IObject->getEntry());
1274           GEOM::GEOM_Object_var aShapeObject = SMESH::GetShapeOnMeshOrSubMesh( aMeshSObj );
1275           if ( aShapeObject->_is_nil() ) {
1276             // imported mesh
1277             break;
1278           }
1279           if( aMeshSObj ) {
1280             SMESH::SMESH_Mesh_var aMesh = SMESH::SObjectToInterface<SMESH::SMESH_Mesh>(aMeshSObj);
1281             SMESH::SMESH_subMesh_var aSubMesh = SMESH::SObjectToInterface<SMESH::SMESH_subMesh>(aMeshSObj);
1282
1283             if (!aMesh->_is_nil()){
1284               GEOM::GEOM_Object_var refShapeObject = SMESH::GetShapeOnMeshOrSubMesh(aMeshSObj);
1285               if (!refShapeObject->_is_nil()) {
1286                 if(!GetSMESHGen()->IsReadyToCompute(aMesh,refShapeObject)){
1287                   SUIT_MessageBox::warn1(desktop(),
1288                                         tr("SMESH_WRN_WARNING"),
1289                                         tr("SMESH_WRN_MISSING_PARAMETERS"),
1290                                         tr("SMESH_BUT_OK"));
1291                   break;
1292                 }
1293                 try{
1294                   if (GetSMESHGen()->Compute(aMesh,refShapeObject))
1295                     SMESH::ModifiedMesh(aMeshSObj,true);
1296                   // TO Do : change icon of all submeshes
1297                   else
1298                     SUIT_MessageBox::warn1(desktop(), 
1299                                           tr("SMESH_WRN_WARNING"),
1300                                           tr("SMESH_WRN_COMPUTE_FAILED"),
1301                                           tr("SMESH_BUT_OK"));
1302                 }
1303                 catch(const SALOME::SALOME_Exception & S_ex){
1304                   SalomeApp_Tools::QtCatchCorbaException(S_ex);
1305                 }
1306               }
1307             }else if(!aSubMesh->_is_nil()){
1308               aMesh = aSubMesh->GetFather();
1309               GEOM::GEOM_Object_var refShapeObject = SMESH::GetShapeOnMeshOrSubMesh(aMeshSObj);
1310               if(!refShapeObject->_is_nil()){
1311                 bool compute = GetSMESHGen()->IsReadyToCompute(aMesh,refShapeObject);
1312                 if(!compute){
1313                   SUIT_MessageBox::warn1(desktop(), 
1314                                         tr("SMESH_WRN_WARNING"),
1315                                         tr("SMESH_WRN_MISSING_PARAMETERS"),
1316                                         tr("SMESH_BUT_OK"));
1317                   break;
1318                 }
1319                 try{
1320                   if ( GetSMESHGen()->Compute(aMesh,refShapeObject) )
1321                     SMESH::ModifiedMesh(aMeshSObj,true);
1322                   // TO Do : change icon of all submeshes
1323                   else
1324                     SUIT_MessageBox::warn1(desktop(),
1325                                           tr("SMESH_WRN_WARNING"),
1326                                           tr("SMESH_WRN_COMPUTE_FAILED"),
1327                                           tr("SMESH_BUT_OK"));
1328                 }catch(const SALOME::SALOME_Exception & S_ex){
1329                   SalomeApp_Tools::QtCatchCorbaException(S_ex);
1330                 }
1331               }
1332             }
1333           }
1334         }
1335         CORBA::Long anId = aStudy->StudyId();
1336         TVisualObjPtr aVisualObj = SMESH::GetVisualObj(anId,IObject->getEntry());
1337         cout<<"myAutomaticUpdate - "<<myAutomaticUpdate<<endl;
1338         if(myAutomaticUpdate && aVisualObj){
1339           aVisualObj->Update();
1340           SMESH_Actor* anActor = SMESH::FindActorByEntry(IObject->getEntry());
1341           if(!anActor){
1342             anActor = SMESH::CreateActor(aStudy,IObject->getEntry());
1343             if(anActor){
1344               SMESH::DisplayActor(view,anActor); //apo
1345               SMESH::FitAll();
1346             }
1347           }
1348         }
1349       }else{
1350         SUIT_MessageBox::warn1(desktop(),
1351                               tr("SMESH_WRN_WARNING"), 
1352                               tr("SMESH_WRN_VIEWER_VTK"),
1353                               tr("SMESH_BUT_OK"));
1354       }
1355       break;
1356     }
1357
1358   case 702:                                     // ADD SUB MESH
1359     {
1360       if(checkLock(aStudy)) break;
1361       if( vtkwnd ) {
1362         EmitSignalDeactivateDialog();
1363         new SMESHGUI_AddSubMeshDlg( this );
1364       }
1365       else {
1366         SUIT_MessageBox::warn1(desktop(),
1367                               tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
1368                               tr("SMESH_BUT_OK"));
1369       }
1370       break;
1371     }
1372
1373   case 703:                                     // INIT MESH
1374     {
1375       if(checkLock(aStudy)) break;
1376       EmitSignalDeactivateDialog();
1377       new SMESHGUI_InitMeshDlg( this );
1378       break;
1379     }
1380
1381   case 704:                                     // EDIT Hypothesis 
1382     {
1383       if(checkLock(aStudy)) break;
1384       EmitSignalDeactivateDialog();
1385       new SMESHGUI_EditHypothesesDlg( this );
1386       break;
1387     }
1388
1389   case 705:                                     //  EDIT Global Hypothesis
1390     {
1391       if(checkLock(aStudy)) break;
1392       EmitSignalDeactivateDialog();
1393       new SMESHGUI_EditHypothesesDlg( this );
1394       break;
1395     }
1396
1397   case 706:                                     //  EDIT Local Hypothesis
1398     {
1399       if(checkLock(aStudy)) break;
1400       EmitSignalDeactivateDialog();
1401       new SMESHGUI_EditHypothesesDlg( this );
1402       break;
1403     }
1404
1405   case 407: // DIAGONAL INVERSION
1406   case 408: // Delete diagonal
1407     {
1408       if ( !vtkwnd )
1409       {
1410         SUIT_MessageBox::warn1( desktop(), tr( "SMESH_WRN_WARNING" ),
1411           tr( "NOT_A_VTK_VIEWER" ),tr( "SMESH_BUT_OK" ) );
1412         break;
1413       }
1414
1415       if ( checkLock( aStudy ) )
1416         break;
1417
1418       /*Standard_Boolean aRes;
1419       SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IObject);
1420       if ( aMesh->_is_nil() )
1421       {
1422         SUIT_MessageBox::warn1(GetDesktop(), tr( "SMESH_WRN_WARNING" ),
1423           tr( "SMESH_BAD_SELECTION" ), tr( "SMESH_BUT_OK" ) );
1424         break;
1425       }
1426       */
1427       EmitSignalDeactivateDialog();
1428       if ( theCommandID == 407 )
1429         new SMESHGUI_TrianglesInversionDlg(this);
1430       else
1431         new SMESHGUI_UnionOfTwoTrianglesDlg(this);
1432       break;
1433     }
1434     case 409: // Change orientation
1435     case 410: // Union of triangles
1436     case 411: // Cutting of quadrangles
1437     {
1438       if ( !vtkwnd )
1439       {
1440         SUIT_MessageBox::warn1( desktop(), tr( "SMESH_WRN_WARNING" ),
1441           tr( "NOT_A_VTK_VIEWER" ),tr( "SMESH_BUT_OK" ) );
1442         break;
1443       }
1444
1445       if ( checkLock( aStudy ) )
1446         break;
1447
1448       EmitSignalDeactivateDialog();
1449       SMESHGUI_MultiEditDlg* aDlg = NULL;
1450       if ( theCommandID == 409 )
1451         aDlg = new SMESHGUI_ChangeOrientationDlg(this);
1452       else if ( theCommandID == 410 )
1453         aDlg = new SMESHGUI_UnionOfTrianglesDlg(this);
1454       else
1455         aDlg = new SMESHGUI_CuttingOfQuadsDlg(this);
1456
1457       int x, y ;
1458       DefineDlgPosition( aDlg, x, y );
1459       aDlg->move( x, y );
1460       aDlg->show();
1461       break;
1462     }
1463   case 412: // Smoothing
1464     {
1465       if(checkLock(aStudy)) break;
1466       if( vtkwnd ) {
1467         EmitSignalDeactivateDialog();
1468         new SMESHGUI_SmoothingDlg( this );
1469       }
1470       else {
1471         SUIT_MessageBox::warn1(desktop(),
1472                               tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
1473                               tr("SMESH_BUT_OK"));
1474       }
1475       break;
1476     }
1477   case 413: // Extrusion
1478     {
1479       if (checkLock(aStudy)) break;
1480       if (vtkwnd) {
1481         EmitSignalDeactivateDialog();
1482         new SMESHGUI_ExtrusionDlg ( this );
1483       } else {
1484         SUIT_MessageBox::warn1(desktop(),
1485                                tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
1486                                tr("SMESH_BUT_OK"));
1487       }
1488       break;
1489     }
1490   case 414: // Revolution
1491     {
1492       if(checkLock(aStudy)) break;
1493       if( vtkwnd ) {
1494         EmitSignalDeactivateDialog();
1495         new SMESHGUI_RevolutionDlg( this );
1496       }
1497       else {
1498         SUIT_MessageBox::warn1(desktop(),
1499                               tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
1500                               tr("SMESH_BUT_OK"));
1501       }
1502       break;
1503     }
1504   case 415: // Pattern mapping
1505     {
1506       if ( checkLock( aStudy ) )
1507         break;
1508       if ( vtkwnd )
1509       {
1510         EmitSignalDeactivateDialog();
1511         new SMESHGUI_MeshPatternDlg( this );
1512       }
1513       else {
1514         SUIT_MessageBox::warn1(desktop(),
1515                               tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
1516                               tr("SMESH_BUT_OK"));
1517       }
1518       break;
1519     }
1520   case 416: // Extrusion along a path
1521     {
1522       if (checkLock(aStudy)) break;
1523       if (vtkwnd) {
1524         EmitSignalDeactivateDialog();
1525         new SMESHGUI_ExtrusionAlongPathDlg( this );
1526       } else {
1527         SUIT_MessageBox::warn1(desktop(),
1528                                tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
1529                                tr("SMESH_BUT_OK"));
1530       }
1531       break;
1532     }
1533   case 801:                                     // CREATE GROUP
1534     {
1535       if ( !vtkwnd )
1536       {
1537         SUIT_MessageBox::warn1( desktop(), tr( "SMESH_WRN_WARNING" ),
1538           tr( "NOT_A_VTK_VIEWER" ),tr( "SMESH_BUT_OK" ) );
1539         break;
1540       }
1541
1542       if(checkLock(aStudy)) break;
1543       EmitSignalDeactivateDialog();
1544       SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_nil();
1545
1546       SalomeApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1547       SALOME_ListIO selected;
1548       if( aSel )
1549         aSel->selectedObjects( selected );
1550
1551       int nbSel = selected.Extent();
1552       if (nbSel == 1) {
1553         // check if mesh is selected
1554         aMesh = SMESH::GetMeshByIO( selected.First() );
1555       }
1556       SMESHGUI_GroupDlg *aDlg = new SMESHGUI_GroupDlg( this, "", aMesh);
1557       aDlg->show();
1558       break;
1559     }
1560
1561   case 802:                                     // CONSTRUCT GROUP
1562     {
1563       if ( !vtkwnd )
1564       {
1565         SUIT_MessageBox::warn1( desktop(), tr( "SMESH_WRN_WARNING" ),
1566           tr( "NOT_A_VTK_VIEWER" ),tr( "SMESH_BUT_OK" ) );
1567         break;
1568       }
1569
1570       if(checkLock(aStudy)) break;
1571       EmitSignalDeactivateDialog();
1572
1573       SalomeApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1574       SALOME_ListIO selected;
1575       if( aSel )
1576         aSel->selectedObjects( selected );
1577
1578       int nbSel = selected.Extent();
1579       if (nbSel == 1) {
1580         // check if submesh is selected
1581         Handle(SALOME_InteractiveObject) IObject = selected.First();
1582         if (IObject->hasEntry()) {
1583           _PTR(SObject) aSObj = aStudy->FindObjectID(IObject->getEntry());
1584           if( aSObj ) {
1585             SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( SMESH::SObjectToObject( aSObj ) );
1586             if (!aSubMesh->_is_nil()) {
1587               try {
1588                 SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather();
1589                 // get submesh elements list by types
1590                 SMESH::long_array_var aNodes = aSubMesh->GetElementsByType(SMESH::NODE);
1591                 SMESH::long_array_var aEdges = aSubMesh->GetElementsByType(SMESH::EDGE);
1592                 SMESH::long_array_var aFaces = aSubMesh->GetElementsByType(SMESH::FACE);
1593                 SMESH::long_array_var aVolumes = aSubMesh->GetElementsByType(SMESH::VOLUME);
1594                 // create group for each type o elements
1595                 QString aName = IObject->getName();
1596                 if (aNodes->length() > 0) {
1597                   SMESH::SMESH_Group_var aGroup = SMESH::AddGroup(aMesh, SMESH::NODE, aName + "_Nodes");
1598                   aGroup->Add(aNodes.inout());
1599                 }
1600                 if (aEdges->length() > 0) {
1601                   SMESH::SMESH_Group_var aGroup = SMESH::AddGroup(aMesh, SMESH::EDGE, aName + "_Edges");
1602                   aGroup->Add(aEdges.inout());
1603                 }
1604                 if (aFaces->length() > 0) {
1605                   SMESH::SMESH_Group_var aGroup = SMESH::AddGroup(aMesh, SMESH::FACE, aName + "_Faces");
1606                   aGroup->Add(aFaces.inout());
1607                 }
1608                 if (aVolumes->length() > 0) {
1609                   SMESH::SMESH_Group_var aGroup = SMESH::AddGroup(aMesh, SMESH::VOLUME, aName + "_Volumes");
1610                   aGroup->Add(aVolumes.inout());
1611                 }
1612                 updateObjBrowser();
1613                 
1614               }catch(const SALOME::SALOME_Exception & S_ex){
1615                 SalomeApp_Tools::QtCatchCorbaException(S_ex);
1616               }
1617             }
1618           }
1619         }
1620       }
1621       break;
1622     }
1623
1624   case 803:                                     // EDIT GROUP
1625     {
1626       if(checkLock(aStudy)) break;
1627       EmitSignalDeactivateDialog();
1628
1629       SalomeApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1630       SALOME_ListIO selected;
1631       if( aSel )
1632         aSel->selectedObjects( selected );
1633
1634       SALOME_ListIteratorOfListIO It (selected);
1635       int nbSelectedGroups = 0;
1636       for ( ; It.More(); It.Next() )
1637       {
1638         SMESH::SMESH_Group_var aGroup =
1639           SMESH::IObjectToInterface<SMESH::SMESH_Group>(It.Value());
1640         if (!aGroup->_is_nil()) {
1641           nbSelectedGroups++;
1642           SMESHGUI_GroupDlg *aDlg = new SMESHGUI_GroupDlg( this, "", aGroup);
1643           aDlg->show();
1644         }
1645       }
1646       if (nbSelectedGroups == 0)
1647         {
1648           SMESHGUI_GroupDlg *aDlg = new SMESHGUI_GroupDlg( this, "", SMESH::SMESH_Group::_nil());
1649           aDlg->show();
1650         }
1651       break;
1652     }
1653
1654   case 804:                                     // Add elements to group
1655     {
1656       if(checkLock(aStudy)) break;
1657       if (myState == 800) {
1658         SMESHGUI_GroupDlg *aDlg = (SMESHGUI_GroupDlg*) myActiveDialogBox;
1659         if (aDlg) aDlg->onAdd();
1660       }
1661       break;
1662     }
1663
1664   case 805:                                     // Remove elements from group
1665     {
1666       if(checkLock(aStudy)) break;
1667       if (myState == 800) {
1668         SMESHGUI_GroupDlg *aDlg = (SMESHGUI_GroupDlg*) myActiveDialogBox;
1669         if (aDlg) aDlg->onRemove();
1670       }
1671       break;
1672     }
1673
1674     case 810: // Union Groups
1675     case 811: // Intersect groups
1676     case 812: // Cut groups
1677     {
1678       if ( checkLock( aStudy ) )
1679         break;
1680
1681       EmitSignalDeactivateDialog();
1682
1683       int aMode;
1684       if      ( theCommandID == 810 ) aMode = SMESHGUI_GroupOpDlg::UNION;
1685       else if ( theCommandID == 811 ) aMode = SMESHGUI_GroupOpDlg::INTERSECT;
1686       else                            aMode = SMESHGUI_GroupOpDlg::CUT;
1687
1688       ( new SMESHGUI_GroupOpDlg( this, aMode ) )->show();
1689       break;
1690     }
1691
1692     case 813: // Delete groups with their contents
1693     {
1694       if ( checkLock( aStudy ) )
1695         break;
1696
1697       EmitSignalDeactivateDialog();
1698
1699       new SMESHGUI_DeleteGroupDlg( this );
1700       break;
1701     }
1702
1703   case 900:                                     // MESH INFOS
1704     {
1705       EmitSignalDeactivateDialog();
1706       SalomeApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1707       SALOME_ListIO selected;
1708       if( aSel )
1709         aSel->selectedObjects( selected );
1710
1711       if ( selected.Extent() > 1 ) { // a dlg for each IO
1712         SALOME_ListIO IOs;
1713         SALOME_ListIteratorOfListIO It (selected);
1714         for ( ; It.More(); It.Next() ) {
1715           IOs.Clear(); IOs.Append( It.Value() );
1716           aSel->setSelectedObjects( IOs );
1717           new SMESHGUI_MeshInfosDlg(this, "", false);
1718         }
1719         // restore selection
1720         aSel->setSelectedObjects( selected );
1721       }
1722       else
1723         new SMESHGUI_MeshInfosDlg(this, "", false);
1724       break;
1725     }
1726
1727   case 902:                                     // STANDARD MESH INFOS
1728     {
1729       EmitSignalDeactivateDialog();
1730       SalomeApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1731       SALOME_ListIO selected;
1732       if( aSel )
1733         aSel->selectedObjects( selected );
1734
1735       if ( selected.Extent() > 1 ) { // a dlg for each IO
1736         SALOME_ListIO IOs;
1737         SALOME_ListIteratorOfListIO It (selected);
1738         for ( ; It.More(); It.Next() ) {
1739           IOs.Clear();
1740           IOs.Append( It.Value() );
1741           aSel->setSelectedObjects( IOs );
1742           new SMESHGUI_StandardMeshInfosDlg( this, "", false);
1743         }
1744         // restore selection
1745         aSel->setSelectedObjects( selected );
1746       }
1747       else
1748         new SMESHGUI_StandardMeshInfosDlg( this, "", false);
1749       break;
1750     } 
1751     
1752   case 1001:                                    // AUTOMATIC UPDATE PREFERENCES
1753     {
1754       if (act->isOn()) {
1755         mgr->setValue( "SMESH", "AutomaticUpdate", true );
1756         myAutomaticUpdate = true;
1757       }
1758       else {
1759         mgr->setValue( "SMESH", "AutomaticUpdate", false );
1760         myAutomaticUpdate = false;
1761       }
1762       break;
1763     }
1764
1765   case 1003:                                    // MESH PREFERENCES
1766     {
1767       ::SetDisplaySettings();
1768       break;
1769     }
1770
1771   case 1005:
1772     {
1773       SMESHGUI_Preferences_ScalarBarDlg::ScalarBarPreferences( this );
1774       break;
1775     }
1776
1777   case 10070:
1778     {
1779       ( new SMESHGUI_PrecisionDlg( this ) )->exec();
1780       break;
1781     }
1782
1783   case 10071:
1784     {
1785       if (act->isOn()) {
1786         mgr->setValue( "SMESH", "DispayEntity", true );
1787       }
1788       else {
1789         mgr->setValue( "SMESH", "DispayEntity", false );
1790       }
1791       break;
1792     }
1793   case 1006:
1794     {
1795       SMESHGUI_Preferences_SelectionDlg* aDlg = 
1796         new SMESHGUI_Preferences_SelectionDlg( this );
1797
1798       QColor aColor = mgr->colorValue( "SMESH", "SettingsPreSelectColor", Qt::cyan );
1799       aDlg->SetColor(1, aColor);
1800
1801       aColor = mgr->colorValue( "SMESH", "SettingsItemSelectColor", Qt::yellow );
1802       aDlg->SetColor(2, aColor);
1803
1804       aColor = mgr->colorValue( "SMESH", "SettingsSelectColor", Qt::white );
1805       aDlg->SetColor(3, aColor);
1806
1807       aDlg->SetWidth(1, mgr->integerValue( "SMESH", "SettingsPreSelectWidth", 5 ) );
1808       aDlg->SetWidth(2, mgr->integerValue( "SMESH", "SettingsItemSelectWidth", 5 ) );
1809       aDlg->SetPrecision(1, mgr->doubleValue( "SMESH", "SettingsNodeSelectTol", 0.025 ) );
1810       aDlg->SetPrecision(2, mgr->doubleValue( "SMESH", "SettingsElementsSelectTol", 0.001 ) );
1811
1812       if (aDlg->exec()) {
1813         QColor aPreColor = aDlg->GetColor(1),
1814                aSelColor = aDlg->GetColor(2),
1815                aHiColor = aDlg->GetColor(3);
1816         int aPreWidth = aDlg->GetWidth(1),
1817             aSelWidth = aDlg->GetWidth(2);
1818         double aTolNodes = aDlg->GetPrecision(1),
1819                aTolItems = aDlg->GetPrecision(2);
1820
1821         mgr->setValue( "SMESH", "SettingsPreSelectColor", aPreColor );
1822         mgr->setValue( "SMESH", "SettingsItemSelectColor", aSelColor );
1823         mgr->setValue( "SMESH", "SettingsSelectColor", aHiColor );
1824
1825         mgr->setValue( "SMESH", "SettingsPreSelectWidth", aPreWidth );
1826         mgr->setValue( "SMESH", "SettingsItemSelectWidth", aSelWidth );
1827         mgr->setValue( "SMESH", "SettingsNodeSelectTol", aTolNodes );
1828         mgr->setValue( "SMESH", "SettingsElementsSelectTol", aTolItems );
1829
1830         // update current study settings
1831         SMESH::UpdateSelectionProp( this );
1832
1833         if( vtkwnd ) {
1834           // update VTK viewer properties
1835           SVTK_RenderWindowInteractor* anInteractor =
1836             dynamic_cast<SVTK_RenderWindowInteractor*>( vtkwnd->getRWInteractor() );
1837           if (anInteractor) {
1838             anInteractor->SetSelectionProp(aSelColor.red()/255., aSelColor.green()/255.,
1839                                            aSelColor.blue()/255., aSelWidth);
1840             anInteractor->SetSelectionTolerance(aTolNodes, aTolItems);
1841             SVTK_InteractorStyle* aStyle =
1842               dynamic_cast<SVTK_InteractorStyle*>( anInteractor->GetInteractorStyle() );
1843
1844             if (aStyle)
1845               aStyle->setPreselectionProp(aPreColor.red()/255., aPreColor.green()/255.,
1846                                           aPreColor.blue()/255., aPreWidth);
1847           }
1848           // update actors
1849           vtkRenderer* aRenderer = vtkwnd->getRenderer();
1850           vtkActorCollection *aCollection = aRenderer->GetActors();
1851           aCollection->InitTraversal();
1852           while(vtkActor *anAct = aCollection->GetNextActor()){
1853             if(SMESH_Actor *anActor = dynamic_cast<SMESH_Actor*>(anAct)){
1854               anActor->SetHighlightColor(aHiColor.red()/255., aHiColor.green()/255.,
1855                                          aHiColor.blue()/255.);
1856               anActor->SetPreHighlightColor(aPreColor.red()/255., aPreColor.green()/255.,
1857                                             aPreColor.blue()/255.);
1858             }
1859           }
1860         }
1861       }
1862
1863       break;
1864     }
1865
1866   case 1100:                                    // EDIT HYPOTHESIS
1867     {
1868       if(checkLock(aStudy)) break;
1869
1870       SalomeApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1871       SALOME_ListIO selected;
1872       if( aSel )
1873         aSel->selectedObjects( selected );
1874
1875       int nbSel = selected.Extent();
1876
1877       if (nbSel == 1) {
1878         SMESH::SMESH_Hypothesis_var Hyp = SMESH::IObjectToInterface<SMESH::SMESH_Hypothesis>(selected.First());
1879
1880         /* Look for all mesh objects that have this hypothesis affected in order to flag as ModifiedMesh */
1881         /* At end below '...->updateObjBrowser(true)' will change icon of mesh objects                   */
1882         /* Warning : however by internal mechanism all subMeshes icons are changed !                     */
1883         if ( !Hyp->_is_nil() )
1884         {
1885           char* sName = Hyp->GetName();
1886           SMESHGUI_GenericHypothesisCreator* aCreator = SMESH::GetHypothesisCreator(sName);
1887           if (aCreator)
1888           {
1889             aCreator->EditHypothesis(Hyp);
1890           }
1891           else
1892           {
1893             // report error
1894           }
1895         }
1896       }
1897       break;
1898     }
1899
1900   case 1101:                                    // RENAME
1901     {
1902       if ( checkLock( aStudy ) )
1903         break;
1904
1905       SalomeApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1906       SALOME_ListIO selected;
1907       if( aSel )
1908         aSel->selectedObjects( selected );
1909
1910       SALOME_ListIteratorOfListIO It( selected );
1911       for ( ; It.More(); It.Next() )
1912       {
1913         Handle(SALOME_InteractiveObject) IObject = It.Value();
1914         _PTR(SObject) obj = aStudy->FindObjectID( IObject->getEntry() );
1915         _PTR(GenericAttribute) anAttr;
1916         _PTR(AttributeName) aName;
1917         if ( obj )
1918         {
1919           if ( obj->FindAttribute(anAttr, "AttributeName") )
1920           {
1921             aName = anAttr;
1922             QString newName = QString(aName->Value().c_str());
1923             newName = SalomeApp_NameDlg::getName( desktop(), newName );
1924             if ( !newName.isEmpty() )
1925             {
1926               //old source: aStudy->renameIObject( IObject, newName );
1927               aName->SetValue( newName.latin1() );
1928
1929               // if current object is group update group's name
1930               SMESH::SMESH_GroupBase_var aGroup =
1931                 SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>(IObject);
1932               if (!aGroup->_is_nil() )
1933                 aGroup->SetName( newName.latin1() );
1934                 
1935               updateObjBrowser();
1936             }
1937           }
1938         }
1939       }
1940       break;
1941     }
1942
1943   case 1102:                                    // REMOVE HYPOTHESIS / ALGORITHMS
1944     {
1945       if(checkLock(aStudy)) break;
1946       SUIT_OverrideCursor wc;
1947
1948       SalomeApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1949       SALOME_ListIO selected;
1950       if( aSel )
1951         aSel->selectedObjects( selected );
1952
1953       SALOME_ListIteratorOfListIO It(selected);
1954       for (int i = 0; It.More(); It.Next(), i++) {
1955         Handle(SALOME_InteractiveObject) IObject = It.Value();
1956         SMESH::RemoveHypothesisOrAlgorithmOnMesh(IObject);
1957       }
1958       SALOME_ListIO l1;
1959       aSel->setSelectedObjects( l1 );
1960       updateObjBrowser();
1961       break;
1962     }
1963
1964   case 401:                                     // GEOM::EDGE
1965   case 4021:                                    // TRIANGLE
1966   case 4022:                                    // QUAD
1967   case 4023:                                    // POLYGON
1968   case 4031:                                    // TETRA
1969   case 4032:                                    // HEXA
1970     {
1971       if(checkLock(aStudy)) break;
1972       if ( vtkwnd ) {
1973         EmitSignalDeactivateDialog();
1974         SMDSAbs_ElementType type    = SMDSAbs_Edge;
1975         int                 nbNodes = 2;
1976         switch (theCommandID) {
1977         case 4021:                                      // TRIANGLE
1978           type = SMDSAbs_Face; nbNodes = 3; break;
1979         case 4022:                                      // QUAD
1980           type = SMDSAbs_Face; nbNodes = 4; break;
1981         case 4031:                                      // TETRA
1982           type = SMDSAbs_Volume; nbNodes = 4; break;
1983         case 4023:                                      // POLYGON
1984           type = SMDSAbs_Face; nbNodes = 5; break;     // 5 - identificator for POLYGON
1985         case 4032:                                      // HEXA
1986           type = SMDSAbs_Volume; nbNodes = 8; break;
1987         case 4033:                                      // POLYHEDRE
1988           type = SMDSAbs_Volume; nbNodes = 9; break; // 9 - identificator for POLYHEDRE
1989         default:;
1990         }
1991         new SMESHGUI_AddMeshElementDlg( this, "", type, nbNodes);
1992       }
1993       else {
1994         SUIT_MessageBox::warn1(desktop(),
1995                               tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
1996                               tr("SMESH_BUT_OK"));
1997       }
1998       break;
1999     }
2000   case 4033:                                    // POLYHEDRON
2001     {
2002       if(checkLock(aStudy)) break;
2003       if ( vtkwnd ) {
2004         EmitSignalDeactivateDialog();
2005         new SMESHGUI_CreatePolyhedralVolumeDlg(this, "", FALSE );
2006       }
2007       else {
2008         SUIT_MessageBox::warn1(SMESHGUI::desktop(),
2009                               tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
2010                               tr("SMESH_BUT_OK"));
2011       }
2012       break;
2013     }
2014   case 4041:                                    // REMOVES NODES
2015     {
2016       if(checkLock(aStudy)) break;
2017       if ( vtkwnd ) {
2018         EmitSignalDeactivateDialog();
2019         new SMESHGUI_RemoveNodesDlg(this);
2020       }
2021       else {
2022         SUIT_MessageBox::warn1(desktop(),
2023                               tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
2024                               tr("SMESH_BUT_OK"));
2025       }
2026       break;
2027     }
2028   case 4042:                                    // REMOVES ELEMENTS
2029     {
2030       if(checkLock(aStudy)) break;
2031       if( vtkwnd ) {
2032         EmitSignalDeactivateDialog();
2033         new SMESHGUI_RemoveElementsDlg(this);
2034       }
2035       else
2036         {
2037           SUIT_MessageBox::warn1(desktop(),
2038                                 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
2039                                 tr("SMESH_BUT_OK"));
2040         }
2041       break;
2042     }
2043   case 4051:                                    // RENUMBERING NODES
2044     {
2045       if(checkLock(aStudy)) break;
2046       if( vtkwnd ) {
2047         EmitSignalDeactivateDialog();
2048         new SMESHGUI_RenumberingDlg( this, "", 0);
2049       }
2050       else
2051         {
2052           SUIT_MessageBox::warn1(desktop(),
2053                                 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
2054                                 tr("SMESH_BUT_OK"));
2055         }
2056       break;
2057     }
2058   case 4052:                                    // RENUMBERING ELEMENTS
2059     {
2060       if(checkLock(aStudy)) break;
2061       if ( vtkwnd ) {
2062         EmitSignalDeactivateDialog();
2063         new SMESHGUI_RenumberingDlg( this, "", 1);
2064       }
2065       else
2066         {
2067           SUIT_MessageBox::warn1(desktop(),
2068                                 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
2069                                 tr("SMESH_BUT_OK"));
2070         }
2071       break;
2072     }
2073   case 4061:                                   // TRANSLATION
2074     {
2075       if(checkLock(aStudy)) break;
2076       if ( vtkwnd ) {
2077         EmitSignalDeactivateDialog();
2078         new SMESHGUI_TranslationDlg( this );
2079       }
2080       else {
2081         SUIT_MessageBox::warn1(desktop(),
2082                               tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
2083                               tr("SMESH_BUT_OK"));
2084       }
2085       break;
2086     }
2087   case 4062:                                   // ROTATION
2088     {
2089       if(checkLock(aStudy)) break;
2090       if( vtkwnd ) {
2091         EmitSignalDeactivateDialog();
2092         new SMESHGUI_RotationDlg( this );
2093       }
2094       else {
2095         SUIT_MessageBox::warn1(desktop(),
2096                               tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
2097                               tr("SMESH_BUT_OK"));
2098       }
2099       break;
2100     }
2101   case 4063:                                   // SYMMETRY 
2102     {
2103       if(checkLock(aStudy)) break;
2104       if(vtkwnd) {
2105         EmitSignalDeactivateDialog();
2106         new SMESHGUI_SymmetryDlg( this );
2107       }
2108       else {
2109         SUIT_MessageBox::warn1(desktop(),
2110                               tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
2111                               tr("SMESH_BUT_OK"));
2112       }
2113       break;
2114     }
2115   case 4064:                                   // SEWING
2116     {
2117       if(checkLock(aStudy)) break;
2118       if(vtkwnd) {
2119         EmitSignalDeactivateDialog();
2120         new SMESHGUI_SewingDlg( this );
2121       }
2122       else {
2123         SUIT_MessageBox::warn1(desktop(),
2124                               tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
2125                               tr("SMESH_BUT_OK"));
2126       }
2127       break;
2128     }
2129   case 4065:                                   // MERGE NODES
2130     {
2131       if(checkLock(aStudy)) break;
2132       if(vtkwnd) {
2133         EmitSignalDeactivateDialog();
2134         new SMESHGUI_MergeNodesDlg( this );
2135       }
2136       else {
2137         SUIT_MessageBox::warn1(desktop(),
2138                               tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"),
2139                               tr("SMESH_BUT_OK"));
2140       }
2141       break;
2142     }
2143     
2144
2145   case 5000: // HYPOTHESIS
2146     {
2147       if(checkLock(aStudy)) break;
2148       EmitSignalDeactivateDialog();
2149       new SMESHGUI_CreateHypothesesDlg ( this, "", FALSE, false );
2150       break;
2151     }
2152   case 5010: // ALGO
2153     {
2154       if(checkLock(aStudy)) break;
2155       EmitSignalDeactivateDialog();
2156       new SMESHGUI_CreateHypothesesDlg ( this, "", FALSE, true);
2157       break;
2158     }
2159
2160   case 5105: // Library of selection filters
2161   {
2162     static QValueList<int> aTypes;
2163     if ( aTypes.isEmpty() )
2164     {
2165       aTypes.append( SMESH::NODE );
2166       aTypes.append( SMESH::EDGE );
2167       aTypes.append( SMESH::FACE );
2168       aTypes.append( SMESH::VOLUME );
2169     }
2170     new SMESHGUI_FilterLibraryDlg( this, SMESH::GetDesktop( this ), aTypes, SMESHGUI_FilterLibraryDlg::EDIT );
2171   }
2172   break;
2173
2174   case 6017:                                    // CONTROLS
2175   case 6016:
2176   case 6015:
2177   case 6014:
2178   case 6013:
2179   case 6012:
2180   case 6011:
2181   case 6001:
2182   case 6018:
2183   case 6019:
2184   case 6002:
2185   case 6003:
2186   case 6004:
2187     if ( vtkwnd ) {
2188
2189       SalomeApp_SelectionMgr* mgr = selectionMgr();
2190       SALOME_ListIO selected; mgr->selectedObjects( selected );
2191
2192       if ( selected.Extent() == 1 && selected.First()->hasEntry() ) {
2193         _PTR(SObject) SO = aStudy->FindObjectID( selected.First()->getEntry() );
2194         if ( SO ) {
2195           CORBA::Object_var aObject = SMESH::SObjectToObject( SO );
2196           SMESH::SMESH_Mesh_var      aMesh    = SMESH::SMESH_Mesh::_narrow( aObject );
2197           SMESH::SMESH_subMesh_var   aSubMesh = SMESH::SMESH_subMesh::_narrow( aObject );
2198           SMESH::SMESH_GroupBase_var aGroup   = SMESH::SMESH_GroupBase::_narrow( aObject );
2199           if ( !aMesh->_is_nil() || !aSubMesh->_is_nil() || !aGroup->_is_nil() ) {
2200             ::Control( theCommandID );
2201             break;
2202           }
2203         }
2204       }
2205       SUIT_MessageBox::warn1(desktop(),
2206                             tr( "SMESH_WRN_WARNING" ),
2207                             tr( "SMESH_BAD_SELECTION" ),
2208                             tr( "SMESH_BUT_OK" ) );
2209       break;
2210     }
2211     else {
2212       SUIT_MessageBox::warn1(desktop(),
2213                             tr( "SMESH_WRN_WARNING" ),
2214                             tr( "NOT_A_VTK_VIEWER" ), 
2215                             tr( "SMESH_BUT_OK" ) );
2216     }
2217     break;
2218   case 9010:
2219     {
2220       SalomeApp_SelectionMgr* mgr = selectionMgr();
2221       SALOME_ListIO selected; mgr->selectedObjects( selected );
2222
2223       if (selected.Extent() == 1)       {
2224         Handle(SALOME_InteractiveObject) anIObject = selected.First();
2225         if(anIObject->hasEntry())
2226           if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIObject->getEntry())){
2227             anActor->SetPointsLabeled( !anActor->GetPointsLabeled() );
2228           }
2229       }
2230       break;
2231     }
2232   case 9011:
2233     {
2234       SalomeApp_SelectionMgr* mgr = selectionMgr();
2235       SALOME_ListIO selected; mgr->selectedObjects( selected );
2236
2237       if (selected.Extent() == 1)       {
2238         Handle(SALOME_InteractiveObject) anIObject = selected.First();
2239         if(anIObject->hasEntry())
2240           if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIObject->getEntry())){
2241             anActor->SetCellsLabeled( !anActor->GetCellsLabeled() );
2242           }
2243       }
2244       break;
2245     }
2246   case 10001:                           // DISPLAY MODE PREFERENCE
2247     {
2248       // Wireframe
2249       act->setOn( true );
2250       action( 10002 )->setOn( false );
2251       action( 10004 )->setOn( false );
2252       action( 10003 )->setOn( true );
2253       mgr->setValue( "SMESH", "DisplayMode", "Wireframe");
2254       break;
2255     }
2256   case 10002:
2257     {
2258       act->setOn( true );
2259       action( 10001 )->setOn( false );
2260       action( 10004 )->setOn( false );
2261       action( 10003 )->setOn( true );
2262       mgr->setValue( "SMESH", "DisplayMode", "Shading");
2263       break;
2264     }
2265   case 10003:
2266     {
2267       mgr->setValue( "SMESH", "Shrink", act->isOn() );
2268       break;
2269     }
2270   case 10004:
2271     {
2272       act->setOn( true );
2273       action( 10001 )->setOn( false );
2274       action( 10002 )->setOn( false );
2275       action( 10003 )->setOn( false );
2276       mgr->setValue( "SMESH", "DisplayMode", "Nodes" );
2277       break;
2278     }
2279
2280   }
2281
2282   updateObjBrowser();
2283   return true;
2284 }
2285
2286 //=============================================================================
2287 /*!
2288  *
2289  */
2290 //=============================================================================
2291 bool SMESHGUI::OnMousePress( QMouseEvent * pe, SUIT_ViewWindow * wnd )
2292 {
2293   return false;
2294 }
2295
2296 //=============================================================================
2297 /*!
2298  *
2299  */
2300 //=============================================================================
2301 bool SMESHGUI::OnMouseMove( QMouseEvent * pe, SUIT_ViewWindow * wnd )
2302 {
2303   return true;
2304 }
2305
2306 //=============================================================================
2307 /*!
2308  *
2309  */
2310 //=============================================================================
2311 bool SMESHGUI::OnKeyPress( QKeyEvent * pe, SUIT_ViewWindow * wnd )
2312 {
2313   return true;
2314 }
2315
2316 //=============================================================================
2317 /*!
2318  *
2319  */
2320 //=============================================================================
2321 bool SMESHGUI::SetSettings(SUIT_Desktop* parent)
2322 {
2323   SMESHGUI::GetSMESHGUI();
2324   
2325   SUIT_ResourceMgr* mgr = resourceMgr();
2326   if( !mgr )
2327     return false;
2328
2329   // Display mode
2330   QString DisplayMode = "Shading";
2331   if ( mgr->hasValue("SMESH","DisplayMode") )
2332     DisplayMode = mgr->stringValue("SMESH","DisplayMode");
2333   else
2334     mgr->setValue("SMESH","DisplayMode", "Shading");
2335
2336   bool Shrink = false;
2337   if ( mgr->hasValue("SMESH","Shrink") )
2338     Shrink = mgr->stringValue("SMESH","Shrink") == "yes";
2339
2340   if (DisplayMode == "Wireframe") {
2341     // wireframe
2342     action( 10004 )->setOn( false );
2343     action( 10002 )->setOn( false );
2344     action( 10001 )->setOn( true );
2345     action( 10003 )->setOn( true );
2346   }
2347   else if (DisplayMode == "Nodes") {
2348     // poins
2349     action( 10004 )->setOn( true );
2350     action( 10002 )->setOn( false );
2351     action( 10001 )->setOn( false );
2352     action( 10003 )->setOn( false );
2353   }
2354   else {
2355     // default is shading
2356     action( 10004 )->setOn( false );
2357     action( 10002 )->setOn( true );
2358     action( 10001 )->setOn( false );
2359     action( 10003 )->setOn( true );
2360   }
2361
2362   action( 10003 )->setOn( Shrink );
2363
2364   // Automatic Update
2365   if ( mgr->booleanValue( "SMESH","AutomaticUpdate", false ) ) {
2366     action( 1001 )->setOn( true );
2367     myAutomaticUpdate = true;
2368   }
2369   else {
2370     action( 1001 )->setOn( false );
2371     myAutomaticUpdate = false;
2372   }
2373
2374   if ( mgr->booleanValue( "SMESH","DispayEntity", false ) )
2375     action( 10071 )->setOn( true );
2376   else
2377     action( 10071 )->setOn( false );
2378
2379   // Selection
2380   SMESH::UpdateSelectionProp( this );
2381
2382   // menus disable
2383   action( 111 )->setEnabled( false );   // IMPORT DAT
2384
2385   //action( 112 )->setEnabled( false );
2386   //parent->menuBar()->setItemEnabled(112, false);      // IMPORT UNV
2387
2388   return true;
2389 }
2390
2391 //=============================================================================
2392 /*! Method:  BuildPresentation(const Handle(SALOME_InteractiveObject)& theIO)
2393  *  Purpose: ensures that the actor for the given <theIO> exists in the active VTK view
2394  */
2395 //=============================================================================
2396 void SMESHGUI::BuildPresentation( const Handle(SALOME_InteractiveObject) & theIO,
2397                                   SUIT_ViewWindow* wnd )
2398 {
2399   if(theIO->hasEntry()){
2400     //SUIT_ViewWindow* wnd = SMESH::GetActiveWindow();
2401     SMESH::UpdateView(wnd,SMESH::eDisplay,theIO->getEntry());
2402   }
2403 }
2404
2405 //=======================================================================
2406 // function : createSMESHAction
2407 // purpose  :
2408 //=======================================================================
2409 void SMESHGUI::createSMESHAction( const int id, const QString& po_id, const QString& icon_id, const int key, const bool toggle  )
2410 {
2411   QIconSet icon;
2412   QWidget* parent = application()->desktop();
2413   SUIT_ResourceMgr* resMgr = resourceMgr();
2414   QPixmap pix;
2415   if ( icon_id.length() )
2416     pix = resMgr->loadPixmap( "SMESH", tr( icon_id ) );
2417   else
2418     pix = resMgr->loadPixmap( "SMESH", tr( QString( "ICO_" )+po_id ) );
2419   if ( !pix.isNull() )
2420     icon = QIconSet( pix );
2421
2422   QString tooltip    = tr( QString( "TOP_" )+po_id ),
2423           menu       = tr( QString( "MEN_" )+po_id ),
2424           status_bar = tr( QString( "STB_" )+po_id );
2425
2426   createAction( id, tooltip, icon, menu, status_bar, key, parent, toggle, this, SLOT( OnGUIEvent() )  );
2427 }
2428
2429 //=======================================================================
2430 // function : createPopupItem
2431 // purpose  :
2432 //=======================================================================
2433 void SMESHGUI::createPopupItem( const int id,
2434                                 const QString& clients,
2435                                 const QString& types,
2436                                 const QString& theRule,
2437                                 const int pId )
2438 {
2439   int parentId = pId;
2440   if( pId!=-1 )
2441     parentId = popupMgr()->actionId( action( pId ) );
2442
2443   if( !popupMgr()->contains( popupMgr()->actionId( action( id ) ) ) )
2444     popupMgr()->insert( action( id ), parentId, 0 );
2445
2446   QChar lc = QtxPopupMgr::Selection::defEquality();
2447   QString rule = "(%1) and (%2) and (%3)";
2448   rule = rule.arg( QString( "%1>0" ).arg( QtxPopupMgr::Selection::defSelCountParam() ) );
2449   rule = rule.arg( QString( "%1client in {%2}" ).arg( lc ).arg( clients ) );
2450   rule = rule.arg( QString( "%1type in {%2}" ).arg( lc ).arg( types ) );
2451   rule += theRule;
2452
2453   bool cont = myRules.contains( id );
2454   if( cont )
2455     rule = QString( "%1 or (%2)" ).arg( myRules[ id ] ).arg( rule );
2456
2457   popupMgr()->setRule( action( id ), rule, true );
2458   myRules[ id ] = QString( cont ? "%1" : "(%1)" ).arg( rule );
2459 }
2460
2461 //=======================================================================
2462 // function : initialize
2463 // purpose  :
2464 //=======================================================================
2465 void SMESHGUI::initialize( CAM_Application* app )
2466 {
2467   SalomeApp_Module::initialize( app );
2468
2469   // ----- create actions --------------
2470
2471   createSMESHAction(  111, "DAT", "", (CTRL+Key_B) );
2472   createSMESHAction(  112, "UNV", "", (CTRL+Key_U) );
2473   createSMESHAction(  113, "MED", "", (CTRL+Key_M) );
2474   createSMESHAction(  114, "NUM" );
2475   createSMESHAction(  121, "DAT" );
2476   createSMESHAction(  122, "MED" );
2477   createSMESHAction(  123, "UNV" );
2478   createSMESHAction(  124, "EXPORT_DAT" );
2479   createSMESHAction(  125, "EXPORT_MED" );
2480   createSMESHAction(  126, "EXPORT_UNV" );
2481   createSMESHAction(   33, "DELETE",          "ICON_DELETE" );
2482   createSMESHAction( 5105, "SEL_FILTER_LIB" );
2483   createSMESHAction( 5000, "CREATE_HYPO",     "ICON_HYPO" );
2484   createSMESHAction( 5010, "CREATE_ALG",      "ICON_PATTERN_2d" );
2485   createSMESHAction(  701, "COMPUTE",         "ICON_COMPUTE" );
2486   createSMESHAction(  702, "LOCAL_HYPO",      "ICON_DLG_ADD_SUBMESH" );
2487   createSMESHAction(  703, "GLOBAL_HYPO",     "ICON_DLG_INIT_MESH" );
2488   createSMESHAction(  704, "EDIT_HYPO",       "ICON_DLG_EDIT_MESH" );
2489   createSMESHAction(  705, "EDIT_GLOBAL_HYPO","ICON_DLG_EDIT_MESH" );
2490   createSMESHAction(  706, "EDIT_LOCAL_HYPO", "ICON_DLG_EDIT_MESH" );
2491   createSMESHAction(  801, "CREATE_GROUP",    "ICON_SMESH_TREE_GROUP" );
2492   createSMESHAction(  802, "CONSTRUCT_GROUP", "ICON_CONSTRUCT_GROUP" );
2493   createSMESHAction(  803, "EDIT_GROUP",      "ICON_EDIT_GROUP" );
2494   createSMESHAction(  804, "ADD" );
2495   createSMESHAction(  805, "REMOVE" );
2496   createSMESHAction(  810, "UN_GROUP",        "ICON_UNION" );
2497   createSMESHAction(  811, "INT_GROUP",       "ICON_INTERSECT" );
2498   createSMESHAction(  812, "CUT_GROUP",       "ICON_CUT" );
2499   createSMESHAction(  813, "DEL_GROUP",       "ICON_DEL_GROUP" );
2500   createSMESHAction(  900, "ADV_INFO",        "ICON_ADV_INFO" );
2501   createSMESHAction(  902, "STD_INFO",        "ICON_STD_INFO" );
2502   createSMESHAction( 6001, "LENGTH",          "ICON_LENGTH" ,       0, true );
2503   createSMESHAction( 6002, "FREE_EDGE",       "ICON_FREE_EDGE" ,    0, true );
2504   createSMESHAction( 6003, "FREE_BORDER",     "ICON_FREE_EDGE_2D" , 0, true );
2505   createSMESHAction( 6004, "CONNECTION",      "ICON_CONNECTION" ,   0, true );
2506   createSMESHAction( 6011, "AREA",            "ICON_AREA" ,         0, true );
2507   createSMESHAction( 6012, "TAPER",           "ICON_TAPER" ,        0, true );
2508   createSMESHAction( 6013, "ASPECT",          "ICON_ASPECT" ,       0, true );
2509   createSMESHAction( 6014, "MIN_ANG",         "ICON_ANGLE" ,        0, true );
2510   createSMESHAction( 6015, "WARP",            "ICON_WARP" ,         0, true );
2511   createSMESHAction( 6016, "SKEW",            "ICON_SKEW",          0, true );
2512   createSMESHAction( 6017, "ASPECT_3D",       "ICON_ASPECT_3D",     0, true );
2513   createSMESHAction( 6018, "LENGTH_2D",       "ICON_LENGTH_2D",     0, true );
2514   createSMESHAction( 6019, "CONNECTION_2D",   "ICON_CONNECTION_2D", 0, true );
2515   createSMESHAction(  400, "NODE",            "ICON_DLG_NODE" );
2516   createSMESHAction(  401, "EDGE",            "ICON_DLG_EDGE" );
2517   createSMESHAction( 4021, "TRIANGLE",        "ICON_DLG_TRIANGLE" );
2518   createSMESHAction( 4022, "QUAD",            "ICON_DLG_QUADRANGLE" );
2519   createSMESHAction( 4023, "POLYGON",         "ICON_DLG_POLYGON" );
2520   createSMESHAction( 4031, "TETRA",           "ICON_DLG_TETRAS" );
2521   createSMESHAction( 4032, "HEXA",            "ICON_DLG_HEXAS" );
2522   createSMESHAction( 4041, "REMOVE_NODES",    "ICON_DLG_REM_NODE" );
2523   createSMESHAction( 4042, "REMOVE_ELEMENTS", "ICON_DLG_REM_ELEMENT" );
2524   createSMESHAction( 4051, "RENUM_NODES",     "ICON_DLG_RENUMBERING_NODES" );
2525   createSMESHAction( 4052, "RENUM_ELEMENTS",  "ICON_DLG_RENUMBERING_ELEMENTS" );
2526   createSMESHAction( 4061, "TRANS",           "ICON_SMESH_TRANSLATION_VECTOR" );
2527   createSMESHAction( 4062, "ROT",             "ICON_DLG_ROTATION" );
2528   createSMESHAction( 4063, "SYM",             "ICON_SMESH_SYMMETRY_PLANE" );
2529   createSMESHAction( 4064, "SEW",             "ICON_SMESH_SEWING_FREEBORDERS" );
2530   createSMESHAction( 4065, "MERGE",           "ICON_SMESH_MERGE_NODES" );
2531   createSMESHAction(  406, "MOVE",            "ICON_DLG_MOVE_NODE" );
2532   createSMESHAction(  407, "INV",             "ICON_DLG_MESH_DIAGONAL" );
2533   createSMESHAction(  408, "UNION2",          "ICON_UNION2TRI" );
2534   createSMESHAction(  409, "ORIENT",          "ICON_DLG_MESH_ORIENTATION" );
2535   createSMESHAction(  410, "UNION",           "ICON_UNIONTRI" );
2536   createSMESHAction(  411, "CUT",             "ICON_CUTQUAD" );
2537   createSMESHAction(  412, "SMOOTH",          "ICON_DLG_SMOOTHING" );
2538   createSMESHAction(  413, "EXTRUSION",       "ICON_EXTRUSION" );
2539   createSMESHAction(  414, "REVOLUTION",      "ICON_REVOLUTION" );
2540   createSMESHAction(  415, "MAP",             "ICON_MAP" );
2541   createSMESHAction(  416, "EXTRUSION_ALONG", "ICON_EXTRUSION_ALONG" );
2542   createSMESHAction( 10001, "WIRE",           "ICON_WIRE",   0, true );
2543   createSMESHAction( 10002, "SHADE",          "ICON_SHADE",  0, true );
2544   createSMESHAction( 10003, "SHRINK",         "ICON_SHRINK", 0, true );
2545   createSMESHAction( 10004, "NODES",          "ICON_POINTS", 0, true );
2546   createSMESHAction( 1001, "AUTO_UPD", "", 0, true );
2547   createSMESHAction( 1003, "COLORS" );
2548   createSMESHAction( 1005, "SCALAR_BAR" );
2549   createSMESHAction( 1006, "SELECTION" );
2550   createSMESHAction( 10070, "PRECISION", "", 0, true );
2551   createSMESHAction( 10071, "DISP_ENT", "", 0, true );
2552   createSMESHAction(  200, "RESET" );
2553   createSMESHAction(  201, "SCALAR_BAR_PROP" );
2554   createSMESHAction(  211, "WIRE",           "ICON_WIRE", 0, true );
2555   createSMESHAction(  212, "SHADE",          "ICON_SHADE", 0, true );
2556   createSMESHAction(  213, "SHRINK",         "ICON_SHRINK", 0, true );
2557   createSMESHAction(  214, "UPDATE",         "ICON_UPDATE" );
2558   createSMESHAction(  215, "NODES",          "ICON_POINTS", 0, true );
2559   createSMESHAction(  217, "EDGES",          "ICON_DLG_EDGE", 0, true );
2560   createSMESHAction(  218, "FACES",          "ICON_DLG_TRIANGLE", 0, true );
2561   createSMESHAction(  219, "VOLUMES",        "ICON_DLG_TETRAS", 0, true );
2562   createSMESHAction(  220, "ALL" );
2563   createSMESHAction( 1100, "EDIT_HYPO" );
2564   createSMESHAction( 1101, "RENAME" );
2565   createSMESHAction( 9010, "NUM_NODES", "", 0, true );
2566   createSMESHAction( 9011, "NUM_ELEMENTS", "", 0, true );
2567   createSMESHAction( 1131, "DISPMODE" );
2568   createSMESHAction( 1132, "COLORS" );
2569   createSMESHAction( 1133, "TRANSP" );
2570   createSMESHAction( 1134, "CLIP" );
2571   createSMESHAction( 1135, "DISP_ENT" );
2572   createSMESHAction( 2000, "CTRL" );
2573   
2574   createSMESHAction( 300, "ERASE" );
2575   createSMESHAction( 301, "DISPLAY" );
2576   createSMESHAction( 302, "DISPLAY_ONLY" );
2577   createSMESHAction( 4033, "POLYHEDRON", "ICON_DLG_POLYHEDRON" );
2578
2579   // ----- create menu --------------
2580   int fileId   = createMenu( tr( "MEN_FILE" ),   -1,  1 ),
2581       editId   = createMenu( tr( "MEN_EDIT" ),   -1,  3 ),
2582       toolsId  = createMenu( tr( "MEN_TOOLS" ),  -1,  5, 10 ),
2583       hypoId   = createMenu( tr( "MEN_HYPO" ),   -1, 50, 10 ),
2584       meshId   = createMenu( tr( "MEN_MESH" ),   -1, 70, 10 ),
2585       ctrlId   = createMenu( tr( "MEN_CTRL" ),   -1, 60, 10 ),
2586       modifyId = createMenu( tr( "MEN_MODIFY" ), -1, 40, 10 ),
2587       prefId   = createMenu( tr( "MEN_PREF" ),   -1,  4, 10 ),
2588       viewId   = createMenu( tr( "MEN_VIEW" ),   -1,  2 );
2589
2590   createMenu( separator(), fileId );
2591
2592   int importId = createMenu( tr( "MEN_IMPORT" ), fileId, 11, 10 ),
2593       exportId = createMenu( tr( "MEN_EXPORT" ), fileId, 12, 10 ),
2594
2595       addId    = createMenu( tr( "MEN_ADD" ),    modifyId, 402 ),
2596       removeId = createMenu( tr( "MEN_REMOVE" ), modifyId, 403 ),
2597       renumId  = createMenu( tr( "MEN_RENUM" ),  modifyId, 404 ),
2598       transfId = createMenu( tr( "MEN_TRANSF" ), modifyId, 405 ),
2599
2600       meshPrefId = createMenu( tr( "MEN_MESH" ), prefId, 100 ),
2601
2602       dispModeId = createMenu( tr( "MEN_DISPMODE" ), meshPrefId, 1000 ),
2603       qualityId  = createMenu( tr( "MEN_QUALITY" ),  meshPrefId, 1007 );
2604
2605   createMenu( 111, importId, -1 );
2606   createMenu( 112, importId, -1 );
2607   createMenu( 113, importId, -1 );
2608
2609   createMenu( 121, exportId, -1 );
2610   createMenu( 122, exportId, -1 );
2611   createMenu( 123, exportId, -1 );
2612
2613   createMenu( separator(), fileId, 10 );
2614
2615   createMenu( 33, editId, -1 );
2616
2617   createMenu( 5105, toolsId, -1 );
2618
2619   createMenu( 5000, hypoId, -1 );
2620   createMenu( 5010, hypoId, -1 );
2621
2622   createMenu( 703, meshId, -1 );
2623   createMenu( 702, meshId, -1 );
2624   createMenu( 704, meshId, -1 );
2625   createMenu( separator(), meshId, -1 );
2626   createMenu( 701, meshId, -1 );
2627   createMenu( separator(), meshId, -1 );
2628   createMenu( 801, meshId, -1 );
2629   createMenu( 802, meshId, -1 );
2630   createMenu( 803, meshId, -1 );
2631   createMenu( separator(), meshId, -1 );
2632   createMenu( 810, meshId, -1 );
2633   createMenu( 811, meshId, -1 );
2634   createMenu( 812, meshId, -1 );
2635   createMenu( separator(), meshId, -1 );
2636   createMenu( 813, meshId, -1 );
2637   createMenu( separator(), meshId, -1 );
2638   createMenu( 900, meshId, -1 );
2639   createMenu( 902, meshId, -1 );
2640   createMenu( separator(), meshId, -1 );
2641
2642   createMenu( 6003, ctrlId, -1 );
2643   createMenu( 6001, ctrlId, -1 );
2644   createMenu( 6004, ctrlId, -1 );
2645   createMenu( separator(), ctrlId, -1 );
2646   createMenu( 6002, ctrlId, -1 );
2647   createMenu( 6018, ctrlId, -1 );
2648   createMenu( 6019, ctrlId, -1 );
2649   createMenu( 6011, ctrlId, -1 );
2650   createMenu( 6012, ctrlId, -1 );
2651   createMenu( 6013, ctrlId, -1 );
2652   createMenu( 6014, ctrlId, -1 );
2653   createMenu( 6015, ctrlId, -1 );
2654   createMenu( 6016, ctrlId, -1 );
2655   createMenu( separator(), ctrlId, -1 );
2656   createMenu( 6017, ctrlId, -1 );
2657   createMenu( separator(), ctrlId, -1 );
2658
2659   createMenu( 400, addId, -1 );
2660   createMenu( 401, addId, -1 );
2661   createMenu( 4021, addId, -1 );
2662   createMenu( 4022, addId, -1 );
2663   createMenu( 4023, addId, -1 );
2664   createMenu( 4031, addId, -1 );
2665   createMenu( 4032, addId, -1 );
2666   createMenu( 4033, addId, -1 );
2667
2668   createMenu( 4041, removeId, -1 );
2669   createMenu( 4042, removeId, -1 );
2670
2671   createMenu( 4051, renumId, -1 );
2672   createMenu( 4052, renumId, -1 );
2673
2674   createMenu( 4061, transfId, -1 );
2675   createMenu( 4062, transfId, -1 );
2676   createMenu( 4063, transfId, -1 );
2677   createMenu( 4064, transfId, -1 );
2678   createMenu( 4065, transfId, -1 );
2679
2680   createMenu( 406, modifyId, -1 );
2681   createMenu( 407, modifyId, -1 );
2682   createMenu( 408, modifyId, -1 );
2683   createMenu( 409, modifyId, -1 );
2684   createMenu( 410, modifyId, -1 );
2685   createMenu( 411, modifyId, -1 );
2686   createMenu( 412, modifyId, -1 );
2687   createMenu( 413, modifyId, -1 );
2688   createMenu( 416, modifyId, -1 );
2689   createMenu( 414, modifyId, -1 );
2690   createMenu( 415, modifyId, -1 );
2691
2692   createMenu( 10001, dispModeId, -1 );
2693   createMenu( 10002, dispModeId, -1 );
2694   createMenu( 10004, dispModeId, -1 );
2695   createMenu( 10003, dispModeId, -1 );
2696
2697   createMenu( 1001, prefId, -1 );
2698   createMenu( separator(), prefId, -1 );
2699   createMenu( 1003, prefId, -1 );
2700   createMenu( separator(), prefId, -1 );
2701   createMenu( 1005, prefId, -1 );
2702   createMenu( separator(), prefId, -1 );
2703   createMenu( 1006, prefId, -1 );
2704   createMenu( separator(), prefId, -1 );
2705
2706   createMenu( 10070, qualityId, -1 );
2707   createMenu( 10071, qualityId, -1 );
2708
2709   createMenu( separator(), prefId, -1 );
2710
2711   createMenu( 214, viewId, -1 );
2712
2713   // ----- create toolbars --------------
2714   int meshTb     = createTool( tr( "TB_MESH" ) ),
2715       hypoTb     = createTool( tr( "TB_HYPO" ) ),
2716       ctrlTb     = createTool( tr( "TB_CTRL" ) ),
2717       addRemTb   = createTool( tr( "TB_ADD_REMOVE" ) ),
2718       modifyTb   = createTool( tr( "TB_MODIFY" ) ),
2719       dispModeTb = createTool( tr( "TB_DISP_MODE" ) );
2720
2721   createTool( 703, meshTb );
2722   createTool( 702, meshTb );
2723   createTool( 704, meshTb );
2724   createTool( separator(), meshTb );
2725   createTool( 701, meshTb );
2726   createTool( separator(), meshTb );
2727   createTool( 801, meshTb );
2728   createTool( 802, meshTb );
2729   createTool( 803, meshTb );
2730   createTool( separator(), meshTb );
2731   createTool( 900, meshTb );
2732   createTool( 902, meshTb );
2733   createTool( separator(), meshTb );
2734
2735   createTool( 5000, hypoTb );
2736   createTool( 5010, hypoTb );
2737
2738   createTool( 6001, ctrlTb );
2739   createTool( 6003, ctrlTb );
2740   createTool( 6004, ctrlTb );
2741   createTool( separator(), ctrlTb );
2742   createTool( 6002, ctrlTb );
2743   createTool( 6018, ctrlTb );
2744   createTool( 6019, ctrlTb );
2745   createTool( 6011, ctrlTb );
2746   createTool( 6012, ctrlTb );
2747   createTool( 6013, ctrlTb );
2748   createTool( 6014, ctrlTb );
2749   createTool( 6015, ctrlTb );
2750   createTool( 6016, ctrlTb );
2751   createTool( separator(), ctrlTb );
2752   createTool( 6017, ctrlTb );
2753   createTool( separator(), ctrlTb );
2754
2755   createTool( 400, addRemTb );
2756   createTool( 401, addRemTb );
2757   createTool( 4021, addRemTb );
2758   createTool( 4022, addRemTb );
2759   createTool( 4023, addRemTb );
2760   createTool( 4031, addRemTb );
2761   createTool( 4032, addRemTb );
2762   createTool( 4033, addRemTb );
2763   createTool( separator(), addRemTb );
2764   createTool( 4041, addRemTb );
2765   createTool( 4042, addRemTb );
2766   createTool( separator(), addRemTb );
2767   createTool( 4051, addRemTb );
2768   createTool( 4052, addRemTb );
2769   createTool( separator(), addRemTb );
2770   createTool( 4061, addRemTb );
2771   createTool( 4062, addRemTb );
2772   createTool( 4063, addRemTb );
2773   createTool( 4064, addRemTb );
2774   createTool( 4065, addRemTb );
2775   createTool( separator(), addRemTb );
2776
2777   createTool( 406, modifyTb );
2778   createTool( 407, modifyTb );
2779   createTool( 408, modifyTb );
2780   createTool( 409, modifyTb );
2781   createTool( 410, modifyTb );
2782   createTool( 411, modifyTb );
2783   createTool( 412, modifyTb );
2784   createTool( 413, modifyTb );
2785   createTool( 416, modifyTb );
2786   createTool( 414, modifyTb );
2787   createTool( 415, modifyTb );
2788
2789   createTool( 214, dispModeTb );
2790
2791
2792   myRules.clear();
2793   QString OB = "'ObjectBrowser'",
2794           View = "'" + SVTK_Viewer::Type() + "'",
2795           pat = "'%1'",
2796           mesh    = pat.arg( SMESHGUI_Selection::typeName( MESH ) ),
2797           group   = pat.arg( SMESHGUI_Selection::typeName( GROUP ) ),
2798           hypo    = pat.arg( SMESHGUI_Selection::typeName( HYPOTHESIS ) ),
2799           algo    = pat.arg( SMESHGUI_Selection::typeName( ALGORITHM ) ),
2800           elems   = QString( "'%1' '%2' '%3' '%4' '%5'" ).
2801                        arg( SMESHGUI_Selection::typeName( SUBMESH_VERTEX ) ).
2802                        arg( SMESHGUI_Selection::typeName( SUBMESH_EDGE ) ).
2803                        arg( SMESHGUI_Selection::typeName( SUBMESH_FACE ) ).
2804                        arg( SMESHGUI_Selection::typeName( SUBMESH_SOLID ) ).
2805                        arg( SMESHGUI_Selection::typeName( SUBMESH_COMPOUND ) ),
2806           subMesh = elems,
2807           mesh_group = mesh + " " + subMesh + " " + group,
2808           hyp_alg = hypo + " " + algo;
2809
2810   // popup for object browser
2811
2812   createPopupItem( 705, OB, mesh, "&& isComputable");      // EDIT_GLOBAL_HYPO
2813   createPopupItem( 706, OB, subMesh, "&& isComputable" );  // EDIT_LOCAL_HYPO
2814   createPopupItem( 803, OB, group );                       // EDIT_GROUP
2815   popupMgr()->insert( separator(), -1, 0 );
2816   createPopupItem( 701, OB, mesh, "&& isComputable" );     // COMPUTE
2817   createPopupItem( 214, OB, mesh_group );                  // UPDATE
2818   createPopupItem( 900, OB, mesh_group );                  // ADV_INFO
2819   createPopupItem( 902, OB, mesh );                        // STD_INFO
2820   popupMgr()->insert( separator(), -1, 0 );
2821   createPopupItem( 801, OB, mesh );                        // CREATE_GROUP
2822   createPopupItem( 802, OB, subMesh );                     // CONSTRUCT_GROUP
2823   popupMgr()->insert( separator(), -1, 0 );
2824   createPopupItem( 1100, OB, hypo );                       // EDIT HYPOTHESIS
2825   createPopupItem( 1102, OB, hyp_alg, "&& hasReference" ); // REMOVE HYPOTHESIS / ALGORITHMS
2826   createPopupItem( 1101, OB, mesh_group + " " + hyp_alg ); // RENAME
2827   popupMgr()->insert( separator(), -1, 0 );
2828   createPopupItem( 125, OB, mesh );                        // EXPORT_MED
2829   createPopupItem( 126, OB, mesh );                        // EXPORT_UNV
2830   createPopupItem( 33, OB, subMesh + " " + group );        // DELETE
2831   popupMgr()->insert( separator(), -1, 0 );
2832
2833   // popup for viewer
2834   createPopupItem( 803, View, group ); // EDIT_GROUP
2835   createPopupItem( 804, View, elems ); // ADD
2836   createPopupItem( 805, View, elems ); // REMOVE
2837   popupMgr()->insert( separator(), -1, 0 );
2838   createPopupItem( 214, View, mesh_group ); // UPDATE
2839   createPopupItem( 900, View, mesh_group ); // ADV_INFO
2840   createPopupItem( 902, View, mesh );       // STD_INFO
2841   popupMgr()->insert( separator(), -1, 0 );
2842
2843   int anId;
2844   QString
2845     isInvisible("not( isVisible )"),
2846     isEmpty("numberOfNodes = 0"),
2847     isNotEmpty("numberOfNodes <> 0"),
2848
2849     // has nodes, edges, etc in VISIBLE! actor
2850     hasNodes("(numberOfNodes > 0 )"),//&& isVisible)"),
2851     hasElems("(count( elemTypes ) > 0)"),
2852     hasDifferentElems("(count( elemTypes ) > 1)"),
2853     hasEdges("({'Edge'} in elemTypes)"),
2854     hasFaces("({'Face'} in elemTypes)"),
2855     hasVolumes("({'Volume'} in elemTypes)");
2856
2857   QString aSelCount = QString( "%1 = 1" ).arg( QtxPopupMgr::Selection::defSelCountParam() );
2858   QString lc = QtxPopupMgr::Selection::defEquality();
2859   QString aClient = QString( "%1client in {%2}" ).arg( lc ).arg( "'VTKViewer' 'ObjectBrowser'" );
2860   QString aType = QString( "%1type in {%2}" ).arg( QtxPopupMgr::Selection::defEquality() ).arg( mesh_group );
2861   QString aMeshInVTK = aClient + "&&" + aType;// + "&&" + aSelCount;
2862   
2863   //-------------------------------------------------
2864   // Numbering
2865   //-------------------------------------------------
2866   anId = popupMgr()->insert( tr( "MEN_NUM" ), -1, -1 );
2867
2868   popupMgr()->insert( action( 9010 ), anId, -1 );
2869   popupMgr()->setRule( action( 9010 ), aMeshInVTK + "&&" + hasNodes, true );
2870   popupMgr()->setRule( action( 9010 ), "{'Point'} in labeledTypes", false );
2871
2872   popupMgr()->insert( action( 9011 ), anId, -1 );
2873   popupMgr()->setRule( action( 9011 ), aMeshInVTK + "&&" + hasElems, true );
2874   popupMgr()->setRule( action( 9011 ), "{'Cell'} in labeledTypes", false );
2875
2876   popupMgr()->insert( separator(), -1, -1 );
2877
2878   //-------------------------------------------------
2879   // Display Mode
2880   //-------------------------------------------------
2881   anId = popupMgr()->insert( tr( "MEN_DISPMODE" ), -1, -1 );
2882
2883   popupMgr()->insert( action( 211 ), anId, -1 ); // WIRE
2884   popupMgr()->setRule( action( 211 ), aMeshInVTK + "&&" + hasElems, true );
2885   popupMgr()->setRule( action( 211 ), "displayMode = 'eEdge'", false );
2886
2887   popupMgr()->insert( action( 212 ), anId, -1 ); // SHADE
2888   popupMgr()->setRule( action( 212 ),aMeshInVTK+ "&& (" + hasFaces + "||" + hasVolumes + ")",true);
2889   popupMgr()->setRule( action( 212 ), "displayMode = 'eSurface'", false );
2890
2891   popupMgr()->insert( action( 215 ), anId, -1 ); // POINTS
2892   popupMgr()->setRule( action( 215 ), aMeshInVTK + "&&" + hasNodes, true );
2893   popupMgr()->setRule( action( 215 ), "displayMode = 'ePoint'", false );
2894
2895   popupMgr()->insert( separator(), anId, -1 );
2896
2897   popupMgr()->insert( action( 213 ), anId, -1 ); // SHRINK
2898   popupMgr()->setRule( action( 213 ), aMeshInVTK + "&& shrinkMode <> 'IsNotShrinkable' && displayMode <> 'ePoint'",true);
2899   popupMgr()->setRule( action( 213 ), "shrinkMode = 'IsShrunk'", false );
2900
2901   //-------------------------------------------------
2902   // Display Entity
2903   //-------------------------------------------------
2904   QString aDiffElemsInVTK = aMeshInVTK + "&&" + hasDifferentElems;
2905
2906   anId = popupMgr()->insert( tr( "MEN_DISP_ENT" ), -1, -1 );
2907
2908   popupMgr()->insert( action( 217 ), anId, -1 ); // EDGES
2909   popupMgr()->setRule( action( 217 ), aDiffElemsInVTK + "&&" + hasEdges, true );
2910   popupMgr()->setRule( action( 217 ), "{'Edge'} in entityMode", false );
2911
2912   popupMgr()->insert( action( 218 ), anId, -1 ); // FACES
2913   popupMgr()->setRule( action( 218 ), aDiffElemsInVTK + "&&" + hasFaces, true );
2914   popupMgr()->setRule( action( 218 ), "{'Face'} in entityMode", false );
2915
2916   popupMgr()->insert( action( 219 ), anId, -1 ); // VOLUMES
2917   popupMgr()->setRule( action( 219 ), aDiffElemsInVTK + "&&" + hasVolumes, true );
2918   popupMgr()->setRule( action( 219 ), "{'Volume'} in entityMode", false );
2919
2920   popupMgr()->insert( separator(), anId, -1 );
2921
2922   popupMgr()->insert( action( 220 ), anId, -1 ); // ALL
2923   popupMgr()->setRule( action( 220 ), aDiffElemsInVTK + "&& not( elemTypes in entityMode )", true );
2924
2925   //-------------------------------------------------
2926   // Color / Size
2927   //-------------------------------------------------
2928   popupMgr()->insert( action( 1132 ), -1, -1 );
2929   popupMgr()->setRule( action( 1132 ), aMeshInVTK + "&& isVisible", true );
2930
2931   //-------------------------------------------------
2932   // Transparency
2933   //-------------------------------------------------
2934   popupMgr()->insert( action( 1133 ), -1, -1 );
2935   popupMgr()->setRule( action( 1133 ), aMeshInVTK + "&& isVisible", true );
2936
2937   //-------------------------------------------------
2938   // Clipping
2939   //-------------------------------------------------
2940   popupMgr()->insert( action( 1134 ), -1, -1 );
2941   popupMgr()->setRule( action( 1134 ), aMeshInVTK + "&& isVisible", true );
2942
2943   popupMgr()->insert( separator(), -1, -1 );
2944
2945   //-------------------------------------------------
2946   // Controls
2947   //-------------------------------------------------
2948   QString
2949     aMeshInVtkHasEdges = aMeshInVTK + "&&" + hasEdges,
2950     aMeshInVtkHasFaces = aMeshInVTK + "&&" + hasFaces,
2951     aMeshInVtkHasVolumes = aMeshInVTK + "&&" + hasVolumes;
2952
2953   anId = popupMgr()->insert( tr( "MEN_CTRL" ), -1, -1 );
2954
2955   popupMgr()->insert( action( 200 ), anId, -1 ); // RESET
2956   popupMgr()->setRule( action( 200 ), aMeshInVTK + "&& controlMode <> 'eNone'", true );
2957
2958   popupMgr()->insert( separator(), anId, -1 );
2959
2960   popupMgr()->insert( action( 6003 ), anId, -1 ); // FREE_BORDER
2961   popupMgr()->setRule( action( 6003 ), aMeshInVtkHasEdges, true );
2962   popupMgr()->setRule( action( 6003 ), "controlMode = 'eFreeEdges'", false );
2963
2964   popupMgr()->insert( action( 6001 ), anId, -1 ); // LENGTH
2965   popupMgr()->setRule( action( 6001 ), aMeshInVtkHasEdges, true );
2966   popupMgr()->setRule( action( 6001 ), "controlMode = 'eLength'", false );
2967
2968   popupMgr()->insert( action( 6004 ), anId, -1 ); // CONNECTION
2969   popupMgr()->setRule( action( 6004 ), aMeshInVtkHasEdges, true );
2970   popupMgr()->setRule( action( 6004 ), "controlMode = 'eMultiConnection'", false );
2971
2972   popupMgr()->insert( separator(), anId, -1 );
2973
2974   popupMgr()->insert( action( 6002 ), anId, -1 ); // FREE_EDGE
2975   popupMgr()->setRule( action( 6002 ), aMeshInVtkHasFaces, true );
2976   popupMgr()->setRule( action( 6002 ), "controlMode = 'eFreeBorders'", false );
2977
2978   popupMgr()->insert( action( 6018 ), anId, -1 ); // LENGTH_2D
2979   popupMgr()->setRule( action( 6018 ), aMeshInVtkHasFaces, true );
2980   popupMgr()->setRule( action( 6018 ), "controlMode = 'eLength2D'", false );
2981
2982   popupMgr()->insert( action( 6019 ), anId, -1 ); // CONNECTION_2D
2983   popupMgr()->setRule( action( 6019 ), aMeshInVtkHasFaces, true );
2984   popupMgr()->setRule( action( 6019 ), "controlMode = 'eMultiConnection2D'", false );
2985
2986   popupMgr()->insert( action( 6011 ), anId, -1 ); // AREA
2987   popupMgr()->setRule( action( 6011 ), aMeshInVtkHasFaces, true );
2988   popupMgr()->setRule( action( 6011 ), "controlMode = 'eArea'", false );
2989
2990   popupMgr()->insert( action( 6012 ), anId, -1 ); // TAPER
2991   popupMgr()->setRule( action( 6012 ), aMeshInVtkHasFaces, true );
2992   popupMgr()->setRule( action( 6012 ), "controlMode = 'eTaper'", false );
2993
2994   popupMgr()->insert( action( 6013 ), anId, -1 ); // ASPECT
2995   popupMgr()->setRule( action( 6013 ), aMeshInVtkHasFaces, true );
2996   popupMgr()->setRule( action( 6013 ), "controlMode = 'eAspectRatio'", false );
2997
2998   popupMgr()->insert( action( 6014 ), anId, -1 ); // MIN_ANG
2999   popupMgr()->setRule( action( 6014 ), aMeshInVtkHasFaces, true );
3000   popupMgr()->setRule( action( 6014 ), "controlMode = 'eMinimumAngle'", false );
3001
3002   popupMgr()->insert( action( 6015 ), anId, -1 ); // WARP
3003   popupMgr()->setRule( action( 6015 ), aMeshInVtkHasFaces, true );
3004   popupMgr()->setRule( action( 6015 ), "controlMode = 'eWarping'", false );
3005
3006   popupMgr()->insert( action( 6016 ), anId, -1 ); // SKEW
3007   popupMgr()->setRule( action( 6016 ), aMeshInVtkHasFaces, true );
3008   popupMgr()->setRule( action( 6016 ), "controlMode = 'eSkew'", false );
3009
3010   popupMgr()->insert( separator(), anId, -1 );
3011
3012   popupMgr()->insert( action( 6017 ), anId, -1 ); // ASPECT_3D
3013   popupMgr()->setRule( action( 6017 ), aMeshInVtkHasVolumes, true );
3014   popupMgr()->setRule( action( 6017 ), "controlMode = 'eAspectRatio3D'", false );
3015
3016   popupMgr()->insert( separator(), anId, -1 );
3017
3018   popupMgr()->insert( action( 201 ), anId, -1 ); // SCALAR_BAR_PROP
3019   popupMgr()->setRule( action( 201 ), aMeshInVTK + "&& controlMode <> 'eNone'", true );
3020
3021   popupMgr()->insert( separator(), -1, -1 );
3022
3023   //-------------------------------------------------
3024   // Display / Erase
3025   //-------------------------------------------------
3026   aClient = "($client in {'VTKViewer' 'ObjectBrowser'})";
3027   QString aRule = aClient + " and " + aType + " and " + aSelCount;
3028   popupMgr()->insert( action( 301 ), -1, -1 ); // DISPLAY
3029   popupMgr()->setRule( action( 301 ), aRule + "&&" + isNotEmpty + "&&" + isInvisible, true);
3030
3031   popupMgr()->insert( action( 300 ), -1, -1 ); // ERASE
3032   popupMgr()->setRule( action( 300 ), aRule + "&&" + isNotEmpty + "&& isVisible", true );
3033
3034   popupMgr()->insert( action( 302 ), -1, -1 ); // DISPLAY_ONLY
3035   popupMgr()->setRule( action( 302 ), aRule + "&&" + isNotEmpty, true );
3036
3037   popupMgr()->insert( separator(), -1, -1 );
3038
3039   connect( application(), SIGNAL( viewManagerAdded( SUIT_ViewManager* ) ), 
3040            this, SLOT( onViewManagerAdded( SUIT_ViewManager* ) ) );
3041 }
3042
3043 bool SMESHGUI::activateModule( SUIT_Study* study )
3044 {
3045   bool res = SalomeApp_Module::activateModule( study );
3046
3047   setMenuShown( true );
3048   setToolShown( true );
3049   SetSettings( desktop() );
3050
3051   return res;
3052 }
3053
3054 bool SMESHGUI::deactivateModule( SUIT_Study* study )
3055 {
3056   setMenuShown( false );
3057   setToolShown( false );
3058
3059   EmitSignalCloseAllDialogs();
3060   
3061   return SalomeApp_Module::deactivateModule( study );
3062 }
3063
3064 void SMESHGUI::OnGUIEvent()
3065 {
3066   const QObject* obj = sender();
3067   if ( !obj || !obj->inherits( "QAction" ) )
3068     return;
3069   int id = actionId((QAction*)obj);
3070   if ( id != -1 )
3071     OnGUIEvent( id );
3072 }
3073
3074 SMESH::SMESH_Gen_var SMESHGUI::GetSMESHGen()
3075 {
3076   return myComponentSMESH;
3077 }
3078
3079 QString SMESHGUI::engineIOR() const
3080 {
3081   CORBA::ORB_var anORB = getApp()->orb();
3082   CORBA::String_var anIOR = anORB->object_to_string(GetSMESHGen());
3083   return anIOR.in();
3084 }
3085
3086 void SMESHGUI::contextMenuPopup( const QString& client, QPopupMenu* menu, QString& /*title*/ )
3087 {
3088   SMESHGUI_Selection sel;
3089   sel.init( client, selectionMgr() );
3090   popupMgr()->updatePopup( menu, &sel );
3091 }
3092
3093 void SMESHGUI::windows( QMap<int, int>& aMap ) const
3094 {
3095   aMap.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::DockLeft );
3096   aMap.insert( SalomeApp_Application::WT_PyConsole, Qt::DockBottom );
3097 }
3098
3099 void SMESHGUI::viewManagers( QStringList& list ) const
3100 {
3101   list.append( SVTK_Viewer::Type() );
3102 }
3103
3104 void SMESHGUI::onViewManagerAdded( SUIT_ViewManager* mgr )
3105 {
3106   if( dynamic_cast<VTKViewer_ViewManager*>( mgr ) )
3107     SMESH::UpdateSelectionProp( this );
3108 }