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