]> SALOME platform Git repositories - modules/geom.git/blob - src/GEOMGUI/GeometryGUI.cxx
Salome HOME
Fix remarks related to the "0021757: EDF 1829 : Activate bring to front action on...
[modules/geom.git] / src / GEOMGUI / GeometryGUI.cxx
1 // Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
10 //
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 // Lesser General Public License for more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 //  File   : GeometryGUI.cxx
23 //  Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com)
24
25 #include <Standard_math.hxx>  // E.A. must be included before Python.h to fix compilation on windows
26 #ifdef HAVE_FINITE
27 #undef HAVE_FINITE            // VSR: avoid compilation warning on Linux : "HAVE_FINITE" redefined
28 #endif
29 #include "Python.h"
30 #include "GeometryGUI.h"
31 #include "GeometryGUI_Operations.h"
32 #include "GEOMPluginGUI.h"
33 #include "GEOMGUI_XmlHandler.h"
34 #include "GEOMGUI_OCCSelector.h"
35 #include "GEOMGUI_Selection.h"
36 #include "GEOMGUI_CreationInfoWdg.h"
37 #include "GEOM_Constants.h"
38 #include "GEOM_Displayer.h"
39 #include "GEOM_AISShape.hxx"
40
41 #include "GEOM_Actor.h"
42
43 #include <Material_ResourceMgr.h>
44 #include <Material_Model.h>
45
46 #include <SUIT_Desktop.h>
47 #include <SUIT_MessageBox.h>
48 #include <SUIT_ResourceMgr.h>
49 #include <SUIT_Session.h>
50 #include <SUIT_ViewManager.h>
51
52 #include <PyInterp_Interp.h>
53
54 #include <OCCViewer_ViewWindow.h>
55 #include <OCCViewer_ViewPort3d.h>
56 #include <OCCViewer_ViewModel.h>
57 #include <OCCViewer_ViewManager.h>
58
59 #include <SOCC_ViewModel.h>
60 #include <SOCC_ViewWindow.h>
61
62 #include <SVTK_ViewWindow.h>
63 #include <SVTK_RenderWindowInteractor.h>
64 #include <SVTK_InteractorStyle.h>
65 #include <SVTK_ViewModel.h>
66
67 #include <SalomeApp_Application.h>
68 #include <SalomeApp_DataObject.h>
69 #include <SalomeApp_Study.h>
70 #include <SalomeApp_Tools.h>
71
72 #include <LightApp_SelectionMgr.h>
73 #include <LightApp_VTKSelector.h>
74 #include <LightApp_DataObject.h>
75 #include <LightApp_Preferences.h>
76
77 #include <SALOME_LifeCycleCORBA.hxx>
78 #include <SALOME_ListIO.hxx>
79 #include <SALOME_ListIteratorOfListIO.hxx>
80
81 #include <SALOMEDSClient_ClientFactory.hxx>
82 #include <SALOMEDSClient_IParameters.hxx>
83
84 #include <SALOMEDS_SObject.hxx>
85
86 #include <Basics_OCCTVersion.hxx>
87
88 // External includes
89 #include <QDir>
90 #include <QMenu>
91 #include <QTime>
92 #include <QAction>
93 #include <QFileInfo>
94 #include <QString>
95 #include <QPainter>
96 #include <QSignalMapper>
97
98 #include <AIS_Drawer.hxx>
99 #include <AIS_ListOfInteractive.hxx>
100 #include <AIS_ListIteratorOfListOfInteractive.hxx>
101 #include <Prs3d_Drawer.hxx>
102 #include <Prs3d_IsoAspect.hxx>
103 #include <Aspect_TypeOfMarker.hxx>
104 #include <OSD_SharedLibrary.hxx>
105 #include <NCollection_DataMap.hxx>
106
107 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
108 #include <TColStd_HArray1OfByte.hxx>
109 #else
110 #include <Graphic3d_HArray1OfBytes.hxx>
111 #endif
112
113 #include <utilities.h>
114
115 #include <vtkCamera.h>
116 #include <vtkRenderer.h>
117
118 #include <Standard_Failure.hxx>
119 #include <Standard_ErrorHandler.hxx>
120
121 #include "GEOM_version.h"
122 #include "GEOMImpl_Types.hxx" // dangerous hxx (defines short-name macros) - include after all
123
124 extern "C" {
125   Standard_EXPORT CAM_Module* createModule() {
126     return new GeometryGUI();
127   }
128
129   Standard_EXPORT char* getModuleVersion() {
130     return (char*)GEOM_VERSION_STR;
131   }
132 }
133
134 GeometryGUI::StudyTextureMap GeometryGUI::myTextureMap;
135
136 GEOM::GEOM_Gen_var GeometryGUI::myComponentGeom = GEOM::GEOM_Gen::_nil();
137
138 GEOM::GEOM_Gen_var GeometryGUI::GetGeomGen()
139 {
140   // Bug 12290: exception in Mesh GUI on GEOMBase::GetShape() if Geometry GUI hasn't been loaded
141   if (CORBA::is_nil(myComponentGeom))
142     InitGeomGen();
143   return GeometryGUI::myComponentGeom;
144 }
145
146 bool GeometryGUI::InitGeomGen()
147 {
148   GeometryGUI aGG;
149   if ( CORBA::is_nil( myComponentGeom ) ) return false;
150   return true;
151 }
152
153 //=======================================================================
154 // function : ClientSObjectToObject
155 // purpose  :
156 //=======================================================================
157 CORBA::Object_var GeometryGUI::ClientSObjectToObject (_PTR(SObject) theSObject)
158 {
159   _PTR(GenericAttribute) anAttr;
160   CORBA::Object_var anObj;
161   try {
162     std::string aValue = theSObject->GetIOR();
163     if (strcmp(aValue.c_str(), "") != 0) {
164       CORBA::ORB_ptr anORB = SalomeApp_Application::orb();
165       anObj = anORB->string_to_object(aValue.c_str());
166     }
167   } catch(...) {
168     INFOS("ClientSObjectToObject - Unknown exception was occured!!!");
169   }
170   return anObj._retn();
171 }
172
173 //=======================================================================
174 // function : ClientStudyToStudy
175 // purpose  :
176 //=======================================================================
177 SALOMEDS::Study_var GeometryGUI::ClientStudyToStudy (_PTR(Study) theStudy)
178 {
179   SALOME_NamingService *aNamingService = SalomeApp_Application::namingService();
180   CORBA::Object_var aSMObject = aNamingService->Resolve("/myStudyManager");
181   SALOMEDS::StudyManager_var aStudyManager = SALOMEDS::StudyManager::_narrow(aSMObject);
182   int aStudyID = theStudy->StudyId();
183   SALOMEDS::Study_var aDSStudy = aStudyManager->GetStudyByID(aStudyID);
184   return aDSStudy._retn();
185 }
186
187 void GeometryGUI::Modified (bool theIsUpdateActions)
188 {
189   if ( SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() ) ) {
190     if ( SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) ) {
191       appStudy->Modified();
192       if ( theIsUpdateActions )
193         app->updateActions();
194     }
195   }
196 }
197
198 //=======================================================================
199 // function : GeometryGUI::GeometryGUI()
200 // purpose  : Constructor
201 //=======================================================================
202 GeometryGUI::GeometryGUI() :
203   SalomeApp_Module( "GEOM" )
204 {
205   if ( CORBA::is_nil( myComponentGeom ) )
206   {
207     Engines::EngineComponent_var comp =
208       SalomeApp_Application::lcc()->FindOrLoad_Component( "FactoryServer", "GEOM" );
209     myComponentGeom = GEOM::GEOM_Gen::_narrow( comp );
210   }
211
212   myActiveDialogBox = 0;
213
214   gp_Pnt origin = gp_Pnt(0., 0., 0.);
215   gp_Dir direction = gp_Dir(0., 0., 1.);
216   myWorkingPlane = gp_Ax3(origin, direction);
217
218   myDisplayer = 0;
219   myLocalSelectionMode = GEOM_ALLOBJECTS;
220
221   myCreationInfoWdg = 0;
222
223   connect( Material_ResourceMgr::resourceMgr(), SIGNAL( changed() ), this, SLOT( updateMaterials() ) );
224 }
225
226 //=======================================================================
227 // function : GeometryGUI::~GeometryGUI()
228 // purpose  : Destructor
229 //=======================================================================
230 GeometryGUI::~GeometryGUI()
231 {
232   while (!myOCCSelectors.isEmpty())
233     delete myOCCSelectors.takeFirst();
234
235   while (!myVTKSelectors.isEmpty())
236     delete myVTKSelectors.takeFirst();
237
238   qDeleteAll(myGUIMap);
239 }
240
241 //=======================================================================
242 // function : GeometryGUI::getLibrary()
243 // purpose  : get or load GUI library by name [ internal ]
244 //=======================================================================
245 typedef GEOMGUI* (*LibraryGUI)( GeometryGUI* );
246 GEOMGUI* GeometryGUI::getLibrary( const QString& libraryName )
247 {
248   if ( !myGUIMap.contains( libraryName ) ) {
249     // try to load library if it is not loaded yet
250 #ifndef WIN32
251     QString dirs = getenv( "LD_LIBRARY_PATH" );
252     QString sep  = ":";
253 #else
254     QString dirs = getenv( "PATH" );
255     QString sep  = ";";
256 #endif
257     if ( !dirs.isEmpty() ) {
258       QStringList dirList = dirs.split(sep, QString::SkipEmptyParts ); // skip empty entries
259       QListIterator<QString> it( dirList ); it.toBack();
260       while ( it.hasPrevious() ) {
261         QFileInfo fi( Qtx::addSlash( it.previous() ) + libraryName );
262         if ( fi.exists() ) {
263           OSD_SharedLibrary aSharedLibrary( fi.fileName().toLatin1().constData() );
264           bool res = aSharedLibrary.DlOpen( OSD_RTLD_LAZY );
265           if ( !res ) {
266             MESSAGE( "Can't open library : " << aSharedLibrary.DlError() );
267             continue; // continue search further
268           }
269           OSD_Function osdF = aSharedLibrary.DlSymb( "GetLibGUI" );
270           if ( osdF != NULL ) {
271             LibraryGUI func = (GEOMGUI* (*) (GeometryGUI*))osdF;
272             GEOMGUI* libGUI = (*func)( this );
273             if ( libGUI ) {
274               myGUIMap[ libraryName ] = libGUI;
275               break; // found and loaded!
276             }
277           }
278         }
279       }
280     }
281   }
282   return myGUIMap.contains( libraryName ) ? myGUIMap[ libraryName ] : 0;
283 }
284
285 //=======================================================================
286 // function : GeometryGUI::getPluginLibrary()
287 // purpose  : get or load GUI Plugin library by name [ internal ]
288 //=======================================================================
289 typedef GEOMPluginGUI* (*PluginLibraryGUI)( GeometryGUI* );
290 GEOMPluginGUI* GeometryGUI::getPluginLibrary( const QString& libraryName )
291 {
292   if ( !myGUIMap.contains( libraryName ) ) {
293     // try to load library if it is not loaded yet
294 #ifndef WIN32
295     QString dirs = getenv( "LD_LIBRARY_PATH" );
296     QString sep  = ":";
297 #else
298     QString dirs = getenv( "PATH" );
299     QString sep  = ";";
300 #endif
301     if ( !dirs.isEmpty() ) {
302       QStringList dirList = dirs.split(sep, QString::SkipEmptyParts ); // skip empty entries
303       QListIterator<QString> it( dirList ); it.toBack();
304       while ( it.hasPrevious() ) {
305         QFileInfo fi( Qtx::addSlash( it.previous() ) + libraryName );
306         if ( fi.exists() ) {
307           OSD_SharedLibrary aSharedLibrary( fi.fileName().toLatin1().constData() );
308           bool res = aSharedLibrary.DlOpen( OSD_RTLD_LAZY );
309           if ( !res ) {
310             MESSAGE( "Can't open library : " << aSharedLibrary.DlError() );
311             continue; // continue search further
312           }
313           OSD_Function osdF = aSharedLibrary.DlSymb( "GetLibGUI" );
314           if ( osdF != NULL ) {
315             PluginLibraryGUI func = (GEOMPluginGUI* (*) (GeometryGUI*))osdF;
316             GEOMPluginGUI* libGUI = (*func)( this );
317             if ( libGUI ) {
318               myGUIMap[ libraryName ] = libGUI;
319               break; // found and loaded!
320             }
321           }
322         }
323       }
324     }
325   }
326   return myGUIMap.contains( libraryName ) ? (GEOMPluginGUI*)myGUIMap[ libraryName ] : 0;
327 }
328
329 //=======================================================================
330 // function : GeometryGUI::ActiveWorkingPlane()
331 // purpose  : Activate Working Plane View
332 //=======================================================================
333 void GeometryGUI::ActiveWorkingPlane()
334 {
335   gp_Dir DZ = myWorkingPlane.Direction();
336   gp_Dir DY = myWorkingPlane.YDirection();
337
338   SUIT_ViewWindow* window = application()->desktop()->activeWindow();
339   bool ViewOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() );
340   bool ViewVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() );
341
342   if ( ViewOCC ) {
343     OCCViewer_ViewWindow* vw = dynamic_cast<OCCViewer_ViewWindow*>( window );
344     if ( vw ) {
345       Handle(V3d_View) view3d =  vw->getViewPort()->getView();
346
347       view3d->SetProj(DZ.X(), DZ.Y(), DZ.Z());
348       view3d->SetUp(DY.X(), DY.Y(), DY.Z());
349       vw->onViewFitAll();
350     }
351   }
352   else if ( ViewVTK ) {
353     SVTK_ViewWindow* vw = dynamic_cast<SVTK_ViewWindow*>( window );
354     if ( vw ) {
355       vtkCamera* camera = vw->getRenderer()->GetActiveCamera();
356
357       camera->SetPosition(DZ.X(), DZ.Y(), DZ.Z());
358       camera->SetViewUp(DY.X(), DY.Y(), DY.Z());
359       camera->SetFocalPoint(0,0,0);
360
361       vw->onFitAll();
362     }
363   }
364 }
365
366 //=======================================================================
367 // function : GeometryGUI::SetActiveDialogBox()
368 // purpose  : Set active dialog box
369 //=======================================================================
370 void GeometryGUI::SetActiveDialogBox( QDialog* aDlg )
371 {
372   myActiveDialogBox = (QDialog*)aDlg;
373 }
374
375 //=======================================================================
376 // function : GeometryGUI::EmitSignalDeactivateDialog()
377 // purpose  : Emit a signal to deactivate the active dialog Box
378 //=======================================================================
379 void GeometryGUI::EmitSignalDeactivateDialog()
380 {
381   emit SignalDeactivateActiveDialog();
382 }
383
384 //=======================================================================
385 // function : GeometryGUI::EmitSignalCloseAllDialogs()
386 // purpose  : Emit a signal to close all non modal dialogs box
387 //=======================================================================
388 void GeometryGUI::EmitSignalCloseAllDialogs()
389 {
390   emit SignalCloseAllDialogs();
391 }
392
393 //=======================================================================
394 // function : GeometryGUI::EmitSignalDefaultStepValueChanged()
395 // purpose  : Emit a signal to inform that default real spin box step has
396 //            been changed
397 //=======================================================================
398 void GeometryGUI::EmitSignalDefaultStepValueChanged(double newVal)
399 {
400   emit SignalDefaultStepValueChanged(newVal);
401 }
402
403 //=======================================================================
404 // function : GeometryGUI::OnGUIEvent()
405 // purpose  : common slot for all menu/toolbar actions
406 //=======================================================================
407 void GeometryGUI::OnGUIEvent()
408 {
409   const QObject* obj = sender();
410   if ( !obj || !obj->inherits( "QAction" ) )
411     return;
412   int id = actionId((QAction*)obj);
413   if ( id != -1 )
414     OnGUIEvent( id );
415 }
416
417 //=======================================================================
418 // function : GeometryGUI::OnGUIEvent()
419 // purpose  : manage all events on GUI [static]
420 //=======================================================================
421 void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam )
422 {
423   SUIT_Application* anApp = application();
424   if (!anApp) return;
425   SUIT_Desktop* desk = anApp->desktop();
426
427   // check type of the active viewframe
428   SUIT_ViewWindow* window = desk->activeWindow();
429   bool ViewOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() );
430   bool ViewVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() );
431   // if current viewframe is not of OCC and not of VTK type - return immediately
432   // fix for IPAL8958 - allow some commands to execute even when NO viewer is active (rename for example)
433   QList<int> NotViewerDependentCommands;
434   NotViewerDependentCommands << GEOMOp::OpDelete
435                              << GEOMOp::OpShow
436                              << GEOMOp::OpShowOnly
437                              << GEOMOp::OpShowOnlyChildren
438                              << GEOMOp::OpDiscloseChildren
439                              << GEOMOp::OpConcealChildren
440                              << GEOMOp::OpUnpublishObject
441                              << GEOMOp::OpPublishObject
442                              << GEOMOp::OpPointMarker
443                              << GEOMOp::OpCreateFolder
444                              << GEOMOp::OpSortChildren;
445   if ( !ViewOCC && !ViewVTK && !NotViewerDependentCommands.contains( id ) ) {
446     // activate OCC viewer
447     getApp()->getViewManager(OCCViewer_Viewer::Type(), /*create=*/true);
448   }
449
450   // fix for IPAL9103, point 2
451   if ( CORBA::is_nil( GetGeomGen() ) ) {
452     SUIT_MessageBox::critical( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_GET_ENGINE" ), tr( "GEOM_BUT_OK" ) );
453     return;
454   }
455
456   QString libName;
457   // find corresponding GUI library
458   switch ( id ) {
459   case GEOMOp::OpOriginAndVectors:   // MENU BASIC - ORIGIN AND BASE VECTORS
460     createOriginAndBaseVectors(); // internal operation
461     return;
462   case GEOMOp::OpImport:             // MENU FILE - IMPORT
463   case GEOMOp::OpExport:             // MENU FILE - EXPORT
464   case GEOMOp::OpSelectVertex:       // POPUP MENU - SELECT ONLY - VERTEX
465   case GEOMOp::OpSelectEdge:         // POPUP MENU - SELECT ONLY - EDGE
466   case GEOMOp::OpSelectWire:         // POPUP MENU - SELECT ONLY - WIRE
467   case GEOMOp::OpSelectFace:         // POPUP MENU - SELECT ONLY - FACE
468   case GEOMOp::OpSelectShell:        // POPUP MENU - SELECT ONLY - SHELL
469   case GEOMOp::OpSelectSolid:        // POPUP MENU - SELECT ONLY - SOLID
470   case GEOMOp::OpSelectCompound:     // POPUP MENU - SELECT ONLY - COMPOUND
471   case GEOMOp::OpSelectAll:          // POPUP MENU - SELECT ONLY - SELECT ALL
472   case GEOMOp::OpDelete:             // MENU EDIT - DELETE
473   case GEOMOp::OpCheckGeom:          // MENU TOOLS - CHECK GEOMETRY
474   case GEOMOp::OpMaterialsLibrary:   // MENU TOOLS - MATERIALS LIBRARY
475   case GEOMOp::OpDeflection:         // POPUP MENU - DEFLECTION COEFFICIENT
476   case GEOMOp::OpColor:              // POPUP MENU - COLOR
477   case GEOMOp::OpSetTexture:         // POPUP MENU - SETTEXTURE
478   case GEOMOp::OpTransparency:       // POPUP MENU - TRANSPARENCY
479   case GEOMOp::OpIncrTransparency:   // SHORTCUT   - INCREASE TRANSPARENCY
480   case GEOMOp::OpDecrTransparency:   // SHORTCUT   - DECREASE TRANSPARENCY
481   case GEOMOp::OpIsos:               // POPUP MENU - ISOS
482   case GEOMOp::OpIncrNbIsos:         // SHORTCUT   - INCREASE NB ISOS
483   case GEOMOp::OpDecrNbIsos:         // SHORTCUT   - DECREASE NB ISOS
484   case GEOMOp::OpAutoColor:          // POPUP MENU - AUTO COLOR
485   case GEOMOp::OpNoAutoColor:        // POPUP MENU - DISABLE AUTO COLOR
486   case GEOMOp::OpDiscloseChildren:   // POPUP MENU - DISCLOSE CHILD ITEMS
487   case GEOMOp::OpConcealChildren:    // POPUP MENU - CONCEAL CHILD ITEMS
488   case GEOMOp::OpUnpublishObject:    // POPUP MENU - UNPUBLISH
489   case GEOMOp::OpPublishObject:      // ROOT GEOM OBJECT - POPUP MENU - PUBLISH
490   case GEOMOp::OpPointMarker:        // POPUP MENU - POINT MARKER
491   case GEOMOp::OpMaterialProperties: // POPUP MENU - MATERIAL PROPERTIES
492   case GEOMOp::OpPredefMaterial:     // POPUP MENU - <SOME MATERIAL>
493   case GEOMOp::OpPredefMaterCustom:  // POPUP MENU - MATERIAL PROPERTIES - CUSTOM...
494   case GEOMOp::OpEdgeWidth:          // POPUP MENU - LINE WIDTH - EDGE WIDTH
495   case GEOMOp::OpIsosWidth:          // POPUP MENU - LINE WIDTH - ISOS WIDTH
496   case GEOMOp::OpBringToFront:       // POPUP MENU - BRING TO FRONT
497   case GEOMOp::OpClsBringToFront:    //
498   case GEOMOp::OpCreateFolder:       // POPUP MENU - CREATE FOLDER
499   case GEOMOp::OpSortChildren:       // POPUP MENU - SORT CHILD ITEMS
500     libName = "GEOMToolsGUI";
501     break;
502   case GEOMOp::OpDMWireframe:        // MENU VIEW - WIREFRAME
503   case GEOMOp::OpDMShading:          // MENU VIEW - SHADING
504   case GEOMOp::OpDMShadingWithEdges: // MENU VIEW - SHADING
505   case GEOMOp::OpShowAll:            // MENU VIEW - SHOW ALL
506   case GEOMOp::OpShowOnly:           // MENU VIEW - DISPLAY ONLY
507   case GEOMOp::OpShowOnlyChildren:   // MENU VIEW - SHOW ONLY CHILDREN
508   case GEOMOp::OpHideAll:            // MENU VIEW - ERASE ALL
509   case GEOMOp::OpHide:               // MENU VIEW - ERASE
510   case GEOMOp::OpShow:               // MENU VIEW - DISPLAY
511   case GEOMOp::OpSwitchVectors:      // MENU VIEW - VECTOR MODE
512   case GEOMOp::OpWireframe:          // POPUP MENU - WIREFRAME
513   case GEOMOp::OpShading:            // POPUP MENU - SHADING
514   case GEOMOp::OpShadingWithEdges:   // POPUP MENU - SHADING WITH EDGES
515   case GEOMOp::OpTexture:            // POPUP MENU - TEXTURE
516   case GEOMOp::OpVectors:            // POPUP MENU - VECTORS
517     libName = "DisplayGUI";
518     break;
519   case GEOMOp::OpPoint:              // MENU BASIC - POINT
520   case GEOMOp::OpLine:               // MENU BASIC - LINE
521   case GEOMOp::OpCircle:             // MENU BASIC - CIRCLE
522   case GEOMOp::OpEllipse:            // MENU BASIC - ELLIPSE
523   case GEOMOp::OpArc:                // MENU BASIC - ARC
524   case GEOMOp::OpVector:             // MENU BASIC - VECTOR
525   case GEOMOp::OpPlane:              // MENU BASIC - PLANE
526   case GEOMOp::OpCurve:              // MENU BASIC - CURVE
527   case GEOMOp::OpLCS:                // MENU BASIC - LOCAL COORDINATE SYSTEM
528     libName = "BasicGUI";
529     break;
530   case GEOMOp::OpBox:                // MENU PRIMITIVE - BOX
531   case GEOMOp::OpCylinder:           // MENU PRIMITIVE - CYLINDER
532   case GEOMOp::OpSphere:             // MENU PRIMITIVE - SPHERE
533   case GEOMOp::OpTorus:              // MENU PRIMITIVE - TORUS
534   case GEOMOp::OpCone:               // MENU PRIMITIVE - CONE
535   case GEOMOp::OpRectangle:          // MENU PRIMITIVE - FACE
536   case GEOMOp::OpDisk:               // MENU PRIMITIVE - DISK
537     libName = "PrimitiveGUI";
538     break;
539   case GEOMOp::OpPrism:              // MENU GENERATION - PRISM
540   case GEOMOp::OpRevolution:         // MENU GENERATION - REVOLUTION
541   case GEOMOp::OpFilling:            // MENU GENERATION - FILLING
542   case GEOMOp::OpPipe:               // MENU GENERATION - PIPE
543   case GEOMOp::OpPipePath:           // MENU GENERATION - RESTORE PATH
544     libName = "GenerationGUI";
545     break;
546   case GEOMOp::Op2dSketcher:         // MENU ENTITY - SKETCHER
547   case GEOMOp::Op3dSketcher:         // MENU ENTITY - 3D SKETCHER
548   case GEOMOp::OpExplode:            // MENU ENTITY - EXPLODE
549 #ifdef WITH_OPENCV
550   case GEOMOp::OpFeatureDetect:      // MENU ENTITY - FEATURE DETECTION
551 #endif
552   case GEOMOp::OpPictureImport:      // MENU ENTITY - IMPORT PICTURE IN VIEWER
553   case GEOMOp::OpCreateField:        // MENU FIELD - CREATE FIELD
554   case GEOMOp::OpEditField:          // MENU FIELD - EDIT FIELD
555   case GEOMOp::OpEditFieldPopup:     // POPUP MENU - EDIT FIELD
556     libName = "EntityGUI";
557     break;
558   case GEOMOp::OpEdge:               // MENU BUILD - EDGE
559   case GEOMOp::OpWire:               // MENU BUILD - WIRE
560   case GEOMOp::OpFace:               // MENU BUILD - FACE
561   case GEOMOp::OpShell:              // MENU BUILD - SHELL
562   case GEOMOp::OpSolid:              // MENU BUILD - SOLID
563   case GEOMOp::OpCompound:           // MENU BUILD - COMPUND
564     libName = "BuildGUI";
565     break;
566   case GEOMOp::OpFuse:               // MENU BOOLEAN - FUSE
567   case GEOMOp::OpCommon:             // MENU BOOLEAN - COMMON
568   case GEOMOp::OpCut:                // MENU BOOLEAN - CUT
569   case GEOMOp::OpSection:            // MENU BOOLEAN - SECTION
570     libName = "BooleanGUI";
571     break;
572   case GEOMOp::OpTranslate:          // MENU TRANSFORMATION - TRANSLATION
573   case GEOMOp::OpRotate:             // MENU TRANSFORMATION - ROTATION
574   case GEOMOp::OpChangeLoc:          // MENU TRANSFORMATION - LOCATION
575   case GEOMOp::OpMirror:             // MENU TRANSFORMATION - MIRROR
576   case GEOMOp::OpScale:              // MENU TRANSFORMATION - SCALE
577   case GEOMOp::OpOffset:             // MENU TRANSFORMATION - OFFSET
578   case GEOMOp::OpProjection:         // MENU TRANSFORMATION - PROJECTION
579   case GEOMOp::OpMultiTranslate:     // MENU TRANSFORMATION - MULTI-TRANSLATION
580   case GEOMOp::OpMultiRotate:        // MENU TRANSFORMATION - MULTI-ROTATION
581   case GEOMOp::OpReimport:           // CONTEXT(POPUP) MENU - RELOAD_IMPORTED
582     libName = "TransformationGUI";
583     break;
584   case GEOMOp::OpPartition:          // MENU OPERATION - PARTITION
585   case GEOMOp::OpArchimede:          // MENU OPERATION - ARCHIMEDE
586   case GEOMOp::OpFillet3d:           // MENU OPERATION - FILLET
587   case GEOMOp::OpChamfer:            // MENU OPERATION - CHAMFER
588   case GEOMOp::OpClipping:           // MENU OPERATION - CLIPPING RANGE
589   case GEOMOp::OpShapesOnShape:      // MENU OPERATION - GET SHAPES ON SHAPE
590   case GEOMOp::OpFillet2d:           // MENU OPERATION - FILLET 2D
591   case GEOMOp::OpFillet1d:           // MENU OPERATION - FILLET 1D
592   case GEOMOp::OpSharedShapes:       // MENU OPERATION - GET SHARED SHAPES
593   case GEOMOp::OpExtrudedBoss:       // MENU OPERATION - EXTRUDED BOSS
594   case GEOMOp::OpExtrudedCut:        // MENU OPERATION - EXTRUDED CUT
595 #ifdef DEBUG_CURVE_CREATOR  
596   // for debug purposes, to be removed
597   case GEOMOp::OpCurveCreator:       // MENU OPERATION - CURVE CREATOR
598 #endif
599     libName = "OperationGUI";
600     break;
601   case GEOMOp::OpSewing:             // MENU REPAIR - SEWING
602   case GEOMOp::OpSuppressFaces:      // MENU REPAIR - SUPPRESS FACES
603   case GEOMOp::OpSuppressHoles:      // MENU REPAIR - SUPPRESS HOLE
604   case GEOMOp::OpShapeProcess:       // MENU REPAIR - SHAPE PROCESSING
605   case GEOMOp::OpCloseContour:       // MENU REPAIR - CLOSE CONTOUR
606   case GEOMOp::OpRemoveIntWires:     // MENU REPAIR - REMOVE INTERNAL WIRES
607   case GEOMOp::OpAddPointOnEdge:     // MENU REPAIR - ADD POINT ON EDGE
608   case GEOMOp::OpFreeBoundaries:     // MENU MEASURE - FREE BOUNDARIES
609   case GEOMOp::OpFreeFaces:          // MENU MEASURE - FREE FACES
610   case GEOMOp::OpOrientation:        // MENU REPAIR - CHANGE ORIENTATION
611   case GEOMOp::OpGlueFaces:          // MENU REPAIR - GLUE FACES
612   case GEOMOp::OpGlueEdges:          // MENU REPAIR - GLUE EDGES
613   case GEOMOp::OpLimitTolerance:     // MENU REPAIR - LIMIT TOLERANCE
614   case GEOMOp::OpRemoveWebs:         // MENU REPAIR - REMOVE INTERNAL FACES
615   case GEOMOp::OpRemoveExtraEdges:   // MENU REPAIR - REMOVE EXTRA EDGES
616   case GEOMOp::OpFuseEdges:          // MENU REPAIR - FUSE COLLINEAR EDGES
617   case GEOMOp::OpUnionFaces:         // MENU REPAIR - UNION FACES
618     libName = "RepairGUI";
619     break;
620   case GEOMOp::OpProperties:         // MENU MEASURE - PROPERTIES
621   case GEOMOp::OpCenterMass:         // MENU MEASURE - CDG
622   case GEOMOp::OpInertia:            // MENU MEASURE - INERTIA
623   case GEOMOp::OpNormale:            // MENU MEASURE - NORMALE
624   case GEOMOp::OpBoundingBox:        // MENU MEASURE - BOUNDING BOX
625   case GEOMOp::OpMinDistance:        // MENU MEASURE - MIN DISTANCE
626   case GEOMOp::OpAngle:              // MENU MEASURE - ANGLE
627   case GEOMOp::OpTolerance:          // MENU MEASURE - TOLERANCE
628   case GEOMOp::OpWhatIs:             // MENU MEASURE - WHATIS
629   case GEOMOp::OpCheckShape:         // MENU MEASURE - CHECK
630   case GEOMOp::OpCheckCompound:      // MENU MEASURE - CHECK COMPOUND OF BLOCKS
631   case GEOMOp::OpGetNonBlocks:       // MENU MEASURE - Get NON BLOCKS
632   case GEOMOp::OpPointCoordinates:   // MENU MEASURE - POINT COORDINATES
633   case GEOMOp::OpCheckSelfInters:    // MENU MEASURE - CHECK SELF INTERSECTIONS
634     libName = "MeasureGUI";
635     break;
636   case GEOMOp::OpGroupCreate:        // MENU GROUP - CREATE
637   case GEOMOp::OpGroupCreatePopup:   // POPUP MENU - CREATE GROUP
638   case GEOMOp::OpGroupEdit:          // MENU GROUP - EDIT
639   case GEOMOp::OpGroupUnion:         // MENU GROUP - UNION
640   case GEOMOp::OpGroupIntersect:     // MENU GROUP - INTERSECT
641   case GEOMOp::OpGroupCut:           // MENU GROUP - CUT
642     libName = "GroupGUI";
643     break;
644   case GEOMOp::OpHexaSolid:          // MENU BLOCKS - HEXAHEDRAL SOLID
645   case GEOMOp::OpMultiTransform:     // MENU BLOCKS - MULTI-TRANSFORMATION
646   case GEOMOp::OpQuadFace:           // MENU BLOCKS - QUADRANGLE FACE
647   case GEOMOp::OpPropagate:          // MENU BLOCKS - PROPAGATE
648   case GEOMOp::OpExplodeBlock:       // MENU BLOCKS - EXPLODE ON BLOCKS
649     libName = "BlocksGUI";
650     break;
651   case GEOMOp::OpExportXAO:          // MENU NEW ENTITY - IMPORTEXPORT - EXPORTXAO
652   case GEOMOp::OpImportXAO:          // MENU NEW ENTITY - IMPORTEXPORT - IMPORTXAO
653     libName = "ImportExportGUI";
654     break;
655   //case GEOMOp::OpAdvancedNoOp:       // NO OPERATION (advanced operations base)
656   //case GEOMOp::OpPipeTShape:         // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE
657   //case GEOMOp::OpPipeTShapeGroups:     // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE GROUPS
658   //case GEOMOp::OpDividedDisk:           // MENU NEW ENTITY - ADVANCED - DIVIDEDDISK
659   //case GEOMOp::OpDividedCylinder:           // MENU NEW ENTITY - ADVANCED - DIVIDEDCYLINDER
660   //case GEOMOp::OpSmoothingSurface:           // MENU NEW ENTITY - ADVANCED - SMOOTHINGSURFACE
661     //@@ insert new functions before this line @@ do not remove this line @@ do not remove this line @@//
662     //libName = "AdvancedGUI";
663     //break;
664   default:
665     if (myPluginActions.contains(id)) {
666       libName = myPluginActions[id].first;
667
668       GEOMPluginGUI* library = 0;
669       if ( !libName.isEmpty() ) {
670 #ifndef WIN32
671         libName = QString( "lib" ) + libName + ".so";
672 #else
673         libName = libName + ".dll";
674 #endif
675         library = getPluginLibrary( libName );
676       }
677
678       // call method of corresponding GUI library
679       if ( library ) {
680         //QString action ("%1");
681         //action = action.arg(id);
682
683         //if( !theParam.isValid() )
684           library->OnGUIEvent( myPluginActions[id].second, desk );
685         //else
686         //  library->OnGUIEvent( id, desk, theParam);
687       }
688       else
689         SUIT_MessageBox::critical( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_LIB_NOT_FOUND" ), tr( "GEOM_BUT_OK" ) );
690
691       updateCreationInfo();
692       return;
693     }
694     break;
695   }
696
697   GEOMGUI* library = 0;
698   if ( !libName.isEmpty() ) {
699 #ifndef WIN32
700     libName = QString( "lib" ) + libName + ".so";
701 #else
702     libName = libName + ".dll";
703 #endif
704     library = getLibrary( libName );
705   }
706
707   // call method of corresponding GUI library
708   if ( library ) {
709     if( !theParam.isValid() )
710       library->OnGUIEvent( id, desk );
711     else
712       library->OnGUIEvent( id, desk, theParam);
713   }
714   else
715     SUIT_MessageBox::critical( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_LIB_NOT_FOUND" ), tr( "GEOM_BUT_OK" ) );
716
717   updateCreationInfo();
718 }
719
720 //=================================================================================
721 // function : GeometryGUI::activateOperation()
722 // purpose  :
723 //=================================================================================
724 bool GeometryGUI::activateOperation( int actionId )
725 {
726   OnGUIEvent(actionId);
727   return true;
728 }
729
730 //=================================================================================
731 // function : GeometryGUI::activateOperation()
732 // purpose  :
733 //=================================================================================
734 bool GeometryGUI::activateOperation( const QString& actionId )
735 {
736   bool isOk = false;
737
738   int id = actionId.toInt(&isOk);
739   if (isOk)
740     OnGUIEvent(id);
741
742   return isOk;
743 }
744
745 //=================================================================================
746 // function : GeometryGUI::activateOperation()
747 // purpose  :
748 //=================================================================================
749 bool GeometryGUI::activateOperation( const QString& actionId, const QString& plugin )
750 {
751   bool isOk = false;
752
753   QString pluginLib = plugin;
754   // TODO: if <plugin> is a plugin name, find plugin library name
755   if (myPluginLibs.contains(plugin))
756     pluginLib = myPluginLibs[plugin];
757
758   QMap<int, PluginAction>::iterator actionsIter = myPluginActions.begin();
759   for (; actionsIter != myPluginActions.end(); ++actionsIter) {
760     const PluginAction& anAction = actionsIter.value();
761     if (anAction.first == pluginLib && anAction.second == actionId) {
762       // activate operation
763       OnGUIEvent(actionsIter.key());
764       isOk = true;
765     }
766   }
767
768   return isOk;
769 }
770
771 //=================================================================================
772 // function : GeometryGUI::OnKeyPress()
773 // purpose  : Called when any key is pressed by user [static]
774 //=================================================================================
775 void GeometryGUI::OnKeyPress( SUIT_ViewWindow* w, QKeyEvent* e )
776 {
777   if ( !application() )
778     return;
779   foreach ( GEOMGUI* lib, myGUIMap )
780     lib->OnKeyPress( e, application()->desktop(), w );
781 }
782
783 //=================================================================================
784 // function : GeometryGUI::OnMouseMove()
785 // purpose  : Manages mouse move events [static]
786 //=================================================================================
787 void GeometryGUI::OnMouseMove( SUIT_ViewWindow* w, QMouseEvent* e )
788 {
789   if ( !application() )
790     return;
791   foreach ( GEOMGUI* lib, myGUIMap )
792     lib->OnMouseMove( e, application()->desktop(), w );
793 }
794
795 //=================================================================================
796 // function : GeometryGUI::OnMouseRelease()
797 // purpose  : Manages mouse release events [static]
798 //=================================================================================
799 void GeometryGUI::OnMouseRelease( SUIT_ViewWindow* w, QMouseEvent* e )
800 {
801   if ( !application() )
802     return;
803   foreach ( GEOMGUI* lib, myGUIMap )
804     lib->OnMouseRelease( e, application()->desktop(), w );
805 }
806
807 //=================================================================================
808 // function : GeometryGUI::OnMousePress()
809 // purpose  : Manage mouse press events [static]
810 //=================================================================================
811 void GeometryGUI::OnMousePress( SUIT_ViewWindow* w, QMouseEvent* e )
812 {
813   if ( !application() )
814     return;
815   foreach ( GEOMGUI* lib, myGUIMap )
816     lib->OnMousePress( e, application()->desktop(), w );
817 }
818
819 //=======================================================================
820 // function : createGeomAction
821 // purpose  :
822 //=======================================================================
823 void GeometryGUI::createGeomAction( const int id, const QString& label, const QString& icolabel,
824                                     const int accel, const bool toggle, const QString& shortcutAction )
825 {
826   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
827   QPixmap icon = icolabel.isEmpty() ? resMgr->loadPixmap( "GEOM", tr( (QString( "ICO_" )+label).toLatin1().constData() ), false )
828                                     : resMgr->loadPixmap( "GEOM", tr( icolabel.toLatin1().constData() ) );
829   createAction( id,
830                 tr( QString( "TOP_%1" ).arg( label ).toLatin1().constData() ),
831                 icon,
832                 tr( QString( "MEN_%1" ).arg( label ).toLatin1().constData() ),
833                 tr( QString( "STB_%1" ).arg( label ).toLatin1().constData() ),
834                 accel,
835                 application()->desktop(),
836                 toggle,
837                 this, SLOT( OnGUIEvent() ),
838                 shortcutAction );
839 }
840
841 //=======================================================================
842 // function : createOriginAndBaseVectors
843 // purpose  :
844 //=======================================================================
845 void GeometryGUI::createOriginAndBaseVectors()
846 {
847   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
848   if ( appStudy ) {
849     _PTR(Study) studyDS = appStudy->studyDS();
850     if ( studyDS && !CORBA::is_nil( GetGeomGen() ) ) {
851       GEOM::GEOM_IBasicOperations_var aBasicOperations = GetGeomGen()->GetIBasicOperations( studyDS->StudyId() );
852       if ( !aBasicOperations->_is_nil() ) {
853         SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
854         double aLength = aResourceMgr->doubleValue( "Geometry", "base_vectors_length", 1.0 );
855         GEOM::GEOM_Object_var anOrigin = aBasicOperations->MakePointXYZ( 0.0, 0.0, 0.0 );
856         GEOM::GEOM_Object_var anOX = aBasicOperations->MakeVectorDXDYDZ( aLength, 0.0, 0.0 );
857         GEOM::GEOM_Object_var anOY = aBasicOperations->MakeVectorDXDYDZ( 0.0, aLength, 0.0 );
858         GEOM::GEOM_Object_var anOZ = aBasicOperations->MakeVectorDXDYDZ( 0.0, 0.0, aLength );
859
860         SALOMEDS::Study_var aDSStudy = ClientStudyToStudy( studyDS );
861         GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOrigin, "O" );
862         GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOX, "OX" );
863         GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOY, "OY" );
864         GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOZ, "OZ" );
865
866         getApp()->updateObjectBrowser( true );
867       }
868     }
869   }
870 }
871
872 //=======================================================================
873 // function : GeometryGUI::initialize()
874 // purpose  : Called when GEOM module is created
875 //=======================================================================
876 void GeometryGUI::initialize( CAM_Application* app )
877 {
878   SalomeApp_Module::initialize( app );
879
880   // ----- create actions --------------
881
882   createGeomAction( GEOMOp::OpImport,     "IMPORT", "", Qt::ControlModifier + Qt::Key_I );
883   createGeomAction( GEOMOp::OpExport,     "EXPORT", "", Qt::ControlModifier + Qt::Key_E );
884
885   createGeomAction( GEOMOp::OpDelete,     "DELETE", "", Qt::Key_Delete );
886
887   createGeomAction( GEOMOp::OpPoint,      "POINT" );
888   createGeomAction( GEOMOp::OpLine,       "LINE" );
889   createGeomAction( GEOMOp::OpCircle,     "CIRCLE" );
890   createGeomAction( GEOMOp::OpEllipse,    "ELLIPSE" );
891   createGeomAction( GEOMOp::OpArc,        "ARC" );
892   createGeomAction( GEOMOp::OpCurve,      "CURVE" );
893   createGeomAction( GEOMOp::OpVector,     "VECTOR" );
894   createGeomAction( GEOMOp::OpPlane,      "PLANE" );
895   createGeomAction( GEOMOp::OpLCS,        "LOCAL_CS" );
896   createGeomAction( GEOMOp::OpOriginAndVectors, "ORIGIN_AND_VECTORS" );
897
898   createGeomAction( GEOMOp::OpBox,        "BOX" );
899   createGeomAction( GEOMOp::OpCylinder,   "CYLINDER" );
900   createGeomAction( GEOMOp::OpSphere,     "SPHERE" );
901   createGeomAction( GEOMOp::OpTorus,      "TORUS" );
902   createGeomAction( GEOMOp::OpCone,       "CONE" );
903   createGeomAction( GEOMOp::OpRectangle,  "RECTANGLE" );
904   createGeomAction( GEOMOp::OpDisk,       "DISK" );
905
906   createGeomAction( GEOMOp::OpPrism,       "EXTRUSION" );
907   createGeomAction( GEOMOp::OpRevolution,  "REVOLUTION" );
908   createGeomAction( GEOMOp::OpFilling,     "FILLING" );
909   createGeomAction( GEOMOp::OpPipe,        "PIPE" );
910   createGeomAction( GEOMOp::OpPipePath,    "PIPE_PATH" );
911
912   createGeomAction( GEOMOp::OpGroupCreate, "GROUP_CREATE" );
913   createGeomAction( GEOMOp::OpGroupEdit,   "GROUP_EDIT" );
914   createGeomAction( GEOMOp::OpGroupUnion,  "GROUP_UNION" );
915   createGeomAction( GEOMOp::OpGroupIntersect, "GROUP_INTERSECT" );
916   createGeomAction( GEOMOp::OpGroupCut,    "GROUP_CUT" );
917
918   createGeomAction( GEOMOp::OpCreateField, "FIELD_CREATE" );
919   createGeomAction( GEOMOp::OpEditField,   "FIELD_EDIT" );
920
921   createGeomAction( GEOMOp::OpReimport,    "RELOAD_IMPORTED" );
922
923   createGeomAction( GEOMOp::OpQuadFace,    "Q_FACE" );
924   createGeomAction( GEOMOp::OpHexaSolid,   "HEX_SOLID" );
925
926   createGeomAction( GEOMOp::Op2dSketcher,  "SKETCH" );
927   createGeomAction( GEOMOp::Op3dSketcher,  "3DSKETCH" );
928   createGeomAction( GEOMOp::OpExplode,     "EXPLODE" );
929 #ifdef WITH_OPENCV
930   createGeomAction( GEOMOp::OpFeatureDetect,"FEATURE_DETECTION" );
931 #endif
932   createGeomAction( GEOMOp::OpPictureImport,"PICTURE_IMPORT" );
933
934   createGeomAction( GEOMOp::OpEdge,        "EDGE" );
935   createGeomAction( GEOMOp::OpWire,        "WIRE" );
936   createGeomAction( GEOMOp::OpFace,        "FACE" );
937   createGeomAction( GEOMOp::OpShell,       "SHELL" );
938   createGeomAction( GEOMOp::OpSolid,       "SOLID" );
939   createGeomAction( GEOMOp::OpCompound,    "COMPOUND" );
940
941   createGeomAction( GEOMOp::OpFuse,        "FUSE" );
942   createGeomAction( GEOMOp::OpCommon,      "COMMON" );
943   createGeomAction( GEOMOp::OpCut,         "CUT" );
944   createGeomAction( GEOMOp::OpSection,     "SECTION" );
945
946   createGeomAction( GEOMOp::OpTranslate,      "TRANSLATION" );
947   createGeomAction( GEOMOp::OpRotate,         "ROTATION" );
948   createGeomAction( GEOMOp::OpChangeLoc,      "MODIFY_LOCATION" );
949   createGeomAction( GEOMOp::OpMirror,         "MIRROR" );
950   createGeomAction( GEOMOp::OpScale,          "SCALE" );
951   createGeomAction( GEOMOp::OpOffset,         "OFFSET" );
952   createGeomAction( GEOMOp::OpProjection,     "PROJECTION" );
953   createGeomAction( GEOMOp::OpMultiTranslate, "MUL_TRANSLATION" );
954   createGeomAction( GEOMOp::OpMultiRotate,    "MUL_ROTATION" );
955
956   createGeomAction( GEOMOp::OpPartition,      "PARTITION" );
957   createGeomAction( GEOMOp::OpArchimede,      "ARCHIMEDE" );
958   createGeomAction( GEOMOp::OpFillet3d,       "FILLET" );
959   createGeomAction( GEOMOp::OpChamfer,        "CHAMFER" );
960   //createGeomAction( GEOMOp::OpClipping,        "CLIPPING" );
961   createGeomAction( GEOMOp::OpShapesOnShape,  "GET_SHAPES_ON_SHAPE" );
962   createGeomAction( GEOMOp::OpSharedShapes,   "GET_SHARED_SHAPES" );
963   createGeomAction( GEOMOp::OpExtrudedCut,    "EXTRUDED_CUT" );
964   createGeomAction( GEOMOp::OpExtrudedBoss,   "EXTRUDED_BOSS" );
965 #ifdef DEBUG_CURVE_CREATOR
966   // for debug purposes, to be removed
967   createGeomAction( GEOMOp::OpCurveCreator,   "CURVE_CREATOR" );
968 #endif
969   createGeomAction( GEOMOp::OpFillet1d,       "FILLET_1D" );
970   createGeomAction( GEOMOp::OpFillet2d,       "FILLET_2D" );
971
972   createGeomAction( GEOMOp::OpMultiTransform, "MUL_TRANSFORM" );
973   createGeomAction( GEOMOp::OpExplodeBlock,   "EXPLODE_BLOCKS" );
974   createGeomAction( GEOMOp::OpPropagate,      "PROPAGATE" );
975
976   createGeomAction( GEOMOp::OpSewing,           "SEWING" );
977   createGeomAction( GEOMOp::OpGlueFaces,        "GLUE_FACES" );
978   createGeomAction( GEOMOp::OpGlueEdges,        "GLUE_EDGES" );
979   createGeomAction( GEOMOp::OpLimitTolerance,   "LIMIT_TOLERANCE" );
980   createGeomAction( GEOMOp::OpSuppressFaces,    "SUPPRESS_FACES" );
981   createGeomAction( GEOMOp::OpSuppressHoles,    "SUPPERSS_HOLES" );
982   createGeomAction( GEOMOp::OpShapeProcess,     "SHAPE_PROCESS" );
983   createGeomAction( GEOMOp::OpCloseContour,     "CLOSE_CONTOUR" );
984   createGeomAction( GEOMOp::OpRemoveIntWires,   "SUPPRESS_INT_WIRES" );
985   createGeomAction( GEOMOp::OpAddPointOnEdge,   "POINT_ON_EDGE" );
986   createGeomAction( GEOMOp::OpFreeBoundaries,   "CHECK_FREE_BNDS" );
987   createGeomAction( GEOMOp::OpFreeFaces,        "CHECK_FREE_FACES" );
988   createGeomAction( GEOMOp::OpOrientation,      "CHANGE_ORIENTATION" );
989   createGeomAction( GEOMOp::OpRemoveWebs,       "REMOVE_WEBS" );
990   createGeomAction( GEOMOp::OpRemoveExtraEdges, "REMOVE_EXTRA_EDGES" );
991   createGeomAction( GEOMOp::OpFuseEdges,        "FUSE_EDGES" );
992   createGeomAction( GEOMOp::OpUnionFaces,       "UNION_FACES" );
993
994   createGeomAction( GEOMOp::OpPointCoordinates, "POINT_COORDS" );
995   createGeomAction( GEOMOp::OpProperties,       "BASIC_PROPS" );
996   createGeomAction( GEOMOp::OpCenterMass,       "MASS_CENTER" );
997   createGeomAction( GEOMOp::OpInertia,          "INERTIA" );
998   createGeomAction( GEOMOp::OpNormale,          "NORMALE" );
999   createGeomAction( GEOMOp::OpBoundingBox,      "BND_BOX" );
1000   createGeomAction( GEOMOp::OpMinDistance,      "MIN_DIST" );
1001   createGeomAction( GEOMOp::OpAngle,            "MEASURE_ANGLE" );
1002
1003   createGeomAction( GEOMOp::OpTolerance,        "TOLERANCE" );
1004   createGeomAction( GEOMOp::OpWhatIs,           "WHAT_IS" );
1005   createGeomAction( GEOMOp::OpCheckShape,       "CHECK" );
1006   createGeomAction( GEOMOp::OpCheckCompound,    "CHECK_COMPOUND" );
1007   createGeomAction( GEOMOp::OpGetNonBlocks,     "GET_NON_BLOCKS" );
1008   createGeomAction( GEOMOp::OpCheckSelfInters,  "CHECK_SELF_INTERSECTIONS" );
1009
1010 #ifdef _DEBUG_ // PAL16821
1011   createGeomAction( GEOMOp::OpCheckGeom,        "CHECK_GEOMETRY" );
1012 #endif
1013
1014   createGeomAction( GEOMOp::OpMaterialsLibrary,   "MATERIALS_LIBRARY" );
1015   createGeomAction( GEOMOp::OpDMWireframe,        "WIREFRAME" );
1016   createGeomAction( GEOMOp::OpDMShading,          "SHADING" );
1017   createGeomAction( GEOMOp::OpDMShadingWithEdges, "SHADING_WITH_EDGES" );
1018   createGeomAction( GEOMOp::OpShowAll,          "DISPLAY_ALL" );
1019   createGeomAction( GEOMOp::OpHideAll,          "ERASE_ALL" );
1020   createGeomAction( GEOMOp::OpShow,             "DISPLAY" );
1021   createGeomAction( GEOMOp::OpSwitchVectors,    "VECTOR_MODE");
1022   createGeomAction( GEOMOp::OpSelectVertex,     "VERTEX_SEL_ONLY" ,"", 0, true );
1023   createGeomAction( GEOMOp::OpSelectEdge,       "EDGE_SEL_ONLY", "", 0, true );
1024   createGeomAction( GEOMOp::OpSelectWire,       "WIRE_SEL_ONLY", "",  0, true );
1025   createGeomAction( GEOMOp::OpSelectFace,       "FACE_SEL_ONLY", "", 0, true );
1026   createGeomAction( GEOMOp::OpSelectShell,      "SHELL_SEL_ONLY", "",  0, true );
1027   createGeomAction( GEOMOp::OpSelectSolid,      "SOLID_SEL_ONLY", "", 0, true );
1028   createGeomAction( GEOMOp::OpSelectCompound,   "COMPOUND_SEL_ONLY", "",  0, true );
1029   createGeomAction( GEOMOp::OpSelectAll,        "ALL_SEL_ONLY", "",  0, true );
1030   createGeomAction( GEOMOp::OpShowOnly,         "DISPLAY_ONLY" );
1031   createGeomAction( GEOMOp::OpShowOnlyChildren, "SHOW_ONLY_CHILDREN" );
1032   createGeomAction( GEOMOp::OpBringToFront,     "BRING_TO_FRONT", "", 0, true );
1033   createGeomAction( GEOMOp::OpClsBringToFront,  "CLS_BRING_TO_FRONT" );
1034   createGeomAction( GEOMOp::OpHide,             "ERASE" );
1035
1036   createGeomAction( GEOMOp::OpWireframe,        "POP_WIREFRAME", "", 0, true );
1037   createGeomAction( GEOMOp::OpShading,          "POP_SHADING", "", 0, true );
1038   createGeomAction( GEOMOp::OpShadingWithEdges, "POP_SHADING_WITH_EDGES", "", 0, true );
1039   createGeomAction( GEOMOp::OpTexture,          "POP_TEXTURE", "", 0, true );
1040   createGeomAction( GEOMOp::OpEdgeWidth,        "EDGE_WIDTH");
1041   createGeomAction( GEOMOp::OpIsosWidth,        "ISOS_WIDTH");
1042   createGeomAction( GEOMOp::OpVectors,          "POP_VECTORS", "", 0, true );
1043   createGeomAction( GEOMOp::OpDeflection,       "POP_DEFLECTION" );
1044   createGeomAction( GEOMOp::OpColor,            "POP_COLOR" );
1045   createGeomAction( GEOMOp::OpSetTexture,       "POP_SETTEXTURE" );
1046   createGeomAction( GEOMOp::OpTransparency,     "POP_TRANSPARENCY" );
1047   createGeomAction( GEOMOp::OpIsos,             "POP_ISOS" );
1048   createGeomAction( GEOMOp::OpAutoColor,        "POP_AUTO_COLOR" );
1049   createGeomAction( GEOMOp::OpNoAutoColor,      "POP_DISABLE_AUTO_COLOR" );
1050   createGeomAction( GEOMOp::OpGroupCreatePopup, "POP_CREATE_GROUP" );
1051   createGeomAction( GEOMOp::OpEditFieldPopup,   "POP_EDIT_FIELD" );
1052   createGeomAction( GEOMOp::OpDiscloseChildren, "POP_DISCLOSE_CHILDREN" );
1053   createGeomAction( GEOMOp::OpConcealChildren,  "POP_CONCEAL_CHILDREN" );
1054   createGeomAction( GEOMOp::OpUnpublishObject,  "POP_UNPUBLISH_OBJ" );
1055   createGeomAction( GEOMOp::OpPublishObject,    "POP_PUBLISH_OBJ" );
1056   createGeomAction( GEOMOp::OpPointMarker,      "POP_POINT_MARKER" );
1057   createGeomAction( GEOMOp::OpMaterialProperties,   "POP_MATERIAL_PROPERTIES" );
1058   createGeomAction( GEOMOp::OpPredefMaterCustom,    "POP_PREDEF_MATER_CUSTOM" );
1059   createGeomAction( GEOMOp::OpCreateFolder, "POP_CREATE_FOLDER" );
1060   createGeomAction( GEOMOp::OpSortChildren, "POP_SORT_CHILD_ITEMS" );
1061
1062   // Create actions for increase/decrease transparency shortcuts
1063   createGeomAction( GEOMOp::OpIncrTransparency, "", "", 0, false,
1064                     "Geometry:Increase transparency");
1065   createGeomAction( GEOMOp::OpDecrTransparency, "", "", 0, false,
1066                     "Geometry:Decrease transparency");
1067
1068   // Create actions for increase/decrease number of isolines
1069   createGeomAction( GEOMOp::OpIncrNbIsos, "", "", 0, false,
1070                     "Geometry:Increase number of isolines");
1071   createGeomAction( GEOMOp::OpDecrNbIsos, "", "", 0, false,
1072                     "Geometry:Decrease number of isolines");
1073
1074   // Import/Export XAO
1075   createGeomAction( GEOMOp::OpExportXAO, "EXPORTXAO" );
1076   createGeomAction( GEOMOp::OpImportXAO, "IMPORTXAO" );
1077
1078   //createGeomAction( GEOMOp::OpPipeTShape, "PIPETSHAPE" );
1079   //createGeomAction( GEOMOp::OpDividedDisk, "DIVIDEDDISK" );
1080   //createGeomAction( GEOMOp::OpDividedCylinder, "DIVIDEDCYLINDER" );
1081   //createGeomAction( GEOMOp::OpSmoothingSurface, "SMOOTHINGSURFACE" );
1082   //@@ insert new functions before this line @@ do not remove this line @@ do not remove this line @@ do not remove this line @@ do not remove this line @@//
1083
1084   // ---- create menus --------------------------
1085
1086   int fileId = createMenu( tr( "MEN_FILE" ), -1, -1 );
1087   createMenu( separator(),      fileId, 10 );
1088   createMenu( GEOMOp::OpImport, fileId, 10 );
1089   createMenu( GEOMOp::OpExport, fileId, 10 );
1090   int impexpId = createMenu( tr( "MEN_IMPORTEXPORT" ), fileId, -1, 10 );
1091   createMenu( GEOMOp::OpExportXAO, impexpId, -1 );
1092   createMenu( GEOMOp::OpImportXAO, impexpId, -1 );
1093   createMenu( separator(),      fileId, -1 );
1094
1095   int editId = createMenu( tr( "MEN_EDIT" ), -1, -1 );
1096   createMenu( GEOMOp::OpDelete, editId, -1 );
1097
1098   int newEntId = createMenu( tr( "MEN_NEW_ENTITY" ), -1, -1, 10 );
1099
1100   int basicId = createMenu( tr( "MEN_BASIC" ), newEntId, -1 );
1101   createMenu( GEOMOp::OpPoint,   basicId, -1 );
1102   createMenu( GEOMOp::OpLine,    basicId, -1 );
1103   createMenu( GEOMOp::OpCircle,  basicId, -1 );
1104   createMenu( GEOMOp::OpEllipse, basicId, -1 );
1105   createMenu( GEOMOp::OpArc,     basicId, -1 );
1106   createMenu( GEOMOp::OpCurve,   basicId, -1 );
1107   createMenu( GEOMOp::Op2dSketcher, basicId, -1 );
1108   createMenu( GEOMOp::Op3dSketcher, basicId, -1 );
1109   createMenu( separator(),       basicId, -1 );
1110   createMenu( GEOMOp::OpVector,  basicId, -1 );
1111   createMenu( GEOMOp::OpPlane,   basicId, -1 );
1112   createMenu( GEOMOp::OpLCS,     basicId, -1 );
1113   createMenu( GEOMOp::OpOriginAndVectors, basicId, -1 );
1114
1115   int primId = createMenu( tr( "MEN_PRIMITIVES" ), newEntId, -1 );
1116   createMenu( GEOMOp::OpBox,       primId, -1 );
1117   createMenu( GEOMOp::OpCylinder,  primId, -1 );
1118   createMenu( GEOMOp::OpSphere,    primId, -1 );
1119   createMenu( GEOMOp::OpTorus,     primId, -1 );
1120   createMenu( GEOMOp::OpCone,      primId, -1 );
1121   createMenu( GEOMOp::OpRectangle, primId, -1 );
1122   createMenu( GEOMOp::OpDisk,      primId, -1 );
1123   //createMenu( GEOMOp::OpPipeTShape,primId, -1 );
1124
1125   int genId = createMenu( tr( "MEN_GENERATION" ), newEntId, -1 );
1126   createMenu( GEOMOp::OpPrism,      genId, -1 );
1127   createMenu( GEOMOp::OpRevolution, genId, -1 );
1128   createMenu( GEOMOp::OpFilling,    genId, -1 );
1129   createMenu( GEOMOp::OpPipe,       genId, -1 );
1130 #if OCC_VERSION_LARGE > 0x06050300
1131   createMenu( GEOMOp::OpPipePath,   genId, -1 );
1132 #endif
1133
1134   //int advId = createMenu( tr( "MEN_ADVANCED" ), newEntId, -1 );
1135   //createMenu( GEOMOp::OpSmoothingSurface, advId, -1 );
1136   //@@ insert new functions before this line @@ do not remove this line @@ do not remove this line @@ do not remove this line @@ do not remove this line @@//
1137
1138   createMenu( separator(), newEntId, -1 );
1139
1140   int groupId = createMenu( tr( "MEN_GROUP" ), newEntId, -1 );
1141   createMenu( GEOMOp::OpGroupCreate,    groupId, -1 );
1142   createMenu( GEOMOp::OpGroupEdit,      groupId, -1 );
1143   createMenu( GEOMOp::OpGroupUnion,     groupId, -1 );
1144   createMenu( GEOMOp::OpGroupIntersect, groupId, -1 );
1145   createMenu( GEOMOp::OpGroupCut,       groupId, -1 );
1146
1147   createMenu( separator(), newEntId, -1 );
1148
1149   int fieldId = createMenu( tr( "MEN_FIELD" ), newEntId, -1 );
1150   createMenu( GEOMOp::OpCreateField,    fieldId, -1 );
1151   createMenu( GEOMOp::OpEditField,      fieldId, -1 );
1152
1153   createMenu( separator(), newEntId, -1 );
1154
1155   int blocksId = createMenu( tr( "MEN_BLOCKS" ), newEntId, -1 );
1156   createMenu( GEOMOp::OpQuadFace,        blocksId, -1 );
1157   createMenu( GEOMOp::OpHexaSolid,       blocksId, -1 );
1158   //createMenu( GEOMOp::OpDividedDisk,     blocksId, -1 );
1159   //createMenu( GEOMOp::OpDividedCylinder, blocksId, -1 );
1160
1161   createMenu( separator(),          newEntId, -1 );
1162
1163   createMenu( GEOMOp::OpExplode,    newEntId, -1 );
1164
1165   int buildId = createMenu( tr( "MEN_BUILD" ), newEntId, -1 );
1166   createMenu( GEOMOp::OpEdge,     buildId, -1 );
1167   createMenu( GEOMOp::OpWire,     buildId, -1 );
1168   createMenu( GEOMOp::OpFace,     buildId, -1 );
1169   createMenu( GEOMOp::OpShell,    buildId, -1 );
1170   createMenu( GEOMOp::OpSolid,    buildId, -1 );
1171   createMenu( GEOMOp::OpCompound, buildId, -1 );
1172
1173   createMenu( separator(),          newEntId, -1 );
1174
1175   createMenu( GEOMOp::OpPictureImport, newEntId, -1 );
1176 #ifdef WITH_OPENCV
1177   createMenu( GEOMOp::OpFeatureDetect, newEntId, -1 );
1178 #endif
1179
1180   int operId = createMenu( tr( "MEN_OPERATIONS" ), -1, -1, 10 );
1181
1182   int boolId = createMenu( tr( "MEN_BOOLEAN" ), operId, -1 );
1183   createMenu( GEOMOp::OpFuse,    boolId, -1 );
1184   createMenu( GEOMOp::OpCommon,  boolId, -1 );
1185   createMenu( GEOMOp::OpCut,     boolId, -1 );
1186   createMenu( GEOMOp::OpSection, boolId, -1 );
1187
1188   int transId = createMenu( tr( "MEN_TRANSFORMATION" ), operId, -1 );
1189   createMenu( GEOMOp::OpTranslate,      transId, -1 );
1190   createMenu( GEOMOp::OpRotate,         transId, -1 );
1191   createMenu( GEOMOp::OpChangeLoc,      transId, -1 );
1192   createMenu( GEOMOp::OpMirror,         transId, -1 );
1193   createMenu( GEOMOp::OpScale,          transId, -1 );
1194   createMenu( GEOMOp::OpOffset,         transId, -1 );
1195   createMenu( GEOMOp::OpProjection,     transId, -1 );
1196   createMenu( separator(),              transId, -1 );
1197   createMenu( GEOMOp::OpMultiTranslate, transId, -1 );
1198   createMenu( GEOMOp::OpMultiRotate,    transId, -1 );
1199
1200   int blockId = createMenu( tr( "MEN_BLOCKS" ), operId, -1 );
1201   createMenu( GEOMOp::OpMultiTransform, blockId, -1 );
1202   createMenu( GEOMOp::OpExplodeBlock,   blockId, -1 );
1203   createMenu( GEOMOp::OpPropagate,      blockId, -1 );
1204
1205   createMenu( separator(), operId, -1 );
1206
1207   createMenu( GEOMOp::OpPartition,     operId, -1 );
1208   createMenu( GEOMOp::OpArchimede,     operId, -1 );
1209   createMenu( GEOMOp::OpShapesOnShape, operId, -1 );
1210   createMenu( GEOMOp::OpSharedShapes,  operId, -1 );
1211
1212   createMenu( separator(), operId, -1 );
1213
1214   createMenu( GEOMOp::OpFillet1d,      operId, -1 );
1215   createMenu( GEOMOp::OpFillet2d,      operId, -1 );
1216   createMenu( GEOMOp::OpFillet3d,      operId, -1 );
1217   createMenu( GEOMOp::OpChamfer,       operId, -1 );
1218   createMenu( GEOMOp::OpExtrudedBoss,  operId, -1 );
1219   createMenu( GEOMOp::OpExtrudedCut,   operId, -1 );
1220 #ifdef DEBUG_CURVE_CREATOR
1221   // for debug purposes, to be removed
1222   createMenu( separator(), operId, -1 );
1223   createMenu( GEOMOp::OpCurveCreator,   operId, -1 );
1224 #endif
1225   //createMenu( GEOMOp::OpClipping,      operId, -1 );
1226
1227   int repairId = createMenu( tr( "MEN_REPAIR" ), -1, -1, 10 );
1228   createMenu( GEOMOp::OpShapeProcess,    repairId, -1 );
1229   createMenu( GEOMOp::OpSuppressFaces,   repairId, -1 );
1230   createMenu( GEOMOp::OpCloseContour,    repairId, -1 );
1231   createMenu( GEOMOp::OpRemoveIntWires,  repairId, -1 );
1232   createMenu( GEOMOp::OpSuppressHoles,   repairId, -1 );
1233   createMenu( GEOMOp::OpSewing,          repairId, -1 );
1234   createMenu( GEOMOp::OpGlueFaces,       repairId, -1 );
1235   createMenu( GEOMOp::OpGlueEdges,       repairId, -1 );
1236   createMenu( GEOMOp::OpLimitTolerance,  repairId, -1 );
1237   createMenu( GEOMOp::OpAddPointOnEdge,  repairId, -1 );
1238   //createMenu( GEOMOp::OpFreeBoundaries,  repairId, -1 );
1239   //createMenu( GEOMOp::OpFreeFaces,       repairId, -1 );
1240   createMenu( GEOMOp::OpOrientation,      repairId, -1 );
1241   createMenu( GEOMOp::OpRemoveWebs,       repairId, -1 );
1242   createMenu( GEOMOp::OpRemoveExtraEdges, repairId, -1 );
1243   createMenu( GEOMOp::OpFuseEdges,        repairId, -1 );
1244   createMenu( GEOMOp::OpUnionFaces,       repairId, -1 );
1245
1246   int measurId = createMenu( tr( "MEN_MEASURES" ), -1, -1, 10 );
1247   createMenu( GEOMOp::OpPointCoordinates, measurId, -1 );
1248   createMenu( GEOMOp::OpProperties,       measurId, -1 );
1249   createMenu( separator(),                measurId, -1 );
1250   createMenu( GEOMOp::OpCenterMass,       measurId, -1 );
1251   createMenu( GEOMOp::OpInertia,          measurId, -1 );
1252   createMenu( GEOMOp::OpNormale,          measurId, -1 );
1253   createMenu( separator(),                measurId, -1 );
1254   createMenu( GEOMOp::OpFreeBoundaries,   measurId, -1 );
1255   createMenu( GEOMOp::OpFreeFaces,        measurId, -1 );
1256   createMenu( separator(),                measurId, -1 );
1257
1258   int dimId = createMenu( tr( "MEN_DIMENSIONS" ), measurId, -1 );
1259   createMenu( GEOMOp::OpBoundingBox, dimId, -1 );
1260   createMenu( GEOMOp::OpMinDistance, dimId, -1 );
1261   createMenu( GEOMOp::OpAngle,       dimId, -1 );
1262
1263   createMenu( separator(),               measurId, -1 );
1264   createMenu( GEOMOp::OpTolerance,       measurId, -1 );
1265   createMenu( separator(),               measurId, -1 );
1266   createMenu( GEOMOp::OpWhatIs,          measurId, -1 );
1267   createMenu( GEOMOp::OpCheckShape,      measurId, -1 );
1268   createMenu( GEOMOp::OpCheckCompound,   measurId, -1 );
1269   createMenu( GEOMOp::OpGetNonBlocks,    measurId, -1 );
1270   createMenu( GEOMOp::OpCheckSelfInters, measurId, -1 );
1271
1272   int toolsId = createMenu( tr( "MEN_TOOLS" ), -1, -1, 50 );
1273 #if defined(_DEBUG_) || defined(_DEBUG) // PAL16821
1274   createMenu( separator(),         toolsId, -1 );
1275   createMenu( GEOMOp::OpCheckGeom, toolsId, -1 );
1276 #endif
1277
1278   createMenu( separator(),         toolsId, -1 );
1279   createMenu( GEOMOp::OpMaterialsLibrary, toolsId, -1 );
1280   createMenu( separator(),         toolsId, -1 );
1281
1282   int viewId = createMenu( tr( "MEN_VIEW" ), -1, -1 );
1283   createMenu( separator(),       viewId, -1 );
1284
1285   int dispmodeId = createMenu( tr( "MEN_DISPLAY_MODE" ), viewId, -1 );
1286   createMenu( GEOMOp::OpDMWireframe,        dispmodeId, -1 );
1287   createMenu( GEOMOp::OpDMShading,          dispmodeId, -1 );
1288   createMenu( GEOMOp::OpDMShadingWithEdges, dispmodeId, -1 );
1289   createMenu( separator(),                  dispmodeId, -1 );
1290   createMenu( GEOMOp::OpSwitchVectors,      dispmodeId, -1 );
1291
1292   createMenu( separator(),       viewId, -1 );
1293   createMenu( GEOMOp::OpShowAll, viewId, -1 );
1294   createMenu( GEOMOp::OpHideAll, viewId, -1 );
1295   createMenu( separator(),       viewId, -1 );
1296   createMenu( GEOMOp::OpPublishObject, viewId, -1 );
1297   createMenu( separator(),       viewId, -1 );
1298
1299 /*
1300   PAL9111:
1301   because of these items are accessible through object browser and viewers
1302   we have removed they from main menu
1303
1304   createMenu( GEOMOp::OpShow, viewId, -1 );
1305   createMenu( GEOMOp::OpShowOnly, viewId, -1 );
1306   createMenu( GEOMOp::OpHide, viewId, -1 );
1307 */
1308
1309   // ---- create toolbars --------------------------
1310
1311   int basicTbId = createTool( tr( "TOOL_BASIC" ) );
1312   createTool( GEOMOp::OpPoint,      basicTbId );
1313   createTool( GEOMOp::OpLine,       basicTbId );
1314   createTool( GEOMOp::OpCircle,     basicTbId );
1315   createTool( GEOMOp::OpEllipse,    basicTbId );
1316   createTool( GEOMOp::OpArc,        basicTbId );
1317   createTool( GEOMOp::OpCurve,      basicTbId );
1318   createTool( GEOMOp::OpVector,     basicTbId );
1319   createTool( GEOMOp::Op2dSketcher, basicTbId ); //rnc
1320   createTool( GEOMOp::Op3dSketcher, basicTbId ); //rnc
1321   createTool( GEOMOp::OpPlane,      basicTbId );
1322   createTool( GEOMOp::OpLCS,        basicTbId );
1323   createTool( GEOMOp::OpOriginAndVectors, basicTbId );
1324
1325 //   int sketchTbId = createTool( tr( "TOOL_SKETCH" ) );
1326 //   createTool( GEOMOp::Op2dSketcher,  sketchTbId );
1327 //   createTool( GEOMOp::Op3dSketcher,  sketchTbId );
1328
1329   int primTbId = createTool( tr( "TOOL_PRIMITIVES" ) );
1330   createTool( GEOMOp::OpBox,        primTbId );
1331   createTool( GEOMOp::OpCylinder,   primTbId );
1332   createTool( GEOMOp::OpSphere,     primTbId );
1333   createTool( GEOMOp::OpTorus,      primTbId );
1334   createTool( GEOMOp::OpCone,       primTbId );
1335   createTool( GEOMOp::OpRectangle,  primTbId );
1336   createTool( GEOMOp::OpDisk,       primTbId );
1337   //createTool( GEOMOp::OpPipeTShape, primTbId ); //rnc
1338
1339   //int blocksTbId = createTool( tr( "TOOL_BLOCKS" ) );
1340   //createTool( GEOMOp::OpDividedDisk, blocksTbId );
1341   //createTool( GEOMOp::OpDividedCylinder, blocksTbId );
1342
1343   int boolTbId = createTool( tr( "TOOL_BOOLEAN" ) );
1344   createTool( GEOMOp::OpFuse,       boolTbId );
1345   createTool( GEOMOp::OpCommon,     boolTbId );
1346   createTool( GEOMOp::OpCut,        boolTbId );
1347   createTool( GEOMOp::OpSection,    boolTbId );
1348
1349   int genTbId = createTool( tr( "TOOL_GENERATION" ) );
1350   createTool( GEOMOp::OpPrism,      genTbId );
1351   createTool( GEOMOp::OpRevolution, genTbId );
1352   createTool( GEOMOp::OpFilling,    genTbId );
1353   createTool( GEOMOp::OpPipe,       genTbId );
1354 #if OCC_VERSION_LARGE > 0x06050300
1355   createTool( GEOMOp::OpPipePath,   genTbId );
1356 #endif
1357
1358   int transTbId = createTool( tr( "TOOL_TRANSFORMATION" ) );
1359   createTool( GEOMOp::OpTranslate,      transTbId );
1360   createTool( GEOMOp::OpRotate,         transTbId );
1361   createTool( GEOMOp::OpChangeLoc,      transTbId );
1362   createTool( GEOMOp::OpMirror,         transTbId );
1363   createTool( GEOMOp::OpScale,          transTbId );
1364   createTool( GEOMOp::OpOffset,         transTbId );
1365   createTool( GEOMOp::OpProjection,     transTbId );
1366   createTool( separator(),              transTbId );
1367   createTool( GEOMOp::OpMultiTranslate, transTbId );
1368   createTool( GEOMOp::OpMultiRotate,    transTbId );
1369
1370   int operTbId = createTool( tr( "TOOL_OPERATIONS" ) );
1371   createTool( GEOMOp::OpExplode,         operTbId );
1372   createTool( GEOMOp::OpPartition,       operTbId );
1373   createTool( GEOMOp::OpArchimede,       operTbId );
1374   createTool( GEOMOp::OpShapesOnShape,   operTbId );
1375   createTool( GEOMOp::OpSharedShapes,    operTbId );
1376
1377   int featTbId = createTool( tr( "TOOL_FEATURES" ) );
1378   createTool( GEOMOp::OpFillet1d,        featTbId );
1379   createTool( GEOMOp::OpFillet2d,        featTbId );
1380   createTool( GEOMOp::OpFillet3d,        featTbId );
1381   createTool( GEOMOp::OpChamfer,         featTbId );
1382   createTool( GEOMOp::OpExtrudedBoss,    featTbId );
1383   createTool( GEOMOp::OpExtrudedCut,     featTbId );
1384 #ifdef DEBUG_CURVE_CREATOR
1385   // for debug purposes, to be removed
1386   createTool( GEOMOp::OpCurveCreator,    featTbId ); 
1387 #endif
1388
1389   int buildTbId = createTool( tr( "TOOL_BUILD" ) );
1390   createTool( GEOMOp::OpEdge,     buildTbId );
1391   createTool( GEOMOp::OpWire,     buildTbId );
1392   createTool( GEOMOp::OpFace,     buildTbId );
1393   createTool( GEOMOp::OpShell,    buildTbId );
1394   createTool( GEOMOp::OpSolid,    buildTbId );
1395   createTool( GEOMOp::OpCompound, buildTbId );
1396
1397   int measureTbId = createTool( tr( "TOOL_MEASURES" ) );
1398   createTool( GEOMOp::OpPointCoordinates, measureTbId );
1399   createTool( GEOMOp::OpProperties,       measureTbId );
1400   createTool( GEOMOp::OpCenterMass,       measureTbId );
1401   createTool( GEOMOp::OpInertia,          measureTbId );
1402   createTool( GEOMOp::OpNormale,          measureTbId );
1403   createTool( separator(),                measureTbId );
1404   createTool( GEOMOp::OpBoundingBox,      measureTbId );
1405   createTool( GEOMOp::OpMinDistance,      measureTbId );
1406   createTool( GEOMOp::OpAngle,            measureTbId );
1407   createTool( GEOMOp::OpTolerance  ,      measureTbId );
1408   createTool( separator(),                measureTbId );
1409   createTool( GEOMOp::OpFreeBoundaries,   measureTbId );
1410   createTool( GEOMOp::OpFreeFaces,        measureTbId );
1411   createTool( separator(),                measureTbId );
1412   createTool( GEOMOp::OpWhatIs,           measureTbId );
1413   createTool( GEOMOp::OpCheckShape,       measureTbId );
1414   createTool( GEOMOp::OpCheckCompound,    measureTbId );
1415   createTool( GEOMOp::OpGetNonBlocks,     measureTbId );
1416   createTool( GEOMOp::OpCheckSelfInters,  measureTbId );
1417
1418   int picturesTbId = createTool( tr( "TOOL_PICTURES" ) );
1419   createTool( GEOMOp::OpPictureImport,    picturesTbId );
1420 #ifdef WITH_OPENCV
1421   createTool( GEOMOp::OpFeatureDetect,  picturesTbId );
1422 #endif
1423
1424    int impexpTbId = createTool( tr( "TOOL_IMPORTEXPORT" ) );
1425    createTool( GEOMOp::OpExportXAO, impexpTbId );
1426    createTool( GEOMOp::OpImportXAO, impexpTbId );
1427
1428   //int advancedTbId = createTool( tr( "TOOL_ADVANCED" ) );
1429   //createTool( GEOMOp::OpSmoothingSurface, advancedTbId );
1430   //@@ insert new functions before this line @@ do not remove this line @@ do not remove this line @@ do not remove this line @@ do not remove this line @@//
1431
1432   // ---- create popup menus --------------------------
1433
1434   QString clientOCCorVTK = "(client='OCCViewer' or client='VTKViewer')";
1435   QString clientOCC = "(client='OCCViewer')";
1436   QString clientOCCorVTK_AndSomeVisible = clientOCCorVTK + " and selcount>0 and isVisible";
1437   QString clientOCC_AndSomeVisible = clientOCC + " and selcount>0 and isVisible";
1438
1439   QString clientOCCorOB = "(client='ObjectBrowser' or client='OCCViewer')";
1440   QString clientOCCorVTKorOB = "(client='ObjectBrowser' or client='OCCViewer' or client='VTKViewer')";
1441   QString clientOCCorVTKorOB_AndSomeVisible = clientOCCorVTKorOB + " and selcount>0 and isVisible";
1442   QString clientOCCorOB_AndSomeVisible = clientOCCorOB + " and selcount>0 and isVisible";
1443
1444   QString autoColorPrefix =
1445     "(client='ObjectBrowser' or client='OCCViewer') and type='Shape' and selcount=1 and isOCC=true";
1446
1447   QtxPopupMgr* mgr = popupMgr();
1448
1449   mgr->insert( action(  GEOMOp::OpDelete ), -1, -1 );  // delete
1450   mgr->setRule( action( GEOMOp::OpDelete ), QString("$type in {'Shape' 'Group' 'Folder' 'Field' 'FieldStep'} and selcount>0"), QtxPopupMgr::VisibleRule );
1451   mgr->insert( action(  GEOMOp::OpGroupCreatePopup ), -1, -1 ); // create group
1452   mgr->setRule( action( GEOMOp::OpGroupCreatePopup ), QString("type='Shape' and selcount=1 and isOCC=true"), QtxPopupMgr::VisibleRule );
1453   mgr->insert( action(  GEOMOp::OpEditFieldPopup ), -1, -1 ); // edit field
1454   mgr->setRule( action( GEOMOp::OpEditFieldPopup ), QString("(type='Field' or type='FieldStep') and isOCC=true"), QtxPopupMgr::VisibleRule );
1455   mgr->insert( action(  GEOMOp::OpDiscloseChildren ), -1, -1 ); // disclose child items
1456   mgr->setRule( action( GEOMOp::OpDiscloseChildren ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and hasConcealedChildren=true"), QtxPopupMgr::VisibleRule );
1457
1458   mgr->insert( action(  GEOMOp::OpConcealChildren ), -1, -1 ); // conceal child items
1459   mgr->setRule( action( GEOMOp::OpConcealChildren ), QString("client='ObjectBrowser' and type='Shape' and selcount=1 and hasDisclosedChildren=true"), QtxPopupMgr::VisibleRule );
1460   mgr->insert( action(  GEOMOp::OpGroupEdit ), -1, -1 );  // edit group
1461   mgr->setRule( action( GEOMOp::OpGroupEdit ),  QString("client='ObjectBrowser' and type='Group' and selcount=1 and isOCC=true"), QtxPopupMgr::VisibleRule );
1462   mgr->insert( separator(), -1, -1 );     // -----------
1463
1464 #if OCC_VERSION_LARGE > 0x06050200
1465   //QString bringRule = clientOCCorOB + " and ($component={'GEOM'}) and (selcount>0) and isOCC=true and topLevel=false";
1466   QString bringRule = clientOCCorOB + " and ($component={'GEOM'}) and isFolder=false and (selcount>0) and isOCC=true";
1467   mgr->insert( action(GEOMOp::OpBringToFront ), -1, -1 ); // bring to front
1468   mgr->setRule(action(GEOMOp::OpBringToFront), bringRule + " and autoBringToFront = false", QtxPopupMgr::VisibleRule );
1469   mgr->setRule(action(GEOMOp::OpBringToFront), "topLevel=true", QtxPopupMgr::ToggleRule );
1470   mgr->insert( action(GEOMOp::OpClsBringToFront ), -1, -1 ); // clear bring to front
1471   mgr->setRule( action(GEOMOp::OpClsBringToFront ), clientOCC + " and autoBringToFront = false", QtxPopupMgr::VisibleRule );
1472 #endif
1473   mgr->insert( separator(), -1, -1 );     // -----------
1474   dispmodeId = mgr->insert(  tr( "MEN_DISPLAY_MODE" ), -1, -1 ); // display mode menu
1475   mgr->insert( action(  GEOMOp::OpWireframe ), dispmodeId, -1 ); // wireframe
1476   mgr->setRule( action( GEOMOp::OpWireframe ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1477   mgr->setRule( action( GEOMOp::OpWireframe ), clientOCCorVTK + " and displaymode='Wireframe'", QtxPopupMgr::ToggleRule );
1478   mgr->insert( action(  GEOMOp::OpShading ), dispmodeId, -1 ); // shading
1479   mgr->setRule( action( GEOMOp::OpShading ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1480   mgr->setRule( action( GEOMOp::OpShading ), clientOCCorVTK + " and displaymode='Shading'", QtxPopupMgr::ToggleRule );
1481   mgr->insert( action(  GEOMOp::OpShadingWithEdges ), dispmodeId, -1 ); // shading with edges
1482   mgr->setRule( action( GEOMOp::OpShadingWithEdges ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1483   mgr->setRule( action( GEOMOp::OpShadingWithEdges ), clientOCCorVTK + " and displaymode='ShadingWithEdges'", QtxPopupMgr::ToggleRule );
1484   mgr->insert( action(  GEOMOp::OpTexture ), dispmodeId, -1 ); // wireframe
1485   mgr->setRule( action( GEOMOp::OpTexture ), clientOCC_AndSomeVisible, QtxPopupMgr::VisibleRule );
1486   mgr->setRule( action( GEOMOp::OpTexture), clientOCC + " and displaymode='Texture'", QtxPopupMgr::ToggleRule );
1487   mgr->insert( separator(), dispmodeId, -1 );
1488   mgr->insert( action(  GEOMOp::OpVectors ), dispmodeId, -1 ); // vectors
1489   mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK_AndSomeVisible  + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1490   mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK + " and isVectorsMode", QtxPopupMgr::ToggleRule );
1491   mgr->insert( separator(), -1, -1 );     // -----------
1492
1493   mgr->insert( action(  GEOMOp::OpColor ), -1, -1 ); // color
1494   mgr->setRule( action( GEOMOp::OpColor ), clientOCCorVTKorOB_AndSomeVisible + " and ($component={'GEOM'})" + "and isPhysicalMaterial=false", QtxPopupMgr::VisibleRule );
1495   mgr->insert( action(  GEOMOp::OpTransparency ), -1, -1 ); // transparency
1496   mgr->setRule( action( GEOMOp::OpTransparency ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1497   mgr->insert( action(  GEOMOp::OpIsos ), -1, -1 ); // isos
1498   mgr->setRule( action( GEOMOp::OpIsos ), clientOCCorVTK_AndSomeVisible + " and selcount>0 and isVisible" + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1499   mgr->insert( action(  GEOMOp::OpDeflection ), -1, -1 ); // deflection
1500   mgr->setRule( action( GEOMOp::OpDeflection ), clientOCCorVTK_AndSomeVisible + " and selcount>0 and isVisible" + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1501   mgr->insert( action(  GEOMOp::OpPointMarker ), -1, -1 ); // point marker
1502   //mgr->setRule( action( GEOMOp::OpPointMarker ), QString( "selcount>0 and $typeid in {%1}" ).arg(GEOM_POINT ), QtxPopupMgr::VisibleRule );
1503   mgr->setRule( action( GEOMOp::OpPointMarker ), QString( "selcount>0 and ( $typeid in {%1} or compoundOfVertices=true ) " ).arg(GEOM::VERTEX).arg(GEOM::COMPOUND), QtxPopupMgr::VisibleRule );
1504
1505   // material properties
1506   mgr->insert( action(  GEOMOp::OpMaterialProperties ), -1, -1 );
1507   mgr->setRule( action( GEOMOp::OpMaterialProperties ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1508
1509  // texture
1510   mgr->insert( action(  GEOMOp::OpSetTexture ), -1, -1 );
1511   mgr->setRule( action( GEOMOp::OpSetTexture ), clientOCCorOB_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1512
1513   int lineW = mgr->insert(  tr( "MEN_LINE_WIDTH" ), -1, -1 ); // line width menu
1514   mgr->insert( action(  GEOMOp::OpEdgeWidth ), lineW, -1 ); // edge width
1515   mgr->setRule( action( GEOMOp::OpEdgeWidth ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1516
1517   mgr->insert( action(  GEOMOp::OpIsosWidth ), lineW, -1 ); // isos width
1518   mgr->setRule( action( GEOMOp::OpIsosWidth ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
1519
1520   mgr->insert( separator(), -1, -1 );     // -----------
1521   mgr->insert( action(  GEOMOp::OpAutoColor ), -1, -1 ); // auto color
1522   mgr->setRule( action( GEOMOp::OpAutoColor ), autoColorPrefix + " and isAutoColor=false", QtxPopupMgr::VisibleRule );
1523   mgr->insert( action(  GEOMOp::OpNoAutoColor ), -1, -1 ); // disable auto color
1524   mgr->setRule( action( GEOMOp::OpNoAutoColor ), autoColorPrefix + " and isAutoColor=true", QtxPopupMgr::VisibleRule );
1525   mgr->insert( separator(), -1, -1 );     // -----------
1526
1527   QString canDisplay = "($component={'GEOM'}) and (selcount>0) and ({true} in $canBeDisplayed) ",
1528           onlyComponent = "((type='Component') and selcount=1)",
1529           rule = canDisplay + "and ((($type in {%1}) and( %2 )) or " + onlyComponent + ")",
1530           types = "'Shape' 'Group' 'FieldStep'";
1531
1532   mgr->insert( action(  GEOMOp::OpShow ), -1, -1 ); // display
1533   mgr->setRule( action( GEOMOp::OpShow ), rule.arg( types ).arg( "not isVisible" ), QtxPopupMgr::VisibleRule );
1534
1535   mgr->insert( action(  GEOMOp::OpHide ), -1, -1 ); // erase
1536   mgr->setRule( action( GEOMOp::OpHide ), rule.arg( types ).arg( "isVisible" ), QtxPopupMgr::VisibleRule );
1537
1538   mgr->insert( action(  GEOMOp::OpHideAll ), -1, -1 ); // erase All
1539   mgr->setRule( action( GEOMOp::OpHideAll ), clientOCCorVTK, QtxPopupMgr::VisibleRule );
1540
1541   QString selectOnly = "(client='OCCViewer' or client='VTKViewer') and (selcount=0)";
1542
1543   int selectonlyId = mgr->insert( tr("MEN_SELECT_ONLY"), -1, -1);                //select only menu
1544   mgr->insert( action(GEOMOp::OpSelectVertex),   selectonlyId, -1);                                  //Vertex
1545   mgr->setRule(action(GEOMOp::OpSelectVertex),   selectOnly, QtxPopupMgr::VisibleRule);
1546   mgr->setRule(action(GEOMOp::OpSelectVertex),   selectOnly + " and selectionmode='VERTEX'", QtxPopupMgr::ToggleRule);
1547   mgr->insert( action(GEOMOp::OpSelectEdge),     selectonlyId, -1);                                  //Edge
1548   mgr->setRule(action(GEOMOp::OpSelectEdge),     selectOnly, QtxPopupMgr::VisibleRule);
1549   mgr->setRule(action(GEOMOp::OpSelectEdge),     selectOnly + " and selectionmode='EDGE'", QtxPopupMgr::ToggleRule);
1550   mgr->insert( action(GEOMOp::OpSelectWire),     selectonlyId, -1);                                  //Wire
1551   mgr->setRule(action(GEOMOp::OpSelectWire),     selectOnly, QtxPopupMgr::VisibleRule);
1552   mgr->setRule(action(GEOMOp::OpSelectWire),     selectOnly + " and selectionmode='WIRE'", QtxPopupMgr::ToggleRule);
1553   mgr->insert( action(GEOMOp::OpSelectFace),     selectonlyId, -1);                                  //Face
1554   mgr->setRule(action(GEOMOp::OpSelectFace),     selectOnly, QtxPopupMgr::VisibleRule);
1555   mgr->setRule(action(GEOMOp::OpSelectFace),     selectOnly + " and selectionmode='FACE'", QtxPopupMgr::ToggleRule);
1556   mgr->insert( action(GEOMOp::OpSelectShell),    selectonlyId, -1);                                  //Shell
1557   mgr->setRule(action(GEOMOp::OpSelectShell),    selectOnly, QtxPopupMgr::VisibleRule);
1558   mgr->setRule(action(GEOMOp::OpSelectShell),    selectOnly + " and selectionmode='SHELL'", QtxPopupMgr::ToggleRule);
1559   mgr->insert( action(GEOMOp::OpSelectSolid),    selectonlyId, -1);                                  //Solid
1560   mgr->setRule(action(GEOMOp::OpSelectSolid),    selectOnly, QtxPopupMgr::VisibleRule);
1561   mgr->setRule(action(GEOMOp::OpSelectSolid),    selectOnly + " and selectionmode='SOLID'", QtxPopupMgr::ToggleRule);
1562   mgr->insert( action(GEOMOp::OpSelectCompound), selectonlyId, -1);                                  //Compound
1563   mgr->setRule(action(GEOMOp::OpSelectCompound), selectOnly, QtxPopupMgr::VisibleRule);
1564   mgr->setRule(action(GEOMOp::OpSelectCompound), selectOnly + " and selectionmode='COMPOUND'", QtxPopupMgr::ToggleRule);
1565   mgr->insert( separator(), selectonlyId, -1);
1566   mgr->insert( action(GEOMOp::OpSelectAll),      selectonlyId, -1);                                  //Clear selection filter
1567   mgr->setRule(action(GEOMOp::OpSelectAll),      selectOnly, QtxPopupMgr::VisibleRule);
1568   mgr->setRule(action(GEOMOp::OpSelectAll),      selectOnly + " and selectionmode='ALL'", QtxPopupMgr::ToggleRule);
1569   mgr->insert( action(GEOMOp::OpShowOnly ), -1, -1 ); // display only
1570   mgr->setRule(action(GEOMOp::OpShowOnly ), rule.arg( types ).arg( "true" ), QtxPopupMgr::VisibleRule );
1571   mgr->insert( action(GEOMOp::OpShowOnlyChildren ), -1, -1 ); // display only children
1572   mgr->setRule(action(GEOMOp::OpShowOnlyChildren ), (canDisplay + "and ($type in {%1}) and client='ObjectBrowser' and hasChildren=true").arg( types ), QtxPopupMgr::VisibleRule );
1573
1574   mgr->insert( separator(), -1, -1 );     // -----------
1575   mgr->insert( action(  GEOMOp::OpUnpublishObject ), -1, -1 ); // Unpublish object
1576   mgr->setRule( action( GEOMOp::OpUnpublishObject ), QString("client='ObjectBrowser' and $type in {'Shape' 'Group' 'Field' 'FieldStep'} and selcount>0"), QtxPopupMgr::VisibleRule );
1577
1578   mgr->insert( action(  GEOMOp::OpPublishObject ), -1, -1 ); // Publish object
1579   mgr->setRule( action( GEOMOp::OpPublishObject ), QString("client='ObjectBrowser' and isComponent=true"), QtxPopupMgr::VisibleRule );
1580
1581   mgr->insert( action(  GEOMOp::OpReimport ), -1, -1 );  // delete
1582   mgr->setRule( action( GEOMOp::OpReimport ), QString("$imported in {'true'} and selcount>0"), QtxPopupMgr::VisibleRule );
1583
1584   mgr->insert( separator(), -1, -1 );     // -----------
1585   mgr->insert( action(  GEOMOp::OpCreateFolder ), -1, -1 ); // Create Folder
1586   mgr->setRule( action( GEOMOp::OpCreateFolder ), QString("client='ObjectBrowser' and $component={'GEOM'} and (isComponent=true or isFolder=true)"), QtxPopupMgr::VisibleRule );
1587
1588   mgr->insert( separator(), -1, -1 );     // -----------
1589   mgr->insert( action(  GEOMOp::OpSortChildren ), -1, -1 ); // Sort child items
1590   mgr->setRule( action( GEOMOp::OpSortChildren ), QString("client='ObjectBrowser' and $component={'GEOM'} and nbChildren>1"), QtxPopupMgr::VisibleRule );
1591
1592   mgr->hide( mgr->actionId( action( myEraseAll ) ) );
1593
1594   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
1595   if (resMgr) {
1596     GEOM_AISShape::setTopLevelDisplayMode((GEOM_AISShape::TopLevelDispMode)resMgr->integerValue("Geometry", "toplevel_dm", 0));
1597     QColor c = resMgr->colorValue( "Geometry", "toplevel_color", QColor( 170, 85, 0 ) );
1598     GEOM_AISShape::setTopLevelColor(SalomeApp_Tools::color(c));
1599   }
1600
1601   // create plugin actions and menus
1602   addPluginActions();
1603 }
1604
1605 //=======================================================================
1606 // function : GeometryGUI::addPluginActions()
1607 // purpose  :
1608 //=======================================================================
1609 void GeometryGUI::addPluginActions()
1610 {
1611   // Resource manager
1612   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
1613   if (!resMgr) return;
1614
1615   // Find names of a resource XML files ("GEOMActions.xml" and others);
1616   QString PluginsXml;
1617   char* cenv = getenv("GEOM_PluginsList");
1618   if (cenv)
1619     PluginsXml.sprintf("%s", cenv);
1620
1621   QStringList PluginsXmlList = PluginsXml.split(":", QString::SkipEmptyParts);
1622   if (PluginsXmlList.count() == 0) return;
1623
1624   // get full names of xml files from PluginsXmlList
1625   QStringList xmlFiles;
1626   xmlFiles.append(QDir::home().filePath("CustomGeomPlugins.xml")); // may be inexistent
1627   for (int i = 0; i < PluginsXmlList.count(); i++) {
1628     PluginsXml = PluginsXmlList[ i ];
1629
1630     // Find full path to the resource XML file
1631     QString xmlFile = resMgr->path("resources", "GEOM", PluginsXml + ".xml");
1632     if ( xmlFile.isEmpty() ) // try PLUGIN resources
1633       xmlFile = resMgr->path("resources", PluginsXml, PluginsXml + ".xml");
1634     if ( !xmlFile.isEmpty() )
1635       xmlFiles.append( xmlFile );
1636   }
1637
1638   // create "Advanced Operations" menu and corresponding toolbar
1639   //int advancedMenuId = createMenu(tr("MEN_ADVANCED"), -1, -1, 10);
1640   //int advancedTbarId = createTool(tr("TOOL_ADVANCED"));
1641   int id = GEOMOp::OpLastOperationID; // TODO?
1642
1643   // loop on xmlFiles
1644   QString aNoAccessFiles;
1645   for (int i = 0; i < xmlFiles.count(); i++) {
1646     QString xmlFile = xmlFiles[ i ];
1647
1648     QFile file (xmlFile);
1649     if (file.exists() && file.open(QIODevice::ReadOnly)) {
1650       file.close();
1651
1652       GEOMGUI_XmlHandler* aXmlHandler = new GEOMGUI_XmlHandler();
1653       ASSERT(aXmlHandler);
1654
1655       QXmlInputSource source (&file);
1656       QXmlSimpleReader reader;
1657       reader.setContentHandler(aXmlHandler);
1658       reader.setErrorHandler(aXmlHandler);
1659       bool ok = reader.parse(source);
1660       file.close();
1661
1662       if (ok) {
1663         // bind action lib and label to its ID for activateOperation() method proper work
1664         myPluginLibs[aXmlHandler->myPluginData.myName] = aXmlHandler->myPluginData.myClientLib;
1665
1666         QListIterator<GEOMGUI_ActionData> anActionsIter (aXmlHandler->myPluginData.myListOfActions);
1667         while (anActionsIter.hasNext()) {
1668           GEOMGUI_ActionData anActionData = anActionsIter.next();
1669
1670           //QPixmap icon = resMgr->loadPixmap("GEOM", tr(anActionData.myIcon.toLatin1().constData()));
1671           QPixmap icon = resMgr->loadPixmap(aXmlHandler->myPluginData.myName,
1672                                             anActionData.myIcon.toLatin1().constData());
1673
1674           // path to action in menu
1675           QStringList smenus = anActionData.myMenu.split( "/" );
1676           QString actionName = smenus.last();
1677           actionName = actionName.toUpper().prepend("MEN_");
1678           smenus.removeLast();
1679
1680           // path to action in toolbar
1681           QStringList stools = anActionData.myTooltip.split( "/" );
1682           QString actionTool = stools.last();
1683           actionTool = actionTool.toUpper().prepend("TOP_");
1684           stools.removeLast();
1685
1686           QString actionStat = anActionData.myStatusBar;
1687           actionStat = actionStat.toUpper().prepend("STB_");
1688
1689           createAction(id, // ~ anActionData.myLabel
1690                        tr(actionTool.toLatin1().constData()),
1691                        icon,
1692                        tr(actionName.toLatin1().constData()),
1693                        tr(actionStat.toLatin1().constData()),
1694                        0 /*accel*/,
1695                        application()->desktop(),
1696                        false /*toggle*/,
1697                        this, SLOT(OnGUIEvent()),
1698                        QString() /*shortcutAction*/);
1699
1700           int menuId = -1;
1701           foreach (QString subMenu, smenus) {
1702             subMenu = subMenu.toUpper().prepend("MEN_");
1703             menuId = createMenu(tr(subMenu.toLatin1().constData()), menuId, -1);
1704           }
1705           //createMenu(id, pluginMenuId, -1);
1706           createMenu(id, menuId, -1);
1707
1708           QString subTool = stools[0];
1709           subTool = subTool.toUpper().prepend("TOOL_");
1710           int toolId = createTool(tr(subTool.toLatin1().constData()));
1711           //createTool(id, advancedTbarId);
1712           createTool(id, toolId);
1713
1714           // add action id to map
1715           PluginAction anAction (aXmlHandler->myPluginData.myClientLib, anActionData.myLabel);
1716           myPluginActions[id] = anAction;
1717
1718           id++;
1719         }
1720       }
1721       else {
1722         SUIT_MessageBox::critical(application()->desktop(),
1723                                   tr("INF_PARSE_ERROR"),
1724                                   tr(aXmlHandler->errorProtocol().toLatin1().data()));
1725       }
1726       delete aXmlHandler;
1727     }
1728     else if ( i > 0 ) { // 1st is ~/CustomGeomPlugins.xml
1729       if (aNoAccessFiles.isEmpty())
1730         aNoAccessFiles = xmlFile;
1731       else
1732         aNoAccessFiles += ", " + xmlFile;
1733     }
1734   } // end loop on xmlFiles
1735
1736   if (!aNoAccessFiles.isEmpty()) {
1737     QString aMess = QObject::tr("PLUGIN_FILE_CANT_OPEN") + " " + aNoAccessFiles + "\n";
1738     aMess += QObject::tr("PLUGIN_FILE_CHECK_VARIABLE");
1739     SUIT_MessageBox::warning(application()->desktop(), tr("GEOM_WRN_WARNING"), aMess);
1740   }
1741 }
1742
1743 //=======================================================================
1744 // function : GeometryGUI::activateModule()
1745 // purpose  : Called when GEOM module is activated
1746 //=======================================================================
1747 bool GeometryGUI::activateModule( SUIT_Study* study )
1748 {
1749   if ( CORBA::is_nil( myComponentGeom ) )
1750     return false;
1751
1752   bool res = SalomeApp_Module::activateModule( study );
1753
1754   if ( !res )
1755     return false;
1756   setMenuShown( true );
1757   setToolShown( true );
1758
1759   // import Python module that manages GEOM plugins (need to be here because SalomePyQt API uses active module)
1760   PyGILState_STATE gstate = PyGILState_Ensure();
1761   PyObjWrapper pluginsmanager = PyImport_ImportModuleNoBlock((char*)"salome_pluginsmanager");
1762   if ( !pluginsmanager ) {
1763     PyErr_Print();
1764   }
1765   else {
1766     PyObjWrapper result =
1767       PyObject_CallMethod(pluginsmanager, (char*)"initialize", (char*)"isss", 1, "geom",
1768                           tr("MEN_NEW_ENTITY").toStdString().c_str(),
1769                           tr("GEOM_PLUGINS_OTHER").toStdString().c_str());
1770     if ( !result )
1771       PyErr_Print();
1772   }
1773   PyGILState_Release(gstate);
1774   // end of GEOM plugins loading
1775
1776   connect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
1777           this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
1778
1779   // Reset actions accelerator keys
1780   action(GEOMOp::OpImport)->setEnabled( true ); // Import: CTRL + Key_I
1781   action(GEOMOp::OpExport)->setEnabled( true ); // Export: CTRL + Key_E
1782   action(GEOMOp::OpDelete)->setEnabled( true ); // Delete: Key_Delete
1783
1784   GUIMap::Iterator it;
1785   for ( it = myGUIMap.begin(); it != myGUIMap.end(); ++it )
1786     it.value()->activate( application()->desktop() );
1787
1788   LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1789
1790   connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( updateCreationInfo() ));
1791   connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( onAutoBringToFront() ));
1792   connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() ));
1793
1794   if ( !myCreationInfoWdg )
1795     myCreationInfoWdg = new GEOMGUI_CreationInfoWdg( getApp() );
1796   getApp()->insertDockWindow( myCreationInfoWdg->getWinID(), myCreationInfoWdg );
1797   getApp()->placeDockWindow( myCreationInfoWdg->getWinID(), Qt::LeftDockWidgetArea );
1798
1799   SUIT_ViewManager* vm;
1800   ViewManagerList OCCViewManagers, VTKViewManagers;
1801
1802   application()->viewManagers( OCCViewer_Viewer::Type(), OCCViewManagers );
1803   QListIterator<SUIT_ViewManager*> itOCC( OCCViewManagers );
1804   while ( itOCC.hasNext() && (vm = itOCC.next()) )
1805     myOCCSelectors.append( new GEOMGUI_OCCSelector( ((OCCViewer_ViewManager*)vm)->getOCCViewer(), sm ) );
1806
1807   application()->viewManagers( SVTK_Viewer::Type(), VTKViewManagers );
1808   QListIterator<SUIT_ViewManager*> itVTK( VTKViewManagers );
1809   while ( itVTK.hasNext() && (vm = itVTK.next()) )
1810     myVTKSelectors.append( new LightApp_VTKSelector( dynamic_cast<SVTK_Viewer*>( vm->getViewModel() ), sm ) );
1811
1812   //NPAL 19674
1813   SALOME_ListIO selected;
1814   sm->selectedObjects( selected );
1815   sm->clearSelected();
1816
1817   // disable OCC selectors
1818   getApp()->selectionMgr()->setEnabled( false, OCCViewer_Viewer::Type() );
1819   QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
1820   while ( itOCCSel.hasNext() )
1821     if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
1822       sr->setEnabled(true);
1823
1824   // disable VTK selectors
1825   getApp()->selectionMgr()->setEnabled( false, SVTK_Viewer::Type() );
1826   QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
1827   while ( itVTKSel.hasNext() )
1828     if ( LightApp_VTKSelector* sr = itVTKSel.next() )
1829       sr->setEnabled(true);
1830
1831   sm->setSelectedObjects( selected, true );   //NPAL 19674
1832
1833   QMenu* viewMenu = menuMgr()->findMenu( STD_Application::MenuViewId );
1834   if ( viewMenu )
1835     connect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ) );
1836
1837   // 0020836 (Basic vectors and origin)
1838   SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
1839   if ( aResourceMgr->booleanValue( "Geometry", "auto_create_base_objects", false ) ) {
1840     SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
1841     if ( appStudy ) {
1842       _PTR(Study) studyDS = appStudy->studyDS();
1843       if ( studyDS ) {
1844         _PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
1845         if ( !aSComponent ) // create objects automatically only if there is no GEOM component
1846           createOriginAndBaseVectors();
1847       }
1848     }
1849   }
1850
1851   return true;
1852 }
1853
1854 //=======================================================================
1855 // function : GeometryGUI::deactivateModule()
1856 // purpose  : Called when GEOM module is deactivated
1857 //=======================================================================
1858 bool GeometryGUI::deactivateModule( SUIT_Study* study )
1859 {
1860   QMenu* viewMenu = menuMgr()->findMenu( STD_Application::MenuViewId );
1861   if ( viewMenu )
1862     disconnect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ) );
1863
1864   setMenuShown( false );
1865   setToolShown( false );
1866
1867   disconnect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
1868              this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
1869
1870   LightApp_SelectionMgr* selMrg = getApp()->selectionMgr();
1871
1872   disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateCreationInfo() ));
1873   disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() ));
1874   getApp()->removeDockWindow( myCreationInfoWdg->getWinID() );
1875   myCreationInfoWdg = 0;
1876
1877   EmitSignalCloseAllDialogs();
1878
1879   GUIMap::Iterator it;
1880   for ( it = myGUIMap.begin(); it != myGUIMap.end(); ++it )
1881     it.value()->deactivate();
1882
1883   // Unset actions accelerator keys
1884   action(GEOMOp::OpImport)->setEnabled( false ); // Import: CTRL + Key_I
1885   action(GEOMOp::OpExport)->setEnabled( false ); // Export: CTRL + Key_E
1886   action(GEOMOp::OpDelete)->setEnabled( false ); // Delete: Key_Delete
1887
1888   qDeleteAll(myOCCSelectors);
1889   myOCCSelectors.clear();
1890   selMrg->setEnabled( true, OCCViewer_Viewer::Type() );
1891
1892   qDeleteAll(myVTKSelectors);
1893   myVTKSelectors.clear();
1894   selMrg->setEnabled( true, SVTK_Viewer::Type() );
1895
1896   return SalomeApp_Module::deactivateModule( study );
1897 }
1898
1899 //=======================================================================
1900 // function : onWindowActivated()
1901 // purpose  : update menu items' status - disable non-OCC-viewer-compatible actions
1902 //=======================================================================
1903 void GeometryGUI::onWindowActivated( SUIT_ViewWindow* win )
1904 {
1905   if ( !win )
1906     return;
1907
1908   const bool ViewOCC = ( win->getViewManager()->getType() == OCCViewer_Viewer::Type() );
1909   //const bool ViewVTK = ( win->getViewManager()->getType() == SVTK_Viewer::Type() );
1910
1911   // disable non-OCC viewframe menu commands
1912 //  action( GEOMOp::Op2dSketcher )->setEnabled( ViewOCC ); // SKETCHER
1913   action( GEOMOp::OpSuppressFaces )->setEnabled( ViewOCC ); // SuppressFace
1914   action( GEOMOp::OpSuppressHoles )->setEnabled( ViewOCC ); // SuppressHole
1915   action( GEOMOp::OpCloseContour )->setEnabled( ViewOCC ); // CloseContour
1916   action( GEOMOp::OpRemoveIntWires )->setEnabled( ViewOCC ); // RemoveInternalWires
1917   action( GEOMOp::OpAddPointOnEdge )->setEnabled( ViewOCC ); // AddPointOnEdge
1918 //  action( GEOMOp::OpFreeBoundaries )->setEnabled( ViewOCC ); // Free boundaries
1919
1920   action( GEOMOp::OpGroupCreate )->setEnabled( ViewOCC ); // Create Group
1921   action( GEOMOp::OpGroupEdit )->setEnabled( ViewOCC ); // Edit Group
1922   action( GEOMOp::OpCreateField )->setEnabled( ViewOCC ); // Create Field
1923   action( GEOMOp::OpEditField )->setEnabled( ViewOCC ); // Edit Field
1924
1925   action( GEOMOp::OpMultiTransform )->setEnabled( ViewOCC ); // MENU BLOCKS - MULTI-TRANSFORMATION
1926 }
1927
1928 void GeometryGUI::windows( QMap<int, int>& mappa ) const
1929 {
1930   mappa.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea );
1931   mappa.insert( SalomeApp_Application::WT_PyConsole, Qt::BottomDockWidgetArea );
1932   if ( myCreationInfoWdg )
1933     mappa.insert( myCreationInfoWdg->getWinID(), Qt::LeftDockWidgetArea );
1934 }
1935
1936 void GeometryGUI::viewManagers( QStringList& lst ) const
1937 {
1938   lst.append( OCCViewer_Viewer::Type() );
1939 }
1940
1941 void GeometryGUI::onViewManagerAdded( SUIT_ViewManager* vm )
1942 {
1943   if ( vm && vm->getType() == OCCViewer_Viewer::Type() )
1944   {
1945     qDebug( "connect" );
1946     connect( vm, SIGNAL( keyPress  ( SUIT_ViewWindow*, QKeyEvent* ) ),
1947              this, SLOT( OnKeyPress( SUIT_ViewWindow*, QKeyEvent* ) ) );
1948     connect( vm, SIGNAL( mousePress( SUIT_ViewWindow*, QMouseEvent* ) ),
1949              this, SLOT( OnMousePress( SUIT_ViewWindow*, QMouseEvent* ) ) );
1950     connect( vm, SIGNAL( mouseMove ( SUIT_ViewWindow*, QMouseEvent* ) ),
1951              this, SLOT( OnMouseMove( SUIT_ViewWindow*, QMouseEvent* ) ) );
1952     connect( vm, SIGNAL( mouseRelease ( SUIT_ViewWindow*, QMouseEvent* ) ),
1953              this, SLOT( OnMouseRelease( SUIT_ViewWindow*, QMouseEvent* ) ) );
1954
1955     LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1956     myOCCSelectors.append( new GEOMGUI_OCCSelector( ((OCCViewer_ViewManager*)vm)->getOCCViewer(), sm ) );
1957
1958     // disable OCC selectors
1959     getApp()->selectionMgr()->setEnabled( false, OCCViewer_Viewer::Type() );
1960     QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
1961     while ( itOCCSel.hasNext() )
1962       if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
1963         sr->setEnabled(true);
1964   }
1965   else if ( vm->getType() == SVTK_Viewer::Type() )
1966   {
1967     LightApp_SelectionMgr* sm = getApp()->selectionMgr();
1968     myVTKSelectors.append( new LightApp_VTKSelector( dynamic_cast<SVTK_Viewer*>( vm->getViewModel() ), sm ) );
1969
1970     // disable VTK selectors
1971     getApp()->selectionMgr()->setEnabled( false, SVTK_Viewer::Type() );
1972     QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
1973     while ( itVTKSel.hasNext() )
1974       if ( LightApp_VTKSelector* sr = itVTKSel.next() )
1975         sr->setEnabled(true);
1976   }
1977 }
1978
1979 void GeometryGUI::onViewManagerRemoved( SUIT_ViewManager* vm )
1980 {
1981   SUIT_ViewModel* viewer = vm->getViewModel();
1982   if ( vm->getType() == OCCViewer_Viewer::Type() )
1983   {
1984     QListIterator<GEOMGUI_OCCSelector*> itOCCSel( myOCCSelectors );
1985     while ( itOCCSel.hasNext() )
1986       if ( GEOMGUI_OCCSelector* sr = itOCCSel.next() )
1987         if ( sr->viewer() == viewer )
1988         {
1989           /*delete*/ myOCCSelectors.takeAt( myOCCSelectors.indexOf( sr ) );
1990           break;
1991         }
1992   }
1993   if ( vm->getType() == SVTK_Viewer::Type() )
1994   {
1995     QListIterator<LightApp_VTKSelector*> itVTKSel( myVTKSelectors );
1996     while ( itVTKSel.hasNext() )
1997       if ( LightApp_VTKSelector* sr = itVTKSel.next() )
1998         if ( sr->viewer() == viewer )
1999         {
2000           /*delete*/ myVTKSelectors.takeAt( myVTKSelectors.indexOf( sr ) );
2001           break;
2002         }
2003   }
2004 }
2005
2006 //================================================================================
2007 /*!
2008  * \brief Slot called when selection changed. Shows creation info of a selected object
2009  */
2010 //================================================================================
2011
2012 void GeometryGUI::updateCreationInfo()
2013 {
2014   if ( myCreationInfoWdg )
2015     myCreationInfoWdg->clear();
2016
2017   // Code below is commented to have myCreationInfoWdg filled as soon as it is shown again
2018   // if ( !myCreationInfoWdg->isVisible() )
2019   //   return;
2020
2021   // look for a sole selected GEOM_Object
2022   GEOM::GEOM_BaseObject_var geomObj;
2023
2024   SALOME_ListIO selected;
2025   getApp()->selectionMgr()->selectedObjects( selected );
2026
2027   _PTR(Study) study = dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() )->studyDS();
2028   SALOME_ListIteratorOfListIO selIt( selected );
2029   for ( ; selIt.More(); selIt.Next() )
2030   {
2031     Handle(SALOME_InteractiveObject) io = selIt.Value();
2032     if ( !io->hasEntry() ) continue;
2033     _PTR(SObject) sobj = study->FindObjectID( io->getEntry() );
2034     if ( !sobj ) continue;
2035     CORBA::Object_var          obj = GeometryGUI::ClientSObjectToObject( sobj );
2036     GEOM::GEOM_BaseObject_var gobj = GEOM::GEOM_BaseObject::_narrow( obj );
2037     if ( !gobj->_is_nil() )
2038     {
2039       if ( !geomObj->_is_nil() )
2040         return; // several GEOM objects selected
2041       geomObj = gobj;
2042     }
2043   }
2044   if ( geomObj->_is_nil() ) return;
2045
2046   // pass creation info of geomObj to myCreationInfoWdg
2047
2048   if ( myCreationInfoWdg ) {
2049     QPixmap icon;
2050     QString operationName;
2051     myCreationInfoWdg->setOperation( icon, operationName );
2052
2053     try {
2054       OCC_CATCH_SIGNALS;
2055       GEOM::CreationInformation_var info = geomObj->GetCreationInformation();
2056       if ( &info.in() ) {
2057         SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
2058         QString name = info->operationName.in();
2059         if ( !name.isEmpty() ) {
2060           icon = resMgr->loadPixmap( "GEOM", tr( ("ICO_"+name).toLatin1().constData() ), false );
2061           operationName = tr( ("MEN_"+name).toLatin1().constData() );
2062           if ( operationName.startsWith( "MEN_" ))
2063             operationName = name; // no translation
2064           myCreationInfoWdg->setOperation( icon, operationName );
2065
2066           for ( size_t i = 0; i < info->params.length(); ++i )
2067             myCreationInfoWdg->addParam( info->params[i].name.in(),
2068                                          info->params[i].value.in() );
2069         }
2070       }
2071     }
2072     catch (...) {
2073     }
2074   }
2075 }
2076
2077 void GeometryGUI::onAutoBringToFront()
2078 {
2079   bool isAutoBringToFront = SUIT_Session::session()->resourceMgr()->booleanValue( "Geometry", "auto_bring_to_front" );
2080   if( !isAutoBringToFront )
2081     return;
2082
2083   SUIT_ViewWindow* SUIT_window = application()->desktop()->activeWindow();
2084   if ( !SUIT_window || SUIT_window->getViewManager()->getType() != OCCViewer_Viewer::Type() )
2085         return;
2086
2087   SalomeApp_Study* appStudy = dynamic_cast< SalomeApp_Study* >( getApp()->activeStudy() );
2088   if (!appStudy) return;
2089
2090   GEOM_Displayer displayer( appStudy );
2091
2092   SALOME_View* window = displayer.GetActiveView();
2093   if ( !window ) return;
2094
2095   int aMgrId = dynamic_cast< SUIT_ViewModel* >( window )->getViewManager()->getGlobalId();
2096
2097   SALOME_ListIO selected;
2098   getApp()->selectionMgr()->selectedObjects( selected );
2099   SALOME_ListIO allObjects;
2100   window->GetVisible( allObjects );
2101
2102   for ( SALOME_ListIteratorOfListIO It( allObjects ); It.More(); It.Next() ) {
2103     Handle( SALOME_InteractiveObject ) io = It.Value();
2104     bool isSelected = false;
2105     for( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) {
2106       Handle( SALOME_InteractiveObject ) ioSelected = It.Value();
2107       if( io->isSame( ioSelected ) )
2108         isSelected = true;
2109     }
2110     QVariant v = appStudy->getObjectProperty( aMgrId, io->getEntry(), GEOM::propertyName( GEOM::TopLevel ), QVariant() );
2111     bool isTopLevel =  v.isValid() ? v.toBool() : false;
2112     if( isSelected && !isTopLevel ) {
2113       appStudy->setObjectProperty( aMgrId, io->getEntry(), GEOM::propertyName( GEOM::TopLevel ), true );
2114       if ( window->isVisible( io ) ) displayer.Redisplay( io, false );
2115     }
2116     else if( !isSelected ) {
2117       appStudy->setObjectProperty( aMgrId, io->getEntry(), GEOM::propertyName( GEOM::TopLevel ), false );
2118       if ( window->isVisible( io ) ) displayer.Redisplay( io, false );
2119     }
2120   }
2121   displayer.UpdateViewer();
2122   GeometryGUI::Modified();
2123 }
2124
2125 void GeometryGUI::updateFieldColorScale()
2126 {
2127   if( SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) )
2128   {
2129     GEOM_Displayer aDisplayer( aStudy );
2130     aDisplayer.UpdateColorScale();
2131   }
2132 }
2133
2134 QString GeometryGUI::engineIOR() const
2135 {
2136   if ( !CORBA::is_nil( GetGeomGen() ) )
2137     return QString( getApp()->orb()->object_to_string( GetGeomGen() ) );
2138   return "";
2139 }
2140
2141 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
2142 Handle(TColStd_HArray1OfByte) GeometryGUI::getTexture
2143 #else
2144 Handle(Graphic3d_HArray1OfBytes) GeometryGUI::getTexture
2145 #endif
2146       (SalomeApp_Study* theStudy, int theId, int& theWidth, int& theHeight)
2147 {
2148   theWidth = theHeight = 0;
2149
2150 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
2151   Handle(TColStd_HArray1OfByte) aTexture;
2152 #else
2153   Handle(Graphic3d_HArray1OfBytes) aTexture;
2154 #endif
2155
2156   if (theStudy) {
2157     TextureMap aTextureMap = myTextureMap[ theStudy->studyDS()->StudyId() ];
2158     aTexture = aTextureMap[ theId ];
2159     if ( aTexture.IsNull() ) {
2160       GEOM::GEOM_IInsertOperations_var aInsOp = GeometryGUI::GetGeomGen()->GetIInsertOperations( theStudy->studyDS()->StudyId() );
2161       if ( !aInsOp->_is_nil() ) {
2162         CORBA::Long aWidth, aHeight;
2163         SALOMEDS::TMPFile_var aStream = aInsOp->GetTexture( theId, aWidth, aHeight );
2164         if ( aWidth > 0 && aHeight > 0 && aStream->length() > 0 ) {
2165           theWidth  = aWidth;
2166           theHeight = aHeight;
2167
2168 #if OCC_VERSION_LARGE > 0x06040000 // Porting to OCCT6.5.1
2169           aTexture  = new TColStd_HArray1OfByte (1, aStream->length());
2170 #else
2171           aTexture  = new Graphic3d_HArray1OfBytes (1, aStream->length());
2172 #endif
2173
2174           for (int i = 0; i < aStream->length(); i++)
2175             aTexture->SetValue( i+1, (Standard_Byte)aStream[i] );
2176           aTextureMap[ theId ] = aTexture;
2177         }
2178       }
2179     }
2180   }
2181   return aTexture;
2182 }
2183
2184 LightApp_Selection* GeometryGUI::createSelection() const
2185 {
2186   return new GEOMGUI_Selection();
2187 }
2188
2189 void GeometryGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& title )
2190 {
2191   SalomeApp_Module::contextMenuPopup( client, menu, title );
2192   SALOME_ListIO lst;
2193   getApp()->selectionMgr()->selectedObjects( lst );
2194
2195   //Add submenu for predefined materials
2196   bool isPredefMat = SUIT_Session::session()->resourceMgr()->booleanValue( "Geometry", "predef_materials" );
2197   if ( ( client == "OCCViewer" || client == "VTKViewer" ) && lst.Extent() > 0 ) {
2198     QtxPopupMgr* mgr = popupMgr();
2199     //get parrent for submenu
2200     QAction* act = mgr->action( mgr->actionId( action(  GEOMOp::OpMaterialProperties ) ) );
2201     //Clear old  menu
2202     QMenu* oldMenu = act->menu() ;
2203     if( oldMenu ) {
2204       delete oldMenu;
2205     }
2206     if( isPredefMat ){
2207       QMenu* matMenu = new QMenu();
2208       QSignalMapper* signalMapper = new QSignalMapper( matMenu );
2209
2210       //Get current material model for the object
2211       QVariant v;
2212       LightApp_Application* anApp = dynamic_cast<LightApp_Application*>( getApp() );
2213       if ( anApp && anApp->activeViewManager() ) {
2214         LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( anApp->activeStudy() );
2215         if( aStudy ) {
2216           v = aStudy->getObjectProperty( anApp->activeViewManager()->getGlobalId(), lst.Last()->getEntry(), GEOM::propertyName( GEOM::Material ), QVariant() );
2217         }
2218       }
2219       QString curModel = "";
2220       if ( v.canConvert<QString>() ) curModel = v.toString();
2221       // get list of all predefined materials
2222       QStringList materials = Material_ResourceMgr::resourceMgr()->materials();
2223       bool found = false;
2224       foreach ( QString material, materials )
2225       {
2226         QAction* menAct = matMenu->addAction( material );
2227         connect(menAct, SIGNAL( toggled( bool ) ), signalMapper, SLOT( map() ) );
2228         signalMapper->setMapping( menAct, material );
2229         menAct->setCheckable( true );
2230         // Set checked if this material is current
2231         Material_Model aModel;
2232         aModel.fromResources( material );
2233         if ( !found && aModel.toProperties() == curModel ) {
2234           menAct->setChecked( true );
2235           found = true;
2236         }
2237       }
2238       matMenu->insertAction( matMenu->addSeparator(), action(  GEOMOp::OpPredefMaterCustom ) );
2239       matMenu->insertSeparator( action(  GEOMOp::OpPredefMaterCustom ) );
2240       connect( signalMapper, SIGNAL( mapped( const QString & ) ),
2241                  this, SLOT( OnSetMaterial( const QString & ) ) );
2242       act->setMenu( matMenu );
2243     }
2244   }
2245   //Set name
2246   if ( ( client == "OCCViewer" || client == "VTKViewer" ) && lst.Extent() == 1 ) {
2247     Handle(SALOME_InteractiveObject) io = lst.First();
2248     SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
2249     _PTR(Study) study = appStudy->studyDS();
2250     _PTR(SObject) obj = study->FindObjectID( io->getEntry() );
2251     if ( obj ) {
2252       QString aName = QString( obj->GetName().c_str() );
2253       aName.remove( QRegExp("\\s+$") );
2254       title = aName;
2255     }
2256   }
2257 }
2258
2259 void GeometryGUI::OnSetMaterial(const QString& theName)
2260 {
2261   OnGUIEvent( GEOMOp::OpPredefMaterial, QVariant( theName ) );
2262 }
2263
2264
2265 void GeometryGUI::createPreferences()
2266 {
2267   int tabId = addPreference( tr( "PREF_TAB_SETTINGS" ) );
2268
2269   int genGroup = addPreference( tr( "PREF_GROUP_GENERAL" ), tabId );
2270   setPreferenceProperty( genGroup, "columns", 2 );
2271
2272   int dispmode = addPreference( tr( "PREF_DISPLAY_MODE" ), genGroup,
2273                                 LightApp_Preferences::Selector,
2274                                 "Geometry", "display_mode" );
2275
2276   addPreference( tr( "PREF_SHADING_COLOR" ), genGroup,
2277                  LightApp_Preferences::Color, "Geometry", "shading_color" );
2278
2279   addPreference( tr( "PREF_EDGES_IN_SHADING" ), genGroup,
2280                  LightApp_Preferences::Color, "Geometry", "edges_in_shading_color" );
2281
2282   addPreference( tr( "PREF_WIREFRAME_COLOR" ), genGroup,
2283                  LightApp_Preferences::Color, "Geometry", "wireframe_color" );
2284
2285   addPreference( tr( "PREF_FREE_BOUND_COLOR" ), genGroup,
2286                  LightApp_Preferences::Color, "Geometry", "free_bound_color" );
2287
2288   addPreference( tr( "PREF_LINE_COLOR"), genGroup,
2289                  LightApp_Preferences::Color, "Geometry", "line_color" );
2290
2291   addPreference( tr( "PREF_POINT_COLOR"), genGroup,
2292                  LightApp_Preferences::Color, "Geometry", "point_color" );
2293
2294   addPreference( tr( "PREF_ISOS_COLOR" ), genGroup,
2295                  LightApp_Preferences::Color, "Geometry", "isos_color" );
2296
2297   addPreference( tr( "PREF_TOPLEVEL_COLOR" ), genGroup,
2298                  LightApp_Preferences::Color, "Geometry", "toplevel_color" );
2299
2300   int top_lev_dm = addPreference( tr( "PREF_TOPLEVEL_DM" ), genGroup,
2301                       LightApp_Preferences::Selector, "Geometry", "toplevel_dm" );
2302
2303   int step = addPreference( tr( "PREF_STEP_VALUE" ), genGroup,
2304                             LightApp_Preferences::IntSpin, "Geometry", "SettingsGeomStep" );
2305
2306   int defl = addPreference( tr( "PREF_DEFLECTION" ), genGroup,
2307                             LightApp_Preferences::DblSpin, "Geometry", "deflection_coeff" );
2308
2309   addPreference( tr( "PREF_PREDEF_MATERIALS" ), genGroup,
2310                  LightApp_Preferences::Bool, "Geometry", "predef_materials" );
2311
2312   int material = addPreference( tr( "PREF_MATERIAL" ), genGroup,
2313                                 LightApp_Preferences::Selector,
2314                                 "Geometry", "material" );
2315
2316   addPreference( tr( "PREF_EDITGROUP_COLOR" ), genGroup,
2317                  LightApp_Preferences::Color, "Geometry", "editgroup_color" );
2318
2319   const int nb = 4;
2320   int wd[nb];
2321   int iter=0;
2322
2323   wd[iter++] = addPreference( tr( "PREF_EDGE_WIDTH" ), genGroup,
2324                               LightApp_Preferences::IntSpin, "Geometry", "edge_width" );
2325
2326   wd[iter++] = addPreference( tr( "PREF_ISOLINES_WIDTH" ), genGroup,
2327                               LightApp_Preferences::IntSpin, "Geometry", "isolines_width" );
2328
2329   wd[iter++] = addPreference( tr( "PREF_PREVIEW_EDGE_WIDTH" ), genGroup,
2330                                      LightApp_Preferences::IntSpin, "Geometry", "preview_edge_width" );
2331
2332   wd[iter++] = addPreference( tr( "PREF_MEASURES_LINE_WIDTH" ), genGroup,
2333                               LightApp_Preferences::IntSpin, "Geometry", "measures_line_width" );
2334
2335   for (int i = 0; i < nb; i++) {
2336     setPreferenceProperty( wd[i], "min", 1 );
2337     setPreferenceProperty( wd[i], "max", 5 );
2338   }
2339
2340   addPreference( tr( "PREF_AUTO_BRING_TO_FRONT" ), genGroup,
2341                  LightApp_Preferences::Bool, "Geometry", "auto_bring_to_front" );
2342
2343   int isoGroup = addPreference( tr( "PREF_ISOS" ), tabId );
2344   setPreferenceProperty( isoGroup, "columns", 2 );
2345   int isoU = addPreference( tr( "PREF_ISOS_U" ), isoGroup,
2346                             LightApp_Preferences::IntSpin, "Geometry", "iso_number_u" );
2347   setPreferenceProperty( isoU, "min", 0 );
2348   setPreferenceProperty( isoU, "max", 100000 );
2349   int isoV = addPreference( tr( "PREF_ISOS_V" ), isoGroup,
2350                             LightApp_Preferences::IntSpin, "Geometry", "iso_number_v" );
2351   setPreferenceProperty( isoV, "min", 0 );
2352   setPreferenceProperty( isoV, "max", 100000 );
2353
2354   // Quantities with individual precision settings
2355   int precGroup = addPreference( tr( "GEOM_PREF_GROUP_PRECISION" ), tabId );
2356   setPreferenceProperty( precGroup, "columns", 2 );
2357
2358   const int nbQuantities = 8;
2359   int prec[nbQuantities], ii = 0;
2360   prec[ii++] = addPreference( tr( "GEOM_PREF_length_precision" ), precGroup,
2361                               LightApp_Preferences::IntSpin, "Geometry", "length_precision" );
2362   prec[ii++] = addPreference( tr( "GEOM_PREF_angle_precision" ), precGroup,
2363                               LightApp_Preferences::IntSpin, "Geometry", "angle_precision" );
2364   prec[ii++] = addPreference( tr( "GEOM_PREF_len_tol_precision" ), precGroup,
2365                               LightApp_Preferences::IntSpin, "Geometry", "len_tol_precision" );
2366   prec[ii++] = addPreference( tr( "GEOM_PREF_ang_tol_precision" ), precGroup,
2367                               LightApp_Preferences::IntSpin, "Geometry", "ang_tol_precision" );
2368   prec[ii++] = addPreference( tr( "GEOM_PREF_weight_precision" ), precGroup,
2369                               LightApp_Preferences::IntSpin, "Geometry", "weight_precision" );
2370   prec[ii++] = addPreference( tr( "GEOM_PREF_density_precision" ), precGroup,
2371                               LightApp_Preferences::IntSpin, "Geometry", "density_precision" );
2372   prec[ii++] = addPreference( tr( "GEOM_PREF_parametric_precision" ), precGroup,
2373                               LightApp_Preferences::IntSpin, "Geometry", "parametric_precision" );
2374   prec[ii  ] = addPreference( tr( "GEOM_PREF_param_tol_precision" ), precGroup,
2375                               LightApp_Preferences::IntSpin, "Geometry", "param_tol_precision" );
2376
2377   // Set property for precision value for spinboxes
2378   for ( ii = 0; ii < nbQuantities; ii++ ){
2379     setPreferenceProperty( prec[ii], "min", -14 );
2380     setPreferenceProperty( prec[ii], "max", 14 );
2381     setPreferenceProperty( prec[ii], "precision", 2 );
2382   }
2383
2384   int VertexGroup = addPreference( tr( "PREF_GROUP_VERTEX" ), tabId );
2385   setPreferenceProperty( VertexGroup, "columns", 2 );
2386
2387   int typeOfMarker = addPreference( tr( "PREF_TYPE_OF_MARKER" ), VertexGroup,
2388                                     LightApp_Preferences::Selector, "Geometry", "type_of_marker" );
2389
2390   int markerScale = addPreference( tr( "PREF_MARKER_SCALE" ), VertexGroup,
2391                                    LightApp_Preferences::Selector, "Geometry", "marker_scale" );
2392
2393   // Set property for default display mode
2394   QStringList aModesList;
2395   aModesList.append( tr("MEN_WIREFRAME") );
2396   aModesList.append( tr("MEN_SHADING") );
2397   aModesList.append( tr("MEN_SHADING_WITH_EDGES") );
2398
2399   QList<QVariant> anIndexesList;
2400   anIndexesList.append(0);
2401   anIndexesList.append(1);
2402   anIndexesList.append(2);
2403
2404   setPreferenceProperty( dispmode, "strings", aModesList );
2405   setPreferenceProperty( dispmode, "indexes", anIndexesList );
2406
2407   // Set property for top level display mode
2408   QStringList aTopModesList;
2409   aTopModesList.append( tr("MEN_SHOW_ADD_WACTOR") );
2410   aTopModesList.append( tr("MEN_KEEP_CURRENT_DM") );
2411   aTopModesList.append( tr("MEN_WIREFRAME") );
2412   aTopModesList.append( tr("MEN_SHADING") );
2413   aTopModesList.append( tr("MEN_SHADING_WITH_EDGES") );
2414
2415   QList<QVariant> aTopIndexesList;
2416   aTopIndexesList.append(0);
2417   aTopIndexesList.append(1);
2418   aTopIndexesList.append(2);
2419   aTopIndexesList.append(3);
2420   aTopIndexesList.append(4);
2421
2422   setPreferenceProperty( top_lev_dm, "strings", aTopModesList );
2423   setPreferenceProperty( top_lev_dm, "indexes", aTopIndexesList );
2424
2425   // Set property for step value for spinboxes
2426   setPreferenceProperty( step, "min", 1 );
2427   setPreferenceProperty( step, "max", 10000 );
2428   setPreferenceProperty( step, "precision", 3 );
2429
2430   // Set property for deflection value for spinboxes
2431   setPreferenceProperty( defl, "min", GEOM::minDeflection() );
2432   setPreferenceProperty( defl, "max", 1.0 );
2433   setPreferenceProperty( defl, "step", 1.0e-04 );
2434   setPreferenceProperty( defl, "precision", 6 );
2435
2436   // Set property for default material
2437   setPreferenceProperty( material, "strings", Material_ResourceMgr::resourceMgr()->materials() );
2438
2439   // Set property vertex marker type
2440   QList<QVariant> aMarkerTypeIndicesList;
2441   QList<QVariant> aMarkerTypeIconsList;
2442
2443   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
2444   for ( int i = GEOM::MT_POINT; i < GEOM::MT_USER; i++ ) {
2445     QString icoFile = QString( "ICON_VERTEX_MARKER_%1" ).arg( i );
2446     QPixmap pixmap = resMgr->loadPixmap( "GEOM", tr( qPrintable( icoFile ) ) );
2447     aMarkerTypeIndicesList << (i-1);
2448     aMarkerTypeIconsList << pixmap;
2449   }
2450
2451   setPreferenceProperty( typeOfMarker, "indexes", aMarkerTypeIndicesList );
2452   setPreferenceProperty( typeOfMarker, "icons",   aMarkerTypeIconsList );
2453
2454   // Set property for vertex marker scale
2455   QList<QVariant> aMarkerScaleIndicesList;
2456   QStringList     aMarkerScaleValuesList;
2457
2458   for ( int iii = GEOM::MS_10; iii <= GEOM::MS_70; iii++ ) {
2459     aMarkerScaleIndicesList << iii;
2460     aMarkerScaleValuesList  << QString::number( (iii-(int)GEOM::MS_10)*0.5 + 1.0 );
2461   }
2462
2463   setPreferenceProperty( markerScale, "strings", aMarkerScaleValuesList );
2464   setPreferenceProperty( markerScale, "indexes", aMarkerScaleIndicesList );
2465
2466   // Scalar bar for field step presentation
2467   int scalarBarGroup = addPreference( tr( "PREF_GROUP_SCALAR_BAR" ), tabId );
2468   setPreferenceProperty( scalarBarGroup, "columns", 2 );
2469
2470   int sbXPosition = addPreference( tr( "PREF_SCALAR_BAR_X_POSITION" ), scalarBarGroup,
2471                                    LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_x_position" );
2472   setPreferenceProperty( sbXPosition, "min", 0 );
2473   setPreferenceProperty( sbXPosition, "max", 1 );
2474   setPreferenceProperty( sbXPosition, "step", 0.05 );
2475
2476   int sbYPosition = addPreference( tr( "PREF_SCALAR_BAR_Y_POSITION" ), scalarBarGroup,
2477                                    LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_y_position" );
2478   setPreferenceProperty( sbYPosition, "min", 0 );
2479   setPreferenceProperty( sbYPosition, "max", 1 );
2480   setPreferenceProperty( sbYPosition, "step", 0.05 );
2481
2482   int sbWidth = addPreference( tr( "PREF_SCALAR_BAR_WIDTH" ), scalarBarGroup,
2483                                LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_width" );
2484   setPreferenceProperty( sbWidth, "min", 0 );
2485   setPreferenceProperty( sbWidth, "max", 1 );
2486   setPreferenceProperty( sbWidth, "step", 0.05 );
2487
2488   int sbHeight = addPreference( tr( "PREF_SCALAR_BAR_HEIGHT" ), scalarBarGroup,
2489                                 LightApp_Preferences::DblSpin, "Geometry", "scalar_bar_height" );
2490   setPreferenceProperty( sbHeight, "min", 0 );
2491   setPreferenceProperty( sbHeight, "max", 1 );
2492   setPreferenceProperty( sbHeight, "step", 0.05 );
2493
2494   int sbTextHeight = addPreference( tr( "PREF_SCALAR_BAR_TEXT_HEIGHT" ), scalarBarGroup,
2495                                     LightApp_Preferences::IntSpin, "Geometry", "scalar_bar_text_height" );
2496   setPreferenceProperty( sbTextHeight, "min", 6 );
2497   setPreferenceProperty( sbTextHeight, "max", 24 );
2498   setPreferenceProperty( sbTextHeight, "step", 1 );
2499
2500   int sbNbIntervals = addPreference( tr( "PREF_SCALAR_BAR_NUMBER_OF_INTERVALS" ), scalarBarGroup,
2501                                      LightApp_Preferences::IntSpin, "Geometry", "scalar_bar_nb_intervals" );
2502   setPreferenceProperty( sbNbIntervals, "min", 2 );
2503   setPreferenceProperty( sbNbIntervals, "max", 64 );
2504   setPreferenceProperty( sbNbIntervals, "step", 1 );
2505
2506   int originGroup = addPreference( tr( "PREF_GROUP_ORIGIN_AND_BASE_VECTORS" ), tabId );
2507   setPreferenceProperty( originGroup, "columns", 2 );
2508
2509   int baseVectorsLength = addPreference( tr( "PREF_BASE_VECTORS_LENGTH" ), originGroup,
2510                                          LightApp_Preferences::DblSpin, "Geometry", "base_vectors_length" );
2511   setPreferenceProperty( baseVectorsLength, "min", 0.01 );
2512   setPreferenceProperty( baseVectorsLength, "max", 1000 );
2513
2514   addPreference( tr( "PREF_AUTO_CREATE" ), originGroup,
2515                  LightApp_Preferences::Bool, "Geometry", "auto_create_base_objects" );
2516
2517   int operationsGroup = addPreference( tr( "PREF_GROUP_OPERATIONS" ), tabId );
2518   setPreferenceProperty( operationsGroup, "columns", 2 );
2519
2520   addPreference( tr( "GEOM_PREVIEW" ), operationsGroup,
2521                  LightApp_Preferences::Bool, "Geometry", "geom_preview" );
2522 }
2523
2524 void GeometryGUI::preferencesChanged( const QString& section, const QString& param )
2525 {
2526   if (section == "Geometry") {
2527     SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
2528     if (param == QString("SettingsGeomStep")) {
2529       double spin_step = aResourceMgr->doubleValue(section, param, 100.);
2530       EmitSignalDefaultStepValueChanged(spin_step);
2531     }
2532     else if (param == QString("toplevel_color")) {
2533       QColor c = aResourceMgr->colorValue( "Geometry", "toplevel_color", QColor( 170, 85, 0 ) );
2534       GEOM_AISShape::setTopLevelColor(SalomeApp_Tools::color(c));
2535     }
2536     else if (param == QString("toplevel_dm")) {
2537       GEOM_AISShape::setTopLevelDisplayMode((GEOM_AISShape::TopLevelDispMode)aResourceMgr->integerValue("Geometry", "toplevel_dm", 0));
2538     }
2539     else if (param == QString("scalar_bar_x_position") ||
2540              param == QString("scalar_bar_y_position") ||
2541              param == QString("scalar_bar_width") ||
2542              param == QString("scalar_bar_height") ||
2543              param == QString("scalar_bar_text_height") ||
2544              param == QString("scalar_bar_nb_intervals")) {
2545       if( SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) )
2546       {
2547         GEOM_Displayer aDisplayer( aStudy );
2548         bool anIsRedisplayFieldSteps = param == QString("scalar_bar_nb_intervals");
2549         aDisplayer.UpdateColorScale( anIsRedisplayFieldSteps, true );
2550       }
2551     }
2552   }
2553 }
2554
2555 LightApp_Displayer* GeometryGUI::displayer()
2556 {
2557   if ( !myDisplayer )
2558     myDisplayer = new GEOM_Displayer( dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) );
2559   return myDisplayer;
2560 }
2561
2562 void GeometryGUI::setLocalSelectionMode(const int mode)
2563 {
2564   myLocalSelectionMode = mode;
2565 }
2566
2567 int GeometryGUI::getLocalSelectionMode() const
2568 {
2569   return myLocalSelectionMode;
2570 }
2571
2572 const char gSeparator = '_'; // character used to separate parameter names
2573 const char gDigitsSep = ':'; // character used to separate numeric parameter values (color = r:g:b)
2574
2575 /*!
2576  * \brief Store visual parameters
2577  *
2578  * This method is called just before the study document is saved.
2579  * Store visual parameters in AttributeParameter attribute(s)
2580  */
2581 void GeometryGUI::storeVisualParameters (int savePoint)
2582 {
2583   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
2584   if ( !appStudy || !appStudy->studyDS() )
2585     return;
2586   _PTR(Study) studyDS = appStudy->studyDS();
2587
2588   // componentName is used for encoding of entries when storing them in IParameters
2589   std::string componentName = myComponentGeom->ComponentDataType();
2590   //_PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
2591   //if (!aSComponent) return;
2592
2593   // IParameters
2594   _PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
2595                                                              componentName.c_str(),
2596                                                              savePoint);
2597   _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
2598
2599   QList<SUIT_ViewManager*> lst;
2600   QList<SUIT_ViewManager*>::Iterator it;
2601
2602   // main cycle to store parameters of displayed objects
2603   lst.clear();
2604   getApp()->viewManagers(lst);
2605   for (it = lst.begin(); it != lst.end(); it++) {
2606     SUIT_ViewManager* vman = *it;
2607     QString vType = vman->getType();
2608     int aMgrId = vman->getGlobalId();
2609     // saving VTK actors properties
2610     QVector<SUIT_ViewWindow*> views = vman->getViews();
2611     for (int i = 0, iEnd = vman->getViewsCount(); i < iEnd; i++) {
2612       const ObjMap anObjects = appStudy->getObjectMap(aMgrId);
2613       ObjMap::ConstIterator o_it = anObjects.begin();
2614       for (; o_it != anObjects.end(); o_it++) {
2615         const PropMap aProps = o_it.value();
2616
2617         //Check that object exists in the study
2618         _PTR(SObject) obj( studyDS->FindObjectID( o_it.key().toLatin1().data() ) );
2619         if ( !obj || !(aProps.count() > 0))
2620           continue;
2621         // entry is "encoded" = it does NOT contain component adress, since it is a
2622         // subject to change on next component loading
2623
2624         std::string entry = ip->encodeEntry(o_it.key().toLatin1().data(), componentName);
2625
2626         _PTR(GenericAttribute) anAttr;
2627         if (!obj->FindAttribute(anAttr, "AttributeIOR"))
2628           continue;
2629
2630         QString param, occParam = vType;
2631         occParam += GEOM::sectionSeparator();
2632         occParam += QString::number(aMgrId);
2633         occParam += GEOM::sectionSeparator();
2634
2635         if (aProps.contains(GEOM::propertyName( GEOM::Visibility ))) {
2636           param = occParam + GEOM::propertyName( GEOM::Visibility );
2637           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Visibility )).toBool() ? "On" : "Off");
2638         }
2639
2640         if (aProps.contains(GEOM::propertyName( GEOM::DisplayMode ))) {
2641           param = occParam + GEOM::propertyName( GEOM::DisplayMode );
2642           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::DisplayMode )).toString().toStdString());
2643         }
2644
2645         if (aProps.contains(GEOM::propertyName( GEOM::Color ))) {
2646           QColor c = aProps.value(GEOM::propertyName( GEOM::Color )).value<QColor>();
2647           QStringList val;
2648           val << QString::number(c.redF());
2649           val << QString::number(c.greenF());
2650           val << QString::number(c.blueF());
2651           param = occParam + GEOM::propertyName( GEOM::Color );
2652           ip->setParameter(entry, param.toStdString(), val.join( GEOM::subSectionSeparator()).toStdString());
2653         }
2654
2655         if (vType == SVTK_Viewer::Type()) {
2656           if (aProps.contains(GEOM::propertyName( GEOM::Opacity ))) {
2657             param = occParam + GEOM::propertyName( GEOM::Opacity );
2658             ip->setParameter(entry, param.toStdString(), QString::number(1. - aProps.value(GEOM::propertyName( GEOM::Transparency )).toDouble()).toStdString());
2659           }
2660         } else if (vType == SOCC_Viewer::Type()) {
2661           if (aProps.contains(GEOM::propertyName( GEOM::Transparency ))) {
2662             param = occParam + GEOM::propertyName( GEOM::Transparency );
2663             ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Transparency )).toString().toStdString());
2664           }
2665
2666           if (aProps.contains(GEOM::propertyName( GEOM::TopLevel ))) {
2667             param = occParam + GEOM::propertyName( GEOM::TopLevel );
2668             ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::TopLevel )).toString().toStdString());
2669           }
2670         }
2671
2672         if (aProps.contains(GEOM::propertyName( GEOM::NbIsos ))) {
2673           param = occParam + GEOM::propertyName( GEOM::NbIsos );
2674           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::NbIsos )).toString().toStdString());
2675         }
2676
2677         if (aProps.contains(GEOM::propertyName( GEOM::EdgesDirection ))) {
2678           param = occParam + GEOM::propertyName( GEOM::EdgesDirection );
2679           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::EdgesDirection )).toString().toStdString());
2680         }
2681
2682         if (aProps.contains(GEOM::propertyName( GEOM::Deflection ))) {
2683           param = occParam + GEOM::propertyName( GEOM::Deflection );
2684           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Deflection )).toString().toStdString());
2685         }
2686
2687         //Marker type of the vertex - ONLY for the "Vertex" and "Compound of the Vertex"
2688         if (aProps.contains(GEOM::propertyName( GEOM::PointMarker ))) {
2689           param = occParam + GEOM::propertyName( GEOM::PointMarker );
2690           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::PointMarker )).toString().toStdString());
2691         }
2692
2693         if (aProps.contains(GEOM::propertyName( GEOM::Material ))) {
2694           param = occParam + GEOM::propertyName( GEOM::Material );
2695           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::Material )).toString().toStdString());
2696         }
2697
2698         if (aProps.contains(GEOM::propertyName( GEOM::LineWidth ))) {
2699              param = occParam + GEOM::propertyName( GEOM::LineWidth );
2700            ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::LineWidth )).toString().toStdString());
2701         }
2702
2703         if (aProps.contains(GEOM::propertyName( GEOM::IsosWidth ))) {
2704           param = occParam + GEOM::propertyName( GEOM::IsosWidth );
2705           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::IsosWidth )).toString().toStdString());
2706         }
2707       } // object iterator
2708     } // for (views)
2709   } // for (viewManagers)
2710 }
2711
2712 /*!
2713  * \brief Restore visual parameters
2714  *
2715  * This method is called after the study document is opened.
2716  * Restore visual parameters from AttributeParameter attribute(s)
2717  */
2718 void GeometryGUI::restoreVisualParameters (int savePoint)
2719 {
2720   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
2721   if (!appStudy || !appStudy->studyDS())
2722     return;
2723   _PTR(Study) studyDS = appStudy->studyDS();
2724
2725   // componentName is used for encoding of entries when storing them in IParameters
2726   std::string componentName = myComponentGeom->ComponentDataType();
2727   //_PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
2728   //if (!aSComponent) return;
2729
2730   // IParameters
2731   _PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
2732                                                              componentName.c_str(),
2733                                                              savePoint);
2734   _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
2735
2736   std::vector<std::string> entries = ip->getEntries();
2737
2738   for (std::vector<std::string>::iterator entIt = entries.begin(); entIt != entries.end(); ++entIt)
2739   {
2740     // entry is a normal entry - it should be "decoded" (setting base adress of component)
2741     QString entry (ip->decodeEntry(*entIt).c_str());
2742
2743     // Check that the entry corresponds to a real object in the Study
2744     // as the object may be deleted or modified after the visual state is saved.
2745     _PTR(SObject) so = studyDS->FindObjectID(entry.toLatin1().data());
2746     if (!so) continue; //Skip the not existent entry
2747
2748     std::vector<std::string> paramNames = ip->getAllParameterNames( *entIt );
2749     std::vector<std::string> paramValues = ip->getAllParameterValues( *entIt );
2750
2751     std::vector<std::string>::iterator namesIt = paramNames.begin();
2752     std::vector<std::string>::iterator valuesIt = paramValues.begin();
2753
2754     // actors are stored in a map after displaying of them for
2755     // quicker access in the future: map < viewID to actor >
2756     NCollection_DataMap<int, GEOM_Actor*          > vtkActors;
2757     NCollection_DataMap<int, Handle(GEOM_AISShape)> occActors;
2758
2759     QString viewerTypStr;
2760     QString viewIndexStr;
2761     int viewIndex;
2762     QVector<PropMap> aListOfMap;
2763
2764     for (; namesIt != paramNames.end(); ++namesIt, ++valuesIt)
2765     {
2766       // visual parameters are stored in strings as follows: ViewerType_ViewIndex_ParamName.
2767       // '_' is used as separator and should not be used in viewer type or parameter names.
2768       QStringList lst = QString((*namesIt).c_str()).split( GEOM::sectionSeparator(), QString::SkipEmptyParts);
2769       if (lst.size() != 3)
2770         continue;
2771
2772       viewerTypStr = lst[0];
2773       viewIndexStr = lst[1];
2774       QString paramNameStr = lst[2];
2775
2776       bool ok;
2777       viewIndex = viewIndexStr.toUInt(&ok);
2778       if (!ok) // bad conversion of view index to integer
2779         continue;
2780
2781       if ((viewIndex + 1) > aListOfMap.count()) {
2782         aListOfMap.resize(viewIndex + 1);
2783       }
2784
2785       QString val((*valuesIt).c_str());
2786       if (paramNameStr == GEOM::propertyName( GEOM::Visibility )) {
2787         aListOfMap[viewIndex].insert(GEOM::propertyName( GEOM::Visibility ), val == "On");
2788       } else if (paramNameStr == GEOM::propertyName( GEOM::Opacity )) {
2789         aListOfMap[viewIndex].insert(GEOM::propertyName( GEOM::Transparency ), 1. - val.toDouble());
2790       } else if (paramNameStr == GEOM::propertyName( GEOM::Transparency )) {
2791         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Transparency ), val.toDouble() );
2792       } else if (paramNameStr == GEOM::propertyName( GEOM::TopLevel )) {
2793         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::TopLevel ), val == "true" || val == "1");
2794       } else if (paramNameStr == GEOM::propertyName( GEOM::DisplayMode )) {
2795         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::DisplayMode ), val.toInt());
2796       } else if (paramNameStr == GEOM::propertyName( GEOM::NbIsos )) {
2797         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::NbIsos ), val);
2798       } else if (paramNameStr == GEOM::propertyName( GEOM::Color )) {
2799         QStringList rgb = val.split(GEOM::subSectionSeparator());
2800         if (rgb.count() == 3) {
2801           QColor c = QColor::fromRgbF(rgb[0].toDouble(), rgb[1].toDouble(), rgb[2].toDouble());
2802           aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Color ), c);
2803         }
2804       } else if (paramNameStr == GEOM::propertyName( GEOM::EdgesDirection )) {
2805         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::EdgesDirection ), val == "true" || val == "1");
2806       } else if (paramNameStr == GEOM::propertyName( GEOM::Deflection )) {
2807         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Deflection ), val.toDouble());
2808       } else if (paramNameStr == GEOM::propertyName( GEOM::PointMarker )) {
2809         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::PointMarker ), val);
2810       } else if (paramNameStr == GEOM::propertyName( GEOM::Material )) {
2811         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::Material ), val);
2812       } else if (paramNameStr == GEOM::propertyName( GEOM::LineWidth )) {
2813         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::LineWidth ), val.toInt());
2814       } else if (paramNameStr == GEOM::propertyName( GEOM::IsosWidth )) {
2815         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::IsosWidth ), val.toInt());
2816       }
2817     } // for names/parameters iterator
2818
2819     QList<SUIT_ViewManager*> lst = getApp()->viewManagers();
2820
2821     for (int index = 0; index < aListOfMap.count(); index++) {
2822
2823       appStudy->setObjectPropMap(index, entry, aListOfMap[index]);
2824
2825       //Get Visibility property of the current PropMap
2826       if (aListOfMap[index].value(GEOM::propertyName( GEOM::Visibility )) == 1) {
2827         SUIT_ViewManager* vman = lst.at(index);
2828         SUIT_ViewModel* vmodel = vman->getViewModel();
2829         displayer()->Display(entry, true, dynamic_cast<SALOME_View*>(vmodel));
2830       }
2831     }
2832   } // for entries iterator
2833
2834   // update all VTK and OCC views
2835   QList<SUIT_ViewManager*> lst;
2836   getApp()->viewManagers(lst);
2837   for (QList<SUIT_ViewManager*>::Iterator it = lst.begin(); it != lst.end(); it++) {
2838     SUIT_ViewModel* vmodel = (*it)->getViewModel();
2839     if (!vmodel)
2840       continue;
2841     if (vmodel->getType() == SVTK_Viewer::Type()) {
2842       SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) (*it)->getActiveView();
2843       vtkView->getRenderer()->ResetCameraClippingRange();
2844       vtkView->Repaint();
2845     }
2846     else if (vmodel->getType() == SOCC_Viewer::Type()) {
2847       //SOCC_ViewWindow* occView = (SOCC_ViewWindow*) (*it)->getActiveView();
2848       SALOME_View* occVMod = dynamic_cast<SALOME_View*>(vmodel);
2849       if (occVMod)
2850         occVMod->Repaint();
2851     }
2852   }
2853 }
2854
2855 void GeometryGUI::onViewAboutToShow()
2856 {
2857   SUIT_ViewWindow* window = application()->desktop()->activeWindow();
2858   QAction* a = action( GEOMOp::OpSwitchVectors );
2859   if ( window ) {
2860     a->setEnabled(true);
2861     bool vmode = window->property("VectorsMode").toBool();
2862     a->setText ( vmode == 1 ? tr( "MEN_VECTOR_MODE_OFF" ) : tr("MEN_VECTOR_MODE_ON") );
2863   } else {
2864     a->setText ( tr("MEN_VECTOR_MODE_ON") );
2865     a->setEnabled(false);
2866   }
2867 }
2868
2869 /*!
2870   \brief Return action by id
2871   \param id identifier of the action
2872   \return action
2873 */
2874 QAction* GeometryGUI::getAction(const int id) {
2875   return action(id);
2876 }
2877
2878 /*!
2879   \brief GEOM module message handler
2880
2881   This method can be re-implemented in the subclasses.
2882   This is a GEOM module message handler.
2883
2884   \param msg the message received.
2885 */
2886 void GeometryGUI::message(const QString& msg)
2887 {
2888   // dispatch message
2889   QStringList data = msg.split("/");
2890   const int nbStrings = data.count();
2891
2892   if (nbStrings > 0) {
2893     if (data[0] == "modified") {
2894       // get mesh entry
2895       QString anIOR = nbStrings > 1 ? data[1] : QString();
2896
2897       if ( anIOR.isEmpty() ) {
2898         return;
2899       }
2900
2901       // Get the geom object.
2902       GEOM::GEOM_Object_ptr anObj = GeometryGUI::GetObjectFromIOR (anIOR);
2903
2904       // Clear the shape buffer
2905       GeometryGUI::ClearShapeBuffer (anObj);
2906     }
2907   }
2908 }
2909
2910 /*!
2911   \brief Clears the shape buffer.
2912
2913   This is a static method. It clears the shape buffer.
2914
2915   \param theObj the object
2916 */
2917 void GeometryGUI::ClearShapeBuffer( GEOM::GEOM_Object_ptr theObj )
2918 {
2919   if ( CORBA::is_nil( theObj ) )
2920     return;
2921
2922   CORBA::String_var IOR = SalomeApp_Application::orb()->object_to_string( theObj );
2923   TCollection_AsciiString asciiIOR( (char *)IOR.in() );
2924   GEOM_Client::get_client().RemoveShapeFromBuffer( asciiIOR );
2925
2926   SALOMEDSClient_StudyManager *aManager = SalomeApp_Application::studyMgr();
2927
2928   if (!aManager)
2929     return;
2930
2931   _PTR(Study) aStudy = aManager->GetStudyByID(theObj->GetStudyID());
2932
2933   if ( !aStudy )
2934     return;
2935
2936   _PTR(SObject) aSObj ( aStudy->FindObjectIOR( std::string( IOR ) ) );
2937   if ( !aSObj )
2938     return;
2939
2940   _PTR(ChildIterator) anIt ( aStudy->NewChildIterator( aSObj ) );
2941   for ( anIt->InitEx( true ); anIt->More(); anIt->Next() ) {
2942     _PTR(GenericAttribute) anAttr;
2943     if ( anIt->Value()->FindAttribute(anAttr, "AttributeIOR") ) {
2944       _PTR(AttributeIOR) anIOR ( anAttr );
2945       TCollection_AsciiString asciiIOR( (char*)anIOR->Value().c_str() );
2946       GEOM_Client::get_client().RemoveShapeFromBuffer( asciiIOR );
2947     }
2948   }
2949 }
2950
2951 /*!
2952   \brief Returns the object from IOR.
2953
2954   This is a static method. It returns the object from its IOR.
2955
2956   \param IOR object IOR
2957   \return GEOM object.
2958 */
2959 GEOM::GEOM_Object_ptr GeometryGUI::GetObjectFromIOR( const QString& IOR )
2960 {
2961   GEOM::GEOM_Object_var geomObj;
2962   if ( !IOR.isEmpty() ) {
2963     CORBA::Object_var corbaObj = SalomeApp_Application::orb()->string_to_object
2964       ( IOR.toLatin1().constData() );
2965     if ( !CORBA::is_nil( corbaObj ) )
2966       geomObj = GEOM::GEOM_Object::_narrow( corbaObj );
2967   }
2968   return geomObj._retn();
2969 }
2970
2971 /*!
2972   \brief Returns IOR of the object.
2973
2974   This is a static method. It returns the object's IOR.
2975
2976   \param object the GEOM object.
2977   \return object's IOR.
2978 */
2979 QString GeometryGUI::GetIORFromObject( GEOM::GEOM_Object_ptr object )
2980 {
2981   QString IOR;
2982   if ( !CORBA::is_nil( object ) ) {
2983     CORBA::String_var anIOR =
2984       SalomeApp_Application::orb()->object_to_string( object );
2985     IOR = anIOR.in();
2986   }
2987   return IOR;
2988 }
2989
2990 /*!
2991   \brief Check if this object is can't be renamed in place
2992
2993   This method can be re-implemented in the subclasses.
2994   Return true in case if object isn't reference or component (module root).
2995
2996   \param entry column id
2997   \return \c true if the item can be renamed by the user in place (e.g. in the Object browser)
2998 */
2999 bool GeometryGUI::renameAllowed( const QString& entry) const {
3000
3001   SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
3002   SalomeApp_Study* appStudy = app ? dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) : 0;
3003   SalomeApp_DataObject* obj = appStudy ? dynamic_cast<SalomeApp_DataObject*>(appStudy->findObjectByEntry(entry)) : 0;
3004
3005   return (app && appStudy && obj && !appStudy->isComponent(entry) && !obj->isReference());
3006 }
3007
3008 /*!
3009   Rename object by entry.
3010   \param entry entry of the object
3011   \param name new name of the object
3012   \brief Return \c true if rename operation finished successfully, \c false otherwise.
3013 */
3014 bool GeometryGUI::renameObject( const QString& entry, const QString& name)
3015 {
3016   bool result = false;
3017
3018   SalomeApp_Application* app =
3019     dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication());
3020   SalomeApp_Study* appStudy = app ? dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) : 0;
3021
3022   if (!appStudy)
3023     return result;
3024
3025   _PTR(Study) aStudy = appStudy->studyDS();
3026
3027   if (!aStudy)
3028     return result;
3029
3030   bool aLocked = (_PTR(AttributeStudyProperties)(appStudy->studyDS()->GetProperties()))->IsLocked();
3031   if ( aLocked ) {
3032     SUIT_MessageBox::warning ( app->desktop(), QObject::tr("WRN_WARNING"), QObject::tr("WRN_STUDY_LOCKED") );
3033     return result;
3034   }
3035
3036   _PTR(SObject) obj ( aStudy->FindObjectID(qPrintable(entry)) );
3037   _PTR(GenericAttribute) anAttr;
3038   if ( obj ) {
3039     if ( obj->FindAttribute(anAttr, "AttributeName") ) {
3040       _PTR(AttributeName) aName (anAttr);
3041
3042       aName->SetValue( name.toLatin1().data() ); // rename the SObject
3043       GEOM::GEOM_Object_var anObj = GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(obj));
3044       if (!CORBA::is_nil(anObj)) {
3045         anObj->SetName( name.toLatin1().data() );  // Rename the corresponding GEOM_Object
3046       }
3047       result = true;
3048     }
3049   }
3050   return result;
3051 }
3052
3053 void GeometryGUI::updateMaterials()
3054 {
3055   LightApp_Preferences* pref = preferences();
3056   if ( pref ) {
3057     QStringList materials = Material_ResourceMgr::resourceMgr()->materials();
3058     QString currentMaterial = SUIT_Session::session()->resourceMgr()->stringValue( "Geometry", "material" );
3059     if ( !materials.contains( currentMaterial ) )
3060       // user material set as default in the preferences, might be removed
3061       SUIT_Session::session()->resourceMgr()->setValue( "Geometry", "material", QString( "Plastic" ) );
3062
3063     QtxPreferenceItem* prefItem = pref->rootItem()->findItem( tr( "PREF_MATERIAL" ), true );
3064     if ( prefItem ) {
3065       setPreferenceProperty( prefItem->id(),
3066                              "strings", materials );
3067       prefItem->retrieve();
3068     }
3069   }
3070 }
3071
3072 /*!
3073   \brief Check if the module allows "drag" operation of its objects.
3074
3075   Overloaded from LightApp_Module class.
3076   
3077   This function is a part of the general drag-n-drop mechanism.
3078   The goal of this function is to check data object passed as a parameter
3079   and decide if it can be dragged or no.
3080
3081   \param what data object being tested for drag operation
3082   \return \c true if module allows dragging of the specified object
3083   \sa isDropAccepted(), dropObjects()
3084 */
3085 bool GeometryGUI::isDraggable( const SUIT_DataObject* what ) const
3086 {
3087   // we allow dragging object under root and object from folder
3088   int aLevel = what->level();
3089   bool anObjectInFolder = false;
3090   if ( aLevel > 2 ) {
3091     const SalomeApp_DataObject* dataObj = dynamic_cast<const SalomeApp_DataObject*>( what );
3092     if ( dataObj ) {
3093       _PTR(SObject) aSO = dataObj->object();
3094       if ( aSO ) {
3095         _PTR(GenericAttribute) anAttr;
3096         _PTR(SObject) aFatherSO = aSO->GetStudy()->GetUseCaseBuilder()->GetFather( aSO );
3097         if ( aFatherSO && aFatherSO->FindAttribute(anAttr, "AttributeLocalID") ) {
3098           _PTR(AttributeLocalID) aLocalID( anAttr );
3099           anObjectInFolder = aLocalID->Value() == 999;
3100         }
3101       }
3102     }
3103   }
3104   return aLevel == 2 || anObjectInFolder;
3105 }
3106
3107 /*!
3108   \brief Check if the module allows "drop" operation on the given object.
3109
3110   Overloaded from LightApp_Module class.
3111
3112   This function is a part of the general drag-n-drop mechanism.
3113   The goal of this function is to check data object passed as a parameter
3114   and decide if it can be used as a target for the "drop" operation.
3115   The processing of the drop operation itself is done in the dropObjects() function.
3116
3117   \param where target data object
3118   \return \c true if module supports dropping on the \a where data object
3119   \sa isDraggable(), dropObjects()
3120 */
3121 bool GeometryGUI::isDropAccepted( const SUIT_DataObject* where ) const
3122 {
3123   // we allow dropping into folder and top-level GEOM object
3124   int aLevel = where->level();
3125   bool isFolder = false;
3126   if ( aLevel > 1 ) {
3127     const SalomeApp_DataObject* dataObj = dynamic_cast<const SalomeApp_DataObject*>( where );
3128     if ( dataObj ) {
3129       _PTR(SObject) aSO = dataObj->object();
3130       if ( aSO ) {
3131         _PTR(GenericAttribute) anAttr;
3132         if ( aSO->FindAttribute(anAttr, "AttributeLocalID") ) {
3133           _PTR(AttributeLocalID) aLocalID( anAttr );
3134           isFolder = aLocalID->Value() == 999;
3135         }
3136       }
3137     }
3138   }
3139   return aLevel == 1 || isFolder;
3140 }
3141
3142 /*!
3143   \brief Complete drag-n-drop operation.
3144   
3145   Overloaded from LightApp_Module class.
3146
3147   This function is a part of the general drag-n-drop mechanism.
3148   Its goal is to handle dropping of the objects being dragged according
3149   to the chosen operation (move). The dropping is performed in the
3150   context of the parent data object \a where and the \a row (position in the 
3151   children index) at which the data should be dropped. If \a row is equal to -1,
3152   this means that objects are added to the end of the children list.
3153
3154   \param what objects being dropped
3155   \param where target data object
3156   \param row child index at which the drop operation is performed
3157   \param action drag-n-drop operation (Qt::DropAction) - move
3158
3159   \sa isDraggable(), isDropAccepted()
3160 */
3161 void GeometryGUI::dropObjects( const DataObjectList& what, SUIT_DataObject* where,
3162                                const int row, Qt::DropAction action )
3163 {
3164   if (action != Qt::CopyAction && action != Qt::MoveAction)
3165     return; // unsupported action
3166
3167   // get parent object
3168   SalomeApp_DataObject* dataObj = dynamic_cast<SalomeApp_DataObject*>( where );
3169   if ( !dataObj ) return; // wrong parent
3170   _PTR(SObject) parentObj = dataObj->object();
3171
3172   // Find the current Study and StudyBuilder
3173   _PTR(Study) aStudy = parentObj->GetStudy();
3174   _PTR(UseCaseBuilder) aUseCaseBuilder = aStudy->GetUseCaseBuilder();
3175   // collect all parents of the target node
3176   QStringList parentIDs;
3177   _PTR(SObject) parent = parentObj;
3178   while( !parent->IsNull() ) {
3179     parentIDs << parent->GetID().c_str();
3180     parent = aUseCaseBuilder->GetFather(parent);
3181   }
3182
3183   // collect objects being dropped
3184   GEOM::object_list_var objects = new GEOM::object_list();
3185   objects->length( what.count() );
3186   int count = 0;
3187   for ( int i = 0; i < what.count(); i++ ) {
3188     dataObj = dynamic_cast<SalomeApp_DataObject*>( what[i] );
3189     if ( !dataObj ) continue;  // skip wrong objects
3190     _PTR(SObject) sobj = dataObj->object();
3191     // check that dropped object is not a parent of target object
3192     if ( parentIDs.contains( sobj->GetID().c_str() ) ) {
3193       return; // it's not allowed to move node into it's child 
3194     }
3195     objects[i] = _CAST(SObject, sobj)->GetSObject();
3196     count++;
3197   }
3198   objects->length( count );
3199
3200   // call engine function
3201   GetGeomGen()->Move( objects.in(),                              // what
3202                       _CAST(SObject, parentObj)->GetSObject(),   // where
3203                       row );                                     // row
3204
3205   // update Object browser
3206   getApp()->updateObjectBrowser( false );
3207 }