Salome HOME
Updated copyright comment
[modules/hexablock.git] / src / HEXABLOCKGUI / HEXABLOCKGUI.cxx
old mode 100755 (executable)
new mode 100644 (file)
index c243f38..d7319a4
@@ -1,9 +1,9 @@
-// Copyright (C) 2009-2013  CEA/DEN, EDF R&D
+// Copyright (C) 2009-2024  CEA, EDF
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
 
 #include <cassert>
 
-
+#include <QDir>
 #include <QInputDialog>
 #include <QIcon>
 #include <QStackedWidget>
+#include <QMenu>
+#include <QSplitter>
 
 #include <QtxTreeView.h>
 #include <SUIT_MessageBox.h>
@@ -72,7 +74,6 @@
 
 
 #include <SALOME_ListIO.hxx>
-#include <SALOME_ListIteratorOfListIO.hxx>
 
 
 #include <SALOME_LifeCycleCORBA.hxx>
 // #include "HexDocument_impl.hxx"         del Hexa6
 #include "Hex.hxx"
 
-
-#include <Visual3d_ViewManager.hxx>
-#include <V3d_PerspectiveView.hxx>
+//#include <V3d_PerspectiveView.hxx>
 #include <V3d_AmbientLight.hxx>
 #include <V3d_DirectionalLight.hxx>
 #include <Xw_Window.hxx>
 
 #include <AIS_ListIteratorOfListOfInteractive.hxx>
 
+#include <utilities.h>
 
 #define DW_MINIMUM_WIDTH       50
 #define DWINPUT_MINIMUM_HEIGHT 50
 using namespace std;
 using namespace HEXABLOCK::GUI;
 
-int  HEXABLOCKGUI::_oldStudyId = -1;
-
 // HEXABLOCK_ORB::HEXABLOCK_Gen_var HEXABLOCKGUI::_hexaEngine  = HEXABLOCK_ORB::HEXABLOCK_Gen::_nil();
 //
 VtkDocumentGraphicView* HEXABLOCKGUI::currentDocGView = NULL;
@@ -144,7 +142,7 @@ HEXABLOCKGUI::HEXABLOCKGUI() :
           _dwAssociation(0),
           _dwGroups(0),
           _dwMesh(0),
-          _dwObjectBrowser(0),
+//          _dwObjectBrowser(0),
           _dwInputPanel(0),
           _patternDataTreeView(0),
 //          _patternBuilderTreeView(0),
@@ -154,6 +152,7 @@ HEXABLOCKGUI::HEXABLOCKGUI() :
 //          _treeViewDelegate(0),
           _isSaved( false ),
           moduleActivatedOnce(false),
+          menusEnabled(true),
           _vertexDiag(0),
           _edgeDiag(0),
           _quadDiag(0),
@@ -251,7 +250,6 @@ void HEXABLOCKGUI::initialize( CAM_Application* app )
     createActions();
     createMenus();
     createTools();
-    studyActivated();
 }
 
 void HEXABLOCKGUI::viewManagers( QStringList& list ) const
@@ -284,8 +282,10 @@ bool HEXABLOCKGUI::activateModule( SUIT_Study* theStudy )
 
     connect( getApp()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
             this, SLOT(onWindowActivated( SUIT_ViewWindow* )), Qt::UniqueConnection );
-    connect( getApp()->objectBrowser()->treeView(),SIGNAL( clicked(const QModelIndex&) ),
-            this, SLOT( onObjectBrowserClick(const QModelIndex&) ), Qt::UniqueConnection );
+    if ( getApp()->objectBrowser() ) {
+      connect( getApp()->objectBrowser()->treeView(),SIGNAL( clicked(const QModelIndex&) ),
+              this, SLOT( onObjectBrowserClick(const QModelIndex&) ), Qt::UniqueConnection );
+    }
 
     LightApp_SelectionMgr* sm = getApp()->selectionMgr();
 
@@ -339,15 +339,6 @@ bool HEXABLOCKGUI::activateModule( SUIT_Study* theStudy )
                 this, SLOT( onWindowClosed(SUIT_ViewWindow *) ), Qt::UniqueConnection );
     }
 
-    /* ************************************   TODO Hexa6
-    _hexaEngine->SetCurrentStudy(SALOMEDS::Study::_nil());
-    if ( SalomeApp_Study* s = dynamic_cast<SalomeApp_Study*>( theStudy ))
-        if ( _PTR(Study) aStudy = s->studyDS()) {
-            _hexaEngine->SetCurrentStudy( _CAST(Study,aStudy)->GetStudy() );
-            updateObjBrowser(); // objects can be removed
-        }
-     ************************************ */
-
     if (currentOccGView != NULL && currentOccGView->getViewWindow() != NULL)
             currentOccGView->getViewWindow()->installEventFilter(this);
 
@@ -360,7 +351,10 @@ bool HEXABLOCKGUI::activateModule( SUIT_Study* theStudy )
             currentDocGView->getViewWindow()->installEventFilter(this);
     }
     else
-        initialMenus();
+    {
+        newDocument();
+//        initialMenus();
+    }
 
     return bOk;
 }
@@ -414,16 +408,24 @@ bool HEXABLOCKGUI::deactivateModule( SUIT_Study* theStudy )
 
     hideActor();
 
+    if(currentOccGView) {
+      delete currentOccGView;
+      currentOccGView = NULL;
+    }
+
+    if(currentDocGView) {
+      delete currentDocGView;
+      currentDocGView = NULL;
+    }
+
     return bOk;
 }
 
-SALOMEDS::Study_var HEXABLOCKGUI::ClientStudyToStudy (_PTR(Study) theStudy)
+SALOMEDS::Study_var HEXABLOCKGUI::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);
+  SALOME_NamingService_Abstract *aNamingService = SalomeApp_Application::namingService();
+  CORBA::Object_var aSMObject = aNamingService->Resolve("/Study");
+  SALOMEDS::Study_var aDSStudy = SALOMEDS::Study::_narrow(aSMObject);
   return aDSStudy._retn();
 }
 
@@ -436,8 +438,7 @@ void HEXABLOCKGUI::addInStudy(QMap<QString, TopoDS_Shape>& topo_shapes,
 
     SalomeApp_Study* appStudy = HEXABLOCKGUI::activeStudy();
     if(!appStudy) return;
-    _PTR(Study) aStudy = appStudy->studyDS();
-    SALOMEDS::Study_var aDSStudy = ClientStudyToStudy( aStudy );
+    SALOMEDS::Study_var aDSStudy = getStudyServant();
     SALOMEDS::StudyBuilder_var     aBuilder (aDSStudy->NewBuilder());
     QString entry = currentDocGView->getDocumentModel()->documentEntry();
     SALOMEDS::SObject_var aFatherSO = aDSStudy->FindObjectID( qPrintable(entry) );
@@ -449,7 +450,7 @@ void HEXABLOCKGUI::addInStudy(QMap<QString, TopoDS_Shape>& topo_shapes,
     SOCC_Prs* prs = getOccPrs(currentDocGView);
     if (prs == NULL)
     {
-        prs = new SOCC_Prs();
+        prs = new SOCC_Prs(0);
         isNewPrs = true;
     }
 
@@ -501,29 +502,18 @@ bool HEXABLOCKGUI::renameObject( const QString& entry, const QString& name)
     if (dgview == NULL || dgview->getDocumentModel() == NULL)
         return result;
 
-    SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication());
-    SalomeApp_Study* appStudy = app ? dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) : 0;
-
-    if(!appStudy)
-        return result;
-
-    _PTR(Study) aStudy = appStudy->studyDS();
-
-    if(!aStudy)
-        return result;;
-
-    _PTR(SObject) obj ( aStudy->FindObjectID(qPrintable(entry)) );
+    _PTR(SObject) obj ( SalomeApp_Application::getStudy()->FindObjectID(qPrintable(entry)) );
     _PTR(GenericAttribute) anAttr;
     if ( obj ){
-        if ( obj->FindAttribute(anAttr, "AttributeName") ){
-            _PTR(AttributeName) aName (anAttr);
-            DocumentModel* docModel = dgview->getDocumentModel();
-            docModel->setName( name );
-            aName->SetValue( name.toLatin1().data() );
-            getApp()->updateObjectBrowser();
-//            _dwPattern->setWindowTitle( name );
-            result = true;
-        }
+      if ( obj->FindAttribute(anAttr, "AttributeName") ) {
+        _PTR(AttributeName) aName (anAttr);
+        DocumentModel* docModel = dgview->getDocumentModel();
+        docModel->setName( name );
+        aName->SetValue( name.toLatin1().data() );
+        getApp()->updateObjectBrowser();
+//        _dwPattern->setWindowTitle( name );
+        result = true;
+      }
     }
     return result;
 }
@@ -534,7 +524,9 @@ void HEXABLOCKGUI::windows( QMap<int, int>& theMap ) const
     DEBTRACE("HEXABLOCKGUI::windows");
     theMap.clear();
     theMap.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea );
+#ifndef DISABLE_PYCONSOLE
     theMap.insert( SalomeApp_Application::WT_PyConsole,     Qt::BottomDockWidgetArea );
+#endif
 }
 
 QString  HEXABLOCKGUI::engineIOR() const
@@ -619,6 +611,8 @@ void HEXABLOCKGUI::onObjectBrowserClick(const QModelIndex& index)
             docGView->setViewWindow(graphicViewsHandler->createVtkWindow());
             docGView->getViewWindow()->installEventFilter(this);
             showAllMenus();
+            if (!menusEnabled)
+                setAllMenusEnabled(true);
         }
         else
             docGView->setViewWindow(currentDocGView->getViewWindow());
@@ -660,7 +654,10 @@ void HEXABLOCKGUI::onWindowClosed( SUIT_ViewWindow* svw)
             if (currentDocGView != NULL)
                 currentDocGView->setViewWindow(NULL);
 
-            initialMenus();
+//            initialMenus();
+            setAllMenusEnabled(false);
+            enableDocumentMenus(true);
+
             return;
         }
 
@@ -819,7 +816,7 @@ bool HEXABLOCKGUI::createSComponent() //addComponent
     DEBTRACE("HEXABLOCKGUI::createSComponent");
     // --- Find or create (if not done yet) "HEXABLOCK" SComponent in the study
 
-    _PTR(Study)            aStudy = (( SalomeApp_Study* )(getApp()->activeStudy()))->studyDS();
+    _PTR(Study)            aStudy = SalomeApp_Application::getStudy();
     _PTR(StudyBuilder)     aBuilder (aStudy->NewBuilder());
     _PTR(GenericAttribute) anAttr;
     _PTR(AttributeName)    aName;
@@ -864,29 +861,14 @@ void HEXABLOCKGUI::preferencesChanged( const QString& sect, const QString& name
 //        _genericGui->getCatalogWidget()->addCatalogFromFile(Resource::userCatalog.toStdString());
 }
 
-void HEXABLOCKGUI::studyActivated() //CS_TODO
-{
-    int newStudyId = getApp()->activeStudy()->id();
-    DEBTRACE("HEXABLOCKGUI::studyActivated " << _oldStudyId << " " << newStudyId);
-//    if (_oldStudyId != -1)
-//    {
-//        _studyContextMap[_oldStudyId] = QtGuiContext::getQtCurrent();
-//        if (_studyContextMap.count(newStudyId))
-//        {
-//            DEBTRACE("switch to valid context " << QtGuiContext::getQtCurrent() << " " << _studyContextMap[newStudyId]);
-//            QtGuiContext::setQtCurrent(_studyContextMap[newStudyId]);
-//        }
-//        else
-//        {
-//            DEBTRACE("no switch to null context");
-//        }
-//    }
-    _oldStudyId = newStudyId;
-}
-
 void HEXABLOCKGUI::treeContextMenu(const QPoint& aPosition)
 {
     QModelIndex currentIndex = _patternDataTreeView->currentIndex();
+
+    // if nothing is selected, return
+    if (! currentIndex.isValid())
+      return;
+
     QVariant currentAssocVariant;
     QString currentAssocEntry;
 
@@ -941,6 +923,7 @@ void HEXABLOCKGUI::createAndFillDockWidget()
     _dwInputPanel = new QDockWidget(aParent);
     _dwInputPanel->setVisible(false);
     _dwInputPanel->setWindowTitle("Input Panel");
+    _dwInputPanel->setObjectName("hexablockInputPanelDock");
 //    _dwInputPanel->setMinimumWidth(DWINPUT_MINIMUM_WIDTH); // --- force a minimum until display
 
 //    _treeViewDelegate = new DocumentDelegate(_dwInputPanel);
@@ -951,6 +934,7 @@ void HEXABLOCKGUI::createAndFillDockWidget()
     _dwPattern->setVisible(false);
     _dwPattern->setWindowTitle("Model");
     _dwPattern->setMinimumWidth(DW_MINIMUM_WIDTH); // --- force a minimum until display
+    _dwPattern->setObjectName("hexablockModelDock");
 
     QFrame*      patternFrame  = new QFrame(_dwPattern);
     patternFrame->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred);
@@ -985,6 +969,7 @@ void HEXABLOCKGUI::createAndFillDockWidget()
     _dwGroups->setVisible(false);
     _dwGroups->setWindowTitle("Groups");
     _dwGroups->setMinimumWidth(DW_MINIMUM_WIDTH); // --- force a minimum until display
+    _dwGroups->setObjectName("hexablockGroupsDock");
     _groupsTreeView = new QTreeView(_dwGroups);
     _groupsTreeView->setEditTriggers(QAbstractItemView::NoEditTriggers);
 //    _groupsTreeView->setItemDelegate(_treeViewDelegate);
@@ -996,6 +981,7 @@ void HEXABLOCKGUI::createAndFillDockWidget()
     _dwMesh->setVisible(false);
     _dwMesh->setWindowTitle("Mesh");
     _dwMesh->setMinimumWidth(DW_MINIMUM_WIDTH); // --- force a minimum until display
+    _dwMesh->setObjectName("hexablockMeshDock");
     _meshTreeView = new QTreeView(_dwMesh);
     _meshTreeView->setEditTriggers(QAbstractItemView::NoEditTriggers);
     _meshTreeView->setSelectionMode(QAbstractItemView::SingleSelection);
@@ -1004,30 +990,35 @@ void HEXABLOCKGUI::createAndFillDockWidget()
     _meshTreeView->show();
 
 //    QDockWidget *_dwObjectBrowser = 0;
-    QWidget* wid = getApp()->objectBrowser()->treeView();
-    QWidget *w   = wid->parentWidget();
-    while ( w && !_dwObjectBrowser ) {
-        _dwObjectBrowser = ::qobject_cast<QDockWidget*>( w );
-        w = w->parentWidget();
+    QWidget* wid = 0;
+    if ( getApp()->objectBrowser() )
+      wid = getApp()->objectBrowser()->treeView();
+    while ( wid && !_dwObjectBrowser ) {
+        _dwObjectBrowser = ::qobject_cast<QDockWidget*>( wid );
+        wid = wid->parentWidget();
+    }
+    
+    if ( _dwObjectBrowser ) {
+      _dwObjectBrowser->setMinimumWidth(DW_MINIMUM_WIDTH); // --- force a minimum until display
+      _dwObjectBrowser->setWindowTitle("Study");
     }
-    _dwObjectBrowser->setMinimumWidth(DW_MINIMUM_WIDTH); // --- force a minimum until display
-    _dwObjectBrowser->setWindowTitle("Study");
 
     // dock widget position
-    aParent->addDockWidget( Qt::LeftDockWidgetArea, _dwObjectBrowser );
+    if ( _dwObjectBrowser ) {
+      aParent->addDockWidget( Qt::LeftDockWidgetArea, _dwObjectBrowser );
+    }
     aParent->addDockWidget( Qt::RightDockWidgetArea, _dwInputPanel );
 
 //    aParent->tabifyDockWidget( _dwPattern, _dwObjectBrowser );
 //    aParent->tabifyDockWidget( _dwGroups, _dwPattern );
 //    aParent->tabifyDockWidget( _dwMesh, _dwGroups );
 
-    aParent->tabifyDockWidget( _dwObjectBrowser, _dwPattern );
+    if ( _dwObjectBrowser ) {
+      aParent->tabifyDockWidget( _dwObjectBrowser, _dwPattern );
+    }
     aParent->tabifyDockWidget( _dwPattern, _dwGroups );
     aParent->tabifyDockWidget( _dwGroups, _dwMesh );
-
-#if QT_VERSION >= 0x040500
     aParent->setTabPosition(Qt::AllDockWidgetAreas, Resource::tabPanelsUp? QTabWidget::North: QTabWidget::South);
-#endif
 
     // popup menu on data tree view
     _patternDataTreeView->setContextMenuPolicy(Qt::CustomContextMenu);
@@ -1471,7 +1462,7 @@ void HEXABLOCKGUI::createTools()
 {
     int aToolId;
 
-    aToolId = createTool ( tr( "HexaBlock Toolbar" ) );
+    aToolId = createTool ( tr( "HexaBlock Toolbar" ), QString( "HexaBlockMain" ) );
     createTool( _newAct, aToolId );
     createTool( _importAct, aToolId );
     createTool( _saveAct, aToolId );
@@ -1480,7 +1471,7 @@ void HEXABLOCKGUI::createTools()
     //createTool( separator(), aToolId );
 
     // Pattern Data
-    aToolId = createTool ( tr( "Construction" ) );
+    aToolId = createTool ( tr( "Construction" ), QString( "HexaBlockConstruction" ) );
     createTool( _addVertex, aToolId );
     createTool( _addEdge, aToolId );
     createTool( _addQuad, aToolId );
@@ -1506,7 +1497,7 @@ void HEXABLOCKGUI::createTools()
     createTool( _makePipes,    aToolId );
 
     // Pattern Data Edition
-    aToolId = createTool ( tr( "Operation" ) );
+    aToolId = createTool ( tr( "Operation" ), QString( "HexaBlockOperation" ) );
     createTool( _removeHexa, aToolId );
     createTool( _prismQuad,  aToolId );
     createTool( _joinQuad,   aToolId );
@@ -1521,19 +1512,19 @@ void HEXABLOCKGUI::createTools()
     createTool( _quadRevolution, aToolId );
 
     // Association
-    aToolId = createTool ( tr( "Association" ) );
+    aToolId = createTool ( tr( "Association" ), QString( "HexaBlockAssociation" ) );
     createTool( _assocVertex, aToolId );
     createTool( _assocEdge, aToolId );
     createTool( _assocQuad, aToolId );
     createTool( _addShapeAct, aToolId );
 
     // Group
-    aToolId = createTool ( tr( "Group" ) );
+    aToolId = createTool ( tr( "Group" ), QString( "HexaBlockGroup" ) );
     createTool( _addGroup,    aToolId );
     createTool( _removeGroup, aToolId ); //CS_TODO
 
     // Law
-    aToolId = createTool ( tr( "Mesh" ) );
+    aToolId = createTool ( tr( "Mesh" ), QString( "HexaBlockMesh" ) );
     createTool( _addLaw,    aToolId );
     createTool( _removeLaw, aToolId );
     createTool( _setPropagation, aToolId );
@@ -1559,6 +1550,16 @@ void HEXABLOCKGUI::showAllMenus()
     showMeshMenus( true );
 }
 
+void HEXABLOCKGUI::setAllMenusEnabled(bool enable)
+{
+    enableDocumentMenus( enable );
+    enablePatternMenus( enable );
+    enableAssociationMenus( enable );
+    enableGroupsMenus( enable );
+    enableMeshMenus( enable );
+
+    menusEnabled = enable;
+}
 
 void HEXABLOCKGUI::showDocumentMenus(bool show)
 {
@@ -1574,6 +1575,22 @@ void HEXABLOCKGUI::showDocumentMenus(bool show)
     setToolShown(_saveAct, show);
 }
 
+void HEXABLOCKGUI::enableDocumentMenus(bool enable)
+{
+    _newAct->setEnabled(enable);
+//    setToolShown(_newAct, enable);
+
+    _importAct->setEnabled(enable);
+//    setToolShown(_importAct, enable);
+
+    _showModelInfoAct->setEnabled(enable);
+//    setToolShown(_showModelInfoAct, enable);
+
+    _saveAct->setEnabled(enable);
+//    setToolShown(_saveAct, enable);
+}
+
+
 void HEXABLOCKGUI::showPatternMenus(bool show)
 {
     DEBTRACE("HEXABLOCKGUI::showPatternMenus " << show);
@@ -1649,6 +1666,93 @@ void HEXABLOCKGUI::showPatternMenus(bool show)
     setMenuShown( _showModelInfoAct, show );
 }
 
+void HEXABLOCKGUI::enablePatternMenus(bool enable)
+{
+    if ( enable && !getCurrentModel() ) return;
+
+    _addVertex->setEnabled(enable);
+//    setToolShown(_addVertex, enable);
+
+    _addEdge->setEnabled(enable);
+//    setToolShown(_addEdge, enable);
+
+    _addQuad->setEnabled(enable);
+//    setToolShown(_addQuad, enable);
+
+    _addHexa->setEnabled(enable);
+//    setToolShown(_addHexa, enable);
+
+//    setMenuShown(_sep1, enable );
+//    setToolShown(_sep1, enable);
+
+    _addVector->setEnabled(enable);
+//    setToolShown( _addVector, enable);
+
+//    setMenuShown(_sep2, enable );
+//    setToolShown(_sep2, enable);
+
+    _makeGrid->setEnabled(enable);
+//    setToolShown( _makeGrid, enable);
+
+    _makePipe->setEnabled(enable);
+//    setToolShown( _makePipe, enable);
+
+//    setMenuShown(_sep3, enable );
+//    setToolShown(_sep3, enable);
+
+    _makeCylinder->setEnabled(enable);
+//    setToolShown( _makeCylinder, enable);
+
+    _makeCylinders->setEnabled(enable);
+//    setToolShown( _makeCylinders, enable);
+
+    _makePipes->setEnabled(enable);
+//    setToolShown( _makePipes, enable);
+
+    _makeHemiSphere->setEnabled(enable);
+//    setToolShown( _makeHemiSphere, enable);
+
+    // Pattern Data Edition
+    _removeHexa->setEnabled(enable);
+//    setToolShown( _removeHexa, enable);
+
+    _prismQuad->setEnabled(enable);
+//    setToolShown( _prismQuad, enable);
+
+    _joinQuad->setEnabled(enable);
+//    setToolShown( _joinQuad, enable);
+
+    _merge->setEnabled(enable);
+//    setToolShown( _merge, enable);
+
+    _disconnect->setEnabled(enable);
+//    setToolShown( _disconnect, enable);
+
+    _cutEdge->setEnabled(enable);
+//    setToolShown( _cutEdge, enable);
+
+    _makeTransformation->setEnabled(enable);
+//    setToolShown( _makeTransformation, enable);
+
+    _makeSymmetry->setEnabled(enable);
+//    setToolShown( _makeSymmetry, enable);
+
+    _performTransformation->setEnabled(enable);
+//    setToolShown( _performTransformation, enable);
+
+    _performSymmetry->setEnabled(enable);
+//    setToolShown( _performSymmetry, enable);
+
+    _replaceHexa->setEnabled(enable);
+//    setToolShown( _replaceHexa, enable);
+
+    _quadRevolution->setEnabled(enable);
+//    setToolShown( _quadRevolution, enable);
+
+//    setMenuShown( _sep4, enable );
+    _showModelInfoAct->setEnabled(enable);
+}
+
 
 void HEXABLOCKGUI::showAssociationMenus(bool show)
 {
@@ -1658,13 +1762,34 @@ void HEXABLOCKGUI::showAssociationMenus(bool show)
     // Association Edition
     setMenuShown( _assocVertex,  show );
     setToolShown( _assocVertex, show );
+
     setMenuShown( _assocEdge,  show );
     setToolShown( _assocEdge, show );
+
     setMenuShown( _assocQuad,  show );
     setToolShown( _assocQuad, show );
+
     setMenuShown( _addShapeAct, show );
     setToolShown( _addShapeAct, show );
+}
+
+void HEXABLOCKGUI::enableAssociationMenus(bool enable)
+{
+    if ( enable && !getCurrentModel() )
+        return;
 
+    // Association Edition
+     _assocVertex->setEnabled(enable);
+ //    setToolShown( _assocVertex, enable );
+
+     _assocEdge->setEnabled(enable);
+ //    setToolShown( _assocEdge, enable );
+
+     _assocQuad->setEnabled(enable);
+ //    setToolShown( _assocQuad, enable );
+
+     _addShapeAct->setEnabled(enable);
+ //    setToolShown( _addShapeAct, enable );
 }
 
 void HEXABLOCKGUI::showGroupsMenus(bool show)
@@ -1677,6 +1802,18 @@ void HEXABLOCKGUI::showGroupsMenus(bool show)
     setToolShown( _removeGroup , show);
 }
 
+void HEXABLOCKGUI::enableGroupsMenus(bool enable)
+{
+    if ( enable && !getCurrentModel() )
+        return;
+
+    _addGroup->setEnabled(enable);
+//    setToolShown( _addGroup, enable);
+
+    _removeGroup->setEnabled(enable);
+//    setToolShown( _removeGroup , enable);
+}
+
 void HEXABLOCKGUI::showMeshMenus(bool show)
 {
     DEBTRACE("HEXABLOCKGUI::showMeshMenus" << show);
@@ -1691,6 +1828,24 @@ void HEXABLOCKGUI::showMeshMenus(bool show)
     setToolShown( _computeMesh, show);
 }
 
+void HEXABLOCKGUI::enableMeshMenus(bool enable)
+{
+    if ( enable && !getCurrentModel() )
+        return;
+
+    _addLaw->setEnabled(enable);
+//    setToolShown( _addLaw, enable);
+
+    _removeLaw->setEnabled(enable);
+//    setToolShown( _removeLaw, enable);
+
+    _setPropagation->setEnabled(enable);
+//    setToolShown( _setPropagation, enable);
+
+    _computeMesh->setEnabled(enable);
+//    setToolShown( _computeMesh, enable);
+}
+
 void HEXABLOCKGUI::showVtkActor()
 {
     VtkDocumentGraphicView* currentVtkGView = getCurrentVtkGraphicView();
@@ -1808,7 +1963,6 @@ void HEXABLOCKGUI::showDockWidgets(bool isVisible)
     DEBTRACE("HEXABLOCKGUI::showDockWidgets " << isVisible);
 
     if (_dwObjectBrowser) _dwObjectBrowser->setVisible(isVisible);
-    if (_dwObjectBrowser) _dwObjectBrowser->toggleViewAction()->setVisible(isVisible);
 
     if (_dwPattern) _dwPattern->setVisible(isVisible);
     if (_dwPattern) _dwPattern->toggleViewAction()->setVisible(isVisible);
@@ -1973,6 +2127,8 @@ void HEXABLOCKGUI::switchModel(VtkDocumentGraphicView* dgview)
     currentDocGView->getDocumentModel()->refresh();
 //    _dwPattern->setWindowTitle(currentDocGView->getDocumentModel()->getName());
     showAllMenus();
+    if (!menusEnabled)
+        setAllMenusEnabled(true);
 }
 
 DocumentModel* HEXABLOCKGUI::getCurrentModel()
@@ -3059,8 +3215,7 @@ QString HEXABLOCKGUI::addDocInStudy (HEXA_NS::Document* document)
     if (app_study == NULL)
         return docEntry;
 
-    _PTR(Study)         study    = app_study->studyDS();
-    SALOMEDS::Study_var ds_study = ClientStudyToStudy (study);
+    SALOMEDS::Study_var ds_study = getStudyServant();
     SALOMEDS::StudyBuilder_var aBuilder (ds_study->NewBuilder());
     QString entry = app_study->centry("HEXABLOCK");
     SALOMEDS::SObject_var aFatherSO = ds_study->FindObjectID( qPrintable(entry) );