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