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