Salome HOME
Redesign SALOME documentation
[modules/gui.git] / src / LightApp / LightApp_Application.cxx
index 37ca6fd0f769c8d0acde36547ff6f8d4556b7233..7e0661fb6d767acdd9ef9bd0be2050016a62f02c 100644 (file)
@@ -246,6 +246,14 @@ int LightApp_Application::lastStudyId = 0;
 //since the 'toolbar marker' is not unique, find index of first occurrence of the
 //'toolbar marker' in the array and check that next string is name of the toolbar
 
+void LightAppCleanUpAppResources()
+{
+  if ( LightApp_Application::_prefs_ ) {
+    delete LightApp_Application::_prefs_;
+    LightApp_Application::_prefs_ = 0;
+  }
+}
+
 namespace
 {
   int getToolbarMarkerIndex( QByteArray input, const QStringList& aFlags ) {
@@ -255,7 +263,7 @@ namespace
     while ( tmp < inputLen ) {
       tmp = input.indexOf( QToolBarMarker, tmp + 1 );
       if ( tmp < 0 )
-       break;
+        break;
       anInputData.device()->seek( tmp );
       uchar mark;
       anInputData >> mark;
@@ -263,9 +271,9 @@ namespace
       anInputData >> lines;
 
       if ( lines == 0 && anInputData.atEnd() ) {
-       //Case then array doesn't contain information about toolbars,
-       aResult = tmp;
-       break;
+        //Case then array doesn't contain information about toolbars,
+        aResult = tmp;
+        break;
       }
 
       int pos;
@@ -275,10 +283,10 @@ namespace
       QString str;
       anInputData >> str;
       if ( aFlags.contains( str ) ) {
-       aResult = tmp;
-       break;
+        aResult = tmp;
+        break;
       }
-    }        
+    }
     return aResult;
   }
 
@@ -439,6 +447,7 @@ LightApp_Application::~LightApp_Application()
   savePreferences();
   delete mySelMgr;
   delete myScreenHelper;
+  myPrefs = 0;
 }
 
 /*!Start application.*/
@@ -586,7 +595,7 @@ void LightApp_Application::createActions()
   // Preferences
   createAction( PreferencesId, tr( "TOT_DESK_PREFERENCES" ), QIcon(),
                 tr( "MEN_DESK_PREFERENCES" ), tr( "PRP_DESK_PREFERENCES" ),
-                Qt::CTRL+Qt::Key_R, desk, false, this, SLOT( onPreferences() ) );
+                Qt::CTRL+Qt::Key_P, desk, false, this, SLOT( onPreferences() ) );
 
   // Help menu:
 
@@ -594,13 +603,47 @@ void LightApp_Application::createActions()
 
   int helpMenu = createMenu( tr( "MEN_DESK_HELP" ), -1, -1, 1000 );
   createMenu( separator(), helpMenu, -1, 10 );
+  
+  // Site && forum
+  int id = LightApp_Application::UserID + FIRST_HELP_ID;
+
+  QString site = tr ( "SALOME_SITE" );
+  QAction* as = createAction( id, site,
+                             resMgr->loadPixmap( "LightApp", tr( "ICON_WWW" ), false ),
+                             site, site,
+                             0, desk, false, this, SLOT( onHelpOnline() ) );
+  as->setData( "salome-platform.org" );
+  createMenu( as, helpMenu, -1, 0 );
+  id++;
+
+  QString forum = tr ( "SALOME_FORUM" );
+
+  QAction* af = createAction( helpMenu, forum,
+                             resMgr->loadPixmap( "LightApp", tr( "ICON_WWW" ), false ),
+                             forum, forum,
+                             0, desk, false, this, SLOT( onHelpOnline() ) );
+  af->setData( "salome-platform.org/forum" );
+  createMenu( af, helpMenu, -1, 0 );
+  id++;
+
+  createMenu( separator(), helpMenu, -1, 0 );
+
+  // YouTube channel
+  QString video = tr ( "SALOME_VIDEO_TUTORIALS" );
+  QAction* av = createAction( helpMenu, video,
+                             resMgr->loadPixmap( "LightApp", tr( "ICON_LIFE_RIGN" ), false ),
+                             video, video,
+                             0, desk, false, this, SLOT( onHelpOnline() ) );
+  av->setData( "not-created-yet.com" );
+  createMenu( av, helpMenu, -1, 0 );
+  id++;
+
+
   QStringList aModuleList;
   modules( aModuleList, false );
   aModuleList.prepend( "GUI" );
   aModuleList.prepend( "KERNEL" );
 
-  int id = LightApp_Application::UserID + FIRST_HELP_ID;
-
   QString aModule;
   foreach( aModule, aModuleList ) {
     if ( aModule.isEmpty() )                                         // module title (user name)
@@ -715,14 +758,11 @@ void LightApp_Application::createActions()
     QStringList::Iterator it;
     for ( it = modList.begin(); it != modList.end(); ++it )
     {
-      if ( !isLibExists( *it ) )
+      if ( !isModuleAccessible( *it ) )
         continue;
 
       QString modName = moduleName( *it );
 
-      if ( !isModuleAccessible( *it ) )
-        continue;
-
       QString iconName;
       if ( iconMap.contains( *it ) )
         iconName = iconMap[*it];
@@ -731,12 +771,12 @@ void LightApp_Application::createActions()
       if ( icon.isNull() )
       {
         icon = modIcon;
-        INFOS ( "\n****************************************************************" << std::endl
-                <<  "*    Icon for " << (*it).toLatin1().constData()
-                << " not found. Using the default one." << std::endl
-                << "****************************************************************" << std::endl );
+        INFOS( std::endl <<
+               "****************************************************************" << std::endl <<
+               "     Warning: icon for " << qPrintable(*it) << " is not found!" << std::endl <<
+               "     Using the default icon." << std::endl <<
+               "****************************************************************" << std::endl);
       }
-
       icon = Qtx::scaleIcon( icon, iconSize );
 
       moduleAction->insertModule( *it, icon );
@@ -817,7 +857,7 @@ void LightApp_Application::createActions()
   createMenu( FullScreenId, viewMenu, 20, -1 );
 
   int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ),    // title (language-dependant)
-                           QString( "SalomeModules" ) );   // name (language-independant)
+                            QString( "SalomeModules" ) );   // name (language-independant)
   createTool( ModulesListId, modTBar );
 }
 
@@ -1007,6 +1047,7 @@ void LightApp_Application::onHelpAbout()
 */
 void LightApp_Application::onSelection()
 {
+  //MESSAGE("onSelection")
   onSelectionChanged();
 
   if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
@@ -1090,16 +1131,23 @@ public:
               const QString&        theApp,
               const QString&        theParams,
               const QString&        theHelpFile,
-              const QString&        theContext = QString() )
+              const QString&        theContext = QString(),
+             //For the external browser always specify 'file://' protocol,
+             //because some WEB browsers (for example Mozilla Firefox) can't open local file without protocol.
+             const QString&        theProtocol = QString("file://"),
+             const bool            isFile = true)
     : myApp( theApp ),
       myParams( theParams ),
       myContext( theContext ),
       myStatus(0),
       myLApp( app )
   {
-    //For the external browser always specify 'file://' protocol,
-    //because some WEB browsers (for example Mozilla Firefox) can't open local file without protocol.
-    myHelpFile = QString("file://%1").arg( QFileInfo( theHelpFile ).canonicalFilePath() );
+    QString path_begin = theProtocol+"%1";
+    QString path_end = theHelpFile;
+    if( isFile ) {
+      path_end = QFileInfo( theHelpFile ).canonicalFilePath();
+    }
+    myHelpFile = path_begin.arg( path_end );
   }
 
   virtual void run()
@@ -1254,6 +1302,57 @@ void LightApp_Application::onHelpContextModule( const QString& theComponentName,
   }
 }
 
+/*!
+  SLOT: Displays help contents for choosen module
+*/
+void LightApp_Application::onHelpOnline()
+{
+  const QAction* a = (QAction*) sender();
+  QString url = a->data().toString();
+  if ( url.isEmpty() ) return;
+
+  SUIT_ResourceMgr* resMgr = resourceMgr();
+  QString platform;
+#ifdef WIN32
+  platform = "winapplication";
+#else
+  platform = "application";
+#endif
+  QString anApp = resMgr->stringValue("ExternalBrowser", platform);
+#ifdef WIN32
+  QString quote("\"");
+  anApp.prepend( quote );
+  anApp.append( quote );
+#endif
+  QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
+#if DISABLE_QTXWEBBROWSER
+  bool useExtBrowser = true;
+#else  
+  bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
+#endif
+  
+  if( useExtBrowser ) {
+    if ( !anApp.isEmpty() ) {
+      RunBrowser* rs = new RunBrowser( this, anApp, aParams, url, "", "http://", false );
+      rs->start();
+    }
+    else {
+      if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
+                                      SUIT_MessageBox::Yes | SUIT_MessageBox::No,
+                                      SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
+
+        showPreferences( tr( "PREF_APP" ) );
+    }
+  }
+  else {
+    QStringList parameters;
+    parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
+    parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
+    parameters << "http://" + url;
+    QProcess::startDetached( "HelpBrowser", parameters );
+  }
+}
+
 /*!
   Sets enable or disable some actions on selection changed.
 */
@@ -1311,8 +1410,8 @@ void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
   connect( dock, SIGNAL(  destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
 
   dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
-  dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) : 
-                      QString( "%1Dock" ).arg( wid->objectName() ) );
+  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 ) ),
@@ -1461,19 +1560,31 @@ SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, c
 {
   SUIT_ViewManager* aVM = viewManager( vmType );
   SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
-
+  MESSAGE("vmType: " << vmType.toStdString() << " aVM: " << aVM << " anActiveVM: " << anActiveVM );
   if ( anActiveVM && anActiveVM->getType() == vmType )
-    aVM = anActiveVM;
+    {
+      MESSAGE("aVM = anActiveVM");
+      aVM = anActiveVM;
+    }
 
-  if ( aVM && create )
+  if ( aVM && !aVM->getDetached() && create )
   {
     if ( !aVM->getActiveView() )
-      aVM->createView();
+      {
+        MESSAGE("aVM->createView()");
+        aVM->createView();
+      }
     else
-      desktop()->setActiveWindow( aVM->getActiveView() );
+      {
+        MESSAGE("desktop()->setActiveWindow: " << aVM->getActiveView());
+        desktop()->setActiveWindow( aVM->getActiveView() );
+      }
   }
   else if ( create )
-    aVM = createViewManager( vmType );
+    {
+      MESSAGE("aVM = createViewManager( vmType )");
+      aVM = createViewManager( vmType );
+    }
 
   return aVM;
 }
@@ -1482,7 +1593,7 @@ SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, c
   Creates view manager of some type
   \param vmType - type of view manager
 */
-SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType )
+SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, bool detached )
 {
   SUIT_ResourceMgr* resMgr = resourceMgr();
 
@@ -1534,7 +1645,7 @@ SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType
 #ifndef DISABLE_PVVIEWER
   if( vmType == PVViewer_Viewer::Type() )
   {
-    if ( viewMgr = dynamic_cast<PVViewer_ViewManager*>( getViewManager( vmType, false ) ) ) {
+    if (( viewMgr = dynamic_cast<PVViewer_ViewManager*>( getViewManager( vmType, false )))) {
       viewMgr->getActiveView()->setFocus();
       return 0;
     } else {
@@ -1571,7 +1682,6 @@ SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType
                            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() ),
@@ -1582,7 +1692,6 @@ SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType
     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() ) );
@@ -1640,6 +1749,7 @@ SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType
   if ( !viewMgr )
     return 0;
 
+  viewMgr->setDetached(detached);
   addViewManager( viewMgr );
   SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
 
@@ -1775,7 +1885,7 @@ void LightApp_Application::onStudySaved( SUIT_Study* s )
 {
   QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
   if ( mru && s )
-      mru->insert( s->studyName() );
+    mru->insert( s->studyName() );
 
   emit studySaved();
 }
@@ -1785,7 +1895,7 @@ void LightApp_Application::onStudyClosed( SUIT_Study* s )
 {
   /*
   disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
-             this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
+              this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
   */
 
   // stop auto-save timer
@@ -1836,12 +1946,10 @@ void LightApp_Application::studyCreated( SUIT_Study* s )
 }
 
 /*!Gets file filter.
- *\retval QString "(*.bin)"
+ *\retval QString "(*.hdf)"
  */
-QString LightApp_Application::getFileFilter() const
+QString LightApp_Application::getFileFilter( bool /*open*/) const
 {
-  //return "(*.bin)";
-  // HDF persistence
   return "(*.hdf)";
 }
 
@@ -2121,6 +2229,7 @@ LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
   {
     _prefs_ = new LightApp_Preferences( resourceMgr() );
     that->createPreferences( _prefs_ );
+    qAddPostRoutine( LightAppCleanUpAppResources );
   }
 
   that->myPrefs = _prefs_;
@@ -2150,7 +2259,7 @@ LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
 
     for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
     {
-      if ( !app->isLibExists( *it ) || _prefs_->hasModule( *it ) )
+      if ( !app->isModuleAccessible( *it ) || _prefs_->hasModule( *it ) )
         continue;
 
       int modId = _prefs_->addPreference( *it );
@@ -2347,7 +2456,7 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref )
   pref->setItemProperty( "columns", 2, fullScreenGroup );
   // .... -> automatic hiding toolbars
   pref->addPreference( tr( "PREF_FULL_SCREEN_AUTO" ), fullScreenGroup,
-                      LightApp_Preferences::Bool, "OCCViewer", "automatic_hiding" );
+                       LightApp_Preferences::Bool, "OCCViewer", "automatic_hiding" );
   // ... "Full-screen" group <<end>>
 
   // .. "General" preferences tab <<end>>
@@ -2402,7 +2511,7 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref )
   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 );
@@ -2466,14 +2575,14 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref )
 
   // .... -> Reverse stereo
   pref->addPreference( tr( "PREF_REVERSE_STEREO" ), stereoGroup,
-                      LightApp_Preferences::Bool, "OCCViewer", "reverse_stereo" );
+                       LightApp_Preferences::Bool, "OCCViewer", "reverse_stereo" );
   // .... -> Enable V-Sync
   pref->addPreference( tr( "PREF_ENABLE_VSYNC" ), stereoGroup,
-                      LightApp_Preferences::Bool, "OCCViewer", "enable_vsync" );
+                       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
+                       LightApp_Preferences::Bool, "OCCViewer", "enable_quad_buffer_support" );
+
   // ... "Background" group <<start>>
   int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
   //  pref->setItemProperty( "columns", 2, bgGroup );
@@ -2534,18 +2643,18 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref )
   int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
   pref->setItemProperty( "columns", 2, occSelectionGroup );
   // .... -> enable preselection
-  pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup, 
-                      LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
+  pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
+                       LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
   // .... -> enable selection
-  pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup, 
-                      LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
+  pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
+                       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" );
+                       LightApp_Preferences::Color, "OCCViewer", "clipping_color" );
   int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame );
   pref->setItemProperty( "columns", 2, texturePref );
   // .... -> use default texture
@@ -2920,6 +3029,20 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref )
   pref->addPreference( tr( "PREF_PY_LINE_NUMBS_AREA" ), pyDispGroup,
     LightApp_Preferences::Bool, "PyEditor", "LineNumberArea" );
   // ... "Display settings" group <<end>>
+
+  // ... "Editor settings" group <<start>>
+  int pyEditGroup = pref->addPreference( tr( "PREF_GROUP_PY_EDITOR" ), pyeditTab );
+  // ... -> navigation mode
+  int pyCompletion = pref->addPreference( tr( "PREF_PY_COMPLETION_MODE" ), pyEditGroup,
+                                          LightApp_Preferences::Selector, "PyEditor", "CompletionPolicy" );
+  aValuesList.clear();
+  anIndicesList.clear();
+  aValuesList   << tr("PREF_PY_NONE") << tr("PREF_PY_AUTO") << tr("PREF_PY_MANUAL") << tr("PREF_PY_ALWAYS");
+  anIndicesList << 0                  << 1                  << 2                    << 3                   ;
+  pref->setItemProperty( "strings", aValuesList, pyCompletion );
+  pref->setItemProperty( "indexes", anIndicesList, pyCompletion );
+  // ... "Editor settings" group <<end>>
+
   // ... "Tab settings" group <<start>>
   int pyTabGroup = pref->addPreference( tr( "PREF_GROUP_PY_TAB" ), pyeditTab );
   pref->setItemProperty( "columns", 2, pyTabGroup );
@@ -3234,7 +3357,7 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString
     }
   }
 #endif
-#if OCC_VERSION_LARGE > 0x06090000
+
 #ifndef DISABLE_OCCVIEWER
   if ( sec == QString( "OCCViewer" ) && param == QString( "stereo_type" ) )
   {
@@ -3371,7 +3494,7 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString
     }
   }
 #endif
-#endif
+
   if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
   {
     int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
@@ -3660,10 +3783,15 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString
   }
   if ( sec == "desktop" && param == "opaque_resize" ) {
     bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
-    QMainWindow::DockOptions dopts = desktop()->dockOptions();
-    if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
-    else                dopts &= ~QMainWindow::AnimatedDocks;
-    desktop()->setDockOptions( dopts );
+    // RNV: This code has been commented, because clearing of the QMainWindow::AnimatedDocks option
+    //      leads to strange behaviour of the dockable windows (at least at qt-5.6.1):
+    //      any dockable window can't be docked to the another area, except initial area.
+    //      It is possible to move window to another area, but it always returns to the initial area.
+    //
+    //    QMainWindow::DockOptions dopts = desktop()->dockOptions();
+    //    if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
+    //     else                dopts &= ~QMainWindow::AnimatedDocks;
+    //    desktop()->setDockOptions( dopts );
     desktop()->setOpaqueResize( opaqueResize );
     if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
       dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
@@ -3679,7 +3807,7 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString
     if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
       continue;
 
-    Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
+    //Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
 
     viewMgr->setViewModel( vm  );
     Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
@@ -3731,10 +3859,10 @@ void LightApp_Application::loadPreferences()
   if ( desktop() ) {
     desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
     bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
-    QMainWindow::DockOptions dopts = desktop()->dockOptions();
-    if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
-    else                dopts &= ~QMainWindow::AnimatedDocks;
-    desktop()->setDockOptions( dopts );
+    //    QMainWindow::DockOptions dopts = desktop()->dockOptions();
+    //    if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
+    //    else                dopts &= ~QMainWindow::AnimatedDocks;
+    //    desktop()->setDockOptions( dopts );
     desktop()->setOpaqueResize( opaqueResize );
     if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
       dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
@@ -3880,6 +4008,70 @@ void LightApp_Application::removeModuleAction( const QString& modName )
     moduleAction->removeModule( modName );
 }
 
+bool LightApp_Application::checkModule( const QString& title )
+{
+  if ( title.isEmpty() )
+    return false;
+
+  QString library = moduleLibrary( title, true );
+  if ( library.isEmpty() )
+    return false;
+
+  QString name = moduleName( title );
+
+  bool isPyModule = library.contains( "SalomePyQtGUI" ) || library.contains( "SalomePyQtGUILight" );
+
+  QStringList paths;
+#if defined(WIN32)
+  paths = QString( ::getenv( "PATH" ) ).split( ";", QString::SkipEmptyParts );
+#elif defined(__APPLE__)
+  paths = QString( ::getenv( "DYLD_LIBRARY_PATH" ) ).split( ":", QString::SkipEmptyParts );
+#else
+  paths = QString( ::getenv( "LD_LIBRARY_PATH" ) ).split( ":", QString::SkipEmptyParts );
+#endif
+
+  bool isFound = false;
+  QStringList::const_iterator it;
+  for ( it = paths.begin(); it != paths.end() && !isFound; ++it )
+  {
+    isFound = QFileInfo( Qtx::addSlash( *it ) + library ).exists();
+  }
+
+  if ( !isFound )
+  {
+    INFOS( std::endl <<
+           "****************************************************************" << std::endl <<
+           "     Warning: library " << qPrintable( library ) << " is not found!" << std::endl <<
+           "     Module " << qPrintable( title ) << " will not be available in GUI mode!" << std::endl <<
+           "****************************************************************" << std::endl);
+    return false;
+  }
+
+  if ( isPyModule )
+  {
+    QString pyModule = QString( "%1GUI.py" ).arg( name );
+    paths = QString( ::getenv( "PYTHONPATH" ) ).split( ":", QString::SkipEmptyParts );
+
+    isFound = false;
+    for ( it = paths.begin(); it != paths.end() && !isFound; ++it )
+    {
+      isFound = QFileInfo( Qtx::addSlash( *it ) + pyModule ).exists();
+    }
+
+    if ( !isFound )
+    {
+      INFOS( std::endl <<
+             "****************************************************************" << std::endl <<
+             "     Warning: Python module " << qPrintable( pyModule ) << " is not found!" << std::endl <<
+             "     Module " << qPrintable( title ) << " will not be available in GUI mode!" << std::endl <<
+             "****************************************************************" << std::endl);
+      return false;
+    }
+  }
+
+  return true;
+}
+
 /*!
   Gets current windows.
   \param winMap - output current windows map.
@@ -4024,11 +4216,11 @@ void LightApp_Application::loadDockWindowsState()
   if(tbMap) {
     QList<QToolBar*> tbList = findToolBars();
     for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
-      {        
-       QToolBar* tb = *tit;
-       if ( tbMap->contains( tb->objectName() ) ) {      
-         tb->setVisible( (*tbMap)[tb->objectName()] );
-       }
+      { 
+        QToolBar* tb = *tit;
+        if ( tbMap->contains( tb->objectName() ) ) {      
+          tb->setVisible( (*tbMap)[tb->objectName()] );
+        }
       }
   }
 
@@ -4036,14 +4228,14 @@ void LightApp_Application::loadDockWindowsState()
     QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
     for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
       {
-       QDockWidget* dw = *dit;
-       
-       QObject* po = Qtx::findParent( dw, "QMainWindow" );
-       if ( po != desktop() )
-         continue;
-       
-       if ( dwMap->contains( dw->objectName() ) )
-         dw->setVisible( (*dwMap)[dw->objectName()] );
+        QDockWidget* dw = *dit;
+        
+        QObject* po = Qtx::findParent( dw, "QMainWindow" );
+        if ( po != desktop() )
+          continue;
+        
+        if ( dwMap->contains( dw->objectName() ) )
+          dw->setVisible( (*dwMap)[dw->objectName()] );
       }
   }
   */
@@ -4442,92 +4634,6 @@ void LightApp_Application::onGroupAllWindow()
     wgStack->stack();
 }
 
-/*!
-  \return if the library of module exists
-  \param moduleTitle - title of module
-*/
-bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
-{
-  if( moduleTitle.isEmpty() )
-    return false;
-
-  QString lib = moduleLibrary( moduleTitle );
-
-  //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
-  bool isPythonModule = lib.contains("SalomePyQtGUI");
-  bool isPythonLightModule = lib.contains("SalomePyQtGUILight");
-
-  QStringList paths;
-#ifdef WIN32
-  paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
-#else
-  paths = QString(::getenv( "LD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
-#endif
-
-  bool isLibFound = false;
-  QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
-  for( ; anIt!=aLast; anIt++ )
-  {
-    QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
-
-    if( inf.exists() )
-      {
-        isLibFound = true;
-        break;
-      }
-  }
-
-  if ( !isLibFound )
-    {
-      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 );
-    }
-  else if ( !isPythonModule && !isPythonLightModule)
-    return true;
-
-  if ( isPythonModule || isPythonLightModule)
-    {
-      QString pylib = moduleName( moduleTitle ) + QString(".py");
-      QString pylibgui = moduleName( moduleTitle ) + QString("GUI.py");
-
-      // Check the python library
-// #ifdef WIN32
-//       paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
-// #else
-      paths = QString(::getenv( "PYTHONPATH" )).split( ":", QString::SkipEmptyParts );
-// #endif
-      bool isPyLib = false, isPyGuiLib = false;
-      QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
-      for( ; anIt!=aLast; anIt++ )
-        {
-          QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
-          QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
-
-          if(!isPythonLightModule)
-            if( !isPyLib && inf.exists() )
-              isPyLib = true;
-
-          if( !isPyGuiLib && infgui.exists() )
-            isPyGuiLib = true;
-
-          if ((isPyLib || isPythonLightModule ) && isPyGuiLib && isLibFound)
-            return true;
-        }
-
-      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() );
-      if (!isPyGuiLib)
-        printf( "*    No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).toLatin1().constData() );
-      printf( "****************************************************************\n" );
-      return true;
-  }
-  return false;
-}
-
 /*!
   \return default name for an active study
 */
@@ -4884,10 +4990,10 @@ QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
   QList<QToolBar*> aResult;
   QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
   for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
-    QToolBar* tb = *tit;    
+    QToolBar* tb = *tit;
     QObject* po = Qtx::findParent( tb, "QMainWindow" );
     if ( po != desktop() )
-      continue;        
+      continue;
     if ( names.isEmpty() || names.contains( tb->objectName() ) )
       aResult.append(tb);
   }
@@ -4896,12 +5002,12 @@ QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
 
 /*!
   Internal method to parse toolbars and dockable windows state.
- */
-QByteArray LightApp_Application::processState(QByteArray& input, 
-                                             const bool processWin, 
-                                             const bool processTb, 
-                                             const bool isRestoring, 
-                                             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();
@@ -4916,7 +5022,7 @@ QByteArray LightApp_Application::processState(QByteArray& input,
     tmpInputData >> version;
     tmpInputData >> dockmarker;
     tmpInputData >> nbDocWin;
-  }  
+  }
   if(processWin && processTb && !isRestoring) {
     aRes = input;
   } else if(!processWin && !processTb ) {
@@ -4927,7 +5033,7 @@ QByteArray LightApp_Application::processState(QByteArray& input,
     QList<QToolBar*> aToolBars = findToolBars();
 
     QStringList aNames;
-    for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {        
+    for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
       QToolBar* tb = *tit;
       aNames.append(tb->objectName());
     }
@@ -4941,7 +5047,7 @@ QByteArray LightApp_Application::processState(QByteArray& input,
     if(hasDefaultState) {
       toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
       if(toolBarMarkerIndexDef < 0)
-       return aRes;      
+        return aRes;
     }
     QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
 
@@ -4957,28 +5063,28 @@ QByteArray LightApp_Application::processState(QByteArray& input,
     } else {
       //Write date from default settings
       if(hasDefaultState) {
-       aTargetData = &anInputDataDef;
-       aTargetIndex = toolBarMarkerIndexDef;
+        aTargetData = &anInputDataDef;
+        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;
-       }         
+        //If no default state, write current snapshot of the dockable windows
+        if(isRestoring) {
+          aTargetData = &anInputDataCur;
+          int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
+          aTargetIndex = toolBarMarkerIndexCur;
+        }
       }
     }
 
     if(aTargetData && aTargetIndex >= 0 ) {
       aTargetData->device()->seek(0);
       while( aTargetData->device()->pos() < aTargetIndex ) {
-       uchar ch;
-       *aTargetData >> ch;
-       aData<<ch;
+        uchar ch;
+        *aTargetData >> ch;
+        aData<<ch;
       }
       isDockWinWriten = true;
     }
-    
+
     aTargetData = 0;
     aTargetIndex = -1;
 
@@ -4987,34 +5093,34 @@ QByteArray LightApp_Application::processState(QByteArray& input,
       aTargetIndex = toolBarMarkerIndex;
     } else {
       if(hasDefaultState) {
-       aTargetData = &anInputDataDef;
-       aTargetIndex = toolBarMarkerIndexDef;   
-      }      
+        aTargetData = &anInputDataDef;
+        aTargetIndex = toolBarMarkerIndexDef;
+      }
     }
 
     if(aTargetData && aTargetIndex >= 0) {
       int index;
       if(!isDockWinWriten ) {
-       //Write version marker
-       int marker, version;
-       aTargetData->device()->seek(0);
-       *aTargetData >> marker;
-       *aTargetData >> version;
-       aData << marker;
-       aData << version;
-       aData << (uchar) QDockWidgetMarker;
-       aData << (int) 0;
-       int shift = 4*sizeof(int) + sizeof(QSize);
-       index = aTargetIndex - shift;
+        //Write version marker
+        int marker, version;
+        aTargetData->device()->seek(0);
+        *aTargetData >> marker;
+        *aTargetData >> version;
+        aData << marker;
+        aData << version;
+        aData << (uchar) QDockWidgetMarker;
+        aData << (int) 0;
+        int shift = 4*sizeof(int) + sizeof(QSize);
+        index = aTargetIndex - shift;
       } else {
-       index = aTargetIndex;
+        index = aTargetIndex;
       }
-      
+
       aTargetData->device()->seek(index);
       while(!aTargetData->atEnd()) {
-       uchar ch;
-       *aTargetData >> ch;
-       aData << ch;
+        uchar ch;
+        *aTargetData >> ch;
+        aData << ch;
       }
     } else { // Not treat toolbars
       aData << (uchar) QToolBarMarker;
@@ -5041,7 +5147,7 @@ void LightApp_Application::emitOperationFinished( const QString& theModuleName,
   Update visibility state of given objects
 */
 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
-                                                 SUIT_ViewModel*  theViewModel )
+                                                  SUIT_ViewModel*  theViewModel )
 {
   if ( !theViewModel || theList.isEmpty() ) return;
 
@@ -5060,14 +5166,14 @@ void LightApp_Application::updateVisibilityState( DataObjectList& theList,
     if ( anObjModule ) {
       LightApp_Displayer* aDisplayer = anObjModule->displayer();
       if ( aDisplayer ) {
-       Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
+        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 );
+        aStudy->setVisibilityState( obj->entry(), anObjState );
       }
     }
   }
@@ -5114,23 +5220,23 @@ 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 );
+    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 );
+        onSaveDoc();
+        closeDoc( false );
       } else if ( onSaveAsDoc() ) {
-       if( !closeDoc( false ) ) {
-         result = false;
-       }
+        if( !closeDoc( false ) ) {
+          result = false;
+        }
       } else {
-       result = false;
-      }        
+        result = false;
+      }
     }
     else if( answer == 1 ) {
       closeDoc( false );