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