Salome HOME
0023124: EDF 11219 GEOM: Ray tracing in the OCC viewer
[modules/gui.git] / src / LightApp / LightApp_Application.cxx
index 4c0c1fe199078939297cdf8dbac873f4ed8cb7dd..3093f12fca6760f089daac4080e26e01de75965e 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2015  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -6,7 +6,7 @@
 // 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
@@ -24,7 +24,7 @@
 // Created:   6/20/2005 18:39:45 PM
 // Author:    Natalia Donis
 
-#ifdef WNT
+#ifdef WIN32
 // E.A. : On windows with python 2.6, there is a conflict
 // E.A. : between pymath.h and Standard_math.h which define
 // E.A. : some same symbols : acosh, asinh, ...
@@ -42,6 +42,8 @@
 #include "LightApp_Application.h"
 #include "LightApp_Module.h"
 #include "LightApp_DataModel.h"
+#include "LightApp_DataOwner.h"
+#include "LightApp_Displayer.h"
 #include "LightApp_Study.h"
 #include "LightApp_Preferences.h"
 #include "LightApp_PreferencesDlg.h"
@@ -56,9 +58,7 @@
 #include "LightApp_WgViewModel.h"
 #include "LightApp_FullScreenHelper.h"
 
-
 #include <GUI_version.h>
-#include <Basics_OCCTVersion.hxx>
 
 #include <SALOME_Event.h>
 
@@ -91,7 +91,6 @@
 #include <QtxSearchTool.h>
 #include <QtxWorkstack.h>
 #include <QtxMap.h>
-#include <QtxWebBrowser.h>
 
 #include <LogWindow.h>
 
 #ifndef DISABLE_OCCVIEWER
   #include <OCCViewer_ViewManager.h>
   #include <OCCViewer_ViewFrame.h>
+  #include <OCCViewer_ViewPort3d.h>
 #ifndef DISABLE_SALOMEOBJECT
   #include <SOCC_ViewModel.h>
 #else
   #include <QxScene_ViewWindow.h>
 #endif
 
+#ifndef DISABLE_GRAPHICSVIEW
+  #include "GraphicsView_Viewer.h"
+  #include "GraphicsView_ViewManager.h"
+  #include "LightApp_GVSelector.h"
+#endif
+
+#ifndef DISABLE_PVVIEWER
+  #include "PVViewer_ViewManager.h"
+  #include "PVViewer_ViewWindow.h"
+  #include "PVViewer_ViewModel.h"
+#endif
+
+#ifndef DISABLE_PYVIEWER
+  #include <PyViewer_ViewManager.h>
+  #include <PyViewer_ViewModel.h>
+  #include <PyViewer_ViewWindow.h>
+#endif
+
 
 #define VISIBILITY_COLUMN_WIDTH 25
 
@@ -210,7 +228,6 @@ static const char* imageEmptyIcon[] = {
 
 int LightApp_Application::lastStudyId = 0;
 
-
 // Markers used to parse array with dockable windows and toolbars state.
 // For more details please see the qdockarealayout.cpp && qtoolbararealayout.cpp
 // in the Qt source code.
@@ -301,22 +318,11 @@ LightApp_Application::LightApp_Application()
   myAutoSaveTimer->setSingleShot( true );
   connect( myAutoSaveTimer, SIGNAL( timeout() ), this, SLOT( onSaveDoc() ) );
 
+  //connect( this, SIGNAL( moving() ), this, SLOT( onMoved() ) );
+
   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
   QPixmap aLogo = aResMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
 
-  QtxWebBrowser::setResourceManager( aResMgr );
-  QtxWebBrowser::setData("browser:icon",          aResMgr->loadPixmap( "LightApp", tr( "BROWSER_ICON" ) ) );
-  QtxWebBrowser::setData("browser:title",         tr( "BROWSER_TITLE" ) );
-  QtxWebBrowser::setData("toolbar:title",         tr( "BROWSER_TOOLBAR_TITLE" ) );
-  QtxWebBrowser::setData("menu:file:title",       tr( "BROWSER_FILEMENU" ) );
-  QtxWebBrowser::setData("action:close:title",    tr( "BROWSER_CLOSE" ) );
-  QtxWebBrowser::setData("action:close:icon",     aResMgr->loadPixmap( "LightApp", tr( "BROWSER_CLOSE_ICON" ) ) );
-  QtxWebBrowser::setData("action:back:title",     tr( "BROWSER_BACK" ) );
-  QtxWebBrowser::setData("action:forward:title",  tr( "BROWSER_FORWARD" ) );
-  QtxWebBrowser::setData("action:find:title",     tr( "BROWSER_FIND" ) );
-  QtxWebBrowser::setData("action:findnext:title", tr( "BROWSER_FINDNEXT" ) );
-  QtxWebBrowser::setData("action:findprev:title", tr( "BROWSER_FINDPREV" ) );
-
   desktop()->setWindowIcon( aLogo );
   desktop()->setDockableMenuBar( false );
   desktop()->setDockableStatusBar( false );
@@ -372,6 +378,11 @@ LightApp_Application::LightApp_Application()
 #endif
 
   connect( mySelMgr, SIGNAL( selectionChanged() ), this, SLOT( onSelection() ) );
+  connect( desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
+           this,      SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
+  connect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
+           this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ), Qt::UniqueConnection );
+
 
   // Set existing font for the python console in resources
   if( !aResMgr->hasValue( "PyConsole", "font" ) )
@@ -417,6 +428,7 @@ void LightApp_Application::start()
 
   updateWindows();
   updateViewManagers();
+  updateCommandsStatus();
 
   putInfo( "" );
   desktop()->statusBar()->showMessage( "" );
@@ -424,6 +436,15 @@ void LightApp_Application::start()
   LightApp_EventFilter::Init();
 }
 
+/*!Closeapplication.*/
+void LightApp_Application::closeApplication()
+{
+  QProcess::startDetached( "HelpBrowser",
+                           QStringList() << QString( "--remove=%1" ).arg( QApplication::instance()->applicationPid() ) );
+
+  CAM_Application::closeApplication();
+}
+
 /*!Gets application name.*/
 QString LightApp_Application::applicationName() const
 {
@@ -494,6 +515,11 @@ bool LightApp_Application::activateModule( const QString& modName )
   updateWindows();
   updateViewManagers();
 
+  if ( activeStudy() && activeStudy()->root() && objectBrowser() ) {
+    if ( objectBrowser()->root() != activeStudy()->root() ) 
+      objectBrowser()->setRoot( activeStudy()->root() );
+    updateObjectBrowser( true );
+  }
   return true;
 }
 
@@ -681,7 +707,7 @@ void LightApp_Application::createActions()
       if ( icon.isNull() )
       {
         icon = modIcon;
-        INFOS ( "****************************************************************" << std::endl
+        INFOS ( "\n****************************************************************" << std::endl
                 <<  "*    Icon for " << (*it).toLatin1().constData()
                 << " not found. Using the default one." << std::endl
                 << "****************************************************************" << std::endl );
@@ -728,6 +754,15 @@ void LightApp_Application::createActions()
 #ifndef DISABLE_QXGRAPHVIEWER
   createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S );
 #endif
+#ifndef DISABLE_GRAPHICSVIEW
+  createActionForViewer( NewGraphicsViewId, newWinMenu, QString::number( 5 ), Qt::ALT+Qt::Key_C );
+#endif
+#ifndef DISABLE_PVVIEWER
+  createActionForViewer( NewPVViewId, newWinMenu, QString::number( 6 ), Qt::ALT+Qt::Key_A );
+#endif
+#ifndef DISABLE_PYVIEWER
+  createActionForViewer( NewPyViewerId, newWinMenu, QString::number( 7 ), Qt::ALT+Qt::Key_Y );
+#endif
 
   createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
                 Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
@@ -753,7 +788,8 @@ void LightApp_Application::createActions()
   createMenu( StyleId, viewMenu, 20, -1 );
   createMenu( FullScreenId, viewMenu, 20, -1 );
 
-  int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ) );
+  int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ),    // title (language-dependant)
+                           QString( "SalomeModules" ) );   // name (language-independant)
   createTool( ModulesListId, modTBar );
 }
 
@@ -841,6 +877,21 @@ void LightApp_Application::onNewWindow()
   case NewQxSceneViewId:
     type = QxScene_Viewer::Type();
     break;
+#endif
+#ifndef DISABLE_GRAPHICSVIEW
+  case NewGraphicsViewId:
+    type = GraphicsView_Viewer::Type();
+    break;
+#endif
+#ifndef DISABLE_PVVIEWER
+  case NewPVViewId:
+    type = PVViewer_Viewer::Type();
+    break;
+#endif
+#ifndef DISABLE_PYVIEWER
+  case NewPyViewerId:
+    type = PyViewer_Viewer::Type();
+    break;
 #endif
   }
 
@@ -853,10 +904,14 @@ void LightApp_Application::onNewWindow()
 */
 void LightApp_Application::onNewDoc()
 {
-  //asl: fix for 0020515
-  if ( activeStudy() )
-    saveDockWindowsState();
+#ifdef SINGLE_DESKTOP
+  if ( !checkExistingDoc() )
+    return;
+#endif
 
+  //asl: fix for 0020515
+  saveDockWindowsState();
+  
   CAM_Application::onNewDoc();
 }
 
@@ -866,10 +921,14 @@ void LightApp_Application::onNewDoc()
 void LightApp_Application::onOpenDoc()
 {
   SUIT_Study* study = activeStudy();
-  saveDockWindowsState();
-
+  
+#ifdef SINGLE_DESKTOP
+  if ( !checkExistingDoc() )
+    return;
+#endif
+  
   CAM_Application::onOpenDoc();
-
+  
   if ( !study ) // new study will be create in THIS application
   {
     updateWindows();
@@ -883,9 +942,16 @@ void LightApp_Application::onOpenDoc()
 */
 bool LightApp_Application::onOpenDoc( const QString& aName )
 {
+#ifdef SINGLE_DESKTOP
+  if ( !checkExistingDoc() )
+    return false;
+#endif
+
+  saveDockWindowsState();
+
   // We should take mru action first because this application instance can be deleted later.
   QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
-
+  
   bool res = CAM_Application::onOpenDoc( aName );
 
   if ( mru )
@@ -965,6 +1031,24 @@ void LightApp_Application::updateCommandsStatus()
   if( a )
     a->setEnabled( activeStudy() );
 #endif
+
+#ifndef DISABLE_GRAPHICSVIEW
+  a = action( NewGraphicsViewId );
+  if( a )
+    a->setEnabled( activeStudy() );
+#endif
+
+#ifndef DISABLE_PVVIEWER
+  a = action( NewPVViewId );
+  if( a )
+    a->setEnabled( activeStudy() );
+#endif
+
+#ifndef DISABLE_PYVIEWER
+  a = action( NewPyViewerId );
+  if( a )
+    a->setEnabled( activeStudy() );
+#endif
 }
 
 /*!
@@ -1055,13 +1139,11 @@ void LightApp_Application::onHelpContentsModule()
     }
   }
   else {
-#ifdef WIN32
-    // On Win32 platform QWebKit of the Qt 4.6.3 hang up in case 'file://' protocol 
-    // is defined. On Linux platform QWebKit doesn't work correctly without 'file://' protocol.
-    QtxWebBrowser::loadUrl(helpFile);
-#else
-    QtxWebBrowser::loadUrl(QString("file://%1").arg(helpFile));
-#endif
+    QStringList parameters;
+    parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
+    parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
+    parameters << helpFile;
+    QProcess::startDetached( "HelpBrowser", parameters );
   }
 }
 
@@ -1128,14 +1210,11 @@ void LightApp_Application::onHelpContextModule( const QString& theComponentName,
     }
   }
   else {
-#ifdef WIN32
-    // On Win32 platform QWebKit of the Qt 4.6.3 hang up in case 'file://' protocol 
-    // is defined. On Linux platform QWebKit doesn't work correctly without 'file://' protocol.
-    QtxWebBrowser::loadUrl(helpFile, context);
-#else
-    QtxWebBrowser::loadUrl(QString("file://%1").arg(helpFile), context);
-#endif
-    
+    QStringList parameters;
+    parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
+    parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
+    parameters << QString( "%1#%2" ).arg( helpFile ).arg( context );
+    QProcess::startDetached( "HelpBrowser", parameters );
   }
 }
 
@@ -1153,72 +1232,11 @@ void LightApp_Application::onSelectionChanged()
 }
 
 /*!
-  Adds window to application.
-  \param wid - QWidget
-  \param flag - key for window
-  \param studyId - study id
-  Flag used how identificator of window in windows list.
+  SLOT: Performs some actions when dockable windows are triggered
 */
-/*
-void LightApp_Application::addWindow( QWidget* wid, const int flag, const int studyId )
+void LightApp_Application::onDockWindowVisibilityChanged( bool )
 {
-  if ( !wid )
-    return;
-
-  int sId = studyId;
-  if ( sId < 0 )
-  {
-    if ( !activeStudy() )
-      return;
-    else
-      sId = activeStudy()->id();
-  }
-
-  if ( !myWindows.contains( flag ) )
-  {
-    QMap<int, int> winMap;
-    currentWindows( winMap );
-
-    LightApp_WidgetContainer* newWC = new LightApp_WidgetContainer( flag, desktop() );
-    connect( newWC, SIGNAL(  destroyed ( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
-    // asv: connecting a slot for storing visibility flag of a window
-    connect( newWC, SIGNAL( visibilityChanged ( bool ) ), SLOT( onVisibilityChanged( bool ) ) );
-    myWindows.insert( flag, newWC );
-    if ( winMap.contains( flag ) ) {
-      //desktop()->removeDockWidget( myWindows[flag] );
-      desktop()->addDockWidget( (Qt::DockWidgetArea)winMap[flag], myWindows[flag] );
-    }
-
-    //myWindows[flag]->setResizeEnabled( true );
-    myWindows[flag]->setFeatures( QDockWidget::AllDockWidgetFeatures );
-    myWindows[flag]->setObjectName( QString( "dock_window_%1" ).arg( flag ) );
-    //myWindows[flag]->setFixedExtentWidth( wid->width() );
-    //myWindows[flag]->setFixedExtentHeight( wid->height() );
-    myWindows[flag]->resize( wid->width(), wid->height() );
-  }
-
-  QFont f;
-#ifndef DISABLE_PYCONSOLE
-  if( wid->inherits( "PyConsole_Console" ) )
-  {
-    if( resourceMgr()->hasValue( "PyConsole", "font" ) )
-      f = resourceMgr()->fontValue( "PyConsole", "font" );
-    else
-      {
-        f = ( ( PyConsole_Console* )wid )->font();
-        resourceMgr()->setValue( "PyConsole", "font", f );
-      }
-  }
-  else
-#endif
-    f = wid->font();
-
-  myWindows[flag]->insert( sId, wid );
-  wid->setFont( f );
-
-  setWindowShown( flag, !myWindows[flag]->isEmpty() );
 }
-*/
 
 QWidget* LightApp_Application::dockWindow( const int id ) const
 {
@@ -1257,8 +1275,12 @@ void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
   connect( dock, SIGNAL(  destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
 
   dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
-  dock->setObjectName( QString( "window_%1" ).arg( id ) );
+  dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) : 
+                      QString( "%1Dock" ).arg( wid->objectName() ) );
   dock->setWidget( wid );
+  dock->toggleViewAction()->setData( QVariant( wid->objectName() ) );
+  connect( dock->toggleViewAction(), SIGNAL( triggered( bool ) ),
+           this, SLOT( onDockWindowVisibilityChanged( bool ) ) );
 
   QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
   if ( !accel.isEmpty() )
@@ -1412,7 +1434,7 @@ SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, c
     if ( !aVM->getActiveView() )
       aVM->createView();
     else
-      aVM->getActiveView()->setFocus();
+      desktop()->setActiveWindow( aVM->getActiveView() );
   }
   else if ( create )
     aVM = createViewManager( vmType );
@@ -1466,6 +1488,30 @@ SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType
     //QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
   }
 #endif
+#ifndef DISABLE_GRAPHICSVIEW
+  if( vmType == GraphicsView_Viewer::Type() )
+  {
+    viewMgr = new GraphicsView_ViewManager( activeStudy(), desktop() );
+    new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr );
+  }
+#endif
+#ifndef DISABLE_PVVIEWER
+  if( vmType == PVViewer_Viewer::Type() )
+  {
+    if ( viewMgr = dynamic_cast<PVViewer_ViewManager*>( getViewManager( vmType, false ) ) ) {
+      viewMgr->getActiveView()->setFocus();
+      return 0;
+    } else {
+      viewMgr = new PVViewer_ViewManager( activeStudy(), desktop(), logWindow() );
+    }
+  }
+#endif
+#ifndef DISABLE_PYVIEWER
+  if( vmType == PyViewer_Viewer::Type() )
+  {
+    viewMgr = new PyViewer_ViewManager( activeStudy(), desktop() );
+  }
+#endif
 #ifndef DISABLE_OCCVIEWER
   if( vmType == OCCViewer_Viewer::Type() )
   {
@@ -1488,9 +1534,28 @@ SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType
     vm->setTrihedronSize(  resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
                            resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
     vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
+    vm->setProjectionType( resMgr->integerValue( "OCCViewer", "projection_mode", vm->projectionType() ) );
+  #if OCC_VERSION_LARGE > 0x06090000
+    vm->setStereoType( resMgr->integerValue( "OCCViewer", "stereo_type", vm->stereoType() ) );
+    vm->setAnaglyphFilter( resMgr->integerValue( "OCCViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
+    vm->setStereographicFocus( resMgr->integerValue( "OCCViewer", "focus_type", vm->stereographicFocusType() ),
+                               resMgr->doubleValue( "OCCViewer", "focus_value", vm->stereographicFocusValue() ));
+    vm->setInterocularDistance( resMgr->integerValue( "OCCViewer", "iod_type", vm->interocularDistanceType() ),
+                                resMgr->doubleValue( "OCCViewer", "iod_value", vm->interocularDistanceValue() ));
+
+    vm->setReverseStereo( resMgr->booleanValue( "OCCViewer", "reverse_stereo", vm->isReverseStereo() ) );
+    vm->setVSync( resMgr->booleanValue( "OCCViewer", "enable_vsync", vm->isVSync() ) );
+    vm->setQuadBufferSupport( resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
+  #endif
     vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
     vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
     vm->enableSelection(    resMgr->booleanValue( "OCCViewer", "enable_selection",    vm->isSelectionEnabled() ) );
+    vm->setClippingColor( resMgr->colorValue( "OCCViewer", "clipping_color", vm->clippingColor() ) );
+    vm->setClippingTextureParams( resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture", vm->isDefaultTextureUsed() ),
+                                  resMgr->stringValue( "OCCViewer", "clipping_texture", vm->clippingTexture() ),
+                                  resMgr->booleanValue( "OCCViewer", "clipping_modulate", vm->isTextureModulated() ),
+                                  resMgr->doubleValue( "OCCViewer", "clipping_scale", vm->clippingTextureScale() ) );
+
 
     viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
     new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
@@ -1509,6 +1574,9 @@ SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType
     if( vm )
     {
       vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
+      vm->setStereoType( resMgr->integerValue( "VTKViewer", "stereo_type", vm->stereoType() ) );
+      vm->setAnaglyphFilter( resMgr->integerValue( "VTKViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
+      vm->setQuadBufferSupport( resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
       vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
       vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
                             resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
@@ -1569,6 +1637,31 @@ SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType
   return vm;
 }
 
+SUIT_ViewManager* LightApp_Application::createViewManager( SUIT_ViewModel* theModel )
+{
+  SUIT_ResourceMgr* resMgr = resourceMgr();
+
+  SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
+                                               desktop(),
+                                               theModel );
+
+  QString vmType = vm->getType();
+
+  vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
+
+  addViewManager( vm );
+  SUIT_ViewWindow* vw = vm->createViewWindow();
+  if ( vw && desktop() ) {
+    vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
+    vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
+  }
+
+  if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
+    myUserWmTypes << vmType;
+
+  return vm;
+}
+
 /*!
   SLOT: Removes view manager from application
 */
@@ -1601,6 +1694,11 @@ void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
 
   if ( objectBrowser() )
     objectBrowser()->openLevels();
+
+#ifndef DISABLE_PYCONSOLE
+  if( pythonConsole() )
+    getPyInterp()->initStudy();
+#endif
 }
 
 /*!
@@ -1628,6 +1726,11 @@ void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
   if ( objectBrowser() )
     objectBrowser()->openLevels();
 
+#ifndef DISABLE_PYCONSOLE
+  if( pythonConsole() )
+    getPyInterp()->initStudy();
+#endif
+
   emit studyOpened();
 }
 
@@ -1644,6 +1747,11 @@ void LightApp_Application::onStudySaved( SUIT_Study* s )
 /*!Protected SLOT. On study closed.*/
 void LightApp_Application::onStudyClosed( SUIT_Study* s )
 {
+  /*
+  disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
+             this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
+  */
+
   // stop auto-save timer
   myAutoSaveTimer->stop();
 
@@ -1737,6 +1845,29 @@ void LightApp_Application::onRefresh()
   updateObjectBrowser( true );
 }
 
+/*!Private SLOT. Update actions after rename object.*/
+void LightApp_Application::onRenamed()
+{
+  activeStudy()->Modified();
+  updateActions();
+}
+
+// IMN 08.07.2015 : issue 002556: Some stereo outputs are affected by window position.
+// To prevent reversion the window should be either aligned during movement and resize.
+/*!Private SLOT. Update actions after rename object.*/
+/*void LightApp_Application::onMoved()
+{
+  OCCViewer_ViewManager* viewMgr = 0;
+  viewMgr = dynamic_cast<OCCViewer_ViewManager*>( getViewManager( OCCViewer_Viewer::Type(), false ) );
+  if (viewMgr) {
+    OCCViewer_ViewWindow* view = 0;
+    view = dynamic_cast<OCCViewer_ViewWindow*>( viewMgr->getActiveView() );
+    if (view) {
+      view->getViewPort()->repaintViewAfterMove();
+    }
+  }
+}
+*/
 /*!Private SLOT. Support drag-and-drop operation.*/
 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
 {
@@ -1801,6 +1932,11 @@ void LightApp_Application::onPreferenceChanged( QString& modName, QString& secti
 /*!Remove all windows from study.*/
 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
 {
+  saveDockWindowsState();
+
+  if ( SUIT_DataBrowser* ob = objectBrowser() )
+    ob->setModel(0);
+
   CAM_Application::beforeCloseDoc( s );
 }
 
@@ -1841,6 +1977,7 @@ QWidget* LightApp_Application::createWindow( const int flag )
   if ( flag == WT_ObjectBrowser )
   {
     SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
+    ob->setObjectName( "objectBrowser" );
     ob->setSortMenuEnabled( true );
     ob->setAutoUpdate( true );
     if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
@@ -1861,6 +1998,9 @@ QWidget* LightApp_Application::createWindow( const int flag )
     if ( proxyModel ) {
       connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
                this,       SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
+      connect( proxyModel, SIGNAL( renamed( SUIT_DataObject* ) ),
+               this,       SLOT( onRenamed( ) ) );
+
     }
 
     // temporary commented
@@ -1883,7 +2023,8 @@ QWidget* LightApp_Application::createWindow( const int flag )
 #ifndef DISABLE_PYCONSOLE
   else  if ( flag == WT_PyConsole )
   {
-    PyConsole_Console* pyCons = new PyConsole_EnhConsole( desktop(),new LightApp_PyInterp());
+    PyConsole_Console* pyCons = new PyConsole_EnhConsole( desktop(), getPyInterp() );
+    pyCons->setObjectName( "pythonConsole" );
     pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
     pyCons->setFont(resourceMgr()->fontValue( "PyConsole", "font" ));
     pyCons->setIsShowBanner(resourceMgr()->booleanValue( "PyConsole", "show_banner", true ));
@@ -1896,6 +2037,7 @@ QWidget* LightApp_Application::createWindow( const int flag )
   else if ( flag == WT_LogWindow )
   {
     LogWindow* logWin = new LogWindow( desktop() );
+    logWin->setObjectName( "logWindow" );
     logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
     logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
     wid = logWin;
@@ -1910,11 +2052,13 @@ QWidget* LightApp_Application::createWindow( const int flag )
  */
 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
 {
-  aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
 #ifndef DISABLE_PYCONSOLE
   aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
 #endif
-  //  aMap.insert( WT_LogWindow, Qt::DockBottom );
+  if ( activeStudy() ) {
+    aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
+    //  aMap.insert( WT_LogWindow, Qt::DockBottom );
+  }
 }
 
 /*!Default view managers*/
@@ -1944,7 +2088,9 @@ LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
   that->myPrefs = _prefs_;
 
   connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
-           this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ) );
+           this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ), Qt::UniqueConnection );
+  connect( myPrefs, SIGNAL( resetToDefaults() ),
+           this, SIGNAL( preferenceResetToDefaults() ), Qt::UniqueConnection );
 
   if ( !crt )
     return myPrefs;
@@ -2066,6 +2212,11 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref )
   }
   pref->setItemProperty( "strings", aLangs, curLang );
   pref->setItemProperty( "icons",   aIcons, curLang );
+  pref->setItemProperty( "restart",  true, curLang );
+
+  int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup,
+                                          LightApp_Preferences::Bool, "language", "locale" );
+  pref->setItemProperty( "restart",  true, curLocale );
   // ... "Language" group <<end>>
 
   // ... "Look and feel" group <<start>>
@@ -2138,6 +2289,15 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref )
   pref->setItemProperty( "strings", aValuesList,   mruLinkType );
   pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
   // ... "MRU" preferences group <<end>>
+
+  // ... "Full-screen" group <<start>>
+  int fullScreenGroup = pref->addPreference( tr( "PREF_GROUP_FULL_SCREEN" ), genTab );
+  pref->setItemProperty( "columns", 2, fullScreenGroup );
+  // .... -> automatic hiding toolbars
+  pref->addPreference( tr( "PREF_FULL_SCREEN_AUTO" ), fullScreenGroup,
+                      LightApp_Preferences::Bool, "OCCViewer", "automatic_hiding" );
+  // ... "Full-screen" group <<end>>
+
   // .. "General" preferences tab <<end>>
 
   // .. "3D viewer" group <<start>>
@@ -2152,16 +2312,14 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref )
   pref->setItemProperty( "strings", aValuesList,   vtkStyleMode );
   pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
   // ... -> zooming mode
-  #if OCC_VERSION_LARGE > 0x0603000A // available only with OCC-6.3-sp11 and higher version
-    int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
-                                                   LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
-    aValuesList.clear();
-    anIndicesList.clear();
-    aValuesList   << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
-    anIndicesList << 0                            << 1;
-    pref->setItemProperty( "strings", aValuesList,   occZoomingStyleMode );
-    pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
-  #endif
+  int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
+                                                 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
+  aValuesList.clear();
+  anIndicesList.clear();
+  aValuesList   << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
+  anIndicesList << 0                            << 1;
+  pref->setItemProperty( "strings", aValuesList,   occZoomingStyleMode );
+  pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
   // ... "Trihedron" group <<start>>
   int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
   pref->setItemProperty( "columns", 2, occTriGroup );
@@ -2177,19 +2335,104 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref )
   // ... "Trihedron" group <<end>>
   // .. "3D viewer" group <<end>>
 
+  QString formats;
+  int bgId;
+#ifndef DISABLE_OCCVIEWER
   // .. "OCC viewer" group <<start>>
   int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
 
+  // .... -> Projection mode
+  int occProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), occGroup,
+                                         LightApp_Preferences::Selector, "OCCViewer", "projection_mode" );
+  aValuesList.clear();
+  anIndicesList.clear();
+  aValuesList   << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
+  anIndicesList << 0                       << 1;
+  pref->setItemProperty( "strings", aValuesList,   occProjMode );
+  pref->setItemProperty( "indexes", anIndicesList, occProjMode );
+#if OCC_VERSION_LARGE > 0x06090000
+  // .... -> Stereo group
+  int stereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), occGroup);
+  pref->setItemProperty( "columns", 2, stereoGroup );
+  // .... -> Stereo type
+  int stereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), stereoGroup,
+                                            LightApp_Preferences::Selector, "OCCViewer", "stereo_type" );
+  aValuesList.clear();
+  anIndicesList.clear();
+  idList.clear();
+  OCCViewer_Viewer::stereoData( aValuesList, idList);
+  foreach( int gid, idList ) anIndicesList << gid;
+  pref->setItemProperty( "strings", aValuesList,   stereoType );
+  pref->setItemProperty( "indexes", anIndicesList, stereoType );
+
+  // .... -> Anaglyph filter
+  int anaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), stereoGroup,
+                                            LightApp_Preferences::Selector, "OCCViewer", "anaglyph_filter" );
+  aValuesList.clear();
+  anIndicesList.clear();
+  aValuesList   << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
+  anIndicesList << 0                            << 1                               << 2;
+
+  pref->setItemProperty( "strings", aValuesList,   anaglyphFilter );
+  pref->setItemProperty( "indexes", anIndicesList, anaglyphFilter );
+
+  // .... -> Convergence distance type
+  int occFocusType = pref->addPreference( tr( "PREF_FOCUS_TYPE" ), stereoGroup,
+                                           LightApp_Preferences::Selector, "OCCViewer", "focus_type" );
+  aValuesList.clear();
+  anIndicesList.clear();
+  aValuesList   << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
+  anIndicesList << 0                   << 1;
+  pref->setItemProperty( "strings", aValuesList,   occFocusType );
+  pref->setItemProperty( "indexes", anIndicesList, occFocusType );
+
+  // .... -> Stereographic focus value
+  int focusValue = pref->addPreference( tr( "PREF_FOCUS_VALUE" ), stereoGroup,
+               LightApp_Preferences::DblSpin, "OCCViewer", "focus_value" );
+  pref->setItemProperty( "precision", 3, focusValue );
+  pref->setItemProperty( "min", 1.0E-03, focusValue );
+  pref->setItemProperty( "max", 1.0E03, focusValue );
+  pref->setItemProperty( "step", 0.05, focusValue );
+
+  // .... -> IOD type
+  int occIODType = pref->addPreference( tr( "PREF_IOD_TYPE" ), stereoGroup,
+                                           LightApp_Preferences::Selector, "OCCViewer", "iod_type" );
+  aValuesList.clear();
+  anIndicesList.clear();
+  aValuesList   << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
+  anIndicesList << 0                   << 1;
+  pref->setItemProperty( "strings", aValuesList,   occIODType );
+  pref->setItemProperty( "indexes", anIndicesList, occIODType );
+
+  // .... -> Interocular distance (IOD) value
+  int IODValue = pref->addPreference( tr( "PREF_IOD_VALUE" ), stereoGroup,
+                                      LightApp_Preferences::DblSpin, "OCCViewer", "iod_value" );
+  pref->setItemProperty( "precision", 3, IODValue );
+  pref->setItemProperty( "min", 1.0E-03, IODValue );
+  pref->setItemProperty( "max", 1.0E03, IODValue );
+  pref->setItemProperty( "step", 0.05, IODValue );
+
+  // .... -> Reverse stereo
+  pref->addPreference( tr( "PREF_REVERSE_STEREO" ), stereoGroup,
+                      LightApp_Preferences::Bool, "OCCViewer", "reverse_stereo" );
+  // .... -> Enable V-Sync
+  pref->addPreference( tr( "PREF_ENABLE_VSYNC" ), stereoGroup,
+                      LightApp_Preferences::Bool, "OCCViewer", "enable_vsync" );
+  // .... -> Enable quad-buffer support
+  pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), stereoGroup,
+                      LightApp_Preferences::Bool, "OCCViewer", "enable_quad_buffer_support" );
+#endif
   // ... "Background" group <<start>>
   int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
   //  pref->setItemProperty( "columns", 2, bgGroup );
   aValuesList.clear();
   anIndicesList.clear();
   txtList.clear();
-  QString formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
+  idList.clear();
+  formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
   foreach( int gid, idList ) anIndicesList << gid;
   // .... -> 3D viewer background
-  int bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
+  bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
                                   LightApp_Preferences::Background, "OCCViewer", "background" );
   pref->setItemProperty( "gradient_names", aValuesList, bgId );
   pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
@@ -2246,13 +2489,97 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref )
                       LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
   // ... "Selection" group <<end>>
 
+  // ... "Clipping" group <<start>>
+  int occClippingGroup = pref->addPreference( tr( "PREF_GROUP_CLIPPING" ), occGroup );
+  // .... -> clipping color
+  pref->addPreference( tr( "PREF_CLIPPING_COLOR" ), occClippingGroup,
+               LightApp_Preferences::Color, "OCCViewer", "clipping_color" );
+  int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame );
+  pref->setItemProperty( "columns", 2, texturePref );
+  // .... -> use default texture
+  pref->addPreference( tr( "PREF_CLIPPING_DEFAULT_TEXTURE" ), texturePref,
+               LightApp_Preferences::Bool, "OCCViewer", "clipping_use_default_texture" );
+  // .... -> clipping texture
+  int filePref = pref->addPreference( tr( "PREF_CLIPPING_TEXTURE" ), texturePref,
+               LightApp_Preferences::File, "OCCViewer", "clipping_texture" );
+  pref->setItemProperty( "path_filter", tr( "OCC_TEXTURE_FILES" ), filePref );
+  // .... -> modulate
+  pref->addPreference( tr( "PREF_CLIPPING_MODULATE" ), texturePref,
+               LightApp_Preferences::Bool, "OCCViewer", "clipping_modulate" );
+  // .... -> scale factor
+  int scaleFactor = pref->addPreference( tr( "PREF_CLIPPING_SCALE" ), texturePref,
+               LightApp_Preferences::DblSpin, "OCCViewer", "clipping_scale" );
+  pref->setItemProperty( "precision", 3, scaleFactor );
+  pref->setItemProperty( "min", 1.0E-03, scaleFactor );
+  pref->setItemProperty( "max", 1.0E03, scaleFactor );
+  pref->setItemProperty( "step", 0.1, scaleFactor );
+  // ... "Clipping" group <<end>>
+
+  // ... "Ray tracing" group <<start>>
+  int occRayTracingGroup = pref->addPreference( tr( "PREF_GROUP_RAY_TRACING" ), occGroup );
+  int rtPref = pref->addPreference( "", occRayTracingGroup, LightApp_Preferences::Frame );
+  pref->setItemProperty( "columns", 2, rtPref );
+  // .... -> depth
+  int rt_depth = pref->addPreference( tr( "PREF_RAY_TRACING_DEPTH" ), rtPref,
+               LightApp_Preferences::IntSpin, "OCCViewer", "rt_depth" );
+  pref->setItemProperty( "min", 1, rt_depth );
+  pref->setItemProperty( "max", 10, rt_depth );
+  pref->setItemProperty( "step", 1, rt_depth );
+  pref->addPreference( "", rtPref, LightApp_Preferences::Frame );
+  // .... -> specular reflections
+  pref->addPreference( tr( "PREF_RAY_TRACING_REFLECTION" ), rtPref,
+               LightApp_Preferences::Bool, "OCCViewer", "rt_reflection" );
+  // .... -> adaptive anti-aliasing
+  pref->addPreference( tr( "PREF_RAY_TRACING_ANTIALIASING" ), rtPref,
+               LightApp_Preferences::Bool, "OCCViewer", "rt_antialiasing" );
+  // .... -> shadows rendering
+  pref->addPreference( tr( "PREF_RAY_TRACING_SHADOW" ), rtPref,
+               LightApp_Preferences::Bool, "OCCViewer", "rt_shadow" );
+  // .... -> transparent shadow
+  pref->addPreference( tr( "PREF_RAY_TRACING_TRANS_SHADOW" ), rtPref,
+               LightApp_Preferences::Bool, "OCCViewer", "rt_trans_shadow" );
+  // ... "Ray tracing" group <<end>>
+
+  // ... "Light source" group <<start>>
+  int occLightGroup = pref->addPreference( tr( "PREF_GROUP_LIGHT" ), occGroup );
+  // .... -> light color
+  pref->addPreference( tr( "PREF_LIGHT_COLOR" ), occLightGroup,
+               LightApp_Preferences::Color, "OCCViewer", "light_color" );
+  int directionPref = pref->addPreference( "", occLightGroup, LightApp_Preferences::Frame );
+  pref->setItemProperty( "columns", 3, directionPref );
+  // .... -> light direction (dx component)
+  int light_dx = pref->addPreference( tr( "Dx" ), directionPref,
+               LightApp_Preferences::DblSpin, "OCCViewer", "light_dx" );
+  pref->setItemProperty( "precision", 2, light_dx );
+  pref->setItemProperty( "min", -1.0E03, light_dx );
+  pref->setItemProperty( "max", 1.0E03, light_dx );
+  pref->setItemProperty( "step", 0.1, light_dx );
+  // .... -> light direction (dy component)
+  int light_dy = pref->addPreference( tr( "Dy" ), directionPref,
+               LightApp_Preferences::DblSpin, "OCCViewer", "light_dy" );
+  pref->setItemProperty( "precision", 2, light_dy );
+  pref->setItemProperty( "min", -1.0E03, light_dy );
+  pref->setItemProperty( "max", 1.0E03, light_dy );
+  pref->setItemProperty( "step", 0.1, light_dy );
+  // .... -> light direction (dz component)
+  int light_dz = pref->addPreference( tr( "Dz" ), directionPref,
+               LightApp_Preferences::DblSpin, "OCCViewer", "light_dz" );
+  pref->setItemProperty( "precision", 2, light_dz );
+  pref->setItemProperty( "min", -1.0E03, light_dz );
+  pref->setItemProperty( "max", 1.0E03, light_dz );
+  pref->setItemProperty( "step", 0.1, light_dz );
+  // ... "Light source" group <<end>>
+
   // ... -> empty frame (for layout) <<start>>
   int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
   pref->setItemProperty( "margin",  0, occGen );
   pref->setItemProperty( "columns", 2, occGen );
   // ... -> empty frame (for layout) <<end>>
+
   // .. "OCC viewer" group <<end>>
+#endif
 
+#ifndef DISABLE_VTKVIEWER
   // .. "VTK viewer" group <<start>>
   int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
 
@@ -2268,11 +2595,43 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref )
   anIndicesList << 0                       << 1;
   pref->setItemProperty( "strings", aValuesList,   vtkProjMode );
   pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
+
+  // .... -> Stereo group
+  int vtkStereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), vtkGroup);
+  pref->setItemProperty( "columns", 2, vtkStereoGroup );
+  // .... -> Stereo type
+  int vtkStereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), vtkStereoGroup,
+                                           LightApp_Preferences::Selector, "VTKViewer", "stereo_type" );
+  aValuesList.clear();
+  anIndicesList.clear();
+  idList.clear();
+  SVTK_Viewer::stereoData( aValuesList, idList);
+  foreach( int gid, idList ) anIndicesList << gid;
+  pref->setItemProperty( "strings", aValuesList,   vtkStereoType );
+  pref->setItemProperty( "indexes", anIndicesList, vtkStereoType );
+  // .... -> Anaglyph filter
+  int vtkAnaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), vtkStereoGroup,
+                                               LightApp_Preferences::Selector, "VTKViewer", "anaglyph_filter" );
+  aValuesList.clear();
+  anIndicesList.clear();
+  aValuesList   << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
+  anIndicesList << 0                            << 1                               << 2;
+
+  pref->setItemProperty( "strings", aValuesList,   vtkAnaglyphFilter );
+  pref->setItemProperty( "indexes", anIndicesList, vtkAnaglyphFilter );
+
+  // .... -> Enable quad-buffer support
+  pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), vtkStereoGroup,
+                       LightApp_Preferences::Bool, "VTKViewer", "enable_quad_buffer_support" );
+
   // .... -> background
   aValuesList.clear();
   anIndicesList.clear();
   txtList.clear();
+  idList.clear();
+#ifndef DISABLE_SALOMEOBJECT
   formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
+#endif
   foreach( int gid, idList ) anIndicesList << gid;
   bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
                               LightApp_Preferences::Background, "VTKViewer", "background" );
@@ -2283,7 +2642,9 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref )
   pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
   pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
   pref->setItemProperty( "custom_enabled", false, bgId );
+#ifndef DISABLE_SALOMEOBJECT
   pref->setItemProperty( "image_formats", formats, bgId );
+#endif
   // .... -> speed increment
   int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
                                       LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
@@ -2389,27 +2750,24 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref )
   pref->setItemProperty( "step", 0.1, transPref );
   // ... -> group names sub-group <<end>>
   // .. "VTK viewer" group <<end>>
+#endif
 
   // .. "Plot2d viewer" group <<start>>
   int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
   //pref->setItemProperty( "columns", 2, plot2dGroup );
 
-  // ... -> show legend
-  pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dGroup,
-                       LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
-  // ... -> legend position
-  int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dGroup,
-                                            LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
-  aValuesList.clear();
-  anIndicesList.clear();
-  aValuesList   << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
-  anIndicesList << 0               << 1                << 2              << 3                ;
-  pref->setItemProperty( "strings", aValuesList,   legendPosition );
-  pref->setItemProperty( "indexes", anIndicesList, legendPosition );
-  // ... -> legend font
-  pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
-  // ... -> curve type
-  int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dGroup,
+  // ... -> background
+  pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
+                       LightApp_Preferences::Color, "Plot2d", "Background" );
+  // ... -> selection color
+  pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
+                       LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
+
+  // ... "Viewer" group <<start>>
+  int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup );
+
+  // .... -> curve type
+  int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup,
                                        LightApp_Preferences::Selector, "Plot2d", "CurveType" );
   aValuesList.clear();
   anIndicesList.clear();
@@ -2417,13 +2775,13 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref )
   anIndicesList << 0                 << 1                << 2                ;
   pref->setItemProperty( "strings", aValuesList,   curveType );
   pref->setItemProperty( "indexes", anIndicesList, curveType );
-  // ... -> marker size
-  int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dGroup,
+  // .... -> marker size
+  int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup,
                                         LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
   pref->setItemProperty( "min", 0, markerSize );
   pref->setItemProperty( "max", 100, markerSize );
-  // ... -> horizontal scaling mode
-  int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dGroup,
+  // .... -> horizontal scaling mode
+  int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup,
                                       LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
   aValuesList.clear();
   anIndicesList.clear();
@@ -2431,36 +2789,106 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref )
   anIndicesList << 0                 << 1                     ;
   pref->setItemProperty( "strings", aValuesList,   horScale );
   pref->setItemProperty( "indexes", anIndicesList, horScale );
-  // ... -> vertical scaling mode
-  int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dGroup,
+  // .... -> vertical scaling mode
+  int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup,
                                       LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
   pref->setItemProperty( "strings", aValuesList,   verScale );
   pref->setItemProperty( "indexes", anIndicesList, verScale );
-  // ... -> background
-  pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
-                       LightApp_Preferences::Color, "Plot2d", "Background" );
-  // ... -> font color
-  pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
-  // ... -> selection font color
-  pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
-  // ... -> selection color
-  pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
-                       LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
-  // ... -> errors/deviation colot
-  pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dGroup,
+
+  // .... -> errors/deviation colot
+  pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup,
                        LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
-  // ... -> deviation markers line size
-  int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dGroup,
+  // .... -> deviation markers line size
+  int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup,
                                         LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
   pref->setItemProperty( "min", 1, deviationMarkerLw );
   pref->setItemProperty( "max", 5, deviationMarkerLw );
-  // ... -> deviation markers tick mark size
-  int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dGroup,
+  // .... -> deviation markers tick mark size
+  int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup,
                                         LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
   pref->setItemProperty( "min", 1, deviationMarkerTs );
   pref->setItemProperty( "max", 5, deviationMarkerTs );
+  // .... "Viewer" group <<end>>
+
+  // ... "Legend" group <<start>>
+  int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup );
+
+  // .... -> show legend
+  pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup,
+                       LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
+  // .... -> legend position
+  int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup,
+                                            LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
+  aValuesList.clear();
+  anIndicesList.clear();
+  aValuesList   << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
+  anIndicesList << 0               << 1                << 2              << 3                ;
+  pref->setItemProperty( "strings", aValuesList,   legendPosition );
+  pref->setItemProperty( "indexes", anIndicesList, legendPosition );
+  // .... -> Symbol type
+  int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup,
+                                            LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" );
+  aValuesList.clear();
+  anIndicesList.clear();
+  aValuesList   << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE");
+  anIndicesList << 0                            << 1                        ;
+  pref->setItemProperty( "strings", aValuesList,   legendSymbolType );
+  pref->setItemProperty( "indexes", anIndicesList, legendSymbolType );
+  // .... -> legend font
+  pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
+  // ... -> font color
+  pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
+  // ... -> selection font color
+  pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
+  // ... "Legend" group <<end>>
+
   // .. "Plot2d viewer" group <<end>>
 
+  // .. "PyViewer" preferences tab <<start>>
+  int pyeditTab = pref->addPreference( tr( "PREF_TAB_PYEDITOR" ), salomeCat );
+  // ... "Font settings" group <<start>>
+  int pyFontGroup = pref->addPreference( tr( "PREF_GROUP_PY_FONT" ), pyeditTab );
+  pref->addPreference( tr( "PREF_PY_FONT" ), pyFontGroup,
+    LightApp_Preferences::Font, "PyEditor", "Font" );
+  // ... "Font settings" group <<end>>
+  // ... "Display settings" group <<start>>
+  int pyDispGroup = pref->addPreference( tr( "PREF_GROUP_PY_DISPLAY" ), pyeditTab );
+  pref->setItemProperty( "columns", 2, pyDispGroup );
+  // ... -> current line highlight
+  pref->addPreference( tr( "PREF_PY_CURRLINE_HIGHLIGHT" ), pyDispGroup,
+    LightApp_Preferences::Bool, "PyEditor", "HighlightCurrentLine" );
+  // ... -> text wrapping
+  pref->addPreference( tr( "PREF_PY_TEXT_WRAP" ), pyDispGroup,
+    LightApp_Preferences::Bool, "PyEditor", "TextWrapping" );
+  // ... -> center cursor on scroll
+  pref->addPreference( tr( "PREF_PY_CURSON_ON_SCROLL" ), pyDispGroup,
+    LightApp_Preferences::Bool, "PyEditor", "CenterCursorOnScroll" );
+  // ... -> line numbers area
+  pref->addPreference( tr( "PREF_PY_LINE_NUMBS_AREA" ), pyDispGroup,
+    LightApp_Preferences::Bool, "PyEditor", "LineNumberArea" );
+  // ... "Display settings" group <<end>>
+  // ... "Tab settings" group <<start>>
+  int pyTabGroup = pref->addPreference( tr( "PREF_GROUP_PY_TAB" ), pyeditTab );
+  pref->setItemProperty( "columns", 2, pyTabGroup );
+  // ... -> tab whitespaces
+  pref->addPreference( tr( "PREF_PY_TAB_WHITESPACES" ), pyTabGroup,
+    LightApp_Preferences::Bool, "PyEditor", "TabSpaceVisible" );
+  // ... -> tab size
+  pref->addPreference( tr( "PREF_PY_TAB_SIZE" ), pyTabGroup,
+    LightApp_Preferences::IntSpin, "PyEditor", "TabSize" );
+  // ... "Tab settings" group <<end>>
+  // ... "Vertical edge settings" group <<start>>
+  int pyVertEdgeGroup = pref->addPreference( tr( "PREF_GROUP_VERT_EDGE" ), pyeditTab );
+  pref->setItemProperty( "columns", 2, pyVertEdgeGroup );
+  // ... -> vertical edge
+  pref->addPreference( tr( "PREF_PY_VERT_EDGE" ), pyVertEdgeGroup,
+    LightApp_Preferences::Bool, "PyEditor", "VerticalEdge" );
+  // ... -> number of columns
+  pref->addPreference( tr( "PREF_PY_NUM_COLUMNS" ), pyVertEdgeGroup,
+    LightApp_Preferences::IntSpin, "PyEditor", "NumberColumns" );
+  // ... "Vertical edge settings" group <<end>>
+  // .. "PyEditor" preferences tab <<end>>
+
   // .. "Directories" preferences tab <<start>>
   int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
   // ... --> quick directories list
@@ -2691,35 +3119,235 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString
   }
 #endif
 
-  if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
+#ifndef DISABLE_OCCVIEWER
+  if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) )
   {
-    int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
+    QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) );
     QList<SUIT_ViewManager*> lst;
-#ifndef DISABLE_OCCVIEWER
     viewManagers( OCCViewer_Viewer::Type(), lst );
-    QListIterator<SUIT_ViewManager*> itOCC( lst );
-    while ( itOCC.hasNext() )
+    QListIterator<SUIT_ViewManager*> it( lst );
+    while ( it.hasNext() )
     {
-      SUIT_ViewModel* vm = itOCC.next()->getViewModel();
+      SUIT_ViewModel* vm = it.next()->getViewModel();
       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
         continue;
 
       OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
-      occVM->setZoomingStyle( mode );
+      occVM->setClippingColor( aColor );
     }
+  }
 #endif
-#ifndef DISABLE_VTKVIEWER
-#ifndef DISABLE_SALOMEOBJECT
-    viewManagers( SVTK_Viewer::Type(), lst );
-    QListIterator<SUIT_ViewManager*> itVTK( lst );
-    while ( itVTK.hasNext() )
-    {
-      SUIT_ViewModel* vm = itVTK.next()->getViewModel();
-      if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
-        continue;
 
-      SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
-      if( vtkVM ) vtkVM->setZoomingStyle( mode );
+#ifndef DISABLE_OCCVIEWER
+  if ( sec == QString( "OCCViewer" ) && ( param == QString( "clipping_use_default_texture" ) ||
+                                          param == QString( "clipping_texture" ) ||
+                                          param == QString( "clipping_modulate" ) ||
+                                          param == QString( "clipping_scale" ) ) )
+  {
+    bool isDefaultTextureUsed = resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture" );
+    QString aTexture = resMgr->stringValue( "OCCViewer", "clipping_texture" );
+    bool isModulated = resMgr->booleanValue( "OCCViewer", "clipping_modulate" );
+    double aScale = resMgr->doubleValue( "OCCViewer", "clipping_scale" );
+    QList<SUIT_ViewManager*> lst;
+    viewManagers( OCCViewer_Viewer::Type(), lst );
+    QListIterator<SUIT_ViewManager*> it( lst );
+    while ( it.hasNext() )
+    {
+      SUIT_ViewModel* vm = it.next()->getViewModel();
+      if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
+        continue;
+
+      OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
+      occVM->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale );
+    }
+  }
+#endif
+
+#ifndef DISABLE_OCCVIEWER
+  if ( sec == QString( "OCCViewer" ) && param == QString( "projection_mode" ) )
+  {
+    int mode = resMgr->integerValue( "OCCViewer", "projection_mode", 0 );
+    QList<SUIT_ViewManager*> lst;
+    viewManagers( OCCViewer_Viewer::Type(), lst );
+    QListIterator<SUIT_ViewManager*> it( lst );
+    while ( it.hasNext() )
+    {
+      SUIT_ViewModel* vm = it.next()->getViewModel();
+      if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
+        continue;
+
+      OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
+      occVM->setProjectionType( mode );
+    }
+  }
+#endif
+#if OCC_VERSION_LARGE > 0x06090000
+#ifndef DISABLE_OCCVIEWER
+  if ( sec == QString( "OCCViewer" ) && param == QString( "stereo_type" ) )
+  {
+    int mode = resMgr->integerValue( "OCCViewer", "stereo_type", 0 );
+    QList<SUIT_ViewManager*> lst;
+    viewManagers( OCCViewer_Viewer::Type(), lst );
+    QListIterator<SUIT_ViewManager*> it( lst );
+    while ( it.hasNext() )
+    {
+      SUIT_ViewModel* vm = it.next()->getViewModel();
+      if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
+        continue;
+
+      OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
+      occVM->setStereoType( mode );
+    }
+  }
+#endif
+
+#ifndef DISABLE_OCCVIEWER
+  if ( sec == QString( "OCCViewer" ) && param == QString( "anaglyph_filter" ) )
+  {
+    int mode = resMgr->integerValue( "OCCViewer", "anaglyph_filter", 0 );
+    QList<SUIT_ViewManager*> lst;
+    viewManagers( OCCViewer_Viewer::Type(), lst );
+    QListIterator<SUIT_ViewManager*> it( lst );
+    while ( it.hasNext() )
+    {
+      SUIT_ViewModel* vm = it.next()->getViewModel();
+      if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
+        continue;
+
+      OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
+      occVM->setAnaglyphFilter( mode );
+    }
+  }
+#endif
+
+#ifndef DISABLE_OCCVIEWER
+  if ( sec == QString( "OCCViewer" ) && ( param == QString( "focus_type" ) ||
+                                          param == QString( "focus_value" ) ) )
+  {
+    int aType = resMgr->integerValue( "OCCViewer", "focus_type" );
+    double aValue = resMgr->doubleValue( "OCCViewer", "focus_value" );
+    QList<SUIT_ViewManager*> lst;
+    viewManagers( OCCViewer_Viewer::Type(), lst );
+    QListIterator<SUIT_ViewManager*> it( lst );
+    while ( it.hasNext() )
+    {
+      SUIT_ViewModel* vm = it.next()->getViewModel();
+      if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
+        continue;
+
+      OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
+      occVM->setStereographicFocus( aType, aValue );
+    }
+  }
+#endif
+
+#ifndef DISABLE_OCCVIEWER
+  if ( sec == QString( "OCCViewer" ) && ( param == QString( "iod_type" ) ||
+                                          param == QString( "iod_value" ) ) )
+  {
+    int aType = resMgr->integerValue( "OCCViewer", "iod_type" );
+    double aValue = resMgr->doubleValue( "OCCViewer", "iod_value" );
+    QList<SUIT_ViewManager*> lst;
+    viewManagers( OCCViewer_Viewer::Type(), lst );
+    QListIterator<SUIT_ViewManager*> it( lst );
+    while ( it.hasNext() )
+    {
+      SUIT_ViewModel* vm = it.next()->getViewModel();
+      if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
+        continue;
+
+      OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
+      occVM->setInterocularDistance( aType, aValue );
+    }
+  }
+#endif
+
+#ifndef DISABLE_OCCVIEWER
+  if ( sec == QString( "OCCViewer" ) && param == QString( "reverse_stereo" ) )
+  {
+    bool reverse = resMgr->booleanValue( "OCCViewer", "reverse_stereo", false );
+    QList<SUIT_ViewManager*> lst;
+    viewManagers( OCCViewer_Viewer::Type(), lst );
+    QListIterator<SUIT_ViewManager*> it( lst );
+    while ( it.hasNext() )
+    {
+      SUIT_ViewModel* vm = it.next()->getViewModel();
+      if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
+        continue;
+
+      OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
+      occVM->setReverseStereo( reverse );
+    }
+  }
+#endif
+
+#ifndef DISABLE_OCCVIEWER
+  if ( sec == QString( "OCCViewer" ) && param == QString( "enable_vsync" ) )
+  {
+    bool enable = resMgr->booleanValue( "OCCViewer", "enable_vsync", true );
+    QList<SUIT_ViewManager*> lst;
+    viewManagers( OCCViewer_Viewer::Type(), lst );
+    QListIterator<SUIT_ViewManager*> it( lst );
+    while ( it.hasNext() )
+    {
+      SUIT_ViewModel* vm = it.next()->getViewModel();
+      if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
+        continue;
+
+      OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
+      occVM->setVSync( enable );
+    }
+  }
+#endif
+
+#ifndef DISABLE_OCCVIEWER
+  if ( sec == QString( "OCCViewer" ) && param == QString( "enable_quad_buffer_support" ) )
+  {
+    bool enable = resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", false );
+    QList<SUIT_ViewManager*> lst;
+    viewManagers( OCCViewer_Viewer::Type(), lst );
+    QListIterator<SUIT_ViewManager*> it( lst );
+    while ( it.hasNext() )
+    {
+      SUIT_ViewModel* vm = it.next()->getViewModel();
+      if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
+        continue;
+
+      OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
+      occVM->setQuadBufferSupport( enable );
+    }
+  }
+#endif
+#endif
+  if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
+  {
+    int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
+    QList<SUIT_ViewManager*> lst;
+#ifndef DISABLE_OCCVIEWER
+    viewManagers( OCCViewer_Viewer::Type(), lst );
+    QListIterator<SUIT_ViewManager*> itOCC( lst );
+    while ( itOCC.hasNext() )
+    {
+      SUIT_ViewModel* vm = itOCC.next()->getViewModel();
+      if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
+        continue;
+
+      OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
+      occVM->setZoomingStyle( mode );
+    }
+#endif
+#ifndef DISABLE_VTKVIEWER
+#ifndef DISABLE_SALOMEOBJECT
+    viewManagers( SVTK_Viewer::Type(), lst );
+    QListIterator<SUIT_ViewManager*> itVTK( lst );
+    while ( itVTK.hasNext() )
+    {
+      SUIT_ViewModel* vm = itVTK.next()->getViewModel();
+      if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
+        continue;
+
+      SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
+      if( vtkVM ) vtkVM->setZoomingStyle( mode );
     }
 #endif
 #endif
@@ -2768,6 +3396,69 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString
   }
 #endif
 
+#ifndef DISABLE_VTKVIEWER
+  if ( sec == QString( "VTKViewer" ) && param == QString( "stereo_type" ) )
+  {
+    int mode = resMgr->integerValue( "VTKViewer", "stereo_type", 0 );
+    QList<SUIT_ViewManager*> lst;
+#ifndef DISABLE_SALOMEOBJECT
+    viewManagers( SVTK_Viewer::Type(), lst );
+    QListIterator<SUIT_ViewManager*> it( lst );
+    while ( it.hasNext() )
+    {
+      SUIT_ViewModel* vm = it.next()->getViewModel();
+      if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
+        continue;
+
+      SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
+      if( vtkVM ) vtkVM->setStereoType( mode );
+    }
+#endif
+  }
+#endif
+
+#ifndef DISABLE_VTKVIEWER
+  if ( sec == QString( "VTKViewer" ) && param == QString( "anaglyph_filter" ) )
+  {
+    int mode = resMgr->integerValue( "VTKViewer", "anaglyph_filter", 0 );
+    QList<SUIT_ViewManager*> lst;
+#ifndef DISABLE_SALOMEOBJECT
+    viewManagers( SVTK_Viewer::Type(), lst );
+    QListIterator<SUIT_ViewManager*> it( lst );
+    while ( it.hasNext() )
+    {
+      SUIT_ViewModel* vm = it.next()->getViewModel();
+      if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
+        continue;
+
+      SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
+      if( vtkVM ) vtkVM->setAnaglyphFilter( mode );
+    }
+#endif
+  }
+#endif
+
+#ifndef DISABLE_VTKVIEWER
+  if ( sec == QString( "VTKViewer" ) && param == QString( "enable_quad_buffer_support" ) )
+  {
+    int enable = resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", false );
+    QList<SUIT_ViewManager*> lst;
+#ifndef DISABLE_SALOMEOBJECT
+    viewManagers( SVTK_Viewer::Type(), lst );
+    QListIterator<SUIT_ViewManager*> it( lst );
+    while ( it.hasNext() )
+    {
+      SUIT_ViewModel* vm = it.next()->getViewModel();
+      if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
+        continue;
+
+      SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
+      if( vtkVM ) vtkVM->setQuadBufferSupport( enable );
+    }
+#endif
+  }
+#endif
+
 #ifndef DISABLE_VTKVIEWER
   if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
   {
@@ -2903,7 +3594,13 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString
   }
   if ( sec == "language" && param == "language" )
   {
-    SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
+    // VSR 18.06.2015 : commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
+    //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
+  }
+  if ( sec == "language" && param == "locale")
+  {
+    // VSR 18.06.2015: commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
+    //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
   }
   if ( sec == "desktop" && param == "opaque_resize" ) {
     bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
@@ -2916,22 +3613,56 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString
       dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
   }
 
-  if ( sec == "ExternalBrowser" && param == "use_external_browser" ) {
-    if ( resMgr->booleanValue("ExternalBrowser", "use_external_browser", false ) )
-    {
-      QtxWebBrowser::shutdown();
+#ifndef DISABLE_PLOT2DVIEWER
+  QList<SUIT_ViewManager*> lst;
+  viewManagers( Plot2d_Viewer::Type(), lst );
+  QListIterator<SUIT_ViewManager*> itPlot2d( lst );
+  while ( itPlot2d.hasNext() ) {
+    SUIT_ViewManager* viewMgr = itPlot2d.next();
+    SUIT_ViewModel* vm = viewMgr->getViewModel();
+    if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
+      continue;
+
+    Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
+
+    viewMgr->setViewModel( vm  );
+    Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
+    if( wnd ) {
+      Plot2d_ViewFrame* frame = wnd->getViewFrame();
+      frame->SetPreference();
     }
   }
+#endif
 
-#ifndef DISABLE_PLOT2DVIEWER
-  if ( sec == "Plot2d" ) {
-    if( param == "SelectionColor" ) {
-      QColor c = resMgr->colorValue( sec, param );
-      Plot2d_Object::setSelectionColor(c);
-    }
-    else if (param == "SelectedLegendFontColor") {
-      QColor c = resMgr->colorValue( sec, param );      
-      Plot2d_Object::setHighlightedLegendTextColor(c);
+#ifndef DISABLE_PYVIEWER
+  if ( sec == QString( "PyViewer" ) && ( param == QString( "HighlightCurrentLine" ) ||
+                                         param == QString( "LineNumberArea" ) ||
+                                         param == QString( "TextWrapping" ) ||
+                                         param == QString( "CenterCursorOnScroll" ) ||
+                                         param == QString( "TabSpaceVisible" ) ||
+                                         param == QString( "TabSize" ) ||
+                                         param == QString( "VerticalEdge" ) ||
+                                         param == QString( "NumberColumns" ) ||
+                                         param == QString( "Font" ) ) )
+  {
+    QList<SUIT_ViewManager*> lst;
+    viewManagers( PyViewer_Viewer::Type(), lst );
+    QListIterator<SUIT_ViewManager*> itPy( lst );
+    while ( itPy.hasNext() )
+    {
+      SUIT_ViewManager* viewMgr = itPy.next();
+      SUIT_ViewModel* vm = viewMgr->getViewModel();
+      if ( !vm || !vm->inherits( "PyViewer_Viewer" ) )
+        continue;
+
+      PyViewer_Viewer* pyEditVM = dynamic_cast<PyViewer_Viewer*>( vm );
+
+      viewMgr->setViewModel( vm );
+      PyViewer_ViewWindow* pyView = dynamic_cast<PyViewer_ViewWindow*>( viewMgr->getActiveView() );
+      if( pyView )
+      {
+        pyView->setPreferences();
+      }
     }
   }
 #endif
@@ -3011,6 +3742,12 @@ void LightApp_Application::savePreferences()
   if ( desktop() )
     aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
 
+#if GUI_DEVELOPMENT > 0
+  aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
+#else
+  aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
+#endif
+
   aResMgr->save();
 }
 
@@ -3127,9 +3864,6 @@ void LightApp_Application::removeModuleAction( const QString& modName )
 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
 {
   winMap.clear();
-  if ( !activeStudy() )
-    return;
-
   if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
     ((LightApp_Module*)activeModule())->windows( winMap );
   else
@@ -3160,28 +3894,22 @@ void LightApp_Application::updateWindows()
   QMap<int, int> winMap;
   currentWindows( winMap );
 
-  if ( activeStudy() )
+  for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
   {
-    for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
-    {
-      if ( !dockWindow( it.key() ) )
-        getWindow( it.key() );
-    }
+    if ( !dockWindow( it.key() ) )
+      getWindow( it.key() );
   }
 
   for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
   {
     QWidget* wid = it.value();
-    if ( activeStudy() )
-      wid->setVisible( winMap.contains( it.key() ) );
+    if ( winMap.contains( it.key() ) )
+      wid->setVisible( true );
     else
       delete wid;
   }
 
-  if ( activeStudy() )
-    loadDockWindowsState();
-  else
-    myWin.clear();
+  loadDockWindowsState();
 }
 
 /*!
@@ -3210,26 +3938,36 @@ void LightApp_Application::loadDockWindowsState()
   QString modName;
   if ( activeModule() )
     modName = activeModule()->name();
+  else if ( activeStudy() )
+    modName = "nomodule";
 
-  QtxResourceMgr::WorkingMode prevMode = aResMgr->workingMode();
-  aResMgr->setWorkingMode(QtxResourceMgr::IgnoreUserValues);
+  QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues );
   QByteArray aDefaultState;
-  aResMgr->value("windows_geometry", modName , aDefaultState );
+  aResMgr->value( "windows_geometry", modName, aDefaultState );
   QByteArray aDefaultVisibility;
-  aResMgr->value("windows_visibility", modName , aDefaultVisibility );
+  aResMgr->value( "windows_visibility", modName, aDefaultVisibility );
   bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
-  aResMgr->setWorkingMode(prevMode);
+  aResMgr->setWorkingMode( prevMode );
   
   if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
     return;
 
   if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
+    long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) );
     QByteArray arr;
-    aResMgr->value("windows_geometry", modName , arr );
-    QByteArray aTargetArray = processState(arr, storeWin, storeTb, aDefaultState);
+    if ( version > Qtx::versionToId( "7.4.1" ) )
+      aResMgr->value( "windows_geometry", modName , arr );
+    else
+      arr = aDefaultState;
+    QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
     desktop()->restoreState( aTargetArray );
   }
 
+  QStringList mainToolbarsNames;
+  mainToolbarsNames << "SalomeStandard" << "SalomeModules";
+  QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
+  foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
+  /*
   if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
     return;
 
@@ -3259,7 +3997,7 @@ void LightApp_Application::loadDockWindowsState()
       dwMap =  &defaultDwMap;
     }
   }
-  
+
   if(tbMap) {
     QList<QToolBar*> tbList = findToolBars();
     for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
@@ -3285,6 +4023,7 @@ void LightApp_Application::loadDockWindowsState()
          dw->setVisible( (*dwMap)[dw->objectName()] );
       }
   }
+  */
 }
 
 
@@ -3305,9 +4044,17 @@ void LightApp_Application::saveDockWindowsState()
   QString modName;
   if ( activeModule() )
     modName = activeModule()->name();
+  else if ( activeStudy() )
+    modName = "nomodule";
+
+  QString versionId = GUI_VERSION_STR;
+#if GUI_DEVELOPMENT > 0
+  versionId += "dev";
+#endif
 
   QByteArray arr = desktop()->saveState();
-  resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb) );
+  resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
+  resourceMgr()->setValue( "windows_geometry_version", modName, versionId );
 
   QByteArray visArr;
   if ( myWinVis.contains( modName ) )
@@ -3449,6 +4196,7 @@ void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopu
       a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
   }
 
+#ifndef DISABLE_SALOMEOBJECT
   if ( selMgr && ob ) {
     SALOME_ListIO selected;
     selMgr->selectedObjects( selected );
@@ -3467,6 +4215,7 @@ void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopu
       }
     }
   }
+#endif
 
   selMgr->setSelectionCacheEnabled( cacheIsOn );
 }
@@ -3496,6 +4245,10 @@ void LightApp_Application::setDesktop( SUIT_Desktop* desk )
   if ( desk ) {
     connect( desk, SIGNAL( message( const QString& ) ),
              this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
+    connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
+             this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
+    /* connect( desk, SIGNAL( windowMoved( SUIT_ViewWindow* ) ),
+             this, SLOT( onWindowMoved( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); */
   }
 }
 
@@ -3581,7 +4334,7 @@ void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
            this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
   LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
   if (aStudy )
-    aStudy->removeViewMgr(vm->getGlobalId());
+    aStudy->removeObjectProperties( vm->getGlobalId() );
 
   CAM_Application::removeViewManager( vm );
 
@@ -3701,7 +4454,7 @@ bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
 
   if ( !isLibFound )
     {
-      INFOS( "****************************************************************" << std::endl
+      INFOS( "\n****************************************************************" << std::endl
           << "*    Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
           << "*    Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
           << "****************************************************************" << std::endl );
@@ -3738,7 +4491,7 @@ bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
             return true;
         }
 
-      printf( "****************************************************************\n" );
+      printf( "\n****************************************************************\n" );
       printf( "*    Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
       if (!isPyLib)
         printf( "*    No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
@@ -3867,6 +4620,12 @@ QStringList LightApp_Application::viewManagersTypes() const
 #ifndef DISABLE_QXGRAPHVIEWER
   aTypesList<<QxScene_Viewer::Type();
 #endif
+#ifndef DISABLE_PVVIEWER
+  aTypesList<<PVViewer_Viewer::Type();
+#endif
+#ifndef DISABLE_PYVIEWER
+  aTypesList<<PyViewer_Viewer::Type();
+#endif
 #ifndef DISABLE_OCCVIEWER
   aTypesList<<OCCViewer_Viewer::Type();
 #endif
@@ -4055,6 +4814,11 @@ void LightApp_Application::onDesktopMessage( const QString& message )
     // update object browser
     updateObjectBrowser();
   }
+  else if ( message.toLower().startsWith( "activate_viewer" ) ) {
+    QString vtype = message.split( sectionSeparator ).last();
+    if ( !vtype.isEmpty() )
+      getViewManager( vtype, true );
+  }
   else {
     QStringList data = message.split( sectionSeparator );
     if ( data.count() > 1 ) {
@@ -4090,7 +4854,8 @@ void LightApp_Application::onDesktopMessage( const QString& message )
   Returns all top level toolbars.
   Note : Result list contains only main window toolbars, not including toolbars from viewers.
 */
-QList<QToolBar*> LightApp_Application::findToolBars() {
+QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
+{
   QList<QToolBar*> aResult;
   QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
   for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
@@ -4098,7 +4863,8 @@ QList<QToolBar*> LightApp_Application::findToolBars() {
     QObject* po = Qtx::findParent( tb, "QMainWindow" );
     if ( po != desktop() )
       continue;        
-    aResult.append(tb);
+    if ( names.isEmpty() || names.contains( tb->objectName() ) )
+      aResult.append(tb);
   }
   return aResult;
 }
@@ -4106,12 +4872,27 @@ QList<QToolBar*> LightApp_Application::findToolBars() {
 /*!
   Internal method to parse toolbars and dockable windows state.
  */
-QByteArray LightApp_Application::processState(QByteArray& input, const bool processWin,const bool processTb, QByteArray defaultState) {
+QByteArray LightApp_Application::processState(QByteArray& input, 
+                                             const bool processWin, 
+                                             const bool processTb, 
+                                             const bool isRestoring, 
+                                             QByteArray defaultState) {
 
   QByteArray aRes;
   bool hasDefaultState  = !defaultState.isEmpty();
   bool isDockWinWriten = false;
-  if(processWin && processTb) {
+  int nbDocWin = -1;
+  //Write date from users settings
+  if(isRestoring){
+    QDataStream tmpInputData(&input, QIODevice::ReadOnly);
+    int marker, version;
+    uchar dockmarker;
+    tmpInputData >> marker;
+    tmpInputData >> version;
+    tmpInputData >> dockmarker;
+    tmpInputData >> nbDocWin;
+  }  
+  if(processWin && processTb && !isRestoring) {
     aRes = input;
   } else if(!processWin && !processTb ) {
     if(hasDefaultState)
@@ -4127,9 +4908,9 @@ QByteArray LightApp_Application::processState(QByteArray& input, const bool proc
     }
 
     int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
-    QDataStream anInputData(&input, QIODevice::ReadOnly);
     if(toolBarMarkerIndex < 0)
       return aRes;
+    QDataStream anInputData(&input, QIODevice::ReadOnly);
 
     int toolBarMarkerIndexDef;
     if(hasDefaultState) {
@@ -4142,15 +4923,24 @@ QByteArray LightApp_Application::processState(QByteArray& input, const bool proc
     QDataStream* aTargetData = 0;
     int          aTargetIndex = -1;
 
-    if(processWin) {
-      //Write date from users settings
+    QByteArray currentArr = desktop()->saveState();
+    QDataStream anInputDataCur(&currentArr, QIODevice::ReadOnly);
+    bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
+    if(processWin && useInputData) {
       aTargetData = &anInputData;
       aTargetIndex = toolBarMarkerIndex;
     } else {
       //Write date from default settings
       if(hasDefaultState) {
        aTargetData = &anInputDataDef;
-       aTargetIndex = toolBarMarkerIndexDef;   
+       aTargetIndex = toolBarMarkerIndexDef;
+      } else {
+       //If no default state, write current snapshot of the dockable windows
+       if(isRestoring) {
+         aTargetData = &anInputDataCur;
+         int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
+         aTargetIndex = toolBarMarkerIndexCur;
+       }         
       }
     }
 
@@ -4208,3 +4998,137 @@ QByteArray LightApp_Application::processState(QByteArray& input, const bool proc
   }
   return aRes;
 }
+
+/*!
+  \brief Emits operationFinished signal.
+  \param theModuleName the name of the module which perfomed the operation
+  \param theOperationName the operation name
+  \param theEntryList the list of the created objects entries
+*/
+void LightApp_Application::emitOperationFinished( const QString& theModuleName,
+                                                  const QString& theOperationName,
+                                                  const QStringList& theEntryList )
+{
+  emit operationFinished( theModuleName, theOperationName, theEntryList );
+}
+
+/*!
+  Update visibility state of given objects
+*/
+void LightApp_Application::updateVisibilityState( DataObjectList& theList,
+                                                 SUIT_ViewModel*  theViewModel )
+{
+  if ( !theViewModel || theList.isEmpty() ) return;
+
+  LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
+  if ( !aStudy ) return;
+
+  SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
+
+  for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
+    LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
+
+    if ( !obj || aStudy->isComponent( obj->entry() ) )
+      continue;
+
+    LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
+    if ( anObjModule ) {
+      LightApp_Displayer* aDisplayer = anObjModule->displayer();
+      if ( aDisplayer ) {
+       Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
+        if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
+          if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
+            anObjState = Qtx::ShownState;
+          else
+            anObjState = Qtx::HiddenState;
+        }
+       aStudy->setVisibilityState( obj->entry(), anObjState );
+      }
+    }
+  }
+}
+
+/*!
+ * Called when window activated
+ */
+void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
+{
+  SUIT_DataBrowser* anOB = objectBrowser();
+  if ( !anOB )
+    return;
+  SUIT_DataObject* rootObj = anOB->root();
+  if ( !rootObj )
+    return;
+
+  DataObjectList listObj = rootObj->children( true );
+
+  SUIT_ViewModel* vmod = 0;
+  if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
+    vmod = vman->getViewModel();
+  updateVisibilityState( listObj, vmod );
+}
+
+/*!
+  Called then view manager removed
+*/
+void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
+{
+  ViewManagerList lst;
+  viewManagers( lst );
+  if ( lst.count() == 1) { // in case if closed last view window
+    LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
+    if ( aStudy )
+      aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
+  }
+}
+
+/*!
+  Check existing document.
+*/
+bool LightApp_Application::checkExistingDoc()
+{
+  bool result = true;
+  if( activeStudy() ) {
+    int answer = SUIT_MessageBox::question( desktop(), 
+                                           tr( "APPCLOSE_CAPTION" ), 
+                                           tr( "STUDYCLOSE_DESCRIPTION" ),
+                                           tr( "APPCLOSE_SAVE" ), 
+                                           tr( "APPCLOSE_CLOSE" ),
+                                           tr( "APPCLOSE_CANCEL" ), 0 );
+    if(answer == 0) {
+      if ( activeStudy()->isSaved() ) {
+       onSaveDoc();
+       closeDoc( false );
+      } else if ( onSaveAsDoc() ) {
+       if( !closeDoc( false ) ) {
+         result = false;
+       }
+      } else {
+       result = false;
+      }        
+    }
+    else if( answer == 1 ) {
+      closeDoc( false );
+    } else if( answer == 2 ) {
+      result = false;
+    }
+  }
+  return result;
+}
+
+#ifndef DISABLE_PYCONSOLE
+
+PyConsole_Interp* LightApp_Application::getPyInterp()
+{
+  static PyConsole_Interp* myInterp = 0;
+  if ( !myInterp )
+    myInterp = createPyInterp();
+  return myInterp;
+}
+
+PyConsole_Interp* LightApp_Application::createPyInterp()
+{
+  return new LightApp_PyInterp();
+}
+
+#endif // DISABLE_PYCONSOLE