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