Salome HOME
Implement unicode support in SALOME: first attempt
[modules/geom.git] / src / GEOMGUI / GeometryGUI.cxx
old mode 100644 (file)
new mode 100755 (executable)
index 47aeffb..77eb58b
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2015  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -39,6 +39,8 @@
 #include "GEOM_Displayer.h"
 #include "GEOM_AISShape.hxx"
 #include "GEOMUtils_XmlHandler.hxx"
+#include "GEOMGUI_AnnotationMgr.h"
+#include "GEOMGUI_TextTreeSelector.h"
 
 #include "GEOM_Actor.h"
 
@@ -86,7 +88,6 @@
 
 #include <SALOMEDS_SObject.hxx>
 
-#include <Basics_OCCTVersion.hxx>
 #include <QtxFontEdit.h>
 
 // External includes
@@ -137,7 +138,7 @@ extern "C" {
   }
 }
 
-GeometryGUI::StudyTextureMap GeometryGUI::myTextureMap;
+GeometryGUI::TextureMap GeometryGUI::myTextureMap;
 
 GEOM::GEOM_Gen_var GeometryGUI::myComponentGeom = GEOM::GEOM_Gen::_nil();
 
@@ -171,23 +172,21 @@ CORBA::Object_var GeometryGUI::ClientSObjectToObject (_PTR(SObject) theSObject)
       anObj = anORB->string_to_object(aValue.c_str());
     }
   } catch(...) {
-    INFOS("ClientSObjectToObject - Unknown exception was occured!!!");
+    INFOS("ClientSObjectToObject - Unknown exception has occurred!!!");
   }
   return anObj._retn();
 }
 
 //=======================================================================
-// function : ClientStudyToStudy
+// function : GetStudy
 // purpose  :
 //=======================================================================
-SALOMEDS::Study_var GeometryGUI::ClientStudyToStudy (_PTR(Study) theStudy)
+SALOMEDS::Study_var GeometryGUI::getStudyServant()
 {
   SALOME_NamingService *aNamingService = SalomeApp_Application::namingService();
-  CORBA::Object_var aSMObject = aNamingService->Resolve("/myStudyManager");
-  SALOMEDS::StudyManager_var aStudyManager = SALOMEDS::StudyManager::_narrow(aSMObject);
-  int aStudyID = theStudy->StudyId();
-  SALOMEDS::Study_var aDSStudy = aStudyManager->GetStudyByID(aStudyID);
-  return aDSStudy._retn();
+  CORBA::Object_var aStudyObject = aNamingService->Resolve("/Study");
+  SALOMEDS::Study_var aStudy = SALOMEDS::Study::_narrow(aStudyObject);
+  return aStudy._retn();
 }
 
 void GeometryGUI::Modified (bool theIsUpdateActions)
@@ -227,8 +226,9 @@ GeometryGUI::GeometryGUI() :
 
   myCreationInfoWdg = 0;
   myTextTreeWdg = 0;
+  myAnnotationMgr = 0;
 
-  connect( Material_ResourceMgr::resourceMgr(), SIGNAL( changed() ), this, SLOT( updateMaterials() ) );
+  connect( Material_ResourceMgr::resourceMgr(), SIGNAL( changed() ), this, SLOT( updateMaterials() ), Qt::UniqueConnection );
 
   Q_INIT_RESOURCE( GEOMGUI );
 }
@@ -257,13 +257,19 @@ GEOMGUI* GeometryGUI::getLibrary( const QString& libraryName )
 {
   if ( !myGUIMap.contains( libraryName ) ) {
     // try to load library if it is not loaded yet
-#ifndef WIN32
-    QString dirs = getenv( "LD_LIBRARY_PATH" );
-    QString sep  = ":";
-#else
+#if defined(WIN32)
     QString dirs = getenv( "PATH" );
+#elif defined(__APPLE__)
+    QString dirs = getenv( "DYLD_LIBRARY_PATH" );
+#else
+    QString dirs = getenv( "LD_LIBRARY_PATH" );
+#endif
+#if defined(WIN32)
     QString sep  = ";";
+#else
+    QString sep  = ":";
 #endif
+
     if ( !dirs.isEmpty() ) {
       QStringList dirList = dirs.split(sep, QString::SkipEmptyParts ); // skip empty entries
       QListIterator<QString> it( dirList ); it.toBack();
@@ -301,13 +307,20 @@ GEOMPluginGUI* GeometryGUI::getPluginLibrary( const QString& libraryName )
 {
   if ( !myGUIMap.contains( libraryName ) ) {
     // try to load library if it is not loaded yet
-#ifndef WIN32
-    QString dirs = getenv( "LD_LIBRARY_PATH" );
-    QString sep  = ":";
-#else
+
+#if defined(WIN32)
     QString dirs = getenv( "PATH" );
+#elif defined(__APPLE__)
+    QString dirs = getenv( "DYLD_LIBRARY_PATH" );
+#else
+    QString dirs = getenv( "LD_LIBRARY_PATH" );
+#endif
+#if defined(WIN32)
     QString sep  = ";";
+#else
+    QString sep  = ":";
 #endif
+
     if ( !dirs.isEmpty() ) {
       QStringList dirList = dirs.split(sep, QString::SkipEmptyParts ); // skip empty entries
       QListIterator<QString> it( dirList ); it.toBack();
@@ -373,6 +386,26 @@ void GeometryGUI::ActiveWorkingPlane()
   }
 }
 
+//=======================================================================
+// function : GeometryGUI::SetActiveDialogBox()
+// purpose  : Set active dialog box
+//=======================================================================
+GEOMGUI_AnnotationMgr* GeometryGUI::GetAnnotationMgr()
+{
+  if ( !myAnnotationMgr )
+    myAnnotationMgr = new GEOMGUI_AnnotationMgr( getApp() );
+  return myAnnotationMgr;
+}
+
+//=======================================================================
+// function : GeometryGUI::SetActiveDialogBox()
+// purpose  : Set active dialog box
+//=======================================================================
+GEOMGUI_TextTreeWdg* GeometryGUI::GetTextTreeWdg() const
+{
+  return myTextTreeWdg;
+}
+
 //=======================================================================
 // function : GeometryGUI::SetActiveDialogBox()
 // purpose  : Set active dialog box
@@ -588,7 +621,7 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam )
   case GEOMOp::OpFace:               // MENU BUILD - FACE
   case GEOMOp::OpShell:              // MENU BUILD - SHELL
   case GEOMOp::OpSolid:              // MENU BUILD - SOLID
-  case GEOMOp::OpCompound:           // MENU BUILD - COMPUND
+  case GEOMOp::OpCompound:           // MENU BUILD - COMPOUND
     libName = "BuildGUI";
     break;
   case GEOMOp::OpFuse:               // MENU BOOLEAN - FUSE
@@ -615,7 +648,6 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam )
   case GEOMOp::OpArchimede:          // MENU OPERATION - ARCHIMEDE
   case GEOMOp::OpFillet3d:           // MENU OPERATION - FILLET
   case GEOMOp::OpChamfer:            // MENU OPERATION - CHAMFER
-  case GEOMOp::OpClipping:           // MENU OPERATION - CLIPPING RANGE
   case GEOMOp::OpShapesOnShape:      // MENU OPERATION - GET SHAPES ON SHAPE
   case GEOMOp::OpFillet2d:           // MENU OPERATION - FILLET 2D
   case GEOMOp::OpFillet1d:           // MENU OPERATION - FILLET 1D
@@ -662,11 +694,16 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam )
   case GEOMOp::OpCheckSelfInters:    // MENU MEASURE - CHECK SELF INTERSECTIONS
   case GEOMOp::OpFastCheckInters:    // MENU MEASURE - FAST CHECK INTERSECTIONS
   case GEOMOp::OpManageDimensions:   // MENU MEASURE - MANAGE DIMENSIONS
+  case GEOMOp::OpAnnotation:         // MENU MEASURE - ANNOTATION
+  case GEOMOp::OpEditAnnotation:     // POPUP MENU - EDIT ANNOTATION
+  case GEOMOp::OpDeleteAnnotation:   // POPUP MENU - DELETE ANNOTATION
 #ifndef DISABLE_PLOT2DVIEWER
   case GEOMOp::OpShapeStatistics:    // MENU MEASURE - SHAPE STATISTICS
 #endif
   case GEOMOp::OpShowAllDimensions:  // POPUP MENU - SHOW ALL DIMENSIONS
   case GEOMOp::OpHideAllDimensions:  // POPUP MENU - HIDE ALL DIMENSIONS
+  case GEOMOp::OpShowAllAnnotations: // POPUP MENU - SHOW ALL ANNOTATIONS
+  case GEOMOp::OpHideAllAnnotations: // POPUP MENU - HIDE ALL ANNOTATIONS
     libName = "MeasureGUI";
     break;
   case GEOMOp::OpGroupCreate:        // MENU GROUP - CREATE
@@ -699,10 +736,12 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam )
 
       GEOMPluginGUI* library = 0;
       if ( !libName.isEmpty() ) {
-#ifndef WIN32
-        libName = QString( "lib" ) + libName + ".so";
-#else
+#if defined(WIN32)
         libName = libName + ".dll";
+#elif defined(__APPLE__)
+        libName = QString( "lib" ) + libName + ".dylib";
+#else
+        libName = QString( "lib" ) + libName + ".so";
 #endif
         library = getPluginLibrary( libName );
       }
@@ -728,10 +767,12 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam )
 
   GEOMGUI* library = 0;
   if ( !libName.isEmpty() ) {
-#ifndef WIN32
-    libName = QString( "lib" ) + libName + ".so";
-#else
+#if defined(WIN32)
     libName = libName + ".dll";
+#elif defined(__APPLE__)
+    libName = QString( "lib" ) + libName + ".dylib";
+#else
+    libName = QString( "lib" ) + libName + ".so";
 #endif
     library = getLibrary( libName );
   }
@@ -883,9 +924,8 @@ void GeometryGUI::createOriginAndBaseVectors()
     return;
   }
   if ( appStudy ) {
-    _PTR(Study) studyDS = appStudy->studyDS();
-    if ( studyDS && !CORBA::is_nil( GetGeomGen() ) ) {
-      GEOM::GEOM_IBasicOperations_var aBasicOperations = GetGeomGen()->GetIBasicOperations( studyDS->StudyId() );
+    if ( !CORBA::is_nil( GetGeomGen() ) ) {
+      GEOM::GEOM_IBasicOperations_var aBasicOperations = GetGeomGen()->GetIBasicOperations();
       if ( !aBasicOperations->_is_nil() ) {
         SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
         double aLength = aResourceMgr->doubleValue( "Geometry", "base_vectors_length", 1.0 );
@@ -894,11 +934,10 @@ void GeometryGUI::createOriginAndBaseVectors()
         GEOM::GEOM_Object_var anOY = aBasicOperations->MakeVectorDXDYDZ( 0.0, aLength, 0.0 );
         GEOM::GEOM_Object_var anOZ = aBasicOperations->MakeVectorDXDYDZ( 0.0, 0.0, aLength );
 
-        SALOMEDS::Study_var aDSStudy = ClientStudyToStudy( studyDS );
-        GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOrigin, "O" );
-        GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOX, "OX" );
-        GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOY, "OY" );
-        GetGeomGen()->PublishInStudy( aDSStudy, SALOMEDS::SObject::_nil(), anOZ, "OZ" );
+        GetGeomGen()->PublishInStudy( SALOMEDS::SObject::_nil(), anOrigin, "O" );
+        GetGeomGen()->PublishInStudy( SALOMEDS::SObject::_nil(), anOX, "OX" );
+        GetGeomGen()->PublishInStudy( SALOMEDS::SObject::_nil(), anOY, "OY" );
+        GetGeomGen()->PublishInStudy( SALOMEDS::SObject::_nil(), anOZ, "OZ" );
         anOrigin->UnRegister();
         anOX->UnRegister();
         anOY->UnRegister();
@@ -1002,7 +1041,6 @@ void GeometryGUI::initialize( CAM_Application* app )
   createGeomAction( GEOMOp::OpArchimede,      "ARCHIMEDE" );
   createGeomAction( GEOMOp::OpFillet3d,       "FILLET" );
   createGeomAction( GEOMOp::OpChamfer,        "CHAMFER" );
-  //createGeomAction( GEOMOp::OpClipping,        "CLIPPING" );
   createGeomAction( GEOMOp::OpShapesOnShape,  "GET_SHAPES_ON_SHAPE" );
   createGeomAction( GEOMOp::OpSharedShapes,   "GET_SHARED_SHAPES" );
   createGeomAction( GEOMOp::OpTransferData,   "TRANSFER_DATA" );
@@ -1044,6 +1082,9 @@ void GeometryGUI::initialize( CAM_Application* app )
   createGeomAction( GEOMOp::OpMinDistance,      "MIN_DIST" );
   createGeomAction( GEOMOp::OpAngle,            "MEASURE_ANGLE" );
   createGeomAction( GEOMOp::OpManageDimensions, "MANAGE_DIMENSIONS" );
+  createGeomAction( GEOMOp::OpAnnotation,       "ANNOTATION" );
+  createGeomAction( GEOMOp::OpEditAnnotation,   "EDIT_ANNOTATION" );
+  createGeomAction( GEOMOp::OpDeleteAnnotation, "DELETE_ANNOTATION" );
 
   createGeomAction( GEOMOp::OpTolerance,        "TOLERANCE" );
   createGeomAction( GEOMOp::OpWhatIs,           "WHAT_IS" );
@@ -1117,9 +1158,11 @@ void GeometryGUI::initialize( CAM_Application* app )
 #ifndef DISABLE_GRAPHICSVIEW
   createGeomAction( GEOMOp::OpShowDependencyTree, "POP_SHOW_DEPENDENCY_TREE" );
 #endif
-  createGeomAction( GEOMOp::OpReduceStudy,       "POP_REDUCE_STUDY" );
-  createGeomAction( GEOMOp::OpShowAllDimensions, "POP_SHOW_ALL_DIMENSIONS" );
-  createGeomAction( GEOMOp::OpHideAllDimensions, "POP_HIDE_ALL_DIMENSIONS" );
+  createGeomAction( GEOMOp::OpReduceStudy,        "POP_REDUCE_STUDY" );
+  createGeomAction( GEOMOp::OpShowAllDimensions,  "POP_SHOW_ALL_DIMENSIONS" );
+  createGeomAction( GEOMOp::OpHideAllDimensions,  "POP_HIDE_ALL_DIMENSIONS" );
+  createGeomAction( GEOMOp::OpShowAllAnnotations, "POP_SHOW_ALL_ANNOTATIONS" );
+  createGeomAction( GEOMOp::OpHideAllAnnotations, "POP_HIDE_ALL_ANNOTATIONS" );
 
   // Create actions for increase/decrease transparency shortcuts
   createGeomAction( GEOMOp::OpIncrTransparency, "", "", 0, false,
@@ -1141,7 +1184,7 @@ void GeometryGUI::initialize( CAM_Application* app )
 
   // ---- create menus --------------------------
 
-  int fileId = createMenu( tr( "MEN_FILE" ), -1, -1 );
+  /*int fileId =*/ createMenu( tr( "MEN_FILE" ), -1, -1 );
 
   int editId = createMenu( tr( "MEN_EDIT" ), -1, -1 );
   createMenu( GEOMOp::OpDelete, editId, -1 );
@@ -1274,7 +1317,6 @@ void GeometryGUI::initialize( CAM_Application* app )
   createMenu( GEOMOp::OpChamfer,       operId, -1 );
   createMenu( GEOMOp::OpExtrudedBoss,  operId, -1 );
   createMenu( GEOMOp::OpExtrudedCut,   operId, -1 );
-  //createMenu( GEOMOp::OpClipping,      operId, -1 );
 
   int repairId = createMenu( tr( "MEN_REPAIR" ), -1, -1, 10 );
   createMenu( GEOMOp::OpShapeProcess,    repairId, -1 );
@@ -1313,6 +1355,8 @@ void GeometryGUI::initialize( CAM_Application* app )
   createMenu( GEOMOp::OpAngle,            dimId, -1 );
   createMenu( GEOMOp::OpManageDimensions, dimId, -1 );
 
+  createMenu( GEOMOp::OpAnnotation,       measurId, -1 );
+
   createMenu( separator(),               measurId, -1 );
   createMenu( GEOMOp::OpTolerance,       measurId, -1 );
   createMenu( separator(),               measurId, -1 );
@@ -1469,6 +1513,7 @@ void GeometryGUI::initialize( CAM_Application* app )
   createTool( GEOMOp::OpBoundingBox,      measureTbId );
   createTool( GEOMOp::OpMinDistance,      measureTbId );
   createTool( GEOMOp::OpAngle,            measureTbId );
+  createTool( GEOMOp::OpAnnotation,       measureTbId );
   createTool( GEOMOp::OpTolerance  ,      measureTbId );
   createTool( separator(),                measureTbId );
   createTool( GEOMOp::OpFreeBoundaries,   measureTbId );
@@ -1589,6 +1634,12 @@ void GeometryGUI::initialize( CAM_Application* app )
   mgr->setRule( action( GEOMOp::OpNoAutoColor ), autoColorPrefix + " and isAutoColor=true", QtxPopupMgr::VisibleRule );
   mgr->insert( separator(), -1, -1 );     // -----------
 
+  mgr->insert( action(  GEOMOp::OpEditAnnotation ), -1, -1 );  // edit annotation
+  mgr->setRule( action( GEOMOp::OpEditAnnotation ),  clientOCC + " and annotationsCount=1", QtxPopupMgr::VisibleRule );
+  mgr->insert( action(  GEOMOp::OpDeleteAnnotation ), -1, -1 );  // delete annotation
+  mgr->setRule( action( GEOMOp::OpDeleteAnnotation ),  clientOCC + " and annotationsCount>0", QtxPopupMgr::VisibleRule );
+  mgr->insert( separator(), -1, -1 );     // -----------
+
   QString canDisplay = "($component={'GEOM'}) and (selcount>0) and ({true} in $canBeDisplayed) ",
           onlyComponent = "((type='Component') and selcount=1)",
           rule = canDisplay + "and ((($type in {%1}) and( %2 )) or " + onlyComponent + ")",
@@ -1643,6 +1694,10 @@ void GeometryGUI::initialize( CAM_Application* app )
   mgr->setRule( action( GEOMOp::OpShowAllDimensions ), aDimensionRule.arg( "hasHiddenDimensions" ), QtxPopupMgr::VisibleRule );
   mgr->insert( action( GEOMOp::OpHideAllDimensions ), -1, -1 ); // hide all dimensions
   mgr->setRule( action( GEOMOp::OpHideAllDimensions ), aDimensionRule.arg( "hasVisibleDimensions" ), QtxPopupMgr::VisibleRule );
+  mgr->insert( action( GEOMOp::OpShowAllAnnotations ), -1, -1 ); // show all annotations
+  mgr->setRule( action( GEOMOp::OpShowAllAnnotations ), aDimensionRule.arg( "hasHiddenAnnotations" ), QtxPopupMgr::VisibleRule );
+  mgr->insert( action( GEOMOp::OpHideAllAnnotations ), -1, -1 ); // hide all annotations
+  mgr->setRule( action( GEOMOp::OpHideAllAnnotations ), aDimensionRule.arg( "hasVisibleAnnotations" ), QtxPopupMgr::VisibleRule );
 
   mgr->insert( separator(), -1, -1 );     // -----------
   mgr->insert( action(  GEOMOp::OpUnpublishObject ), -1, -1 ); // Unpublish object
@@ -1804,7 +1859,7 @@ bool GeometryGUI::activateModule( SUIT_Study* study )
   // end of GEOM plugins loading
 
   connect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
-          this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
+           this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
 
   // Reset actions accelerator keys
   action(GEOMOp::OpDelete)->setEnabled( true ); // Delete: Key_Delete
@@ -1815,17 +1870,20 @@ bool GeometryGUI::activateModule( SUIT_Study* study )
 
   LightApp_SelectionMgr* sm = getApp()->selectionMgr();
 
-  connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( updateCreationInfo() ));
-  connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( onAutoBringToFront() ));
-  connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() ));
+  connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( updateCreationInfo() ), Qt::UniqueConnection );
+  connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( onAutoBringToFront() ), Qt::UniqueConnection );
+  connect( sm, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() ), Qt::UniqueConnection );
 
   if ( !myCreationInfoWdg )
     myCreationInfoWdg = new GEOMGUI_CreationInfoWdg( getApp() );
   getApp()->insertDockWindow( myCreationInfoWdg->getWinID(), myCreationInfoWdg );
   getApp()->placeDockWindow( myCreationInfoWdg->getWinID(), Qt::LeftDockWidgetArea );
 
-  if ( !myTextTreeWdg )
+  if ( !myTextTreeWdg ) {
     myTextTreeWdg = new GEOMGUI_TextTreeWdg( getApp() );
+    new GEOMGUI_TextTreeSelector( myTextTreeWdg, GetAnnotationMgr(), getApp()->selectionMgr() );
+  }
+
   getApp()->insertDockWindow( myTextTreeWdg->getWinID(), myTextTreeWdg );
   getApp()->placeDockWindow( myTextTreeWdg->getWinID(), Qt::LeftDockWidgetArea );
 
@@ -1851,7 +1909,7 @@ bool GeometryGUI::activateModule( SUIT_Study* study )
 
   QMenu* viewMenu = menuMgr()->findMenu( STD_Application::MenuViewId );
   if ( viewMenu )
-    connect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ) );
+    connect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ), Qt::UniqueConnection );
 
   // 0020836 (Basic vectors and origin)
   SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
@@ -1890,7 +1948,7 @@ bool GeometryGUI::deactivateModule( SUIT_Study* study )
   LightApp_SelectionMgr* selMrg = getApp()->selectionMgr();
 
   disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateCreationInfo() ));
-  disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() ));
+  //disconnect( selMrg, SIGNAL( currentSelectionChanged() ), this, SLOT( updateFieldColorScale() ));
   if ( myCreationInfoWdg ) {
     getApp()->removeDockWindow( myCreationInfoWdg->getWinID() );
     myCreationInfoWdg = 0;
@@ -2031,6 +2089,10 @@ void GeometryGUI::onViewManagerRemoved( SUIT_ViewManager* vm )
           break;
         }
   }
+  SOCC_Viewer* aSOCCView = dynamic_cast<SOCC_Viewer*>(viewer);
+  if ( aSOCCView ) {
+    GetAnnotationMgr()->RemoveView( aSOCCView );
+  }
 }
 
 //================================================================================
@@ -2101,7 +2163,7 @@ void GeometryGUI::onAutoBringToFront()
   SalomeApp_Study* appStudy = dynamic_cast< SalomeApp_Study* >( getApp()->activeStudy() );
   if (!appStudy) return;
 
-  GEOM_Displayer displayer( appStudy );
+  GEOM_Displayer displayer;
   
   SALOME_View* window = displayer.GetActiveView();
   if ( !window ) return;
@@ -2144,11 +2206,8 @@ void GeometryGUI::onAutoBringToFront()
 
 void GeometryGUI::updateFieldColorScale()
 {
-  if( SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) )
-  {
-    GEOM_Displayer aDisplayer( aStudy );
-    aDisplayer.UpdateColorScale();
-  }
+  GEOM_Displayer aDisplayer;
+  aDisplayer.UpdateColorScale();
 }
 
 QString GeometryGUI::engineIOR() const
@@ -2158,31 +2217,27 @@ QString GeometryGUI::engineIOR() const
   return "";
 }
 
-Handle(TColStd_HArray1OfByte) GeometryGUI::getTexture
-      (SalomeApp_Study* theStudy, int theId, int& theWidth, int& theHeight)
+Handle(TColStd_HArray1OfByte) GeometryGUI::getTexture (int theId, int& theWidth, int& theHeight)
 {
   theWidth = theHeight = 0;
 
   Handle(TColStd_HArray1OfByte) aTexture;
 
-  if (theStudy) {
-    TextureMap aTextureMap = myTextureMap[ theStudy->studyDS()->StudyId() ];
-    aTexture = aTextureMap[ theId ];
-    if ( aTexture.IsNull() ) {
-      GEOM::GEOM_IInsertOperations_var aInsOp = GeometryGUI::GetGeomGen()->GetIInsertOperations( theStudy->studyDS()->StudyId() );
-      if ( !aInsOp->_is_nil() ) {
-        CORBA::Long aWidth, aHeight;
-        SALOMEDS::TMPFile_var aStream = aInsOp->GetTexture( theId, aWidth, aHeight );
-        if ( aWidth > 0 && aHeight > 0 && aStream->length() > 0 ) {
-          theWidth  = aWidth;
-          theHeight = aHeight;
-
-          aTexture  = new TColStd_HArray1OfByte (1, aStream->length());
-
-          for (int i = 0; i < aStream->length(); i++)
-            aTexture->SetValue( i+1, (Standard_Byte)aStream[i] );
-          aTextureMap[ theId ] = aTexture;
-        }
+  aTexture = myTextureMap[ theId ];
+  if ( aTexture.IsNull() ) {
+    GEOM::GEOM_IInsertOperations_var aInsOp = GeometryGUI::GetGeomGen()->GetIInsertOperations();
+    if ( !aInsOp->_is_nil() ) {
+      CORBA::Long aWidth, aHeight;
+      SALOMEDS::TMPFile_var aStream = aInsOp->GetTexture( theId, aWidth, aHeight );
+      if ( aWidth > 0 && aHeight > 0 && aStream->length() > 0 ) {
+        theWidth  = aWidth;
+        theHeight = aHeight;
+
+        aTexture  = new TColStd_HArray1OfByte (1, aStream->length());
+
+        for ( CORBA::ULong i = 0; i < aStream->length(); i++)
+          aTexture->SetValue( i+1, (Standard_Byte)aStream[i] );
+        myTextureMap[ theId ] = aTexture;
       }
     }
   }
@@ -2358,6 +2413,10 @@ void GeometryGUI::createPreferences()
   addPreference( tr( "PREF_AUTO_BRING_TO_FRONT" ), genGroup,
                  LightApp_Preferences::Bool, "Geometry", "auto_bring_to_front" );
 
+  // --------------------------------------------------------------------------
+  // Dimensions (Measurements) preferences
+  // --------------------------------------------------------------------------
+
   int aDimGroupId = addPreference( tr( "PREF_DIMENSIONS" ), tabId );
   setPreferenceProperty( aDimGroupId, "columns", 2 );
 
@@ -2381,7 +2440,7 @@ void GeometryGUI::createPreferences()
   resMgr->value("resources", "GEOM", aFontFile);
   aFontFile = aFontFile + QDir::separator() + "Y14.5M-2009.ttf";
   // add enginier font into combobox
-  int fontID = QFontDatabase::addApplicationFont( aFontFile );
+  /*int fontID =*/ QFontDatabase::addApplicationFont( aFontFile );
   Handle(Font_SystemFont) sf = new Font_SystemFont( 
     new TCollection_HAsciiString("Y14.5M-2009"), 
     Font_FA_Regular, 
@@ -2441,6 +2500,53 @@ void GeometryGUI::createPreferences()
   addPreference( tr( "PREF_DIMENSIONS_USE_TEXT3D" ), aDimGroupId,
                  LightApp_Preferences::Bool, "Geometry", "dimensions_use_text3d" );
 
+  // --------------------------------------------------------------------------
+  // Shape annotation preferences
+  // --------------------------------------------------------------------------
+
+  const int aShapeAnnGroupId = addPreference( tr( "PREF_SHAPE_ANNOTATIONS" ), tabId );
+  setPreferenceProperty( aShapeAnnGroupId, "columns", 2 );
+
+  addPreference( tr( "PREF_SHAPE_ANNOTATIONS_FONT_COLOR" ), aShapeAnnGroupId, LightApp_Preferences::Color, "Geometry", "shape_annotation_font_color" );
+  addPreference( tr( "PREF_SHAPE_ANNOTATIONS_LINE_COLOR" ), aShapeAnnGroupId, LightApp_Preferences::Color, "Geometry", "shape_annotation_line_color" );
+  const int aShapeAnnFont = 
+    addPreference( tr( "PREF_SHAPE_ANNOTATIONS_FONT" ), aShapeAnnGroupId, LightApp_Preferences::Font, "Geometry", "shape_annotation_font" );
+
+  int aShapeAnnFontFeatures = QtxFontEdit::Family | QtxFontEdit::Size | QtxFontEdit::Bold | QtxFontEdit::Italic;
+  setPreferenceProperty( aShapeAnnFont, "features", aShapeAnnFontFeatures );
+  setPreferenceProperty( aShapeAnnFont, "mode", QtxFontEdit::Custom );
+  setPreferenceProperty( aShapeAnnFont, "fonts", anOCCFonts );
+
+  const int aShapeAnnLineWidth = 
+    addPreference( tr( "PREF_SHAPE_ANNOTATIONS_LINE_WIDTH" ), aShapeAnnGroupId, LightApp_Preferences::IntSpin, "Geometry", "shape_annotation_line_width" );
+
+  setPreferenceProperty( aShapeAnnLineWidth, "min", 1 );
+  setPreferenceProperty( aShapeAnnLineWidth, "max", 5 );
+
+  addPreference( tr( "PREF_SHAPE_ANNOTATIONS_AUTOHIDE" ), aShapeAnnGroupId, LightApp_Preferences::Bool, "Geometry", "shape_annotation_autohide" );
+
+  const int aShapeAnnLineStyle =
+    addPreference( tr( "PREF_SHAPE_ANNOTATIONS_LINE_STYLE" ), aShapeAnnGroupId, LightApp_Preferences::Selector, "Geometry", "shape_annotation_line_style" );
+
+  QStringList aLineStyleList;
+  aLineStyleList.append( tr("PREF_SHAPE_ANNOTATIONS_LINESTYLE_SOLID") );
+  aLineStyleList.append( tr("PREF_SHAPE_ANNOTATIONS_LINESTYLE_DASH") );
+  aLineStyleList.append( tr("PREF_SHAPE_ANNOTATIONS_LINESTYLE_DOT") );
+  aLineStyleList.append( tr("PREF_SHAPE_ANNOTATIONS_LINESTYLE_DOTDASH") );
+
+  QList<QVariant> aLineStyleIds;
+  aLineStyleIds.append(0);
+  aLineStyleIds.append(1);
+  aLineStyleIds.append(2);
+  aLineStyleIds.append(3);
+
+  setPreferenceProperty( aShapeAnnLineStyle, "strings", aLineStyleList );
+  setPreferenceProperty( aShapeAnnLineStyle, "indexes", aLineStyleIds );
+
+  // --------------------------------------------------------------------------
+  // Isoline drawing preferences
+  // --------------------------------------------------------------------------
+
   int isoGroup = addPreference( tr( "PREF_ISOS" ), tabId );
   setPreferenceProperty( isoGroup, "columns", 2 );
   int isoU = addPreference( tr( "PREF_ISOS_U" ), isoGroup,
@@ -2699,21 +2805,23 @@ void GeometryGUI::preferencesChanged( const QString& section, const QString& par
              param == QString("scalar_bar_height") ||
              param == QString("scalar_bar_text_height") ||
              param == QString("scalar_bar_nb_intervals")) {
-      if( SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) )
-      {
-        GEOM_Displayer aDisplayer( aStudy );
-        bool anIsRedisplayFieldSteps = param == QString("scalar_bar_nb_intervals");
-        aDisplayer.UpdateColorScale( anIsRedisplayFieldSteps, true );
-      }
+      updateFieldColorScale();
     }
-    else if ( param == QString("dimensions_color")        ||
-              param == QString("dimensions_line_width")   ||
-              param == QString("dimensions_font")         ||
-              param == QString("dimensions_arrow_length") ||
-              param == QString("dimensions_show_units")   ||
-              param == QString("dimensions_length_units") ||
-              param == QString("dimensions_angle_units")  ||
-              param == QString("dimensions_use_text3d")  ||
+    else if ( param == QString("dimensions_color")            ||
+              param == QString("dimensions_line_width")       ||
+              param == QString("dimensions_font")             ||
+              param == QString("dimensions_arrow_length")     ||
+              param == QString("dimensions_show_units")       ||
+              param == QString("dimensions_length_units")     ||
+              param == QString("dimensions_angle_units")      ||
+              param == QString("dimensions_use_text3d")       ||
+              param == QString("shape_annotation_font_color") ||
+              param == QString("shape_annotation_line_color") ||
+              param == QString("shape_annotation_font")       ||
+              param == QString("shape_annotation_line_width") ||
+              param == QString("shape_annotation_autohide")   ||
+              param == QString("shape_annotation_line_style") ||
+              param == QString("shape_annotation_line_style") ||
               param == QString("label_color") )
     {
       SalomeApp_Application* anApp = getApp();
@@ -2722,13 +2830,7 @@ void GeometryGUI::preferencesChanged( const QString& section, const QString& par
         return;
       }
 
-      SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( anApp->activeStudy() );
-      if ( !aStudy )
-      {
-        return;
-      }
-
-      GEOM_Displayer aDisplayer( aStudy );
+      GEOM_Displayer aDisplayer;
 
       ViewManagerList aVMs;
       anApp->viewManagers( OCCViewer_Viewer::Type(), aVMs );
@@ -2743,6 +2845,20 @@ void GeometryGUI::preferencesChanged( const QString& section, const QString& par
 
         SALOME_ListIO aVisible;
         aViewer->GetVisible( aVisible );
+
+        GEOMGUI_AnnotationMgr* anAnnotationMgr = GetAnnotationMgr();
+        if ( anAnnotationMgr ) {
+          SALOME_ListIteratorOfListIO anIter( aVisible );
+          while ( anIter.More() ) {
+            if ( anAnnotationMgr->isAnnotationEntry( anIter.Value()->getEntry() ) ) {
+              aVisible.Remove( anIter );
+            }
+            else {
+              anIter.Next();
+            }
+          }
+        }
+
         aDisplayer.Redisplay( aVisible, false, aViewer );
       }
       if ( param == QString( "label_color" ) ) {
@@ -2771,7 +2887,7 @@ void GeometryGUI::preferencesChanged( const QString& section, const QString& par
 LightApp_Displayer* GeometryGUI::displayer()
 {
   if ( !myDisplayer )
-    myDisplayer = new GEOM_Displayer( dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) );
+    myDisplayer = new GEOM_Displayer();
   return myDisplayer;
 }
 
@@ -2799,6 +2915,7 @@ void GeometryGUI::storeVisualParameters (int savePoint)
   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
   if ( !appStudy || !appStudy->studyDS() )
     return;
+
   _PTR(Study) studyDS = appStudy->studyDS();
 
   // componentName is used for encoding of entries when storing them in IParameters
@@ -2816,12 +2933,17 @@ void GeometryGUI::storeVisualParameters (int savePoint)
   QList<SUIT_ViewManager*> lst;
   QList<SUIT_ViewManager*>::Iterator it;
 
+  GEOMGUI_AnnotationMgr* aAnnotationMgr = GetAnnotationMgr();
+
   // main cycle to store parameters of displayed objects
   lst.clear();
   getApp()->viewManagers(lst);
   for (it = lst.begin(); it != lst.end(); it++) {
     SUIT_ViewManager* vman = *it;
     QString vType = vman->getType();
+    SUIT_ViewModel* vmodel = vman->getViewModel();
+    SALOME_View* aView = dynamic_cast<SALOME_View*>(vmodel);
+
     int aMgrId = vman->getGlobalId();
     // saving VTK actors properties
     QVector<SUIT_ViewWindow*> views = vman->getViews();
@@ -2835,7 +2957,7 @@ void GeometryGUI::storeVisualParameters (int savePoint)
         _PTR(SObject) obj( studyDS->FindObjectID( o_it.key().toLatin1().data() ) );
         if ( !obj || !(aProps.count() > 0))
           continue;
-        // entry is "encoded" = it does NOT contain component adress, since it is a
+        // entry is "encoded" = it does NOT contain component address, since it is a
         // subject to change on next component loading
 
         std::string entry = ip->encodeEntry(o_it.key().toLatin1().data(), componentName);
@@ -2943,28 +3065,41 @@ void GeometryGUI::storeVisualParameters (int savePoint)
           param = occParam + GEOM::propertyName( GEOM::IsosWidth );
           ip->setParameter(entry, param.toStdString(), aProps.value(GEOM::propertyName( GEOM::IsosWidth )).toString().toStdString());
         }
+
+        if ( vType == SOCC_Viewer::Type() && aAnnotationMgr ) {
+          std::string anAnnotationInfo = GetAnnotationMgr()->getDisplayedIndicesInfo(
+                                            o_it.key().toLatin1().data(), dynamic_cast<SOCC_Viewer*>(aView) ).toStdString();
+          if (!anAnnotationInfo.empty()) {
+            param = occParam + "ShapeAnnotationVisibleItems";
+            ip->setParameter(entry, param.toStdString(), anAnnotationInfo);
+          }
+        }
       } // object iterator
     } // for (views)
   } // for (viewManagers)
 
-  // store dimension attributes of objects:
+  // store shape annotation and dimension attributes of objects:
   // since the displayed object always persists in property map, we remember the object entries
   // on the passes when we store viewer related properties - to avoid extra iterations on GEOM component tree.
-  QString aDimensionParam = OCCViewer_Viewer::Type() + GEOM::sectionSeparator() + GEOM::propertyName( GEOM::Dimensions );
+  const QString aDimensionParam = OCCViewer_Viewer::Type() + GEOM::sectionSeparator() + GEOM::propertyName( GEOM::Dimensions );
+  const QString aAnnotationParam = OCCViewer_Viewer::Type() + GEOM::sectionSeparator() + GEOM::propertyName( GEOM::ShapeAnnotations );
   QSet<QString>::ConstIterator aEntryIt = anEntriesToStoreShared.constBegin();
   for ( ; aEntryIt != anEntriesToStoreShared.constEnd(); ++aEntryIt )
   {
     std::string aStudyEntry = (*aEntryIt).toLatin1().data();
-    std::string aStoreEntry = ip->encodeEntry( aStudyEntry, componentName);
+    std::string aStoreEntry = ip->encodeEntry( aStudyEntry, componentName );
 
-    GEOMGUI_DimensionProperty aDimensions( appStudy, aStudyEntry );
-
-    if ( aDimensions.GetNumber() == 0 )
-    {
-      continue;
+    // store dimension parameters
+    GEOMGUI_DimensionProperty aDimensions( aStudyEntry );
+    if ( aDimensions.GetNumber() != 0 ) {
+      ip->setParameter( aStoreEntry, aDimensionParam.toStdString(), ((QString)aDimensions).toLatin1().data() );
     }
 
-    ip->setParameter( aStoreEntry, aDimensionParam.toStdString(), ((QString)aDimensions).toLatin1().data() );
+    _PTR(SObject) aObj( studyDS->FindObjectID( aStudyEntry ) );
+    const Handle(GEOMGUI_AnnotationAttrs) aShapeAnnAttr = GEOMGUI_AnnotationAttrs::FindAttributes( aObj );
+    if ( !aShapeAnnAttr.IsNull() ) {
+      ip->setParameter( aStoreEntry, aAnnotationParam.toStdString(), aShapeAnnAttr->ExportAsPropertyString().toLatin1().data() );
+    }
   }
 }
 
@@ -2996,7 +3131,7 @@ void GeometryGUI::restoreVisualParameters (int savePoint)
 
   for (std::vector<std::string>::iterator entIt = entries.begin(); entIt != entries.end(); ++entIt)
   {
-    // entry is a normal entry - it should be "decoded" (setting base adress of component)
+    // entry is a normal entry - it should be "decoded" (setting base address of component)
     QString entry (ip->decodeEntry(*entIt).c_str());
 
     // Check that the entry corresponds to a real object in the Study
@@ -3045,7 +3180,14 @@ void GeometryGUI::restoreVisualParameters (int savePoint)
         if ( aParamNameStr == GEOM::propertyName( GEOM::Dimensions ) )
         {
           GEOMGUI_DimensionProperty aDimensionProp( aValuesStr );
-          aDimensionProp.SaveToAttribute( appStudy, entry.toLatin1().data() );
+          aDimensionProp.SaveToAttribute( entry.toLatin1().data() );
+        }
+        else if ( aParamNameStr == GEOM::propertyName( GEOM::ShapeAnnotations ) )
+        {
+          Handle(GEOMGUI_AnnotationAttrs) anAttr =
+            GEOMGUI_AnnotationAttrs::FindOrCreateAttributes( so, appStudy );
+
+          anAttr->ImportFromPropertyString( aValuesStr );
         }
 
         continue;
@@ -3102,7 +3244,10 @@ void GeometryGUI::restoreVisualParameters (int savePoint)
         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::LineWidth ), val.toInt());
       } else if (paramNameStr == GEOM::propertyName( GEOM::IsosWidth )) {
         aListOfMap[viewIndex].insert( GEOM::propertyName( GEOM::IsosWidth ), val.toInt());
+      } else if (paramNameStr == "ShapeAnnotationVisibleItems") {
+        aListOfMap[viewIndex].insert( "ShapeAnnotationVisibleItems", val);
       }
+
     } // for names/parameters iterator
 
     QList<SUIT_ViewManager*> lst = getApp()->viewManagers();
@@ -3114,7 +3259,16 @@ void GeometryGUI::restoreVisualParameters (int savePoint)
       if (aListOfMap[index].value(GEOM::propertyName( GEOM::Visibility )) == 1) {
         SUIT_ViewManager* vman = lst.at(index);
         SUIT_ViewModel* vmodel = vman->getViewModel();
-        displayer()->Display(entry, true, dynamic_cast<SALOME_View*>(vmodel));
+        SALOME_View* aView = dynamic_cast<SALOME_View*>(vmodel);
+        displayer()->Display(entry, true, aView);
+
+        if ( vmodel->getType() == SOCC_Viewer::Type() ) {
+          PropMap& aProps = aListOfMap[index];
+          if ( aProps.contains( "ShapeAnnotationVisibleItems" ) ) {
+            SOCC_Viewer* aSOCCView = dynamic_cast<SOCC_Viewer*>( aView );
+            GetAnnotationMgr()->setDisplayedIndicesInfo( entry, aSOCCView, aProps["ShapeAnnotationVisibleItems"].toString() );
+          }
+        }
       }
     }
   } // for entries iterator
@@ -3138,6 +3292,10 @@ void GeometryGUI::restoreVisualParameters (int savePoint)
         occVMod->Repaint();
     }
   }
+
+  if ( myTextTreeWdg ) {
+    myTextTreeWdg->updateTree();
+  }
 }
 
 // Compute current name mode of the viewer
@@ -3146,7 +3304,7 @@ void UpdateNameMode( SalomeApp_Application* app )
   bool isMode = false;
   SalomeApp_Study* aStudy = dynamic_cast< SalomeApp_Study* >( app->activeStudy() );
   SUIT_ViewWindow* viewWindow = app->desktop()->activeWindow();
-  GEOM_Displayer displayer( aStudy );
+  GEOM_Displayer displayer;
   int aMgrId = viewWindow->getViewManager()->getGlobalId();
 
   SALOME_View* window = displayer.GetActiveView();
@@ -3249,12 +3407,14 @@ void GeometryGUI::ClearShapeBuffer( GEOM::GEOM_Object_ptr theObj )
   TCollection_AsciiString asciiIOR( (char *)IOR.in() );
   GEOM_Client::get_client().RemoveShapeFromBuffer( asciiIOR );
 
-  SALOMEDSClient_StudyManager *aManager = SalomeApp_Application::studyMgr();
+  SalomeApp_Application* app =
+    dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication());
+  SalomeApp_Study* appStudy = app ? dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) : 0;
 
-  if (!aManager)
+  if (!appStudy)
     return;
 
-  _PTR(Study) aStudy = aManager->GetStudyByID(theObj->GetStudyID());
+  _PTR(Study) aStudy = appStudy->studyDS();
 
   if ( !aStudy )
     return;
@@ -3365,11 +3525,12 @@ bool GeometryGUI::renameObject( const QString& entry, const QString& name)
     if ( obj->FindAttribute(anAttr, "AttributeName") ) {
       _PTR(AttributeName) aName (anAttr);
 
-      aName->SetValue( name.toLatin1().data() ); // rename the SObject
+      aName->SetValue( name.toUtf8().data() ); // rename the SObject
       GEOM::GEOM_Object_var anObj = GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(obj));
       if (!CORBA::is_nil(anObj)) {
-        anObj->SetName( name.toLatin1().data() );  // Rename the corresponding GEOM_Object
+        anObj->SetName( name.toUtf8().data() );  // Rename the corresponding GEOM_Object
         emit SignalDependencyTreeRenameObject( anObj->GetEntry() );
+        emit SignalTextTreeRenameObject( entry );
       }
       result = true;
     }
@@ -3420,7 +3581,7 @@ bool GeometryGUI::isDraggable( const SUIT_DataObject* what ) const
       _PTR(SObject) aSO = dataObj->object();
       if ( aSO ) {
         _PTR(GenericAttribute) anAttr;
-        _PTR(SObject) aFatherSO = aSO->GetStudy()->GetUseCaseBuilder()->GetFather( aSO );
+        _PTR(SObject) aFatherSO = SalomeApp_Application::getStudy()->GetUseCaseBuilder()->GetFather( aSO );
         if ( aFatherSO && aFatherSO->FindAttribute(anAttr, "AttributeLocalID") ) {
           _PTR(AttributeLocalID) aLocalID( anAttr );
           anObjectInFolder = aLocalID->Value() == 999;
@@ -3497,7 +3658,7 @@ void GeometryGUI::dropObjects( const DataObjectList& what, SUIT_DataObject* wher
   _PTR(SObject) parentObj = dataObj->object();
 
   // Find the current Study and StudyBuilder
-  _PTR(Study) aStudy = parentObj->GetStudy();
+  _PTR(Study) aStudy = SalomeApp_Application::getStudy();
   _PTR(UseCaseBuilder) aUseCaseBuilder = aStudy->GetUseCaseBuilder();
   // collect all parents of the target node
   QStringList parentIDs;
@@ -3537,3 +3698,8 @@ void GeometryGUI::emitDimensionsUpdated( QString entry )
 {
   emit DimensionsUpdated( entry );
 }
+
+void GeometryGUI::emitAnnotationsUpdated( QString entry )
+{
+  emit SignalAnnotationsUpdated( entry );
+}