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