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