Salome HOME
INTPAL 52641: PARAVIS deactivation hides PV viewer.
[modules/paravis.git] / src / PVGUI / PVGUI_Module.cxx
index 70b4b50ff88ab98d5be3ef847c91067e57976f1b..39c8b2435203ecb39495b2a29dbb1fb952a2f9d7 100644 (file)
@@ -1,11 +1,11 @@
 // PARAVIS : ParaView wrapper SALOME module
 //
-// Copyright (C) 2010-2013  CEA/DEN, EDF R&D
+// Copyright (C) 2010-2015  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
 // 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
@@ -19,7 +19,8 @@
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 // File   : PVGUI_Module.cxx
-// Author : Julia DOROVSKIKH
+
+#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
 #include <vtkPython.h> // Python first
 #include "PVGUI_Module.h"
 
-#include "SALOMEconfig.h"
-#ifdef WITH_VISU
-#include CORBA_CLIENT_HEADER(VISU_Gen)
-#endif
+#include CORBA_SERVER_HEADER(SALOME_ModuleCatalog)
 #include CORBA_SERVER_HEADER(SALOMEDS)
 
-
-#include "PARAVIS_Gen_i.hh"
-
-#include "PV_Tools.h"
-
-#include "PVGUI_ViewModel.h"
-#include "PVGUI_ViewManager.h"
-#include "PVGUI_ViewWindow.h"
+#include "PVViewer_ViewManager.h"
+#include "PVViewer_ViewWindow.h"
+#include "PVViewer_ViewModel.h"
 #include "PVGUI_Tools.h"
 #include "PVGUI_ParaViewSettingsPane.h"
-#include "PVGUI_OutputWindowAdapter.h"
+#include "PVViewer_GUIElements.h"
+#include "PVViewer_EngineWrapper.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>
 
-// SALOME Includes
-#include "SALOME_LifeCycleCORBA.hxx"
-#include "SALOMEDS_SObject.hxx"
-
-#include "LightApp_SelectionMgr.h"
-#include "LightApp_NameDlg.h"
+#include <SALOME_LifeCycleCORBA.hxx>
+#include <SALOMEDS_SObject.hxx>
 
-#include <SalomeApp_Application.h>
+#include <LightApp_SelectionMgr.h>
+#include <LightApp_NameDlg.h>
+#include <LightApp_Application.h>
+#include <SalomeApp_Application.h>  // should ultimately be a LightApp only
 #include <SalomeApp_Study.h>
 #include <SALOME_ListIO.hxx>
 #include <SALOMEDS_Tool.hxx>
-#include <PyInterp_Dispatcher.h>
+#include <Utils_ORB_INIT.hxx>
+#include <Utils_SINGLETON.hxx>
 
 #include <QtxActionMenuMgr.h>
 #include <QtxActionToolMgr.h>
 
+#include <PARAVIS_version.h>
+
+// External includes
+#include <sstream>
+
 #include <QAction>
 #include <QApplication>
 #include <QCursor>
 #include <QDockWidget>
 #include <QHelpEngine>
 
+// Paraview includes
+#include <vtkPVConfig.h>  // for symbol PARAVIEW_VERSION
+#include <vtkProcessModule.h>
+#include <vtkPVSession.h>
+#include <vtkPVProgressHandler.h>
+#include <vtkOutputWindow.h>
+#include <vtkEventQtSlotConnect.h>
+#include <vtkNew.h>
+#include <vtkSMProxy.h>
+#include <vtkSmartPointer.h>
+#include <vtkSMSession.h>
+#include <vtkSMTrace.h>
+#include <vtkSMSessionProxyManager.h>
+#include <vtkSMParaViewPipelineController.h>
+
 #include <pqApplicationCore.h>
 #include <pqPVApplicationCore.h>
-#include <pqActiveView.h>
 #include <pqObjectBuilder.h>
 #include <pqOptions.h>
-#include <pqRenderView.h>
+#include <pqSettings.h>
 #include <pqServer.h>
 #include <pqUndoStack.h>
-#include <pqVCRController.h>
 #include <pqTabbedMultiViewWidget.h>
-#include <pqPipelineSource.h>
 #include <pqActiveObjects.h>
-#include <vtkProcessModule.h>
-#include <vtkSMSession.h>
-#include <vtkPVSession.h>
-#include <vtkPVProgressHandler.h>
-#include <pqParaViewBehaviors.h>
 #include <pqHelpReaction.h>
-#include <vtkOutputWindow.h>
 #include <pqPluginManager.h>
-//#include <vtkPVPluginInformation.h>
-#include "pqInterfaceTracker.h"
-#include <pqSettings.h>
 #include <pqPythonDialog.h>
 #include <pqPythonManager.h>
-#include <pqPythonShell.h>
-//#include <pqBrandPluginsLoader.h>
 #include <pqLoadDataReaction.h>
-#include <vtkEventQtSlotConnect.h>
 #include <pqPythonScriptEditor.h>
-#include <pqStandardSummaryPanelImplementation.h>
-#include <pqCollaborationBehavior.h>
 #include <pqDataRepresentation.h>
-#include <pqPipelineRepresentation.h>
-#include <pqLookupTableManager.h>
 #include <pqDisplayColorWidget.h>
 #include <pqColorToolbar.h>
 #include <pqScalarBarVisibilityReaction.h>
-#include <pqStandardPropertyWidgetInterface.h>
-#include <pqMultiServerBehavior.h>
-#include <pqViewStreamingBehavior.h>
-
-#include <PARAVIS_version.h>
-
-#include <vtkPVConfig.h>
-
-#include <PVGUI_MatplotlibMathTextUtilities.h>
-
-#include CORBA_SERVER_HEADER(SALOME_ModuleCatalog)
-
-/*
- * Make sure all the kits register their classes with vtkInstantiator.
- * Since ParaView uses Tcl wrapping, all of VTK is already compiled in
- * anyway.  The instantiators will add no more code for the linker to
- * collect.
- */
-
-//#include <vtkCommonInstantiator.h>
-//#include <vtkFilteringInstantiator.h>
-//#include <vtkGenericFilteringInstantiator.h>
-//#include <vtkIOInstantiator.h>
-//#include <vtkImagingInstantiator.h>
-//#include <vtkInfovisInstantiator.h>
-//#include <vtkGraphicsInstantiator.h>
-
-//#include <vtkRenderingInstantiator.h>
-//#include <vtkVolumeRenderingInstantiator.h>
-//#include <vtkHybridInstantiator.h>
-//#include <vtkParallelInstantiator.h>
-
-#include <pqAlwaysConnectedBehavior.h>
-#include <pqApplicationCore.h>
-#include <pqAutoLoadPluginXMLBehavior.h>
-#include <pqCommandLineOptionsBehavior.h>
-#include <pqCrashRecoveryBehavior.h>
-#include <pqDataTimeStepBehavior.h>
-#include <pqDefaultViewBehavior.h>
-#include <pqDeleteBehavior.h>
-#include <pqObjectPickingBehavior.h>
-#include <pqPersistentMainWindowStateBehavior.h>
-#include <pqPipelineContextMenuBehavior.h>
-#include <pqPluginActionGroupBehavior.h>
-#include <pqPluginDockWidgetsBehavior.h>
+#include <pqServerResource.h>
+#include <pqServerConnectReaction.h>
 #include <pqPluginManager.h>
-#include <pqPVNewSourceBehavior.h>
-#include <pqSpreadSheetVisibilityBehavior.h>
-#include <pqStandardViewModules.h>
-#include <pqUndoRedoBehavior.h>
-#include <pqViewFrameActionsBehavior.h>
-#include <pqServerManagerObserver.h>
-
-#include <vtkClientServerInterpreterInitializer.h>
-
+#include <pqVCRToolbar.h>
+#include <pqAnimationScene.h>
+#include <pqServerManagerModel.h>
+#include <pqAnimationTimeToolbar.h>
 
 //----------------------------------------------------------------------------
-pqPVApplicationCore* PVGUI_Module::MyCoreApp = 0;
-//PVGUI_OutputWindowAdapter* PVGUI_Module::pqImplementation::OutputWindowAdapter = 0;
-//QPointer<pqHelpWindow> PVGUI_Module::pqImplementation::helpWindow = 0;
-
 PVGUI_Module* ParavisModule = 0;
+PVSERVER_ORB::PVSERVER_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)
 */
 
 /*!
@@ -257,68 +154,50 @@ PVGUI_Module* ParavisModule = 0;
          SALOME module wrapping ParaView GUI.
 */
 
+_PTR(SComponent)
+ClientFindOrCreateParavisComponent(_PTR(Study) theStudyDocument)
+{
+  _PTR(SComponent) aSComponent = theStudyDocument->FindComponent("PVSERVER");
+  if (!aSComponent) {
+    _PTR(StudyBuilder) aStudyBuilder = theStudyDocument->NewBuilder();
+    aStudyBuilder->NewCommand();
+    int aLocked = theStudyDocument->GetProperties()->IsLocked();
+    if (aLocked) theStudyDocument->GetProperties()->SetLocked(false);
+    aSComponent = aStudyBuilder->NewComponent("PVSERVER");
+    _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( "PVSERVER" );
+    if (!Comp->_is_nil()) {
+      aName->SetValue(Comp->componentusername());
+    }
 
-/*
-  Fix for the issue 21730: [CEA 596] Slice of polyhedron in PARAVIS returns no cell.
-  Wrap vtkEDFCutter filter.
-*/
-
-extern "C" void vtkEDFCutterCS_Initialize(vtkClientServerInterpreter*);
-static void vtkEDFHelperInit();
-
-void vtkEDFHelperInit(vtkClientServerInterpreter* interp){
-    vtkEDFCutterCS_Initialize(interp);
-}
-
-void vtkEDFHelperInit() {
-    vtkClientServerInterpreterInitializer::GetInitializer()->
-        RegisterCallback(&vtkEDFHelperInit);
-}
-
-
-  _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);
-
-      CORBA::ORB_var anORB = PARAVIS::PARAVIS_Gen_i::GetORB();
-      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");
-
+    anAttr = aStudyBuilder->FindOrCreateAttribute(aSComponent, "AttributePixMap");
+    _PTR(AttributePixMap) aPixmap (anAttr);
+    aPixmap->SetPixMap( "pqAppIcon16.png" );
 
-      PARAVIS::PARAVIS_Gen_var aPARAVIS = PARAVIS::PARAVIS_Gen_i::GetParavisGenImpl()->_this();
+    // Create Attribute parameters for future using
+    anAttr = aStudyBuilder->FindOrCreateAttribute(aSComponent, "AttributeParameter");
 
-      aStudyBuilder->DefineComponentInstance(aSComponent, aPARAVIS->GetIOR());
-      if (aLocked) theStudyDocument->GetProperties()->SetLocked(true);
-      aStudyBuilder->CommitCommand();
-    }
-    return aSComponent;
+    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()
@@ -333,8 +212,7 @@ void paravisCleanUp()
   \brief Constructor. Sets the default name for the module.
 */
 PVGUI_Module::PVGUI_Module()
-  : SalomeApp_Module( "PARAVIS" ),
-    //    Implementation( 0 ),
+    : SalomeApp_Module( PARAVIS_MODULE_NAME ),
     mySelectionControlsTb( -1 ),
     mySourcesMenuId( -1 ),
     myFiltersMenuId( -1 ),
@@ -343,22 +221,28 @@ PVGUI_Module::PVGUI_Module()
     myRecentMenuId(-1),
     myOldMsgHandler(0),
     myTraceWindow(0),
-    myStateCounter(0)
+    myStateCounter(0),
+    myInitTimer(0),
+    myPushTraceTimer(0),
+    myGuiElements(0)
 {
 #ifdef HAS_PV_DOC
   Q_INIT_RESOURCE( PVGUI );
 #endif
   ParavisModule = this;
 
-  // Clear old macros
+  // 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 aStr, aDestFiles) {
-    aDestDir.remove(aStr);
+  foreach (QString aMacrosPath, getEmbeddedMacrosList()) {
+    QString aMacrosName = QFileInfo(aMacrosPath).fileName();
+    if (aDestFiles.contains(aMacrosName)) {
+      aDestDir.remove(aMacrosName);
+    }
   }
 }
 
@@ -367,9 +251,56 @@ PVGUI_Module::PVGUI_Module()
 */
 PVGUI_Module::~PVGUI_Module()
 {
+  if (myPushTraceTimer)
+    delete myPushTraceTimer;
+  if (myInitTimer)
+    delete myInitTimer;
 }
 
+/*!
+ * \brief Retrieve the PVSERVER CORBA engine.
+ * This uses the Python wrapper provided
+ * by the PVViewer code in GUI (class PVViewer_EngineWrapper).
+ * \sa GetCPPEngine()
+ */
+PVViewer_EngineWrapper * PVGUI_Module::GetEngine()
+{
+  return PVViewer_EngineWrapper::GetInstance();
+}
 
+/*!
+ * \brief Retrieve the PVSERVER CORBA engine.
+ * Uses directly the standard Salome C++ mechanisms
+ * (LifeCycleCorba).
+ * \sa GetEngine()
+ */
+PVSERVER_ORB::PVSERVER_Gen_var PVGUI_Module::GetCPPEngine()
+{
+  // initialize PARAVIS module engine (load, if necessary)
+  if ( CORBA::is_nil( MyEngine ) ) {
+      Engines::EngineComponent_var comp =
+          SalomeApp_Application::lcc()->FindOrLoad_Component( "FactoryServer", "PVSERVER" );
+      MyEngine = PVSERVER_ORB::PVSERVER_Gen::_narrow( comp );
+ }
+  return MyEngine;
+}
+
+/*!
+  \brief Create data model.
+  \return module specific data model
+*/
+CAM_DataModel* PVGUI_Module::createDataModel()
+{
+  return new PVGUI_DataModel( this );
+}
+
+/*!
+ * \brief Get the ParaView application singleton.
+ */
+pqPVApplicationCore * PVGUI_Module::GetPVApplication()
+{
+  return PVViewer_ViewManager::GetPVApplication();
+}
 
 /*!
   \brief Initialize module. Creates menus, prepares context menu, etc.
@@ -377,14 +308,9 @@ PVGUI_Module::~PVGUI_Module()
 */
 void PVGUI_Module::initialize( CAM_Application* app )
 {
-  //VTN: Disable conflict with python initialization for MatPlot.
-  PVGUI_MatplotlibMathTextUtilities::Disable();
-
-  SalomeApp_Module::initialize( app );
+  LightApp_Module::initialize( app );
 
-  // Create ParaViS actions
   createActions();
-  // Create ParaViS menus
   createMenus();
 
   // Uncomment to debug ParaView initialization
@@ -395,137 +321,110 @@ void PVGUI_Module::initialize( CAM_Application* app )
     aa = aa;
   }
   */
-  
-  // Initialize ParaView client
-  pvInit();
 
-  // Create GUI elements (menus, toolbars, dock widgets)
-  //if ( !Implementation ){
-    SalomeApp_Application* anApp = getApp();
-    SUIT_Desktop* aDesktop = anApp->desktop();
+  LightApp_Application* anApp = getApp();
+  SUIT_Desktop* aDesktop = anApp->desktop();
 
-    // connect(aDesktop, SIGNAL()
+  // Remember current state of desktop toolbars
+  QList<QToolBar*> foreignToolbars = aDesktop->findChildren<QToolBar*>();
 
-    // 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, anApp->logWindow());
+  myGuiElements = PVViewer_GUIElements::GetInstance(aDesktop);
 
-    // Simulate ParaView client main window
-    //Implementation = new pqImplementation( aDesktop );
+  // [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();
 
-    setupDockWidgets();
-    
-    pvCreateActions();
-    pvCreateToolBars();
-    pvCreateMenus();
-
-    QList<QDockWidget*> activeDocks = aDesktop->findChildren<QDockWidget*>();
-    QList<QMenu*> activeMenus = aDesktop->findChildren<QMenu*>();
-
-    // new pqParaViewBehaviors(anApp->desktop(), this);
-    // Has to be replaced in order to exclude using of pqQtMessageHandlerBehaviour
-    //  Start pqParaViewBehaviors
-    // Register ParaView interfaces.
-    //pqPluginManager* pgm = pqApplicationCore::instance()->getPluginManager();
-    pqInterfaceTracker* pgm = pqApplicationCore::instance()->interfaceTracker();
-
-    // * adds support for standard paraview views.
-    pgm->addInterface(new pqStandardViewModules(pgm));
-    pgm->addInterface(new pqStandardSummaryPanelImplementation(pgm));
-    pgm->addInterface(new pqStandardPropertyWidgetInterface(pgm));
-
-    // Load plugins distributed with application.
-    pqApplicationCore::instance()->loadDistributedPlugins();
-
-    // Define application behaviors.
-    //new pqQtMessageHandlerBehavior(this);
-    new pqDataTimeStepBehavior(this);
-    new pqViewFrameActionsBehavior(this);
-    new pqSpreadSheetVisibilityBehavior(this);
-    new pqPipelineContextMenuBehavior(this);
-    new pqDefaultViewBehavior(this);
-    new pqAlwaysConnectedBehavior(this);
-    new pqPVNewSourceBehavior(this);
-    new pqDeleteBehavior(this);
-    new pqUndoRedoBehavior(this);
-    new pqCrashRecoveryBehavior(this);
-    new pqAutoLoadPluginXMLBehavior(this);
-    new pqPluginDockWidgetsBehavior(aDesktop);
-    //new pqVerifyRequiredPluginBehavior(this);
-    new pqPluginActionGroupBehavior(aDesktop);
-    //new pqFixPathsInStateFilesBehavior(this);
-    new pqCommandLineOptionsBehavior(this);
-    new pqPersistentMainWindowStateBehavior(aDesktop);
-    new pqObjectPickingBehavior(aDesktop);
-    new pqCollaborationBehavior(this);
-    new pqMultiServerBehavior(this);
-    new pqViewStreamingBehavior(this);
-
-    // Setup quick-launch shortcuts.
-    QShortcut *ctrlSpace = new QShortcut(Qt::CTRL + Qt::Key_Space, aDesktop);
-    QObject::connect(ctrlSpace, SIGNAL(activated()),
-      pqApplicationCore::instance(), SLOT(quickLaunch()));
-
-    // Find Plugin Dock Widgets
-    QList<QDockWidget*> currentDocks = aDesktop->findChildren<QDockWidget*>();
-    QList<QDockWidget*>::iterator i;
-    for (i = currentDocks.begin(); i != currentDocks.end(); ++i) {
-      if(!activeDocks.contains(*i)) {
-       myDockWidgets[*i] = false; // hidden by default
-       (*i)->hide();
-      }
+  pvCreateActions();
+  pvCreateMenus();
+  pvCreateToolBars();
+
+  PVViewer_ViewManager::ParaviewInitBehaviors(true, aDesktop);
+
+  QList<QDockWidget*> activeDocks = aDesktop->findChildren<QDockWidget*>();
+  QList<QMenu*> activeMenus = aDesktop->findChildren<QMenu*>();
+
+  // Setup quick-launch shortcuts.
+  QShortcut *ctrlSpace = new QShortcut(Qt::CTRL + Qt::Key_Space, aDesktop);
+  QObject::connect(ctrlSpace, SIGNAL(activated()),
+    pqApplicationCore::instance(), SLOT(quickLaunch()));
+
+  // Find Plugin Dock Widgets
+  QList<QDockWidget*> currentDocks = aDesktop->findChildren<QDockWidget*>();
+  QList<QDockWidget*>::iterator i;
+  for (i = currentDocks.begin(); i != currentDocks.end(); ++i) {
+    if(!activeDocks.contains(*i)) {
+      myDockWidgets[*i] = false; // hidden by default
+      (*i)->hide();
     }
+  }
 
     // Find Plugin Menus
-    QList<QMenu*> currentMenus = aDesktop->findChildren<QMenu*>();
-    QList<QMenu*>::iterator im;
-    for (im = currentMenus.begin(); im != currentMenus.end(); ++im) {
-      if(!activeMenus.contains(*im)) {
-       myMenus.append(*im);
-      }
-    }
+    // [ABN] TODO: fix this - triggers a SEGFAULT at deactivation() time.
+//    QList<QMenu*> currentMenus = aDesktop->findChildren<QMenu*>();
+//    QList<QMenu*>::iterator im;
+//    for (im = currentMenus.begin(); im != currentMenus.end(); ++im) {
+//      if(!activeMenus.contains(*im)) {
+//          QString s = (*im)->title();
+//          std::cout << " MENU "<<  s.toStdString() << std::endl;
+//          myMenus.append(*im);
+//      }
+//    }
+
+  // Connect after toolbar creation, etc ... as some activations of the toolbars is triggered
+  // by the ServerConnection event:
+  PVViewer_ViewManager::ParaviewLoadConfigurations(true);
+  PVViewer_ViewManager::ConnectToExternalPVServer(aDesktop);
+  updateObjBrowser();
 
-    SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
-    QString aPath = resMgr->stringValue("resources", "PARAVIS", QString());
-    if (!aPath.isNull()) {
-      MyCoreApp->loadConfiguration(aPath + QDir::separator() + "ParaViewFilters.xml");
-      MyCoreApp->loadConfiguration(aPath + QDir::separator() + "ParaViewReaders.xml");
-      MyCoreApp->loadConfiguration(aPath + QDir::separator() + "ParaViewSources.xml");
-      MyCoreApp->loadConfiguration(aPath + QDir::separator() + "ParaViewWriters.xml");
+  // 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);
     }
-     
-    // Force creation of engine
-    PARAVIS::GetParavisGen(this);
-    updateObjBrowser();
-
-    // Find created toolbars
-    QCoreApplication::processEvents();
+  }
 
-    QList<QToolBar*> allToolbars = aDesktop->findChildren<QToolBar*>();
-    foreach(QToolBar* aBar, allToolbars) {
-      if (!foreignToolbars.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) && !myToolbars.contains(aBar)) {
+      myToolbars[aBar] = true;
+      myToolbarBreaks[aBar] = false;
+      aBar->setVisible(false);
+      aBar->toggleViewAction()->setVisible(false);
     }
-    //}
+  }
 
   updateMacros();
  
-  // we need to start trace after connection is done
-  connect(pqApplicationCore::instance()->getObjectBuilder(), SIGNAL(finishedAddingServer(pqServer*)), 
-         this, SLOT(onFinishedAddingServer(pqServer*)));
-
-  connect(pqApplicationCore::instance()->getObjectBuilder(), SIGNAL(dataRepresentationCreated(pqDataRepresentation*)), 
-          this, SLOT(onDataRepresentationCreated(pqDataRepresentation*)));
-
-
   SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
-  bool isStop = aResourceMgr->booleanValue( "PARAVIS", "stop_trace", false );
-  // start timer to activate trace in a proper moment
-  if(!isStop) 
-    startTimer( 1000 );
+  bool isStop = aResourceMgr->booleanValue( PARAVIS_MODULE_NAME, "stop_trace", false );
+  if(!isStop)
+    {
+      // Start a timer to schedule asap:
+      //  - the trace start
+      myInitTimer = new QTimer(aDesktop);
+      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();
   
@@ -535,56 +434,35 @@ void PVGUI_Module::initialize( CAM_Application* app )
     if(pvs) {
       vtkPVProgressHandler* ph = pvs->GetProgressHandler();
       if(ph) {
-       this->VTKConnect->Connect(ph, vtkCommand::StartEvent,
-                                 this, SLOT(onStartProgress()));
-       this->VTKConnect->Connect(ph, vtkCommand::EndEvent,
-                                 this, SLOT(onEndProgress()));
+          this->VTKConnect->Connect(ph, vtkCommand::StartEvent,
+                                    this, SLOT(onStartProgress()));
+          this->VTKConnect->Connect(ph, vtkCommand::EndEvent,
+                                    this, SLOT(onEndProgress()));
       }
     }
   }
-  
-  connect(&pqActiveObjects::instance(),
-         SIGNAL(representationChanged(pqRepresentation*)),
-         this, SLOT(onRepresentationChanged(pqRepresentation*)));
 }
 
+/*!
+ * \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();
-}
-
-void PVGUI_Module::onFinishedAddingServer(pqServer* /*server*/)
-{
-  SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
-  bool isStop = aResourceMgr->booleanValue( "PARAVIS", "stop_trace", false );
-  if(!isStop) 
-    startTimer( 500 );
-}
-
-void PVGUI_Module::onDataRepresentationCreated(pqDataRepresentation* data) {
-  if(!data)
-    return;
-  
-  if(!data->getLookupTable())
-    return;
-  
-  SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
-  if(!aResourceMgr)
-    return;
-
-  bool visible = aResourceMgr->booleanValue( "PARAVIS", "show_color_legend", false );
-  pqLookupTableManager* lut_mgr = pqApplicationCore::instance()->getLookupTableManager();
-  
-  if(lut_mgr) {
-    lut_mgr->setScalarBarVisibility(data,visible);
-  }
-
-  connect(data, SIGNAL(dataUpdated()), this, SLOT(onDataRepresentationUpdated()));
+  // 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() {
@@ -594,73 +472,38 @@ void PVGUI_Module::onDataRepresentationUpdated() {
   activeStudy->Modified();
 }
 
-void PVGUI_Module::onVariableChanged(pqVariableType t, const QString) {
-  
-  pqDisplayColorWidget* colorWidget = qobject_cast<pqDisplayColorWidget*>(sender());
-  if( !colorWidget )
-    return;
-
-  if( t == VARIABLE_TYPE_NONE )
-    return;
-
-  SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
-  
-  if(!aResourceMgr)
-    return;
-
-  bool visible = aResourceMgr->booleanValue( "PARAVIS", "show_color_legend", false );
-  
-  if(!visible)
-    return;
+/*!
+  \brief Initialisation timer event - Starts up the Python trace
+*/
+void PVGUI_Module::onInitTimer()
+{
+  startTrace();
+}
   
-  /*//VTN: getRepresentation is protected
-  pqDataRepresentation* data  = colorWidget->getRepresentation();
-
-  if( !data->getLookupTable() )
-    return;
+/*!
+  \brief Get list of embedded macros files
+*/
+QStringList PVGUI_Module::getEmbeddedMacrosList()
+{
+  QString aRootDir = getenv("PARAVIS_ROOT_DIR");
 
-  pqLookupTableManager* lut_mgr = pqApplicationCore::instance()->getLookupTableManager();
+  QString aSourcePath = aRootDir + "/bin/salome/Macro";
 
-  if(lut_mgr) {
-    lut_mgr->setScalarBarVisibility(data,visible);
-  }
-  */
-  pqColorToolbar* colorTooBar = qobject_cast<pqColorToolbar*>(colorWidget->parent());
-  if( !colorTooBar )
-    return;
+  QStringList aFilter;
+  aFilter << "*.py";
 
-  pqScalarBarVisibilityReaction* scalarBarVisibility = colorTooBar->findChild<pqScalarBarVisibilityReaction *>();
-  if(scalarBarVisibility) {
-    scalarBarVisibility->setScalarBarVisibility(visible);
+  QDir aSourceDir(aSourcePath);
+  QStringList aSourceFiles = aSourceDir.entryList(aFilter, QDir::Files);
+  QStringList aFullPathSourceFiles;
+  foreach (QString aMacrosName, aSourceFiles) {
+    aFullPathSourceFiles << aSourceDir.absoluteFilePath(aMacrosName);
   }
+  return aFullPathSourceFiles;
 }
 
-
 /*!
-  \brief Launches a tracing of current server
+  \brief Update the list of embedded macros
 */
-void PVGUI_Module::timerEvent(QTimerEvent* te )
-{
-#ifndef WNT
-  PyInterp_Dispatcher* aDispatcher = PyInterp_Dispatcher::Get();
-  if ( !aDispatcher->IsBusy() ) {
-    pqPythonManager* manager = qobject_cast<pqPythonManager*>
-      ( pqApplicationCore::instance()->manager( "PYTHON_MANAGER" ) );
-    if ( manager )  {
-      pqPythonDialog* pyDiag = manager->pythonShellDialog();
-      if ( pyDiag ) {
-       pqPythonShell* shell = pyDiag->shell();
-       if ( shell ) {
-         QString script = "from paraview import smtrace\nsmtrace.start_trace()\n";
-         shell->executeScript(script);
-         killTimer( te->timerId() );
-       }
-      }
-    }
-  }
-#endif
-}
-  
 void PVGUI_Module::updateMacros()
 {
   pqPythonManager* aPythonManager = pqPVApplicationCore::instance()->pythonManager();
@@ -668,17 +511,8 @@ void PVGUI_Module::updateMacros()
     return;
   }
   
-  QString aRootDir = getenv("PARAVIS_ROOT_DIR");
-
-  QString aSourcePath = aRootDir + "/bin/salome/Macro";
-
-  QStringList aFilter;
-  aFilter << "*.py";
-
-  QDir aSourceDir(aSourcePath);
-  QStringList aSourceFiles = aSourceDir.entryList(aFilter, QDir::Files);
-  foreach (QString aStr, aSourceFiles) {
-    aPythonManager->addMacro(aSourcePath + "/" + aStr);
+  foreach (QString aStr, getEmbeddedMacrosList()) {
+    aPythonManager->addMacro(aStr);
   }
 }
 
@@ -695,89 +529,25 @@ void PVGUI_Module::windows( QMap<int, int>& m ) const
   m.insert( LightApp_Application::WT_LogWindow, Qt::BottomDockWidgetArea );
 }
 
-/*!
-  \brief Static method, performs initialization of ParaView session.
-  \return \c true if ParaView has been initialized successfully, otherwise false
-*/
-bool PVGUI_Module::pvInit()
-{
-  //  if ( !pqImplementation::Core ){
-  if ( ! MyCoreApp) {
-    // Obtain command-line arguments
-    int argc = 0;
-    char** argv = 0;
-    QString aOptions = getenv("PARAVIS_OPTIONS");
-    QStringList aOptList = aOptions.split(":", QString::SkipEmptyParts);
-    argv = new char*[aOptList.size() + 1];
-    QStringList args = QApplication::arguments();
-    argv[0] = (args.size() > 0)? strdup(args[0].toLatin1().constData()) : strdup("paravis");
-    argc++;
-
-    foreach (QString aStr, aOptList) {
-      argv[argc] = strdup( aStr.toLatin1().constData() );
-      argc++;
-    }
-    MyCoreApp = new pqPVApplicationCore (argc, argv);
-    if (MyCoreApp->getOptions()->GetHelpSelected() ||
-        MyCoreApp->getOptions()->GetUnknownArgument() ||
-        MyCoreApp->getOptions()->GetErrorMessage() ||
-        MyCoreApp->getOptions()->GetTellVersion()) {
-      return false;
-      }
-
-    /* VTN: Looks like trash. For porting see branded_paraview_initializer.cxx.in
-    // Not sure why this is needed. Andy added this ages ago with comment saying
-    // needed for Mac apps. Need to check that it's indeed still required.
-    QDir dir(QApplication::applicationDirPath());
-    dir.cdUp();
-    dir.cd("Plugins");
-    QApplication::addLibraryPath(dir.absolutePath());
-    // Load required application plugins.
-    QString plugin_string = "";
-    QStringList plugin_list = plugin_string.split(';',QString::SkipEmptyParts);
-    pqBrandPluginsLoader loader;
-    if (loader.loadPlugins(plugin_list) == false) {
-      printf("Failed to load required plugins for this application\n");
-      return false;
-    }
-
-    // Load optional plugins.
-    plugin_string = "";
-    plugin_list = plugin_string.split(';',QString::SkipEmptyParts);
-    loader.loadPlugins(plugin_list, true); //quietly skip not-found plugins.
-    */
-    // End of Initializer code
-
-    vtkOutputWindow::SetInstance(PVGUI_OutputWindowAdapter::New());
-    
-    new pqTabbedMultiViewWidget(); // it registers as "MULTIVIEW_WIDGET on creation
-    
-    for (int i = 0; i < argc; i++)
-      free(argv[i]);
-    delete[] argv;
-  }
-  
-  return true;
-}
 /*!
   \brief Shows (toShow = true) or hides ParaView view window
 */
 void PVGUI_Module::showView( bool toShow )
 {
-  SalomeApp_Application* anApp = getApp();
-  PVGUI_ViewManager* viewMgr =
-    dynamic_cast<PVGUI_ViewManager*>( anApp->getViewManager( PVGUI_Viewer::Type(), false ) );
+  LightApp_Application* anApp = getApp();
+  PVViewer_ViewManager* viewMgr =
+    dynamic_cast<PVViewer_ViewManager*>( anApp->getViewManager( PVViewer_Viewer::Type(), false ) );
   if ( !viewMgr ) {
-    viewMgr = new PVGUI_ViewManager( anApp->activeStudy(), anApp->desktop() );
+    viewMgr = new PVViewer_ViewManager( anApp->activeStudy(), anApp->desktop(), anApp->logWindow() );
     anApp->addViewManager( viewMgr );
     connect( viewMgr, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
              anApp, SLOT( onCloseView( SUIT_ViewManager* ) ) );
   }
 
-  PVGUI_ViewWindow* pvWnd = dynamic_cast<PVGUI_ViewWindow*>( viewMgr->getActiveView() );
+  PVViewer_ViewWindow* pvWnd = dynamic_cast<PVViewer_ViewWindow*>( viewMgr->getActiveView() );
   if ( !pvWnd ) {
-    pvWnd = dynamic_cast<PVGUI_ViewWindow*>( viewMgr->createViewWindow() );
+    pvWnd = dynamic_cast<PVViewer_ViewWindow*>( viewMgr->createViewWindow() );
+    // this also connects to the pvserver and instantiates relevant PV behaviors
   }
 
   pvWnd->setShown( toShow );
@@ -820,14 +590,8 @@ void PVGUI_Module::endWaitCursor()
 }
 
 /*!
-  \brief Returns the ParaView multi-view manager.
+  \brief Handler method for the output of messages.
 */
-pqTabbedMultiViewWidget* PVGUI_Module::getMultiViewManager() const
-{
-  return qobject_cast<pqTabbedMultiViewWidget*>(pqApplicationCore::instance()->manager("MULTIVIEW_WIDGET"));
-}
-
-
 static void ParavisMessageOutput(QtMsgType type, const char *msg)
 {
   switch(type)
@@ -847,8 +611,6 @@ static void ParavisMessageOutput(QtMsgType type, const char *msg)
     }
 }
 
-
-
 /*!
   \brief Activate module.
   \param study current study
@@ -861,14 +623,25 @@ bool PVGUI_Module::activateModule( SUIT_Study* study )
   
   SUIT_ExceptionHandler::addCleanUpRoutine( paravisCleanUp );
 
-  bool isDone = SalomeApp_Module::activateModule( study );
+  storeCommonWindowsState();
+
+  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 ( myFiltersMenuId != -1 ) menuMgr()->show(myMacrosMenuId);
-  if ( myFiltersMenuId != -1 ) menuMgr()->show(myToolbarsMenuId);
+  if ( myMacrosMenuId != -1 ) menuMgr()->show(myMacrosMenuId);
+  if ( myToolbarsMenuId != -1 ) menuMgr()->show(myToolbarsMenuId);
+
+  // 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);
+
   setMenuShown( true );
   setToolShown( true );
 
@@ -880,7 +653,7 @@ bool PVGUI_Module::activateModule( SUIT_Study* study )
     for (int i = 0; i < anActns.size(); ++i) {
       QAction* a = anActns.at(i);
       if(a)
-       a->setVisible(true);
+        a->setVisible(true);
     }
   }
 
@@ -907,13 +680,15 @@ bool PVGUI_Module::activateModule( SUIT_Study* study )
 */
 bool PVGUI_Module::deactivateModule( SUIT_Study* study )
 {
+  MESSAGE("PARAVIS deactivation ...")
+
   QMenu* aMenu = menuMgr()->findMenu( myRecentMenuId );
   if(aMenu) {
     QList<QAction*> anActns = aMenu->actions();
     for (int i = 0; i < anActns.size(); ++i) {
       QAction* a = anActns.at(i);
       if(a)
-       a->setVisible(false);
+        a->setVisible(false);
     }
   }
 
@@ -933,7 +708,6 @@ bool PVGUI_Module::deactivateModule( SUIT_Study* study )
   /*if (pqImplementation::helpWindow) {
     pqImplementation::helpWindow->hide();
     }*/
-  showView( false );
   // hide menus
   menuMgr()->hide(myRecentMenuId);
   menuMgr()->hide(mySourcesMenuId);
@@ -943,7 +717,6 @@ bool PVGUI_Module::deactivateModule( SUIT_Study* study )
   setMenuShown( false );
   setToolShown( false );
 
-
   saveDockWidgetsState();
 
   SUIT_ExceptionHandler::removeCleanUpRoutine( paravisCleanUp );
@@ -951,7 +724,9 @@ bool PVGUI_Module::deactivateModule( SUIT_Study* study )
   if (myOldMsgHandler)
     qInstallMsgHandler(myOldMsgHandler);
 
-  return SalomeApp_Module::deactivateModule( study );
+  restoreCommonWindowsState();
+  
+  return LightApp_Module::deactivateModule( study );
 }
 
 
@@ -965,16 +740,29 @@ bool PVGUI_Module::deactivateModule( SUIT_Study* study )
 */
 void PVGUI_Module::onApplicationClosed( SUIT_Application* theApp )
 {
-  pqApplicationCore::instance()->settings()->sync();
+  PVViewer_ViewManager::ParaviewCleanup();
+
   int aAppsNb = SUIT_Session::session()->applications().size();
   if (aAppsNb == 1) {
     deleteTemporaryFiles();
-    MyCoreApp->deleteLater();
   }
   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.
 
@@ -984,9 +772,10 @@ void PVGUI_Module::onApplicationClosed( SUIT_Application* theApp )
 */
 void PVGUI_Module::studyClosed(SUIT_Study* study)
 {
+  showView(false);
   clearParaviewState();
 
-  SalomeApp_Module::studyClosed(study);
+  LightApp_Module::studyClosed(study);
 }
 
 /*!
@@ -998,9 +787,9 @@ void PVGUI_Module::onModelOpened()
   if(!studyDS) {
     return;
   }
-  
-  _PTR(SComponent) paravisComp = 
-    studyDS->FindComponent(PARAVIS::GetParavisGen(this)->ComponentDataType());
+
+  _PTR(SComponent) paravisComp =
+    studyDS->FindComponent(PARAVIS_MODULE_NAME);
   if(!paravisComp) {
     return;
   }
@@ -1020,15 +809,14 @@ void PVGUI_Module::onModelOpened()
 }
 
 /*!
-  \brief Returns IOR of current engine
+\brief Returns IOR of current engine
 */
 QString PVGUI_Module::engineIOR() const
 {
-  CORBA::String_var anIOR = PARAVIS::GetParavisGen(this)->GetIOR();
+  CORBA::String_var anIOR = GetCPPEngine()->GetIOR();
   return QString(anIOR.in());
 }
 
-
 /*!
   \brief Open file of format supported by ParaView
 */
@@ -1039,6 +827,44 @@ void PVGUI_Module::openFile(const char* theName)
   pqLoadDataReaction::loadData(aFiles);
 }
 
+/**!
+ * \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);
+    }
+  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);
+    }
+}
+
+/**!
+ * \brief Stops Python trace.
+ */
+void PVGUI_Module::stopTrace()
+{
+  vtkSMTrace::StopTrace();
+}
+
+/**!
+ * \brief Execute a Python script.
+ */
 void PVGUI_Module::executeScript(const char *script)
 {
 #ifndef WNT
@@ -1053,46 +879,56 @@ void PVGUI_Module::executeScript(const char *script)
 #endif
 }
 
+///**
+// *  Debug function printing out the given interpreter's execution context
+// */
+//void printInterpContext(PyInterp_Interp * interp )
+//{
+//  // Extract __smtraceString from interpreter's context
+//  const PyObject* ctxt = interp->getExecutionContext();
+//
+//  PyObject* lst = PyDict_Keys((PyObject *)ctxt);
+//  Py_ssize_t siz = PyList_GET_SIZE(lst);
+//  for (Py_ssize_t i = 0; i < siz; i++)
+//    {
+//      PyObject * elem = PyList_GetItem(lst, i);
+//      if (PyString_Check(elem))
+//        {
+//          std::cout << "At pos:" << i << ", " << PyString_AsString(elem) << std::endl;
+//        }
+//      else
+//        std::cout << "At pos:" << i << ", not a string!" << std::endl;
+//    }
+//  Py_XDECREF(lst);
+//}
+
 /*!
   \brief Returns trace string
 */
 static const QString MYReplaceStr("paraview.simple");
-static const QString MYReplaceImportStr("except: from pvsimple import *");
 QString PVGUI_Module::getTraceString()
 {
-  QString traceString;
-#ifndef WNT
-  pqPythonManager* manager = qobject_cast<pqPythonManager*>(
-                             pqApplicationCore::instance()->manager("PYTHON_MANAGER"));
-  if (manager)  {
-    pqPythonDialog* pyDiag = manager->pythonShellDialog();
-    if (pyDiag) {
-      pyDiag->runString("from paraview import smtrace\n"
-                        "__smtraceString = smtrace.get_trace_string()\n");
-      pyDiag->shell()->makeCurrent();
-      PyObject* main_module = PyImport_AddModule((char*)"__main__");
-      PyObject* global_dict = PyModule_GetDict(main_module);
-      PyObject* string_object = PyDict_GetItemString(global_dict, "__smtraceString");
-      char* string_ptr = string_object ? PyString_AsString(string_object) : 0;
-      if (string_ptr)  {
-        traceString = string_ptr;
-      }
-      pyDiag->shell()->releaseControl();
-    }
-  }
+  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);
     }
-    int aImportPos = traceString.indexOf(MYReplaceImportStr);
-    if(aImportPos != -1)
-      {
-      traceString = traceString.replace(aImportPos, MYReplaceImportStr.length(), "except:\n  import pvsimple\n  from pvsimple import *");
-      }
   }
-#endif
+
   return traceString;
 }
 
@@ -1140,78 +976,6 @@ void PVGUI_Module::loadParaviewState(const char* theFileName)
   pqApplicationCore::instance()->loadState(theFileName, getActiveServer());
 }
 
-/*!
-  \brief Imports MED data from VISU module by data entry
-*/
-void PVGUI_Module::onImportFromVisu(QString theEntry)
-{
-#ifdef WITH_VISU
-  SUIT_OverrideCursor aWaitCursor;
-
-  // get active study
-  SalomeApp_Study* activeStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
-  if(!activeStudy) return;
-
-  // get SALOMEDS client study 
-  _PTR(Study) aStudy = activeStudy->studyDS();
-  if(!aStudy) return;
-
-  // find VISU component in a study
-  _PTR(SComponent) aVisuComp = aStudy->FindComponent( "VISU" );
-  if(!aVisuComp) return;
-
-  // get SObject client by entry
-  _PTR(SObject) aSObj = aStudy->FindObjectID(qPrintable(theEntry));
-  if (!aSObj) return;
-
-  // get CORBA SObject
-  SALOMEDS_SObject* aSObject = _CAST(SObject, aSObj);
-  if ( !aSObject ) return;
-
-  // load VISU engine
-  SALOME_NamingService* aNamingService = SalomeApp_Application::namingService();
-  SALOME_LifeCycleCORBA aLCC(aNamingService);
-
-  Engines::EngineComponent_var aComponent = aLCC.FindOrLoad_Component("FactoryServer","VISU");
-  VISU::VISU_Gen_var aVISU = VISU::VISU_Gen::_narrow(aComponent);
-  if(CORBA::is_nil(aVISU)) return;
-
-  _PTR(StudyBuilder) aStudyBuilder = aStudy->NewBuilder();
-  aStudyBuilder->LoadWith( aVisuComp, SalomeApp_Application::orb()->object_to_string(aVISU) );
-
-  // get VISU result object
-  CORBA::Object_var aResultObject = aSObject->GetObject();
-  if (CORBA::is_nil(aResultObject)) return;
-  VISU::Result_var aResult = VISU::Result::_narrow( aResultObject );
-  if (CORBA::is_nil(aResult)) return;
-
-  // export VISU result to the MED file
-  std::string aTmpDir = SALOMEDS_Tool::GetTmpDir();
-  std::string aFileName = aSObject->GetName();
-  std::string aFilePath = aTmpDir + aFileName;
-
-  if (aResult->ExportMED(aFilePath.c_str())) {
-    openFile(aFilePath.c_str());
-    myTemporaryFiles.append(QString(aFilePath.c_str()));
-  }
-#else
-  MESSAGE("Visu module is not found.");
-#endif
-}
-
-/*!
-  \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 Returns current active ParaView server
 */
@@ -1222,22 +986,27 @@ 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()));
+
+  setPreferenceProperty(aParaViewSettingsTab, "stretch", false );
+  int aPanel = addPreference(QString(), aParaViewSettingsTab, LightApp_Preferences::UserDefined, PARAVIS_MODULE_NAME, "");
+
+  setPreferenceProperty(aPanel, "content", (qint64)(new PVGUI_ParaViewSettingsPane(0, getApp())));
 
   // Paravis settings tab
   int aParaVisSettingsTab = addPreference( tr( "TIT_PVISSETTINGS" ) );
-  addPreference( tr( "PREF_STOP_TRACE" ), aParaVisSettingsTab, LightApp_Preferences::Bool, "PARAVIS", "stop_trace");
+  addPreference( tr( "PREF_STOP_TRACE" ), aParaVisSettingsTab, LightApp_Preferences::Bool, PARAVIS_MODULE_NAME, "stop_trace");
+
+  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", "savestate_type");
+                                PARAVIS_MODULE_NAME, "savestate_type");
   QList<QVariant> aIndices;
   QStringList aStrings;
   aIndices<<0<<1<<2;
@@ -1246,10 +1015,6 @@ void PVGUI_Module::createPreferences()
   aStrings<<tr("PREF_SAVE_TYPE_2");
   setPreferenceProperty(aSaveType, "strings", aStrings);
   setPreferenceProperty(aSaveType, "indexes", aIndices);
-
-  //rnv: imp 21712: [CEA 581] Preference to display legend by default 
-  int aDispColoreLegend = addPreference( tr( "PREF_SHOW_COLOR_LEGEND" ), aParaVisSettingsTab,
-                                        LightApp_Preferences::Bool, "PARAVIS", "show_color_legend");
 }
 
 /*!
@@ -1257,8 +1022,8 @@ void PVGUI_Module::createPreferences()
 */
 void PVGUI_Module::contextMenuPopup(const QString& theClient, QMenu* theMenu, QString& theTitle)
 {
-  SalomeApp_Module::contextMenuPopup(theClient, theMenu, theTitle);
-  
+  LightApp_Module::contextMenuPopup(theClient, theMenu, theTitle);
+
   // Check if we are in Object Browser
   SUIT_DataBrowser* ob = getApp()->objectBrowser();
   bool isOBClient = (ob && theClient == ob->popupClientType());
@@ -1272,22 +1037,22 @@ void PVGUI_Module::contextMenuPopup(const QString& theClient, QMenu* theMenu, QS
   aSelectionMgr->selectedObjects(aListIO);
   if (aListIO.Extent() == 1 && aListIO.First()->hasEntry()) {
     QString entry = QString(aListIO.First()->getEntry());
-    
+
     // Get active study
-    SalomeApp_Study* activeStudy = 
+    SalomeApp_Study* activeStudy =
       dynamic_cast<SalomeApp_Study*>(getApp()->activeStudy());
     if(!activeStudy) {
       return;
     }
 
-    // Get SALOMEDS client study 
+    // Get SALOMEDS client study
     _PTR(Study) studyDS = activeStudy->studyDS();
     if(!studyDS) {
       return;
     }
 
-    QString paravisDataType(PARAVIS::GetParavisGen(this)->ComponentDataType());
-    if(activeStudy && activeStudy->isComponent(entry) && 
+    QString paravisDataType(PARAVIS_MODULE_NAME);
+    if(activeStudy && activeStudy->isComponent(entry) &&
        activeStudy->componentDataType(entry) == paravisDataType) {
       // ParaViS module object
       theMenu->addSeparator();
@@ -1295,28 +1060,28 @@ void PVGUI_Module::contextMenuPopup(const QString& theClient, QMenu* theMenu, QS
     }
     else {
       // Try to get state object
-      _PTR(SObject) stateSObj = 
-       studyDS->FindObjectID(entry.toLatin1().constData());
+      _PTR(SObject) stateSObj =
+          studyDS->FindObjectID(entry.toLatin1().constData());
       if (!stateSObj) {
-       return;
+          return;
       }
-      
+
       // Check local id
       _PTR(GenericAttribute) anAttr;
       if (!stateSObj->FindAttribute(anAttr, "AttributeLocalID")) {
-       return;
+          return;
       }
 
       _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));
+        // Paraview state object
+        theMenu->addSeparator();
+        theMenu->addAction(action(AddStatePopupId));
+        theMenu->addAction(action(CleanAndAddStatePopupId));
+        theMenu->addSeparator();
+        theMenu->addAction(action(ParaVisRenameId));
+        theMenu->addAction(action(ParaVisDeleteId));
       }
     }
   }
@@ -1342,31 +1107,8 @@ void PVGUI_Module::onShowTrace()
 */
 void PVGUI_Module::onRestartTrace()
 {
-  PyInterp_Dispatcher* aDispatcher = PyInterp_Dispatcher::Get();
-  if ( !aDispatcher->IsBusy() ) {
-    pqPythonManager* manager = qobject_cast<pqPythonManager*>
-       ( pqApplicationCore::instance()->manager( "PYTHON_MANAGER" ) );
-    if ( manager )  {
-      pqPythonDialog* pyDiag = manager->pythonShellDialog();
-        if ( pyDiag ) {
-          pqPythonShell* shell = pyDiag->shell();
-            if ( shell ) {
-              QString script = "from paraview import smtrace\n";
-              script += "smtrace.stop_trace()\n";
-              script += "smtrace.start_trace()\n";
-              shell->executeScript(script);
-            }
-        }
-    }
-  }
-}
-
-/*!
-  \brief Show ParaView view.
-*/
-void PVGUI_Module::onNewParaViewWindow()
-{
-  showView(true);
+  stopTrace();
+  startTrace();
 }
 
 /*!
@@ -1381,9 +1123,9 @@ void PVGUI_Module::onSaveMultiState()
   if(!studyDS) {
     return;
   }
-  
+
   _PTR(SComponent) paravisComp = 
-    studyDS->FindComponent(PARAVIS::GetParavisGen(this)->ComponentDataType());
+      studyDS->FindComponent(PARAVIS_MODULE_NAME);
   if(!paravisComp) {
     return;
   }
@@ -1418,8 +1160,7 @@ void PVGUI_Module::onSaveMultiState()
  
   // File name for state saving
   QString tmpDir = QString::fromStdString(SALOMEDS_Tool::GetTmpDir());
-  QString fileName = QString("%1_paravisstate:%2").arg(tmpDir, 
-                                                      stateEntry);
+  QString fileName = QString("%1_paravisstate:%2").arg(tmpDir, stateEntry);
 
   anAttr = studyBuilder->FindOrCreateAttribute(newSObj, "AttributeString");
   _PTR(AttributeString) stringAttr(anAttr);
@@ -1491,10 +1232,10 @@ void PVGUI_Module::onRename()
     if (stateSObj->FindAttribute(anAttr, "AttributeName")) {
       _PTR(AttributeName) nameAttr (anAttr);
       QString newName = 
-       LightApp_NameDlg::getName(getApp()->desktop(), nameAttr->Value().c_str());
+          LightApp_NameDlg::getName(getApp()->desktop(), nameAttr->Value().c_str());
       if (!newName.isEmpty()) {
-       nameAttr->SetValue(newName.toLatin1().constData());
-       aListIO.First()->setName(newName.toLatin1().constData());
+        nameAttr->SetValue(newName.toLatin1().constData());
+        aListIO.First()->setName(newName.toLatin1().constData());
       }
     }
     
@@ -1548,6 +1289,15 @@ void PVGUI_Module::onDelete()
   }
 }
 
+/*!
+ * \brief Slot called everytime the Python trace is pushed onto the CORBA engine.
+ */
+void PVGUI_Module::onPushTraceTimer()
+{
+  //MESSAGE("onPushTraceTimer(): Pushing trace to engine...");
+  GetEngine()->PutPythonTraceStringToEngine(getTraceString().toStdString().c_str());
+}
+
 /*!
   \brief Discover help project files from the resources.
   \return name of the help file. 
@@ -1604,7 +1354,7 @@ void PVGUI_Module::loadSelectedState(bool toClear)
       QString stringValue(aStringAttr->Value().c_str());
 
       if (QFile::exists(stringValue)) {
-       fileName = stringValue;
+          fileName = stringValue;
       }
     }
   }
@@ -1618,29 +1368,11 @@ void PVGUI_Module::loadSelectedState(bool toClear)
   } 
   else {
     SUIT_MessageBox::critical(getApp()->desktop(),
-                             tr("ERR_ERROR"),
-                             tr("ERR_STATE_CANNOT_BE_RESTORED"));
-  }
-}
-
-void PVGUI_Module::onRepresentationChanged(pqRepresentation*) {
-
-
-  //rnv: to fix the issue "21712: [CEA 581] Preference to display legend by default"
-  //     find the pqDisplayColorWidget instances and connect the variableChanged SIGNAL on the 
-  //     onVariableChanged slot of this class. This connection needs to change visibility 
-  //     of the "Colored Legend" after change the "Color By" array.
-  QList<pqDisplayColorWidget*> aWidget = getApp()->desktop()->findChildren<pqDisplayColorWidget*>();
-  
-  for (int i = 0; i < aWidget.size() ; i++ ) {
-    if( aWidget[i] ) {
-      connect( aWidget[i], SIGNAL ( variableChanged ( pqVariableType, const QString ) ), 
-              this, SLOT(onVariableChanged( pqVariableType, const QString) ), Qt::UniqueConnection );
-    }    
+                              tr("ERR_ERROR"),
+                              tr("ERR_STATE_CANNOT_BE_RESTORED"));
   }
 }
 
-
 /*!
   \fn CAM_Module* createModule();
   \brief Export module instance (factory function).
@@ -1657,15 +1389,10 @@ extern "C" {
 
   bool flag = false;
   PVGUI_EXPORT CAM_Module* createModule() {
-    if(!flag) {
-        vtkEDFHelperInit();
-        flag = true;
-    }      
     return new PVGUI_Module();
   }
   
   PVGUI_EXPORT char* getModuleVersion() {
     return (char*)PARAVIS_VERSION_STR;
   }
-         
 }