]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
*** empty log message *** snapshot_171207
authorstv <stv@opencascade.com>
Mon, 17 Dec 2007 11:54:45 +0000 (11:54 +0000)
committerstv <stv@opencascade.com>
Mon, 17 Dec 2007 11:54:45 +0000 (11:54 +0000)
15 files changed:
src/LightApp/LightApp_Application.cxx
src/LightApp/LightApp_Application.h
src/LightApp/LightApp_ModuleAction.cxx
src/Qtx/QtxAction.cxx
src/Qtx/QtxActionMenuMgr.cxx
src/Qtx/QtxActionMenuMgr.h
src/Qtx/QtxActionMgr.cxx
src/Qtx/QtxActionToolMgr.cxx
src/Qtx/QtxDockWidget.cxx
src/Qtx/QtxPreferenceMgr.cxx
src/Qtx/QtxPreferenceMgr.h
src/Qtx/QtxToolBar.cxx
src/Qtx/QtxWorkstack.cxx
src/SUIT/SUIT_Application.cxx
src/SUIT/SUIT_Application.h

index bef1e575997622b2033faa29dfdffb13d2aa2f14..bfbf063c952482a816f340f1d3230485696725bb 100644 (file)
@@ -1,17 +1,17 @@
 // Copyright (C) 2005  OPEN CASCADE, CEA/DEN, EDF R&D, PRINCIPIA R&D
-// 
+//
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either 
+// License as published by the Free Software Foundation; either
 // version 2.1 of the License.
-// 
-// This library is distributed in the hope that it will be useful 
-// but WITHOUT ANY WARRANTY; without even the implied warranty of 
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+//
+// This library is distributed in the hope that it will be useful
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 // Lesser General Public License for more details.
 //
-// You should have received a copy of the GNU Lesser General Public  
-// License along with this library; if not, write to the Free Software 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #include <SUIT_ViewWindow.h>
 
 #include <Qtx.h>
-#include <QtxMRUAction.h>
-#include <QtxDockAction.h>
 #include <QtxToolBar.h>
 #include <QtxTreeView.h>
+#include <QtxMRUAction.h>
+#include <QtxDockAction.h>
+#include <QtxDockWidget.h>
+#include <QtxActionToolMgr.h>
 
 #include <LogWindow.h>
 
   #include <SALOME_ListIO.hxx>
 #endif
 
+#define ToolBarMarker    0
+#define DockWidgetMarker 1
+
 static const char* imageEmptyIcon[] = {
 "20 20 1 1",
 ".     c None",
@@ -263,14 +268,14 @@ LightApp_Application::LightApp_Application()
   // Set existing font for the python console in resources
   if( !aResMgr->hasValue( "PyConsole", "font" ) )
     return;
-  
+
   QFont f = aResMgr->fontValue( "PyConsole", "font" );
   QFontDatabase fdb;
   QStringList famdb = fdb.families();
-  
+
   if ( famdb.contains(f.family()) || !aResMgr->hasValue( "PyConsole", "additional_families" ) )
     return;
-  
+
   QStringList anAddFamilies = aResMgr->stringValue( "PyConsole", "additional_families" ).split( ";", QString::SkipEmptyParts );
   QString aFamily;
   for ( QStringList::Iterator it = anAddFamilies.begin(); it != anAddFamilies.end(); ++it )
@@ -299,15 +304,9 @@ LightApp_Application::~LightApp_Application()
 /*!Start application.*/
 void LightApp_Application::start()
 {
-  if ( desktop() ) {
+  if ( desktop() )
     desktop()->retrieveGeometry( resourceMgr()->stringValue( "desktop", "geometry", "(800%)x(800%) (+400%) (+400%) :(full)" ) );
-    //desktop()->retrieveGeometry( SUIT_Session::session()->resourceMgr()->stringValue( "desktop", "state", "normal" ));
-    //desktop()->retrieveGeometry( SUIT_Session::session()->resourceMgr()->stringValue( "desktop", "pos_x", "center" ));
-    //desktop()->retrieveGeometry( SUIT_Session::session()->resourceMgr()->stringValue( "desktop", "pos_y", "center" ));
-    //desktop()->retrieveGeometry( SUIT_Session::session()->resourceMgr()->stringValue( "desktop", "widht", "800" ));
-    //desktop()->retrieveGeometry( SUIT_Session::session()->resourceMgr()->stringValue( "desktop", "height", "800" ));
-  }
-  
+
   CAM_Application::start();
 
   updateWindows();
@@ -362,7 +361,7 @@ QString LightApp_Application::applicationVersion() const
       }
     }
   }
-  return _app_version;  
+  return _app_version;
 }
 
 /*!Load module by \a name.*/
@@ -390,15 +389,15 @@ bool LightApp_Application::activateModule( const QString& modName )
   if ( actName == modName )
     return true;
 
-  putInfo( tr( "ACTIVATING_MODULE" ).arg( modName ) );  
+  putInfo( tr( "ACTIVATING_MODULE" ).arg( modName ) );
 
-  saveWindowsGeometry();
+  saveDockWindowsState();
 
   bool status = CAM_Application::activateModule( modName );
 
   updateModuleActions();
 
-  putInfo( "" );  
+  putInfo( "" );
 
   if ( !status )
     return false;
@@ -460,7 +459,7 @@ void LightApp_Application::createActions()
     root = Qtx::addSlash( Qtx::addSlash(dir) + Qtx::addSlash("share") + Qtx::addSlash("doc") +
                           Qtx::addSlash("salome") + Qtx::addSlash("gui") +  Qtx::addSlash("GUI") );
     if ( QFileInfo( root + aFileName ).exists() ) {
-      a = createAction( id, tr( QString("GUI Help").toLatin1().constData() ), 
+      a = createAction( id, tr( QString("GUI Help").toLatin1().constData() ),
                        resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
                        tr( QString("GUI Help").toLatin1().constData() ),
                        tr( QString("GUI Help").toLatin1().constData() ),
@@ -473,10 +472,10 @@ void LightApp_Application::createActions()
   dir = getenv("KERNEL_ROOT_DIR");
   if ( !dir.isEmpty() ) {
     QString aFN = "index.html";
-    root = Qtx::addSlash( Qtx::addSlash(dir) + Qtx::addSlash("share") + Qtx::addSlash("doc") + 
+    root = Qtx::addSlash( Qtx::addSlash(dir) + Qtx::addSlash("share") + Qtx::addSlash("doc") +
                          Qtx::addSlash("salome") );
     if ( QFileInfo( root + aFN ).exists() ) {
-      a = createAction( id, tr( QString("KERNEL Help").toLatin1().constData() ), 
+      a = createAction( id, tr( QString("KERNEL Help").toLatin1().constData() ),
                        resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
                        tr( QString("KERNEL Help").toLatin1().constData() ),
                        tr( QString("KERNEL Help").toLatin1().constData() ),
@@ -494,10 +493,10 @@ void LightApp_Application::createActions()
       continue;
 
     QString modName = moduleName( *it );
-    
+
     dir = getenv( (modName + "_ROOT_DIR").toLatin1().constData() );
     if ( !dir.isEmpty() ) {
-      root = Qtx::addSlash( Qtx::addSlash(dir) +  Qtx::addSlash("share") + Qtx::addSlash("doc") + 
+      root = Qtx::addSlash( Qtx::addSlash(dir) +  Qtx::addSlash("share") + Qtx::addSlash("doc") +
                             Qtx::addSlash("salome") + Qtx::addSlash("gui") +  Qtx::addSlash(modName) );
       if ( QFileInfo( root + aFileName ).exists() ) {
 
@@ -531,11 +530,9 @@ void LightApp_Application::createActions()
   QStringList modList;
   modules( modList, false );
 
-  if( modList.count() > 1 )
+  if ( modList.count() > 1 )
   {
-    QtxToolBar* modTBar = new QtxToolBar( true, tr( "INF_TOOLBAR_MODULES" ), desk );
-
-    LightApp_ModuleAction* moduleAction = 
+    LightApp_ModuleAction* moduleAction =
       new LightApp_ModuleAction( tr( "APP_NAME" ), defIcon, desk );
 
     QMap<QString, QString> iconMap;
@@ -547,7 +544,7 @@ void LightApp_Application::createActions()
     {
       if ( !isLibExists( *it ) )
         continue;
-    
+
       QString iconName;
       if ( iconMap.contains( *it ) )
         iconName = iconMap[*it];
@@ -564,13 +561,12 @@ void LightApp_Application::createActions()
       }
 
       icon = Qtx::scaleIcon( icon, iconSize );
-      
+
       moduleAction->insertModule( *it, icon );
     }
 
     connect( moduleAction, SIGNAL( moduleActivated( const QString& ) ), this, SLOT( onModuleActivation( const QString& ) ) );
     registerAction( ModulesListId, moduleAction );
-    modTBar->addAction( moduleAction );
   }
 
   // New window
@@ -595,7 +591,6 @@ void LightApp_Application::createActions()
   createActionForViewer( NewQxGraphViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_C );
 #endif
 
-
   createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
                Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
   createMenu( RenameId, windowMenu, -1 );
@@ -607,6 +602,9 @@ void LightApp_Application::createActions()
   createMenu( separator(), fileMenu, -1, 100, -1 );
   createMenu( MRUId, fileMenu, 100, -1 );
   createMenu( separator(), fileMenu, -1, 100, -1 );
+
+  int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ) );
+  createTool( ModulesListId, modTBar );
 }
 
 /*!On module activation action.*/
@@ -635,8 +633,8 @@ void LightApp_Application::onModuleActivation( const QString& modName )
     else {
       // cancelled
       putInfo( tr("INF_CANCELLED") );
-      
-      LightApp_ModuleAction* moduleAction = 
+
+      LightApp_ModuleAction* moduleAction =
        qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
       if ( moduleAction )
        moduleAction->setActiveModule( QString() );
@@ -707,7 +705,7 @@ void LightApp_Application::onNewDoc()
 {
   SUIT_Study* study = activeStudy();
 
-  saveWindowsGeometry();
+  saveDockWindowsState();
 
   CAM_Application::onNewDoc();
 
@@ -724,7 +722,7 @@ void LightApp_Application::onNewDoc()
 void LightApp_Application::onOpenDoc()
 {
   SUIT_Study* study = activeStudy();
-  saveWindowsGeometry();
+  saveDockWindowsState();
 
   CAM_Application::onOpenDoc();
 
@@ -835,8 +833,6 @@ void LightApp_Application::onSelection()
 void LightApp_Application::setActiveStudy( SUIT_Study* study )
 {
   CAM_Application::setActiveStudy( study );
-
-  activateWindows();
 }
 
 /*!
@@ -885,15 +881,15 @@ void LightApp_Application::updateCommandsStatus()
 class RunBrowser: public QThread
 {
 public:
-  RunBrowser( LightApp_Application* app, 
-             const QString&        theApp, 
-             const QString&        theParams, 
-             const QString&        theHelpFile, 
+  RunBrowser( LightApp_Application* app,
+             const QString&        theApp,
+             const QString&        theParams,
+             const QString&        theHelpFile,
              const QString&        theContext = QString() )
-    : myApp( theApp ), 
-      myParams( theParams ), 
+    : myApp( theApp ),
+      myParams( theParams ),
 #ifdef WIN32
-      myHelpFile( "file://" + theHelpFile ), 
+      myHelpFile( "file://" + theHelpFile ),
 #else
       myHelpFile( "file:" + theHelpFile ),
 #endif
@@ -912,7 +908,7 @@ public:
 
       QProcess* proc = new QProcess();
       //myStatus = system(aCommand);
-      
+
       //if(myStatus != 0)
       proc->start( aCommand );
       if ( proc->waitForStarted() ) {
@@ -945,10 +941,10 @@ void LightApp_Application::onHelpContentsModule()
   QString aFileNameKernel = "index.html";
 
   QString dir = getenv( (aComponentName + "_ROOT_DIR").toLatin1().constData() );
-  QString homeDir = !aComponentName.compare(QString("KERNEL")) ? 
-    Qtx::addSlash( Qtx::addSlash(dir) + Qtx::addSlash("share") + Qtx::addSlash("doc") + Qtx::addSlash("salome") ) : 
+  QString homeDir = !aComponentName.compare(QString("KERNEL")) ?
+    Qtx::addSlash( Qtx::addSlash(dir) + Qtx::addSlash("share") + Qtx::addSlash("doc") + Qtx::addSlash("salome") ) :
     Qtx::addSlash( Qtx::addSlash(dir) + Qtx::addSlash("share") + Qtx::addSlash("doc") + Qtx::addSlash("salome") + Qtx::addSlash("gui") +  Qtx::addSlash(aComponentName) );
-  
+
   QString helpFile = QFileInfo( homeDir + (!aComponentName.compare(QString("KERNEL")) ? aFileNameKernel : aFileName) ).absoluteFilePath();
   SUIT_ResourceMgr* resMgr = resourceMgr();
        QString platform;
@@ -959,9 +955,9 @@ void LightApp_Application::onHelpContentsModule()
 #endif
        QString anApp = resMgr->stringValue("ExternalBrowser", platform);
 #ifdef WIN32
-       QString quote("\""); 
-       anApp.prepend( quote ); 
-       anApp.append( quote ); 
+       QString quote("\"");
+       anApp.prepend( quote );
+       anApp.append( quote );
 #endif
   QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
 
@@ -981,18 +977,18 @@ void LightApp_Application::onHelpContentsModule()
 /*!
   SLOT: Displays help contents for choosen dialog
 */
-void LightApp_Application::onHelpContextModule( const QString& theComponentName, 
-                                               const QString& theFileName, 
+void LightApp_Application::onHelpContextModule( const QString& theComponentName,
+                                               const QString& theFileName,
                                                const QString& theContext )
 {
   QString homeDir = "";
   if ( !theComponentName.isEmpty() ) {
     QString dir = getenv( ( theComponentName + "_ROOT_DIR" ).toLatin1().constData() );
     if ( !dir.isEmpty() )
-      homeDir = Qtx::addSlash( Qtx::addSlash( dir )      + 
-                              Qtx::addSlash( "share" )  + 
-                              Qtx::addSlash( "doc" )    + 
-                              Qtx::addSlash( "salome" ) + 
+      homeDir = Qtx::addSlash( Qtx::addSlash( dir )      +
+                              Qtx::addSlash( "share" )  +
+                              Qtx::addSlash( "doc" )    +
+                              Qtx::addSlash( "salome" ) +
                               Qtx::addSlash( "gui" )    +
                               Qtx::addSlash( theComponentName ) );
   }
@@ -1007,9 +1003,9 @@ void LightApp_Application::onHelpContextModule( const QString& theComponentName,
 #endif
        QString anApp = resMgr->stringValue("ExternalBrowser", platform);
 #ifdef WIN32
-       QString quote("\""); 
-       anApp.prepend( quote ); 
-       anApp.append( quote ); 
+       QString quote("\"");
+       anApp.prepend( quote );
+       anApp.append( quote );
 #endif
   QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
 
@@ -1033,30 +1029,6 @@ void LightApp_Application::onSelectionChanged()
 {
 }
 
-/*!
-  \return window by key
-  \param flag - key for window
-  \param studyId - study id
-  Flag used how identificator of window in windows list.
-*/
-QWidget* LightApp_Application::window( const int flag, const int studyId ) const
-{
-  QWidget* wid = 0;
-
-  int sId = studyId;
-  if ( sId < 0 ) {
-    if ( !activeStudy() )
-      return 0;
-    else
-      sId = activeStudy()->id();
-  }
-  
-  if ( myWindows.contains( flag ) )
-    wid = myWindows[flag]->widget( sId );
-
-  return wid;
-}
-
 /*!
   Adds window to application.
   \param wid - QWidget
@@ -1064,6 +1036,7 @@ QWidget* LightApp_Application::window( const int flag, const int studyId ) const
   \param studyId - study id
   Flag used how identificator of window in windows list.
 */
+/*
 void LightApp_Application::addWindow( QWidget* wid, const int flag, const int studyId )
 {
   if ( !wid )
@@ -1085,7 +1058,7 @@ void LightApp_Application::addWindow( QWidget* wid, const int flag, const int st
 
     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 
+    // 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 ) ) {
@@ -1122,85 +1095,93 @@ void LightApp_Application::addWindow( QWidget* wid, const int flag, const int st
 
   setWindowShown( flag, !myWindows[flag]->isEmpty() );
 }
-
-/*!
-  Removes window from application.
-  \param flag - key for window
-  \param studyId - study id
-  Flag used how identificator of window in windows list.
 */
-void LightApp_Application::removeWindow( const int flag, const int studyId )
+
+QWidget* LightApp_Application::dockWindow( const int id ) const
 {
-  if ( !myWindows.contains( flag ) )
-    return;
+  QWidget* wid = 0;
+  if ( myWin.contains( id ) )
+    wid = myWin[id];
+  return wid;
+}
 
-  int sId = studyId;
-  if ( sId < 0 )
+QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
+{
+  if ( !wid )
+    return 0;
+
+  QDockWidget* dock = 0;
+  QWidget* w = wid->parentWidget();
+  while ( w && !dock )
   {
-    if ( !activeStudy() )
-      return;
-    else
-      sId = activeStudy()->id();
+    dock = ::qobject_cast<QDockWidget*>( w );
+    w = w->parentWidget();
   }
+  return dock;
+}
 
-  bool anIsEmpty = !myWindows[flag]->isEmpty();
-  QWidget* wid = myWindows[flag]->widget( sId );
-  myWindows[flag]->remove( sId );
+void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
+{
+  if ( !wid )
+    return;
+
+  if ( wid != dockWindow( id ) )
+    removeDockWindow( id );
+
+  myWin.insert( id, wid );
+
+  QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
+  connect( dock, SIGNAL(  destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
 
-  //setWindowShown( flag, !myWindows[flag]->isEmpty() );
-  setWindowShown( flag, anIsEmpty );
+  dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
+  dock->setObjectName( QString( "window_%1" ).arg( id ) );
+  dock->setWidget( wid );
+  dock->show();
 }
 
-/*!
-  Gets window.
-  \param flag - key for window
-  \param studyId - study id
-  Flag used how identificator of window in windows list.
-*/
-QWidget* LightApp_Application::getWindow( const int flag, const int studyId )
+void LightApp_Application::removeDockWindow( const int id )
 {
-  QWidget* wid = window( flag, studyId );
+  QWidget* wid = dockWindow( id );
   if ( !wid )
-    addWindow( wid = createWindow( flag ), flag, studyId );
+    return;
 
-  return wid;
+  myWin.remove( id );
+
+  QDockWidget* dock = windowDock( wid );
+  if ( !dock )
+    return;
+
+  dock->setWidget( 0 );
+  wid->setParent( 0 );
+  wid->setVisible( false );
+  delete dock;
 }
 
-/*!
-  \return is window visible
-  \param type - flag of window
-*/
-bool LightApp_Application::isWindowVisible( const int type ) const
+void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
 {
-  bool res = false;
-  if ( myWindows.contains( type ) )
-  {
-    //SUIT_Desktop* desk = ((LightApp_Application*)this)->desktop();
-    //res = desk && desk->appropriate( myWindows[type] );
-    res = myWindows[type]->isVisible();
-  }
-  return res;
+  QDockWidget* dock = windowDock( dockWindow( id ) );
+  if ( dock && desktop() )
+    desktop()->addDockWidget( place, dock );
 }
 
 /*!
-  Sets window show or hide.
-  \param type - window identificator.
-  \param on   - true/false (window show/hide)
+  Gets window.
+  \param flag - key for window
+  \param studyId - study id
+  Flag used how identificator of window in windows list.
 */
-void LightApp_Application::setWindowShown( const int type, const bool on )
+QWidget* LightApp_Application::getWindow( const int flag, const int )
 {
-  if ( !desktop() || !myWindows.contains( type ) )
-    return;
+  QWidget* wid = dockWindow( flag );
+  if ( !wid )
+    insertDockWindow( flag, wid = createWindow( flag ) );
 
-  QDockWidget* dw = myWindows[type];
-  //desktop()->setAppropriate( dw, on );
-  if( on )
-    dw->show();
-  else if( dw->isVisible() )
-  {
-    dw->hide();
-    myWindowsVisible[ type ] = true;
-  }
+  QMap<int, int> winMap;
+  currentWindows( winMap );
+  if ( winMap.contains( flag ) )
+    placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
+
+  return wid;
 }
 
 /*!
@@ -1208,7 +1189,7 @@ void LightApp_Application::setWindowShown( const int type, const bool on )
 */
 LightApp_Browser* LightApp_Application::objectBrowser()
 {
-  return qobject_cast<LightApp_Browser*>( window( WT_ObjectBrowser ) );
+  return qobject_cast<LightApp_Browser*>( dockWindow( WT_ObjectBrowser ) );
 }
 
 /*!
@@ -1216,7 +1197,7 @@ LightApp_Browser* LightApp_Application::objectBrowser()
 */
 LogWindow* LightApp_Application::logWindow()
 {
-  return qobject_cast<LogWindow*>( window( WT_LogWindow ) );
+  return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
 }
 
 #ifndef DISABLE_PYCONSOLE
@@ -1225,7 +1206,7 @@ LogWindow* LightApp_Application::logWindow()
 */
 PyConsole_Console* LightApp_Application::pythonConsole()
 {
-  return qobject_cast<PyConsole_Console*>( window( WT_PyConsole ) );
+  return qobject_cast<PyConsole_Console*>( dockWindow( WT_PyConsole ) );
 }
 #endif
 
@@ -1236,7 +1217,7 @@ PyConsole_Console* LightApp_Application::pythonConsole()
 void LightApp_Application::updateObjectBrowser( const bool updateModels )
 {
   // update existing data models
-  if ( updateModels ) 
+  if ( updateModels )
   {
     const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
     if ( objectBrowser() )
@@ -1324,7 +1305,7 @@ SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType
 #else
     vm = new Plot2d_Viewer();
 #endif
-    viewMgr->setViewModel( vm  );// custom view model, which extends SALOME_View interface 
+    viewMgr->setViewModel( vm  );// custom view model, which extends SALOME_View interface
     Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
     if( wnd )
     {
@@ -1427,6 +1408,8 @@ void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
 
   getWindow( WT_ObjectBrowser );
 
+  loadDockWindowsState();
+
   if ( objectBrowser() )
     objectBrowser()->setRoot( aRoot );
 
@@ -1434,8 +1417,6 @@ void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
 
   if ( objectBrowser() )
     objectBrowser()->openLevels();
-
-  activateWindows();
 }
 
 /*!
@@ -1453,6 +1434,8 @@ void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
 
   getWindow( WT_ObjectBrowser );
 
+  loadDockWindowsState();
+
   if ( objectBrowser() )
     objectBrowser()->setRoot( aRoot );
 
@@ -1461,8 +1444,6 @@ void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
   if ( objectBrowser() )
     objectBrowser()->openLevels();
 
-  activateWindows();
-
   emit studyOpened();
 }
 
@@ -1482,9 +1463,6 @@ void LightApp_Application::onStudyClosed( SUIT_Study* s )
   emit studyClosed();
 
   activateModule( "" );
-
-  for ( WindowMap::ConstIterator itr = myWindows.begin(); s && itr != myWindows.end(); ++itr )
-    removeWindow( itr.key(), s->id() );
 }
 
 /*!Protected SLOT.On desktop activated.*/
@@ -1509,7 +1487,7 @@ QString LightApp_Application::getFileFilter() const
 /*!
   Shows file dialog and return user selected file name
 */
-QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters, 
+QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
                                            const QString& caption, QWidget* parent )
 {
   if ( !parent )
@@ -1527,7 +1505,7 @@ QString LightApp_Application::getDirectory( const QString& initial, const QStrin
 }
 
 /*! Get open file names*/
-QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters, 
+QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
                                                     const QString& caption, QWidget* parent )
 {
   if ( !parent )
@@ -1671,7 +1649,7 @@ QWidget* LightApp_Application::createWindow( const int flag )
   Adds to map \a aMap.
  */
 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
-{  
+{
   aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
 #ifndef DISABLE_PYCONSOLE
   aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
@@ -1717,7 +1695,7 @@ LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
 
     QStringList modNameList;
     app->modules( modNameList, false );
-    for ( QStringList::const_iterator it = modNameList.begin(); 
+    for ( QStringList::const_iterator it = modNameList.begin();
          it != modNameList.end(); ++it )
       _prefs_->addPreference( *it );
 
@@ -1764,10 +1742,10 @@ void LightApp_Application::moduleAdded( CAM_Module* mod )
 
   if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
   {
-    int modCat = myPrefs->addPreference( mod->moduleName() );
+    myPrefs->addPreference( mod->moduleName() );
     lightMod->createPreferences();
     QtxPreferenceItem* item = myPrefs->findItem( mod->moduleName(), true );
-    if ( item && item->isEmpty() ) 
+    if ( item && item->isEmpty() )
       delete item;
   }
 }
@@ -1881,7 +1859,7 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref )
   anIndexesList.append(0);
   anIndexesList.append(1);
   anIndexesList.append(2);
-  
+
   pref->setItemProperty( "strings", aCurveTypesList, curveType );
   pref->setItemProperty( "indexes", anIndexesList, curveType );
 
@@ -1890,11 +1868,11 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref )
 
   pref->setItemProperty( "min", 0, markerSize );
   pref->setItemProperty( "max", 100, markerSize );
-  
+
   QStringList aScaleModesList;
   aScaleModesList.append( tr("PREF_LINEAR") );
   aScaleModesList.append( tr("PREF_LOGARITHMIC") );
-  
+
   anIndexesList.clear();
   anIndexesList.append(0);
   anIndexesList.append(1);
@@ -2094,7 +2072,7 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString
   }
 
   if( sec=="Study" )
-  { 
+  {
     if( param=="store_positions" )
       updateWindows();
   }
@@ -2122,19 +2100,59 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString
   }
 }
 
+/*!
+  Loads preferences
+*/
+void LightApp_Application::loadPreferences()
+{
+  CAM_Application::loadPreferences();
+
+  SUIT_ResourceMgr* aResMgr = resourceMgr();
+
+  if ( !aResMgr )
+    return;
+
+  myWinGeom.clear();
+  QStringList mods = aResMgr->parameters( "windows_geometry" );
+  for ( QStringList::const_iterator it = mods.begin(); it != mods.end(); ++it )
+  {
+    QByteArray arr;
+    if ( aResMgr->value( "windows_geometry", *it, arr ) )
+      myWinGeom.insert( *it, arr );
+  }
+
+  myWinVis.clear();
+  mods = aResMgr->parameters( "windows_visibility" );
+  for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
+  {
+    QByteArray arr;
+    if ( aResMgr->value( "windows_visibility", *itr, arr ) )
+      myWinVis.insert( *itr, arr );
+  }
+}
+
 /*!
   Saves preferences
 */
 void LightApp_Application::savePreferences()
 {
-  saveWindowsGeometry();
-  
-  if ( resourceMgr() )
-    {
-      if ( desktop() )
-       resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
-      resourceMgr()->save();
-    }
+  CAM_Application::savePreferences();
+
+  saveDockWindowsState();
+
+  if ( !resourceMgr() )
+    return;
+
+  for ( WinGeom::const_iterator it = myWinGeom.begin(); it != myWinGeom.end(); ++it )
+    resourceMgr()->setValue( "windows_geometry", it.key(), it.value() );
+
+  for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
+    resourceMgr()->setValue( "windows_visibility", itr.key(), itr.value() );
+
+  if ( desktop() )
+    resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
+
+  resourceMgr()->save();
 }
 
 /*!
@@ -2155,12 +2173,12 @@ void LightApp_Application::updateDesktopTitle() {
 }
 
 /*!
-  \brief Get map of the operations which can be performed 
+  \brief Get map of the operations which can be performed
   on the module activation.
+
   The method should return the map of the kind \c {<id>:<name>}
   where \c <id> is an integer identifier of the operation and
-  \c <name> is a title for the button to be added to the 
+  \c <name> is a title for the button to be added to the
   dialog box. After user selects the required operation by the
   clicking the corresponding button in the dialog box, its identifier
   is passed to the moduleActionSelected() method to process
@@ -2182,7 +2200,7 @@ QMap<int, QString> LightApp_Application::activateModuleActions() const
   from "Activate module" dialog box.
 
   Performs the required operation according to the user choice.
-  
+
   \param id operation identifier
   \sa activateModuleActions()
 */
@@ -2218,8 +2236,8 @@ void LightApp_Application::updateModuleActions()
   QString modName;
   if ( activeModule() )
     modName = activeModule()->moduleName();
-  
-  LightApp_ModuleAction* moduleAction = 
+
+  LightApp_ModuleAction* moduleAction =
     qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
   if ( moduleAction )
     moduleAction->setActiveModule( modName );
@@ -2265,35 +2283,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 ) {
-      getWindow( it.key() ); 
-      
-      if ( !myWindows.contains( it.key() ) )
-       continue;
-      Qt::DockWidgetArea dock = desktop()->dockWidgetArea( myWindows[it.key()] );
-      if ( dock != Qt::NoDockWidgetArea
-          &&
-          dock != (Qt::DockWidgetArea)it.value() ) {
-       //desktop()->removeDockWidget( myWindows[it.key()] );
-       desktop()->addDockWidget( (Qt::DockWidgetArea)it.value(), myWindows[it.key()] );
-      }
+  if ( activeStudy() )
+  {
+    for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
+    {
+      if ( !dockWindow( it.key() ) )
+       getWindow( it.key() );
     }
-
-    loadWindowsGeometry();
   }
 
-  // setWindowShown should be done even if no study is active (open). in this case all open windows
-  // will be hidden, which is neccessary in this case.
-  for ( WindowMap::ConstIterator itr = myWindows.begin(); itr != myWindows.end(); ++itr ) {
-    
-    if ( myWindowsVisible.contains( itr.key() ) && 
-        !myWindowsVisible[ itr.key() ] )
-      continue;
-
-    if ( itr.value() ) 
-      setWindowShown( itr.key(), !itr.value()->isEmpty() && winMap.contains( itr.key() ) );
+  for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
+  {
+    QWidget* wid = it.value();
+    wid->setVisible( activeStudy() && winMap.contains( it.key() ) );
   }
+
+  loadDockWindowsState();
 }
 
 /*!
@@ -2311,7 +2316,7 @@ void LightApp_Application::updateViewManagers()
 /*!
   Loads windows geometry
 */
-void LightApp_Application::loadWindowsGeometry()
+void LightApp_Application::loadDockWindowsState()
 {
   bool store = resourceMgr()->booleanValue( "Study", "store_positions", true );
   if( !store )
@@ -2321,13 +2326,36 @@ void LightApp_Application::loadWindowsGeometry()
   if ( activeModule() )
     modName = activeModule()->name();
 
-  desktop()->restoreState( resourceMgr()->stringValue( "windows_geometry", modName ).toLatin1() );
+  if ( myWinGeom.contains( modName ) )
+    desktop()->restoreState( myWinGeom[modName] );
+
+  if ( !myWinVis.contains( modName ) )
+    return;
+
+  QMap<QString, bool> tbMap, dwMap;
+  dockWindowsState( myWinVis[modName], tbMap, dwMap );
+
+  QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
+  for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
+  {
+    QToolBar* tb = *tit;
+    if ( tbMap.contains( tb->objectName() ) )
+      tb->setVisible( tbMap[tb->objectName()] );
+  }
+
+  QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
+  for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
+  {
+    QDockWidget* dw = *dit;
+    if ( dwMap.contains( dw->objectName() ) )
+      dw->setVisible( dwMap[dw->objectName()] );
+  }
 }
 
 /*!
   Saves windows geometry
 */
-void LightApp_Application::saveWindowsGeometry()
+void LightApp_Application::saveDockWindowsState()
 {
   bool store = resourceMgr()->booleanValue( "Study", "store_positions", true );
   if( !store )
@@ -2337,18 +2365,94 @@ void LightApp_Application::saveWindowsGeometry()
   if ( activeModule() )
     modName = activeModule()->name();
 
-  resourceMgr()->setValue( "windows_geometry", modName, desktop()->saveState() );
+  myWinGeom.insert( modName, desktop()->saveState() );
+
+  QByteArray visArr;
+  if ( myWinVis.contains( modName ) )
+    visArr = myWinVis[modName];
+
+  QMap<QString, bool> tbMap, dwMap;
+  dockWindowsState( visArr, tbMap, dwMap );
+
+  QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
+  for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
+  {
+    QToolBar* tb = *it;
+    tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
+  }
+
+  QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
+  for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
+  {
+    QDockWidget* wid = *it;
+    dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
+  }
+
+  visArr = dockWindowsState( tbMap, dwMap );
+
+  myWinVis.insert( modName, visArr );
 }
 
-/*!
-  Activates windows
-*/
-void LightApp_Application::activateWindows()
+QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
 {
-  if ( activeStudy() )
+  QByteArray visArr;
+  QDataStream stream( &visArr, QIODevice::WriteOnly );
+
+  stream << (uchar)ToolBarMarker;
+  stream << tb.size();
+  for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
+  {
+    stream << tit.key();
+    stream << (uchar)( tit.value() ? 1 : 0 );
+  }
+
+  stream << (uchar)DockWidgetMarker;
+  stream << dw.size();
+  for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
   {
-    for ( WindowMap::Iterator itr = myWindows.begin(); itr != myWindows.end(); ++itr )
-      itr.value()->activate( activeStudy()->id() );
+    stream << wit.key();
+    stream << (uchar)( wit.value() ? 1 : 0 );
+  }
+
+  return visArr;
+}
+
+void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
+{
+  tb.clear();
+  dw.clear();
+
+  QByteArray visArr = arr;
+  QDataStream stream( &visArr, QIODevice::ReadOnly );
+
+  uchar marker;
+  stream >> marker;
+  if ( marker != ToolBarMarker )
+    return;
+
+  int lines;
+  stream >> lines;
+  for ( int i = 0; i < lines; ++i )
+  {
+    QString objectName;
+    stream >> objectName;
+    uchar shown;
+    stream >> shown;
+    tb.insert( objectName, shown );
+  }
+
+  stream >> marker;
+  if ( marker != DockWidgetMarker )
+    return;
+
+  stream >> lines;
+  for ( int j = 0; j < lines; ++j )
+  {
+    QString objectName;
+    stream >> objectName;
+    uchar shown;
+    stream >> shown;
+    dw.insert( objectName, shown );
   }
 }
 
@@ -2437,13 +2541,13 @@ SUIT_Accel* LightApp_Application::accel() const
 void LightApp_Application::onWCDestroyed( QObject* ob )
 {
   // remove destroyed widget container from windows map
-  for ( WindowMap::ConstIterator itr = myWindows.begin(); itr != myWindows.end(); ++itr )
+  for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
   {
     if ( itr.value() != ob )
       continue;
 
     int key = itr.key();
-    myWindows.remove( key );
+    myWin.remove( key );
     break;
   }
 }
@@ -2497,7 +2601,7 @@ bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
     return false;
 
   QString lib = moduleLibrary( moduleTitle );
-  
+
   //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
   bool isPythonModule = lib.contains("SalomePyQtGUI");
 
@@ -2513,14 +2617,14 @@ bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
   for( ; anIt!=aLast; anIt++ )
   {
     QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
-    
+
     if( inf.exists() )
       {
        isLibFound = true;
        break;
       }
   }
-  
+
   if ( !isLibFound )
     {
       printf( "****************************************************************\n" );
@@ -2548,17 +2652,17 @@ bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
        {
          QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
          QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
-    
+
          if( !isPyLib && inf.exists() )
            isPyLib = true;
-         
+
          if( !isPyGuiLib && infgui.exists() )
            isPyGuiLib = true;
-         
+
          if ( isPyLib && isPyGuiLib && isLibFound)
            return true;
        }
-      
+
       printf( "****************************************************************\n" );
       printf( "*    Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
       if (!isPyLib)
@@ -2588,19 +2692,6 @@ void LightApp_Application::setDefaultStudyName( const QString& theName )
   }
 }
 
-/*! slot, called on show/hide of a dock window */
-void LightApp_Application::onVisibilityChanged( bool visible )
-{
-  const QObject* win = sender();
-  for ( WindowMap::ConstIterator itr = myWindows.begin(); itr != myWindows.end(); ++itr )
-    if ( itr.value() == win ) 
-    {
-      myWindowsVisible[ itr.key() ] = visible;
-      return;
-    }
-}
-
 /*!
   Custom event handler
 */
@@ -2627,8 +2718,8 @@ bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
 {
   if (theObj)
     {
-      bool isSuitable =        !theObj->entry().isEmpty() && 
-                       !theObj->componentDataType().isEmpty() && 
+      bool isSuitable =        !theObj->entry().isEmpty() &&
+                       !theObj->componentDataType().isEmpty() &&
                        !theObj->name().isEmpty();
       return isSuitable;
     }
index a4b0462fe0ae2978787b7f73f713b1d2e214a4b2..6e21b3ce35e6ad49e0725524f7923c227963611a 100644 (file)
@@ -1,17 +1,17 @@
 // Copyright (C) 2005  OPEN CASCADE, CEA/DEN, EDF R&D, PRINCIPIA R&D
-// 
+//
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either 
+// License as published by the Free Software Foundation; either
 // version 2.1 of the License.
-// 
-// This library is distributed in the hope that it will be useful 
-// but WITHOUT ANY WARRANTY; without even the implied warranty of 
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+//
+// This library is distributed in the hope that it will be useful
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 // Lesser General Public License for more details.
 //
-// You should have received a copy of the GNU Lesser General Public  
-// License along with this library; if not, write to the Free Software 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #include "LightApp.h"
 #include <CAM_Application.h>
 
+#include <QPointer>
+
 class LogWindow;
 class LightApp_Browser;
 #ifndef DISABLE_PYCONSOLE
-  class PyConsole_Console;
+class PyConsole_Console;
 #endif
 class LightApp_WidgetContainer;
 class LightApp_Preferences;
@@ -47,6 +49,7 @@ class CAM_Module;
 class QString;
 class QWidget;
 class QStringList;
+class QDockWidget;
 
 #ifdef WIN32
 #pragma warning( disable:4251 )
@@ -61,7 +64,7 @@ class LIGHTAPP_EXPORT LightApp_Application : public CAM_Application
   Q_OBJECT
 
 public:
-  typedef enum { WT_ObjectBrowser, 
+  typedef enum { WT_ObjectBrowser,
 #ifndef DISABLE_PYCONSOLE
                  WT_PyConsole,
 #endif
@@ -110,11 +113,11 @@ public:
   virtual bool                        activateModule( const QString& );
 
   LightApp_SelectionMgr*              selectionMgr() const;
-  
+
   LogWindow*                          logWindow();
   LightApp_Browser*                   objectBrowser();
 #ifndef DISABLE_PYCONSOLE
-  PyConsole_Console*                  pythonConsole(); 
+  PyConsole_Console*                  pythonConsole();
 #endif
 
   virtual void                        updateObjectBrowser( const bool = true );
@@ -123,10 +126,10 @@ public:
 
   virtual QString                     getFileFilter() const;
 
-  virtual QString                     getFileName( bool open, const QString& initial, const QString& filters, 
+  virtual QString                     getFileName( bool open, const QString& initial, const QString& filters,
                                                   const QString& caption, QWidget* parent );
   virtual QString                     getDirectory( const QString& initial, const QString& caption, QWidget* parent );
-  virtual QStringList                 getOpenFileNames( const QString& initial, const QString& filters, 
+  virtual QStringList                 getOpenFileNames( const QString& initial, const QString& filters,
                                                        const QString& caption, QWidget* parent );
 
   void                                updateActions();
@@ -137,12 +140,10 @@ public:
   virtual SUIT_ViewManager*           createViewManager( const QString& vmType );
 
   QWidget*                            getWindow( const int, const int = -1 );
-  QWidget*                            window( const int, const int = -1 ) const;
-  void                                addWindow( QWidget*, const int, const int = -1 );
-  void                                removeWindow( const int, const int = -1 );
-
-  bool                                isWindowVisible( const int ) const;
-  void                                setWindowShown( const int, const bool );
+  QWidget*                            dockWindow( const int ) const;
+  void                                removeDockWindow( const int );
+  void                                insertDockWindow( const int, QWidget* );
+  void                                placeDockWindow( const int, Qt::DockWidgetArea );
 
   virtual void                        start();
 
@@ -157,7 +158,7 @@ public:
   static int                          studyId();
 
   virtual bool                        event( QEvent* );
-  
+
   virtual bool                        checkDataObject( LightApp_DataObject* theObj );
 
 signals:
@@ -197,7 +198,10 @@ protected:
   LightApp_Preferences*               preferences( const bool ) const;
   virtual void                        createPreferences( LightApp_Preferences* );
   virtual void                        preferencesChanged( const QString&, const QString& );
+
+  virtual void                        loadPreferences();
   virtual void                        savePreferences();
+
   virtual void                        updateDesktopTitle();
 
   virtual QMap<int, QString>          activateModuleActions() const;
@@ -224,15 +228,14 @@ private slots:
   void                                onMRUActivated( QString );
   void                                onPreferenceChanged( QString&, QString&, QString& );
   void                                onRenameWindow();
-  void                                onVisibilityChanged( bool );
 
 protected:
   void                                updateWindows();
   void                                updateViewManagers();
   void                                updateModuleActions();
 
-  void                                loadWindowsGeometry();
-  void                                saveWindowsGeometry();
+  void                                loadDockWindowsState();
+  void                                saveDockWindowsState();
 
   void                                updatePreference( const QString&, const QString&, const QString& );
 
@@ -241,18 +244,25 @@ protected:
   void                                currentViewManagers( QStringList& ) const;
   void                                moduleIconNames( QMap<QString, QString>& ) const;
 
-  void                                activateWindows();
   bool                                isLibExists( const QString& ) const;
 
+  QDockWidget*                        windowDock( QWidget* ) const;
+  QByteArray                          dockWindowsState( const QMap<QString, bool>&, const QMap<QString, bool>& ) const;
+  void                                dockWindowsState( const QByteArray&, QMap<QString, bool>&, QMap<QString, bool>& ) const;
+
 protected:
-  typedef QMap<int, LightApp_WidgetContainer*> WindowMap;
-  typedef QMap<int, bool>                      WindowVisibilityMap;
+  typedef QPointer<QWidget>         WinPtr;
+  typedef QMap<int, WinPtr>         WinMap;
+  typedef QMap<QString, QByteArray> WinVis;
+  typedef QMap<QString, QByteArray> WinGeom;
 
 protected:
   LightApp_Preferences*               myPrefs;
   LightApp_SelectionMgr*              mySelMgr;
-  WindowMap                           myWindows;
-  WindowVisibilityMap                 myWindowsVisible;
+
+  WinMap                              myWin;
+  WinVis                              myWinVis;
+  WinGeom                             myWinGeom;
 
   SUIT_Accel*                         myAccel;
 
index ef1723e672cc359bd4bf015e861d6e9804fef726..c7ecc1bd11fe2d5ad886827668ffc551bff526ba 100755 (executable)
@@ -167,6 +167,7 @@ QWidget* LightApp_ModuleAction::ComboAction::createWidget( QWidget* parent )
   cb->setSizeAdjustPolicy( QComboBox::AdjustToContents );
   cb->setFocusPolicy( Qt::NoFocus );
   l->addWidget( cb );
+  l->addSpacing( 3 );
 
   connect( cb, SIGNAL( activatedId( int ) ), this, SIGNAL( activatedId( int ) ) );
 
index 1e46ce16d3d8d8231cec4cc9634468e53ed4cf79..e4da75af7b8569540cb7e4da450834a4247a5a03 100755 (executable)
@@ -22,6 +22,7 @@
 #include "QtxAction.h"
 
 #include <QEvent>
+#include <QPointer>
 #include <QActionEvent>
 #include <QApplication>
 
@@ -37,12 +38,12 @@ public:
   ActionNotify( bool add, QWidget* wid ) : QEvent( QEvent::User ), myAdd( add ), myWidget( wid ) {};
   ~ActionNotify() {};
 
-  bool     isAdded() const { return myAdd; }
-  QWidget* widget() const { return myWidget; }
+  bool              isAdded() const { return myAdd; }
+  QWidget*          widget() const { return myWidget; }
 
 private:
-  bool     myAdd;
-  QWidget* myWidget;
+  bool              myAdd;
+  QPointer<QWidget> myWidget;
 };
 
 /*!
@@ -195,6 +196,9 @@ void QtxAction::removedFrom( QWidget* /*w*/ )
 void QtxAction::customEvent( QEvent* e )
 {
   ActionNotify* ae = (ActionNotify*)e;
+  if ( !ae->widget() )
+    return;
+
   if ( ae->isAdded() )
     addedTo( ae->widget() );
   else
index f3b42a46d829c7879991961141d158c82fe3705a..2540721e3102dfc6c1b8dad297de8851170a13bb 100644 (file)
@@ -1027,9 +1027,9 @@ bool QtxActionMenuMgr::load( const QString& fname, QtxActionMgr::Reader& r )
   \param pid parent menu item ID
   \return \c true if parent menu item contains such child item
 */
-bool QtxActionMenuMgr::containsMenu( const QString& title, const int pid ) const
+bool QtxActionMenuMgr::containsMenu( const QString& title, const int pid, const bool rec ) const
 {
-  return (bool)find( title, pid, false );
+  return (bool)find( title, pid, rec );
 }
 
 /*!
@@ -1038,9 +1038,9 @@ bool QtxActionMenuMgr::containsMenu( const QString& title, const int pid ) const
   \param pid parent menu item ID
   \return \c true if parent menu item contains such child item
 */
-bool QtxActionMenuMgr::containsMenu( const int id, const int pid ) const
+bool QtxActionMenuMgr::containsMenu( const int id, const int pid, const bool rec ) const
 {
-  return (bool)find( id, pid, false );
+  return (bool)find( id, pid, rec );
 }
 
 /*!
index 96d15b51b4feea3e8c0897583dfd1cdfb682d84c..1f5079161267a45e48ce81e42099ec2cb4359d4f 100644 (file)
@@ -90,8 +90,8 @@ public:
 
   virtual bool load( const QString&, QtxActionMgr::Reader& );
 
-  bool         containsMenu( const QString&, const int ) const;
-  bool         containsMenu( const int, const int ) const;
+  bool         containsMenu( const QString&, const int, const bool = false ) const;
+  bool         containsMenu( const int, const int, const bool = false ) const;
 
   QMenu*       findMenu( const int ) const;
 
index d8c52a09f8dd6100c056399e4809162aa63b17dc..a1aa362b5c3480dcc7f5f8cca9c9b9ffdf7cdd1b 100644 (file)
@@ -40,7 +40,10 @@ static qtx_actionlist qtx_separator_actions;
 void qtxSeparatorActionCleanup()
 {
   for ( qtx_actionlist::iterator it = qtx_separator_actions.begin(); it != qtx_separator_actions.end(); ++it )
-    delete (QAction*)(*it);
+  {
+    QAction* a = *it;
+    delete a;
+  }
 }
 
 /*!
index a13c60e3ca72c5570cc8c690142137cfb177c726..47b339eddf560abd89fa3d82004b5d8f58b9a5b4 100644 (file)
@@ -594,8 +594,8 @@ bool QtxActionToolMgr::isVisible( const int id, const int tid ) const
     return false;
 
   bool vis = false;
-  const NodeList& lst = myToolBars[tid].nodes;
-  for ( NodeList::const_iterator it = lst.begin(); it != lst.end() && !vis; ++it )
+  const ToolBarInfo& inf = myToolBars[tid];
+  for ( NodeList::const_iterator it = inf.nodes.begin(); it != inf.nodes.end() && !vis; ++it )
   {
     const ToolNode& node = *it;
     if ( node.id == id )
index fd6f003714d12dcb0fb779ee6814236f0ba8ddcf..2984e7164d7925aebedcbd3bfac0342554b783eb 100644 (file)
@@ -43,6 +43,9 @@ public:
 
   virtual bool   eventFilter( QObject*, QEvent* );
 
+  bool           isEmpty() const;
+  bool           isVisible() const;
+
 protected:
   virtual void   customEvent( QEvent* );
 
@@ -56,11 +59,13 @@ private:
   void           updateCaption();
   void           updateVisibility();
 
+  void           setEmpty( const bool );
+  void           setVisible( const bool );
+
 private:
   QtxDockWidget* myCont;
   bool           myState;
   bool           myEmpty;
-  bool           myVisible;
 };
 
 /*!
@@ -73,7 +78,6 @@ QtxDockWidget::Watcher::Watcher( QtxDockWidget* cont )
   myEmpty( false )
 {
   myCont->installEventFilter( this );
-  myVisible = myCont->isVisibleTo( myCont->parentWidget() );
 
   installFilters();
 }
@@ -125,7 +129,7 @@ void QtxDockWidget::Watcher::shown( QtxDockWidget* dw )
   if ( dw != myCont )
     return;
 
-  myVisible = true;
+  setVisible( true );
 }
 
 /*!
@@ -137,7 +141,36 @@ void QtxDockWidget::Watcher::hidden( QtxDockWidget* dw )
   if ( dw != myCont )
     return;
 
-  myVisible = false;
+  setVisible( false );
+}
+
+bool QtxDockWidget::Watcher::isEmpty() const
+{
+  return myEmpty;
+}
+
+bool QtxDockWidget::Watcher::isVisible() const
+{
+  bool vis = false;
+  if ( myCont && myCont->toggleViewAction() )
+    vis = myCont->toggleViewAction()->isChecked();
+  return vis;
+}
+
+void QtxDockWidget::Watcher::setEmpty( const bool on )
+{
+  myEmpty = on;
+}
+
+void QtxDockWidget::Watcher::setVisible( const bool on )
+{
+  if ( !myCont || !myCont->toggleViewAction() )
+    return;
+
+  bool block = myCont->toggleViewAction()->signalsBlocked();
+  myCont->toggleViewAction()->blockSignals( true );
+  myCont->toggleViewAction()->setChecked( on );
+  myCont->toggleViewAction()->blockSignals( block );
 }
 
 /*!
@@ -148,10 +181,14 @@ void QtxDockWidget::Watcher::showContainer()
   if ( !myCont )
     return;
 
+  bool vis = isVisible();
+
   QtxDockWidget* cont = myCont;
   myCont = 0;
   cont->show();
   myCont = cont;
+
+  setVisible( vis );
 }
 
 /*!
@@ -162,10 +199,14 @@ void QtxDockWidget::Watcher::hideContainer()
   if ( !myCont )
     return;
 
+  bool vis = isVisible();
+
   QtxDockWidget* cont = myCont;
   myCont = 0;
   cont->hide();
   myCont = cont;
+
+  setVisible( vis );
 }
 
 /*!
@@ -216,10 +257,12 @@ void QtxDockWidget::Watcher::updateVisibility()
   for ( int i = 0; i < (int)l->count() && !vis; i++ )
     vis = l->itemAt( i ) && l->itemAt( i )->widget() && l->itemAt( i )->widget()->isVisibleTo( myCont );
 
-  if ( myEmpty == vis )
+  bool empty = isEmpty();
+  if ( empty == vis )
   {
-    myEmpty = !vis;
-    if ( !myEmpty )
+    empty = !vis;
+    setEmpty( empty );
+    if ( !empty )
       myCont->toggleViewAction()->setVisible( myState );
     else
     {
@@ -228,7 +271,7 @@ void QtxDockWidget::Watcher::updateVisibility()
     }
   }
 
-  vis = !myEmpty && myVisible;
+  vis = !empty && isVisible();
   if ( vis != myCont->isVisibleTo( myCont->parentWidget() ) )
     vis ? showContainer() : hideContainer();
 }
@@ -357,6 +400,12 @@ QSize QtxDockWidget::minimumSizeHint() const
 */
 void QtxDockWidget::setVisible( bool on )
 {
+  updateGeometry();
+  if ( widget() )
+    widget()->updateGeometry();
+
+  QDockWidget::setVisible( on && ( myWatcher ? !myWatcher->isEmpty() : true )  );
+
   if ( myWatcher )
   {
     if ( on )
@@ -364,12 +413,6 @@ void QtxDockWidget::setVisible( bool on )
     else
       myWatcher->hidden( this );
   }
-
-  updateGeometry();
-  if ( widget() )
-    widget()->updateGeometry();
-
-  QDockWidget::setVisible( on );
 }
 
 /*!
index ee43976945d6234466dde159f000f56164a9ab50..1b12db5e66a2a00f5f1a437fb1d4e88b33e1c2cb 100644 (file)
@@ -130,7 +130,8 @@ void QtxPreferenceItem::Updater::customEvent( QEvent* /*e*/ )
   \param parent parent preference item
 */
 QtxPreferenceItem::QtxPreferenceItem( QtxPreferenceItem* parent )
-: myParent( 0 )
+: myParent( 0 ),
+myEval( true )
 {
   myId = generateId();
 
@@ -425,6 +426,16 @@ void QtxPreferenceItem::setOption( const QString& name, const QVariant& val )
     sendItemChanges();
 }
 
+bool QtxPreferenceItem::isEvaluateValues() const
+{
+  return myEval;
+}
+
+void QtxPreferenceItem::setEvaluateValues( const bool on )
+{
+  myEval = on;
+}
+
 /*!
   \fn void QtxPreferenceItem::store();
   \brief Save preference item (for example, to the resource file).
@@ -588,8 +599,11 @@ bool QtxPreferenceItem::getBoolean( const bool val ) const
 */
 QString QtxPreferenceItem::getString( const QString& val ) const
 {
+  QString res = val;
   QtxResourceMgr* resMgr = resourceMgr();
-  return resMgr ? resMgr->stringValue( mySection, myParameter, val ) : val;
+  if ( resMgr )
+    resMgr->value( mySection, myParameter, res, isEvaluateValues() );
+  return res;
 }
 
 /*!
@@ -748,9 +762,12 @@ void QtxPreferenceItem::triggerUpdate()
   \return property value or null QVariant if option is not set
   \sa setOptionValue()
 */
-QVariant QtxPreferenceItem::optionValue( const QString& /*name*/ ) const
+QVariant QtxPreferenceItem::optionValue( const QString& name ) const
 {
-  return QVariant();
+  QVariant val;
+  if ( name == "eval" || name == "evaluation" || name == "subst" || name == "substitution" )
+    val = isEvaluateValues();
+  return val;
 }
 
 /*!
@@ -763,8 +780,13 @@ QVariant QtxPreferenceItem::optionValue( const QString& /*name*/ ) const
   \param val new property value
   \sa optionValue()
 */
-void QtxPreferenceItem::setOptionValue( const QString& /*name*/, const QVariant& /*val*/ )
+void QtxPreferenceItem::setOptionValue( const QString& name, const QVariant& val )
 {
+  if ( name == "eval" || name == "evaluation" || name == "subst" || name == "substitution" )
+  {
+    if ( val.canConvert( QVariant::Bool ) )
+      setEvaluateValues( val.toBool() );
+  }
 }
 
 /*!
index cc3b2d9139d168b3622a368c65f8c33669c92c3b..7022351f9c518cbd5e1cf837f355ae5f1066e27f 100644 (file)
@@ -73,6 +73,9 @@ public:
   QVariant                  option( const QString& ) const;
   void                      setOption( const QString&, const QVariant& );
 
+  bool                      isEvaluateValues() const;
+  void                      setEvaluateValues( const bool );
+
   virtual void              store() = 0;
   virtual void              retrieve() = 0;
 
@@ -125,6 +128,7 @@ private:
   QtxPreferenceItem*        myParent;
   ItemList                  myChildren;
 
+  bool                      myEval;
   QIcon                     myIcon;
   QString                   myTitle;
   QString                   mySection;
index f450db2017ded2a937ca9d74dfa12444f2d6281c..3651ca387a30aaef9c4f7ddf400b94a7ea7969f3 100644 (file)
@@ -41,6 +41,9 @@ public:
 
   virtual bool eventFilter( QObject*, QEvent* );
 
+  bool           isEmpty() const;
+  bool           isVisible() const;
+
 protected:
   virtual void customEvent( QEvent* );
 
@@ -55,11 +58,13 @@ private:
 
   void         updateVisibility();
 
+  void         setEmpty( const bool );
+  void         setVisible( const bool );
+
 private:
   QtxToolBar*  myCont;
   bool         myState;
   bool         myEmpty;
-  bool         myVisible;
 };
 
 /*!
@@ -73,7 +78,6 @@ QtxToolBar::Watcher::Watcher( QtxToolBar* cont )
   myEmpty( false )
 {
   myCont->installEventFilter( this );
-  myVisible = myCont->isVisibleTo( myCont->parentWidget() );
 
   installFilters();
 }
@@ -116,7 +120,7 @@ void QtxToolBar::Watcher::shown( QtxToolBar* tb )
   if ( tb != myCont )
     return;
 
-  myVisible = true;
+  setVisible( true );
 }
 
 /*!
@@ -128,7 +132,36 @@ void QtxToolBar::Watcher::hidden( QtxToolBar* tb )
   if ( tb != myCont )
     return;
 
-  myVisible = false;
+  setVisible( false );
+}
+
+bool QtxToolBar::Watcher::isEmpty() const
+{
+  return myEmpty;
+}
+
+bool QtxToolBar::Watcher::isVisible() const
+{
+  bool vis = false;
+  if ( myCont && myCont->toggleViewAction() )
+    vis = myCont->toggleViewAction()->isChecked();
+  return vis;
+}
+
+void QtxToolBar::Watcher::setEmpty( const bool on )
+{
+  myEmpty = on;
+}
+
+void QtxToolBar::Watcher::setVisible( const bool on )
+{
+  if ( !myCont || !myCont->toggleViewAction() )
+    return;
+
+  bool block = myCont->toggleViewAction()->signalsBlocked();
+  myCont->toggleViewAction()->blockSignals( true );
+  myCont->toggleViewAction()->setChecked( on );
+  myCont->toggleViewAction()->blockSignals( block );
 }
 
 /*!
@@ -139,10 +172,14 @@ void QtxToolBar::Watcher::showContainer()
   if ( !myCont )
     return;
 
+  bool vis = isVisible();
+
   QtxToolBar* cont = myCont;
   myCont = 0;
   cont->show();
   myCont = cont;
+
+  setVisible( vis );
 }
 
 /*!
@@ -153,10 +190,14 @@ void QtxToolBar::Watcher::hideContainer()
   if ( !myCont )
     return;
 
+  bool vis = isVisible();
+
   QtxToolBar* cont = myCont;
   myCont = 0;
   cont->hide();
   myCont = cont;
+
+  setVisible( vis );
 }
 
 /*!
@@ -205,9 +246,7 @@ void QtxToolBar::Watcher::updateVisibility()
     return;
 
   bool vis = false;
-
   QList<QAction*> actList = myCont->actions();
-
   for ( QList<QAction*>::const_iterator it = actList.begin(); it != actList.end() && !vis; ++it )
   {
     if ( (*it)->isSeparator() )
@@ -217,10 +256,12 @@ void QtxToolBar::Watcher::updateVisibility()
   }
 
   QMainWindow* mw = myCont->mainWindow();
-  if ( mw && myEmpty == vis )
+  bool empty = isEmpty();
+  if ( mw && empty == vis )
   {
-    myEmpty = !vis;
-    if ( !myEmpty )
+    empty = !vis;
+    setEmpty( empty );
+    if ( !empty )
       myCont->toggleViewAction()->setVisible( myState );
     else
     {
@@ -229,7 +270,7 @@ void QtxToolBar::Watcher::updateVisibility()
     }
   }
 
-  vis = !myEmpty && myVisible;
+  vis = !empty && isVisible();
   if ( vis != myCont->isVisibleTo( myCont->parentWidget() ) )
     vis ? showContainer() : hideContainer();
 }
index 0927f074542fe2a439a0a37d2514113b1fe2512a..4796645d161f75843f4c2e01ac6c50c826479061 100644 (file)
@@ -1195,10 +1195,10 @@ bool QtxWorkstackChild::eventFilter( QObject* o, QEvent* e )
     if ( e->type() == QEvent::WindowTitleChange || e->type() == QEvent::WindowIconChange )
       emit captionChanged( this );
 
-    if ( !e->spontaneous() && ( e->type() == QEvent::Show || e->type() == QEvent::ShowToParent ) )
+    if ( !e->spontaneous() && e->type() == QEvent::ShowToParent )
       emit shown( this );
 
-    if ( !e->spontaneous() && ( e->type() == QEvent::Hide || e->type() == QEvent::HideToParent ) )
+    if ( !e->spontaneous() && e->type() == QEvent::HideToParent )
       emit hidden( this );
 
     if ( e->type() == QEvent::FocusIn )
index d841f3e63fee397eb454d17c4b88310218db1249..f8e0d9e9c6defe8ef72a29f5c2b8c25b5c7d4b3b 100755 (executable)
@@ -67,7 +67,7 @@ SUIT_Desktop* SUIT_Application::desktop()
    \return FALSE if application can not be closed (because of non saved data for example). 
    This method called by SUIT_Session whin closing of application was requested.
 */
-bool SUIT_Application::isPossibleToClose( bool& closePermanently )
+bool SUIT_Application::isPossibleToClose( bool& )
 {
   return true;
 }
@@ -548,6 +548,16 @@ int SUIT_Application::actionId( const QAction* a ) const
   return id;
 }
 
+QList<QAction*> SUIT_Application::actions() const
+{
+  return myActionMap.values();
+}
+
+QList<int> SUIT_Application::actionIds() const
+{
+  return myActionMap.keys();
+}
+
 /*!
   Creates action and registers it both in menu manager and tool manager
   \return new instance of action
index dd84cd031d314d59535a29f416d766f30b8d9cdc..7d7827076699b3b90bb7c3a610e5855cc07351a3 100755 (executable)
@@ -149,6 +149,10 @@ protected:
   static QAction*       separator();
   QAction*              action( const int ) const;
   int                   actionId( const QAction* ) const;
+
+  QList<QAction*>       actions() const;
+  QList<int>            actionIds() const;
+
   int                   registerAction( const int, QAction* );
   QAction*              createAction( const int, const QString&, const QIcon&, const QString&,
                                       const QString&, const int, QObject* = 0,