Salome HOME
0023083: [CEA 1400] Be able to active stereo in OCC view and to choose which kind...
[modules/gui.git] / src / LightApp / LightApp_Application.cxx
1 // Copyright (C) 2007-2015  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
10 //
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 // Lesser General Public License for more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22
23 // File:      LightApp_Application.cxx
24 // Created:   6/20/2005 18:39:45 PM
25 // Author:    Natalia Donis
26
27 #ifdef WIN32
28 // E.A. : On windows with python 2.6, there is a conflict
29 // E.A. : between pymath.h and Standard_math.h which define
30 // E.A. : some same symbols : acosh, asinh, ...
31   #include <Standard_math.hxx>
32   #ifndef DISABLE_PYCONSOLE
33     #include <pymath.h>
34   #endif
35 #endif
36
37 #ifndef DISABLE_PYCONSOLE
38   #include "LightApp_PyInterp.h" // WARNING! This include must be the first!
39   #include <PyConsole_Console.h>
40 #endif
41
42 #include "LightApp_Application.h"
43 #include "LightApp_Module.h"
44 #include "LightApp_DataModel.h"
45 #include "LightApp_DataOwner.h"
46 #include "LightApp_Displayer.h"
47 #include "LightApp_Study.h"
48 #include "LightApp_Preferences.h"
49 #include "LightApp_PreferencesDlg.h"
50 #include "LightApp_ModuleDlg.h"
51 #include "LightApp_AboutDlg.h"
52 #include "LightApp_ModuleAction.h"
53 // temporary commented
54 #include "LightApp_EventFilter.h"
55 #include "LightApp_OBSelector.h"
56 #include "LightApp_SelectionMgr.h"
57 #include "LightApp_DataObject.h"
58 #include "LightApp_WgViewModel.h"
59 #include "LightApp_FullScreenHelper.h"
60
61 #include <GUI_version.h>
62
63 #include <SALOME_Event.h>
64
65 #include <Style_Salome.h>
66 #include <Style_PrefDlg.h>
67
68 #include <CAM_Module.h>
69 #include <CAM_DataModel.h>
70 #include <CAM_Study.h>
71 #include <STD_TabDesktop.h>
72
73 #include <SUIT_DataBrowser.h>
74 #include <SUIT_Session.h>
75 #include <SUIT_Study.h>
76 #include <SUIT_FileDlg.h>
77 #include <SUIT_ResourceMgr.h>
78 #include <SUIT_ShortcutMgr.h>
79 #include <SUIT_Tools.h>
80 #include <SUIT_Accel.h>
81 #include <SUIT_MessageBox.h>
82 #include <SUIT_ViewWindow.h>
83
84 #include <Qtx.h>
85 #include <QtxToolBar.h>
86 #include <QtxTreeView.h>
87 #include <QtxMRUAction.h>
88 #include <QtxDockAction.h>
89 #include <QtxDockWidget.h>
90 #include <QtxActionToolMgr.h>
91 #include <QtxSearchTool.h>
92 #include <QtxWorkstack.h>
93 #include <QtxMap.h>
94
95 #include <LogWindow.h>
96
97 #ifndef DISABLE_GLVIEWER
98   #include <GLViewer_Viewer.h>
99   #include <GLViewer_ViewManager.h>
100   #include "LightApp_GLSelector.h"
101 #endif
102
103 #ifndef DISABLE_PLOT2DVIEWER
104   #include <Plot2d_ViewManager.h>
105   #include <Plot2d_ViewModel.h>
106   #include <Plot2d_ViewWindow.h>
107   #include <Plot2d_ViewFrame.h>
108   #include "LightApp_Plot2dSelector.h"
109 #ifndef DISABLE_SALOMEOBJECT
110   #include <SPlot2d_ViewModel.h>
111 #else
112   #include <Plot2d_ViewModel.h>
113 #endif
114 #endif
115
116 #ifndef DISABLE_OCCVIEWER
117   #include <OCCViewer_ViewManager.h>
118   #include <OCCViewer_ViewFrame.h>
119   #include <OCCViewer_ViewPort3d.h>
120 #ifndef DISABLE_SALOMEOBJECT
121   #include <SOCC_ViewModel.h>
122 #else
123   #include <OCCViewer_ViewModel.h>
124 #endif
125   #include "LightApp_OCCSelector.h"
126 #endif
127
128 #ifndef DISABLE_VTKVIEWER
129 #ifndef DISABLE_SALOMEOBJECT
130   #include <SVTK_ViewModel.h>
131   #include <SVTK_ViewManager.h>
132   #include "LightApp_VTKSelector.h"
133 #else
134   #include <VTKViewer_ViewModel.h>
135   #include <VTKViewer_ViewManager.h>
136 #endif
137   #include <VTKViewer_ViewModel.h>
138 #endif
139
140 #ifndef DISABLE_QXGRAPHVIEWER
141   #include <QxScene_ViewManager.h>
142   #include <QxScene_ViewModel.h>
143   #include <QxScene_ViewWindow.h>
144 #endif
145
146 #ifndef DISABLE_GRAPHICSVIEW
147   #include "GraphicsView_Viewer.h"
148   #include "GraphicsView_ViewManager.h"
149   #include "LightApp_GVSelector.h"
150 #endif
151
152 #ifndef DISABLE_PVVIEWER
153   #include "PVViewer_ViewManager.h"
154   #include "PVViewer_ViewWindow.h"
155   #include "PVViewer_ViewModel.h"
156 #endif
157
158 #ifndef DISABLE_PYVIEWER
159   #include <PyViewer_ViewManager.h>
160   #include <PyViewer_ViewModel.h>
161   #include <PyViewer_ViewWindow.h>
162 #endif
163
164
165 #define VISIBILITY_COLUMN_WIDTH 25
166
167 #include <QDir>
168 #include <QImage>
169 #include <QString>
170 #include <QWidget>
171 #include <QStringList>
172 #include <QFile>
173 #include <QApplication>
174 #include <QMap>
175 #include <QStatusBar>
176 #include <QThread>
177 #include <QObjectList>
178 #include <QComboBox>
179 #include <QInputDialog>
180 #include <QFontDatabase>
181 #include <QIcon>
182 #include <QByteArray>
183 #include <QMenu>
184 #include <QProcess>
185 #include <QTimer>
186 #include <QHeaderView>
187 #include <QTreeView>
188 #include <QMimeData>
189 #include <QShortcut>
190
191 #include <utilities.h>
192
193 #define FIRST_HELP_ID 1000000
194
195 #ifndef DISABLE_SALOMEOBJECT
196   #include <SALOME_InteractiveObject.hxx>
197   #include <SALOME_ListIO.hxx>
198 #endif
199
200 #include <Standard_Version.hxx>
201
202 #define ToolBarMarker    0
203 #define DockWidgetMarker 1
204
205 static const char* imageEmptyIcon[] = {
206 "20 20 1 1",
207 ".      c None",
208 "....................",
209 "....................",
210 "....................",
211 "....................",
212 "....................",
213 "....................",
214 "....................",
215 "....................",
216 "....................",
217 "....................",
218 "....................",
219 "....................",
220 "....................",
221 "....................",
222 "....................",
223 "....................",
224 "....................",
225 "....................",
226 "....................",
227 "...................."};
228
229 int LightApp_Application::lastStudyId = 0;
230
231 // Markers used to parse array with dockable windows and toolbars state.
232 // For more details please see the qdockarealayout.cpp && qtoolbararealayout.cpp
233 // in the Qt source code.
234
235 #define QDockWidgetMarker 0xfd // = DockWidgetStateMarker
236 #define QToolBarMarker 0xfc    // = ToolBarStateMarkerEx
237
238 // Format of the Byte array with the windows and toolbar state is:
239 // VersionMarker|version|DockWidgetStateMarker|nbDockWidgetLines|...DocWidgetData...|ToolBarStateMarkerEx|nbToolBarLines|...ToolBarData...
240
241 //Find toolbar marker position in the array in the following way:
242 //since the 'toolbar marker' is not unique, find index of first occurrence of the
243 //'toolbar marker' in the array and check that next string is name of the toolbar
244
245 int getToolbarMarkerIndex(QByteArray input, const QStringList& aFlags) {
246   int aResult = -1,tmp = 0;
247   int inputLen = input.length();
248   QDataStream anInputData(&input, QIODevice::ReadOnly);
249   while(tmp < inputLen) {
250       tmp = input.indexOf(QToolBarMarker, tmp + 1);
251       if(tmp < 0 )
252         break;
253       anInputData.device()->seek(tmp);
254       uchar mark;
255       anInputData>>mark;
256       int lines;
257       anInputData >> lines;
258
259       if(lines == 0 && anInputData.atEnd()){
260         //Case then array doesn't contain information about toolbars,
261         aResult = tmp;
262         break;
263       }
264
265       int pos;
266       anInputData >> pos;
267       int cnt;
268       anInputData >> cnt;
269       QString str;
270       anInputData>>str;
271       if(aFlags.contains(str)) {
272         aResult = tmp;
273         break;
274       }
275     }        
276   return aResult;
277 }
278
279 /*!
280   \return last global id of study
281 */
282 int LightApp_Application::studyId()
283 {
284   return LightApp_Application::lastStudyId;
285 }
286
287 /*!Create new instance of LightApp_Application.*/
288 extern "C" LIGHTAPP_EXPORT SUIT_Application* createApplication()
289 {
290   return new LightApp_Application();
291 }
292
293 /*! \var global preferences of LightApp */
294 LightApp_Preferences* LightApp_Application::_prefs_ = 0;
295
296
297 /*!
298   \class LightApp_Application
299   Application containing LightApp module
300 */
301
302 /*!Constructor.*/
303 LightApp_Application::LightApp_Application()
304 : CAM_Application( false ),
305   myPrefs( 0 ),
306   myScreenHelper(new LightApp_FullScreenHelper())
307 {
308   Q_INIT_RESOURCE( LightApp );
309
310   STD_TabDesktop* desk = new STD_TabDesktop();
311   desk->setFullScreenAllowed(false);
312   desk->setMinimizeAllowed(false);
313
314   setDesktop( desk );
315
316   // initialize auto save timer
317   myAutoSaveTimer = new QTimer( this );
318   myAutoSaveTimer->setSingleShot( true );
319   connect( myAutoSaveTimer, SIGNAL( timeout() ), this, SLOT( onSaveDoc() ) );
320
321   //connect( this, SIGNAL( moving() ), this, SLOT( onMoved() ) );
322
323   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
324   QPixmap aLogo = aResMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
325
326   desktop()->setWindowIcon( aLogo );
327   desktop()->setDockableMenuBar( false );
328   desktop()->setDockableStatusBar( false );
329
330   // base logo (salome itself)
331   desktop()->logoInsert( "_app_base",  aResMgr->loadPixmap( "LightApp", tr( "APP_BASE_LOGO" ), false ) );
332   // extra logo (salome-based application)
333   desktop()->logoInsert( "_app_extra", aResMgr->loadPixmap( "LightApp", tr( "APP_EXTRA_LOGO" ), false ) );
334
335   clearViewManagers();
336
337   mySelMgr = new LightApp_SelectionMgr( this );
338
339   myAccel = SUIT_Accel::getAccel();
340
341 #ifndef DISABLE_OCCVIEWER
342   myAccel->setActionKey( SUIT_Accel::PanLeft,     Qt::CTRL+Qt::Key_Left,     OCCViewer_Viewer::Type() );
343   myAccel->setActionKey( SUIT_Accel::PanRight,    Qt::CTRL+Qt::Key_Right,    OCCViewer_Viewer::Type() );
344   myAccel->setActionKey( SUIT_Accel::PanUp,       Qt::CTRL+Qt::Key_Up,       OCCViewer_Viewer::Type() );
345   myAccel->setActionKey( SUIT_Accel::PanDown,     Qt::CTRL+Qt::Key_Down,     OCCViewer_Viewer::Type() );
346   myAccel->setActionKey( SUIT_Accel::ZoomIn,      Qt::CTRL+Qt::Key_Plus,     OCCViewer_Viewer::Type() );
347   myAccel->setActionKey( SUIT_Accel::ZoomOut,     Qt::CTRL+Qt::Key_Minus,    OCCViewer_Viewer::Type() );
348   myAccel->setActionKey( SUIT_Accel::ZoomFit,     Qt::CTRL+Qt::Key_Asterisk, OCCViewer_Viewer::Type() );
349   myAccel->setActionKey( SUIT_Accel::ZoomFit,     Qt::Key_Space,             OCCViewer_Viewer::Type() );
350   myAccel->setActionKey( SUIT_Accel::RotateLeft,  Qt::ALT+Qt::Key_Left,      OCCViewer_Viewer::Type() );
351   myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right,     OCCViewer_Viewer::Type() );
352   myAccel->setActionKey( SUIT_Accel::RotateUp,    Qt::ALT+Qt::Key_Up,        OCCViewer_Viewer::Type() );
353   myAccel->setActionKey( SUIT_Accel::RotateDown,  Qt::ALT+Qt::Key_Down,      OCCViewer_Viewer::Type() );
354 #endif
355 #ifndef DISABLE_VTKVIEWER
356   myAccel->setActionKey( SUIT_Accel::PanLeft,     Qt::CTRL+Qt::Key_Left,     VTKViewer_Viewer::Type() );
357   myAccel->setActionKey( SUIT_Accel::PanRight,    Qt::CTRL+Qt::Key_Right,    VTKViewer_Viewer::Type() );
358   myAccel->setActionKey( SUIT_Accel::PanUp,       Qt::CTRL+Qt::Key_Up,       VTKViewer_Viewer::Type() );
359   myAccel->setActionKey( SUIT_Accel::PanDown,     Qt::CTRL+Qt::Key_Down,     VTKViewer_Viewer::Type() );
360   myAccel->setActionKey( SUIT_Accel::ZoomIn,      Qt::CTRL+Qt::Key_Plus,     VTKViewer_Viewer::Type() );
361   myAccel->setActionKey( SUIT_Accel::ZoomOut,     Qt::CTRL+Qt::Key_Minus,    VTKViewer_Viewer::Type() );
362   myAccel->setActionKey( SUIT_Accel::ZoomFit,     Qt::CTRL+Qt::Key_Asterisk, VTKViewer_Viewer::Type() );
363   myAccel->setActionKey( SUIT_Accel::ZoomFit,     Qt::Key_Space,             VTKViewer_Viewer::Type() );
364   myAccel->setActionKey( SUIT_Accel::RotateLeft,  Qt::ALT+Qt::Key_Left,      VTKViewer_Viewer::Type() );
365   myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right,     VTKViewer_Viewer::Type() );
366   myAccel->setActionKey( SUIT_Accel::RotateUp,    Qt::ALT+Qt::Key_Up,        VTKViewer_Viewer::Type() );
367   myAccel->setActionKey( SUIT_Accel::RotateDown,  Qt::ALT+Qt::Key_Down,      VTKViewer_Viewer::Type() );
368 #endif
369 #ifndef DISABLE_PLOT2DVIEWER
370   myAccel->setActionKey( SUIT_Accel::PanLeft,     Qt::CTRL+Qt::Key_Left,     Plot2d_Viewer::Type() );
371   myAccel->setActionKey( SUIT_Accel::PanRight,    Qt::CTRL+Qt::Key_Right,    Plot2d_Viewer::Type() );
372   myAccel->setActionKey( SUIT_Accel::PanUp,       Qt::CTRL+Qt::Key_Up,       Plot2d_Viewer::Type() );
373   myAccel->setActionKey( SUIT_Accel::PanDown,     Qt::CTRL+Qt::Key_Down,     Plot2d_Viewer::Type() );
374   myAccel->setActionKey( SUIT_Accel::ZoomIn,      Qt::CTRL+Qt::Key_Plus,     Plot2d_Viewer::Type() );
375   myAccel->setActionKey( SUIT_Accel::ZoomOut,     Qt::CTRL+Qt::Key_Minus,    Plot2d_Viewer::Type() );
376   myAccel->setActionKey( SUIT_Accel::ZoomFit,     Qt::CTRL+Qt::Key_Asterisk, Plot2d_Viewer::Type() );
377   myAccel->setActionKey( SUIT_Accel::ZoomFit,     Qt::Key_Space,             Plot2d_Viewer::Type() );
378 #endif
379
380   connect( mySelMgr, SIGNAL( selectionChanged() ), this, SLOT( onSelection() ) );
381   connect( desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
382            this,      SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
383   connect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
384            this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ), Qt::UniqueConnection );
385
386
387   // Set existing font for the python console in resources
388   if( !aResMgr->hasValue( "PyConsole", "font" ) )
389     return;
390
391   QFont f = aResMgr->fontValue( "PyConsole", "font" );
392   QFontDatabase fdb;
393   QStringList famdb = fdb.families();
394
395   if ( famdb.contains(f.family()) || !aResMgr->hasValue( "PyConsole", "additional_families" ) )
396     return;
397
398   QStringList anAddFamilies = aResMgr->stringValue( "PyConsole", "additional_families" ).split( ";", QString::SkipEmptyParts );
399   QString aFamily;
400   for ( QStringList::Iterator it = anAddFamilies.begin(); it != anAddFamilies.end(); ++it )
401   {
402     aFamily = *it;
403     if ( famdb.contains(aFamily) )
404     {
405       f.setFamily( aFamily );
406       aResMgr->setValue( "PyConsole", "font", f );
407       break;
408     }
409   }
410 }
411
412 /*!Destructor.
413  *\li Save window geometry.
414  *\li Save desktop geometry.
415  *\li Save resource maneger.
416  *\li Delete selection manager.
417  */
418 LightApp_Application::~LightApp_Application()
419 {
420   delete mySelMgr;
421   delete myScreenHelper;
422 }
423
424 /*!Start application.*/
425 void LightApp_Application::start()
426 {
427   CAM_Application::start();
428
429   updateWindows();
430   updateViewManagers();
431   updateCommandsStatus();
432
433   putInfo( "" );
434   desktop()->statusBar()->showMessage( "" );
435
436   LightApp_EventFilter::Init();
437 }
438
439 /*!Closeapplication.*/
440 void LightApp_Application::closeApplication()
441 {
442   QProcess::startDetached( "HelpBrowser",
443                            QStringList() << QString( "--remove=%1" ).arg( QApplication::instance()->applicationPid() ) );
444
445   CAM_Application::closeApplication();
446 }
447
448 /*!Gets application name.*/
449 QString LightApp_Application::applicationName() const
450 {
451   static QString _app_name;
452   if ( _app_name.isEmpty() )
453     _app_name = tr( "APP_NAME" );
454   return _app_name;
455 }
456
457 /*!Gets application version.*/
458 QString LightApp_Application::applicationVersion() const
459 {
460   static QString _app_version;
461
462   if ( _app_version.isEmpty() )
463   {
464     QString resVersion = tr( "APP_VERSION" );
465     if ( resVersion != "APP_VERSION" )
466     {
467       _app_version = resVersion;
468     }
469     else
470     {
471       _app_version = GUI_VERSION_STR;
472     }
473   }
474   return _app_version;
475 }
476
477 /*!Load module by \a name.*/
478 CAM_Module* LightApp_Application::loadModule( const QString& name, const bool showMsg )
479 {
480   CAM_Module* mod = CAM_Application::loadModule( name, showMsg );
481   if ( mod )
482   {
483     connect( this, SIGNAL( studyOpened() ), mod, SLOT( onModelOpened() ) );
484     connect( this, SIGNAL( studySaved() ),  mod, SLOT( onModelSaved() ) );
485     connect( this, SIGNAL( studyClosed() ), mod, SLOT( onModelClosed() ) );
486   }
487   return mod;
488 }
489
490 /*!Activate module by \a modName*/
491 bool LightApp_Application::activateModule( const QString& modName )
492 {
493   QString actName;
494   CAM_Module* prevMod = activeModule();
495
496   if ( prevMod )
497     actName = prevMod->moduleName();
498
499   if ( actName == modName )
500     return true;
501
502   putInfo( tr( "ACTIVATING_MODULE" ).arg( modName ) );
503
504   saveDockWindowsState();
505
506   bool status = CAM_Application::activateModule( modName );
507
508   updateModuleActions();
509
510   putInfo( "" );
511
512   if ( !status )
513     return false;
514
515   updateWindows();
516   updateViewManagers();
517
518   if ( activeStudy() && activeStudy()->root() && objectBrowser() ) {
519     if ( objectBrowser()->root() != activeStudy()->root() ) 
520       objectBrowser()->setRoot( activeStudy()->root() );
521     updateObjectBrowser( true );
522   }
523   return true;
524 }
525
526 /*!Gets selection manager.*/
527 LightApp_SelectionMgr* LightApp_Application::selectionMgr() const
528 {
529   return mySelMgr;
530 }
531
532 /*!Creat action "New window" for certain type of viewer:*/
533 void LightApp_Application::createActionForViewer( const int id,
534                                                   const int parentId,
535                                                   const QString& suffix,
536                                                   const int accel )
537 {
538   QString vtlt = tr( QString( "NEW_WINDOW_%1" ).arg( suffix ).toLatin1().constData() );
539   QString tip = tr( "CREATING_NEW_WINDOW" ).arg( vtlt.remove( "&" ) );
540   QAction* a = createAction( id,                      // menu action id
541                              tip,                     // status tip
542                              QIcon(),                 // icon
543                              vtlt,                    // menu text
544                              tip,                     // tooltip
545                              accel,                   // shortcut
546                              desktop(),               // parent
547                              false,                   // toggle flag
548                              this,                    // receiver
549                              SLOT( onNewWindow() ) ); // slot
550   createMenu( a, parentId, -1 );
551 }
552
553 /*!Create actions:*/
554
555 void LightApp_Application::createActions()
556 {
557   CAM_Application::createActions();
558
559   SUIT_Desktop* desk = desktop();
560   SUIT_ResourceMgr* resMgr = resourceMgr();
561
562   // Preferences
563   createAction( PreferencesId, tr( "TOT_DESK_PREFERENCES" ), QIcon(),
564                 tr( "MEN_DESK_PREFERENCES" ), tr( "PRP_DESK_PREFERENCES" ),
565                 Qt::CTRL+Qt::Key_R, desk, false, this, SLOT( onPreferences() ) );
566
567   // Help menu:
568
569   // - Help for modules
570
571   int helpMenu = createMenu( tr( "MEN_DESK_HELP" ), -1, -1, 1000 );
572   createMenu( separator(), helpMenu, -1, 10 );
573   QStringList aModuleList;
574   modules( aModuleList, false );
575   aModuleList.prepend( "GUI" );
576   aModuleList.prepend( "KERNEL" );
577
578   int id = LightApp_Application::UserID + FIRST_HELP_ID;
579
580   QString aModule;
581   foreach( aModule, aModuleList ) {
582     if ( aModule.isEmpty() )                                         // module title (user name)
583       continue;
584     IMap <QString, QString> helpData;                                // list of help files for the module
585     QString helpSubMenu;                                             // help submenu name (empty if not needed)
586     QString modName = moduleName( aModule );                         // module name
587     if ( modName.isEmpty() ) modName = aModule;                      // for KERNEL and GUI
588     QString rootDir = QString( "%1_ROOT_DIR" ).arg( modName );       // module root dir variable
589     QString modDir  = getenv( rootDir.toLatin1().constData() );      // module root dir
590     QString docSection;
591     if (resMgr->hasValue( modName, "documentation" ) )
592       docSection = resMgr->stringValue(modName, "documentation");
593     else if ( resMgr->hasSection( modName + "_documentation" ) )
594       docSection = modName + "_documentation";
595     if ( !docSection.isEmpty() ) {
596       helpSubMenu = resMgr->stringValue( docSection, "sub_menu", "" ).arg( aModule );
597       QStringList listOfParam = resMgr->parameters( docSection );
598       foreach( QString paramName, listOfParam ) {
599         QString valueStr = resMgr->stringValue( docSection, paramName );
600         if ( !valueStr.isEmpty() ) {
601           QFileInfo fi( valueStr );
602           if ( fi.isRelative() && !modDir.isEmpty() )
603             valueStr = Qtx::addSlash( modDir ) + valueStr;
604           if ( QFile::exists( valueStr ) )
605             helpData.insert( paramName.arg( aModule ), valueStr );
606         }
607       }
608     }
609
610     if ( helpData.isEmpty() && !modDir.isEmpty() ) {
611       QStringList idxLst = QStringList() << modDir << "share" << "doc" << "salome" << "gui" << modName << "index.html";
612       QString indexFile = idxLst.join( QDir::separator() );          // index file
613       if ( QFile::exists( indexFile ) )
614         helpData.insert( tr( "%1 module Users's Guide" ).arg( aModule ), indexFile );
615     }
616
617     IMapConstIterator<QString, QString > fileIt;
618     for ( fileIt = helpData.begin(); fileIt != helpData.end(); fileIt++ ) {
619       QString helpFileName = fileIt.key();
620       // remove all '//' occurances 
621       while ( helpFileName.contains( "//" ) )
622         helpFileName.replace( "//", "" );
623       // obtain submenus hierarchy if given
624       QStringList smenus = helpFileName.split( "/" );
625       helpFileName = smenus.last();
626       smenus.removeLast();
627       QAction* a = createAction( id, helpFileName,
628                                  resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
629                                  helpFileName, helpFileName,
630                                  0, desk, false, this, SLOT( onHelpContentsModule() ) );
631       a->setData( fileIt.value() );
632       if ( !helpSubMenu.isEmpty() ) {
633         smenus.prepend( helpSubMenu );
634       }
635       // create sub-menus hierarchy
636       int menuId = helpMenu;
637       foreach ( QString subMenu, smenus ) {
638         menuId = createMenu( subMenu, menuId, -1, 0 );
639       }
640       createMenu( a, menuId, -1, 0 );
641       id++;
642     }
643   }
644
645   // - Additional help items
646
647   createMenu( separator(), helpMenu, -1, 5 );
648
649   QStringList addHelpItems = resMgr->parameters( "add_help" );
650   foreach ( QString addHelpItem, addHelpItems ) {
651     QString valueStr = resMgr->stringValue( "add_help", addHelpItem );
652     if ( !valueStr.isEmpty() && QFile::exists( valueStr ) ) {
653       QAction* a = createAction( id, addHelpItem,
654                                  resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
655                                  addHelpItem, addHelpItem,
656                                  0, desk, false, this, SLOT( onHelpContentsModule() ) );
657       a->setData( valueStr );
658       createMenu( a, helpMenu, -1, 5 );
659       id++;
660     }
661   }
662
663   //! MRU
664   static QtxMRUAction* mru = new QtxMRUAction( tr( "TOT_DESK_MRU" ), tr( "MEN_DESK_MRU" ), 0 );
665   connect( mru, SIGNAL( activated( const QString& ) ), this, SLOT( onMRUActivated( const QString& ) ) );
666   registerAction( MRUId, mru );
667
668   // default icon for neutral point ('SALOME' module)
669   QPixmap defIcon = resMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
670   if ( defIcon.isNull() )
671     defIcon = QPixmap( imageEmptyIcon );
672
673   //! default icon for any module
674   QPixmap modIcon = resMgr->loadPixmap( "LightApp", tr( "APP_MODULE_ICO" ), false );
675   if ( modIcon.isNull() )
676     modIcon = QPixmap( imageEmptyIcon );
677
678   QStringList modList;
679   modules( modList, false );
680
681   if ( modList.count() > 1 )
682   {
683     LightApp_ModuleAction* moduleAction =
684       new LightApp_ModuleAction( tr( "APP_NAME" ), defIcon, desk );
685
686     QMap<QString, QString> iconMap;
687     moduleIconNames( iconMap );
688
689     const int iconSize = 20;
690
691     QStringList::Iterator it;
692     for ( it = modList.begin(); it != modList.end(); ++it )
693     {
694       if ( !isLibExists( *it ) )
695         continue;
696
697       QString modName = moduleName( *it );
698
699       if ( !isModuleAccessible( *it ) )
700         continue;
701
702       QString iconName;
703       if ( iconMap.contains( *it ) )
704         iconName = iconMap[*it];
705
706       QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
707       if ( icon.isNull() )
708       {
709         icon = modIcon;
710         INFOS ( "\n****************************************************************" << std::endl
711                 <<  "*    Icon for " << (*it).toLatin1().constData()
712                 << " not found. Using the default one." << std::endl
713                 << "****************************************************************" << std::endl );
714       }
715
716       icon = Qtx::scaleIcon( icon, iconSize );
717
718       moduleAction->insertModule( *it, icon );
719     }
720
721     connect( moduleAction, SIGNAL( moduleActivated( const QString& ) ),
722              this, SLOT( onModuleActivation( const QString& ) ) );
723     registerAction( ModulesListId, moduleAction );
724   }
725
726   // New window
727   int windowMenu = createMenu( tr( "MEN_DESK_WINDOW" ), -1, MenuWindowId, 100 );
728   int newWinMenu = createMenu( tr( "MEN_DESK_NEWWINDOW" ), windowMenu, -1, 0 );
729
730   createAction( CloseId, tr( "TOT_CLOSE" ), QIcon(), tr( "MEN_DESK_CLOSE" ), tr( "PRP_CLOSE" ),
731                 Qt::CTRL+Qt::Key_F4, desk, false, this, SLOT( onCloseWindow() ) );
732   createAction( CloseAllId, tr( "TOT_CLOSE_ALL" ), QIcon(), tr( "MEN_DESK_CLOSE_ALL" ), tr( "PRP_CLOSE_ALL" ),
733                 0, desk, false, this, SLOT( onCloseAllWindow() ) );
734   createAction( GroupAllId, tr( "TOT_GROUP_ALL" ), QIcon(), tr( "MEN_DESK_GROUP_ALL" ), tr( "PRP_GROUP_ALL" ),
735                 0, desk, false, this, SLOT( onGroupAllWindow() ) );
736
737   createMenu( CloseId,     windowMenu, 0, -1 );
738   createMenu( CloseAllId,  windowMenu, 0, -1 );
739   createMenu( GroupAllId,  windowMenu, 0, -1 );
740   createMenu( separator(), windowMenu, -1, 0 );
741
742 #ifndef DISABLE_GLVIEWER
743   createActionForViewer( NewGLViewId, newWinMenu, QString::number( 0 ), Qt::ALT+Qt::Key_G );
744 #endif
745 #ifndef DISABLE_PLOT2DVIEWER
746   createActionForViewer( NewPlot2dId, newWinMenu, QString::number( 1 ), Qt::ALT+Qt::Key_P );
747 #endif
748 #ifndef DISABLE_OCCVIEWER
749   createActionForViewer( NewOCCViewId, newWinMenu, QString::number( 2 ), Qt::ALT+Qt::Key_O );
750 #endif
751 #ifndef DISABLE_VTKVIEWER
752   createActionForViewer( NewVTKViewId, newWinMenu, QString::number( 3 ), Qt::ALT+Qt::Key_K );
753 #endif
754 #ifndef DISABLE_QXGRAPHVIEWER
755   createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S );
756 #endif
757 #ifndef DISABLE_GRAPHICSVIEW
758   createActionForViewer( NewGraphicsViewId, newWinMenu, QString::number( 5 ), Qt::ALT+Qt::Key_C );
759 #endif
760 #ifndef DISABLE_PVVIEWER
761   createActionForViewer( NewPVViewId, newWinMenu, QString::number( 6 ), Qt::ALT+Qt::Key_A );
762 #endif
763 #ifndef DISABLE_PYVIEWER
764   createActionForViewer( NewPyViewerId, newWinMenu, QString::number( 7 ), Qt::ALT+Qt::Key_Y );
765 #endif
766
767   createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
768                 Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
769   createMenu( RenameId, windowMenu, -1 );
770
771   int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 );
772   createMenu( PreferencesId, fileMenu, 50, -1 );
773   createMenu( separator(), fileMenu, -1, 50, -1 );
774
775   createMenu( separator(), fileMenu, -1, 100, -1 );
776   createMenu( MRUId, fileMenu, 100, -1 );
777   createMenu( separator(), fileMenu, -1, 100, -1 );
778
779   createAction( StyleId, tr( "TOT_THEME" ), QIcon(), tr( "MEN_DESK_THEME" ), tr( "PRP_THEME" ),
780                 0, desk, false, this, SLOT( onStylePreferences() ) );
781
782   createAction( FullScreenId, tr( "TOT_FULLSCREEN" ), QIcon(), tr( "MEN_DESK_FULLSCREEN" ), tr( "PRP_FULLSCREEN" ),
783                 Qt::Key_F11, desk, false, this, SLOT( onFullScreen() ) );
784
785
786   int viewMenu = createMenu( tr( "MEN_DESK_VIEW" ), -1 );
787   createMenu( separator(), viewMenu, -1, 20, -1 );
788   createMenu( StyleId, viewMenu, 20, -1 );
789   createMenu( FullScreenId, viewMenu, 20, -1 );
790
791   int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ),    // title (language-dependant)
792                             QString( "SalomeModules" ) );   // name (language-independant)
793   createTool( ModulesListId, modTBar );
794 }
795
796 /*!On module activation action.*/
797 void LightApp_Application::onModuleActivation( const QString& modName )
798 {
799   // Force user to create/open a study before module activation
800   QMap<QString, QString> iconMap;
801   moduleIconNames( iconMap );
802   QPixmap icon = resourceMgr()->loadPixmap( moduleName( modName ), iconMap[ modName ], false );
803   if ( icon.isNull() )
804     icon = resourceMgr()->loadPixmap( "LightApp", tr( "APP_MODULE_BIG_ICO" ), false ); // default icon for any module
805
806   bool cancelled = false;
807
808   while ( !modName.isEmpty() && !activeStudy() && !cancelled ){
809     LightApp_ModuleDlg aDlg( desktop(), modName, icon );
810     QMap<int, QString> opmap = activateModuleActions();
811     for ( QMap<int, QString>::ConstIterator it = opmap.begin(); it != opmap.end(); ++it )
812       aDlg.addButton( it.value(), it.key() );
813
814     int res = aDlg.exec();
815     if ( res ) {
816       // some operation is selected
817       moduleActionSelected( res );
818     }
819     else {
820       // cancelled
821       putInfo( tr("INF_CANCELLED") );
822
823       LightApp_ModuleAction* moduleAction =
824         qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
825       if ( moduleAction )
826         moduleAction->setActiveModule( QString() );
827       cancelled = true;
828     }
829   }
830
831   if ( !cancelled )
832     activateModule( modName );
833 }
834
835 /*!Default module activation.*/
836 QString LightApp_Application::defaultModule() const
837 {
838   QStringList aModuleNames;
839   modules( aModuleNames, false ); // obtain a complete list of module names for the current configuration
840   //! If there's the one and only module --> activate it automatically
841   //! TODO: Possible improvement - default module can be taken from preferences
842   return aModuleNames.count() > 1 ? "" : ( aModuleNames.count() ? aModuleNames.first() : "" );
843 }
844
845 /*!On new window slot.*/
846 void LightApp_Application::onNewWindow()
847 {
848   const QObject* obj = sender();
849   if ( !obj || !obj->inherits( "QAction" ) )
850     return;
851
852   QString type;
853   int id = actionId( (QAction*)obj );
854   switch ( id )
855   {
856 #ifndef DISABLE_GLVIEWER
857   case NewGLViewId:
858     type = GLViewer_Viewer::Type();
859     break;
860 #endif
861 #ifndef DISABLE_PLOT2DVIEWER
862   case NewPlot2dId:
863     type = Plot2d_Viewer::Type();
864     break;
865 #endif
866 #ifndef DISABLE_OCCVIEWER
867   case NewOCCViewId:
868     type = OCCViewer_Viewer::Type();
869     break;
870 #endif
871 #ifndef DISABLE_VTKVIEWER
872   case NewVTKViewId:
873     type = VTKViewer_Viewer::Type();
874     break;
875 #endif
876 #ifndef DISABLE_QXGRAPHVIEWER
877   case NewQxSceneViewId:
878     type = QxScene_Viewer::Type();
879     break;
880 #endif
881 #ifndef DISABLE_GRAPHICSVIEW
882   case NewGraphicsViewId:
883     type = GraphicsView_Viewer::Type();
884     break;
885 #endif
886 #ifndef DISABLE_PVVIEWER
887   case NewPVViewId:
888     type = PVViewer_Viewer::Type();
889     break;
890 #endif
891 #ifndef DISABLE_PYVIEWER
892   case NewPyViewerId:
893     type = PyViewer_Viewer::Type();
894     break;
895 #endif
896   }
897
898   if ( !type.isEmpty() )
899     createViewManager( type );
900 }
901
902 /*!
903   SLOT: Creates new document
904 */
905 void LightApp_Application::onNewDoc()
906 {
907 #ifdef SINGLE_DESKTOP
908   if ( !checkExistingDoc() )
909     return;
910 #endif
911
912   //asl: fix for 0020515
913   saveDockWindowsState();
914   
915   CAM_Application::onNewDoc();
916 }
917
918 /*!
919   SLOT: Opens new document
920 */
921 void LightApp_Application::onOpenDoc()
922 {
923   SUIT_Study* study = activeStudy();
924   
925 #ifdef SINGLE_DESKTOP
926   if ( !checkExistingDoc() )
927     return;
928 #endif
929   
930   CAM_Application::onOpenDoc();
931   
932   if ( !study ) // new study will be create in THIS application
933   {
934     updateWindows();
935     updateViewManagers();
936   }
937 }
938
939 /*!
940   SLOT: Opens new document.
941   \param aName - name of file
942 */
943 bool LightApp_Application::onOpenDoc( const QString& aName )
944 {
945 #ifdef SINGLE_DESKTOP
946   if ( !checkExistingDoc() )
947     return false;
948 #endif
949
950   saveDockWindowsState();
951
952   // We should take mru action first because this application instance can be deleted later.
953   QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
954   
955   bool res = CAM_Application::onOpenDoc( aName );
956
957   if ( mru )
958   {
959     if ( res )
960       mru->insert( aName );
961     else
962       mru->remove( aName );
963   }
964   return res;
965 }
966
967 /*!
968   SLOT: Displays "About" message box
969 */
970 void LightApp_Application::onHelpAbout()
971 {
972   LightApp_AboutDlg dlg( applicationName(), applicationVersion(), desktop() );
973   dlg.exec();
974 }
975
976 /*!
977   Private SLOT: Called on selection is changed
978   Dispatchs active module that selection is changed
979 */
980 void LightApp_Application::onSelection()
981 {
982   onSelectionChanged();
983
984   if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
985     ((LightApp_Module*)activeModule())->selectionChanged();
986 }
987
988 /*!
989   Sets active study.
990  \param study - SUIT_Study.
991 */
992 void LightApp_Application::setActiveStudy( SUIT_Study* study )
993 {
994   CAM_Application::setActiveStudy( study );
995 }
996
997 /*!
998   Enables/Disables menu items and toolbar buttons. Rebuild menu
999 */
1000 void LightApp_Application::updateCommandsStatus()
1001 {
1002   CAM_Application::updateCommandsStatus();
1003   QAction* a = 0;
1004
1005 #ifndef DISABLE_GLVIEWER
1006   a = action( NewGLViewId );
1007   if( a )
1008     a->setEnabled( activeStudy() );
1009 #endif
1010
1011 #ifndef DISABLE_PLOT2DVIEWER
1012   a = action( NewPlot2dId );
1013   if( a )
1014     a->setEnabled( activeStudy() );
1015 #endif
1016
1017 #ifndef DISABLE_OCCVIEWER
1018   a = action( NewOCCViewId );
1019   if( a )
1020     a->setEnabled( activeStudy() );
1021 #endif
1022
1023 #ifndef DISABLE_VTKVIEWER
1024   a = action( NewVTKViewId );
1025   if( a )
1026     a->setEnabled( activeStudy() );
1027 #endif
1028
1029 #ifndef DISABLE_QXGRAPHVIEWER
1030   a = action( NewQxSceneViewId );
1031   if( a )
1032     a->setEnabled( activeStudy() );
1033 #endif
1034
1035 #ifndef DISABLE_GRAPHICSVIEW
1036   a = action( NewGraphicsViewId );
1037   if( a )
1038     a->setEnabled( activeStudy() );
1039 #endif
1040
1041 #ifndef DISABLE_PVVIEWER
1042   a = action( NewPVViewId );
1043   if( a )
1044     a->setEnabled( activeStudy() );
1045 #endif
1046
1047 #ifndef DISABLE_PYVIEWER
1048   a = action( NewPyViewerId );
1049   if( a )
1050     a->setEnabled( activeStudy() );
1051 #endif
1052 }
1053
1054 /*!
1055   \class RunBrowser
1056   Runs system command in separate thread
1057 */
1058 class RunBrowser: public QThread
1059 {
1060 public:
1061   RunBrowser( LightApp_Application* app,
1062               const QString&        theApp,
1063               const QString&        theParams,
1064               const QString&        theHelpFile,
1065               const QString&        theContext = QString() )
1066     : myApp( theApp ),
1067       myParams( theParams ),
1068       myContext( theContext ),
1069       myStatus(0),
1070       myLApp( app )
1071   {
1072     //For the external browser always specify 'file://' protocol,
1073     //because some WEB browsers (for example Mozilla Firefox) can't open local file without protocol.
1074     myHelpFile = QString("file://%1").arg( QFileInfo( theHelpFile ).canonicalFilePath() );
1075   }
1076
1077   virtual void run()
1078   {
1079     if ( !myApp.isEmpty() && !myHelpFile.isEmpty()) {
1080       QString aCommand = QString( "%1 %2 \"%3%4\"" ).arg( myApp, myParams, myHelpFile, myContext.isEmpty() ? QString("") : QString( "#%1" ).arg( myContext ) );
1081
1082       QProcess* proc = new QProcess();
1083
1084       proc->start( aCommand );
1085       if ( !proc->waitForStarted() ) {
1086         SALOME_CustomEvent* ce2000 = new SALOME_CustomEvent( 2000 );
1087         QString* msg = new QString( QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).arg( myApp, myHelpFile ) );
1088         ce2000->setData( msg );
1089         QApplication::postEvent( myLApp, ce2000 );
1090       }
1091     }
1092   }
1093
1094 private:
1095   QString               myApp;
1096   QString               myParams;
1097   QString               myHelpFile;
1098   QString               myContext;
1099   int                   myStatus;
1100   LightApp_Application* myLApp;
1101 };
1102
1103 /*!
1104   SLOT: Displays help contents for choosen module
1105 */
1106 void LightApp_Application::onHelpContentsModule()
1107 {
1108   const QAction* a = (QAction*) sender();
1109   QString helpFile = a->data().toString();
1110   if ( helpFile.isEmpty() ) return;
1111
1112   SUIT_ResourceMgr* resMgr = resourceMgr();
1113   QString platform;
1114 #ifdef WIN32
1115   platform = "winapplication";
1116 #else
1117   platform = "application";
1118 #endif
1119   QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1120 #ifdef WIN32
1121   QString quote("\"");
1122   anApp.prepend( quote );
1123   anApp.append( quote );
1124 #endif
1125   QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1126   bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1127
1128   if( useExtBrowser ) {
1129     if ( !anApp.isEmpty() ) {
1130       RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile );
1131       rs->start();
1132     }
1133     else {
1134       if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1135                                       SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1136                                       SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1137
1138         showPreferences( tr( "PREF_APP" ) );
1139     }
1140   }
1141   else {
1142     QStringList parameters;
1143     parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1144     parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1145     parameters << helpFile;
1146     QProcess::startDetached( "HelpBrowser", parameters );
1147   }
1148 }
1149
1150 /*!
1151   SLOT: Displays help contents for choosen dialog
1152 */
1153 void LightApp_Application::onHelpContextModule( const QString& theComponentName,
1154                                                 const QString& theFileName,
1155                                                 const QString& theContext )
1156 {
1157   QString fileName = theFileName;
1158   QString context  = theContext;
1159   if ( !QFile::exists( fileName ) && theContext.isEmpty() ) {
1160     // context might be passed within theFileName argument
1161     QStringList comps = fileName.split("#");
1162     if ( comps.count() > 1 ) {
1163       context = comps.last();
1164       comps.removeLast();
1165       fileName = comps.join("#");
1166     }
1167   }
1168
1169   QString homeDir = "";
1170   if ( !theComponentName.isEmpty() ) {
1171     QString dir = getenv( ( theComponentName + "_ROOT_DIR" ).toLatin1().constData() );
1172     if ( !dir.isEmpty() )
1173       homeDir = Qtx::addSlash( Qtx::addSlash( dir )      +
1174                                Qtx::addSlash( "share" )  +
1175                                Qtx::addSlash( "doc" )    +
1176                                Qtx::addSlash( "salome" ) +
1177                                Qtx::addSlash( "gui" )    +
1178                                Qtx::addSlash( theComponentName ) );
1179   }
1180
1181   QString helpFile = QFileInfo( homeDir + fileName ).absoluteFilePath();
1182   SUIT_ResourceMgr* resMgr = resourceMgr();
1183         QString platform;
1184 #ifdef WIN32
1185         platform = "winapplication";
1186 #else
1187         platform = "application";
1188 #endif
1189         QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1190 #ifdef WIN32
1191         QString quote("\"");
1192         anApp.prepend( quote );
1193         anApp.append( quote );
1194 #endif
1195
1196   bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1197
1198   if(useExtBrowser) {
1199     QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1200
1201     if ( !anApp.isEmpty() ) {
1202       RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile, context );
1203       rs->start();
1204     }
1205     else {
1206       if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1207                                       SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1208                                       SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1209         showPreferences( tr( "PREF_APP" ) );
1210     }
1211   }
1212   else {
1213     QStringList parameters;
1214     parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1215     parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1216     parameters << QString( "%1#%2" ).arg( helpFile ).arg( context );
1217     QProcess::startDetached( "HelpBrowser", parameters );
1218   }
1219 }
1220
1221 /*!
1222   Sets enable or disable some actions on selection changed.
1223 */
1224 void LightApp_Application::onSelectionChanged()
1225 {
1226   LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
1227   bool canCopy  = m ? m->canCopy() : false;
1228   bool canPaste = m ? m->canPaste() : false;
1229
1230   action( EditCopyId )->setEnabled(canCopy);
1231   action( EditPasteId )->setEnabled(canPaste);
1232 }
1233
1234 /*!
1235   SLOT: Performs some actions when dockable windows are triggered
1236 */
1237 void LightApp_Application::onDockWindowVisibilityChanged( bool )
1238 {
1239 }
1240
1241 QWidget* LightApp_Application::dockWindow( const int id ) const
1242 {
1243   QWidget* wid = 0;
1244   if ( myWin.contains( id ) )
1245     wid = myWin[id];
1246   return wid;
1247 }
1248
1249 QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
1250 {
1251   if ( !wid )
1252     return 0;
1253
1254   QDockWidget* dock = 0;
1255   QWidget* w = wid->parentWidget();
1256   while ( w && !dock )
1257   {
1258     dock = ::qobject_cast<QDockWidget*>( w );
1259     w = w->parentWidget();
1260   }
1261   return dock;
1262 }
1263
1264 void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
1265 {
1266   if ( !wid )
1267     return;
1268
1269   if ( wid != dockWindow( id ) )
1270     removeDockWindow( id );
1271
1272   myWin.insert( id, wid );
1273
1274   QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
1275   connect( dock, SIGNAL(  destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1276
1277   dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
1278   dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) : 
1279                        QString( "%1Dock" ).arg( wid->objectName() ) );
1280   dock->setWidget( wid );
1281   dock->toggleViewAction()->setData( QVariant( wid->objectName() ) );
1282   connect( dock->toggleViewAction(), SIGNAL( triggered( bool ) ),
1283            this, SLOT( onDockWindowVisibilityChanged( bool ) ) );
1284
1285   QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
1286   if ( !accel.isEmpty() )
1287     dock->toggleViewAction()->setShortcut( accel );
1288
1289   dock->show();
1290 }
1291
1292 void LightApp_Application::removeDockWindow( const int id )
1293 {
1294   QWidget* wid = dockWindow( id );
1295   if ( !wid )
1296     return;
1297
1298   myWin.remove( id );
1299
1300   QDockWidget* dock = windowDock( wid );
1301   if ( !dock )
1302     return;
1303
1304   dock->setWidget( 0 );
1305   wid->setParent( 0 );
1306   wid->setVisible( false );
1307   delete dock;
1308 }
1309
1310 void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
1311 {
1312   QDockWidget* dock = windowDock( dockWindow( id ) );
1313   if ( dock && desktop() ) {
1314     desktop()->addDockWidget( place, dock );
1315     QtxDockAction* a = qobject_cast<QtxDockAction*>( action( ViewWindowsId ) );
1316     if ( a ) a->update();
1317   }
1318 }
1319
1320 /*!
1321   Gets window.
1322   \param flag - key for window
1323   \param studyId - study id
1324   Flag used how identificator of window in windows list.
1325 */
1326 QWidget* LightApp_Application::getWindow( const int flag, const int )
1327 {
1328   QWidget* wid = dockWindow( flag );
1329   if ( !wid )
1330     insertDockWindow( flag, wid = createWindow( flag ) );
1331
1332   QMap<int, int> winMap;
1333   currentWindows( winMap );
1334   if ( winMap.contains( flag ) )
1335     placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
1336
1337   return wid;
1338 }
1339
1340 /*!
1341   \return Object Browser
1342 */
1343 SUIT_DataBrowser* LightApp_Application::objectBrowser()
1344 {
1345   return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
1346 }
1347
1348 /*!
1349   \return Log Window
1350 */
1351 LogWindow* LightApp_Application::logWindow()
1352 {
1353   return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
1354 }
1355
1356 #ifndef DISABLE_PYCONSOLE
1357 /*!
1358   This returns the python console integrated to the GUI. Depending
1359   when you request the python console, this function could return
1360   null. Then the optional parameter force (default to false) can be
1361   set to force the creation of the python console if it is not done
1362   already. 
1363   \param force - if true, the pythonConsole is created if it does not exist yet
1364   \return Python Console
1365 */
1366 PyConsole_Console* LightApp_Application::pythonConsole(const bool force)
1367 {
1368   QWidget* wid = dockWindow( WT_PyConsole );
1369   if ( !wid && force==true) {
1370     wid = getWindow(WT_PyConsole);
1371   }
1372   return qobject_cast<PyConsole_Console*>( wid );
1373 }
1374 #endif
1375
1376 /*!
1377   Updates object browser and maybe data models
1378   \param updateModels - if it is true, then data models are updated
1379 */
1380 void LightApp_Application::updateObjectBrowser( const bool updateModels )
1381 {
1382   // update existing data models
1383   if ( updateModels )
1384   {
1385     const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
1386     if ( objectBrowser() )
1387       objectBrowser()->setAutoUpdate( false );
1388
1389     LightApp_Study* study = dynamic_cast<LightApp_Study*>(activeStudy());
1390     if ( study ) {
1391       CAM_Study::ModelList dm_list;
1392       study->dataModels( dm_list );
1393       QListIterator<CAM_DataModel*> it( dm_list );
1394       while ( it.hasNext() ) {
1395         CAM_DataModel* camDM = it.next();
1396         if ( camDM && camDM->inherits( "LightApp_DataModel" ) )
1397           ((LightApp_DataModel*)camDM)->update();
1398       }
1399     }
1400
1401     if( objectBrowser() )
1402       objectBrowser()->setAutoUpdate( isAutoUpdate );
1403   }
1404
1405   if ( objectBrowser() ) {
1406     objectBrowser()->updateGeometry();
1407     objectBrowser()->updateTree( 0, false );
1408   }
1409 }
1410
1411 /*!
1412   \return preferences
1413 */
1414 LightApp_Preferences* LightApp_Application::preferences() const
1415 {
1416   return preferences( false );
1417 }
1418
1419 /*!
1420   \return first view manager of some type
1421   \param vmType - type of view manager
1422   \param create - is it necessary to create view manager in case, when there is no manager of such type
1423 */
1424 SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, const bool create )
1425 {
1426   SUIT_ViewManager* aVM = viewManager( vmType );
1427   SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
1428
1429   if ( anActiveVM && anActiveVM->getType() == vmType )
1430     aVM = anActiveVM;
1431
1432   if ( aVM && create )
1433   {
1434     if ( !aVM->getActiveView() )
1435       aVM->createView();
1436     else
1437       desktop()->setActiveWindow( aVM->getActiveView() );
1438   }
1439   else if ( create )
1440     aVM = createViewManager( vmType );
1441
1442   return aVM;
1443 }
1444
1445 /*!
1446   Creates view manager of some type
1447   \param vmType - type of view manager
1448 */
1449 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType )
1450 {
1451   SUIT_ResourceMgr* resMgr = resourceMgr();
1452
1453   SUIT_ViewManager* viewMgr = 0;
1454 #ifndef DISABLE_GLVIEWER
1455   if( vmType == GLViewer_Viewer::Type() )
1456   {
1457     viewMgr = new GLViewer_ViewManager( activeStudy(), desktop() );
1458     new LightApp_GLSelector( (GLViewer_Viewer2d*)viewMgr->getViewModel(), mySelMgr );
1459   }
1460 #endif
1461 #ifndef DISABLE_PLOT2DVIEWER
1462   if( vmType == Plot2d_Viewer::Type() )
1463   {
1464     viewMgr = new Plot2d_ViewManager( activeStudy(), desktop() );
1465     Plot2d_Viewer* vm;
1466 #ifndef DISABLE_SALOMEOBJECT
1467     SPlot2d_Viewer* v = new SPlot2d_Viewer();
1468     vm = v;
1469     new LightApp_Plot2dSelector( v, mySelMgr );
1470 #else
1471     vm = new Plot2d_Viewer();
1472 #endif
1473     viewMgr->setViewModel( vm  );// custom view model, which extends SALOME_View interface
1474     Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
1475     if( wnd )
1476     {
1477       Plot2d_ViewFrame* frame = wnd->getViewFrame();
1478       frame->setBackgroundColor( resMgr->colorValue( "Plot2d", "Background", frame->backgroundColor() ) );
1479     }
1480   }
1481 #endif
1482 #ifndef DISABLE_QXGRAPHVIEWER
1483   if( vmType == QxScene_Viewer::Type() )
1484   {
1485     viewMgr = new QxScene_ViewManager( activeStudy(), desktop() );
1486     QxScene_Viewer* vm = new QxScene_Viewer();
1487     viewMgr->setViewModel( vm  );
1488     //QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
1489   }
1490 #endif
1491 #ifndef DISABLE_GRAPHICSVIEW
1492   if( vmType == GraphicsView_Viewer::Type() )
1493   {
1494     viewMgr = new GraphicsView_ViewManager( activeStudy(), desktop() );
1495     new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr );
1496   }
1497 #endif
1498 #ifndef DISABLE_PVVIEWER
1499   if( vmType == PVViewer_Viewer::Type() )
1500   {
1501     if ( viewMgr = dynamic_cast<PVViewer_ViewManager*>( getViewManager( vmType, false ) ) ) {
1502       viewMgr->getActiveView()->setFocus();
1503       return 0;
1504     } else {
1505       viewMgr = new PVViewer_ViewManager( activeStudy(), desktop(), logWindow() );
1506     }
1507   }
1508 #endif
1509 #ifndef DISABLE_PYVIEWER
1510   if( vmType == PyViewer_Viewer::Type() )
1511   {
1512     viewMgr = new PyViewer_ViewManager( activeStudy(), desktop() );
1513   }
1514 #endif
1515 #ifndef DISABLE_OCCVIEWER
1516   if( vmType == OCCViewer_Viewer::Type() )
1517   {
1518     viewMgr = new OCCViewer_ViewManager( activeStudy(), desktop() );
1519     OCCViewer_Viewer* vm;
1520 #ifndef DISABLE_SALOMEOBJECT
1521     vm = new SOCC_Viewer();
1522 #else
1523     vm = new OCCViewer_Viewer( true );
1524 #endif
1525     vm->setBackground( OCCViewer_ViewFrame::TOP_LEFT,
1526                        resMgr->backgroundValue( "OCCViewer", "xz_background", vm->background(OCCViewer_ViewFrame::TOP_LEFT) ) );
1527     vm->setBackground( OCCViewer_ViewFrame::TOP_RIGHT,
1528                        resMgr->backgroundValue( "OCCViewer", "yz_background", vm->background(OCCViewer_ViewFrame::TOP_RIGHT) ) );
1529     vm->setBackground( OCCViewer_ViewFrame::BOTTOM_LEFT,
1530                        resMgr->backgroundValue( "OCCViewer", "xy_background", vm->background(OCCViewer_ViewFrame::BOTTOM_LEFT) ) );
1531     vm->setBackground( OCCViewer_ViewFrame::BOTTOM_RIGHT,
1532                        resMgr->backgroundValue( "OCCViewer", "background", vm->background(OCCViewer_ViewFrame::MAIN_VIEW) ) );
1533
1534     vm->setTrihedronSize(  resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1535                            resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
1536     vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1537     vm->setProjectionType( resMgr->integerValue( "OCCViewer", "projection_mode", vm->projectionType() ) );
1538   #if OCC_VERSION_LARGE > 0x06090000
1539     vm->setStereoType( resMgr->integerValue( "OCCViewer", "stereo_type", vm->stereoType() ) );
1540     vm->setAnaglyphFilter( resMgr->integerValue( "OCCViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1541     vm->setStereographicFocus( resMgr->integerValue( "OCCViewer", "focus_type", vm->stereographicFocusType() ),
1542                                resMgr->doubleValue( "OCCViewer", "focus_value", vm->stereographicFocusValue() ));
1543     vm->setInterocularDistance( resMgr->integerValue( "OCCViewer", "iod_type", vm->interocularDistanceType() ),
1544                                 resMgr->doubleValue( "OCCViewer", "iod_value", vm->interocularDistanceValue() ));
1545
1546     vm->setReverseStereo( resMgr->booleanValue( "OCCViewer", "reverse_stereo", vm->isReverseStereo() ) );
1547     vm->setVSync( resMgr->booleanValue( "OCCViewer", "enable_vsync", vm->isVSync() ) );
1548     vm->setQuadBufferSupport( resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1549   #endif
1550     vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1551     vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
1552     vm->enableSelection(    resMgr->booleanValue( "OCCViewer", "enable_selection",    vm->isSelectionEnabled() ) );
1553     vm->setClippingColor( resMgr->colorValue( "OCCViewer", "clipping_color", vm->clippingColor() ) );
1554     vm->setClippingTextureParams( resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture", vm->isDefaultTextureUsed() ),
1555                                   resMgr->stringValue( "OCCViewer", "clipping_texture", vm->clippingTexture() ),
1556                                   resMgr->booleanValue( "OCCViewer", "clipping_modulate", vm->isTextureModulated() ),
1557                                   resMgr->doubleValue( "OCCViewer", "clipping_scale", vm->clippingTextureScale() ) );
1558
1559
1560     viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1561     new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
1562   }
1563 #endif
1564 #ifndef DISABLE_VTKVIEWER
1565 #ifndef DISABLE_SALOMEOBJECT
1566   if ( vmType == SVTK_Viewer::Type() )
1567 #else
1568   if ( vmType == VTKViewer_Viewer::Type() )
1569 #endif
1570   {
1571 #ifndef DISABLE_SALOMEOBJECT
1572     viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
1573     SVTK_Viewer* vm = dynamic_cast<SVTK_Viewer*>( viewMgr->getViewModel() );
1574     if( vm )
1575     {
1576       vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
1577       vm->setStereoType( resMgr->integerValue( "VTKViewer", "stereo_type", vm->stereoType() ) );
1578       vm->setAnaglyphFilter( resMgr->integerValue( "VTKViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1579       vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1580       vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1581                             resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
1582       vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
1583       vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1584       vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1585       vm->setPreSelectionMode(resMgr->integerValue( "VTKViewer", "preselection", vm->preSelectionMode() ) );
1586       vm->enableSelection( resMgr->booleanValue( "VTKViewer", "enable_selection", vm->isSelectionEnabled() ) );
1587       vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
1588                                resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
1589       vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
1590                                 resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", vm->spacemouseBtn(2) ),
1591                                 resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", vm->spacemouseBtn(3) ) );
1592       new LightApp_VTKSelector( vm, mySelMgr );
1593     }
1594 #else
1595     viewMgr = new VTKViewer_ViewManager( activeStudy(), desktop() );
1596     VTKViewer_Viewer* vm = dynamic_cast<VTKViewer_Viewer*>( viewMgr->getViewModel() );
1597     if ( vm )
1598       vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1599 #endif
1600   }
1601 #endif
1602
1603   if ( !viewMgr )
1604     return 0;
1605
1606   addViewManager( viewMgr );
1607   SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1608
1609   if ( viewWin && desktop() ) {
1610     viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1611     viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1612   }
1613
1614   return viewMgr;
1615 }
1616
1617 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1618 {
1619   SUIT_ResourceMgr* resMgr = resourceMgr();
1620
1621   SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1622                                                desktop(),
1623                                                new LightApp_WgViewModel( vmType, w ) );
1624   vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1625
1626   addViewManager( vm );
1627   SUIT_ViewWindow* vw = vm->createViewWindow();
1628   if ( vw && desktop() ) {
1629     vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1630     vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1631   }
1632
1633   if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1634     myUserWmTypes << vmType;
1635
1636   return vm;
1637 }
1638
1639 SUIT_ViewManager* LightApp_Application::createViewManager( SUIT_ViewModel* theModel )
1640 {
1641   SUIT_ResourceMgr* resMgr = resourceMgr();
1642
1643   SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1644                                                desktop(),
1645                                                theModel );
1646
1647   QString vmType = vm->getType();
1648
1649   vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1650
1651   addViewManager( vm );
1652   SUIT_ViewWindow* vw = vm->createViewWindow();
1653   if ( vw && desktop() ) {
1654     vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1655     vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1656   }
1657
1658   if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1659     myUserWmTypes << vmType;
1660
1661   return vm;
1662 }
1663
1664 /*!
1665   SLOT: Removes view manager from application
1666 */
1667 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1668 {
1669   removeViewManager( theVM );
1670 }
1671
1672 /*!
1673   Protected SLOT: On study created.
1674   \param theStudy - just created study
1675 */
1676 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1677 {
1678   SUIT_DataObject* aRoot = 0;
1679   if ( theStudy && theStudy->root() )
1680   {
1681     aRoot = theStudy->root();
1682     //aRoot->setName( tr( "DATA_MODELS" ) );
1683   }
1684
1685   getWindow( WT_ObjectBrowser );
1686
1687   loadDockWindowsState();
1688
1689   if ( objectBrowser() )
1690     objectBrowser()->setRoot( aRoot );
1691
1692   activateModule( defaultModule() );
1693
1694   if ( objectBrowser() )
1695     objectBrowser()->openLevels();
1696
1697 #ifndef DISABLE_PYCONSOLE
1698   if( pythonConsole() )
1699     getPyInterp()->initStudy();
1700 #endif
1701 }
1702
1703 /*!
1704   Protected SLOT: On study opened.
1705   \param theStudy - just opened  study
1706 */
1707 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1708 {
1709   SUIT_DataObject* aRoot = 0;
1710   if ( theStudy && theStudy->root() )
1711   {
1712     aRoot = theStudy->root();
1713     //aRoot->dump();
1714   }
1715
1716   getWindow( WT_ObjectBrowser );
1717
1718   loadDockWindowsState();
1719
1720   if ( objectBrowser() )
1721     objectBrowser()->setRoot( aRoot );
1722
1723   activateModule( defaultModule() );
1724
1725   if ( objectBrowser() )
1726     objectBrowser()->openLevels();
1727
1728 #ifndef DISABLE_PYCONSOLE
1729   if( pythonConsole() )
1730     getPyInterp()->initStudy();
1731 #endif
1732
1733   emit studyOpened();
1734 }
1735
1736 /*!Protected SLOT. On study saved.*/
1737 void LightApp_Application::onStudySaved( SUIT_Study* s )
1738 {
1739   QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1740   if ( mru && s )
1741       mru->insert( s->studyName() );
1742
1743   emit studySaved();
1744 }
1745
1746 /*!Protected SLOT. On study closed.*/
1747 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1748 {
1749   /*
1750   disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
1751               this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
1752   */
1753
1754   // stop auto-save timer
1755   myAutoSaveTimer->stop();
1756
1757   // Bug 10396: clear selection
1758   mySelMgr->clearSelected();
1759
1760   // Bug 12944: emit signal only after clear selection
1761   emit studyClosed();
1762
1763   activateModule( "" );
1764 }
1765
1766 /*!Protected SLOT.On desktop activated.*/
1767 void LightApp_Application::onDesktopActivated()
1768 {
1769   CAM_Application::onDesktopActivated();
1770   LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1771   if(aModule)
1772     aModule->studyActivated();
1773 }
1774
1775 void LightApp_Application::studyOpened( SUIT_Study* s )
1776 {
1777   CAM_Application::studyOpened( s );
1778
1779   updateWindows();
1780   updateViewManagers();
1781 }
1782
1783 void LightApp_Application::studySaved( SUIT_Study* s )
1784 {
1785   CAM_Application::studyOpened( s );
1786   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1787   if ( aResMgr && activeStudy() ) {
1788     int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1789     if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1790   }
1791 }
1792
1793 void LightApp_Application::studyCreated( SUIT_Study* s )
1794 {
1795   CAM_Application::studyCreated( s );
1796
1797   updateWindows();
1798   updateViewManagers();
1799 }
1800
1801 /*!Gets file filter.
1802  *\retval QString "(*.bin)"
1803  */
1804 QString LightApp_Application::getFileFilter() const
1805 {
1806   //return "(*.bin)";
1807   // HDF persistence
1808   return "(*.hdf)";
1809 }
1810
1811 /*!
1812   Shows file dialog and return user selected file name
1813 */
1814 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1815                                            const QString& caption, QWidget* parent )
1816 {
1817   if ( !parent )
1818     parent = desktop();
1819   QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1820   return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1821 }
1822
1823 /*! Gets directory*/
1824 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1825 {
1826   if ( !parent )
1827     parent = desktop();
1828   return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1829 }
1830
1831 /*! Get open file names*/
1832 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1833                                                     const QString& caption, QWidget* parent )
1834 {
1835   if ( !parent )
1836     parent = desktop();
1837   QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1838   return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1839 }
1840
1841 /*!Private SLOT. Update object browser.*/
1842 void LightApp_Application::onRefresh()
1843 {
1844   updateObjectBrowser( true );
1845 }
1846
1847 /*!Private SLOT. Update actions after rename object.*/
1848 void LightApp_Application::onRenamed()
1849 {
1850   activeStudy()->Modified();
1851   updateActions();
1852 }
1853
1854 // IMN 08.07.2015 : issue 002556: Some stereo outputs are affected by window position.
1855 // To prevent reversion the window should be either aligned during movement and resize.
1856 /*!Private SLOT. Update actions after rename object.*/
1857 /*void LightApp_Application::onMoved()
1858 {
1859   OCCViewer_ViewManager* viewMgr = 0;
1860   viewMgr = dynamic_cast<OCCViewer_ViewManager*>( getViewManager( OCCViewer_Viewer::Type(), false ) );
1861   if (viewMgr) {
1862     OCCViewer_ViewWindow* view = 0;
1863     view = dynamic_cast<OCCViewer_ViewWindow*>( viewMgr->getActiveView() );
1864     if (view) {
1865       view->getViewPort()->repaintViewAfterMove();
1866     }
1867   }
1868 }
1869 */
1870 /*!Private SLOT. Support drag-and-drop operation.*/
1871 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
1872 {
1873   LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
1874   if ( !parentObj )
1875     return;
1876
1877   LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
1878   if ( aModule )
1879     aModule->dropObjects( objects, parentObj, row, action );
1880 }
1881
1882 /*!Private SLOT. On preferences.*/
1883 void LightApp_Application::onPreferences()
1884 {
1885   showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
1886 }
1887
1888 /*!Private SLOT. On preferences.*/
1889 void LightApp_Application::showPreferences( const QString& itemText )
1890 {
1891   QApplication::setOverrideCursor( Qt::WaitCursor );
1892
1893   LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
1894
1895   QApplication::restoreOverrideCursor();
1896
1897   if ( !prefDlg )
1898     return;
1899
1900   preferences()->activateItem( itemText );
1901
1902   if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) &&  resourceMgr() )
1903   {
1904     if ( desktop() )
1905       resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
1906     resourceMgr()->save();
1907
1908     // Update shortcuts
1909     shortcutMgr()->updateShortcuts();
1910   }
1911
1912   delete prefDlg;
1913 }
1914
1915 /*!Protected SLOT. On preferences changed.*/
1916 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
1917 {
1918   LightApp_Module* sMod = 0;
1919   CAM_Module* mod = module( modName );
1920   if ( mod && mod->inherits( "LightApp_Module" ) )
1921     sMod = (LightApp_Module*)mod;
1922
1923   if ( sMod )
1924     sMod->preferencesChanged( section, param );
1925   else
1926     preferencesChanged( section, param );
1927   // emit signal to allow additional preferences changing processing
1928   emit preferenceChanged( modName, section, param );
1929 }
1930
1931 /*!Remove all windows from study.*/
1932 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
1933 {
1934   saveDockWindowsState();
1935
1936   if ( SUIT_DataBrowser* ob = objectBrowser() )
1937     ob->setModel(0);
1938
1939   CAM_Application::beforeCloseDoc( s );
1940 }
1941
1942 /*!Update actions.*/
1943 void LightApp_Application::updateActions()
1944 {
1945   updateCommandsStatus();
1946 }
1947
1948 /*!
1949   Creates new study
1950 */
1951 SUIT_Study* LightApp_Application::createNewStudy()
1952 {
1953   LightApp_Application::lastStudyId++;
1954
1955   LightApp_Study* aStudy = new LightApp_Study( this );
1956
1957   // Set up processing of major study-related events
1958   connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
1959   connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
1960   connect( aStudy, SIGNAL( saved  ( SUIT_Study* ) ), this, SLOT( onStudySaved  ( SUIT_Study* ) ) );
1961   connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
1962
1963   return aStudy;
1964 }
1965
1966 /*!
1967   Creates window by flag.
1968   \param flag - identificator of window type
1969 */
1970 QWidget* LightApp_Application::createWindow( const int flag )
1971 {
1972   QWidget* wid = 0;
1973
1974   SUIT_ResourceMgr* resMgr = resourceMgr();
1975
1976   if ( flag == WT_ObjectBrowser )
1977   {
1978     SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
1979     ob->setObjectName( "objectBrowser" );
1980     ob->setSortMenuEnabled( true );
1981     ob->setAutoUpdate( true );
1982     if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
1983       ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
1984
1985     //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
1986     ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
1987     connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
1988
1989     QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
1990     SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
1991     treeModel->setSearcher( this );
1992     treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
1993     treeModel->setAppropriate( EntryCol, Qtx::Toggled );
1994
1995     // Mantis issue 0020136: Drag&Drop in OB
1996     SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
1997     if ( proxyModel ) {
1998       connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
1999                this,       SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
2000       connect( proxyModel, SIGNAL( renamed( SUIT_DataObject* ) ),
2001                this,       SLOT( onRenamed( ) ) );
2002
2003     }
2004
2005     // temporary commented
2006     /*
2007     OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
2008     if( ob_list )
2009       ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
2010     */
2011
2012     // Create OBSelector
2013     new LightApp_OBSelector( ob, mySelMgr );
2014
2015     ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2016     ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
2017     ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
2018     ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
2019     wid = ob;
2020     ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2021   }
2022 #ifndef DISABLE_PYCONSOLE
2023   else  if ( flag == WT_PyConsole )
2024   {
2025     PyConsole_Console* pyCons = new PyConsole_EnhConsole( desktop(), getPyInterp() );
2026     pyCons->setObjectName( "pythonConsole" );
2027     pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
2028     pyCons->setFont(resourceMgr()->fontValue( "PyConsole", "font" ));
2029     pyCons->setIsShowBanner(resourceMgr()->booleanValue( "PyConsole", "show_banner", true ));
2030     pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
2031
2032     wid = pyCons;
2033     pyCons->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2034   }
2035 #endif
2036   else if ( flag == WT_LogWindow )
2037   {
2038     LogWindow* logWin = new LogWindow( desktop() );
2039     logWin->setObjectName( "logWindow" );
2040     logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
2041     logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
2042     wid = logWin;
2043     logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2044   }
2045   return wid;
2046 }
2047
2048 /*!
2049   \return default windows( Object Browser, Python Console )
2050   Adds to map \a aMap.
2051  */
2052 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
2053 {
2054 #ifndef DISABLE_PYCONSOLE
2055   aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
2056 #endif
2057   if ( activeStudy() ) {
2058     aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
2059     //  aMap.insert( WT_LogWindow, Qt::DockBottom );
2060   }
2061 }
2062
2063 /*!Default view managers*/
2064 void LightApp_Application::defaultViewManagers( QStringList& ) const
2065 {
2066   /*!Do nothing.*/
2067 }
2068
2069 /*!
2070   \return preferences.
2071   Create preferences, if \a crt = true.
2072 */
2073 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
2074 {
2075   if ( myPrefs )
2076     return myPrefs;
2077
2078   LightApp_Application* that = (LightApp_Application*)this;
2079
2080   bool toCreate = !_prefs_ && crt;
2081   if ( toCreate )
2082   {
2083     _prefs_ = new LightApp_Preferences( resourceMgr() );
2084     that->createPreferences( _prefs_ );
2085   }
2086
2087   that->myPrefs = _prefs_;
2088
2089   connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
2090            this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ), Qt::UniqueConnection );
2091   connect( myPrefs, SIGNAL( resetToDefaults() ),
2092            this, SIGNAL( preferenceResetToDefaults() ), Qt::UniqueConnection );
2093
2094   if ( !crt )
2095     return myPrefs;
2096
2097   SUIT_ResourceMgr* resMgr = resourceMgr();
2098
2099   QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
2100   for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
2101   {
2102     LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
2103     if ( !app )
2104       continue;
2105
2106     QStringList modNameList;
2107     app->modules( modNameList, false );
2108
2109     QMap<QString, QString> iconMap;
2110     app->moduleIconNames( iconMap );
2111
2112     for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
2113     {
2114       if ( !app->isLibExists( *it ) || _prefs_->hasModule( *it ) )
2115         continue;
2116
2117       int modId = _prefs_->addPreference( *it );
2118       if ( iconMap.contains( *it ) )
2119         _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ), iconMap[*it], false ), 20 ) );
2120     }
2121
2122     ModuleList modList;
2123     app->modules( modList );
2124     QListIterator<CAM_Module*> itr( modList );
2125     while ( itr.hasNext() )
2126     {
2127       LightApp_Module* mod = 0;
2128
2129       CAM_Module* anItem = itr.next();
2130       if ( anItem->inherits( "LightApp_Module" ) )
2131         mod = (LightApp_Module*)anItem;
2132
2133       if ( mod && !_prefs_->hasModule( mod->moduleName() ) )
2134       {
2135         _prefs_->addPreference( mod->moduleName() );
2136         mod->createPreferences();
2137         that->emptyPreferences( mod->moduleName() );
2138       }
2139     }
2140   }
2141   _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) );
2142
2143   return myPrefs;
2144 }
2145
2146 /*!
2147   Adds new module to application
2148 */
2149 void LightApp_Application::moduleAdded( CAM_Module* mod )
2150 {
2151   CAM_Application::moduleAdded( mod );
2152
2153   LightApp_Module* lightMod = 0;
2154   if ( mod && mod->inherits( "LightApp_Module" ) )
2155     lightMod = (LightApp_Module*)mod;
2156
2157   if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
2158   {
2159     myPrefs->addPreference( mod->moduleName() );
2160     lightMod->createPreferences();
2161     emptyPreferences( mod->moduleName() );
2162   }
2163 }
2164
2165 void LightApp_Application::emptyPreferences( const QString& modName )
2166 {
2167   QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2168   if ( !item || !item->isEmpty() )
2169     return;
2170
2171   //  printf( "---------------------> Modify for empty module.\n" );
2172
2173   QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2174   frm->setIcon( item->icon() );
2175   frm->setStretch( false );
2176   item->parentItem()->insertItem( frm, item );
2177   new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2178   delete item;
2179 }
2180
2181 /*!
2182   Create preferences
2183 */
2184 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2185 {
2186   if ( !pref )
2187     return;
2188
2189   QStringList     aValuesList;
2190   QList<QVariant> anIndicesList;
2191   QIntList        idList;
2192   QIntList        txtList;
2193
2194   // . Top-level "SALOME" preferences group <<start>>
2195   int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2196   pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2197
2198   // .. "General" preferences tab <<start>>
2199   int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2200
2201   // ... "Language" group <<start>>
2202   int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2203   pref->setItemProperty( "columns", 2, langGroup );
2204   // .... -> application language
2205   int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2206                                           LightApp_Preferences::Selector, "language", "language" );
2207   QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2208   QList<QVariant> aIcons;
2209   foreach ( QString aLang, aLangs ) {
2210     aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2211   }
2212   pref->setItemProperty( "strings", aLangs, curLang );
2213   pref->setItemProperty( "icons",   aIcons, curLang );
2214   pref->setItemProperty( "restart",  true, curLang );
2215
2216   int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup,
2217                                           LightApp_Preferences::Bool, "language", "locale" );
2218   pref->setItemProperty( "restart",  true, curLocale );
2219   // ... "Language" group <<end>>
2220
2221   // ... "Look and feel" group <<start>>
2222   int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2223   pref->setItemProperty( "columns", 2, lookGroup );
2224   // .... -> show splash-screen
2225   pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2226   // .... -> opaque resize
2227   pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2228   // .... -> drop-down buttons 
2229   pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2230   // ... "Look and feel" group <<end>>
2231
2232   // ... "Study properties" group <<start>>
2233   int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2234   pref->setItemProperty( "columns", 2, studyGroup );
2235   // .... -> multi-file save
2236   pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2237   // .... -> ascii save mode
2238   pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2239   // .... -> store windows geometry
2240   pref->addPreference( tr( "PREF_STORE_POS" ),  studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2241   pref->addPreference( "", studyGroup, LightApp_Preferences::Space );
2242   pref->addPreference( tr( "PREF_STORE_TOOL_POS" ),  studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" );
2243   // .... -> auto-save
2244   int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ),  studyGroup,
2245                                               LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2246   pref->setItemProperty( "min",        0, autoSaveInterval );
2247   pref->setItemProperty( "max",     1440, autoSaveInterval );
2248   pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2249   // ... "Study properties" group <<end>>
2250
2251   // ... "Help browser" group <<start>>
2252   int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2253 #ifdef WIN32
2254   QString platform = "winapplication";
2255 #else
2256   QString platform = "application";
2257 #endif
2258   // .... -> browser application
2259   int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2260   pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2261   // .... -> browser parameters
2262   pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2263   // ... "Help browser" group <<end>>
2264
2265   // ... "Python console properties" group <<start>>
2266   int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2267   // .... -> font
2268   pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2269   // .... -> show banner
2270   pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2271   // ... "Python console properties" group <<end>>
2272
2273   // ... "MRU" preferences group <<start>>
2274   int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2275   pref->setItemProperty( "columns", 4, mruGroup );
2276   // number of MRU items
2277   int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2278                                          "MRU", "visible_count" );
2279   pref->setItemProperty( "min", 0,   mruVisCount );
2280   pref->setItemProperty( "max", 100, mruVisCount );
2281   // MRU links type
2282   int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2283                                          "MRU", "link_type" );
2284   aValuesList.clear();
2285   anIndicesList.clear();
2286   aValuesList   << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2287   anIndicesList << 0                        << 1                         << 2                       ;
2288   pref->setItemProperty( "strings", aValuesList,   mruLinkType );
2289   pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2290   // ... "MRU" preferences group <<end>>
2291
2292   // ... "Full-screen" group <<start>>
2293   int fullScreenGroup = pref->addPreference( tr( "PREF_GROUP_FULL_SCREEN" ), genTab );
2294   pref->setItemProperty( "columns", 2, fullScreenGroup );
2295   // .... -> automatic hiding toolbars
2296   pref->addPreference( tr( "PREF_FULL_SCREEN_AUTO" ), fullScreenGroup,
2297                        LightApp_Preferences::Bool, "OCCViewer", "automatic_hiding" );
2298   // ... "Full-screen" group <<end>>
2299
2300   // .. "General" preferences tab <<end>>
2301
2302   // .. "3D viewer" group <<start>>
2303   int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2304   // ... -> navigation mode
2305   int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2306                                           LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2307   aValuesList.clear();
2308   anIndicesList.clear();
2309   aValuesList   << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2310   anIndicesList << 0                         << 1;
2311   pref->setItemProperty( "strings", aValuesList,   vtkStyleMode );
2312   pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2313   // ... -> zooming mode
2314   int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2315                                                  LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2316   aValuesList.clear();
2317   anIndicesList.clear();
2318   aValuesList   << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2319   anIndicesList << 0                            << 1;
2320   pref->setItemProperty( "strings", aValuesList,   occZoomingStyleMode );
2321   pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2322   // ... "Trihedron" group <<start>>
2323   int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2324   pref->setItemProperty( "columns", 2, occTriGroup );
2325   // .... -> trihedron size
2326   int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2327                                    LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2328   pref->setItemProperty( "min", 1.0E-06, occTS );
2329   pref->setItemProperty( "max", 1000, occTS );
2330   // .... -> relative size of trihedron
2331   pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2332   // .... -> show static trihedron
2333   pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2334   // ... "Trihedron" group <<end>>
2335   // .. "3D viewer" group <<end>>
2336
2337   QString formats;
2338   int bgId;
2339 #ifndef DISABLE_OCCVIEWER
2340   // .. "OCC viewer" group <<start>>
2341   int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2342
2343   // .... -> Projection mode
2344   int occProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), occGroup,
2345                                          LightApp_Preferences::Selector, "OCCViewer", "projection_mode" );
2346   aValuesList.clear();
2347   anIndicesList.clear();
2348   aValuesList   << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2349   anIndicesList << 0                       << 1;
2350   pref->setItemProperty( "strings", aValuesList,   occProjMode );
2351   pref->setItemProperty( "indexes", anIndicesList, occProjMode );
2352 #if OCC_VERSION_LARGE > 0x06090000
2353   // .... -> Stereo group
2354   int stereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), occGroup);
2355   pref->setItemProperty( "columns", 2, stereoGroup );
2356   // .... -> Stereo type
2357   int stereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), stereoGroup,
2358                                             LightApp_Preferences::Selector, "OCCViewer", "stereo_type" );
2359   aValuesList.clear();
2360   anIndicesList.clear();
2361   idList.clear();
2362   OCCViewer_Viewer::stereoData( aValuesList, idList);
2363   foreach( int gid, idList ) anIndicesList << gid;
2364   pref->setItemProperty( "strings", aValuesList,   stereoType );
2365   pref->setItemProperty( "indexes", anIndicesList, stereoType );
2366
2367   // .... -> Anaglyph filter
2368   int anaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), stereoGroup,
2369                                             LightApp_Preferences::Selector, "OCCViewer", "anaglyph_filter" );
2370   aValuesList.clear();
2371   anIndicesList.clear();
2372   aValuesList   << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2373   anIndicesList << 0                            << 1                               << 2;
2374
2375   pref->setItemProperty( "strings", aValuesList,   anaglyphFilter );
2376   pref->setItemProperty( "indexes", anIndicesList, anaglyphFilter );
2377
2378   // .... -> Convergence distance type
2379   int occFocusType = pref->addPreference( tr( "PREF_FOCUS_TYPE" ), stereoGroup,
2380                                            LightApp_Preferences::Selector, "OCCViewer", "focus_type" );
2381   aValuesList.clear();
2382   anIndicesList.clear();
2383   aValuesList   << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2384   anIndicesList << 0                   << 1;
2385   pref->setItemProperty( "strings", aValuesList,   occFocusType );
2386   pref->setItemProperty( "indexes", anIndicesList, occFocusType );
2387
2388   // .... -> Stereographic focus value
2389   int focusValue = pref->addPreference( tr( "PREF_FOCUS_VALUE" ), stereoGroup,
2390                LightApp_Preferences::DblSpin, "OCCViewer", "focus_value" );
2391   pref->setItemProperty( "precision", 3, focusValue );
2392   pref->setItemProperty( "min", 1.0E-03, focusValue );
2393   pref->setItemProperty( "max", 1.0E03, focusValue );
2394   pref->setItemProperty( "step", 0.05, focusValue );
2395
2396   // .... -> IOD type
2397   int occIODType = pref->addPreference( tr( "PREF_IOD_TYPE" ), stereoGroup,
2398                                            LightApp_Preferences::Selector, "OCCViewer", "iod_type" );
2399   aValuesList.clear();
2400   anIndicesList.clear();
2401   aValuesList   << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2402   anIndicesList << 0                   << 1;
2403   pref->setItemProperty( "strings", aValuesList,   occIODType );
2404   pref->setItemProperty( "indexes", anIndicesList, occIODType );
2405
2406   // .... -> Interocular distance (IOD) value
2407   int IODValue = pref->addPreference( tr( "PREF_IOD_VALUE" ), stereoGroup,
2408                                       LightApp_Preferences::DblSpin, "OCCViewer", "iod_value" );
2409   pref->setItemProperty( "precision", 3, IODValue );
2410   pref->setItemProperty( "min", 1.0E-03, IODValue );
2411   pref->setItemProperty( "max", 1.0E03, IODValue );
2412   pref->setItemProperty( "step", 0.05, IODValue );
2413
2414   // .... -> Reverse stereo
2415   pref->addPreference( tr( "PREF_REVERSE_STEREO" ), stereoGroup,
2416                        LightApp_Preferences::Bool, "OCCViewer", "reverse_stereo" );
2417   // .... -> Enable V-Sync
2418   pref->addPreference( tr( "PREF_ENABLE_VSYNC" ), stereoGroup,
2419                        LightApp_Preferences::Bool, "OCCViewer", "enable_vsync" );
2420   // .... -> Enable quad-buffer support
2421   pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), stereoGroup,
2422                        LightApp_Preferences::Bool, "OCCViewer", "enable_quad_buffer_support" );
2423 #endif
2424   // ... "Background" group <<start>>
2425   int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2426   //  pref->setItemProperty( "columns", 2, bgGroup );
2427   aValuesList.clear();
2428   anIndicesList.clear();
2429   txtList.clear();
2430   idList.clear();
2431   formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2432   foreach( int gid, idList ) anIndicesList << gid;
2433   // .... -> 3D viewer background
2434   bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2435                                   LightApp_Preferences::Background, "OCCViewer", "background" );
2436   pref->setItemProperty( "gradient_names", aValuesList, bgId );
2437   pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2438   pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2439   pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2440   pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2441   pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2442   pref->setItemProperty( "custom_enabled", false, bgId );
2443   pref->setItemProperty( "image_formats", formats, bgId );
2444   // .... -> XZ viewer background
2445   bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2446                               LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2447   pref->setItemProperty( "gradient_names", aValuesList, bgId );
2448   pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2449   pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2450   pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2451   pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2452   pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2453   pref->setItemProperty( "custom_enabled", false, bgId );
2454   pref->setItemProperty( "image_formats", formats, bgId );
2455   // .... -> YZ viewer background
2456   bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2457                               LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2458   pref->setItemProperty( "gradient_names", aValuesList, bgId );
2459   pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2460   pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2461   pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2462   pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2463   pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2464   pref->setItemProperty( "custom_enabled", false, bgId );
2465   pref->setItemProperty( "image_formats", formats, bgId );
2466   // .... -> XY viewer background
2467   bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2468                               LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2469   pref->setItemProperty( "gradient_names", aValuesList, bgId );
2470   pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2471   pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2472   pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2473   pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2474   pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2475   pref->setItemProperty( "custom_enabled", false, bgId );
2476   pref->setItemProperty( "image_formats", formats, bgId );
2477   // ... "Background" group <<end>>
2478
2479
2480   // ... "Selection" group <<start>>
2481   int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2482   pref->setItemProperty( "columns", 2, occSelectionGroup );
2483   // .... -> enable preselection
2484   pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup, 
2485                        LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2486   // .... -> enable selection
2487   pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup, 
2488                        LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2489   // ... "Selection" group <<end>>
2490
2491   // ... "Clipping" group <<start>>
2492   int occClippingGroup = pref->addPreference( tr( "PREF_GROUP_CLIPPING" ), occGroup );
2493   // .... -> clipping color
2494   pref->addPreference( tr( "PREF_CLIPPING_COLOR" ), occClippingGroup,
2495                LightApp_Preferences::Color, "OCCViewer", "clipping_color" );
2496   int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame );
2497   pref->setItemProperty( "columns", 2, texturePref );
2498   // .... -> use default texture
2499   pref->addPreference( tr( "PREF_CLIPPING_DEFAULT_TEXTURE" ), texturePref,
2500                LightApp_Preferences::Bool, "OCCViewer", "clipping_use_default_texture" );
2501   // .... -> clipping texture
2502   int filePref = pref->addPreference( tr( "PREF_CLIPPING_TEXTURE" ), texturePref,
2503                LightApp_Preferences::File, "OCCViewer", "clipping_texture" );
2504   pref->setItemProperty( "path_filter", tr( "OCC_TEXTURE_FILES" ), filePref );
2505   // .... -> modulate
2506   pref->addPreference( tr( "PREF_CLIPPING_MODULATE" ), texturePref,
2507                LightApp_Preferences::Bool, "OCCViewer", "clipping_modulate" );
2508   // .... -> scale factor
2509   int scaleFactor = pref->addPreference( tr( "PREF_CLIPPING_SCALE" ), texturePref,
2510                LightApp_Preferences::DblSpin, "OCCViewer", "clipping_scale" );
2511   pref->setItemProperty( "precision", 3, scaleFactor );
2512   pref->setItemProperty( "min", 1.0E-03, scaleFactor );
2513   pref->setItemProperty( "max", 1.0E03, scaleFactor );
2514   pref->setItemProperty( "step", 0.1, scaleFactor );
2515   // ... "Clipping" group <<end>>
2516
2517   // ... -> empty frame (for layout) <<start>>
2518   int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2519   pref->setItemProperty( "margin",  0, occGen );
2520   pref->setItemProperty( "columns", 2, occGen );
2521   // ... -> empty frame (for layout) <<end>>
2522
2523   // .. "OCC viewer" group <<end>>
2524 #endif
2525
2526 #ifndef DISABLE_VTKVIEWER
2527   // .. "VTK viewer" group <<start>>
2528   int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2529
2530   // ... -> empty frame (for layout) <<start>>
2531   int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2532   //pref->setItemProperty( "columns", 2, vtkGen );
2533   // .... -> projection mode
2534   int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2535                                          LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2536   aValuesList.clear();
2537   anIndicesList.clear();
2538   aValuesList   << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2539   anIndicesList << 0                       << 1;
2540   pref->setItemProperty( "strings", aValuesList,   vtkProjMode );
2541   pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2542
2543   // .... -> Stereo group
2544   int vtkStereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), vtkGroup);
2545   pref->setItemProperty( "columns", 2, vtkStereoGroup );
2546   // .... -> Stereo type
2547   int vtkStereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), vtkStereoGroup,
2548                                            LightApp_Preferences::Selector, "VTKViewer", "stereo_type" );
2549   aValuesList.clear();
2550   anIndicesList.clear();
2551   idList.clear();
2552   SVTK_Viewer::stereoData( aValuesList, idList);
2553   foreach( int gid, idList ) anIndicesList << gid;
2554   pref->setItemProperty( "strings", aValuesList,   vtkStereoType );
2555   pref->setItemProperty( "indexes", anIndicesList, vtkStereoType );
2556   // .... -> Anaglyph filter
2557   int vtkAnaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), vtkStereoGroup,
2558                                                LightApp_Preferences::Selector, "VTKViewer", "anaglyph_filter" );
2559   aValuesList.clear();
2560   anIndicesList.clear();
2561   aValuesList   << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2562   anIndicesList << 0                            << 1                               << 2;
2563
2564   pref->setItemProperty( "strings", aValuesList,   vtkAnaglyphFilter );
2565   pref->setItemProperty( "indexes", anIndicesList, vtkAnaglyphFilter );
2566
2567   // .... -> Enable quad-buffer support
2568   pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), vtkStereoGroup,
2569                        LightApp_Preferences::Bool, "VTKViewer", "enable_quad_buffer_support" );
2570
2571   // .... -> background
2572   aValuesList.clear();
2573   anIndicesList.clear();
2574   txtList.clear();
2575   idList.clear();
2576 #ifndef DISABLE_SALOMEOBJECT
2577   formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2578 #endif
2579   foreach( int gid, idList ) anIndicesList << gid;
2580   bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2581                               LightApp_Preferences::Background, "VTKViewer", "background" );
2582   pref->setItemProperty( "gradient_names", aValuesList, bgId );
2583   pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2584   pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2585   pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2586   pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2587   pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2588   pref->setItemProperty( "custom_enabled", false, bgId );
2589 #ifndef DISABLE_SALOMEOBJECT
2590   pref->setItemProperty( "image_formats", formats, bgId );
2591 #endif
2592   // .... -> speed increment
2593   int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2594                                       LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2595   pref->setItemProperty( "min", 1, vtkSpeed );
2596   pref->setItemProperty( "max", 1000, vtkSpeed );
2597   // .... -> speed mode
2598   int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2599                                           LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2600   aValuesList.clear();
2601   anIndicesList.clear();
2602   aValuesList   << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2603   anIndicesList << 0                     << 1;
2604   pref->setItemProperty( "strings", aValuesList,   vtkSpeedMode );
2605   pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2606
2607   // ... "Selection" group <<start>>
2608   int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2609   pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2610   // .... -> preselection
2611   int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ),  vtkSelectionGroup, 
2612                                              LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2613   aValuesList.clear();
2614   anIndicesList.clear();
2615   aValuesList   << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2616   anIndicesList << 0 << 1 << 2;
2617   pref->setItemProperty( "strings", aValuesList,   vtkPreselection );
2618   pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2619   // .... -> enable selection
2620   pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2621   // ... "Selection" group <<end>>
2622
2623   // ... -> empty frame (for layout) <<end>>
2624
2625   // ... space mouse sub-group <<start>>
2626   int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2627   //pref->setItemProperty( "columns", 2, vtkSM );
2628   // .... -> decrease speed increment
2629   int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2630                                              LightApp_Preferences::Selector, "VTKViewer",
2631                                              "spacemouse_func1_btn" );
2632   // .... -> increase speed increment
2633   int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2634                                              LightApp_Preferences::Selector, "VTKViewer",
2635                                              "spacemouse_func2_btn" );
2636   // .... -> dominant / combined switch  
2637   int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2638                                              LightApp_Preferences::Selector, "VTKViewer",
2639                                              "spacemouse_func5_btn" ); //
2640   aValuesList.clear();
2641   anIndicesList.clear();
2642   aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" )  << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2643   aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" )  << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2644   aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" )  << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2645   aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2646   anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2647   pref->setItemProperty( "strings", aValuesList,   spacemousePref1 );
2648   pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2649   pref->setItemProperty( "strings", aValuesList,   spacemousePref2 );
2650   pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2651   pref->setItemProperty( "strings", aValuesList,   spacemousePref3 );
2652   pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2653   // ... space mouse sub-group <<end>>
2654
2655   // ... avi recording sub-group <<start>>
2656   int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2657   pref->setItemProperty( "columns", 2, vtkRec );
2658   // .... -> recording mode
2659   int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2660                                       LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2661   aValuesList.clear();
2662   anIndicesList.clear();
2663   aValuesList   << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2664   anIndicesList << 0                           << 1;
2665   pref->setItemProperty( "strings", aValuesList,   modePref );
2666   pref->setItemProperty( "indexes", anIndicesList, modePref );
2667   // .... -> fps
2668   int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2669                                      LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2670   pref->setItemProperty( "min", 0.1, fpsPref );
2671   pref->setItemProperty( "max", 100, fpsPref );
2672   // .... -> quality
2673   int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2674                                          LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2675   pref->setItemProperty( "min", 1, qualityPref );
2676   pref->setItemProperty( "max", 100, qualityPref );
2677   // .... -> progressive mode
2678   pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2679                        LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2680   // ... avi recording sub-group <<end>>
2681
2682   // ... group names sub-group <<start>>
2683   int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2684                                    LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2685   pref->setItemProperty( "columns", 2, vtkGN );
2686   // .... -> text color
2687   pref->addPreference( tr(  "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2688                        LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2689   // .... -> transparency
2690   int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2691                                        LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2692   pref->setItemProperty( "min", 0.0, transPref );
2693   pref->setItemProperty( "max", 1.0, transPref );
2694   pref->setItemProperty( "step", 0.1, transPref );
2695   // ... -> group names sub-group <<end>>
2696   // .. "VTK viewer" group <<end>>
2697 #endif
2698
2699   // .. "Plot2d viewer" group <<start>>
2700   int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2701   //pref->setItemProperty( "columns", 2, plot2dGroup );
2702
2703   // ... -> background
2704   pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2705                        LightApp_Preferences::Color, "Plot2d", "Background" );
2706   // ... -> selection color
2707   pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2708                        LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2709
2710   // ... "Viewer" group <<start>>
2711   int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup );
2712
2713   // .... -> curve type
2714   int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup,
2715                                        LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2716   aValuesList.clear();
2717   anIndicesList.clear();
2718   aValuesList   << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2719   anIndicesList << 0                 << 1                << 2                ;
2720   pref->setItemProperty( "strings", aValuesList,   curveType );
2721   pref->setItemProperty( "indexes", anIndicesList, curveType );
2722   // .... -> marker size
2723   int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup,
2724                                         LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2725   pref->setItemProperty( "min", 0, markerSize );
2726   pref->setItemProperty( "max", 100, markerSize );
2727   // .... -> horizontal scaling mode
2728   int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup,
2729                                       LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2730   aValuesList.clear();
2731   anIndicesList.clear();
2732   aValuesList   << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2733   anIndicesList << 0                 << 1                     ;
2734   pref->setItemProperty( "strings", aValuesList,   horScale );
2735   pref->setItemProperty( "indexes", anIndicesList, horScale );
2736   // .... -> vertical scaling mode
2737   int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup,
2738                                       LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2739   pref->setItemProperty( "strings", aValuesList,   verScale );
2740   pref->setItemProperty( "indexes", anIndicesList, verScale );
2741
2742   // .... -> errors/deviation colot
2743   pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup,
2744                        LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2745   // .... -> deviation markers line size
2746   int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup,
2747                                         LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2748   pref->setItemProperty( "min", 1, deviationMarkerLw );
2749   pref->setItemProperty( "max", 5, deviationMarkerLw );
2750   // .... -> deviation markers tick mark size
2751   int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup,
2752                                         LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2753   pref->setItemProperty( "min", 1, deviationMarkerTs );
2754   pref->setItemProperty( "max", 5, deviationMarkerTs );
2755   // .... "Viewer" group <<end>>
2756
2757   // ... "Legend" group <<start>>
2758   int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup );
2759
2760   // .... -> show legend
2761   pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup,
2762                        LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2763   // .... -> legend position
2764   int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup,
2765                                             LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2766   aValuesList.clear();
2767   anIndicesList.clear();
2768   aValuesList   << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2769   anIndicesList << 0               << 1                << 2              << 3                ;
2770   pref->setItemProperty( "strings", aValuesList,   legendPosition );
2771   pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2772   // .... -> Symbol type
2773   int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup,
2774                                             LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" );
2775   aValuesList.clear();
2776   anIndicesList.clear();
2777   aValuesList   << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE");
2778   anIndicesList << 0                            << 1                        ;
2779   pref->setItemProperty( "strings", aValuesList,   legendSymbolType );
2780   pref->setItemProperty( "indexes", anIndicesList, legendSymbolType );
2781   // .... -> legend font
2782   pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2783   // ... -> font color
2784   pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2785   // ... -> selection font color
2786   pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2787   // ... "Legend" group <<end>>
2788
2789   // .. "Plot2d viewer" group <<end>>
2790
2791   // .. "PyViewer" preferences tab <<start>>
2792   int pyeditTab = pref->addPreference( tr( "PREF_TAB_PYEDITOR" ), salomeCat );
2793   // ... "Font settings" group <<start>>
2794   int pyFontGroup = pref->addPreference( tr( "PREF_GROUP_PY_FONT" ), pyeditTab );
2795   pref->addPreference( tr( "PREF_PY_FONT" ), pyFontGroup,
2796     LightApp_Preferences::Font, "PyEditor", "Font" );
2797   // ... "Font settings" group <<end>>
2798   // ... "Display settings" group <<start>>
2799   int pyDispGroup = pref->addPreference( tr( "PREF_GROUP_PY_DISPLAY" ), pyeditTab );
2800   pref->setItemProperty( "columns", 2, pyDispGroup );
2801   // ... -> current line highlight
2802   pref->addPreference( tr( "PREF_PY_CURRLINE_HIGHLIGHT" ), pyDispGroup,
2803     LightApp_Preferences::Bool, "PyEditor", "HighlightCurrentLine" );
2804   // ... -> text wrapping
2805   pref->addPreference( tr( "PREF_PY_TEXT_WRAP" ), pyDispGroup,
2806     LightApp_Preferences::Bool, "PyEditor", "TextWrapping" );
2807   // ... -> center cursor on scroll
2808   pref->addPreference( tr( "PREF_PY_CURSON_ON_SCROLL" ), pyDispGroup,
2809     LightApp_Preferences::Bool, "PyEditor", "CenterCursorOnScroll" );
2810   // ... -> line numbers area
2811   pref->addPreference( tr( "PREF_PY_LINE_NUMBS_AREA" ), pyDispGroup,
2812     LightApp_Preferences::Bool, "PyEditor", "LineNumberArea" );
2813   // ... "Display settings" group <<end>>
2814   // ... "Tab settings" group <<start>>
2815   int pyTabGroup = pref->addPreference( tr( "PREF_GROUP_PY_TAB" ), pyeditTab );
2816   pref->setItemProperty( "columns", 2, pyTabGroup );
2817   // ... -> tab whitespaces
2818   pref->addPreference( tr( "PREF_PY_TAB_WHITESPACES" ), pyTabGroup,
2819     LightApp_Preferences::Bool, "PyEditor", "TabSpaceVisible" );
2820   // ... -> tab size
2821   pref->addPreference( tr( "PREF_PY_TAB_SIZE" ), pyTabGroup,
2822     LightApp_Preferences::IntSpin, "PyEditor", "TabSize" );
2823   // ... "Tab settings" group <<end>>
2824   // ... "Vertical edge settings" group <<start>>
2825   int pyVertEdgeGroup = pref->addPreference( tr( "PREF_GROUP_VERT_EDGE" ), pyeditTab );
2826   pref->setItemProperty( "columns", 2, pyVertEdgeGroup );
2827   // ... -> vertical edge
2828   pref->addPreference( tr( "PREF_PY_VERT_EDGE" ), pyVertEdgeGroup,
2829     LightApp_Preferences::Bool, "PyEditor", "VerticalEdge" );
2830   // ... -> number of columns
2831   pref->addPreference( tr( "PREF_PY_NUM_COLUMNS" ), pyVertEdgeGroup,
2832     LightApp_Preferences::IntSpin, "PyEditor", "NumberColumns" );
2833   // ... "Vertical edge settings" group <<end>>
2834   // .. "PyEditor" preferences tab <<end>>
2835
2836   // .. "Directories" preferences tab <<start>>
2837   int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2838   // ... --> quick directories list
2839   int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2840   pref->addPreference( tr( "" ), dirGroup,
2841                        LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2842   // .. "Directories" preferences tab <<end>>
2843
2844   // .. "Object browser" preferences tab <<start>>
2845   int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2846
2847   // ... "Search tool" group <<start>>
2848   int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2849   // .... --> auto-hide
2850   pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2851                        "ObjectBrowser", "auto_hide_search_tool" );
2852   // ... "Search tool" group <<end>>
2853
2854   // ... "Object browser settings" group <<start>>
2855   int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2856   pref->setItemProperty( "columns", 2, objSetGroup );
2857   // .... -> auto size first column
2858   pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2859                        "ObjectBrowser", "auto_size_first" );
2860   // .... -> auto size other columns
2861   pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2862                        "ObjectBrowser", "auto_size" );
2863   // .... -> resize columns on expand item
2864   pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2865                        "ObjectBrowser", "resize_on_expand_item" );
2866   // .... -> browse to published object
2867   int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
2868                                              "ObjectBrowser", "browse_published_object" );
2869   aValuesList.clear();
2870   anIndicesList.clear();
2871   aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
2872   anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
2873   pref->setItemProperty( "strings", aValuesList,   browsePublished );
2874   pref->setItemProperty( "indexes", anIndicesList, browsePublished );
2875   // ... "Object browser settings" group <<end>>
2876   // .. "Object browser" preferences tab <<end>>
2877
2878   // .. "Shortcuts" preferences tab <<start>>
2879   int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
2880   // ... "Shortcuts settings" group <<start>>
2881   int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
2882   pref->addPreference( tr( "" ), shortcutGroup,
2883                        LightApp_Preferences::ShortcutTree, "shortcuts" );
2884   // ... "Shortcuts settings" group <<end>>
2885   // .. "Shortcuts" preferences tab <<end>>
2886   // . Top-level "SALOME" preferences group <<end>>
2887
2888   pref->retrieve();
2889 }
2890
2891 /*!
2892   Changes appearance of application according to changed preferences
2893   \param sec - section
2894   \param param - name of changed parameter
2895 */
2896 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
2897 {
2898   SUIT_ResourceMgr* resMgr = resourceMgr();
2899   if ( !resMgr )
2900     return;
2901
2902   if ( sec == "viewers" && param == "drop_down_buttons" )
2903   {
2904     ViewManagerList vmlist = viewManagers();
2905     foreach( SUIT_ViewManager* vm, vmlist )
2906     {
2907       QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
2908       foreach( SUIT_ViewWindow* vw, vwlist )
2909         if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
2910     }
2911   }
2912
2913   if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
2914   {
2915     double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
2916     bool relative = resMgr->booleanValue( sec, "relative_size", true );
2917     QList<SUIT_ViewManager*> lst;
2918 #ifndef DISABLE_OCCVIEWER
2919     viewManagers( OCCViewer_Viewer::Type(), lst );
2920     QListIterator<SUIT_ViewManager*> itOCC( lst );
2921     while ( itOCC.hasNext() && sz >= 0 )
2922     {
2923       SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2924       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2925         continue;
2926
2927       OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2928       occVM->setTrihedronSize( sz, relative );
2929       occVM->getAISContext()->UpdateCurrentViewer();
2930     }
2931 #endif
2932 #ifndef DISABLE_VTKVIEWER
2933 #ifndef DISABLE_SALOMEOBJECT
2934     viewManagers( SVTK_Viewer::Type(), lst );
2935     QListIterator<SUIT_ViewManager*> itVTK( lst );
2936     while ( itVTK.hasNext() && sz >= 0 )
2937     {
2938       SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2939       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2940         continue;
2941
2942       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2943       if( vtkVM )
2944       {
2945         vtkVM->setTrihedronSize( sz, relative );
2946         vtkVM->Repaint();
2947       }
2948     }
2949 #endif
2950 #endif
2951   }
2952
2953   if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
2954   {
2955     bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
2956     QList<SUIT_ViewManager*> lst;
2957 #ifndef DISABLE_OCCVIEWER
2958     viewManagers( OCCViewer_Viewer::Type(), lst );
2959     QListIterator<SUIT_ViewManager*> itOCC( lst );
2960     while ( itOCC.hasNext() )
2961     {
2962       SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2963       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2964         continue;
2965
2966       OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
2967       if( occVM )
2968       {
2969         occVM->setStaticTrihedronDisplayed( isVisible );
2970       }
2971     }
2972 #endif
2973 #ifndef DISABLE_VTKVIEWER
2974 #ifndef DISABLE_SALOMEOBJECT
2975     viewManagers( SVTK_Viewer::Type(), lst );
2976     QListIterator<SUIT_ViewManager*> itVTK( lst );
2977     while ( itVTK.hasNext() )
2978     {
2979       SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2980       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2981         continue;
2982
2983       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2984       if( vtkVM )
2985       {
2986         vtkVM->setStaticTrihedronVisible( isVisible );
2987         vtkVM->Repaint();
2988       }
2989     }
2990 #endif
2991 #endif
2992   }
2993
2994   if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
2995   {
2996     int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
2997     QList<SUIT_ViewManager*> lst;
2998 #ifndef DISABLE_OCCVIEWER
2999     viewManagers( OCCViewer_Viewer::Type(), lst );
3000     QListIterator<SUIT_ViewManager*> itOCC( lst );
3001     while ( itOCC.hasNext() )
3002     {
3003       SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3004       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3005         continue;
3006
3007       OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3008       occVM->setInteractionStyle( mode );
3009     }
3010 #endif
3011 #ifndef DISABLE_VTKVIEWER
3012 #ifndef DISABLE_SALOMEOBJECT
3013     viewManagers( SVTK_Viewer::Type(), lst );
3014     QListIterator<SUIT_ViewManager*> itVTK( lst );
3015     while ( itVTK.hasNext() )
3016     {
3017       SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3018       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3019         continue;
3020
3021       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3022       if( vtkVM ) vtkVM->setInteractionStyle( mode );
3023     }
3024 #endif
3025 #endif
3026   }
3027
3028 #ifndef DISABLE_OCCVIEWER
3029   if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
3030   {
3031     bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
3032     QList<SUIT_ViewManager*> lst;
3033     viewManagers( OCCViewer_Viewer::Type(), lst );
3034     QListIterator<SUIT_ViewManager*> it( lst );
3035     while ( it.hasNext() )
3036     {
3037       SUIT_ViewModel* vm = it.next()->getViewModel();
3038       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3039         continue;
3040
3041       OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3042       occVM->enablePreselection( isToEnablePreselection );
3043     }
3044   }
3045 #endif
3046
3047 #ifndef DISABLE_OCCVIEWER
3048   if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
3049   {
3050     bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
3051     QList<SUIT_ViewManager*> lst;
3052     viewManagers( OCCViewer_Viewer::Type(), lst );
3053     QListIterator<SUIT_ViewManager*> it( lst );
3054     while ( it.hasNext() )
3055     {
3056       SUIT_ViewModel* vm = it.next()->getViewModel();
3057       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3058         continue;
3059
3060       OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3061       occVM->enableSelection( isToEnableSelection );
3062     }
3063   }
3064 #endif
3065
3066 #ifndef DISABLE_OCCVIEWER
3067   if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) )
3068   {
3069     QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) );
3070     QList<SUIT_ViewManager*> lst;
3071     viewManagers( OCCViewer_Viewer::Type(), lst );
3072     QListIterator<SUIT_ViewManager*> it( lst );
3073     while ( it.hasNext() )
3074     {
3075       SUIT_ViewModel* vm = it.next()->getViewModel();
3076       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3077         continue;
3078
3079       OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3080       occVM->setClippingColor( aColor );
3081     }
3082   }
3083 #endif
3084
3085 #ifndef DISABLE_OCCVIEWER
3086   if ( sec == QString( "OCCViewer" ) && ( param == QString( "clipping_use_default_texture" ) ||
3087                                           param == QString( "clipping_texture" ) ||
3088                                           param == QString( "clipping_modulate" ) ||
3089                                           param == QString( "clipping_scale" ) ) )
3090   {
3091     bool isDefaultTextureUsed = resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture" );
3092     QString aTexture = resMgr->stringValue( "OCCViewer", "clipping_texture" );
3093     bool isModulated = resMgr->booleanValue( "OCCViewer", "clipping_modulate" );
3094     double aScale = resMgr->doubleValue( "OCCViewer", "clipping_scale" );
3095     QList<SUIT_ViewManager*> lst;
3096     viewManagers( OCCViewer_Viewer::Type(), lst );
3097     QListIterator<SUIT_ViewManager*> it( lst );
3098     while ( it.hasNext() )
3099     {
3100       SUIT_ViewModel* vm = it.next()->getViewModel();
3101       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3102         continue;
3103
3104       OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3105       occVM->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale );
3106     }
3107   }
3108 #endif
3109
3110 #ifndef DISABLE_OCCVIEWER
3111   if ( sec == QString( "OCCViewer" ) && param == QString( "projection_mode" ) )
3112   {
3113     int mode = resMgr->integerValue( "OCCViewer", "projection_mode", 0 );
3114     QList<SUIT_ViewManager*> lst;
3115     viewManagers( OCCViewer_Viewer::Type(), lst );
3116     QListIterator<SUIT_ViewManager*> it( lst );
3117     while ( it.hasNext() )
3118     {
3119       SUIT_ViewModel* vm = it.next()->getViewModel();
3120       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3121         continue;
3122
3123       OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3124       occVM->setProjectionType( mode );
3125     }
3126   }
3127 #endif
3128 #if OCC_VERSION_LARGE > 0x06090000
3129 #ifndef DISABLE_OCCVIEWER
3130   if ( sec == QString( "OCCViewer" ) && param == QString( "stereo_type" ) )
3131   {
3132     int mode = resMgr->integerValue( "OCCViewer", "stereo_type", 0 );
3133     QList<SUIT_ViewManager*> lst;
3134     viewManagers( OCCViewer_Viewer::Type(), lst );
3135     QListIterator<SUIT_ViewManager*> it( lst );
3136     while ( it.hasNext() )
3137     {
3138       SUIT_ViewModel* vm = it.next()->getViewModel();
3139       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3140         continue;
3141
3142       OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3143       occVM->setStereoType( mode );
3144     }
3145   }
3146 #endif
3147
3148 #ifndef DISABLE_OCCVIEWER
3149   if ( sec == QString( "OCCViewer" ) && param == QString( "anaglyph_filter" ) )
3150   {
3151     int mode = resMgr->integerValue( "OCCViewer", "anaglyph_filter", 0 );
3152     QList<SUIT_ViewManager*> lst;
3153     viewManagers( OCCViewer_Viewer::Type(), lst );
3154     QListIterator<SUIT_ViewManager*> it( lst );
3155     while ( it.hasNext() )
3156     {
3157       SUIT_ViewModel* vm = it.next()->getViewModel();
3158       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3159         continue;
3160
3161       OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3162       occVM->setAnaglyphFilter( mode );
3163     }
3164   }
3165 #endif
3166
3167 #ifndef DISABLE_OCCVIEWER
3168   if ( sec == QString( "OCCViewer" ) && ( param == QString( "focus_type" ) ||
3169                                           param == QString( "focus_value" ) ) )
3170   {
3171     int aType = resMgr->integerValue( "OCCViewer", "focus_type" );
3172     double aValue = resMgr->doubleValue( "OCCViewer", "focus_value" );
3173     QList<SUIT_ViewManager*> lst;
3174     viewManagers( OCCViewer_Viewer::Type(), lst );
3175     QListIterator<SUIT_ViewManager*> it( lst );
3176     while ( it.hasNext() )
3177     {
3178       SUIT_ViewModel* vm = it.next()->getViewModel();
3179       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3180         continue;
3181
3182       OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3183       occVM->setStereographicFocus( aType, aValue );
3184     }
3185   }
3186 #endif
3187
3188 #ifndef DISABLE_OCCVIEWER
3189   if ( sec == QString( "OCCViewer" ) && ( param == QString( "iod_type" ) ||
3190                                           param == QString( "iod_value" ) ) )
3191   {
3192     int aType = resMgr->integerValue( "OCCViewer", "iod_type" );
3193     double aValue = resMgr->doubleValue( "OCCViewer", "iod_value" );
3194     QList<SUIT_ViewManager*> lst;
3195     viewManagers( OCCViewer_Viewer::Type(), lst );
3196     QListIterator<SUIT_ViewManager*> it( lst );
3197     while ( it.hasNext() )
3198     {
3199       SUIT_ViewModel* vm = it.next()->getViewModel();
3200       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3201         continue;
3202
3203       OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3204       occVM->setInterocularDistance( aType, aValue );
3205     }
3206   }
3207 #endif
3208
3209 #ifndef DISABLE_OCCVIEWER
3210   if ( sec == QString( "OCCViewer" ) && param == QString( "reverse_stereo" ) )
3211   {
3212     bool reverse = resMgr->booleanValue( "OCCViewer", "reverse_stereo", false );
3213     QList<SUIT_ViewManager*> lst;
3214     viewManagers( OCCViewer_Viewer::Type(), lst );
3215     QListIterator<SUIT_ViewManager*> it( lst );
3216     while ( it.hasNext() )
3217     {
3218       SUIT_ViewModel* vm = it.next()->getViewModel();
3219       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3220         continue;
3221
3222       OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3223       occVM->setReverseStereo( reverse );
3224     }
3225   }
3226 #endif
3227
3228 #ifndef DISABLE_OCCVIEWER
3229   if ( sec == QString( "OCCViewer" ) && param == QString( "enable_vsync" ) )
3230   {
3231     bool enable = resMgr->booleanValue( "OCCViewer", "enable_vsync", true );
3232     QList<SUIT_ViewManager*> lst;
3233     viewManagers( OCCViewer_Viewer::Type(), lst );
3234     QListIterator<SUIT_ViewManager*> it( lst );
3235     while ( it.hasNext() )
3236     {
3237       SUIT_ViewModel* vm = it.next()->getViewModel();
3238       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3239         continue;
3240
3241       OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3242       occVM->setVSync( enable );
3243     }
3244   }
3245 #endif
3246
3247 #ifndef DISABLE_OCCVIEWER
3248   if ( sec == QString( "OCCViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3249   {
3250     bool enable = resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", false );
3251     QList<SUIT_ViewManager*> lst;
3252     viewManagers( OCCViewer_Viewer::Type(), lst );
3253     QListIterator<SUIT_ViewManager*> it( lst );
3254     while ( it.hasNext() )
3255     {
3256       SUIT_ViewModel* vm = it.next()->getViewModel();
3257       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3258         continue;
3259
3260       OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3261       occVM->setQuadBufferSupport( enable );
3262     }
3263   }
3264 #endif
3265 #endif
3266   if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
3267   {
3268     int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
3269     QList<SUIT_ViewManager*> lst;
3270 #ifndef DISABLE_OCCVIEWER
3271     viewManagers( OCCViewer_Viewer::Type(), lst );
3272     QListIterator<SUIT_ViewManager*> itOCC( lst );
3273     while ( itOCC.hasNext() )
3274     {
3275       SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3276       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3277         continue;
3278
3279       OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3280       occVM->setZoomingStyle( mode );
3281     }
3282 #endif
3283 #ifndef DISABLE_VTKVIEWER
3284 #ifndef DISABLE_SALOMEOBJECT
3285     viewManagers( SVTK_Viewer::Type(), lst );
3286     QListIterator<SUIT_ViewManager*> itVTK( lst );
3287     while ( itVTK.hasNext() )
3288     {
3289       SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3290       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3291         continue;
3292
3293       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3294       if( vtkVM ) vtkVM->setZoomingStyle( mode );
3295     }
3296 #endif
3297 #endif
3298   }
3299
3300 #ifndef DISABLE_VTKVIEWER
3301   if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
3302   {
3303     int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
3304     int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
3305     QList<SUIT_ViewManager*> lst;
3306 #ifndef DISABLE_SALOMEOBJECT
3307     viewManagers( SVTK_Viewer::Type(), lst );
3308     QListIterator<SUIT_ViewManager*> it( lst );
3309     while ( it.hasNext() )
3310     {
3311       SUIT_ViewModel* vm = it.next()->getViewModel();
3312       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3313         continue;
3314
3315       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3316       if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
3317     }
3318 #endif
3319   }
3320 #endif
3321
3322 #ifndef DISABLE_VTKVIEWER
3323   if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
3324   {
3325     int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
3326     QList<SUIT_ViewManager*> lst;
3327 #ifndef DISABLE_SALOMEOBJECT
3328     viewManagers( SVTK_Viewer::Type(), lst );
3329     QListIterator<SUIT_ViewManager*> it( lst );
3330     while ( it.hasNext() )
3331     {
3332       SUIT_ViewModel* vm = it.next()->getViewModel();
3333       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3334         continue;
3335
3336       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3337       if( vtkVM ) vtkVM->setProjectionMode( mode );
3338     }
3339 #endif
3340   }
3341 #endif
3342
3343 #ifndef DISABLE_VTKVIEWER
3344   if ( sec == QString( "VTKViewer" ) && param == QString( "stereo_type" ) )
3345   {
3346     int mode = resMgr->integerValue( "VTKViewer", "stereo_type", 0 );
3347     QList<SUIT_ViewManager*> lst;
3348 #ifndef DISABLE_SALOMEOBJECT
3349     viewManagers( SVTK_Viewer::Type(), lst );
3350     QListIterator<SUIT_ViewManager*> it( lst );
3351     while ( it.hasNext() )
3352     {
3353       SUIT_ViewModel* vm = it.next()->getViewModel();
3354       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3355         continue;
3356
3357       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3358       if( vtkVM ) vtkVM->setStereoType( mode );
3359     }
3360 #endif
3361   }
3362 #endif
3363
3364 #ifndef DISABLE_VTKVIEWER
3365   if ( sec == QString( "VTKViewer" ) && param == QString( "anaglyph_filter" ) )
3366   {
3367     int mode = resMgr->integerValue( "VTKViewer", "anaglyph_filter", 0 );
3368     QList<SUIT_ViewManager*> lst;
3369 #ifndef DISABLE_SALOMEOBJECT
3370     viewManagers( SVTK_Viewer::Type(), lst );
3371     QListIterator<SUIT_ViewManager*> it( lst );
3372     while ( it.hasNext() )
3373     {
3374       SUIT_ViewModel* vm = it.next()->getViewModel();
3375       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3376         continue;
3377
3378       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3379       if( vtkVM ) vtkVM->setAnaglyphFilter( mode );
3380     }
3381 #endif
3382   }
3383 #endif
3384
3385 #ifndef DISABLE_VTKVIEWER
3386   if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
3387   {
3388     int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
3389     QList<SUIT_ViewManager*> lst;
3390 #ifndef DISABLE_SALOMEOBJECT
3391     viewManagers( SVTK_Viewer::Type(), lst );
3392     QListIterator<SUIT_ViewManager*> it( lst );
3393     while ( it.hasNext() )
3394     {
3395       SUIT_ViewModel* vm = it.next()->getViewModel();
3396       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3397         continue;
3398
3399       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3400       if( vtkVM ) vtkVM->setPreSelectionMode( mode );
3401     }
3402 #endif
3403   }
3404 #endif
3405
3406 #ifndef DISABLE_VTKVIEWER
3407   if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
3408   {
3409     bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
3410     QList<SUIT_ViewManager*> lst;
3411 #ifndef DISABLE_SALOMEOBJECT
3412     viewManagers( SVTK_Viewer::Type(), lst );
3413     QListIterator<SUIT_ViewManager*> it( lst );
3414     while ( it.hasNext() )
3415     {
3416       SUIT_ViewModel* vm = it.next()->getViewModel();
3417       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3418         continue;
3419
3420       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3421       if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
3422     }
3423 #endif
3424   }
3425 #endif
3426
3427 #ifndef DISABLE_VTKVIEWER
3428   if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
3429                                          param == QString( "spacemouse_func2_btn" ) ||
3430                                          param == QString( "spacemouse_func5_btn" ) ) )
3431   {
3432     int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
3433     int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
3434     int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
3435     QList<SUIT_ViewManager*> lst;
3436 #ifndef DISABLE_SALOMEOBJECT
3437     viewManagers( SVTK_Viewer::Type(), lst );
3438     QListIterator<SUIT_ViewManager*> it( lst );
3439     while ( it.hasNext() )
3440     {
3441       SUIT_ViewModel* vm = it.next()->getViewModel();
3442       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3443         continue;
3444
3445       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3446       if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
3447     }
3448 #endif
3449   }
3450 #endif
3451   if( sec=="ObjectBrowser" )
3452   {
3453     SUIT_DataBrowser* ob = objectBrowser();
3454     if ( !ob )
3455       return;
3456
3457     if ( param=="auto_size_first" )
3458     {
3459       bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
3460       ob->setAutoSizeFirstColumn( autoSizeFirst );
3461       if ( autoSizeFirst )
3462         ob->adjustFirstColumnWidth();
3463     }
3464     else if ( param=="auto_size" ) {
3465       bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
3466       ob->setAutoSizeColumns(autoSize);
3467       if ( autoSize )
3468         ob->adjustColumnsWidth();
3469     }
3470     else if ( param=="resize_on_expand_item" ) {
3471       bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
3472       ob->setResizeOnExpandItem(resizeOnExpandItem);
3473     }
3474     else if ( param == "auto_hide_search_tool" ) {
3475       ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
3476     }
3477   }
3478
3479   if( sec=="Study" )
3480   {
3481     if( param=="auto_save_interval" ) {
3482       myAutoSaveTimer->stop();
3483       int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
3484       if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3485     }
3486   }
3487
3488 #ifndef DISABLE_PYCONSOLE
3489   if( sec=="PyConsole" && pythonConsole() )
3490   {
3491     if ( param=="font" ) {
3492       pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
3493     }
3494     else if ( param=="show_banner" ) {
3495       pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
3496     }
3497   }
3498 #endif
3499
3500   if( sec=="MRU" )
3501   {
3502     QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3503     if ( mru ) {
3504       if ( param == "visible_count" )
3505         mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) );    // 5 MRU items by default
3506       else if ( param == "max_count" )
3507         mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) );       // unlimited history by default
3508       else if ( param == "insert_mode" )
3509         mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) );        // QtxMRUAction::MoveFirst by default
3510       else if ( param == "link_type" )
3511         mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) );            // QtxMRUAction::LinkAuto by default
3512       else if ( param == "show_clear" )
3513         mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) );  // do not show "Clear" item by default
3514       else if ( param == "show_mru" )
3515         mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) );          // do not show MRU menu item by default
3516     }
3517   }
3518   if ( sec == "language" && param == "language" )
3519   {
3520     // VSR 18.06.2015 : commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3521     //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
3522   }
3523   if ( sec == "language" && param == "locale")
3524   {
3525     // VSR 18.06.2015: commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3526     //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
3527   }
3528   if ( sec == "desktop" && param == "opaque_resize" ) {
3529     bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
3530     QMainWindow::DockOptions dopts = desktop()->dockOptions();
3531     if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3532     else                dopts &= ~QMainWindow::AnimatedDocks;
3533     desktop()->setDockOptions( dopts );
3534     desktop()->setOpaqueResize( opaqueResize );
3535     if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3536       dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3537   }
3538
3539 #ifndef DISABLE_PLOT2DVIEWER
3540   QList<SUIT_ViewManager*> lst;
3541   viewManagers( Plot2d_Viewer::Type(), lst );
3542   QListIterator<SUIT_ViewManager*> itPlot2d( lst );
3543   while ( itPlot2d.hasNext() ) {
3544     SUIT_ViewManager* viewMgr = itPlot2d.next();
3545     SUIT_ViewModel* vm = viewMgr->getViewModel();
3546     if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
3547       continue;
3548
3549     Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
3550
3551     viewMgr->setViewModel( vm  );
3552     Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
3553     if( wnd ) {
3554       Plot2d_ViewFrame* frame = wnd->getViewFrame();
3555       frame->SetPreference();
3556     }
3557   }
3558 #endif
3559
3560 #ifndef DISABLE_PYVIEWER
3561   if ( sec == QString( "PyViewer" ) && ( param == QString( "HighlightCurrentLine" ) ||
3562                                          param == QString( "LineNumberArea" ) ||
3563                                          param == QString( "TextWrapping" ) ||
3564                                          param == QString( "CenterCursorOnScroll" ) ||
3565                                          param == QString( "TabSpaceVisible" ) ||
3566                                          param == QString( "TabSize" ) ||
3567                                          param == QString( "VerticalEdge" ) ||
3568                                          param == QString( "NumberColumns" ) ||
3569                                          param == QString( "Font" ) ) )
3570   {
3571     QList<SUIT_ViewManager*> lst;
3572     viewManagers( PyViewer_Viewer::Type(), lst );
3573     QListIterator<SUIT_ViewManager*> itPy( lst );
3574     while ( itPy.hasNext() )
3575     {
3576       SUIT_ViewManager* viewMgr = itPy.next();
3577       SUIT_ViewModel* vm = viewMgr->getViewModel();
3578       if ( !vm || !vm->inherits( "PyViewer_Viewer" ) )
3579         continue;
3580
3581       PyViewer_Viewer* pyEditVM = dynamic_cast<PyViewer_Viewer*>( vm );
3582
3583       viewMgr->setViewModel( vm );
3584       PyViewer_ViewWindow* pyView = dynamic_cast<PyViewer_ViewWindow*>( viewMgr->getActiveView() );
3585       if( pyView )
3586       {
3587         pyView->setPreferences();
3588       }
3589     }
3590   }
3591 #endif
3592 }
3593
3594 /*!
3595   Loads preferences
3596 */
3597 void LightApp_Application::loadPreferences()
3598 {
3599   CAM_Application::loadPreferences();
3600
3601   SUIT_ResourceMgr* aResMgr = resourceMgr();
3602
3603   if ( !aResMgr )
3604     return;
3605
3606   static bool mru_load = true;
3607   if ( mru_load )
3608   {
3609     QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3610     if ( mru ) {
3611       mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) );         // do not show MRU menu item by default
3612       mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) );   // 5 MRU items by default
3613       mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) );      // unlimited history by default
3614       mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) );       // QtxMRUAction::MoveFirst by default
3615       mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) );           // QtxMRUAction::LinkAuto by default
3616       mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3617       mru->loadLinks( aResMgr, "MRU" );
3618     }
3619     mru_load = false;
3620   }
3621
3622   myWinVis.clear();
3623   QStringList mods = aResMgr->parameters( "windows_visibility" );
3624   for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
3625   {
3626     QByteArray arr;
3627     if ( aResMgr->value( "windows_visibility", *itr, arr ) )
3628       myWinVis.insert( *itr, arr );
3629   }
3630
3631   if ( desktop() ) {
3632     desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
3633     bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
3634     QMainWindow::DockOptions dopts = desktop()->dockOptions();
3635     if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3636     else                dopts &= ~QMainWindow::AnimatedDocks;
3637     desktop()->setDockOptions( dopts );
3638     desktop()->setOpaqueResize( opaqueResize );
3639     if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3640       dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3641   }
3642 }
3643
3644 /*!
3645   Saves preferences
3646 */
3647 void LightApp_Application::savePreferences()
3648 {
3649   CAM_Application::savePreferences();
3650
3651   saveDockWindowsState();
3652
3653   SUIT_ResourceMgr* aResMgr = resourceMgr();
3654
3655   if ( !aResMgr )
3656     return;
3657
3658   QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3659   if ( mru )
3660     mru->saveLinks( aResMgr, "MRU" );
3661
3662   for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3663     aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3664
3665   if ( desktop() )
3666     aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3667
3668 #if GUI_DEVELOPMENT > 0
3669   aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
3670 #else
3671   aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
3672 #endif
3673
3674   aResMgr->save();
3675 }
3676
3677 /*!
3678   Updates desktop title
3679 */
3680 void LightApp_Application::updateDesktopTitle()
3681 {
3682   QString aTitle = applicationName();
3683   QString aVer = applicationVersion();
3684   if ( !aVer.isEmpty() )
3685     aTitle += QString( " " ) + aVer;
3686
3687   if ( activeStudy() ) {
3688     QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3689     aTitle += QString( " - [%1]" ).arg( sName );
3690   }
3691
3692   desktop()->setWindowTitle( aTitle );
3693 }
3694
3695 /*!
3696   \brief Get map of the operations which can be performed
3697   on the module activation.
3698
3699   The method should return the map of the kind \c {<id>:<name>}
3700   where \c <id> is an integer identifier of the operation and
3701   \c <name> is a title for the button to be added to the
3702   dialog box. After user selects the required operation by the
3703   clicking the corresponding button in the dialog box, its identifier
3704   is passed to the moduleActionSelected() method to process
3705   the made choice.
3706
3707   \return map of the operations
3708   \sa moduleActionSelected()
3709 */
3710 QMap<int, QString> LightApp_Application::activateModuleActions() const
3711 {
3712   QMap<int, QString> opmap;
3713   opmap.insert( NewStudyId,  tr( "ACTIVATE_MODULE_OP_NEW" ) );
3714   opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3715   return opmap;
3716 }
3717
3718 /*!
3719   \brief Called when the used selectes required operation chosen
3720   from "Activate module" dialog box.
3721
3722   Performs the required operation according to the user choice.
3723
3724   \param id operation identifier
3725   \sa activateModuleActions()
3726 */
3727 void LightApp_Application::moduleActionSelected( const int id )
3728 {
3729   switch ( id ) {
3730   case NewStudyId:
3731     onNewDoc();
3732     break;
3733   case OpenStudyId:
3734     onOpenDoc();
3735     break;
3736   default:
3737     break;
3738   }
3739 }
3740
3741 /*!
3742   Updates windows after close document
3743 */
3744 void LightApp_Application::afterCloseDoc()
3745 {
3746   updateWindows();
3747
3748   CAM_Application::afterCloseDoc();
3749 }
3750
3751 /*!
3752   Updates actions of active module
3753 */
3754 void LightApp_Application::updateModuleActions()
3755 {
3756   QString modName;
3757   if ( activeModule() ) {
3758     modName = activeModule()->moduleName();
3759     if ( !isModuleAccessible( modName ) ) {
3760       QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3761       foreach( SUIT_Application* app, apps ) {
3762         LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3763         if ( lapp && lapp != this )
3764           lapp->removeModuleAction( modName );
3765       }
3766     }
3767   }
3768
3769   LightApp_ModuleAction* moduleAction =
3770     qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3771   if ( moduleAction )
3772     moduleAction->setActiveModule( modName );
3773 }
3774
3775 void LightApp_Application::removeModuleAction( const QString& modName )
3776 {
3777   LightApp_ModuleAction* moduleAction =
3778     qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3779   if ( moduleAction )
3780     moduleAction->removeModule( modName );
3781 }
3782
3783 /*!
3784   Gets current windows.
3785   \param winMap - output current windows map.
3786 */
3787 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3788 {
3789   winMap.clear();
3790   if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3791     ((LightApp_Module*)activeModule())->windows( winMap );
3792   else
3793     defaultWindows( winMap );
3794 }
3795
3796 /*!
3797   Gets current view managers.
3798   \param lst - output current view managers list.
3799 */
3800 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3801 {
3802   lst.clear();
3803   if ( !activeStudy() )
3804     return;
3805
3806   if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3807     ((LightApp_Module*)activeModule())->viewManagers( lst );
3808   else
3809     defaultViewManagers( lst );
3810 }
3811
3812 /*!
3813   Updates windows
3814 */
3815 void LightApp_Application::updateWindows()
3816 {
3817   QMap<int, int> winMap;
3818   currentWindows( winMap );
3819
3820   for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
3821   {
3822     if ( !dockWindow( it.key() ) )
3823       getWindow( it.key() );
3824   }
3825
3826   for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
3827   {
3828     QWidget* wid = it.value();
3829     if ( winMap.contains( it.key() ) )
3830       wid->setVisible( true );
3831     else
3832       delete wid;
3833   }
3834
3835   loadDockWindowsState();
3836 }
3837
3838 /*!
3839   Updates view managers
3840 */
3841 void LightApp_Application::updateViewManagers()
3842 {
3843   QStringList lst;
3844   currentViewManagers( lst );
3845
3846   for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
3847     getViewManager( *it, true );
3848 }
3849
3850 /*!
3851   Loads windows geometry
3852 */
3853 void LightApp_Application::loadDockWindowsState()
3854 {
3855   if ( !desktop() )
3856     return;
3857   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3858   bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
3859   bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
3860
3861   QString modName;
3862   if ( activeModule() )
3863     modName = activeModule()->name();
3864   else if ( activeStudy() )
3865     modName = "nomodule";
3866
3867   QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues );
3868   QByteArray aDefaultState;
3869   aResMgr->value( "windows_geometry", modName, aDefaultState );
3870   QByteArray aDefaultVisibility;
3871   aResMgr->value( "windows_visibility", modName, aDefaultVisibility );
3872   bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
3873   aResMgr->setWorkingMode( prevMode );
3874   
3875   if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
3876     return;
3877
3878   if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
3879     long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) );
3880     QByteArray arr;
3881     if ( version > Qtx::versionToId( "7.4.1" ) )
3882       aResMgr->value( "windows_geometry", modName , arr );
3883     else
3884       arr = aDefaultState;
3885     QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
3886     desktop()->restoreState( aTargetArray );
3887   }
3888
3889   QStringList mainToolbarsNames;
3890   mainToolbarsNames << "SalomeStandard" << "SalomeModules";
3891   QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
3892   foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
3893   /*
3894   if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
3895     return;
3896
3897   QMap<QString, bool> *tbMap = 0;
3898   QMap<QString, bool> *dwMap = 0;
3899   
3900   QMap<QString, bool> userTbMap, userDwMap;
3901   dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
3902
3903   QMap<QString, bool> defaultTbMap, defaultDwMap;
3904   if(hasDefaultVisibility) {
3905     dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);    
3906   }
3907
3908   if(storeTb) {
3909     tbMap =  &userTbMap;
3910   } else {
3911     if(hasDefaultVisibility){
3912       tbMap =  &defaultTbMap;
3913     }
3914   }
3915
3916   if(storeWin) {
3917     dwMap =  &userDwMap;
3918   } else {
3919     if(hasDefaultVisibility){
3920       dwMap =  &defaultDwMap;
3921     }
3922   }
3923
3924   if(tbMap) {
3925     QList<QToolBar*> tbList = findToolBars();
3926     for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
3927       { 
3928         QToolBar* tb = *tit;
3929         if ( tbMap->contains( tb->objectName() ) ) {      
3930           tb->setVisible( (*tbMap)[tb->objectName()] );
3931         }
3932       }
3933   }
3934
3935   if(dwMap) {
3936     QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
3937     for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
3938       {
3939         QDockWidget* dw = *dit;
3940         
3941         QObject* po = Qtx::findParent( dw, "QMainWindow" );
3942         if ( po != desktop() )
3943           continue;
3944         
3945         if ( dwMap->contains( dw->objectName() ) )
3946           dw->setVisible( (*dwMap)[dw->objectName()] );
3947       }
3948   }
3949   */
3950 }
3951
3952
3953 /*!
3954   Saves windows geometry
3955 */
3956 void LightApp_Application::saveDockWindowsState()
3957 {
3958   if ( !desktop() )
3959     return;
3960
3961   bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
3962   bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
3963
3964   if( !storeWin && !storeTb )
3965     return;
3966
3967   QString modName;
3968   if ( activeModule() )
3969     modName = activeModule()->name();
3970   else if ( activeStudy() )
3971     modName = "nomodule";
3972
3973   QString versionId = GUI_VERSION_STR;
3974 #if GUI_DEVELOPMENT > 0
3975   versionId += "dev";
3976 #endif
3977
3978   QByteArray arr = desktop()->saveState();
3979   resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
3980   resourceMgr()->setValue( "windows_geometry_version", modName, versionId );
3981
3982   QByteArray visArr;
3983   if ( myWinVis.contains( modName ) )
3984     visArr = myWinVis[modName];
3985
3986   QMap<QString, bool> tbMap, dwMap;
3987   dockWindowsState( visArr, tbMap, dwMap );
3988
3989   QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
3990   for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
3991   {
3992     QToolBar* tb = *it;
3993     tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
3994   }
3995
3996   QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
3997   for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
3998   {
3999     QDockWidget* wid = *it;
4000     dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
4001   }
4002
4003   visArr = dockWindowsState( tbMap, dwMap );
4004
4005   myWinVis.insert( modName, visArr );
4006 }
4007
4008 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
4009 {
4010   QByteArray visArr;
4011   QDataStream stream( &visArr, QIODevice::WriteOnly );
4012
4013   stream << (uchar)ToolBarMarker;
4014   stream << tb.size();
4015   for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
4016   {
4017     stream << tit.key();
4018     stream << (uchar)( tit.value() ? 1 : 0 );
4019   }
4020
4021   stream << (uchar)DockWidgetMarker;
4022   stream << dw.size();
4023   for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
4024   {
4025     stream << wit.key();
4026     stream << (uchar)( wit.value() ? 1 : 0 );
4027   }
4028
4029   return visArr;
4030 }
4031
4032 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
4033 {
4034   tb.clear();
4035   dw.clear();
4036
4037   QByteArray visArr = arr;
4038   QDataStream stream( &visArr, QIODevice::ReadOnly );
4039
4040   uchar marker;
4041   stream >> marker;
4042   if ( marker != ToolBarMarker )
4043     return;
4044
4045   int lines;
4046   stream >> lines;
4047   for ( int i = 0; i < lines; ++i )
4048   {
4049     QString objectName;
4050     stream >> objectName;
4051     uchar shown;
4052     stream >> shown;
4053     tb.insert( objectName, shown );
4054   }
4055
4056   stream >> marker;
4057   if ( marker != DockWidgetMarker )
4058     return;
4059
4060   stream >> lines;
4061   for ( int j = 0; j < lines; ++j )
4062   {
4063     QString objectName;
4064     stream >> objectName;
4065     uchar shown;
4066     stream >> shown;
4067     dw.insert( objectName, shown );
4068   }
4069 }
4070
4071 /*!
4072   Adds icon names for modules
4073 */
4074 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
4075 {
4076   iconMap.clear();
4077
4078   SUIT_ResourceMgr* resMgr = resourceMgr();
4079   if ( !resMgr )
4080     return;
4081
4082   QStringList modList;
4083   modules( modList, false );
4084
4085   for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
4086   {
4087     QString modName = *it;
4088     QString modIntr = moduleName( modName );
4089     QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
4090
4091     if ( modIcon.isEmpty() )
4092       continue;
4093
4094     if ( SUIT_Tools::extension( modIcon ).isEmpty() )
4095       modIcon += QString( ".png" );
4096
4097     iconMap.insert( modName, modIcon );
4098   }
4099 }
4100
4101 /*!
4102   Inserts items in popup, which necessary for current application
4103 */
4104 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
4105 {
4106   //Add "Rename" item
4107   LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
4108   bool cacheIsOn = selMgr->isSelectionCacheEnabled();
4109   selMgr->setSelectionCacheEnabled( true );
4110
4111   SUIT_DataBrowser* ob = objectBrowser();
4112
4113   CAM_Application::contextMenuPopup( type, thePopup, title );
4114
4115   if ( ob && type == ob->popupClientType() ) {
4116     thePopup->addSeparator();
4117     QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
4118     if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
4119       a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
4120   }
4121
4122 #ifndef DISABLE_SALOMEOBJECT
4123   if ( selMgr && ob ) {
4124     SALOME_ListIO selected;
4125     selMgr->selectedObjects( selected );
4126     if(selected.Extent() == 1){
4127       Handle(SALOME_InteractiveObject) anIObject = selected.First();
4128       SUIT_DataObject* obj = findObject(anIObject->getEntry());
4129       if(obj && obj->renameAllowed()) {
4130         QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
4131         connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
4132         if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
4133           a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
4134
4135         QList<QAction*> acts = thePopup->actions();
4136         QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
4137         thePopup->insertAction(firstAction,a);
4138       }
4139     }
4140   }
4141 #endif
4142
4143   selMgr->setSelectionCacheEnabled( cacheIsOn );
4144 }
4145
4146 /*!
4147   Create empty study
4148 */
4149 void LightApp_Application::createEmptyStudy()
4150 {
4151   CAM_Application::createEmptyStudy();
4152
4153   if ( objectBrowser() )
4154     objectBrowser()->updateTree();
4155
4156   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
4157   if ( aResMgr && activeStudy() ) {
4158     int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
4159     if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
4160   }
4161 }
4162
4163 /*!Set desktop:*/
4164 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
4165 {
4166   CAM_Application::setDesktop( desk );
4167
4168   if ( desk ) {
4169     connect( desk, SIGNAL( message( const QString& ) ),
4170              this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
4171     connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
4172              this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
4173     /* connect( desk, SIGNAL( windowMoved( SUIT_ViewWindow* ) ),
4174              this, SLOT( onWindowMoved( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); */
4175   }
4176 }
4177
4178 /*!
4179   Activates module
4180   \param mod - module to be activated
4181 */
4182 bool LightApp_Application::activateModule( CAM_Module* mod )
4183 {
4184   bool res = CAM_Application::activateModule( mod );
4185
4186   if ( objectBrowser() )
4187     objectBrowser()->updateTree();
4188
4189   return res;
4190 }
4191
4192 /*!
4193   \return keyborad accelerators manager object
4194 */
4195 SUIT_Accel* LightApp_Application::accel() const
4196 {
4197   return myAccel;
4198 }
4199
4200 /*!
4201   Removes dead widget container from map
4202 */
4203 void LightApp_Application::onWCDestroyed( QObject* ob )
4204 {
4205   // remove destroyed widget container from windows map
4206   for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
4207   {
4208     if ( itr.value() != ob )
4209       continue;
4210
4211     int key = itr.key();
4212     myWin.remove( key );
4213     break;
4214   }
4215 }
4216
4217 void LightApp_Application::onMRUActivated( const QString& name )
4218 {
4219   SUIT_Session* s = SUIT_Session::session();
4220   if ( s && s->activeApplication() == this )
4221     onOpenDoc( name );
4222 }
4223
4224 void LightApp_Application::onStylePreferences()
4225 {
4226   Style_PrefDlg dlg( desktop() );
4227   dlg.exec();
4228
4229   resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
4230 }
4231
4232 void LightApp_Application::onFullScreen(){
4233   if(myScreenHelper) {
4234     if(desktop()->isFullScreen())
4235       myScreenHelper->switchToNormalScreen();
4236     else
4237       myScreenHelper->switchToFullScreen();
4238   }
4239 }
4240
4241 /*!
4242   Connects just added view manager
4243 */
4244 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
4245 {
4246   connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4247            this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4248   CAM_Application::addViewManager( vm );
4249 }
4250
4251 /*!
4252   Remove view manager from memory
4253 */
4254 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
4255 {
4256   disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4257            this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4258   LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4259   if (aStudy )
4260     aStudy->removeObjectProperties( vm->getGlobalId() );
4261
4262   CAM_Application::removeViewManager( vm );
4263
4264   LightApp_SelectionMgr* selMgr = selectionMgr();
4265   QList<SUIT_Selector*> selectors;
4266   selMgr->selectors( selectors );
4267   foreach( SUIT_Selector* selector, selectors ) {
4268     if ( selector->owner() == vm->getViewModel() ) {
4269       delete selector;
4270     }
4271   }
4272
4273   // IPAL22894: Crash on closing OCC view
4274   //delete vm;
4275   vm->deleteLater();
4276 }
4277
4278 /*!
4279   Renames active window of desktop
4280 */
4281 void LightApp_Application::onRenameWindow()
4282 {
4283   if( !desktop() )
4284     return;
4285
4286   QWidget* w = desktop()->activeWindow();
4287   if( !w )
4288     return;
4289
4290   bool ok;
4291   QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
4292   if( ok && !name.isEmpty() )
4293     w->setWindowTitle( name );
4294 }
4295
4296 /*!
4297   Closes active window of desktop
4298 */
4299 void LightApp_Application::onCloseWindow()
4300 {
4301   if( !desktop() )
4302     return;
4303
4304   QWidget* w = desktop()->activeWindow();
4305   if( !w )
4306     return;
4307
4308   w->close();
4309 }
4310
4311 /*!
4312   Closes all windows of desktop
4313 */
4314 void LightApp_Application::onCloseAllWindow()
4315 {
4316   STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4317   if( !desk )
4318     return;
4319
4320   QList<SUIT_ViewWindow*> wndList = desk->windows();
4321   SUIT_ViewWindow* wnd;
4322   foreach( wnd, wndList )
4323   {
4324     if ( wnd )
4325       wnd->close();
4326   }
4327 }
4328
4329 /*!
4330   Groups all windows of desktop
4331 */
4332 void LightApp_Application::onGroupAllWindow()
4333 {
4334   STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4335   if( !desk )
4336     return;
4337
4338   QtxWorkstack* wgStack = desk->workstack();
4339   if ( wgStack )
4340     wgStack->stack();
4341 }
4342
4343 /*!
4344   \return if the library of module exists
4345   \param moduleTitle - title of module
4346 */
4347 bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
4348 {
4349   if( moduleTitle.isEmpty() )
4350     return false;
4351
4352   QString lib = moduleLibrary( moduleTitle );
4353
4354   //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
4355   bool isPythonModule = lib.contains("SalomePyQtGUI");
4356   bool isPythonLightModule = lib.contains("SalomePyQtGUILight");
4357
4358   QStringList paths;
4359 #ifdef WIN32
4360   paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4361 #else
4362   paths = QString(::getenv( "LD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
4363 #endif
4364
4365   bool isLibFound = false;
4366   QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4367   for( ; anIt!=aLast; anIt++ )
4368   {
4369     QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
4370
4371     if( inf.exists() )
4372       {
4373         isLibFound = true;
4374         break;
4375       }
4376   }
4377
4378   if ( !isLibFound )
4379     {
4380       INFOS( "\n****************************************************************" << std::endl
4381           << "*    Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
4382           << "*    Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
4383           << "****************************************************************" << std::endl );
4384     }
4385   else if ( !isPythonModule && !isPythonLightModule)
4386     return true;
4387
4388   if ( isPythonModule || isPythonLightModule)
4389     {
4390       QString pylib = moduleName( moduleTitle ) + QString(".py");
4391       QString pylibgui = moduleName( moduleTitle ) + QString("GUI.py");
4392
4393       // Check the python library
4394 // #ifdef WIN32
4395 //       paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4396 // #else
4397       paths = QString(::getenv( "PYTHONPATH" )).split( ":", QString::SkipEmptyParts );
4398 // #endif
4399       bool isPyLib = false, isPyGuiLib = false;
4400       QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4401       for( ; anIt!=aLast; anIt++ )
4402         {
4403           QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
4404           QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
4405
4406           if(!isPythonLightModule)
4407             if( !isPyLib && inf.exists() )
4408               isPyLib = true;
4409
4410           if( !isPyGuiLib && infgui.exists() )
4411             isPyGuiLib = true;
4412
4413           if ((isPyLib || isPythonLightModule ) && isPyGuiLib && isLibFound)
4414             return true;
4415         }
4416
4417       printf( "\n****************************************************************\n" );
4418       printf( "*    Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
4419       if (!isPyLib)
4420         printf( "*    No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
4421       if (!isPyGuiLib)
4422         printf( "*    No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).toLatin1().constData() );
4423       printf( "****************************************************************\n" );
4424       return true;
4425   }
4426   return false;
4427 }
4428
4429 /*!
4430   \return default name for an active study
4431 */
4432 void LightApp_Application::setDefaultStudyName( const QString& theName )
4433 {
4434   QStringList anInfoList;
4435   modules( anInfoList, false );
4436
4437   LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
4438   if( anInfoList.count() == 1 && // to avoid a conflict between different modules
4439       !aStudy->isSaved() )
4440   {
4441     aStudy->setStudyName( theName );
4442     updateDesktopTitle();
4443   }
4444 }
4445
4446 /*!
4447   Custom event handler
4448 */
4449 bool LightApp_Application::event( QEvent* e )
4450 {
4451   if( e && e->type()==2000 )
4452   {
4453     SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
4454     QString* d = ( QString* )ce->data();
4455     if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
4456                                   d ? *d : "",
4457                                   SUIT_MessageBox::Yes | SUIT_MessageBox::No,
4458                                   SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
4459       showPreferences( tr( "PREF_APP" ) );
4460     if( d )
4461       delete d;
4462     return true;
4463   }
4464   return CAM_Application::event( e );
4465 }
4466
4467 /*! Check data object */
4468 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
4469 {
4470   if (theObj)
4471     {
4472       bool isSuitable = !theObj->entry().isEmpty() &&
4473                         !theObj->componentDataType().isEmpty() &&
4474                         !theObj->name().isEmpty();
4475       return isSuitable;
4476     }
4477
4478   return false;
4479 }
4480
4481 int LightApp_Application::openChoice( const QString& aName )
4482 {
4483   int choice = CAM_Application::openChoice( aName );
4484
4485   if ( choice == OpenExist ) // The document is already open.
4486   {
4487     // Do you want to reload it?
4488     if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
4489                                     SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
4490       choice = OpenReload;
4491   }
4492
4493   return choice;
4494 }
4495
4496 bool LightApp_Application::openAction( const int choice, const QString& aName )
4497 {
4498   bool res = false;
4499   switch ( choice )
4500   {
4501   case OpenReload:
4502     {
4503       STD_Application* app = 0;
4504       SUIT_Session* session = SUIT_Session::session();
4505       QList<SUIT_Application*> appList = session->applications();
4506       for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
4507       {
4508         if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
4509           app = ::qobject_cast<STD_Application*>( *it );
4510       }
4511
4512       if ( app )
4513       {
4514         app->onCloseDoc( false );
4515         appList = session->applications();
4516         STD_Application* other = 0;
4517         for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
4518           other = ::qobject_cast<STD_Application*>( *it );
4519
4520         if ( other )
4521           res = other->onOpenDoc( aName );
4522       }
4523     }
4524     break;
4525   default:
4526     res = CAM_Application::openAction( choice, aName );
4527     break;
4528   }
4529
4530   return res;
4531 }
4532
4533 QStringList LightApp_Application::viewManagersTypes() const
4534 {
4535   QStringList aTypesList;
4536   aTypesList += myUserWmTypes;
4537 #ifndef DISABLE_GLVIEWER
4538   aTypesList<<GLViewer_Viewer::Type();
4539 #endif
4540 #ifndef DISABLE_PLOT2DVIEWER
4541   aTypesList<<Plot2d_Viewer::Type();
4542 #endif
4543 #ifndef DISABLE_QXGRAPHVIEWER
4544   aTypesList<<QxScene_Viewer::Type();
4545 #endif
4546 #ifndef DISABLE_PVVIEWER
4547   aTypesList<<PVViewer_Viewer::Type();
4548 #endif
4549 #ifndef DISABLE_PYVIEWER
4550   aTypesList<<PyViewer_Viewer::Type();
4551 #endif
4552 #ifndef DISABLE_OCCVIEWER
4553   aTypesList<<OCCViewer_Viewer::Type();
4554 #endif
4555 #ifndef DISABLE_VTKVIEWER
4556  #ifndef DISABLE_SALOMEOBJECT
4557   aTypesList<<SVTK_Viewer::Type();
4558  #else
4559   aTypesList<<VTKViewer_Viewer::Type();
4560  #endif
4561 #endif
4562   return aTypesList;
4563 }
4564 /*!
4565  * Removes all view managers of known types
4566  * Other view managers are ignored
4567  */
4568 void LightApp_Application::clearKnownViewManagers()
4569 {
4570   QStringList aTypesList = viewManagersTypes();
4571   QList<SUIT_ViewManager*> aMgrList;
4572   viewManagers( aMgrList );
4573   foreach (SUIT_ViewManager* aMgr, aMgrList) {
4574     if (aTypesList.contains(aMgr->getType()))
4575       removeViewManager(aMgr);
4576   }
4577 }
4578
4579 /*!
4580   Copy of current selection
4581  */
4582 void LightApp_Application::onCopy()
4583 {
4584   LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4585   if( m )
4586     m->copy();
4587 }
4588
4589 /*!
4590   Paste of current data in clipboard
4591  */
4592 void LightApp_Application::onPaste()
4593 {
4594   LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4595   if( m )
4596     m->paste();
4597 }
4598
4599 /*!
4600   Browse (i.e. set focus on) the published objects
4601   \param theIsApplyAndClose - flag indicating that the dialog for creating objects
4602                               has been accepted by Ok (or Apply & Close) button
4603   \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
4604                                   (to select the first published object only)
4605   \return entry of the selected object
4606  */
4607 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
4608                                              const bool theIsApplyAndClose,
4609                                              const bool theIsOptimizedBrowsing )
4610 {
4611   QString aResult;
4612   if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
4613   {
4614     int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
4615     switch( aBrowsePolicy )
4616     {
4617       case BP_Never:
4618         return aResult;
4619       case BP_ApplyAndClose:
4620         if( !theIsApplyAndClose )
4621           return aResult;
4622       case BP_Always:
4623       default:
4624         break;
4625     }
4626   }
4627
4628   LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4629   if( !aStudy )
4630     return aResult;
4631
4632   SUIT_DataBrowser* anOB = objectBrowser();
4633   if( !anOB )
4634     return aResult;
4635
4636   SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
4637   if( !aModel )
4638     return aResult;
4639
4640   QStringListIterator anIter( theEntryList );
4641   if( theIsOptimizedBrowsing )
4642   {
4643     // go to the last entry
4644     anIter.toBack();
4645     if( anIter.hasPrevious() )
4646       anIter.previous();
4647   }
4648
4649   // scroll to each entry in the list
4650   // (in optimized mode - to the last entry only)
4651   QString anEntry;
4652   LightApp_DataObject* anObject = 0;
4653   while( anIter.hasNext() )
4654   {
4655     anEntry = anIter.next();
4656     if( !anEntry.isEmpty() )
4657     {
4658       anObject = aStudy->findObjectByEntry( anEntry );
4659       if( anObject )
4660       {
4661         QModelIndex anIndex = aModel->index( anObject );
4662         anOB->treeView()->scrollTo( anIndex );
4663       }
4664     }
4665   }
4666
4667   // always select the last object
4668   if( anObject && !anEntry.isEmpty() )
4669   {
4670     QList<SUIT_Selector*> aSelectorList;
4671     selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
4672     if( !aSelectorList.isEmpty() )
4673     {
4674       if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
4675       {
4676         bool anIsAutoBlock = aSelector->autoBlock();
4677
4678         // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
4679         aSelector->setAutoBlock( false );
4680
4681         SUIT_DataOwnerPtrList aList;
4682 #ifndef DISABLE_SALOMEOBJECT
4683         Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
4684           ( anObject->entry().toLatin1().constData(),
4685             anObject->componentDataType().toLatin1().constData(),
4686             anObject->name().toLatin1().constData() );
4687         LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj  );
4688 #else
4689         LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
4690 #endif
4691
4692         aList.append( owner );
4693         selectionMgr()->setSelected( aList );
4694         aResult = anEntry;
4695
4696         // restore auto block flag
4697         aSelector->setAutoBlock( anIsAutoBlock );
4698       }
4699     }
4700   }
4701
4702   return aResult;
4703 }
4704
4705 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
4706 {
4707   LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
4708   return study ? study->findObjectByEntry( id ) : 0;
4709 }
4710
4711 /*!
4712   Checks that an object can be renamed.
4713   \param entry entry of the object
4714   \brief Return \c true if object can be renamed
4715 */
4716 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
4717   return false;
4718 }
4719
4720 /*!
4721   Rename object by entry.
4722   \param entry entry of the object
4723   \param name new name of the object
4724   \brief Return \c true if rename operation finished successfully, \c false otherwise.
4725 */
4726 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
4727   return false;
4728 }
4729
4730 /*! Process standard messages from desktop */
4731 void LightApp_Application::onDesktopMessage( const QString& message )
4732 {
4733   const QString sectionSeparator = "/";
4734
4735   if ( message.toLower() == "updateobjectbrowser" ||
4736        message.toLower() == "updateobjbrowser" ) {
4737     // update object browser
4738     updateObjectBrowser();
4739   }
4740   else if ( message.toLower().startsWith( "activate_viewer" ) ) {
4741     QString vtype = message.split( sectionSeparator ).last();
4742     if ( !vtype.isEmpty() )
4743       getViewManager( vtype, true );
4744   }
4745   else {
4746     QStringList data = message.split( sectionSeparator );
4747     if ( data.count() > 1 ) {
4748       QString msgType = data[0].trimmed();
4749       LightApp_Module* sMod = 0;
4750       CAM_Module* mod = module( msgType );
4751       if ( !mod )
4752         mod = module( moduleTitle( msgType ) );
4753       if ( mod && mod->inherits( "LightApp_Module" ) )
4754         sMod = (LightApp_Module*)mod;
4755
4756       if ( msgType.toLower() == "preferences" ) {
4757         // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4758         // for example "preferences/Study/multi_file_dump/true"
4759         if ( data.count() > 3 ) {
4760           QString section = data[1].trimmed();
4761           QString param   = data[2].trimmed();
4762           QString value   = QStringList( data.mid(3) ).join( sectionSeparator );
4763           resourceMgr()->setValue( section, param, value );
4764         }
4765       }
4766       else if ( sMod ) {
4767         // received message for the module
4768         QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4769         sMod->message( msg );
4770       }
4771     }
4772   }
4773 }
4774
4775 /*!
4776   Internal method. 
4777   Returns all top level toolbars.
4778   Note : Result list contains only main window toolbars, not including toolbars from viewers.
4779 */
4780 QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
4781 {
4782   QList<QToolBar*> aResult;
4783   QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
4784   for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
4785     QToolBar* tb = *tit;    
4786     QObject* po = Qtx::findParent( tb, "QMainWindow" );
4787     if ( po != desktop() )
4788       continue; 
4789     if ( names.isEmpty() || names.contains( tb->objectName() ) )
4790       aResult.append(tb);
4791   }
4792   return aResult;
4793 }
4794
4795 /*!
4796   Internal method to parse toolbars and dockable windows state.
4797  */
4798 QByteArray LightApp_Application::processState(QByteArray& input, 
4799                                               const bool processWin, 
4800                                               const bool processTb, 
4801                                               const bool isRestoring, 
4802                                               QByteArray defaultState) {
4803
4804   QByteArray aRes;
4805   bool hasDefaultState  = !defaultState.isEmpty();
4806   bool isDockWinWriten = false;
4807   int nbDocWin = -1;
4808   //Write date from users settings
4809   if(isRestoring){
4810     QDataStream tmpInputData(&input, QIODevice::ReadOnly);
4811     int marker, version;
4812     uchar dockmarker;
4813     tmpInputData >> marker;
4814     tmpInputData >> version;
4815     tmpInputData >> dockmarker;
4816     tmpInputData >> nbDocWin;
4817   }  
4818   if(processWin && processTb && !isRestoring) {
4819     aRes = input;
4820   } else if(!processWin && !processTb ) {
4821     if(hasDefaultState)
4822       aRes = defaultState;
4823   } else {
4824     QDataStream aData(&aRes, QIODevice::WriteOnly);
4825     QList<QToolBar*> aToolBars = findToolBars();
4826
4827     QStringList aNames;
4828     for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) { 
4829       QToolBar* tb = *tit;
4830       aNames.append(tb->objectName());
4831     }
4832
4833     int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
4834     if(toolBarMarkerIndex < 0)
4835       return aRes;
4836     QDataStream anInputData(&input, QIODevice::ReadOnly);
4837
4838     int toolBarMarkerIndexDef;
4839     if(hasDefaultState) {
4840       toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
4841       if(toolBarMarkerIndexDef < 0)
4842         return aRes;      
4843     }
4844     QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
4845
4846     QDataStream* aTargetData = 0;
4847     int          aTargetIndex = -1;
4848
4849     QByteArray currentArr = desktop()->saveState();
4850     QDataStream anInputDataCur(&currentArr, QIODevice::ReadOnly);
4851     bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
4852     if(processWin && useInputData) {
4853       aTargetData = &anInputData;
4854       aTargetIndex = toolBarMarkerIndex;
4855     } else {
4856       //Write date from default settings
4857       if(hasDefaultState) {
4858         aTargetData = &anInputDataDef;
4859         aTargetIndex = toolBarMarkerIndexDef;
4860       } else {
4861         //If no default state, write current snapshot of the dockable windows
4862         if(isRestoring) {
4863           aTargetData = &anInputDataCur;
4864           int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
4865           aTargetIndex = toolBarMarkerIndexCur;
4866         }         
4867       }
4868     }
4869
4870     if(aTargetData && aTargetIndex >= 0 ) {
4871       aTargetData->device()->seek(0);
4872       while( aTargetData->device()->pos() < aTargetIndex ) {
4873         uchar ch;
4874         *aTargetData >> ch;
4875         aData<<ch;
4876       }
4877       isDockWinWriten = true;
4878     }
4879     
4880     aTargetData = 0;
4881     aTargetIndex = -1;
4882
4883     if(processTb) {
4884       aTargetData = &anInputData;
4885       aTargetIndex = toolBarMarkerIndex;
4886     } else {
4887       if(hasDefaultState) {
4888         aTargetData = &anInputDataDef;
4889         aTargetIndex = toolBarMarkerIndexDef;   
4890       }      
4891     }
4892
4893     if(aTargetData && aTargetIndex >= 0) {
4894       int index;
4895       if(!isDockWinWriten ) {
4896         //Write version marker
4897         int marker, version;
4898         aTargetData->device()->seek(0);
4899         *aTargetData >> marker;
4900         *aTargetData >> version;
4901         aData << marker;
4902         aData << version;
4903         aData << (uchar) QDockWidgetMarker;
4904         aData << (int) 0;
4905         int shift = 4*sizeof(int) + sizeof(QSize);
4906         index = aTargetIndex - shift;
4907       } else {
4908         index = aTargetIndex;
4909       }
4910       
4911       aTargetData->device()->seek(index);
4912       while(!aTargetData->atEnd()) {
4913         uchar ch;
4914         *aTargetData >> ch;
4915         aData << ch;
4916       }
4917     } else { // Not treat toolbars
4918       aData << (uchar) QToolBarMarker;
4919       aData << (int) 0; //Nb toolbars = 0
4920     }
4921   }
4922   return aRes;
4923 }
4924
4925 /*!
4926   \brief Emits operationFinished signal.
4927   \param theModuleName the name of the module which perfomed the operation
4928   \param theOperationName the operation name
4929   \param theEntryList the list of the created objects entries
4930 */
4931 void LightApp_Application::emitOperationFinished( const QString& theModuleName,
4932                                                   const QString& theOperationName,
4933                                                   const QStringList& theEntryList )
4934 {
4935   emit operationFinished( theModuleName, theOperationName, theEntryList );
4936 }
4937
4938 /*!
4939   Update visibility state of given objects
4940 */
4941 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
4942                                                   SUIT_ViewModel*  theViewModel )
4943 {
4944   if ( !theViewModel || theList.isEmpty() ) return;
4945
4946   LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4947   if ( !aStudy ) return;
4948
4949   SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
4950
4951   for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
4952     LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
4953
4954     if ( !obj || aStudy->isComponent( obj->entry() ) )
4955       continue;
4956
4957     LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
4958     if ( anObjModule ) {
4959       LightApp_Displayer* aDisplayer = anObjModule->displayer();
4960       if ( aDisplayer ) {
4961         Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
4962         if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
4963           if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
4964             anObjState = Qtx::ShownState;
4965           else
4966             anObjState = Qtx::HiddenState;
4967         }
4968         aStudy->setVisibilityState( obj->entry(), anObjState );
4969       }
4970     }
4971   }
4972 }
4973
4974 /*!
4975  * Called when window activated
4976  */
4977 void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
4978 {
4979   SUIT_DataBrowser* anOB = objectBrowser();
4980   if ( !anOB )
4981     return;
4982   SUIT_DataObject* rootObj = anOB->root();
4983   if ( !rootObj )
4984     return;
4985
4986   DataObjectList listObj = rootObj->children( true );
4987
4988   SUIT_ViewModel* vmod = 0;
4989   if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
4990     vmod = vman->getViewModel();
4991   updateVisibilityState( listObj, vmod );
4992 }
4993
4994 /*!
4995   Called then view manager removed
4996 */
4997 void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
4998 {
4999   ViewManagerList lst;
5000   viewManagers( lst );
5001   if ( lst.count() == 1) { // in case if closed last view window
5002     LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
5003     if ( aStudy )
5004       aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
5005   }
5006 }
5007
5008 /*!
5009   Check existing document.
5010 */
5011 bool LightApp_Application::checkExistingDoc()
5012 {
5013   bool result = true;
5014   if( activeStudy() ) {
5015     int answer = SUIT_MessageBox::question( desktop(), 
5016                                             tr( "APPCLOSE_CAPTION" ), 
5017                                             tr( "STUDYCLOSE_DESCRIPTION" ),
5018                                             tr( "APPCLOSE_SAVE" ), 
5019                                             tr( "APPCLOSE_CLOSE" ),
5020                                             tr( "APPCLOSE_CANCEL" ), 0 );
5021     if(answer == 0) {
5022       if ( activeStudy()->isSaved() ) {
5023         onSaveDoc();
5024         closeDoc( false );
5025       } else if ( onSaveAsDoc() ) {
5026         if( !closeDoc( false ) ) {
5027           result = false;
5028         }
5029       } else {
5030         result = false;
5031       } 
5032     }
5033     else if( answer == 1 ) {
5034       closeDoc( false );
5035     } else if( answer == 2 ) {
5036       result = false;
5037     }
5038   }
5039   return result;
5040 }
5041
5042 #ifndef DISABLE_PYCONSOLE
5043
5044 PyConsole_Interp* LightApp_Application::getPyInterp()
5045 {
5046   static PyConsole_Interp* myInterp = 0;
5047   if ( !myInterp )
5048     myInterp = createPyInterp();
5049   return myInterp;
5050 }
5051
5052 PyConsole_Interp* LightApp_Application::createPyInterp()
5053 {
5054   return new LightApp_PyInterp();
5055 }
5056
5057 #endif // DISABLE_PYCONSOLE