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