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