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