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