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