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