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