Salome HOME
PV version is now bfaf7b82ed22ee (master of 17th of january 2019)
[modules/paravis.git] / src / PVGUI / PVGUI_Module.cxx
index 2f055f112ded2c637176552c970d7d387ece71c0..02cc591668d560bb81929f488c044615f8ac326e 100644 (file)
@@ -1,6 +1,6 @@
 // PARAVIS : ParaView wrapper SALOME module
 //
-// Copyright (C) 2010-2014  CEA/DEN, EDF R&D
+// Copyright (C) 2010-2019  CEA/DEN, EDF R&D
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 //
 // File   : PVGUI_Module.cxx
 
+#define PARAVIS_MODULE_NAME "PARAVIS"
+
 #include <Standard_math.hxx>  // E.A. must be included before Python.h to fix compilation on windows
 #ifdef HAVE_FINITE
 #undef HAVE_FINITE            // VSR: avoid compilation warning on Linux : "HAVE_FINITE" redefined
 #endif
 #include <vtkPython.h> // Python first
-#include "PVGUI_Module.h"
-
-#ifdef PARAVIS_WITH_FULL_CORBA
-# include "PARAVIS_Gen_i.hh"
-#endif
 
-#include CORBA_SERVER_HEADER(SALOME_ModuleCatalog)
-#include CORBA_SERVER_HEADER(SALOMEDS)
+#include "PVGUI_Module.h"
 
 #include "PVViewer_ViewManager.h"
+#include "PVViewer_Core.h"
 #include "PVViewer_ViewWindow.h"
 #include "PVViewer_ViewModel.h"
-#include "PVGUI_Tools.h"
 #include "PVGUI_ParaViewSettingsPane.h"
 #include "PVViewer_GUIElements.h"
-#include "PVViewer_EngineWrapper.h"
+#include "PVServer_ServiceWrapper.h"
+#include "PVGUI_DataModel.h"
 
 // SALOME Includes
+#include <utilities.h>
 #include <SUIT_DataBrowser.h>
 #include <SUIT_Desktop.h>
 #include <SUIT_MessageBox.h>
 #include <SUIT_OverrideCursor.h>
 #include <SUIT_ExceptionHandler.h>
 
-#include <SALOME_LifeCycleCORBA.hxx>
-#include <SALOMEDS_SObject.hxx>
-
 #include <LightApp_SelectionMgr.h>
 #include <LightApp_NameDlg.h>
-#include <SalomeApp_Application.h>
-#include <SalomeApp_Study.h>
+#include <LightApp_Application.h>
+#include <LightApp_Study.h>
 #include <SALOME_ListIO.hxx>
-#include <SALOMEDS_Tool.hxx>
-#include <Utils_ORB_INIT.hxx>
-#include <Utils_SINGLETON.hxx>
 
 #include <QtxActionMenuMgr.h>
 #include <QtxActionToolMgr.h>
@@ -95,7 +87,6 @@
 #include <vtkProcessModule.h>
 #include <vtkPVSession.h>
 #include <vtkPVProgressHandler.h>
-#include <vtkOutputWindow.h>
 #include <vtkEventQtSlotConnect.h>
 #include <vtkNew.h>
 #include <vtkSMProxy.h>
 #include <vtkSMTrace.h>
 #include <vtkSMSessionProxyManager.h>
 #include <vtkSMParaViewPipelineController.h>
+#include <vtkSmartPyObject.h>
 
 #include <pqApplicationCore.h>
 #include <pqPVApplicationCore.h>
-#include <pqActiveView.h>
 #include <pqObjectBuilder.h>
 #include <pqOptions.h>
 #include <pqSettings.h>
 #include <pqActiveObjects.h>
 #include <pqHelpReaction.h>
 #include <pqPluginManager.h>
-#include <pqPythonDialog.h>
+//#include <pqPythonDialog.h>
 #include <pqPythonManager.h>
 #include <pqLoadDataReaction.h>
 #include <pqPythonScriptEditor.h>
 #include <pqScalarBarVisibilityReaction.h>
 #include <pqServerResource.h>
 #include <pqServerConnectReaction.h>
-
-// TO REMOVE:
-#include <PyInterp_Interp.h>
-
+#include <pqPluginManager.h>
+#include <pqVCRToolbar.h>
+#include <pqAnimationScene.h>
+#include <pqServerManagerModel.h>
+#include <pqAnimationTimeToolbar.h>
+#include <pqPipelineBrowserWidget.h>
+#include <pqCoreUtilities.h>
+
+#if PY_VERSION_HEX < 0x03050000
+static char*
+Py_EncodeLocale(const wchar_t *arg, size_t *size)
+{
+       return _Py_wchar2char(arg, size);
+}
+static wchar_t*
+Py_DecodeLocale(const char *arg, size_t *size)
+{
+       return _Py_char2wchar(arg, size);
+}
+#endif
 
 //----------------------------------------------------------------------------
 PVGUI_Module* ParavisModule = 0;
-PARAVIS_ORB::PARAVIS_Gen_var PVGUI_Module::MyEngine;
 
 /*!
   \mainpage
+  This is the doxygen documentation of the ParaVis module.
+  If you are looking for general information about the structure of the module, you should
+  take a look at the <a href="../index.html">Sphinx documentation</a> first.
 
-  <h2>Building and installing PARAVIS</h2>
-  As any other SALOME module, PARAVIS requires PARAVIS_ROOT_DIR environment variable to be set to PARAVIS
-  installation directory.
-  Other variables needed for correct detection of ParaView location:
-  \li PVHOME - points at the ParaView installation directory tree
-  \li PVVERSION - number of ParaView version
-
-  It also requires common SALOME environment including GUI_ROOT_DIR and other prerequsites.
-
-
-  PARAVIS module can be launched using the following commands:
-  \li Full SALOME configuration
-  \code
-  runSalome --modules="PARAVIS"
-  \endcode
-
-  <h2>ParaView GUI integration</h2>
-  <h3>ParaView GUI integration overview</h3>
-
-  The main idea is to reuse ParaView GUI internal logic as much as possible, providing a layer 
-  between it and SALOME GUI that hides the following SALOME GUI implementation details from ParaView:
-
-  \li SALOME GUI executable and Qt event loop
-  \li SALOME GUI desktop
-  \li Dock windows areas
-  \li SALOME menu and toolbar managers
-
-  Major part of the integration is implemented in PVGUI_Module class.
-
-  <h3>ParaView client initalization</h3>
-
-  ParaView client initalization is performed when an instance of PVGUI_Module class has been created 
-  and \link PVGUI_Module::initialize() PVGUI_Module::initialize()\endlink method is called by SALOME GUI.
-  The actual client start-up is done in \link PVGUI_Module::pvInit() PVGUI_Module::pvInit()\endlink method. 
-  
-
-  <h3>Multi-view manager</h3>
-
-  SALOME GUI requires that each kind of view be implemnted with help of (at least) three classes. For ParaView multi-view manager 
-  these are:
-
-  \li PVGUI_ViewManager - view manager class
-  \li PVGUI_Viewer      - view model class
-  \li PVGUI_ViewWindow  - view window class that acts as a parent for %pqViewManager
-
-  Single instances of PVGUI_ViewManager and PVGUI_ViewWindow classes are created by \link PVGUI_Module::showView() 
-  PVGUI_Module::showView()\endlink method upon the first PARAVIS module activation. The same method hides the multi-view manager 
-  when the module is deactivated (the user switches to another module or a study is closed). 
-  A special trick is used to make PVGUI_ViewWindow the parent of %pqViewManager widget. It is created initally by %pqMainWindowCore
-  with the desktop as a parent, so when it is shown PVGUI_ViewWindow instance is passed to its setParent() method. In  
-  \link PVGUI_ViewWindow::~PVGUI_ViewWindow() PVGUI_ViewWindow::~PVGUI_ViewWindow()\endlink the parent is nullified to avoid deletion
-  of %pqViewManager widget that would break %pqMainWindowCore class.
-
-  <h3>ParaView plugins</h3>
-  ParaView server and client plugins are managed by %pqMainWindowCore slots that has full access to PARAVIS menus and toolbars. 
-  As a result they appears automatically in PARAVIS menus and toolbars if loaded successfully.
+  The integration of ParaView into SALOME is split in two parts:
+  \li the PVViewer in the GUI module (folder *src/PVViewer*)
+  \li the ParaVis module itself (the pages you are currently browsing)
 */
 
 /*!
@@ -203,48 +159,10 @@ PARAVIS_ORB::PARAVIS_Gen_var PVGUI_Module::MyEngine;
          SALOME module wrapping ParaView GUI.
 */
 
-_PTR(SComponent)
-ClientFindOrCreateParavisComponent(_PTR(Study) theStudyDocument)
-{
-  _PTR(SComponent) aSComponent = theStudyDocument->FindComponent("PARAVIS");
-  if (!aSComponent) {
-    _PTR(StudyBuilder) aStudyBuilder = theStudyDocument->NewBuilder();
-    aStudyBuilder->NewCommand();
-    int aLocked = theStudyDocument->GetProperties()->IsLocked();
-    if (aLocked) theStudyDocument->GetProperties()->SetLocked(false);
-    aSComponent = aStudyBuilder->NewComponent("PARAVIS");
-    _PTR(GenericAttribute) anAttr =
-      aStudyBuilder->FindOrCreateAttribute(aSComponent, "AttributeName");
-    _PTR(AttributeName) aName (anAttr);
-
-    ORB_INIT& init = *SINGLETON_<ORB_INIT>::Instance();
-    CORBA::ORB_var anORB = init( qApp->argc(), qApp->argv() );
-
-    SALOME_NamingService *NamingService = new SALOME_NamingService( anORB );
-    CORBA::Object_var objVarN = NamingService->Resolve("/Kernel/ModulCatalog");
-    SALOME_ModuleCatalog::ModuleCatalog_var Catalogue =
-      SALOME_ModuleCatalog::ModuleCatalog::_narrow(objVarN);
-    SALOME_ModuleCatalog::Acomponent_var Comp = Catalogue->GetComponent( "PARAVIS" );
-    if (!Comp->_is_nil()) {
-      aName->SetValue(Comp->componentusername());
-    }
-
-    anAttr = aStudyBuilder->FindOrCreateAttribute(aSComponent, "AttributePixMap");
-    _PTR(AttributePixMap) aPixmap (anAttr);
-    aPixmap->SetPixMap( "pqAppIcon16.png" );
-
-    // Create Attribute parameters for future using
-    anAttr = aStudyBuilder->FindOrCreateAttribute(aSComponent, "AttributeParameter");
-
-    aStudyBuilder->DefineComponentInstance(aSComponent, PVGUI_Module::GetCPPEngine()->GetIOR());
-    if (aLocked) theStudyDocument->GetProperties()->SetLocked(true);
-    aStudyBuilder->CommitCommand();
-  }
-  return aSComponent;
-}
-
 /*!
-  Clean up function; used to stop ParaView progress events when
+  \brief Clean up function
+
+  Used to stop ParaView progress events when
   exception is caught by global exception handler.
 */
 void paravisCleanUp()
@@ -259,38 +177,21 @@ void paravisCleanUp()
   \brief Constructor. Sets the default name for the module.
 */
 PVGUI_Module::PVGUI_Module()
-  : SalomeApp_Module( "PARAVIS" ),
-    mySelectionControlsTb( -1 ),
+  : LightApp_Module( PARAVIS_MODULE_NAME ),
     mySourcesMenuId( -1 ),
     myFiltersMenuId( -1 ),
     myMacrosMenuId(-1),
-    myToolbarsMenuId(-1),
     myRecentMenuId(-1),
+    myCatalystMenuId(-1),
     myOldMsgHandler(0),
     myTraceWindow(0),
-    myStateCounter(0),
     myInitTimer(0),
-    myPushTraceTimer(0),
     myGuiElements(0)
 {
 #ifdef HAS_PV_DOC
   Q_INIT_RESOURCE( PVGUI );
 #endif
   ParavisModule = this;
-
-  // Clear old copies of embedded macros files
-  QString aDestPath = QString( "%1/.config/%2/Macros" ).arg( QDir::homePath() ).arg( QApplication::applicationName() );
-  QStringList aFilter;
-  aFilter << "*.py";
-
-  QDir aDestDir(aDestPath);
-  QStringList aDestFiles = aDestDir.entryList(aFilter, QDir::Files);
-  foreach (QString aMacrosPath, getEmbeddedMacrosList()) {
-    QString aMacrosName = QFileInfo(aMacrosPath).fileName();
-    if (aDestFiles.contains(aMacrosName)) {
-      aDestDir.remove(aMacrosName);
-    }
-  }
 }
 
 /*!
@@ -298,27 +199,36 @@ PVGUI_Module::PVGUI_Module()
 */
 PVGUI_Module::~PVGUI_Module()
 {
-  if (myPushTraceTimer)
-    delete myPushTraceTimer;
   if (myInitTimer)
     delete myInitTimer;
 }
 
-PARAVIS_ORB::PARAVIS_Gen_var PVGUI_Module::GetCPPEngine()
+/*!
+  \brief Retrieve the PVSERVER CORBA engine.
+  This uses the Python wrapper provided
+  by the PVViewer code in GUI (class PVViewer_EngineWrapper).
+  \sa GetCPPEngine()
+*/
+PVServer_ServiceWrapper* PVGUI_Module::GetEngine()
 {
-  // initialize PARAVIS module engine (load, if necessary)
-  if ( CORBA::is_nil( MyEngine ) ) {
-      Engines::EngineComponent_var comp =
-          SalomeApp_Application::lcc()->FindOrLoad_Component( "FactoryServer", "PARAVIS" );
-      MyEngine = PARAVIS_ORB::PARAVIS_Gen::_narrow( comp );
-  }
-  return MyEngine;
+  return PVServer_ServiceWrapper::GetInstance();
 }
 
+/*!
+  \brief Create data model.
+  \return module specific data model
+*/
+CAM_DataModel* PVGUI_Module::createDataModel()
+{
+  return new PVGUI_DataModel( this );
+}
 
-pqPVApplicationCore * PVGUI_Module::GetPVApplication()
+/*!
+  \brief Get the ParaView application singleton.
+*/
+pqPVApplicationCore* PVGUI_Module::GetPVApplication()
 {
-  return PVViewer_ViewManager::GetPVApplication();
+  return PVViewer_Core::GetPVApplication();
 }
 
 /*!
@@ -327,12 +237,7 @@ pqPVApplicationCore * PVGUI_Module::GetPVApplication()
 */
 void PVGUI_Module::initialize( CAM_Application* app )
 {
-  SalomeApp_Module::initialize( app );
-
-  // Create ParaViS actions
-  createActions();
-  // Create ParaViS menus
-  createMenus();
+  LightApp_Module::initialize( app );
 
   // Uncomment to debug ParaView initialization
   // "aa" used instead of "i" as GDB doesn't like "i" variables :)
@@ -343,27 +248,45 @@ void PVGUI_Module::initialize( CAM_Application* app )
   }
   */
 
-  SalomeApp_Application* anApp = getApp();
+  LightApp_Application* anApp = getApp();
   SUIT_Desktop* aDesktop = anApp->desktop();
 
+  // Remember current state of desktop toolbars
+  QList<QToolBar*> foreignToolbars = aDesktop->findChildren<QToolBar*>();
+
   // Initialize ParaView client and associated behaviors
   // and connect to externally launched pvserver
-  PVViewer_ViewManager::ParaviewInitApp(aDesktop);
+  PVViewer_Core::ParaviewInitApp(aDesktop);
+
+  // Clear old copies of embedded macros files
+  //QString aDestPath = QString( "%1/.config/%2/Macros" ).arg( QDir::homePath() ).arg( QApplication::applicationName() );
+  QString aDestPath = pqCoreUtilities::getParaViewUserDirectory() + "/Macros";
+  QStringList aFilter;
+  aFilter << "*.py";
+
+  QDir aDestDir(aDestPath);
+  QStringList aDestFiles = aDestDir.entryList(aFilter, QDir::Files);
+  foreach(QString aMacrosPath, getEmbeddedMacrosList()) {
+         QString aMacrosName = QFileInfo(aMacrosPath).fileName();
+         if (aDestFiles.contains(aMacrosName)) {
+                 aDestDir.remove(aMacrosName);
+         }
+  }
+
   myGuiElements = PVViewer_GUIElements::GetInstance(aDesktop);
 
-  // Remember current state of desktop toolbars
-  QList<QToolBar*> foreignToolbars = aDesktop->findChildren<QToolBar*>();
 
+  // [ABN]: careful with the order of the GUI element creation, the loading of the configuration
+  // and the connection to the server. This order is very sensitive if one wants to make
+  // sure all menus, etc ... are correctly populated.
+  // Reference points are: ParaViewMainWindow.cxx and branded_paraview_initializer.cxx.in
   setupDockWidgets();
 
-  // Behaviors and connection must be instanciated *after* widgets are in place
-  // In PARAVIS module we do not wait for PVViewer_ViewWindow to be instanciated to have this:
-  PVViewer_ViewManager::ParaviewInitBehaviors(true, aDesktop);
-  PVViewer_ViewManager::ConnectToExternalPVServer(aDesktop);
-
   pvCreateActions();
-  pvCreateToolBars();
   pvCreateMenus();
+  pvCreateToolBars();
+
+  PVViewer_Core::ParaviewInitBehaviors(true, aDesktop);
 
   QList<QDockWidget*> activeDocks = aDesktop->findChildren<QDockWidget*>();
   QList<QMenu*> activeMenus = aDesktop->findChildren<QMenu*>();
@@ -395,15 +318,31 @@ void PVGUI_Module::initialize( CAM_Application* app )
 //      }
 //    }
 
-  PVViewer_ViewManager::ParaviewLoadConfigurations();
+  // Connect after toolbar creation, etc ... as some activations of the toolbars is triggered
+  // by the ServerConnection event:
+  const QString configPath(PVViewer_ViewManager::GetPVConfigPath());
+  PVViewer_Core::ParaviewLoadConfigurations(configPath, true);
+  PVViewer_ViewManager::ConnectToExternalPVServer(aDesktop);
   updateObjBrowser();
 
   // Find created toolbars
   QCoreApplication::processEvents();
 
+  // process PVViewer toolbars (might be added by PVViewer created BEFORE activating ParaVis)
+  QList<QToolBar*> pvToolbars = myGuiElements->getToolbars();
+  foreach(QToolBar* aBar, pvToolbars) {
+    if (!myToolbars.contains(aBar)) {
+      myToolbars[aBar] = true;
+      myToolbarBreaks[aBar] = false;
+      aBar->setVisible(false);
+      aBar->toggleViewAction()->setVisible(false);
+    }
+  }
+
+  // process other toolbars (possibly added by Paraview)
   QList<QToolBar*> allToolbars = aDesktop->findChildren<QToolBar*>();
   foreach(QToolBar* aBar, allToolbars) {
-    if (!foreignToolbars.contains(aBar)) {
+    if (!foreignToolbars.contains(aBar) && !myToolbars.contains(aBar)) {
       myToolbars[aBar] = true;
       myToolbarBreaks[aBar] = false;
       aBar->setVisible(false);
@@ -414,7 +353,7 @@ void PVGUI_Module::initialize( CAM_Application* app )
   updateMacros();
  
   SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
-  bool isStop = aResourceMgr->booleanValue( "PARAVIS", "stop_trace", false );
+  bool isStop = aResourceMgr->booleanValue( PARAVIS_MODULE_NAME, "stop_trace", false );
   if(!isStop)
     {
       // Start a timer to schedule asap:
@@ -423,12 +362,6 @@ void PVGUI_Module::initialize( CAM_Application* app )
       QObject::connect(myInitTimer, SIGNAL(timeout()), this, SLOT(onInitTimer()) );
       myInitTimer->setSingleShot(true);
       myInitTimer->start(0);
-
-      // Another timer to regularly push the trace onto the engine:
-      myPushTraceTimer = new QTimer(aDesktop);
-      QObject::connect(myPushTraceTimer, SIGNAL(timeout()), this, SLOT(onPushTraceTimer()) );
-      myPushTraceTimer->setSingleShot(false);
-      myPushTraceTimer->start(500);
     }
 
   this->VTKConnect = vtkEventQtSlotConnect::New();
@@ -446,27 +379,40 @@ void PVGUI_Module::initialize( CAM_Application* app )
       }
     }
   }
+  connect( application(), SIGNAL( appClosed() ), this, SLOT( onStopTrace() ) );
 }
 
+/*!
+ * \brief Slot called when the progress bar starts.
+ */
 void PVGUI_Module::onStartProgress()
 {
-  QApplication::setOverrideCursor(Qt::WaitCursor);
+  // VSR 19/03/2015, issue 0023025
+  // next line is commented: it is bad idea to show wait cursor on ANY vtk event
+  // moreover, it does not work when running pvserver with --multi-client mode
+  //QApplication::setOverrideCursor(Qt::WaitCursor);
 }
 
+/*!
+ * \brief Slot called when the progress bar is done.
+ */
 void PVGUI_Module::onEndProgress()
 {
-  QApplication::restoreOverrideCursor();
+  // VSR 19/03/2015, issue 0023025
+  // next line is commented: it is bad idea to show wait cursor on ANY vtk event
+  // moreover, it does not work when running pvserver with --multi-client mode
+  //QApplication::restoreOverrideCursor();
 }
 
 void PVGUI_Module::onDataRepresentationUpdated() {
-  SalomeApp_Study* activeStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
+  LightApp_Study* activeStudy = dynamic_cast<LightApp_Study*>(application()->activeStudy());
   if(!activeStudy) return;
   
   activeStudy->Modified();
 }
 
 /*!
-  \brief Initialisation timer event - trace start up
+  \brief Initialisation timer event - Starts up the Python trace
 */
 void PVGUI_Module::onInitTimer()
 {
@@ -494,6 +440,9 @@ QStringList PVGUI_Module::getEmbeddedMacrosList()
   return aFullPathSourceFiles;
 }
 
+/*!
+  \brief Update the list of embedded macros
+*/
 void PVGUI_Module::updateMacros()
 {
   pqPythonManager* aPythonManager = pqPVApplicationCore::instance()->pythonManager();
@@ -514,7 +463,9 @@ void PVGUI_Module::updateMacros()
 void PVGUI_Module::windows( QMap<int, int>& m ) const
 {
   m.insert( LightApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea );
+#ifndef DISABLE_PYCONSOLE
   m.insert( LightApp_Application::WT_PyConsole, Qt::BottomDockWidgetArea );
+#endif
   // ParaView diagnostic output redirected here
   m.insert( LightApp_Application::WT_LogWindow, Qt::BottomDockWidgetArea );
 }
@@ -524,7 +475,10 @@ void PVGUI_Module::windows( QMap<int, int>& m ) const
 */
 void PVGUI_Module::showView( bool toShow )
 {
-  SalomeApp_Application* anApp = getApp();
+  // VSR: TODO: all below is not needed, if we use standard approach
+  // that consists in implementing viewManagers() function properly
+  // This should be done after we decide what to do with Log window.
+  LightApp_Application* anApp = getApp();
   PVViewer_ViewManager* viewMgr =
     dynamic_cast<PVViewer_ViewManager*>( anApp->getViewManager( PVViewer_Viewer::Type(), false ) );
   if ( !viewMgr ) {
@@ -540,7 +494,7 @@ void PVGUI_Module::showView( bool toShow )
     // this also connects to the pvserver and instantiates relevant PV behaviors
   }
 
-  pvWnd->setShown( toShow );
+  pvWnd->setVisible( toShow );
   if ( toShow ) pvWnd->setFocus();
 }
 
@@ -552,7 +506,6 @@ void PVGUI_Module::showHelpForProxy( const QString& groupname, const QString& pr
   pqHelpReaction::showProxyHelp(groupname, proxyname);
 }
 
-
 /*!
   \brief Slot to show the waiting state.
 */
@@ -579,25 +532,6 @@ void PVGUI_Module::endWaitCursor()
   QApplication::restoreOverrideCursor();
 }
 
-static void ParavisMessageOutput(QtMsgType type, const char *msg)
-{
-  switch(type)
-    {
-  case QtDebugMsg:
-    vtkOutputWindow::GetInstance()->DisplayText(msg);
-    break;
-  case QtWarningMsg:
-    vtkOutputWindow::GetInstance()->DisplayErrorText(msg);
-    break;
-  case QtCriticalMsg:
-    vtkOutputWindow::GetInstance()->DisplayErrorText(msg);
-    break;
-  case QtFatalMsg:
-    vtkOutputWindow::GetInstance()->DisplayErrorText(msg);
-    break;
-    }
-}
-
 /*!
   \brief Activate module.
   \param study current study
@@ -606,28 +540,26 @@ static void ParavisMessageOutput(QtMsgType type, const char *msg)
 */
 bool PVGUI_Module::activateModule( SUIT_Study* study )
 {
-  myOldMsgHandler = qInstallMsgHandler(ParavisMessageOutput);
-  
   SUIT_ExceptionHandler::addCleanUpRoutine( paravisCleanUp );
 
   storeCommonWindowsState();
 
-  bool isDone = SalomeApp_Module::activateModule( study );
+  bool isDone = LightApp_Module::activateModule( study );
   if ( !isDone ) return false;
 
   showView( true );
   if ( mySourcesMenuId != -1 ) menuMgr()->show(mySourcesMenuId);
   if ( myFiltersMenuId != -1 ) menuMgr()->show(myFiltersMenuId);
   if ( myMacrosMenuId != -1 ) menuMgr()->show(myMacrosMenuId);
-  if ( myToolbarsMenuId != -1 ) menuMgr()->show(myToolbarsMenuId);
+  if ( myCatalystMenuId != -1 ) menuMgr()->show(myCatalystMenuId);
 
   // Update the various menus with the content pre-loaded in myGuiElements
-  QMenu* srcMenu = menuMgr()->findMenu( mySourcesMenuId );
-  myGuiElements->updateSourcesMenu(srcMenu);
-  QMenu* filtMenu = menuMgr()->findMenu( myFiltersMenuId );
-  myGuiElements->updateFiltersMenu(filtMenu);
-  QMenu* macMenu = menuMgr()->findMenu( myMacrosMenuId );
-  myGuiElements->updateMacrosMenu(macMenu);
+//  QMenu* srcMenu = menuMgr()->findMenu( mySourcesMenuId );
+//  myGuiElements->updateSourcesMenu(srcMenu);
+//  QMenu* filtMenu = menuMgr()->findMenu( myFiltersMenuId );
+//  myGuiElements->updateFiltersMenu(filtMenu);
+//  QMenu* macMenu = menuMgr()->findMenu( myMacrosMenuId );
+//  myGuiElements->updateMacrosMenu(macMenu);
 
   setMenuShown( true );
   setToolShown( true );
@@ -653,7 +585,11 @@ bool PVGUI_Module::activateModule( SUIT_Study* study )
 
   if ( myRecentMenuId != -1 ) menuMgr()->show(myRecentMenuId);
 
-  ClientFindOrCreateParavisComponent(PARAVIS::GetCStudy(this));
+  // VSR 18/10/2018 - 0023170: Workaround to re-select current index after module activation
+  QItemSelectionModel* selection_model = myGuiElements->getPipelineBrowserWidget()->getSelectionModel();
+  QModelIndex idx = selection_model->currentIndex();
+  selection_model->clearCurrentIndex();
+  selection_model->setCurrentIndex(idx, QItemSelectionModel::ClearAndSelect);
 
   return isDone;
 }
@@ -695,13 +631,12 @@ bool PVGUI_Module::deactivateModule( SUIT_Study* study )
   /*if (pqImplementation::helpWindow) {
     pqImplementation::helpWindow->hide();
     }*/
-  showView( false );
   // hide menus
   menuMgr()->hide(myRecentMenuId);
   menuMgr()->hide(mySourcesMenuId);
   menuMgr()->hide(myFiltersMenuId);
   menuMgr()->hide(myMacrosMenuId);
-  menuMgr()->hide(myToolbarsMenuId);
+  menuMgr()->hide(myCatalystMenuId);
   setMenuShown( false );
   setToolShown( false );
 
@@ -710,11 +645,11 @@ bool PVGUI_Module::deactivateModule( SUIT_Study* study )
   SUIT_ExceptionHandler::removeCleanUpRoutine( paravisCleanUp );
 
   if (myOldMsgHandler)
-    qInstallMsgHandler(myOldMsgHandler);
+    qInstallMessageHandler(myOldMsgHandler);
 
   restoreCommonWindowsState();
   
-  return SalomeApp_Module::deactivateModule( study );
+  return LightApp_Module::deactivateModule( study );
 }
 
 
@@ -728,29 +663,10 @@ bool PVGUI_Module::deactivateModule( SUIT_Study* study )
 */
 void PVGUI_Module::onApplicationClosed( SUIT_Application* theApp )
 {
-  PVViewer_ViewManager::ParaviewCleanup();
-
-  int aAppsNb = SUIT_Session::session()->applications().size();
-  if (aAppsNb == 1) {
-    deleteTemporaryFiles();
-  }
+  PVViewer_Core::ParaviewCleanup();
   CAM_Module::onApplicationClosed(theApp);
 }
 
-
-/*!
-  \brief Deletes temporary files created during import operation from VISU
-*/
-void PVGUI_Module::deleteTemporaryFiles()
-{
-  foreach(QString aFile, myTemporaryFiles) {
-    if (QFile::exists(aFile)) {
-      QFile::remove(aFile);
-    }
-  }
-}
-
-
 /*!
   \brief Called when study is closed.
 
@@ -760,102 +676,88 @@ void PVGUI_Module::deleteTemporaryFiles()
 */
 void PVGUI_Module::studyClosed(SUIT_Study* study)
 {
+  showView(false); // VSR: this seems to be not needed (all views are automatically closed)
   clearParaviewState();
+  //Re-start trace 
+  onRestartTrace();
 
-  SalomeApp_Module::studyClosed(study);
-}
-
-/*!
-  \brief Called when study is opened.
-*/
-void PVGUI_Module::onModelOpened()
-{
-  _PTR(Study) studyDS = PARAVIS::GetCStudy(this);
-  if(!studyDS) {
-    return;
-  }
-  
-  _PTR(SComponent) paravisComp = 
-    studyDS->FindComponent(GetCPPEngine()->ComponentDataType());
-  if(!paravisComp) {
-    return;
-  }
-
-  _PTR(ChildIterator) anIter(studyDS->NewChildIterator(paravisComp));
-  for (; anIter->More(); anIter->Next()) {
-    _PTR(SObject) aSObj = anIter->Value();
-    _PTR(GenericAttribute) anAttr;
-    if (!aSObj->FindAttribute(anAttr, "AttributeLocalID")) {
-      continue;
-    }
-    _PTR(AttributeLocalID) anID(anAttr);
-    if (anID->Value() == PVSTATEID) {
-      myStateCounter++;
-    }
-  }
-}
-
-/*!
-  \brief Returns IOR of current engine
-*/
-QString PVGUI_Module::engineIOR() const
-{
-  CORBA::String_var anIOR = GetCPPEngine()->GetIOR();
-  return QString(anIOR.in());
+  LightApp_Module::studyClosed(study);
 }
 
 /*!
   \brief Open file of format supported by ParaView
 */
-void PVGUI_Module::openFile(const char* theName)
+void PVGUI_Module::openFile( const char* theName )
 {
   QStringList aFiles;
-  aFiles<<theName;
-  pqLoadDataReaction::loadData(aFiles);
+  aFiles << theName;
+  pqLoadDataReaction::loadData( aFiles );
 }
 
-/**!
- * Start trace invoking the newly introduced C++ API (PV 4.2)
- * (inspired from pqTraceReaction::start())
- */
+/*!
+  \brief Starts Python trace.
+  Start trace invoking the newly introduced C++ API (PV 4.2)
+  (inspired from pqTraceReaction::start())
+*/
 void PVGUI_Module::startTrace()
 {
   vtkSMSessionProxyManager* pxm = pqActiveObjects::instance().activeServer()->proxyManager();
 
   vtkSmartPointer<vtkSMProxy> proxy;
-  proxy.TakeReference(pxm->NewProxy("pythontracing", "PythonTraceOptions"));
-  if (proxy)
-    {
-      vtkNew<vtkSMParaViewPipelineController> controller;
-      controller->InitializeProxy(proxy);
-    }
+  proxy.TakeReference( pxm->NewProxy( "pythontracing", "PythonTraceOptions" ) );
+  if ( proxy ) {
+    vtkNew<vtkSMParaViewPipelineController> controller;
+    controller->InitializeProxy( proxy );
+  }
   vtkSMTrace* trace = vtkSMTrace::StartTrace();
-  if (proxy)
-    {
-      // Set manually the properties entered via the dialog box poping-up when requiring
-      // a trace start in PV4.2 (trace options)
-      trace->SetPropertiesToTraceOnCreate(vtkSMTrace::RECORD_USER_MODIFIED_PROPERTIES);
-      trace->SetFullyTraceSupplementalProxies(false);
-    }
+  if ( proxy ) {
+    // Set manually the properties entered via the dialog box poping-up when requiring
+    // a trace start in PV4.2 (trace options)
+    SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
+    int type = aResourceMgr->integerValue( PARAVIS_MODULE_NAME, "tracestate_type", 2 );
+    trace->SetPropertiesToTraceOnCreate( type );
+    trace->SetFullyTraceSupplementalProxies( false );
+  }
 }
 
+/*!
+  \brief Stops Python trace.
+*/
 void PVGUI_Module::stopTrace()
 {
   vtkSMTrace::StopTrace();
 }
 
-void PVGUI_Module::executeScript(const char *script)
+/*!
+  \brief Execute a Python script.
+*/
+void PVGUI_Module::executeScript( const char* script )
 {
+  // ???
+  // Not sure this is the right fix, but the PYTHON_MANAGER has a function named
+  // executeScript() which seems to do what the runScript on pyShellDialog() class
+  // was doing.
+#ifndef WNT
+  pqPythonManager* manager =
+    qobject_cast<pqPythonManager*>(pqApplicationCore::instance()->manager("PYTHON_MANAGER"));
+
+  if ( manager )  {
+    manager->executeScript(script);
+  }
+#endif
+  /*
 #ifndef WNT
   pqPythonManager* manager = qobject_cast<pqPythonManager*>(
-                             pqApplicationCore::instance()->manager("PYTHON_MANAGER"));
-  if (manager)  {
+                             pqApplicationCore::instance()->manager( "PYTHON_MANAGER" ) );
+  if ( manager )  {
     pqPythonDialog* pyDiag = manager->pythonShellDialog();
-    if (pyDiag) {
+    if ( pyDiag ) {
       pyDiag->runString(script);  
-      }
     }
+  }
 #endif
+  */
 }
 
 ///**
@@ -873,7 +775,7 @@ void PVGUI_Module::executeScript(const char *script)
 //      PyObject * elem = PyList_GetItem(lst, i);
 //      if (PyString_Check(elem))
 //        {
-//          std::cout << "At pos:" << i << ", " << PyString_AsString(elem) << std::endl;
+//          std::cout << "At pos:" << i << ", " << Py_EncodeLocale(PyUnicode_AS_UNICODE(elem), NULL) << std::endl;
 //        }
 //      else
 //        std::cout << "At pos:" << i << ", not a string!" << std::endl;
@@ -884,44 +786,68 @@ void PVGUI_Module::executeScript(const char *script)
 /*!
   \brief Returns trace string
 */
-static const QString MYReplaceStr("paraview.simple");
 QString PVGUI_Module::getTraceString()
 {
-  vtkSMTrace *tracer = vtkSMTrace::GetActiveTracer();
-  if (!tracer) // trace is not started
-    return QString("");
-
-  QString traceString(tracer->GetCurrentTrace());
-  std::stringstream nl; nl << std::endl; // surely there is some Qt trick to do that in a portable way??
-  QString end_line(nl.str().c_str());
-  // 'import pvsimple' is necessary to fix the first call to DisableFirstRenderCamera in the paraview trace
-  // 'ShowParaviewView()' ensure there is an opened viewing window (otherwise SEGFAULT!)
-  traceString = "import pvsimple" + end_line +
-                "pvsimple.ShowParaviewView()" + end_line + traceString;
-
-  // Replace import "paraview.simple" by "pvsimple"
-  if ((!traceString.isNull()) && traceString.length() != 0) {
-    int aPos = traceString.indexOf(MYReplaceStr);
-    while (aPos != -1) {
-      traceString = traceString.replace(aPos, MYReplaceStr.length(), "pvsimple");
-      aPos = traceString.indexOf(MYReplaceStr, aPos);
+  QString traceString = "";
+
+  static const QString replaceStr( "paraview.simple" );
+  std::stringstream nl;
+  nl << std::endl; // surely there is some Qt trick to do that in a portable way??
+  QString end_line( nl.str().c_str() );
+
+  vtkSMTrace* tracer = vtkSMTrace::GetActiveTracer();
+  if ( tracer ) {
+    traceString = tracer->GetCurrentTrace();
+    // 'import pvsimple' is necessary to fix the first call to DisableFirstRenderCamera in the paraview trace
+    // 'ShowParaviewView()' ensure there is an opened viewing window (otherwise SEGFAULT!)
+    traceString = "import pvsimple" + end_line +
+      "pvsimple.ShowParaviewView()" + end_line + traceString;
+
+    // Replace import "paraview.simple" by "pvsimple"
+    if ( !traceString.isEmpty() ) {
+      int aPos = traceString.indexOf( replaceStr );
+      while ( aPos != -1 ) {
+        traceString = traceString.replace( aPos, replaceStr.length(), "pvsimple" );
+        aPos = traceString.indexOf( replaceStr, aPos );
+      }
     }
   }
 
+  // Save camera position to, which is no longer output by the tracer ...
+  {
+    vtkPythonScopeGilEnsurer psge;
+    PyObject * mods(PySys_GetObject(const_cast<char*>("modules")));
+    PyObject * trace_mod(PyDict_GetItemString(mods, "paraview.smtrace"));  // module was already (really) imported by vtkSMTrace
+    if (trace_mod && trace_mod != Py_None && PyModule_Check(trace_mod)) {
+        vtkSmartPyObject save_cam(PyObject_GetAttrString(trace_mod, const_cast<char*>("SaveCameras")));
+        vtkSmartPyObject camera_trace(PyObject_CallMethod(save_cam, const_cast<char*>("get_trace"), NULL));
+        // Convert to a single string
+        vtkSmartPyObject ret(PyUnicode_FromUnicode(Py_DecodeLocale(end_line.toStdString().c_str(), NULL), end_line.size()));
+        vtkSmartPyObject final_string(PyObject_CallMethod(ret, const_cast<char*>("join"),
+            const_cast<char*>("O"), (PyObject*)camera_trace));
+        if (PyUnicode_CheckExact(final_string))
+          {
+            QString camera_qs(Py_EncodeLocale(PyUnicode_AS_UNICODE(final_string.GetPointer()), NULL));  // deep copy
+            traceString = traceString + end_line  + end_line + QString("#### saving camera placements for all active views")
+                + end_line + end_line + camera_qs + end_line;
+          }
+      }
+  } 
+
   return traceString;
 }
 
 /*!
   \brief Saves trace string to disk file
 */
-void PVGUI_Module::saveTrace(const char* theName)
+void PVGUI_Module::saveTrace( const char* theName )
 {
-  QFile file(theName);
-  if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
+  QFile file( theName );
+  if ( !file.open( QIODevice::WriteOnly | QIODevice::Text ) ) {
     MESSAGE( "Could not open file:" << theName );
     return;
   }
-  QTextStream out(&file);
+  QTextStream out( &file );
   out << getTraceString();
   file.close();
 }
@@ -929,9 +855,9 @@ void PVGUI_Module::saveTrace(const char* theName)
 /*!
   \brief Saves ParaView state to a disk file
 */
-void PVGUI_Module::saveParaviewState(const char* theFileName)
+void PVGUI_Module::saveParaviewState( const QString& theFileName )
 {
-  pqApplicationCore::instance()->saveState(theFileName);
+  pqApplicationCore::instance()->saveState( theFileName.toStdString().c_str() );
 }
 
 /*!
@@ -939,20 +865,18 @@ void PVGUI_Module::saveParaviewState(const char* theFileName)
 */
 void PVGUI_Module::clearParaviewState()
 {
-  QAction* deleteAllAction = action(DeleteAllId);
-  if (deleteAllAction) {
-    deleteAllAction->activate(QAction::Trigger);
+  QAction* deleteAllAction = action( DeleteAllId );
+  if ( deleteAllAction ) {
+    deleteAllAction->activate( QAction::Trigger );
   }
 }
 
 /*!
   \brief Restores ParaView state from a disk file
-
-  If toClear == true, the current ojects will be deleted
 */
-void PVGUI_Module::loadParaviewState(const char* theFileName)
+void PVGUI_Module::loadParaviewState( const QString& theFileName )
 {
-  pqApplicationCore::instance()->loadState(theFileName, getActiveServer());
+  pqApplicationCore::instance()->loadState( theFileName.toStdString().c_str(), getActiveServer() );
 }
 
 /*!
@@ -965,102 +889,56 @@ pqServer* PVGUI_Module::getActiveServer()
 
 
 /*!
-  \brief Creates PARAVIS preference pane 
+  \brief Creates PARAVIS preferences panel.
 */
 void PVGUI_Module::createPreferences()
 {
-  // Paraview settings tab
-  int aParaViewSettingsTab = addPreference( tr( "TIT_PVIEWSETTINGS" ) );
-  int aPanel = addPreference(QString(), aParaViewSettingsTab, LightApp_Preferences::UserDefined, "PARAVIS", "");
-  setPreferenceProperty(aPanel, "content", (qint64)(new PVGUI_ParaViewSettingsPane()));
-
-  // Paravis settings tab
-  int aParaVisSettingsTab = addPreference( tr( "TIT_PVISSETTINGS" ) );
-  addPreference( tr( "PREF_STOP_TRACE" ), aParaVisSettingsTab, LightApp_Preferences::Bool, "PARAVIS", "stop_trace");
-
-  addPreference( tr( "PREF_NO_EXT_PVSERVER" ), aParaVisSettingsTab, LightApp_Preferences::Bool, "PARAVIS", "no_ext_pv_server");
-
-  int aSaveType = addPreference(tr( "PREF_SAVE_TYPE_LBL" ), aParaVisSettingsTab,
-                                LightApp_Preferences::Selector,
-                                "PARAVIS", "savestate_type");
   QList<QVariant> aIndices;
   QStringList aStrings;
-  aIndices<<0<<1<<2;
-  aStrings<<tr("PREF_SAVE_TYPE_0");
-  aStrings<<tr("PREF_SAVE_TYPE_1");
-  aStrings<<tr("PREF_SAVE_TYPE_2");
-  setPreferenceProperty(aSaveType, "strings", aStrings);
-  setPreferenceProperty(aSaveType, "indexes", aIndices);
-}
 
-/*!
-  \brief Creates ParaViS context menu popup
-*/
-void PVGUI_Module::contextMenuPopup(const QString& theClient, QMenu* theMenu, QString& theTitle)
-{
-  SalomeApp_Module::contextMenuPopup(theClient, theMenu, theTitle);
-  
-  // Check if we are in Object Browser
-  SUIT_DataBrowser* ob = getApp()->objectBrowser();
-  bool isOBClient = (ob && theClient == ob->popupClientType());
-  if (!isOBClient) {
-    return;
-  }
+  // Paraview settings tab
+  int aParaViewSettingsTab = addPreference( tr( "TIT_PVIEWSETTINGS" ) );
 
-  // Get list of selected objects
-  LightApp_SelectionMgr* aSelectionMgr = getApp()->selectionMgr();
-  SALOME_ListIO aListIO;
-  aSelectionMgr->selectedObjects(aListIO);
-  if (aListIO.Extent() == 1 && aListIO.First()->hasEntry()) {
-    QString entry = QString(aListIO.First()->getEntry());
-    
-    // Get active study
-    SalomeApp_Study* activeStudy = 
-      dynamic_cast<SalomeApp_Study*>(getApp()->activeStudy());
-    if(!activeStudy) {
-      return;
-    }
+  setPreferenceProperty(aParaViewSettingsTab, "stretch", false );
+  int aPanel = addPreference( QString(), aParaViewSettingsTab,
+                              LightApp_Preferences::UserDefined, PARAVIS_MODULE_NAME, "" );
 
-    // Get SALOMEDS client study 
-    _PTR(Study) studyDS = activeStudy->studyDS();
-    if(!studyDS) {
-      return;
-    }
+  setPreferenceProperty( aPanel, "content", (qint64)( new PVGUI_ParaViewSettingsPane( 0, getApp() ) ) );
 
-    QString paravisDataType(GetCPPEngine()->ComponentDataType());
-    if(activeStudy && activeStudy->isComponent(entry) && 
-       activeStudy->componentDataType(entry) == paravisDataType) {
-      // ParaViS module object
-      theMenu->addSeparator();
-      theMenu->addAction(action(SaveStatePopupId));
-    }
-    else {
-      // Try to get state object
-      _PTR(SObject) stateSObj = 
-          studyDS->FindObjectID(entry.toLatin1().constData());
-      if (!stateSObj) {
-          return;
-      }
-      
-      // Check local id
-      _PTR(GenericAttribute) anAttr;
-      if (!stateSObj->FindAttribute(anAttr, "AttributeLocalID")) {
-          return;
-      }
+  // Paravis settings tab
+  int aParaVisSettingsTab = addPreference( tr( "TIT_PVISSETTINGS" ) );
 
-      _PTR(AttributeLocalID) anID(anAttr);
-      
-      if (anID->Value() == PVSTATEID) {
-        // Paraview state object
-        theMenu->addSeparator();
-        theMenu->addAction(action(AddStatePopupId));
-        theMenu->addAction(action(CleanAndAddStatePopupId));
-        theMenu->addSeparator();
-        theMenu->addAction(action(ParaVisRenameId));
-        theMenu->addAction(action(ParaVisDeleteId));
-      }
-    }
-  }
+  addPreference( tr( "PREF_NO_EXT_PVSERVER" ), aParaVisSettingsTab, 
+                 LightApp_Preferences::Bool, PARAVIS_MODULE_NAME, "no_ext_pv_server" );
+
+  int aSaveType = addPreference( tr( "PREF_SAVE_TYPE_LBL" ), aParaVisSettingsTab,
+                                 LightApp_Preferences::Selector,
+                                 PARAVIS_MODULE_NAME, "savestate_type" );
+
+  aStrings.clear();
+  aIndices.clear();
+  aIndices << 0 << 1 << 2;
+  aStrings << tr("PREF_SAVE_TYPE_0") << tr("PREF_SAVE_TYPE_1") << tr("PREF_SAVE_TYPE_2");
+  setPreferenceProperty( aSaveType, "strings", aStrings );
+  setPreferenceProperty( aSaveType, "indexes", aIndices );
+
+  // ... "Language" group <<start>>
+  int traceGroup = addPreference( tr( "PREF_GROUP_TRACE" ), aParaVisSettingsTab );
+
+  int stopTrace = addPreference( tr( "PREF_STOP_TRACE" ), traceGroup, 
+                                 LightApp_Preferences::Bool, PARAVIS_MODULE_NAME, "stop_trace" );
+  setPreferenceProperty( stopTrace, "restart",  true );
+
+  int aTraceType = addPreference( tr( "PREF_TRACE_TYPE_LBL" ), traceGroup,
+                                 LightApp_Preferences::Selector,
+                                 PARAVIS_MODULE_NAME, "tracestate_type" );
+  aStrings.clear();
+  aIndices.clear();
+  aIndices << 0 << 1 << 2;
+  aStrings << tr("PREF_TRACE_TYPE_0") << tr("PREF_TRACE_TYPE_1") << tr("PREF_TRACE_TYPE_2");
+  setPreferenceProperty( aTraceType, "strings", aStrings );
+  setPreferenceProperty( aTraceType, "indexes", aIndices );
+  setPreferenceProperty( aTraceType, "restart",  true );
 }
 
 /*!
@@ -1088,262 +966,51 @@ void PVGUI_Module::onRestartTrace()
 }
 
 /*!
-  \brief Save state under the module root object.
+  \brief. Close ParaView python trace.
 */
-void PVGUI_Module::onSaveMultiState()
+void PVGUI_Module::onStopTrace()
 {
-  // Create state study object
-  
-  // Get SALOMEDS client study
-  _PTR(Study) studyDS = PARAVIS::GetCStudy(this);
-  if(!studyDS) {
-    return;
-  }
-  
-  _PTR(SComponent) paravisComp = 
-    studyDS->FindComponent(GetCPPEngine()->ComponentDataType());
-  if(!paravisComp) {
-    return;
-  }
-
-  // Unlock the study if it is locked
-  bool isLocked = studyDS->GetProperties()->IsLocked();
-  if (isLocked) {
-    studyDS->GetProperties()->SetLocked(false);
-  }
-  
-  QString stateName = tr("SAVED_PARAVIEW_STATE_NAME") + 
-    QString::number(myStateCounter + 1);
-
-  _PTR(StudyBuilder) studyBuilder = studyDS->NewBuilder();
-  _PTR(SObject) newSObj = studyBuilder->NewObject(paravisComp);
-
-  // Set name
-  _PTR(GenericAttribute) anAttr;
-  anAttr = studyBuilder->FindOrCreateAttribute(newSObj, "AttributeName");
-  _PTR(AttributeName) nameAttr(anAttr);
-  
-  nameAttr->SetValue(stateName.toLatin1().constData());
-
-  // Set local id
-  anAttr = studyBuilder->FindOrCreateAttribute(newSObj, "AttributeLocalID");
-  _PTR(AttributeLocalID) localIdAttr(anAttr);
-  
-  localIdAttr->SetValue(PVSTATEID);
-
-  // Set file name
-  QString stateEntry = QString::fromStdString(newSObj->GetID());
-  // File name for state saving
-  QString tmpDir = QString::fromStdString(SALOMEDS_Tool::GetTmpDir());
-  QString fileName = QString("%1_paravisstate:%2").arg(tmpDir, stateEntry);
-
-  anAttr = studyBuilder->FindOrCreateAttribute(newSObj, "AttributeString");
-  _PTR(AttributeString) stringAttr(anAttr);
-  
-  stringAttr->SetValue(fileName.toLatin1().constData());
-
-  // Lock the study back if necessary
-  if (isLocked) {
-    studyDS->GetProperties()->SetLocked(true);
-  }
-  
-  // Save state
-  saveParaviewState(fileName.toLatin1().constData());
-  myTemporaryFiles.append(fileName);
-  
-  // Increment the counter
-  myStateCounter++;
-
-  updateObjBrowser();
-}
-
-/*!
-  \brief Restore the selected state by merging with the current one.
-*/
-void PVGUI_Module::onAddState()
-{
-  loadSelectedState(false);
-}
-
-/*!
-  \brief Clean the current state and restore the selected one.
-*/
-void PVGUI_Module::onCleanAddState()
-{
-  loadSelectedState(true);
+  stopTrace();
 }
-
 /*!
-  \brief Rename the selected object.
+  \brief Called when view manager is added
 */
-void PVGUI_Module::onRename()
+void PVGUI_Module::onViewManagerAdded( SUIT_ViewManager* vm )
 {
-  LightApp_SelectionMgr* aSelectionMgr = getApp()->selectionMgr();
-  SALOME_ListIO aListIO;
-  aSelectionMgr->selectedObjects(aListIO);
-  
-  if (aListIO.Extent() == 1 && aListIO.First()->hasEntry()) {
-    std::string entry = aListIO.First()->getEntry();
-    
-    // Get SALOMEDS client study 
-    _PTR(Study) studyDS = PARAVIS::GetCStudy(this);
-    if(!studyDS) {
-      return;
-    }
-    
-    // Unlock the study if it is locked
-    bool isLocked = studyDS->GetProperties()->IsLocked();
-    if (isLocked) {
-      studyDS->GetProperties()->SetLocked(false);
-    }
-    
-    // Rename the selected state object
-    _PTR(SObject) stateSObj = studyDS->FindObjectID(entry);
-    if (!stateSObj) {
-      return;
-    }
-    
-    _PTR(GenericAttribute) anAttr;
-    if (stateSObj->FindAttribute(anAttr, "AttributeName")) {
-      _PTR(AttributeName) nameAttr (anAttr);
-      QString newName = 
-          LightApp_NameDlg::getName(getApp()->desktop(), nameAttr->Value().c_str());
-      if (!newName.isEmpty()) {
-        nameAttr->SetValue(newName.toLatin1().constData());
-        aListIO.First()->setName(newName.toLatin1().constData());
-      }
-    }
-    
-    // Lock the study back if necessary
-    if (isLocked) {
-      studyDS->GetProperties()->SetLocked(true);
-    }
-    
-    // Update object browser
-    updateObjBrowser();
-    
+  if ( PVViewer_ViewManager* pvvm = dynamic_cast<PVViewer_ViewManager*>( vm ) ) {
+    connect( pvvm, SIGNAL( viewCreated( SUIT_ViewWindow* ) ), 
+             this, SLOT( onPVViewCreated( SUIT_ViewWindow* ) ) );
+    connect( pvvm, SIGNAL( deleteView( SUIT_ViewWindow* ) ),
+             this,  SLOT( onPVViewDelete( SUIT_ViewWindow* ) ) );
   }
 }
 
 /*!
-  \brief Delete the selected objects.
+  \brief Called when view manager is removed
 */
-void PVGUI_Module::onDelete()
-{
-  LightApp_SelectionMgr* aSelectionMgr = getApp()->selectionMgr();
-  SALOME_ListIO aListIO;
-  aSelectionMgr->selectedObjects(aListIO);
-  
-  if (aListIO.Extent() == 1 && aListIO.First()->hasEntry()) {
-    std::string entry = aListIO.First()->getEntry();
-    
-    // Get SALOMEDS client study 
-    _PTR(Study) studyDS = PARAVIS::GetCStudy(this);
-    if(!studyDS) {
-      return;
-    }
-    
-    // Unlock the study if it is locked
-    bool isLocked = studyDS->GetProperties()->IsLocked();
-    if (isLocked) {
-      studyDS->GetProperties()->SetLocked(false);
-    }
-    
-    // Remove the selected state from the study
-    _PTR(StudyBuilder) studyBuilder = studyDS->NewBuilder();
-    _PTR(SObject) stateSObj = studyDS->FindObjectID(entry);
-    studyBuilder->RemoveObject(stateSObj);
-    
-    // Lock the study back if necessary
-    if (isLocked) {
-      studyDS->GetProperties()->SetLocked(true);
-    }
-    
-    // Update object browser
-    updateObjBrowser();
-  }
-}
-
-void PVGUI_Module::onPushTraceTimer()
+void PVGUI_Module::onViewManagerRemoved( SUIT_ViewManager* vm )
 {
-//  MESSAGE("onPushTraceTimer(): Pushing trace to engine...");
-  GetCPPEngine()->PutPythonTraceStringToEngine(getTraceString().toStdString().c_str());
+  if ( PVViewer_ViewManager* pvvm = dynamic_cast<PVViewer_ViewManager*>( vm ) )
+    disconnect( pvvm, SIGNAL( viewCreated( SUIT_ViewWindow* ) ),
+                this, SLOT( onPVViewCreated( SUIT_ViewWindow* ) ) );
 }
 
 /*!
-  \brief Discover help project files from the resources.
-  \return name of the help file. 
+  \brief Show toolbars at \a vw PV view window creating when PARAVIS is active.
 */
-QString PVGUI_Module::getHelpFileName() {
-  QString aPVHome(getenv("PVHOME"));
-  if (aPVHome.isNull()) {
-    qWarning("Wariable PVHOME is not defined");
-    return QString();
-  }
-  QChar aSep = QDir::separator();
-  //PARAVIEW_VERSION from the vtkPVConfig.h file
-  QString aFileName =  aPVHome + aSep + "share" + aSep + "doc" + aSep + "paraview-"+ PARAVIEW_VERSION + aSep + "paraview.qch";
-  return aFileName;
+void PVGUI_Module::onPVViewCreated( SUIT_ViewWindow* vw )
+{
+  myGuiElements->setToolBarVisible( true );
+  restoreDockWidgetsState();
 }
 
-
 /*!
-  \brief Load selected paraview state
-
-  If toClear == true, the current state will be cleared
+  \brief Save toolbars state at \a view view closing.
 */
-void PVGUI_Module::loadSelectedState(bool toClear)
+void PVGUI_Module::onPVViewDelete( SUIT_ViewWindow* view )
 {
-  QString fileName;
-
-  LightApp_SelectionMgr* aSelectionMgr = getApp()->selectionMgr();
-  SALOME_ListIO aListIO;
-  aSelectionMgr->selectedObjects(aListIO);
-  
-  if (aListIO.Extent() == 1 && aListIO.First()->hasEntry()) {
-    std::string entry = aListIO.First()->getEntry();
-    
-    // Get SALOMEDS client study 
-    _PTR(Study) studyDS = PARAVIS::GetCStudy(this);
-    if(!studyDS) {
-      return;
-    }
-
-    // Check local id
-    _PTR(SObject) stateSObj = studyDS->FindObjectID(entry);
-    _PTR(GenericAttribute) anAttr;
-    if (!stateSObj->FindAttribute(anAttr, "AttributeLocalID")) {
-      return;
-    }
-    _PTR(AttributeLocalID) anID(anAttr);
-    if (!anID->Value() == PVSTATEID) {
-      return;
-    }
-
-    // Get state file name
-    if (stateSObj->FindAttribute(anAttr, "AttributeString")) {
-      _PTR(AttributeString) aStringAttr(anAttr);
-      QString stringValue(aStringAttr->Value().c_str());
-
-      if (QFile::exists(stringValue)) {
-          fileName = stringValue;
-      }
-    }
-  }
-  
-  if (!fileName.isEmpty()) {
-    if (toClear) {
-      clearParaviewState();
-    }
-
-    loadParaviewState(fileName.toLatin1().constData());
-  } 
-  else {
-    SUIT_MessageBox::critical(getApp()->desktop(),
-                              tr("ERR_ERROR"),
-                              tr("ERR_STATE_CANNOT_BE_RESTORED"));
-  }
+  if ( dynamic_cast<PVViewer_ViewWindow*>( view ) )
+    saveDockWidgetsState( false );
 }
 
 /*!