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