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