Salome HOME
0021883 [CEA 674] Deactivate pre-selection in OCC and VTK viewer
[modules/gui.git] / src / LightApp / LightApp_Application.cxx
1 // Copyright (C) 2007-2013  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.
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 WNT
28 // E.A. : On windows with python 2.6, there is a conflict
29 // E.A. : between pymath.h and Standard_math.h which define
30 // E.A. : some same symbols : acosh, asinh, ...
31   #include <Standard_math.hxx>
32   #ifndef DISABLE_PYCONSOLE
33     #include <pymath.h>
34   #endif
35 #endif
36
37 #ifndef DISABLE_PYCONSOLE
38   #include "LightApp_PyInterp.h" // WARNING! This include must be the first!
39   #include <PyConsole_Console.h>
40 #endif
41
42 #include "LightApp_Application.h"
43 #include "LightApp_Module.h"
44 #include "LightApp_DataModel.h"
45 #include "LightApp_Study.h"
46 #include "LightApp_Preferences.h"
47 #include "LightApp_PreferencesDlg.h"
48 #include "LightApp_ModuleDlg.h"
49 #include "LightApp_AboutDlg.h"
50 #include "LightApp_ModuleAction.h"
51 // temporary commented
52 //#include "LightApp_OBFilter.h"
53 #include "LightApp_EventFilter.h"
54 #include "LightApp_OBSelector.h"
55 #include "LightApp_SelectionMgr.h"
56 #include "LightApp_DataObject.h"
57 #include "LightApp_WgViewModel.h"
58 #include "LightApp_FullScreenHelper.h"
59
60
61 #include <GUI_version.h>
62 #include <Basics_OCCTVersion.hxx>
63
64 #include <SALOME_Event.h>
65
66 #include <Style_Salome.h>
67 #include <Style_PrefDlg.h>
68
69 #include <CAM_Module.h>
70 #include <CAM_DataModel.h>
71 #include <CAM_Study.h>
72 #include <STD_TabDesktop.h>
73
74 #include <SUIT_DataBrowser.h>
75 #include <SUIT_Session.h>
76 #include <SUIT_Study.h>
77 #include <SUIT_FileDlg.h>
78 #include <SUIT_ResourceMgr.h>
79 #include <SUIT_ShortcutMgr.h>
80 #include <SUIT_Tools.h>
81 #include <SUIT_Accel.h>
82 #include <SUIT_MessageBox.h>
83 #include <SUIT_ViewWindow.h>
84
85 #include <Qtx.h>
86 #include <QtxToolBar.h>
87 #include <QtxTreeView.h>
88 #include <QtxMRUAction.h>
89 #include <QtxDockAction.h>
90 #include <QtxDockWidget.h>
91 #include <QtxActionToolMgr.h>
92 #include <QtxSearchTool.h>
93 #include <QtxWorkstack.h>
94 #include <QtxMap.h>
95 #include <QtxWebBrowser.h>
96
97 #include <LogWindow.h>
98
99 #ifndef DISABLE_GLVIEWER
100   #include <GLViewer_Viewer.h>
101   #include <GLViewer_ViewManager.h>
102   #include "LightApp_GLSelector.h"
103 #endif
104
105 #ifndef DISABLE_PLOT2DVIEWER
106   #include <Plot2d_ViewManager.h>
107   #include <Plot2d_ViewModel.h>
108   #include <Plot2d_ViewWindow.h>
109   #include <Plot2d_ViewFrame.h>
110   #include "LightApp_Plot2dSelector.h"
111 #ifndef DISABLE_SALOMEOBJECT
112   #include <SPlot2d_ViewModel.h>
113 #else
114   #include <Plot2d_ViewModel.h>
115 #endif
116 #endif
117
118 #ifndef DISABLE_OCCVIEWER
119   #include <OCCViewer_ViewManager.h>
120   #include <OCCViewer_ViewFrame.h>
121 #ifndef DISABLE_SALOMEOBJECT
122   #include <SOCC_ViewModel.h>
123 #else
124   #include <OCCViewer_ViewModel.h>
125 #endif
126   #include "LightApp_OCCSelector.h"
127 #endif
128
129 #ifndef DISABLE_VTKVIEWER
130 #ifndef DISABLE_SALOMEOBJECT
131   #include <SVTK_ViewModel.h>
132   #include <SVTK_ViewManager.h>
133   #include "LightApp_VTKSelector.h"
134 #else
135   #include <VTKViewer_ViewModel.h>
136   #include <VTKViewer_ViewManager.h>
137 #endif
138   #include <VTKViewer_ViewModel.h>
139 #endif
140
141 //#ifndef DISABLE_SUPERVGRAPHVIEWER
142 //  #include <SUPERVGraph_ViewModel.h>
143 //  #include <SUPERVGraph_ViewFrame.h>
144 //  #include <SUPERVGraph_ViewManager.h>
145 //#endif
146
147 #ifndef DISABLE_QXGRAPHVIEWER
148 //VSR: QxGraph has been replaced by QxScene
149 //  #include <QxGraph_ViewModel.h>
150 //  #include <QxGraph_ViewWindow.h>
151 //  #include <QxGraph_ViewManager.h>
152   #include <QxScene_ViewManager.h>
153   #include <QxScene_ViewModel.h>
154   #include <QxScene_ViewWindow.h>
155 #endif
156
157
158 #define VISIBILITY_COLUMN_WIDTH 25
159
160 #include <QDir>
161 #include <QImage>
162 #include <QString>
163 #include <QWidget>
164 #include <QStringList>
165 #include <QFile>
166 #include <QApplication>
167 #include <QMap>
168 #include <QStatusBar>
169 #include <QThread>
170 #include <QObjectList>
171 #include <QComboBox>
172 #include <QInputDialog>
173 #include <QFontDatabase>
174 #include <QIcon>
175 #include <QByteArray>
176 #include <QMenu>
177 #include <QProcess>
178 #include <QTimer>
179 #include <QHeaderView>
180 #include <QTreeView>
181 #include <QMimeData>
182 #include <QShortcut>
183
184 #include <utilities.h>
185
186 #define FIRST_HELP_ID 1000000
187
188 #ifndef DISABLE_SALOMEOBJECT
189   #include <SALOME_InteractiveObject.hxx>
190   #include <SALOME_ListIO.hxx>
191 #endif
192
193 #include <Standard_Version.hxx>
194
195 #define ToolBarMarker    0
196 #define DockWidgetMarker 1
197
198 static const char* imageEmptyIcon[] = {
199 "20 20 1 1",
200 ".      c None",
201 "....................",
202 "....................",
203 "....................",
204 "....................",
205 "....................",
206 "....................",
207 "....................",
208 "....................",
209 "....................",
210 "....................",
211 "....................",
212 "....................",
213 "....................",
214 "....................",
215 "....................",
216 "....................",
217 "....................",
218 "....................",
219 "....................",
220 "...................."};
221
222 int LightApp_Application::lastStudyId = 0;
223
224 /*!
225   \return last global id of study
226 */
227 int LightApp_Application::studyId()
228 {
229   return LightApp_Application::lastStudyId;
230 }
231
232 /*!Create new instance of LightApp_Application.*/
233 extern "C" LIGHTAPP_EXPORT SUIT_Application* createApplication()
234 {
235   return new LightApp_Application();
236 }
237
238 /*! \var global preferences of LightApp */
239 LightApp_Preferences* LightApp_Application::_prefs_ = 0;
240
241
242 /*!
243   \class LightApp_Application
244   Application containing LightApp module
245 */
246
247 /*!Constructor.*/
248 LightApp_Application::LightApp_Application()
249 : CAM_Application( false ),
250   myPrefs( 0 ),
251   myScreenHelper(new LightApp_FullScreenHelper())
252 {
253   Q_INIT_RESOURCE( LightApp );
254
255   STD_TabDesktop* desk = new STD_TabDesktop();
256   desk->setFullScreenAllowed(false);
257   desk->setMinimizeAllowed(false);
258
259   setDesktop( desk );
260
261   // initialize auto save timer
262   myAutoSaveTimer = new QTimer( this );
263   myAutoSaveTimer->setSingleShot( true );
264   connect( myAutoSaveTimer, SIGNAL( timeout() ), this, SLOT( onSaveDoc() ) );
265
266   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
267   QPixmap aLogo = aResMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
268
269   QtxWebBrowser::setData("browser:icon",          aResMgr->loadPixmap( "LightApp", tr( "BROWSER_ICON" ) ) );
270   QtxWebBrowser::setData("browser:title",         tr( "BROWSER_TITLE" ) );
271   QtxWebBrowser::setData("toolbar:title",         tr( "BROWSER_TOOLBAR_TITLE" ) );
272   QtxWebBrowser::setData("menu:file:title",       tr( "BROWSER_FILEMENU" ) );
273   QtxWebBrowser::setData("action:close:title",    tr( "BROWSER_CLOSE" ) );
274   QtxWebBrowser::setData("action:close:icon",     aResMgr->loadPixmap( "LightApp", tr( "BROWSER_CLOSE_ICON" ) ) );
275   QtxWebBrowser::setData("action:back:title",     tr( "BROWSER_BACK" ) );
276   QtxWebBrowser::setData("action:forward:title",  tr( "BROWSER_FORWARD" ) );
277   QtxWebBrowser::setData("action:find:title",     tr( "BROWSER_FIND" ) );
278   QtxWebBrowser::setData("action:findnext:title", tr( "BROWSER_FINDNEXT" ) );
279   QtxWebBrowser::setData("action:findprev:title", tr( "BROWSER_FINDPREV" ) );
280
281   desktop()->setWindowIcon( aLogo );
282   desktop()->setDockableMenuBar( false );
283   desktop()->setDockableStatusBar( false );
284
285   // base logo (salome itself)
286   desktop()->logoInsert( "_app_base",  aResMgr->loadPixmap( "LightApp", tr( "APP_BASE_LOGO" ), false ) );
287   // extra logo (salome-based application)
288   desktop()->logoInsert( "_app_extra", aResMgr->loadPixmap( "LightApp", tr( "APP_EXTRA_LOGO" ), false ) );
289
290   clearViewManagers();
291
292   mySelMgr = new LightApp_SelectionMgr( this );
293
294   myAccel = SUIT_Accel::getAccel();
295
296 #ifndef DISABLE_OCCVIEWER
297   myAccel->setActionKey( SUIT_Accel::PanLeft,     Qt::CTRL+Qt::Key_Left,     OCCViewer_Viewer::Type() );
298   myAccel->setActionKey( SUIT_Accel::PanRight,    Qt::CTRL+Qt::Key_Right,    OCCViewer_Viewer::Type() );
299   myAccel->setActionKey( SUIT_Accel::PanUp,       Qt::CTRL+Qt::Key_Up,       OCCViewer_Viewer::Type() );
300   myAccel->setActionKey( SUIT_Accel::PanDown,     Qt::CTRL+Qt::Key_Down,     OCCViewer_Viewer::Type() );
301   myAccel->setActionKey( SUIT_Accel::ZoomIn,      Qt::CTRL+Qt::Key_Plus,     OCCViewer_Viewer::Type() );
302   myAccel->setActionKey( SUIT_Accel::ZoomOut,     Qt::CTRL+Qt::Key_Minus,    OCCViewer_Viewer::Type() );
303   myAccel->setActionKey( SUIT_Accel::ZoomFit,     Qt::CTRL+Qt::Key_Asterisk, OCCViewer_Viewer::Type() );
304   myAccel->setActionKey( SUIT_Accel::RotateLeft,  Qt::ALT+Qt::Key_Left,      OCCViewer_Viewer::Type() );
305   myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right,     OCCViewer_Viewer::Type() );
306   myAccel->setActionKey( SUIT_Accel::RotateUp,    Qt::ALT+Qt::Key_Up,        OCCViewer_Viewer::Type() );
307   myAccel->setActionKey( SUIT_Accel::RotateDown,  Qt::ALT+Qt::Key_Down,      OCCViewer_Viewer::Type() );
308 #endif
309 #ifndef DISABLE_VTKVIEWER
310   myAccel->setActionKey( SUIT_Accel::PanLeft,     Qt::CTRL+Qt::Key_Left,     VTKViewer_Viewer::Type() );
311   myAccel->setActionKey( SUIT_Accel::PanRight,    Qt::CTRL+Qt::Key_Right,    VTKViewer_Viewer::Type() );
312   myAccel->setActionKey( SUIT_Accel::PanUp,       Qt::CTRL+Qt::Key_Up,       VTKViewer_Viewer::Type() );
313   myAccel->setActionKey( SUIT_Accel::PanDown,     Qt::CTRL+Qt::Key_Down,     VTKViewer_Viewer::Type() );
314   myAccel->setActionKey( SUIT_Accel::ZoomIn,      Qt::CTRL+Qt::Key_Plus,     VTKViewer_Viewer::Type() );
315   myAccel->setActionKey( SUIT_Accel::ZoomOut,     Qt::CTRL+Qt::Key_Minus,    VTKViewer_Viewer::Type() );
316   myAccel->setActionKey( SUIT_Accel::ZoomFit,     Qt::CTRL+Qt::Key_Asterisk, VTKViewer_Viewer::Type() );
317   myAccel->setActionKey( SUIT_Accel::RotateLeft,  Qt::ALT+Qt::Key_Left,      VTKViewer_Viewer::Type() );
318   myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right,     VTKViewer_Viewer::Type() );
319   myAccel->setActionKey( SUIT_Accel::RotateUp,    Qt::ALT+Qt::Key_Up,        VTKViewer_Viewer::Type() );
320   myAccel->setActionKey( SUIT_Accel::RotateDown,  Qt::ALT+Qt::Key_Down,      VTKViewer_Viewer::Type() );
321 #endif
322 #ifndef DISABLE_PLOT2DVIEWER
323   myAccel->setActionKey( SUIT_Accel::PanLeft,     Qt::CTRL+Qt::Key_Left,     Plot2d_Viewer::Type() );
324   myAccel->setActionKey( SUIT_Accel::PanRight,    Qt::CTRL+Qt::Key_Right,    Plot2d_Viewer::Type() );
325   myAccel->setActionKey( SUIT_Accel::PanUp,       Qt::CTRL+Qt::Key_Up,       Plot2d_Viewer::Type() );
326   myAccel->setActionKey( SUIT_Accel::PanDown,     Qt::CTRL+Qt::Key_Down,     Plot2d_Viewer::Type() );
327   myAccel->setActionKey( SUIT_Accel::ZoomIn,      Qt::CTRL+Qt::Key_Plus,     Plot2d_Viewer::Type() );
328   myAccel->setActionKey( SUIT_Accel::ZoomOut,     Qt::CTRL+Qt::Key_Minus,    Plot2d_Viewer::Type() );
329   myAccel->setActionKey( SUIT_Accel::ZoomFit,     Qt::CTRL+Qt::Key_Asterisk, Plot2d_Viewer::Type() );
330 #endif
331
332   connect( mySelMgr, SIGNAL( selectionChanged() ), this, SLOT( onSelection() ) );
333
334   // Set existing font for the python console in resources
335   if( !aResMgr->hasValue( "PyConsole", "font" ) )
336     return;
337
338   QFont f = aResMgr->fontValue( "PyConsole", "font" );
339   QFontDatabase fdb;
340   QStringList famdb = fdb.families();
341
342   if ( famdb.contains(f.family()) || !aResMgr->hasValue( "PyConsole", "additional_families" ) )
343     return;
344
345   QStringList anAddFamilies = aResMgr->stringValue( "PyConsole", "additional_families" ).split( ";", QString::SkipEmptyParts );
346   QString aFamily;
347   for ( QStringList::Iterator it = anAddFamilies.begin(); it != anAddFamilies.end(); ++it )
348   {
349     aFamily = *it;
350     if ( famdb.contains(aFamily) )
351     {
352       f.setFamily( aFamily );
353       aResMgr->setValue( "PyConsole", "font", f );
354       break;
355     }
356   }
357 }
358
359 /*!Destructor.
360  *\li Save window geometry.
361  *\li Save desktop geometry.
362  *\li Save resource maneger.
363  *\li Delete selection manager.
364  */
365 LightApp_Application::~LightApp_Application()
366 {
367   delete mySelMgr;
368   delete myScreenHelper;
369 }
370
371 /*!Start application.*/
372 void LightApp_Application::start()
373 {
374   CAM_Application::start();
375
376   updateWindows();
377   updateViewManagers();
378
379   putInfo( "" );
380   desktop()->statusBar()->showMessage( "" );
381
382   LightApp_EventFilter::Init();
383 }
384
385 /*!Gets application name.*/
386 QString LightApp_Application::applicationName() const
387 {
388   static QString _app_name;
389   if ( _app_name.isEmpty() )
390     _app_name = tr( "APP_NAME" );
391   return _app_name;
392 }
393
394 /*!Gets application version.*/
395 QString LightApp_Application::applicationVersion() const
396 {
397   static QString _app_version;
398
399   if ( _app_version.isEmpty() )
400   {
401     QString resVersion = tr( "APP_VERSION" );
402     if ( resVersion != "APP_VERSION" )
403     {
404       _app_version = resVersion;
405     }
406     else
407     {
408       _app_version = GUI_VERSION_STR;
409     }
410   }
411   return _app_version;
412 }
413
414 /*!Load module by \a name.*/
415 CAM_Module* LightApp_Application::loadModule( const QString& name, const bool showMsg )
416 {
417   CAM_Module* mod = CAM_Application::loadModule( name, showMsg );
418   if ( mod )
419   {
420     connect( this, SIGNAL( studyOpened() ), mod, SLOT( onModelOpened() ) );
421     connect( this, SIGNAL( studySaved() ),  mod, SLOT( onModelSaved() ) );
422     connect( this, SIGNAL( studyClosed() ), mod, SLOT( onModelClosed() ) );
423   }
424   return mod;
425 }
426
427 /*!Activate module by \a modName*/
428 bool LightApp_Application::activateModule( const QString& modName )
429 {
430   QString actName;
431   CAM_Module* prevMod = activeModule();
432
433   if ( prevMod )
434     actName = prevMod->moduleName();
435
436   if ( actName == modName )
437     return true;
438
439   putInfo( tr( "ACTIVATING_MODULE" ).arg( modName ) );
440
441   saveDockWindowsState();
442
443   bool status = CAM_Application::activateModule( modName );
444
445   updateModuleActions();
446
447   putInfo( "" );
448
449   if ( !status )
450     return false;
451
452   updateWindows();
453   updateViewManagers();
454
455   return true;
456 }
457
458 /*!Gets selection manager.*/
459 LightApp_SelectionMgr* LightApp_Application::selectionMgr() const
460 {
461   return mySelMgr;
462 }
463
464 /*!Creat action "New window" for certain type of viewer:*/
465 void LightApp_Application::createActionForViewer( const int id,
466                                                   const int parentId,
467                                                   const QString& suffix,
468                                                   const int accel )
469 {
470   QString vtlt = tr( QString( "NEW_WINDOW_%1" ).arg( suffix ).toLatin1().constData() );
471   QString tip = tr( "CREATING_NEW_WINDOW" ).arg( vtlt.remove( "&" ) );
472   QAction* a = createAction( id,                      // menu action id
473                              tip,                     // status tip
474                              QIcon(),                 // icon
475                              vtlt,                    // menu text
476                              tip,                     // tooltip
477                              accel,                   // shortcut
478                              desktop(),               // parent
479                              false,                   // toggle flag
480                              this,                    // receiver
481                              SLOT( onNewWindow() ) ); // slot
482   createMenu( a, parentId, -1 );
483 }
484
485 /*!Create actions:*/
486
487 void LightApp_Application::createActions()
488 {
489   CAM_Application::createActions();
490
491   SUIT_Desktop* desk = desktop();
492   SUIT_ResourceMgr* resMgr = resourceMgr();
493
494   // Preferences
495   createAction( PreferencesId, tr( "TOT_DESK_PREFERENCES" ), QIcon(),
496                 tr( "MEN_DESK_PREFERENCES" ), tr( "PRP_DESK_PREFERENCES" ),
497                 Qt::CTRL+Qt::Key_R, desk, false, this, SLOT( onPreferences() ) );
498
499   // Help menu:
500
501   // - Help for modules
502
503   int helpMenu = createMenu( tr( "MEN_DESK_HELP" ), -1, -1, 1000 );
504   createMenu( separator(), helpMenu, -1, 10 );
505   QStringList aModuleList;
506   modules( aModuleList, false );
507   aModuleList.prepend( "GUI" );
508   aModuleList.prepend( "KERNEL" );
509
510   int id = LightApp_Application::UserID + FIRST_HELP_ID;
511
512   QString aModule;
513   foreach( aModule, aModuleList ) {
514     if ( aModule.isEmpty() )                                         // module title (user name)
515       continue;
516     IMap <QString, QString> helpData;                                // list of help files for the module
517     QString helpSubMenu;                                             // help submenu name (empty if not needed)
518     QString modName = moduleName( aModule );                         // module name
519     if ( modName.isEmpty() ) modName = aModule;                      // for KERNEL and GUI
520     QString rootDir = QString( "%1_ROOT_DIR" ).arg( modName );       // module root dir variable
521     QString modDir  = getenv( rootDir.toLatin1().constData() );      // module root dir
522     QString docSection;
523     if (resMgr->hasValue( modName, "documentation" ) )
524       docSection = resMgr->stringValue(modName, "documentation");
525     else if ( resMgr->hasSection( modName + "_documentation" ) )
526       docSection = modName + "_documentation";
527     if ( !docSection.isEmpty() ) {
528       helpSubMenu = resMgr->stringValue( docSection, "sub_menu", "" ).arg( aModule );
529       QStringList listOfParam = resMgr->parameters( docSection );
530       foreach( QString paramName, listOfParam ) {
531         QString valueStr = resMgr->stringValue( docSection, paramName );
532         if ( !valueStr.isEmpty() ) {
533           QFileInfo fi( valueStr );
534           if ( fi.isRelative() && !modDir.isEmpty() )
535             valueStr = Qtx::addSlash( modDir ) + valueStr;
536           if ( QFile::exists( valueStr ) )
537             helpData.insert( paramName.arg( aModule ), valueStr );
538         }
539       }
540     }
541
542     if ( helpData.isEmpty() && !modDir.isEmpty() ) {
543       QStringList idxLst = QStringList() << modDir << "share" << "doc" << "salome" << "gui" << modName << "index.html";
544       QString indexFile = idxLst.join( QDir::separator() );          // index file
545       if ( QFile::exists( indexFile ) )
546         helpData.insert( tr( "%1 module Users's Guide" ).arg( aModule ), indexFile );
547     }
548
549     IMapConstIterator<QString, QString > fileIt;
550     for ( fileIt = helpData.begin(); fileIt != helpData.end(); fileIt++ ) {
551       QString helpFileName = fileIt.key();
552       // remove all '//' occurances 
553       while ( helpFileName.contains( "//" ) )
554         helpFileName.replace( "//", "" );
555       // obtain submenus hierarchy if given
556       QStringList smenus = helpFileName.split( "/" );
557       helpFileName = smenus.last();
558       smenus.removeLast();
559       QAction* a = createAction( id, helpFileName,
560                                  resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
561                                  helpFileName, helpFileName,
562                                  0, desk, false, this, SLOT( onHelpContentsModule() ) );
563       a->setData( fileIt.value() );
564       if ( !helpSubMenu.isEmpty() ) {
565         smenus.prepend( helpSubMenu );
566       }
567       // create sub-menus hierarchy
568       int menuId = helpMenu;
569       foreach ( QString subMenu, smenus ) {
570         menuId = createMenu( subMenu, menuId, -1, 0 );
571       }
572       createMenu( a, menuId, -1, 0 );
573       id++;
574     }
575   }
576
577   // - Additional help items
578
579   QStringList addHelpItems = resMgr->parameters( "add_help" );
580   foreach ( QString addHelpItem, addHelpItems ) {
581     QString valueStr = resMgr->stringValue( "add_help", addHelpItem );
582     if ( !valueStr.isEmpty() && QFile::exists( valueStr ) ) {
583       QAction* a = createAction( id, addHelpItem,
584                                  resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
585                                  addHelpItem, addHelpItem,
586                                  0, desk, false, this, SLOT( onHelpContentsModule() ) );
587       a->setData( valueStr );
588       createMenu( a, helpMenu, -1, 5 );
589       id++;
590     }
591   }
592   createMenu( separator(), helpMenu, -1, 5 );
593
594   //! MRU
595   static QtxMRUAction* mru = new QtxMRUAction( tr( "TOT_DESK_MRU" ), tr( "MEN_DESK_MRU" ), 0 );
596   connect( mru, SIGNAL( activated( const QString& ) ), this, SLOT( onMRUActivated( const QString& ) ) );
597   registerAction( MRUId, mru );
598
599   // default icon for neutral point ('SALOME' module)
600   QPixmap defIcon = resMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
601   if ( defIcon.isNull() )
602     defIcon = QPixmap( imageEmptyIcon );
603
604   //! default icon for any module
605   QPixmap modIcon = resMgr->loadPixmap( "LightApp", tr( "APP_MODULE_ICO" ), false );
606   if ( modIcon.isNull() )
607     modIcon = QPixmap( imageEmptyIcon );
608
609   QStringList modList;
610   modules( modList, false );
611
612   if ( modList.count() > 1 )
613   {
614     LightApp_ModuleAction* moduleAction =
615       new LightApp_ModuleAction( tr( "APP_NAME" ), defIcon, desk );
616
617     QMap<QString, QString> iconMap;
618     moduleIconNames( iconMap );
619
620     const int iconSize = 20;
621
622     QStringList::Iterator it;
623     for ( it = modList.begin(); it != modList.end(); ++it )
624     {
625       if ( !isLibExists( *it ) )
626         continue;
627
628       QString modName = moduleName( *it );
629
630       if ( !isModuleAccessible( *it ) )
631         continue;
632
633       QString iconName;
634       if ( iconMap.contains( *it ) )
635         iconName = iconMap[*it];
636
637       QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
638       if ( icon.isNull() )
639       {
640         icon = modIcon;
641         INFOS ( "****************************************************************" << std::endl
642                 <<  "*    Icon for " << (*it).toLatin1().constData()
643                 << " not found. Using the default one." << std::endl
644                 << "****************************************************************" << std::endl );
645       }
646
647       icon = Qtx::scaleIcon( icon, iconSize );
648
649       moduleAction->insertModule( *it, icon );
650     }
651
652     connect( moduleAction, SIGNAL( moduleActivated( const QString& ) ),
653              this, SLOT( onModuleActivation( const QString& ) ) );
654     registerAction( ModulesListId, moduleAction );
655   }
656
657   // New window
658   int windowMenu = createMenu( tr( "MEN_DESK_WINDOW" ), -1, MenuWindowId, 100 );
659   int newWinMenu = createMenu( tr( "MEN_DESK_NEWWINDOW" ), windowMenu, -1, 0 );
660
661   createAction( CloseId, tr( "TOT_CLOSE" ), QIcon(), tr( "MEN_DESK_CLOSE" ), tr( "PRP_CLOSE" ),
662                 Qt::CTRL+Qt::Key_F4, desk, false, this, SLOT( onCloseWindow() ) );
663   createAction( CloseAllId, tr( "TOT_CLOSE_ALL" ), QIcon(), tr( "MEN_DESK_CLOSE_ALL" ), tr( "PRP_CLOSE_ALL" ),
664                 0, desk, false, this, SLOT( onCloseAllWindow() ) );
665   createAction( GroupAllId, tr( "TOT_GROUP_ALL" ), QIcon(), tr( "MEN_DESK_GROUP_ALL" ), tr( "PRP_GROUP_ALL" ),
666                 0, desk, false, this, SLOT( onGroupAllWindow() ) );
667
668   createMenu( CloseId,     windowMenu, 0, -1 );
669   createMenu( CloseAllId,  windowMenu, 0, -1 );
670   createMenu( GroupAllId,  windowMenu, 0, -1 );
671   createMenu( separator(), windowMenu, -1, 0 );
672
673 #ifndef DISABLE_GLVIEWER
674   createActionForViewer( NewGLViewId, newWinMenu, QString::number( 0 ), Qt::ALT+Qt::Key_G );
675 #endif
676 #ifndef DISABLE_PLOT2DVIEWER
677   createActionForViewer( NewPlot2dId, newWinMenu, QString::number( 1 ), Qt::ALT+Qt::Key_P );
678 #endif
679 #ifndef DISABLE_OCCVIEWER
680   createActionForViewer( NewOCCViewId, newWinMenu, QString::number( 2 ), Qt::ALT+Qt::Key_O );
681 #endif
682 #ifndef DISABLE_VTKVIEWER
683   createActionForViewer( NewVTKViewId, newWinMenu, QString::number( 3 ), Qt::ALT+Qt::Key_K );
684 #endif
685 #ifndef DISABLE_QXGRAPHVIEWER
686 //VSR: QxGraph has been replaced by QxScene
687 //  createActionForViewer( NewQxGraphViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_C );
688   createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S );
689 #endif
690
691   createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
692                 Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
693   createMenu( RenameId, windowMenu, -1 );
694
695   int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 );
696   createMenu( PreferencesId, fileMenu, 50, -1 );
697   createMenu( separator(), fileMenu, -1, 50, -1 );
698
699   createMenu( separator(), fileMenu, -1, 100, -1 );
700   createMenu( MRUId, fileMenu, 100, -1 );
701   createMenu( separator(), fileMenu, -1, 100, -1 );
702
703   createAction( StyleId, tr( "TOT_THEME" ), QIcon(), tr( "MEN_DESK_THEME" ), tr( "PRP_THEME" ),
704                 0, desk, false, this, SLOT( onStylePreferences() ) );
705
706   createAction( FullScreenId, tr( "TOT_FULLSCREEN" ), QIcon(), tr( "MEN_DESK_FULLSCREEN" ), tr( "PRP_FULLSCREEN" ),
707                 Qt::Key_F11, desk, false, this, SLOT( onFullScreen() ) );
708
709
710   int viewMenu = createMenu( tr( "MEN_DESK_VIEW" ), -1 );
711   createMenu( separator(), viewMenu, -1, 20, -1 );
712   createMenu( StyleId, viewMenu, 20, -1 );
713   createMenu( FullScreenId, viewMenu, 20, -1 );
714
715   int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ) );
716   createTool( ModulesListId, modTBar );
717 }
718
719 /*!On module activation action.*/
720 void LightApp_Application::onModuleActivation( const QString& modName )
721 {
722   // Force user to create/open a study before module activation
723   QMap<QString, QString> iconMap;
724   moduleIconNames( iconMap );
725   QPixmap icon = resourceMgr()->loadPixmap( moduleName( modName ), iconMap[ modName ], false );
726   if ( icon.isNull() )
727     icon = resourceMgr()->loadPixmap( "LightApp", tr( "APP_MODULE_BIG_ICO" ), false ); // default icon for any module
728
729   bool cancelled = false;
730
731   while ( !modName.isEmpty() && !activeStudy() && !cancelled ){
732     LightApp_ModuleDlg aDlg( desktop(), modName, icon );
733     QMap<int, QString> opmap = activateModuleActions();
734     for ( QMap<int, QString>::ConstIterator it = opmap.begin(); it != opmap.end(); ++it )
735       aDlg.addButton( it.value(), it.key() );
736
737     int res = aDlg.exec();
738     if ( res ) {
739       // some operation is selected
740       moduleActionSelected( res );
741     }
742     else {
743       // cancelled
744       putInfo( tr("INF_CANCELLED") );
745
746       LightApp_ModuleAction* moduleAction =
747         qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
748       if ( moduleAction )
749         moduleAction->setActiveModule( QString() );
750       cancelled = true;
751     }
752   }
753
754   if ( !cancelled )
755     activateModule( modName );
756 }
757
758 /*!Default module activation.*/
759 QString LightApp_Application::defaultModule() const
760 {
761   QStringList aModuleNames;
762   modules( aModuleNames, false ); // obtain a complete list of module names for the current configuration
763   //! If there's the one and only module --> activate it automatically
764   //! TODO: Possible improvement - default module can be taken from preferences
765   return aModuleNames.count() > 1 ? "" : ( aModuleNames.count() ? aModuleNames.first() : "" );
766 }
767
768 /*!On new window slot.*/
769 void LightApp_Application::onNewWindow()
770 {
771   const QObject* obj = sender();
772   if ( !obj || !obj->inherits( "QAction" ) )
773     return;
774
775   QString type;
776   int id = actionId( (QAction*)obj );
777   switch ( id )
778   {
779 #ifndef DISABLE_GLVIEWER
780   case NewGLViewId:
781     type = GLViewer_Viewer::Type();
782     break;
783 #endif
784 #ifndef DISABLE_PLOT2DVIEWER
785   case NewPlot2dId:
786     type = Plot2d_Viewer::Type();
787     break;
788 #endif
789 #ifndef DISABLE_OCCVIEWER
790   case NewOCCViewId:
791     type = OCCViewer_Viewer::Type();
792     break;
793 #endif
794 #ifndef DISABLE_VTKVIEWER
795   case NewVTKViewId:
796     type = VTKViewer_Viewer::Type();
797     break;
798 #endif
799 #ifndef DISABLE_QXGRAPHVIEWER
800 //VSR: QxGraph has been replaced by QxScene
801 //  case NewQxGraphViewId:
802 //    type = QxGraph_Viewer::Type();
803 //    break;
804   case NewQxSceneViewId:
805     type = QxScene_Viewer::Type();
806     break;
807 #endif
808   }
809
810   if ( !type.isEmpty() )
811     createViewManager( type );
812 }
813
814 /*!
815   SLOT: Creates new document
816 */
817 void LightApp_Application::onNewDoc()
818 {
819   //asl: fix for 0020515
820   if ( activeStudy() )
821     saveDockWindowsState();
822
823   CAM_Application::onNewDoc();
824 }
825
826 /*!
827   SLOT: Opens new document
828 */
829 void LightApp_Application::onOpenDoc()
830 {
831   SUIT_Study* study = activeStudy();
832   saveDockWindowsState();
833
834   CAM_Application::onOpenDoc();
835
836   if ( !study ) // new study will be create in THIS application
837   {
838     updateWindows();
839     updateViewManagers();
840   }
841 }
842
843 /*!
844   SLOT: Opens new document.
845   \param aName - name of file
846 */
847 bool LightApp_Application::onOpenDoc( const QString& aName )
848 {
849   // We should take mru action first because this application instance can be deleted later.
850   QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
851
852   bool res = CAM_Application::onOpenDoc( aName );
853
854   if ( mru )
855   {
856     if ( res )
857       mru->insert( aName );
858     else
859       mru->remove( aName );
860   }
861   return res;
862 }
863
864 /*!
865   SLOT: Displays "About" message box
866 */
867 void LightApp_Application::onHelpAbout()
868 {
869   LightApp_AboutDlg dlg( applicationName(), applicationVersion(), desktop() );
870   dlg.exec();
871 }
872
873 /*!
874   Private SLOT: Called on selection is changed
875   Dispatchs active module that selection is changed
876 */
877 void LightApp_Application::onSelection()
878 {
879   onSelectionChanged();
880
881   if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
882     ((LightApp_Module*)activeModule())->selectionChanged();
883 }
884
885 /*!
886   Sets active study.
887  \param study - SUIT_Study.
888 */
889 void LightApp_Application::setActiveStudy( SUIT_Study* study )
890 {
891   CAM_Application::setActiveStudy( study );
892 }
893
894 /*!
895   Enables/Disables menu items and toolbar buttons. Rebuild menu
896 */
897 void LightApp_Application::updateCommandsStatus()
898 {
899   CAM_Application::updateCommandsStatus();
900   QAction* a = 0;
901
902 #ifndef DISABLE_GLVIEWER
903   a = action( NewGLViewId );
904   if( a )
905     a->setEnabled( activeStudy() );
906 #endif
907
908 #ifndef DISABLE_PLOT2DVIEWER
909   a = action( NewPlot2dId );
910   if( a )
911     a->setEnabled( activeStudy() );
912 #endif
913
914 #ifndef DISABLE_OCCVIEWER
915   a = action( NewOCCViewId );
916   if( a )
917     a->setEnabled( activeStudy() );
918 #endif
919
920 #ifndef DISABLE_VTKVIEWER
921   a = action( NewVTKViewId );
922   if( a )
923     a->setEnabled( activeStudy() );
924 #endif
925
926 #ifndef DISABLE_QXGRAPHVIEWER
927 //VSR: QxGraph has been replaced by QxScene
928 //  a = action( NewQxGraphViewId );
929   a = action( NewQxSceneViewId );
930   if( a )
931     a->setEnabled( activeStudy() );
932 #endif
933 }
934
935 /*!
936   \class RunBrowser
937   Runs system command in separate thread
938 */
939 class RunBrowser: public QThread
940 {
941 public:
942   RunBrowser( LightApp_Application* app,
943               const QString&        theApp,
944               const QString&        theParams,
945               const QString&        theHelpFile,
946               const QString&        theContext = QString() )
947     : myApp( theApp ),
948       myParams( theParams ),
949       myContext( theContext ),
950       myStatus(0),
951       myLApp( app )
952   {
953     //For the external browser always specify 'file://' protocol,
954     //because some WEB browsers (for example Mozilla Firefox) can't open local file without protocol.
955     myHelpFile = QString("file://%1").arg( QFileInfo( theHelpFile ).canonicalFilePath() );
956   }
957
958   virtual void run()
959   {
960     if ( !myApp.isEmpty() && !myHelpFile.isEmpty()) {
961       QString aCommand = QString( "%1 %2 \"%3%4\"" ).arg( myApp, myParams, myHelpFile, myContext.isEmpty() ? QString("") : QString( "#%1" ).arg( myContext ) );
962
963       QProcess* proc = new QProcess();
964
965       proc->start( aCommand );
966       if ( !proc->waitForStarted() ) {
967         SALOME_CustomEvent* ce2000 = new SALOME_CustomEvent( 2000 );
968         QString* msg = new QString( QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).arg( myApp, myHelpFile ) );
969         ce2000->setData( msg );
970         QApplication::postEvent( myLApp, ce2000 );
971       }
972     }
973   }
974
975 private:
976   QString               myApp;
977   QString               myParams;
978   QString               myHelpFile;
979   QString               myContext;
980   int                   myStatus;
981   LightApp_Application* myLApp;
982 };
983
984 /*!
985   SLOT: Displays help contents for choosen module
986 */
987 void LightApp_Application::onHelpContentsModule()
988 {
989   const QAction* a = (QAction*) sender();
990   QString helpFile = a->data().toString();
991   if ( helpFile.isEmpty() ) return;
992
993   SUIT_ResourceMgr* resMgr = resourceMgr();
994   QString platform;
995 #ifdef WIN32
996   platform = "winapplication";
997 #else
998   platform = "application";
999 #endif
1000   QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1001 #ifdef WIN32
1002   QString quote("\"");
1003   anApp.prepend( quote );
1004   anApp.append( quote );
1005 #endif
1006   QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1007   bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1008
1009   if( useExtBrowser ) {
1010     if ( !anApp.isEmpty() ) {
1011       RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile );
1012       rs->start();
1013     }
1014     else {
1015       if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1016                                       SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1017                                       SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1018
1019         showPreferences( tr( "PREF_APP" ) );
1020     }
1021   }
1022   else {
1023 #ifdef WIN32
1024     // On Win32 platform QWebKit of the Qt 4.6.3 hang up in case 'file://' protocol 
1025     // is defined. On Linux platform QWebKit doesn't work correctly without 'file://' protocol.
1026     QtxWebBrowser::loadUrl(helpFile);
1027 #else
1028         QtxWebBrowser::loadUrl(QString("file://%1").arg(helpFile));
1029 #endif
1030   }
1031 }
1032
1033 /*!
1034   SLOT: Displays help contents for choosen dialog
1035 */
1036 void LightApp_Application::onHelpContextModule( const QString& theComponentName,
1037                                                 const QString& theFileName,
1038                                                 const QString& theContext )
1039 {
1040   QString fileName = theFileName;
1041   QString context  = theContext;
1042   if ( !QFile::exists( fileName ) && theContext.isEmpty() ) {
1043     // context might be passed within theFileName argument
1044     QStringList comps = fileName.split("#");
1045     if ( comps.count() > 1 ) {
1046       context = comps.last();
1047       comps.removeLast();
1048       fileName = comps.join("#");
1049     }
1050   }
1051
1052   QString homeDir = "";
1053   if ( !theComponentName.isEmpty() ) {
1054     QString dir = getenv( ( theComponentName + "_ROOT_DIR" ).toLatin1().constData() );
1055     if ( !dir.isEmpty() )
1056       homeDir = Qtx::addSlash( Qtx::addSlash( dir )      +
1057                                Qtx::addSlash( "share" )  +
1058                                Qtx::addSlash( "doc" )    +
1059                                Qtx::addSlash( "salome" ) +
1060                                Qtx::addSlash( "gui" )    +
1061                                Qtx::addSlash( theComponentName ) );
1062   }
1063
1064   QString helpFile = QFileInfo( homeDir + fileName ).absoluteFilePath();
1065   SUIT_ResourceMgr* resMgr = resourceMgr();
1066         QString platform;
1067 #ifdef WIN32
1068         platform = "winapplication";
1069 #else
1070         platform = "application";
1071 #endif
1072         QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1073 #ifdef WIN32
1074         QString quote("\"");
1075         anApp.prepend( quote );
1076         anApp.append( quote );
1077 #endif
1078
1079   bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1080
1081   if(useExtBrowser) {
1082     QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1083
1084     if ( !anApp.isEmpty() ) {
1085       RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile, context );
1086       rs->start();
1087     }
1088     else {
1089       if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1090                                       SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1091                                       SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1092         showPreferences( tr( "PREF_APP" ) );
1093     }
1094   }
1095   else {
1096 #ifdef WIN32
1097     // On Win32 platform QWebKit of the Qt 4.6.3 hang up in case 'file://' protocol 
1098     // is defined. On Linux platform QWebKit doesn't work correctly without 'file://' protocol.
1099         QtxWebBrowser::loadUrl(helpFile, context);
1100 #else
1101         QtxWebBrowser::loadUrl(QString("file://%1").arg(helpFile),context);
1102 #endif
1103     
1104   }
1105 }
1106
1107 /*!
1108   Sets enable or disable some actions on selection changed.
1109 */
1110 void LightApp_Application::onSelectionChanged()
1111 {
1112   LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
1113   bool canCopy  = m ? m->canCopy() : false;
1114   bool canPaste = m ? m->canPaste() : false;
1115
1116   action( EditCopyId )->setEnabled(canCopy);
1117   action( EditPasteId )->setEnabled(canPaste);
1118 }
1119
1120 /*!
1121   Adds window to application.
1122   \param wid - QWidget
1123   \param flag - key for window
1124   \param studyId - study id
1125   Flag used how identificator of window in windows list.
1126 */
1127 /*
1128 void LightApp_Application::addWindow( QWidget* wid, const int flag, const int studyId )
1129 {
1130   if ( !wid )
1131     return;
1132
1133   int sId = studyId;
1134   if ( sId < 0 )
1135   {
1136     if ( !activeStudy() )
1137       return;
1138     else
1139       sId = activeStudy()->id();
1140   }
1141
1142   if ( !myWindows.contains( flag ) )
1143   {
1144     QMap<int, int> winMap;
1145     currentWindows( winMap );
1146
1147     LightApp_WidgetContainer* newWC = new LightApp_WidgetContainer( flag, desktop() );
1148     connect( newWC, SIGNAL(  destroyed ( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1149     // asv: connecting a slot for storing visibility flag of a window
1150     connect( newWC, SIGNAL( visibilityChanged ( bool ) ), SLOT( onVisibilityChanged( bool ) ) );
1151     myWindows.insert( flag, newWC );
1152     if ( winMap.contains( flag ) ) {
1153       //desktop()->removeDockWidget( myWindows[flag] );
1154       desktop()->addDockWidget( (Qt::DockWidgetArea)winMap[flag], myWindows[flag] );
1155     }
1156
1157     //myWindows[flag]->setResizeEnabled( true );
1158     myWindows[flag]->setFeatures( QDockWidget::AllDockWidgetFeatures );
1159     myWindows[flag]->setObjectName( QString( "dock_window_%1" ).arg( flag ) );
1160     //myWindows[flag]->setFixedExtentWidth( wid->width() );
1161     //myWindows[flag]->setFixedExtentHeight( wid->height() );
1162     myWindows[flag]->resize( wid->width(), wid->height() );
1163   }
1164
1165   QFont f;
1166 #ifndef DISABLE_PYCONSOLE
1167   if( wid->inherits( "PyConsole_Console" ) )
1168   {
1169     if( resourceMgr()->hasValue( "PyConsole", "font" ) )
1170       f = resourceMgr()->fontValue( "PyConsole", "font" );
1171     else
1172       {
1173         f = ( ( PyConsole_Console* )wid )->font();
1174         resourceMgr()->setValue( "PyConsole", "font", f );
1175       }
1176   }
1177   else
1178 #endif
1179     f = wid->font();
1180
1181   myWindows[flag]->insert( sId, wid );
1182   wid->setFont( f );
1183
1184   setWindowShown( flag, !myWindows[flag]->isEmpty() );
1185 }
1186 */
1187
1188 QWidget* LightApp_Application::dockWindow( const int id ) const
1189 {
1190   QWidget* wid = 0;
1191   if ( myWin.contains( id ) )
1192     wid = myWin[id];
1193   return wid;
1194 }
1195
1196 QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
1197 {
1198   if ( !wid )
1199     return 0;
1200
1201   QDockWidget* dock = 0;
1202   QWidget* w = wid->parentWidget();
1203   while ( w && !dock )
1204   {
1205     dock = ::qobject_cast<QDockWidget*>( w );
1206     w = w->parentWidget();
1207   }
1208   return dock;
1209 }
1210
1211 void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
1212 {
1213   if ( !wid )
1214     return;
1215
1216   if ( wid != dockWindow( id ) )
1217     removeDockWindow( id );
1218
1219   myWin.insert( id, wid );
1220
1221   QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
1222   connect( dock, SIGNAL(  destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1223
1224   dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
1225   dock->setObjectName( QString( "window_%1" ).arg( id ) );
1226   dock->setWidget( wid );
1227
1228   QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
1229   if ( !accel.isEmpty() )
1230     dock->toggleViewAction()->setShortcut( accel );
1231
1232   dock->show();
1233 }
1234
1235 void LightApp_Application::removeDockWindow( const int id )
1236 {
1237   QWidget* wid = dockWindow( id );
1238   if ( !wid )
1239     return;
1240
1241   myWin.remove( id );
1242
1243   QDockWidget* dock = windowDock( wid );
1244   if ( !dock )
1245     return;
1246
1247   dock->setWidget( 0 );
1248   wid->setParent( 0 );
1249   wid->setVisible( false );
1250   delete dock;
1251 }
1252
1253 void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
1254 {
1255   QDockWidget* dock = windowDock( dockWindow( id ) );
1256   if ( dock && desktop() ) {
1257     desktop()->addDockWidget( place, dock );
1258     QtxDockAction* a = qobject_cast<QtxDockAction*>( action( ViewWindowsId ) );
1259     if ( a ) a->update();
1260   }
1261 }
1262
1263 /*!
1264   Gets window.
1265   \param flag - key for window
1266   \param studyId - study id
1267   Flag used how identificator of window in windows list.
1268 */
1269 QWidget* LightApp_Application::getWindow( const int flag, const int )
1270 {
1271   QWidget* wid = dockWindow( flag );
1272   if ( !wid )
1273     insertDockWindow( flag, wid = createWindow( flag ) );
1274
1275   QMap<int, int> winMap;
1276   currentWindows( winMap );
1277   if ( winMap.contains( flag ) )
1278     placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
1279
1280   return wid;
1281 }
1282
1283 /*!
1284   \return Object Browser
1285 */
1286 SUIT_DataBrowser* LightApp_Application::objectBrowser()
1287 {
1288   return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
1289 }
1290
1291 /*!
1292   \return Log Window
1293 */
1294 LogWindow* LightApp_Application::logWindow()
1295 {
1296   return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
1297 }
1298
1299 #ifndef DISABLE_PYCONSOLE
1300 /*!
1301   This returns the python console integrated to the GUI. Depending
1302   when you request the python console, this function could return
1303   null. Then the optional parameter force (default to false) can be
1304   set to force the creation of the python console if it is not done
1305   already. 
1306   \param force - if true, the pythonConsole is created if it does not exist yet
1307   \return Python Console
1308 */
1309 PyConsole_Console* LightApp_Application::pythonConsole(const bool force)
1310 {
1311   QWidget* wid = dockWindow( WT_PyConsole );
1312   if ( !wid && force==true) {
1313     wid = getWindow(WT_PyConsole);
1314   }
1315   return qobject_cast<PyConsole_Console*>( wid );
1316 }
1317 #endif
1318
1319 /*!
1320   Updates object browser and maybe data models
1321   \param updateModels - if it is true, then data models are updated
1322 */
1323 void LightApp_Application::updateObjectBrowser( const bool updateModels )
1324 {
1325   // update existing data models
1326   if ( updateModels )
1327   {
1328     const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
1329     if ( objectBrowser() )
1330       objectBrowser()->setAutoUpdate( false );
1331
1332     LightApp_Study* study = dynamic_cast<LightApp_Study*>(activeStudy());
1333     if ( study ) {
1334       CAM_Study::ModelList dm_list;
1335       study->dataModels( dm_list );
1336       QListIterator<CAM_DataModel*> it( dm_list );
1337       while ( it.hasNext() ) {
1338         CAM_DataModel* camDM = it.next();
1339         if ( camDM && camDM->inherits( "LightApp_DataModel" ) )
1340           ((LightApp_DataModel*)camDM)->update();
1341       }
1342     }
1343
1344     if( objectBrowser() )
1345       objectBrowser()->setAutoUpdate( isAutoUpdate );
1346   }
1347
1348   if ( objectBrowser() ) {
1349     objectBrowser()->updateGeometry();
1350     objectBrowser()->updateTree( 0, false );
1351   }
1352 }
1353
1354 /*!
1355   \return preferences
1356 */
1357 LightApp_Preferences* LightApp_Application::preferences() const
1358 {
1359   return preferences( false );
1360 }
1361
1362 /*!
1363   \return first view manager of some type
1364   \param vmType - type of view manager
1365   \param create - is it necessary to create view manager in case, when there is no manager of such type
1366 */
1367 SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, const bool create )
1368 {
1369   SUIT_ViewManager* aVM = viewManager( vmType );
1370   SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
1371
1372   if ( anActiveVM && anActiveVM->getType() == vmType )
1373     aVM = anActiveVM;
1374
1375   if ( aVM && create )
1376   {
1377     if ( !aVM->getActiveView() )
1378       aVM->createView();
1379     else
1380       aVM->getActiveView()->setFocus();
1381   }
1382   else if ( create )
1383     aVM = createViewManager( vmType );
1384
1385   return aVM;
1386 }
1387
1388 /*!
1389   Creates view manager of some type
1390   \param vmType - type of view manager
1391 */
1392 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType )
1393 {
1394   SUIT_ResourceMgr* resMgr = resourceMgr();
1395
1396   SUIT_ViewManager* viewMgr = 0;
1397 #ifndef DISABLE_GLVIEWER
1398   if( vmType == GLViewer_Viewer::Type() )
1399   {
1400     viewMgr = new GLViewer_ViewManager( activeStudy(), desktop() );
1401     new LightApp_GLSelector( (GLViewer_Viewer2d*)viewMgr->getViewModel(), mySelMgr );
1402   }
1403 #endif
1404 #ifndef DISABLE_PLOT2DVIEWER
1405   if( vmType == Plot2d_Viewer::Type() )
1406   {
1407     viewMgr = new Plot2d_ViewManager( activeStudy(), desktop() );
1408     Plot2d_Viewer* vm;
1409 #ifndef DISABLE_SALOMEOBJECT
1410     SPlot2d_Viewer* v = new SPlot2d_Viewer();
1411     vm = v;
1412     new LightApp_Plot2dSelector( v, mySelMgr );
1413 #else
1414     vm = new Plot2d_Viewer();
1415 #endif
1416     viewMgr->setViewModel( vm  );// custom view model, which extends SALOME_View interface
1417     Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
1418     if( wnd )
1419     {
1420       Plot2d_ViewFrame* frame = wnd->getViewFrame();
1421       frame->setBackgroundColor( resMgr->colorValue( "Plot2d", "Background", frame->backgroundColor() ) );
1422     }
1423   }
1424 #endif
1425   //#ifndef DISABLE_SUPERVGRAPHVIEWER
1426   //  if( vmType == SUPERVGraph_Viewer::Type() )
1427   //  {
1428   //    viewMgr = new SUPERVGraph_ViewManager( activeStudy(), desktop(), new SUPERVGraph_Viewer() );
1429   //  }
1430   //#endif
1431 #ifndef DISABLE_QXGRAPHVIEWER
1432 //VSR: QxGraph has been replaced by QxScene
1433 //  if( vmType == QxGraph_Viewer::Type() )
1434 //    {
1435 //      viewMgr = new QxGraph_ViewManager( activeStudy(), desktop(), new QxGraph_Viewer() );
1436 //    }
1437   if( vmType == QxScene_Viewer::Type() )
1438   {
1439     viewMgr = new QxScene_ViewManager( activeStudy(), desktop() );
1440     QxScene_Viewer* vm = new QxScene_Viewer();
1441     viewMgr->setViewModel( vm  );
1442     //QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
1443   }
1444 #endif
1445 #ifndef DISABLE_OCCVIEWER
1446   if( vmType == OCCViewer_Viewer::Type() )
1447   {
1448     viewMgr = new OCCViewer_ViewManager( activeStudy(), desktop() );
1449     OCCViewer_Viewer* vm;
1450 #ifndef DISABLE_SALOMEOBJECT
1451     vm = new SOCC_Viewer();
1452 #else
1453     vm = new OCCViewer_Viewer( true );
1454 #endif
1455     vm->setBackground( OCCViewer_ViewFrame::TOP_LEFT,
1456                        resMgr->backgroundValue( "OCCViewer", "xz_background", vm->background(OCCViewer_ViewFrame::TOP_LEFT) ) );
1457     vm->setBackground( OCCViewer_ViewFrame::TOP_RIGHT,
1458                        resMgr->backgroundValue( "OCCViewer", "yz_background", vm->background(OCCViewer_ViewFrame::TOP_RIGHT) ) );
1459     vm->setBackground( OCCViewer_ViewFrame::BOTTOM_LEFT,
1460                        resMgr->backgroundValue( "OCCViewer", "xy_background", vm->background(OCCViewer_ViewFrame::BOTTOM_LEFT) ) );
1461     vm->setBackground( OCCViewer_ViewFrame::BOTTOM_RIGHT,
1462                        resMgr->backgroundValue( "OCCViewer", "background", vm->background(OCCViewer_ViewFrame::MAIN_VIEW) ) );
1463
1464     vm->setTrihedronSize(  resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1465                            resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
1466     vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1467     vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1468
1469     vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
1470     vm->enableSelection(    resMgr->booleanValue( "OCCViewer", "enable_selection",    vm->isSelectionEnabled() ) );
1471
1472     viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1473     new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
1474   }
1475 #endif
1476 #ifndef DISABLE_VTKVIEWER
1477 #ifndef DISABLE_SALOMEOBJECT
1478   if ( vmType == SVTK_Viewer::Type() )
1479 #else
1480   if ( vmType == VTKViewer_Viewer::Type() )
1481 #endif
1482   {
1483 #ifndef DISABLE_SALOMEOBJECT
1484     viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
1485     SVTK_Viewer* vm = dynamic_cast<SVTK_Viewer*>( viewMgr->getViewModel() );
1486     if( vm )
1487     {
1488       vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
1489       vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1490       vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1491                             resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
1492       vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
1493       vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1494       vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1495       vm->setDynamicPreSelection( resMgr->booleanValue( "VTKViewer", "dynamic_preselection", vm->dynamicPreSelection() ) );
1496       vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
1497                                resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
1498       vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
1499                                 resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", vm->spacemouseBtn(2) ),
1500                                 resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", vm->spacemouseBtn(3) ) );
1501       new LightApp_VTKSelector( vm, mySelMgr );
1502     }
1503 #else
1504     viewMgr = new VTKViewer_ViewManager( activeStudy(), desktop() );
1505     VTKViewer_Viewer* vm = dynamic_cast<VTKViewer_Viewer*>( viewMgr->getViewModel() );
1506     if ( vm )
1507       vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1508 #endif
1509   }
1510 #endif
1511
1512   if ( !viewMgr )
1513     return 0;
1514
1515   addViewManager( viewMgr );
1516   SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1517
1518   if ( viewWin && desktop() ) {
1519     viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1520     viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1521   }
1522
1523   return viewMgr;
1524 }
1525
1526 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1527 {
1528   SUIT_ResourceMgr* resMgr = resourceMgr();
1529
1530   SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1531                                                desktop(),
1532                                                new LightApp_WgViewModel( vmType, w ) );
1533   vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1534
1535   addViewManager( vm );
1536   SUIT_ViewWindow* vw = vm->createViewWindow();
1537   if ( vw && desktop() ) {
1538     vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1539     vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1540   }
1541
1542   if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1543     myUserWmTypes << vmType;
1544
1545   return vm;
1546 }
1547
1548 /*!
1549   SLOT: Removes view manager from application
1550 */
1551 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1552 {
1553   removeViewManager( theVM );
1554 }
1555
1556 /*!
1557   Protected SLOT: On study created.
1558   \param theStudy - just created study
1559 */
1560 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1561 {
1562   SUIT_DataObject* aRoot = 0;
1563   if ( theStudy && theStudy->root() )
1564   {
1565     aRoot = theStudy->root();
1566     //aRoot->setName( tr( "DATA_MODELS" ) );
1567   }
1568
1569   getWindow( WT_ObjectBrowser );
1570
1571   loadDockWindowsState();
1572
1573   if ( objectBrowser() )
1574     objectBrowser()->setRoot( aRoot );
1575
1576   activateModule( defaultModule() );
1577
1578   if ( objectBrowser() )
1579     objectBrowser()->openLevels();
1580 }
1581
1582 /*!
1583   Protected SLOT: On study opened.
1584   \param theStudy - just opened  study
1585 */
1586 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1587 {
1588   SUIT_DataObject* aRoot = 0;
1589   if ( theStudy && theStudy->root() )
1590   {
1591     aRoot = theStudy->root();
1592     //aRoot->dump();
1593   }
1594
1595   getWindow( WT_ObjectBrowser );
1596
1597   loadDockWindowsState();
1598
1599   if ( objectBrowser() )
1600     objectBrowser()->setRoot( aRoot );
1601
1602   activateModule( defaultModule() );
1603
1604   if ( objectBrowser() )
1605     objectBrowser()->openLevels();
1606
1607   emit studyOpened();
1608 }
1609
1610 /*!Protected SLOT. On study saved.*/
1611 void LightApp_Application::onStudySaved( SUIT_Study* s )
1612 {
1613   QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1614   if ( mru && s )
1615       mru->insert( s->studyName() );
1616
1617   emit studySaved();
1618 }
1619
1620 /*!Protected SLOT. On study closed.*/
1621 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1622 {
1623   // stop auto-save timer
1624   myAutoSaveTimer->stop();
1625
1626   // Bug 10396: clear selection
1627   mySelMgr->clearSelected();
1628
1629   // Bug 12944: emit signal only after clear selection
1630   emit studyClosed();
1631
1632   activateModule( "" );
1633 }
1634
1635 /*!Protected SLOT.On desktop activated.*/
1636 void LightApp_Application::onDesktopActivated()
1637 {
1638   CAM_Application::onDesktopActivated();
1639   LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1640   if(aModule)
1641     aModule->studyActivated();
1642 }
1643
1644 void LightApp_Application::studyOpened( SUIT_Study* s )
1645 {
1646   CAM_Application::studyOpened( s );
1647
1648   updateWindows();
1649   updateViewManagers();
1650 }
1651
1652 void LightApp_Application::studySaved( SUIT_Study* s )
1653 {
1654   CAM_Application::studyOpened( s );
1655   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1656   if ( aResMgr && activeStudy() ) {
1657     int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1658     if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1659   }
1660 }
1661
1662 void LightApp_Application::studyCreated( SUIT_Study* s )
1663 {
1664   CAM_Application::studyCreated( s );
1665
1666   updateWindows();
1667   updateViewManagers();
1668 }
1669
1670 /*!Gets file filter.
1671  *\retval QString "(*.bin)"
1672  */
1673 QString LightApp_Application::getFileFilter() const
1674 {
1675   //return "(*.bin)";
1676   // HDF persistence
1677   return "(*.hdf)";
1678 }
1679
1680 /*!
1681   Shows file dialog and return user selected file name
1682 */
1683 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1684                                            const QString& caption, QWidget* parent )
1685 {
1686   if ( !parent )
1687     parent = desktop();
1688   QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1689   return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1690 }
1691
1692 /*! Gets directory*/
1693 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1694 {
1695   if ( !parent )
1696     parent = desktop();
1697   return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1698 }
1699
1700 /*! Get open file names*/
1701 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1702                                                     const QString& caption, QWidget* parent )
1703 {
1704   if ( !parent )
1705     parent = desktop();
1706   QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1707   return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1708 }
1709
1710 /*!Private SLOT. Update object browser.*/
1711 void LightApp_Application::onRefresh()
1712 {
1713   updateObjectBrowser( true );
1714 }
1715
1716 /*!Private SLOT. Support drag-and-drop operation.*/
1717 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
1718 {
1719   LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
1720   if ( !parentObj )
1721     return;
1722
1723   LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
1724   if ( aModule )
1725     aModule->dropObjects( objects, parentObj, row, action );
1726 }
1727
1728 /*!Private SLOT. On preferences.*/
1729 void LightApp_Application::onPreferences()
1730 {
1731   showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
1732 }
1733
1734 /*!Private SLOT. On preferences.*/
1735 void LightApp_Application::showPreferences( const QString& itemText )
1736 {
1737   QApplication::setOverrideCursor( Qt::WaitCursor );
1738
1739   LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
1740
1741   QApplication::restoreOverrideCursor();
1742
1743   if ( !prefDlg )
1744     return;
1745
1746   preferences()->activateItem( itemText );
1747
1748   if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) &&  resourceMgr() )
1749   {
1750     if ( desktop() )
1751       resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
1752     resourceMgr()->save();
1753
1754     // Update shortcuts
1755     shortcutMgr()->updateShortcuts();
1756   }
1757
1758   delete prefDlg;
1759 }
1760
1761 /*!Protected SLOT. On preferences changed.*/
1762 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
1763 {
1764   LightApp_Module* sMod = 0;
1765   CAM_Module* mod = module( modName );
1766   if ( mod && mod->inherits( "LightApp_Module" ) )
1767     sMod = (LightApp_Module*)mod;
1768
1769   if ( sMod )
1770     sMod->preferencesChanged( section, param );
1771   else
1772     preferencesChanged( section, param );
1773   // emit signal to allow additional preferences changing processing
1774   emit preferenceChanged( modName, section, param );
1775 }
1776
1777 /*!Remove all windows from study.*/
1778 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
1779 {
1780   CAM_Application::beforeCloseDoc( s );
1781 }
1782
1783 /*!Update actions.*/
1784 void LightApp_Application::updateActions()
1785 {
1786   updateCommandsStatus();
1787 }
1788
1789 /*!
1790   Creates new study
1791 */
1792 SUIT_Study* LightApp_Application::createNewStudy()
1793 {
1794   LightApp_Application::lastStudyId++;
1795
1796   LightApp_Study* aStudy = new LightApp_Study( this );
1797
1798   // Set up processing of major study-related events
1799   connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
1800   connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
1801   connect( aStudy, SIGNAL( saved  ( SUIT_Study* ) ), this, SLOT( onStudySaved  ( SUIT_Study* ) ) );
1802   connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
1803
1804   return aStudy;
1805 }
1806
1807 /*!
1808   Creates window by flag.
1809   \param flag - identificator of window type
1810 */
1811 QWidget* LightApp_Application::createWindow( const int flag )
1812 {
1813   QWidget* wid = 0;
1814
1815   SUIT_ResourceMgr* resMgr = resourceMgr();
1816
1817   if ( flag == WT_ObjectBrowser )
1818   {
1819     SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
1820     ob->setSortMenuEnabled( true );
1821     ob->setAutoUpdate( true );
1822     if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
1823       ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
1824
1825     //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
1826     ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
1827     connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
1828
1829     QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
1830     SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
1831     treeModel->setSearcher( this );
1832     treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
1833     treeModel->setAppropriate( EntryCol, Qtx::Toggled );
1834
1835     // Mantis issue 0020136: Drag&Drop in OB
1836     SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
1837     if ( proxyModel ) {
1838       connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
1839                this,       SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
1840     }
1841
1842     // temporary commented
1843     /*
1844     OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
1845     if( ob_list )
1846       ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
1847
1848     ob->setFilter( new LightApp_OBFilter( selectionMgr() ) );
1849     */
1850
1851     // Create OBSelector
1852     new LightApp_OBSelector( ob, mySelMgr );
1853
1854     ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
1855     ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
1856     ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
1857     ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
1858     wid = ob;
1859     ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
1860   }
1861 #ifndef DISABLE_PYCONSOLE
1862   else  if ( flag == WT_PyConsole )
1863   {
1864     PyConsole_Console* pyCons = new PyConsole_EnhConsole( desktop(),new LightApp_PyInterp());
1865     pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
1866     pyCons->setFont(resourceMgr()->fontValue( "PyConsole", "font" ));
1867     pyCons->setIsShowBanner(resourceMgr()->booleanValue( "PyConsole", "show_banner", true ));
1868     pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
1869
1870     wid = pyCons;
1871     pyCons->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
1872   }
1873 #endif
1874   else if ( flag == WT_LogWindow )
1875   {
1876     LogWindow* logWin = new LogWindow( desktop() );
1877     logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
1878     logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
1879     wid = logWin;
1880     logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
1881   }
1882   return wid;
1883 }
1884
1885 /*!
1886   \return default windows( Object Browser, Python Console )
1887   Adds to map \a aMap.
1888  */
1889 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
1890 {
1891   aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
1892 #ifndef DISABLE_PYCONSOLE
1893   aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
1894 #endif
1895   //  aMap.insert( WT_LogWindow, Qt::DockBottom );
1896 }
1897
1898 /*!Default view managers*/
1899 void LightApp_Application::defaultViewManagers( QStringList& ) const
1900 {
1901   /*!Do nothing.*/
1902 }
1903
1904 /*!
1905   \return preferences.
1906   Create preferences, if \a crt = true.
1907 */
1908 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
1909 {
1910   if ( myPrefs )
1911     return myPrefs;
1912
1913   LightApp_Application* that = (LightApp_Application*)this;
1914
1915   bool toCreate = !_prefs_ && crt;
1916   if ( toCreate )
1917   {
1918     _prefs_ = new LightApp_Preferences( resourceMgr() );
1919     that->createPreferences( _prefs_ );
1920   }
1921
1922   that->myPrefs = _prefs_;
1923
1924   connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
1925            this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ) );
1926
1927   if ( !crt )
1928     return myPrefs;
1929
1930   SUIT_ResourceMgr* resMgr = resourceMgr();
1931
1932   QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
1933   for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
1934   {
1935     LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
1936     if ( !app )
1937       continue;
1938
1939     QStringList modNameList;
1940     app->modules( modNameList, false );
1941
1942     QMap<QString, QString> iconMap;
1943     app->moduleIconNames( iconMap );
1944
1945     for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
1946     {
1947       if ( !app->isLibExists( *it ) || _prefs_->hasModule( *it ) )
1948         continue;
1949
1950       int modId = _prefs_->addPreference( *it );
1951       if ( iconMap.contains( *it ) )
1952         _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ), iconMap[*it], false ), 20 ) );
1953     }
1954
1955     ModuleList modList;
1956     app->modules( modList );
1957     QListIterator<CAM_Module*> itr( modList );
1958     while ( itr.hasNext() )
1959     {
1960       LightApp_Module* mod = 0;
1961
1962       CAM_Module* anItem = itr.next();
1963       if ( anItem->inherits( "LightApp_Module" ) )
1964         mod = (LightApp_Module*)anItem;
1965
1966       if ( mod && !_prefs_->hasModule( mod->moduleName() ) )
1967       {
1968         _prefs_->addPreference( mod->moduleName() );
1969         mod->createPreferences();
1970         that->emptyPreferences( mod->moduleName() );
1971       }
1972     }
1973   }
1974   _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) );
1975
1976   return myPrefs;
1977 }
1978
1979 /*!
1980   Adds new module to application
1981 */
1982 void LightApp_Application::moduleAdded( CAM_Module* mod )
1983 {
1984   CAM_Application::moduleAdded( mod );
1985
1986   LightApp_Module* lightMod = 0;
1987   if ( mod && mod->inherits( "LightApp_Module" ) )
1988     lightMod = (LightApp_Module*)mod;
1989
1990   if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
1991   {
1992     myPrefs->addPreference( mod->moduleName() );
1993     lightMod->createPreferences();
1994     emptyPreferences( mod->moduleName() );
1995   }
1996 }
1997
1998 void LightApp_Application::emptyPreferences( const QString& modName )
1999 {
2000   QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2001   if ( !item || !item->isEmpty() )
2002     return;
2003
2004   //  printf( "---------------------> Modify for empty module.\n" );
2005
2006   QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2007   frm->setIcon( item->icon() );
2008   frm->setStretch( false );
2009   item->parentItem()->insertItem( frm, item );
2010   new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2011   delete item;
2012 }
2013
2014 /*!
2015   Create preferences
2016 */
2017 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2018 {
2019   if ( !pref )
2020     return;
2021
2022   QStringList     aValuesList;
2023   QList<QVariant> anIndicesList;
2024   QIntList        idList;
2025   QIntList        txtList;
2026
2027   // . Top-level "SALOME" preferences group <<start>>
2028   int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2029   pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2030
2031   // .. "General" preferences tab <<start>>
2032   int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2033
2034   // ... "Language" group <<start>>
2035   int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2036   pref->setItemProperty( "columns", 2, langGroup );
2037   // .... -> application language
2038   int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2039                                           LightApp_Preferences::Selector, "language", "language" );
2040   QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2041   QList<QVariant> aIcons;
2042   foreach ( QString aLang, aLangs ) {
2043     aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2044   }
2045   pref->setItemProperty( "strings", aLangs, curLang );
2046   pref->setItemProperty( "icons",   aIcons, curLang );
2047   // ... "Language" group <<end>>
2048
2049   // ... "Look and feel" group <<start>>
2050   int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2051   pref->setItemProperty( "columns", 2, lookGroup );
2052   // .... -> show splash-screen
2053   pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2054   // .... -> opaque resize
2055   pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2056   // .... -> drop-down buttons 
2057   pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2058   // ... "Look and feel" group <<end>>
2059
2060   // ... "Study properties" group <<start>>
2061   int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2062   pref->setItemProperty( "columns", 2, studyGroup );
2063   // .... -> multi-file save
2064   pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2065   // .... -> ascii save mode
2066   pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2067   // .... -> store windows geometry
2068   pref->addPreference( tr( "PREF_STORE_POS" ),  studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2069   // .... -> auto-save
2070   int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ),  studyGroup,
2071                                               LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2072   pref->setItemProperty( "min",        0, autoSaveInterval );
2073   pref->setItemProperty( "max",     1440, autoSaveInterval );
2074   pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2075   // ... "Study properties" group <<end>>
2076
2077   // ... "Help browser" group <<start>>
2078   int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2079 #ifdef WIN32
2080   QString platform = "winapplication";
2081 #else
2082   QString platform = "application";
2083 #endif
2084   // .... -> browser application
2085   int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2086   pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2087   // .... -> browser parameters
2088   pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2089   // ... "Help browser" group <<end>>
2090
2091   // ... "Python console properties" group <<start>>
2092   int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2093   // .... -> font
2094   pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2095   // .... -> show banner
2096   pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2097   // ... "Python console properties" group <<end>>
2098
2099   // ... "MRU" preferences group <<start>>
2100   int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2101   pref->setItemProperty( "columns", 4, mruGroup );
2102   // number of MRU items
2103   int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2104                                          "MRU", "visible_count" );
2105   pref->setItemProperty( "min", 0,   mruVisCount );
2106   pref->setItemProperty( "max", 100, mruVisCount );
2107   // MRU links type
2108   int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2109                                          "MRU", "link_type" );
2110   aValuesList.clear();
2111   anIndicesList.clear();
2112   aValuesList   << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2113   anIndicesList << 0                        << 1                         << 2                       ;
2114   pref->setItemProperty( "strings", aValuesList,   mruLinkType );
2115   pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2116   // ... "MRU" preferences group <<end>>
2117   // .. "General" preferences tab <<end>>
2118
2119   // .. "3D viewer" group <<start>>
2120   int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2121   // ... -> navigation mode
2122   int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2123                                           LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2124   aValuesList.clear();
2125   anIndicesList.clear();
2126   aValuesList   << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2127   anIndicesList << 0                         << 1;
2128   pref->setItemProperty( "strings", aValuesList,   vtkStyleMode );
2129   pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2130   // ... -> zooming mode
2131   #if OCC_VERSION_LARGE > 0x0603000A // available only with OCC-6.3-sp11 and higher version
2132     int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2133                                                    LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2134     aValuesList.clear();
2135     anIndicesList.clear();
2136     aValuesList   << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2137     anIndicesList << 0                            << 1;
2138     pref->setItemProperty( "strings", aValuesList,   occZoomingStyleMode );
2139     pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2140   #endif
2141   // ... "Trihedron" group <<start>>
2142   int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2143   pref->setItemProperty( "columns", 2, occTriGroup );
2144   // .... -> trihedron size
2145   int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2146                                    LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2147   pref->setItemProperty( "min", 1.0E-06, occTS );
2148   pref->setItemProperty( "max", 1000, occTS );
2149   // .... -> relative size of trihedron
2150   pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2151   // .... -> show static trihedron
2152   pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2153   // ... "Trihedron" group <<end>>
2154   // .. "3D viewer" group <<end>>
2155
2156   // .. "OCC viewer" group <<start>>
2157   int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2158
2159   // ... "Background" group <<start>>
2160   int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2161   //  pref->setItemProperty( "columns", 2, bgGroup );
2162   aValuesList.clear();
2163   anIndicesList.clear();
2164   txtList.clear();
2165   QString formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2166   foreach( int gid, idList ) anIndicesList << gid;
2167   // .... -> 3D viewer background
2168   int bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2169                                   LightApp_Preferences::Background, "OCCViewer", "background" );
2170   pref->setItemProperty( "gradient_names", aValuesList, bgId );
2171   pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2172   pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2173   pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2174   pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2175   pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2176   pref->setItemProperty( "custom_enabled", false, bgId );
2177   pref->setItemProperty( "image_formats", formats, bgId );
2178   // .... -> XZ viewer background
2179   bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2180                               LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2181   pref->setItemProperty( "gradient_names", aValuesList, bgId );
2182   pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2183   pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2184   pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2185   pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2186   pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2187   pref->setItemProperty( "custom_enabled", false, bgId );
2188   pref->setItemProperty( "image_formats", formats, bgId );
2189   // .... -> YZ viewer background
2190   bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2191                               LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2192   pref->setItemProperty( "gradient_names", aValuesList, bgId );
2193   pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2194   pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2195   pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2196   pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2197   pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2198   pref->setItemProperty( "custom_enabled", false, bgId );
2199   pref->setItemProperty( "image_formats", formats, bgId );
2200   // .... -> XY viewer background
2201   bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2202                               LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2203   pref->setItemProperty( "gradient_names", aValuesList, bgId );
2204   pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2205   pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2206   pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2207   pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2208   pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2209   pref->setItemProperty( "custom_enabled", false, bgId );
2210   pref->setItemProperty( "image_formats", formats, bgId );
2211   // ... "Background" group <<end>>
2212
2213
2214   // ... "Selection" group <<start>>
2215   int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2216   pref->setItemProperty( "columns", 2, occSelectionGroup );
2217   // .... -> enable preselection
2218   pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup, 
2219                        LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2220   // .... -> enable selection
2221   pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup, 
2222                        LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2223   // ... "Selection" group <<end>>
2224
2225   // ... -> empty frame (for layout) <<start>>
2226   int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2227   pref->setItemProperty( "margin",  0, occGen );
2228   pref->setItemProperty( "columns", 2, occGen );
2229   // ... -> empty frame (for layout) <<end>>
2230   // .. "OCC viewer" group <<end>>
2231
2232   // .. "VTK viewer" group <<start>>
2233   int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2234
2235   // ... -> empty frame (for layout) <<start>>
2236   int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2237   //pref->setItemProperty( "columns", 2, vtkGen );
2238   // .... -> projection mode
2239   int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2240                                          LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2241   aValuesList.clear();
2242   anIndicesList.clear();
2243   aValuesList   << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2244   anIndicesList << 0                       << 1;
2245   pref->setItemProperty( "strings", aValuesList,   vtkProjMode );
2246   pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2247   // .... -> background
2248   aValuesList.clear();
2249   anIndicesList.clear();
2250   txtList.clear();
2251   formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2252   foreach( int gid, idList ) anIndicesList << gid;
2253   bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2254                               LightApp_Preferences::Background, "VTKViewer", "background" );
2255   pref->setItemProperty( "gradient_names", aValuesList, bgId );
2256   pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2257   pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2258   pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2259   pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2260   pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2261   pref->setItemProperty( "custom_enabled", false, bgId );
2262   pref->setItemProperty( "image_formats", formats, bgId );
2263   // .... -> speed increment
2264   int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2265                                       LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2266   pref->setItemProperty( "min", 1, vtkSpeed );
2267   pref->setItemProperty( "max", 1000, vtkSpeed );
2268   // .... -> speed mode
2269   int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2270                                           LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2271   aValuesList.clear();
2272   anIndicesList.clear();
2273   aValuesList   << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2274   anIndicesList << 0                     << 1;
2275   pref->setItemProperty( "strings", aValuesList,   vtkSpeedMode );
2276   pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2277   // .... -> dynamic pre-selection
2278   pref->addPreference( tr( "PREF_DYNAMIC_PRESELECTION" ),  vtkGen, LightApp_Preferences::Bool, "VTKViewer", "dynamic_preselection" );
2279   // ... -> empty frame (for layout) <<end>>
2280
2281   // ... space mouse sub-group <<start>>
2282   int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2283   //pref->setItemProperty( "columns", 2, vtkSM );
2284   // .... -> decrease speed increment
2285   int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2286                                              LightApp_Preferences::Selector, "VTKViewer",
2287                                              "spacemouse_func1_btn" );
2288   // .... -> increase speed increment
2289   int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2290                                              LightApp_Preferences::Selector, "VTKViewer",
2291                                              "spacemouse_func2_btn" );
2292   // .... -> dominant / combined switch  
2293   int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2294                                              LightApp_Preferences::Selector, "VTKViewer",
2295                                              "spacemouse_func5_btn" ); //
2296   aValuesList.clear();
2297   anIndicesList.clear();
2298   aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" )  << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2299   aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" )  << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2300   aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" )  << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2301   aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2302   anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2303   pref->setItemProperty( "strings", aValuesList,   spacemousePref1 );
2304   pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2305   pref->setItemProperty( "strings", aValuesList,   spacemousePref2 );
2306   pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2307   pref->setItemProperty( "strings", aValuesList,   spacemousePref3 );
2308   pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2309   // ... space mouse sub-group <<end>>
2310
2311   // ... avi recording sub-group <<start>>
2312   int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2313   pref->setItemProperty( "columns", 2, vtkRec );
2314   // .... -> recording mode
2315   int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2316                                       LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2317   aValuesList.clear();
2318   anIndicesList.clear();
2319   aValuesList   << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2320   anIndicesList << 0                           << 1;
2321   pref->setItemProperty( "strings", aValuesList,   modePref );
2322   pref->setItemProperty( "indexes", anIndicesList, modePref );
2323   // .... -> fps
2324   int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2325                                      LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2326   pref->setItemProperty( "min", 0.1, fpsPref );
2327   pref->setItemProperty( "max", 100, fpsPref );
2328   // .... -> quality
2329   int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2330                                          LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2331   pref->setItemProperty( "min", 1, qualityPref );
2332   pref->setItemProperty( "max", 100, qualityPref );
2333   // .... -> progressive mode
2334   pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2335                        LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2336   // ... avi recording sub-group <<end>>
2337
2338   // ... group names sub-group <<start>>
2339   int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2340                                    LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2341   pref->setItemProperty( "columns", 2, vtkGN );
2342   // .... -> text color
2343   pref->addPreference( tr(  "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2344                        LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2345   // .... -> transparency
2346   int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2347                                        LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2348   pref->setItemProperty( "min", 0.0, transPref );
2349   pref->setItemProperty( "max", 1.0, transPref );
2350   pref->setItemProperty( "step", 0.1, transPref );
2351   // ... -> group names sub-group <<end>>
2352   // .. "VTK viewer" group <<end>>
2353
2354   // .. "Plot2d viewer" group <<start>>
2355   int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2356   //pref->setItemProperty( "columns", 2, plot2dGroup );
2357
2358   // ... -> show legend
2359   pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dGroup,
2360                        LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2361   // ... -> legend position
2362   int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dGroup,
2363                                             LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2364   aValuesList.clear();
2365   anIndicesList.clear();
2366   aValuesList   << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2367   anIndicesList << 0               << 1                << 2              << 3                ;
2368   pref->setItemProperty( "strings", aValuesList,   legendPosition );
2369   pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2370   // ... -> legend font
2371   pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2372   // ... -> curve type
2373   int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dGroup,
2374                                        LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2375   aValuesList.clear();
2376   anIndicesList.clear();
2377   aValuesList   << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2378   anIndicesList << 0                 << 1                << 2                ;
2379   pref->setItemProperty( "strings", aValuesList,   curveType );
2380   pref->setItemProperty( "indexes", anIndicesList, curveType );
2381   // ... -> marker size
2382   int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dGroup,
2383                                         LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2384   pref->setItemProperty( "min", 0, markerSize );
2385   pref->setItemProperty( "max", 100, markerSize );
2386   // ... -> horizontal scaling mode
2387   int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dGroup,
2388                                       LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2389   aValuesList.clear();
2390   anIndicesList.clear();
2391   aValuesList   << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2392   anIndicesList << 0                 << 1                     ;
2393   pref->setItemProperty( "strings", aValuesList,   horScale );
2394   pref->setItemProperty( "indexes", anIndicesList, horScale );
2395   // ... -> vertical scaling mode
2396   int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dGroup,
2397                                       LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2398   pref->setItemProperty( "strings", aValuesList,   verScale );
2399   pref->setItemProperty( "indexes", anIndicesList, verScale );
2400   // ... -> background
2401   pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2402                        LightApp_Preferences::Color, "Plot2d", "Background" );
2403   // ... -> font color
2404   pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2405   // ... -> selection font color
2406   pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2407   // ... -> selection color
2408   pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2409                        LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2410   // ... -> errors/deviation colot
2411   pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dGroup,
2412                        LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2413   // ... -> deviation markers line size
2414   int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dGroup,
2415                                         LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2416   pref->setItemProperty( "min", 1, deviationMarkerLw );
2417   pref->setItemProperty( "max", 5, deviationMarkerLw );
2418   // ... -> deviation markers tick mark size
2419   int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dGroup,
2420                                         LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2421   pref->setItemProperty( "min", 1, deviationMarkerTs );
2422   pref->setItemProperty( "max", 5, deviationMarkerTs );
2423   // .. "Plot2d viewer" group <<end>>
2424
2425   // .. "Directories" preferences tab <<start>>
2426   int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2427   // ... --> quick directories list
2428   int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2429   pref->addPreference( tr( "" ), dirGroup,
2430                        LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2431   // .. "Directories" preferences tab <<end>>
2432
2433   // .. "Object browser" preferences tab <<start>>
2434   int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2435
2436   // ... "Search tool" group <<start>>
2437   int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2438   // .... --> auto-hide
2439   pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2440                        "ObjectBrowser", "auto_hide_search_tool" );
2441   // ... "Search tool" group <<end>>
2442
2443   // ... "Object browser settings" group <<start>>
2444   int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2445   pref->setItemProperty( "columns", 2, objSetGroup );
2446   // .... -> auto size first column
2447   pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2448                        "ObjectBrowser", "auto_size_first" );
2449   // .... -> auto size other columns
2450   pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2451                        "ObjectBrowser", "auto_size" );
2452   // .... -> resize columns on expand item
2453   pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2454                        "ObjectBrowser", "resize_on_expand_item" );
2455   // .... -> browse to published object
2456   int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
2457                                              "ObjectBrowser", "browse_published_object" );
2458   aValuesList.clear();
2459   anIndicesList.clear();
2460   aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
2461   anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
2462   pref->setItemProperty( "strings", aValuesList,   browsePublished );
2463   pref->setItemProperty( "indexes", anIndicesList, browsePublished );
2464   // ... "Object browser settings" group <<end>>
2465   // .. "Object browser" preferences tab <<end>>
2466
2467   // .. "Shortcuts" preferences tab <<start>>
2468   int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
2469   // ... "Shortcuts settings" group <<start>>
2470   int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
2471   pref->addPreference( tr( "" ), shortcutGroup,
2472                        LightApp_Preferences::ShortcutTree, "shortcuts" );
2473   // ... "Shortcuts settings" group <<end>>
2474   // .. "Shortcuts" preferences tab <<end>>
2475   // . Top-level "SALOME" preferences group <<end>>
2476
2477   pref->retrieve();
2478 }
2479
2480 /*!
2481   Changes appearance of application according to changed preferences
2482   \param sec - section
2483   \param param - name of changed parameter
2484 */
2485 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
2486 {
2487   SUIT_ResourceMgr* resMgr = resourceMgr();
2488   if ( !resMgr )
2489     return;
2490
2491   if ( sec == "viewers" && param == "drop_down_buttons" )
2492   {
2493     ViewManagerList vmlist = viewManagers();
2494     foreach( SUIT_ViewManager* vm, vmlist )
2495     {
2496       QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
2497       foreach( SUIT_ViewWindow* vw, vwlist )
2498         if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
2499     }
2500   }
2501
2502   if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
2503   {
2504     double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
2505     bool relative = resMgr->booleanValue( sec, "relative_size", true );
2506     QList<SUIT_ViewManager*> lst;
2507 #ifndef DISABLE_OCCVIEWER
2508     viewManagers( OCCViewer_Viewer::Type(), lst );
2509     QListIterator<SUIT_ViewManager*> itOCC( lst );
2510     while ( itOCC.hasNext() && sz >= 0 )
2511     {
2512       SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2513       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2514         continue;
2515
2516       OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2517       occVM->setTrihedronSize( sz, relative );
2518       occVM->getAISContext()->UpdateCurrentViewer();
2519     }
2520 #endif
2521 #ifndef DISABLE_VTKVIEWER
2522 #ifndef DISABLE_SALOMEOBJECT
2523     viewManagers( SVTK_Viewer::Type(), lst );
2524     QListIterator<SUIT_ViewManager*> itVTK( lst );
2525     while ( itVTK.hasNext() && sz >= 0 )
2526     {
2527       SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2528       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2529         continue;
2530
2531       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2532       if( vtkVM )
2533       {
2534         vtkVM->setTrihedronSize( sz, relative );
2535         vtkVM->Repaint();
2536       }
2537     }
2538 #endif
2539 #endif
2540   }
2541
2542   if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
2543   {
2544     bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
2545     QList<SUIT_ViewManager*> lst;
2546 #ifndef DISABLE_OCCVIEWER
2547     viewManagers( OCCViewer_Viewer::Type(), lst );
2548     QListIterator<SUIT_ViewManager*> itOCC( lst );
2549     while ( itOCC.hasNext() )
2550     {
2551       SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2552       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2553         continue;
2554
2555       OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
2556       if( occVM )
2557       {
2558         occVM->setStaticTrihedronDisplayed( isVisible );
2559       }
2560     }
2561 #endif
2562 #ifndef DISABLE_VTKVIEWER
2563 #ifndef DISABLE_SALOMEOBJECT
2564     viewManagers( SVTK_Viewer::Type(), lst );
2565     QListIterator<SUIT_ViewManager*> itVTK( lst );
2566     while ( itVTK.hasNext() )
2567     {
2568       SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2569       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2570         continue;
2571
2572       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2573       if( vtkVM )
2574       {
2575         vtkVM->setStaticTrihedronVisible( isVisible );
2576         vtkVM->Repaint();
2577       }
2578     }
2579 #endif
2580 #endif
2581   }
2582
2583   if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
2584   {
2585     int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
2586     QList<SUIT_ViewManager*> lst;
2587 #ifndef DISABLE_OCCVIEWER
2588     viewManagers( OCCViewer_Viewer::Type(), lst );
2589     QListIterator<SUIT_ViewManager*> itOCC( lst );
2590     while ( itOCC.hasNext() )
2591     {
2592       SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2593       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2594         continue;
2595
2596       OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2597 #ifndef DISABLE_OCCVIEWER
2598   if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
2599   {
2600     bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
2601     QList<SUIT_ViewManager*> lst;
2602     viewManagers( OCCViewer_Viewer::Type(), lst );
2603     QListIterator<SUIT_ViewManager*> it( lst );
2604     while ( it.hasNext() )
2605     {
2606       SUIT_ViewModel* vm = it.next()->getViewModel();
2607       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2608         continue;
2609
2610       OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2611       occVM->enablePreselection( isToEnablePreselection );
2612     }
2613   }
2614 #endif
2615
2616 #ifndef DISABLE_OCCVIEWER
2617   if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
2618   {
2619     bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
2620     QList<SUIT_ViewManager*> lst;
2621     viewManagers( OCCViewer_Viewer::Type(), lst );
2622     QListIterator<SUIT_ViewManager*> it( lst );
2623     while ( it.hasNext() )
2624     {
2625       SUIT_ViewModel* vm = it.next()->getViewModel();
2626       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2627         continue;
2628
2629       OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2630       occVM->enableSelection( isToEnableSelection );
2631     }
2632   }
2633 #endif
2634
2635       occVM->setInteractionStyle( mode );
2636     }
2637 #endif
2638 #ifndef DISABLE_VTKVIEWER
2639 #ifndef DISABLE_SALOMEOBJECT
2640     viewManagers( SVTK_Viewer::Type(), lst );
2641     QListIterator<SUIT_ViewManager*> itVTK( lst );
2642     while ( itVTK.hasNext() )
2643     {
2644       SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2645       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2646         continue;
2647
2648       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2649       if( vtkVM ) vtkVM->setInteractionStyle( mode );
2650     }
2651 #endif
2652 #endif
2653   }
2654
2655   if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
2656   {
2657     int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
2658     QList<SUIT_ViewManager*> lst;
2659 #ifndef DISABLE_OCCVIEWER
2660     viewManagers( OCCViewer_Viewer::Type(), lst );
2661     QListIterator<SUIT_ViewManager*> itOCC( lst );
2662     while ( itOCC.hasNext() )
2663     {
2664       SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2665       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2666         continue;
2667
2668       OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2669       occVM->setZoomingStyle( mode );
2670     }
2671 #endif
2672 #ifndef DISABLE_VTKVIEWER
2673 #ifndef DISABLE_SALOMEOBJECT
2674     viewManagers( SVTK_Viewer::Type(), lst );
2675     QListIterator<SUIT_ViewManager*> itVTK( lst );
2676     while ( itVTK.hasNext() )
2677     {
2678       SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2679       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2680         continue;
2681
2682       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2683       if( vtkVM ) vtkVM->setZoomingStyle( mode );
2684     }
2685 #endif
2686 #endif
2687   }
2688
2689 #ifndef DISABLE_VTKVIEWER
2690   if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
2691   {
2692     int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
2693     int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
2694     QList<SUIT_ViewManager*> lst;
2695 #ifndef DISABLE_SALOMEOBJECT
2696     viewManagers( SVTK_Viewer::Type(), lst );
2697     QListIterator<SUIT_ViewManager*> it( lst );
2698     while ( it.hasNext() )
2699     {
2700       SUIT_ViewModel* vm = it.next()->getViewModel();
2701       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2702         continue;
2703
2704       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2705       if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
2706     }
2707 #endif
2708   }
2709 #endif
2710
2711 #ifndef DISABLE_VTKVIEWER
2712   if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
2713   {
2714     int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
2715     QList<SUIT_ViewManager*> lst;
2716 #ifndef DISABLE_SALOMEOBJECT
2717     viewManagers( SVTK_Viewer::Type(), lst );
2718     QListIterator<SUIT_ViewManager*> it( lst );
2719     while ( it.hasNext() )
2720     {
2721       SUIT_ViewModel* vm = it.next()->getViewModel();
2722       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2723         continue;
2724
2725       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2726       if( vtkVM ) vtkVM->setProjectionMode( mode );
2727     }
2728 #endif
2729   }
2730 #endif
2731
2732 #ifndef DISABLE_VTKVIEWER
2733   if ( sec == QString( "VTKViewer" ) && param == QString( "dynamic_preselection" ) )
2734   {
2735     bool mode = resMgr->booleanValue( "VTKViewer", "dynamic_preselection", true );
2736     QList<SUIT_ViewManager*> lst;
2737 #ifndef DISABLE_SALOMEOBJECT
2738     viewManagers( SVTK_Viewer::Type(), lst );
2739     QListIterator<SUIT_ViewManager*> it( lst );
2740     while ( it.hasNext() )
2741     {
2742       SUIT_ViewModel* vm = it.next()->getViewModel();
2743       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2744         continue;
2745
2746       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2747       if( vtkVM ) vtkVM->setDynamicPreSelection( mode );
2748     }
2749 #endif
2750   }
2751 #endif
2752
2753 #ifndef DISABLE_VTKVIEWER
2754   if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
2755                                          param == QString( "spacemouse_func2_btn" ) ||
2756                                          param == QString( "spacemouse_func5_btn" ) ) )
2757   {
2758     int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
2759     int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
2760     int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
2761     QList<SUIT_ViewManager*> lst;
2762 #ifndef DISABLE_SALOMEOBJECT
2763     viewManagers( SVTK_Viewer::Type(), lst );
2764     QListIterator<SUIT_ViewManager*> it( lst );
2765     while ( it.hasNext() )
2766     {
2767       SUIT_ViewModel* vm = it.next()->getViewModel();
2768       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2769         continue;
2770
2771       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2772       if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
2773     }
2774 #endif
2775   }
2776 #endif
2777   if( sec=="ObjectBrowser" )
2778   {
2779     SUIT_DataBrowser* ob = objectBrowser();
2780     if ( !ob )
2781       return;
2782
2783     if ( param=="auto_size_first" )
2784     {
2785       bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
2786       ob->setAutoSizeFirstColumn( autoSizeFirst );
2787       if ( autoSizeFirst )
2788         ob->adjustFirstColumnWidth();
2789     }
2790     else if ( param=="auto_size" ) {
2791       bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
2792       ob->setAutoSizeColumns(autoSize);
2793       if ( autoSize )
2794         ob->adjustColumnsWidth();
2795     }
2796     else if ( param=="resize_on_expand_item" ) {
2797       bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
2798       ob->setResizeOnExpandItem(resizeOnExpandItem);
2799     }
2800     else if ( param == "auto_hide_search_tool" ) {
2801       ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
2802     }
2803   }
2804
2805   if( sec=="Study" )
2806   {
2807     if( param=="store_positions" )
2808       updateWindows();
2809     if( param=="auto_save_interval" ) {
2810       myAutoSaveTimer->stop();
2811       int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
2812       if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
2813     }
2814   }
2815
2816 #ifndef DISABLE_PYCONSOLE
2817   if( sec=="PyConsole" && pythonConsole() )
2818   {
2819     if ( param=="font" ) {
2820       pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
2821     }
2822     else if ( param=="show_banner" ) {
2823       pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
2824     }
2825   }
2826 #endif
2827
2828   if( sec=="MRU" )
2829   {
2830     QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
2831     if ( mru ) {
2832       if ( param == "visible_count" )
2833         mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) );    // 5 MRU items by default
2834       else if ( param == "max_count" )
2835         mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) );       // unlimited history by default
2836       else if ( param == "insert_mode" )
2837         mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) );        // QtxMRUAction::MoveFirst by default
2838       else if ( param == "link_type" )
2839         mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) );            // QtxMRUAction::LinkAuto by default
2840       else if ( param == "show_clear" )
2841         mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) );  // do not show "Clear" item by default
2842       else if ( param == "show_mru" )
2843         mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) );          // do not show MRU menu item by default
2844     }
2845   }
2846   if ( sec == "language" && param == "language" )
2847   {
2848     SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
2849   }
2850   if ( sec == "desktop" && param == "opaque_resize" ) {
2851     bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
2852     QMainWindow::DockOptions dopts = desktop()->dockOptions();
2853     if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
2854     else                dopts &= ~QMainWindow::AnimatedDocks;
2855     desktop()->setDockOptions( dopts );
2856     desktop()->setOpaqueResize( opaqueResize );
2857     if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
2858       dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
2859   }
2860
2861   if ( sec == "ExternalBrowser" && param == "use_external_browser" ) {
2862     if ( resMgr->booleanValue("ExternalBrowser", "use_external_browser", false ) )
2863       {
2864         if(QtxWebBrowser::webBrowser())
2865           QtxWebBrowser::webBrowser()->close();
2866       }
2867   }
2868
2869 #ifndef DISABLE_PLOT2DVIEWER
2870   if ( sec == "Plot2d" ) {
2871     if( param == "SelectionColor" ) {
2872       QColor c = resMgr->colorValue( sec, param );
2873       Plot2d_Object::setSelectionColor(c);
2874     }
2875     else if (param == "SelectedLegendFontColor") {
2876       QColor c = resMgr->colorValue( sec, param );      
2877       Plot2d_Object::setHighlightedLegendTextColor(c);
2878     }
2879   }
2880 #endif
2881 }
2882
2883 /*!
2884   Loads preferences
2885 */
2886 void LightApp_Application::loadPreferences()
2887 {
2888   CAM_Application::loadPreferences();
2889
2890   SUIT_ResourceMgr* aResMgr = resourceMgr();
2891
2892   if ( !aResMgr )
2893     return;
2894
2895   static bool mru_load = true;
2896   if ( mru_load )
2897   {
2898     QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
2899     if ( mru ) {
2900       mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) );         // do not show MRU menu item by default
2901       mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) );   // 5 MRU items by default
2902       mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) );      // unlimited history by default
2903       mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) );       // QtxMRUAction::MoveFirst by default
2904       mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) );           // QtxMRUAction::LinkAuto by default
2905       mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
2906       mru->loadLinks( aResMgr, "MRU" );
2907     }
2908     mru_load = false;
2909   }
2910
2911   myWinGeom.clear();
2912   QStringList mods = aResMgr->parameters( "windows_geometry" );
2913   for ( QStringList::const_iterator it = mods.begin(); it != mods.end(); ++it )
2914   {
2915     QByteArray arr;
2916     if ( aResMgr->value( "windows_geometry", *it, arr ) )
2917       myWinGeom.insert( *it, arr );
2918   }
2919
2920   myWinVis.clear();
2921   mods = aResMgr->parameters( "windows_visibility" );
2922   for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
2923   {
2924     QByteArray arr;
2925     if ( aResMgr->value( "windows_visibility", *itr, arr ) )
2926       myWinVis.insert( *itr, arr );
2927   }
2928
2929   if ( desktop() ) {
2930     desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
2931     bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
2932     QMainWindow::DockOptions dopts = desktop()->dockOptions();
2933     if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
2934     else                dopts &= ~QMainWindow::AnimatedDocks;
2935     desktop()->setDockOptions( dopts );
2936     desktop()->setOpaqueResize( opaqueResize );
2937     if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
2938       dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
2939   }
2940 }
2941
2942 /*!
2943   Saves preferences
2944 */
2945 void LightApp_Application::savePreferences()
2946 {
2947   CAM_Application::savePreferences();
2948
2949   saveDockWindowsState();
2950
2951   SUIT_ResourceMgr* aResMgr = resourceMgr();
2952
2953   if ( !aResMgr )
2954     return;
2955
2956   QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
2957   if ( mru )
2958     mru->saveLinks( aResMgr, "MRU" );
2959
2960   for ( WinGeom::const_iterator it = myWinGeom.begin(); it != myWinGeom.end(); ++it )
2961     aResMgr->setValue( "windows_geometry", it.key(), it.value() );
2962
2963   for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
2964     aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
2965
2966   if ( desktop() )
2967     aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
2968
2969   aResMgr->save();
2970 }
2971
2972 /*!
2973   Updates desktop title
2974 */
2975 void LightApp_Application::updateDesktopTitle()
2976 {
2977   QString aTitle = applicationName();
2978   QString aVer = applicationVersion();
2979   if ( !aVer.isEmpty() )
2980     aTitle += QString( " " ) + aVer;
2981
2982   if ( activeStudy() ) {
2983     QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
2984     aTitle += QString( " - [%1]" ).arg( sName );
2985   }
2986
2987   desktop()->setWindowTitle( aTitle );
2988 }
2989
2990 /*!
2991   \brief Get map of the operations which can be performed
2992   on the module activation.
2993
2994   The method should return the map of the kind \c {<id>:<name>}
2995   where \c <id> is an integer identifier of the operation and
2996   \c <name> is a title for the button to be added to the
2997   dialog box. After user selects the required operation by the
2998   clicking the corresponding button in the dialog box, its identifier
2999   is passed to the moduleActionSelected() method to process
3000   the made choice.
3001
3002   \return map of the operations
3003   \sa moduleActionSelected()
3004 */
3005 QMap<int, QString> LightApp_Application::activateModuleActions() const
3006 {
3007   QMap<int, QString> opmap;
3008   opmap.insert( NewStudyId,  tr( "ACTIVATE_MODULE_OP_NEW" ) );
3009   opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3010   return opmap;
3011 }
3012
3013 /*!
3014   \brief Called when the used selectes required operation chosen
3015   from "Activate module" dialog box.
3016
3017   Performs the required operation according to the user choice.
3018
3019   \param id operation identifier
3020   \sa activateModuleActions()
3021 */
3022 void LightApp_Application::moduleActionSelected( const int id )
3023 {
3024   switch ( id ) {
3025   case NewStudyId:
3026     onNewDoc();
3027     break;
3028   case OpenStudyId:
3029     onOpenDoc();
3030     break;
3031   default:
3032     break;
3033   }
3034 }
3035
3036 /*!
3037   Updates windows after close document
3038 */
3039 void LightApp_Application::afterCloseDoc()
3040 {
3041   updateWindows();
3042
3043   CAM_Application::afterCloseDoc();
3044 }
3045
3046 /*!
3047   Updates actions of active module
3048 */
3049 void LightApp_Application::updateModuleActions()
3050 {
3051   QString modName;
3052   if ( activeModule() ) {
3053     modName = activeModule()->moduleName();
3054     if ( !isModuleAccessible( modName ) ) {
3055       QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3056       foreach( SUIT_Application* app, apps ) {
3057         LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3058         if ( lapp && lapp != this )
3059           lapp->removeModuleAction( modName );
3060       }
3061     }
3062   }
3063
3064   LightApp_ModuleAction* moduleAction =
3065     qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3066   if ( moduleAction )
3067     moduleAction->setActiveModule( modName );
3068 }
3069
3070 void LightApp_Application::removeModuleAction( const QString& modName )
3071 {
3072   LightApp_ModuleAction* moduleAction =
3073     qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3074   if ( moduleAction )
3075     moduleAction->removeModule( modName );
3076 }
3077
3078 /*!
3079   Gets current windows.
3080   \param winMap - output current windows map.
3081 */
3082 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3083 {
3084   winMap.clear();
3085   if ( !activeStudy() )
3086     return;
3087
3088   if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3089     ((LightApp_Module*)activeModule())->windows( winMap );
3090   else
3091     defaultWindows( winMap );
3092 }
3093
3094 /*!
3095   Gets current view managers.
3096   \param lst - output current view managers list.
3097 */
3098 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3099 {
3100   lst.clear();
3101   if ( !activeStudy() )
3102     return;
3103
3104   if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3105     ((LightApp_Module*)activeModule())->viewManagers( lst );
3106   else
3107     defaultViewManagers( lst );
3108 }
3109
3110 /*!
3111   Updates windows
3112 */
3113 void LightApp_Application::updateWindows()
3114 {
3115   QMap<int, int> winMap;
3116   currentWindows( winMap );
3117
3118   if ( activeStudy() )
3119   {
3120     for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
3121     {
3122       if ( !dockWindow( it.key() ) )
3123         getWindow( it.key() );
3124     }
3125   }
3126
3127   for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
3128   {
3129     QWidget* wid = it.value();
3130     if ( activeStudy() )
3131       wid->setVisible( winMap.contains( it.key() ) );
3132     else
3133       delete wid;
3134   }
3135
3136   if ( activeStudy() )
3137     loadDockWindowsState();
3138   else
3139     myWin.clear();
3140 }
3141
3142 /*!
3143   Updates view managers
3144 */
3145 void LightApp_Application::updateViewManagers()
3146 {
3147   QStringList lst;
3148   currentViewManagers( lst );
3149
3150   for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
3151     getViewManager( *it, true );
3152 }
3153
3154 /*!
3155   Loads windows geometry
3156 */
3157 void LightApp_Application::loadDockWindowsState()
3158 {
3159   if ( !desktop() )
3160     return;
3161
3162   bool store = resourceMgr()->booleanValue( "Study", "store_positions", true );
3163   if( !store )
3164     return;
3165
3166   QString modName;
3167   if ( activeModule() )
3168     modName = activeModule()->name();
3169
3170   if ( myWinGeom.contains( modName ) )
3171     desktop()->restoreState( myWinGeom[modName] );
3172
3173   if ( !myWinVis.contains( modName ) )
3174     return;
3175
3176   QMap<QString, bool> tbMap, dwMap;
3177   dockWindowsState( myWinVis[modName], tbMap, dwMap );
3178
3179   QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
3180   for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
3181   {
3182     QToolBar* tb = *tit;
3183
3184     QObject* po = Qtx::findParent( tb, "QMainWindow" );
3185     if ( po != desktop() )
3186       continue;
3187
3188     if ( tbMap.contains( tb->objectName() ) )
3189       tb->setVisible( tbMap[tb->objectName()] );
3190   }
3191
3192   QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
3193   for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
3194   {
3195     QDockWidget* dw = *dit;
3196
3197     QObject* po = Qtx::findParent( dw, "QMainWindow" );
3198     if ( po != desktop() )
3199       continue;
3200
3201     if ( dwMap.contains( dw->objectName() ) )
3202       dw->setVisible( dwMap[dw->objectName()] );
3203   }
3204 }
3205
3206 /*!
3207   Saves windows geometry
3208 */
3209 void LightApp_Application::saveDockWindowsState()
3210 {
3211   if ( !desktop() )
3212     return;
3213
3214   bool store = resourceMgr()->booleanValue( "Study", "store_positions", true );
3215   if( !store )
3216     return;
3217
3218   QString modName;
3219   if ( activeModule() )
3220     modName = activeModule()->name();
3221
3222   myWinGeom.insert( modName, desktop()->saveState() );
3223
3224   QByteArray visArr;
3225   if ( myWinVis.contains( modName ) )
3226     visArr = myWinVis[modName];
3227
3228   QMap<QString, bool> tbMap, dwMap;
3229   dockWindowsState( visArr, tbMap, dwMap );
3230
3231   QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
3232   for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
3233   {
3234     QToolBar* tb = *it;
3235     tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
3236   }
3237
3238   QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
3239   for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
3240   {
3241     QDockWidget* wid = *it;
3242     dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
3243   }
3244
3245   visArr = dockWindowsState( tbMap, dwMap );
3246
3247   myWinVis.insert( modName, visArr );
3248 }
3249
3250 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
3251 {
3252   QByteArray visArr;
3253   QDataStream stream( &visArr, QIODevice::WriteOnly );
3254
3255   stream << (uchar)ToolBarMarker;
3256   stream << tb.size();
3257   for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
3258   {
3259     stream << tit.key();
3260     stream << (uchar)( tit.value() ? 1 : 0 );
3261   }
3262
3263   stream << (uchar)DockWidgetMarker;
3264   stream << dw.size();
3265   for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
3266   {
3267     stream << wit.key();
3268     stream << (uchar)( wit.value() ? 1 : 0 );
3269   }
3270
3271   return visArr;
3272 }
3273
3274 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
3275 {
3276   tb.clear();
3277   dw.clear();
3278
3279   QByteArray visArr = arr;
3280   QDataStream stream( &visArr, QIODevice::ReadOnly );
3281
3282   uchar marker;
3283   stream >> marker;
3284   if ( marker != ToolBarMarker )
3285     return;
3286
3287   int lines;
3288   stream >> lines;
3289   for ( int i = 0; i < lines; ++i )
3290   {
3291     QString objectName;
3292     stream >> objectName;
3293     uchar shown;
3294     stream >> shown;
3295     tb.insert( objectName, shown );
3296   }
3297
3298   stream >> marker;
3299   if ( marker != DockWidgetMarker )
3300     return;
3301
3302   stream >> lines;
3303   for ( int j = 0; j < lines; ++j )
3304   {
3305     QString objectName;
3306     stream >> objectName;
3307     uchar shown;
3308     stream >> shown;
3309     dw.insert( objectName, shown );
3310   }
3311 }
3312
3313 /*!
3314   Adds icon names for modules
3315 */
3316 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
3317 {
3318   iconMap.clear();
3319
3320   SUIT_ResourceMgr* resMgr = resourceMgr();
3321   if ( !resMgr )
3322     return;
3323
3324   QStringList modList;
3325   modules( modList, false );
3326
3327   for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
3328   {
3329     QString modName = *it;
3330     QString modIntr = moduleName( modName );
3331     QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
3332
3333     if ( modIcon.isEmpty() )
3334       continue;
3335
3336     if ( SUIT_Tools::extension( modIcon ).isEmpty() )
3337       modIcon += QString( ".png" );
3338
3339     iconMap.insert( modName, modIcon );
3340   }
3341 }
3342
3343 /*!
3344   Inserts items in popup, which necessary for current application
3345 */
3346 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
3347 {
3348   //Add "Rename" item
3349   LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
3350   bool cacheIsOn = selMgr->isSelectionCacheEnabled();
3351   selMgr->setSelectionCacheEnabled( true );
3352
3353   SUIT_DataBrowser* ob = objectBrowser();
3354
3355   CAM_Application::contextMenuPopup( type, thePopup, title );
3356
3357   if ( ob && type == ob->popupClientType() ) {
3358     thePopup->addSeparator();
3359     QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
3360     if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
3361       a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
3362   }
3363
3364   if ( selMgr && ob ) {
3365     SALOME_ListIO selected;
3366     selMgr->selectedObjects( selected );
3367     if(selected.Extent() == 1){
3368       Handle(SALOME_InteractiveObject) anIObject = selected.First();
3369       SUIT_DataObject* obj = findObject(anIObject->getEntry());
3370       if(obj && obj->renameAllowed()) {
3371         QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
3372         connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
3373         if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
3374           a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
3375
3376         QList<QAction*> acts = thePopup->actions();
3377         QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
3378         thePopup->insertAction(firstAction,a);
3379       }
3380     }
3381   }
3382
3383   selMgr->setSelectionCacheEnabled( cacheIsOn );
3384 }
3385
3386 /*!
3387   Create empty study
3388 */
3389 void LightApp_Application::createEmptyStudy()
3390 {
3391   CAM_Application::createEmptyStudy();
3392
3393   if ( objectBrowser() )
3394     objectBrowser()->updateTree();
3395
3396   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3397   if ( aResMgr && activeStudy() ) {
3398     int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
3399     if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3400   }
3401 }
3402
3403 /*!Set desktop:*/
3404 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
3405 {
3406   CAM_Application::setDesktop( desk );
3407
3408   if ( desk ) {
3409     connect( desk, SIGNAL( message( const QString& ) ),
3410              this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
3411   }
3412 }
3413
3414 /*!
3415   Activates module
3416   \param mod - module to be activated
3417 */
3418 bool LightApp_Application::activateModule( CAM_Module* mod )
3419 {
3420   bool res = CAM_Application::activateModule( mod );
3421
3422   if ( objectBrowser() )
3423     objectBrowser()->updateTree();
3424
3425   return res;
3426 }
3427
3428 /*!
3429   \return keyborad accelerators manager object
3430 */
3431 SUIT_Accel* LightApp_Application::accel() const
3432 {
3433   return myAccel;
3434 }
3435
3436 /*!
3437   Removes dead widget container from map
3438 */
3439 void LightApp_Application::onWCDestroyed( QObject* ob )
3440 {
3441   // remove destroyed widget container from windows map
3442   for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
3443   {
3444     if ( itr.value() != ob )
3445       continue;
3446
3447     int key = itr.key();
3448     myWin.remove( key );
3449     break;
3450   }
3451 }
3452
3453 void LightApp_Application::onMRUActivated( const QString& name )
3454 {
3455   SUIT_Session* s = SUIT_Session::session();
3456   if ( s && s->activeApplication() == this )
3457     onOpenDoc( name );
3458 }
3459
3460 void LightApp_Application::onStylePreferences()
3461 {
3462   Style_PrefDlg dlg( desktop() );
3463   dlg.exec();
3464
3465   resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
3466 }
3467
3468 void LightApp_Application::onFullScreen(){
3469   if(myScreenHelper) {
3470     if(desktop()->isFullScreen())
3471       myScreenHelper->switchToNormalScreen();
3472     else
3473       myScreenHelper->switchToFullScreen();
3474   }
3475 }
3476
3477 /*!
3478   Connects just added view manager
3479 */
3480 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
3481 {
3482   connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
3483            this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
3484   CAM_Application::addViewManager( vm );
3485 }
3486
3487 /*!
3488   Remove view manager from memory
3489 */
3490 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
3491 {
3492   disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
3493            this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
3494   LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
3495   if (aStudy )
3496     aStudy->removeViewMgr(vm->getGlobalId());
3497
3498   CAM_Application::removeViewManager( vm );
3499
3500   LightApp_SelectionMgr* selMgr = selectionMgr();
3501   QList<SUIT_Selector*> selectors;
3502   selMgr->selectors( selectors );
3503   foreach( SUIT_Selector* selector, selectors ) {
3504     if ( selector->owner() == vm->getViewModel() ) {
3505       delete selector;
3506     }
3507   }
3508
3509   // IPAL22894: Crash on closing OCC view
3510   //delete vm;
3511   vm->deleteLater();
3512 }
3513
3514 /*!
3515   Renames active window of desktop
3516 */
3517 void LightApp_Application::onRenameWindow()
3518 {
3519   if( !desktop() )
3520     return;
3521
3522   QWidget* w = desktop()->activeWindow();
3523   if( !w )
3524     return;
3525
3526   bool ok;
3527   QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
3528   if( ok && !name.isEmpty() )
3529     w->setWindowTitle( name );
3530 }
3531
3532 /*!
3533   Closes active window of desktop
3534 */
3535 void LightApp_Application::onCloseWindow()
3536 {
3537   if( !desktop() )
3538     return;
3539
3540   QWidget* w = desktop()->activeWindow();
3541   if( !w )
3542     return;
3543
3544   w->close();
3545 }
3546
3547 /*!
3548   Closes all windows of desktop
3549 */
3550 void LightApp_Application::onCloseAllWindow()
3551 {
3552   STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
3553   if( !desk )
3554     return;
3555
3556   QList<SUIT_ViewWindow*> wndList = desk->windows();
3557   SUIT_ViewWindow* wnd;
3558   foreach( wnd, wndList )
3559   {
3560     if ( wnd )
3561       wnd->close();
3562   }
3563 }
3564
3565 /*!
3566   Groups all windows of desktop
3567 */
3568 void LightApp_Application::onGroupAllWindow()
3569 {
3570   STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
3571   if( !desk )
3572     return;
3573
3574   QtxWorkstack* wgStack = desk->workstack();
3575   if ( wgStack )
3576     wgStack->stack();
3577 }
3578
3579 /*!
3580   \return if the library of module exists
3581   \param moduleTitle - title of module
3582 */
3583 bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
3584 {
3585   if( moduleTitle.isEmpty() )
3586     return false;
3587
3588   QString lib = moduleLibrary( moduleTitle );
3589
3590   //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
3591   bool isPythonModule = lib.contains("SalomePyQtGUI");
3592   bool isPythonLightModule = lib.contains("SalomePyQtGUILight");
3593
3594   QStringList paths;
3595 #ifdef WIN32
3596   paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
3597 #else
3598   paths = QString(::getenv( "LD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
3599 #endif
3600
3601   bool isLibFound = false;
3602   QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
3603   for( ; anIt!=aLast; anIt++ )
3604   {
3605     QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
3606
3607     if( inf.exists() )
3608       {
3609         isLibFound = true;
3610         break;
3611       }
3612   }
3613
3614   if ( !isLibFound )
3615     {
3616       INFOS( "****************************************************************" << std::endl
3617           << "*    Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
3618           << "*    Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
3619           << "****************************************************************" << std::endl );
3620     }
3621   else if ( !isPythonModule && !isPythonLightModule)
3622     return true;
3623
3624   if ( isPythonModule || isPythonLightModule)
3625     {
3626       QString pylib = moduleName( moduleTitle ) + QString(".py");
3627       QString pylibgui = moduleName( moduleTitle ) + QString("GUI.py");
3628
3629       // Check the python library
3630 // #ifdef WIN32
3631 //       paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
3632 // #else
3633       paths = QString(::getenv( "PYTHONPATH" )).split( ":", QString::SkipEmptyParts );
3634 // #endif
3635       bool isPyLib = false, isPyGuiLib = false;
3636       QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
3637       for( ; anIt!=aLast; anIt++ )
3638         {
3639           QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
3640           QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
3641
3642           if(!isPythonLightModule)
3643             if( !isPyLib && inf.exists() )
3644               isPyLib = true;
3645
3646           if( !isPyGuiLib && infgui.exists() )
3647             isPyGuiLib = true;
3648
3649           if ((isPyLib || isPythonLightModule ) && isPyGuiLib && isLibFound)
3650             return true;
3651         }
3652
3653       printf( "****************************************************************\n" );
3654       printf( "*    Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
3655       if (!isPyLib)
3656         printf( "*    No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
3657       if (!isPyGuiLib)
3658         printf( "*    No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).toLatin1().constData() );
3659       printf( "****************************************************************\n" );
3660       return true;
3661   }
3662   return false;
3663 }
3664
3665 /*!
3666   \return default name for an active study
3667 */
3668 void LightApp_Application::setDefaultStudyName( const QString& theName )
3669 {
3670   QStringList anInfoList;
3671   modules( anInfoList, false );
3672
3673   LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
3674   if( anInfoList.count() == 1 && // to avoid a conflict between different modules
3675       !aStudy->isSaved() )
3676   {
3677     aStudy->setStudyName( theName );
3678     updateDesktopTitle();
3679   }
3680 }
3681
3682 /*!
3683   Custom event handler
3684 */
3685 bool LightApp_Application::event( QEvent* e )
3686 {
3687   if( e && e->type()==2000 )
3688   {
3689     SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
3690     QString* d = ( QString* )ce->data();
3691     if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
3692                                   d ? *d : "",
3693                                   SUIT_MessageBox::Yes | SUIT_MessageBox::No,
3694                                   SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
3695       showPreferences( tr( "PREF_APP" ) );
3696     if( d )
3697       delete d;
3698     return true;
3699   }
3700   return CAM_Application::event( e );
3701 }
3702
3703 /*! Check data object */
3704 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
3705 {
3706   if (theObj)
3707     {
3708       bool isSuitable = !theObj->entry().isEmpty() &&
3709                         !theObj->componentDataType().isEmpty() &&
3710                         !theObj->name().isEmpty();
3711       return isSuitable;
3712     }
3713
3714   return false;
3715 }
3716
3717 int LightApp_Application::openChoice( const QString& aName )
3718 {
3719   int choice = CAM_Application::openChoice( aName );
3720
3721   if ( choice == OpenExist ) // The document is already open.
3722   {
3723     // Do you want to reload it?
3724     if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
3725                                     SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
3726       choice = OpenReload;
3727   }
3728
3729   return choice;
3730 }
3731
3732 bool LightApp_Application::openAction( const int choice, const QString& aName )
3733 {
3734   bool res = false;
3735   switch ( choice )
3736   {
3737   case OpenReload:
3738     {
3739       STD_Application* app = 0;
3740       SUIT_Session* session = SUIT_Session::session();
3741       QList<SUIT_Application*> appList = session->applications();
3742       for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
3743       {
3744         if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
3745           app = ::qobject_cast<STD_Application*>( *it );
3746       }
3747
3748       if ( app )
3749       {
3750         app->onCloseDoc( false );
3751         appList = session->applications();
3752         STD_Application* other = 0;
3753         for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
3754           other = ::qobject_cast<STD_Application*>( *it );
3755
3756         if ( other )
3757           res = other->onOpenDoc( aName );
3758       }
3759     }
3760     break;
3761   default:
3762     res = CAM_Application::openAction( choice, aName );
3763     break;
3764   }
3765
3766   return res;
3767 }
3768
3769 QStringList LightApp_Application::viewManagersTypes() const
3770 {
3771   QStringList aTypesList;
3772   aTypesList += myUserWmTypes;
3773 #ifndef DISABLE_GLVIEWER
3774   aTypesList<<GLViewer_Viewer::Type();
3775 #endif
3776 #ifndef DISABLE_PLOT2DVIEWER
3777   aTypesList<<Plot2d_Viewer::Type();
3778 #endif
3779 #ifndef DISABLE_QXGRAPHVIEWER
3780   aTypesList<<QxScene_Viewer::Type();
3781 #endif
3782 #ifndef DISABLE_OCCVIEWER
3783   aTypesList<<OCCViewer_Viewer::Type();
3784 #endif
3785 #ifndef DISABLE_VTKVIEWER
3786  #ifndef DISABLE_SALOMEOBJECT
3787   aTypesList<<SVTK_Viewer::Type();
3788  #else
3789   aTypesList<<VTKViewer_Viewer::Type();
3790  #endif
3791 #endif
3792   return aTypesList;
3793 }
3794 /*!
3795  * Removes all view managers of known types
3796  * Other view managers are ignored
3797  */
3798 void LightApp_Application::clearKnownViewManagers()
3799 {
3800   QStringList aTypesList = viewManagersTypes();
3801   QList<SUIT_ViewManager*> aMgrList;
3802   viewManagers( aMgrList );
3803   foreach (SUIT_ViewManager* aMgr, aMgrList) {
3804     if (aTypesList.contains(aMgr->getType()))
3805       removeViewManager(aMgr);
3806   }
3807 }
3808
3809 /*!
3810   Copy of current selection
3811  */
3812 void LightApp_Application::onCopy()
3813 {
3814   LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
3815   if( m )
3816     m->copy();
3817 }
3818
3819 /*!
3820   Paste of current data in clipboard
3821  */
3822 void LightApp_Application::onPaste()
3823 {
3824   LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
3825   if( m )
3826     m->paste();
3827 }
3828
3829 /*!
3830   Browse (i.e. set focus on) the published objects
3831   \param theIsApplyAndClose - flag indicating that the dialog for creating objects
3832                               has been accepted by Ok (or Apply & Close) button
3833   \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
3834                                   (to select the first published object only)
3835   \return entry of the selected object
3836  */
3837 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
3838                                              const bool theIsApplyAndClose,
3839                                              const bool theIsOptimizedBrowsing )
3840 {
3841   QString aResult;
3842   if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
3843   {
3844     int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
3845     switch( aBrowsePolicy )
3846     {
3847       case BP_Never:
3848         return aResult;
3849       case BP_ApplyAndClose:
3850         if( !theIsApplyAndClose )
3851           return aResult;
3852       case BP_Always:
3853       default:
3854         break;
3855     }
3856   }
3857
3858   LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
3859   if( !aStudy )
3860     return aResult;
3861
3862   SUIT_DataBrowser* anOB = objectBrowser();
3863   if( !anOB )
3864     return aResult;
3865
3866   SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
3867   if( !aModel )
3868     return aResult;
3869
3870   QStringListIterator anIter( theEntryList );
3871   if( theIsOptimizedBrowsing )
3872   {
3873     // go to the last entry
3874     anIter.toBack();
3875     if( anIter.hasPrevious() )
3876       anIter.previous();
3877   }
3878
3879   // scroll to each entry in the list
3880   // (in optimized mode - to the last entry only)
3881   QString anEntry;
3882   LightApp_DataObject* anObject = 0;
3883   while( anIter.hasNext() )
3884   {
3885     anEntry = anIter.next();
3886     if( !anEntry.isEmpty() )
3887     {
3888       anObject = aStudy->findObjectByEntry( anEntry );
3889       if( anObject )
3890       {
3891         QModelIndex anIndex = aModel->index( anObject );
3892         anOB->treeView()->scrollTo( anIndex );
3893       }
3894     }
3895   }
3896
3897   // always select the last object
3898   if( anObject && !anEntry.isEmpty() )
3899   {
3900     QList<SUIT_Selector*> aSelectorList;
3901     selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
3902     if( !aSelectorList.isEmpty() )
3903     {
3904       if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
3905       {
3906         bool anIsAutoBlock = aSelector->autoBlock();
3907
3908         // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
3909         aSelector->setAutoBlock( false );
3910
3911         SUIT_DataOwnerPtrList aList;
3912 #ifndef DISABLE_SALOMEOBJECT
3913         Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
3914           ( anObject->entry().toLatin1().constData(),
3915             anObject->componentDataType().toLatin1().constData(),
3916             anObject->name().toLatin1().constData() );
3917         LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj  );
3918 #else
3919         LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
3920 #endif
3921
3922         aList.append( owner );
3923         selectionMgr()->setSelected( aList );
3924         aResult = anEntry;
3925
3926         // restore auto block flag
3927         aSelector->setAutoBlock( anIsAutoBlock );
3928       }
3929     }
3930   }
3931
3932   return aResult;
3933 }
3934
3935 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
3936 {
3937   LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
3938   return study ? study->findObjectByEntry( id ) : 0;
3939 }
3940
3941 /*!
3942   Checks that an object can be renamed.
3943   \param entry entry of the object
3944   \brief Return \c true if object can be renamed
3945 */
3946 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
3947   return false;
3948 }
3949
3950 /*!
3951   Rename object by entry.
3952   \param entry entry of the object
3953   \param name new name of the object
3954   \brief Return \c true if rename operation finished successfully, \c false otherwise.
3955 */
3956 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
3957   return false;
3958 }
3959
3960 /*! Process standard messages from desktop */
3961 void LightApp_Application::onDesktopMessage( const QString& message )
3962 {
3963   const QString sectionSeparator = "/";
3964
3965   if ( message.toLower() == "updateobjectbrowser" ||
3966        message.toLower() == "updateobjbrowser" ) {
3967     // update object browser
3968     updateObjectBrowser();
3969   }
3970   else {
3971     QStringList data = message.split( sectionSeparator );
3972     if ( data.count() > 1 ) {
3973       QString msgType = data[0].trimmed();
3974       LightApp_Module* sMod = 0;
3975       CAM_Module* mod = module( msgType );
3976       if ( !mod )
3977         mod = module( moduleTitle( msgType ) );
3978       if ( mod && mod->inherits( "LightApp_Module" ) )
3979         sMod = (LightApp_Module*)mod;
3980
3981       if ( msgType.toLower() == "preferences" ) {
3982         // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
3983         // for example "preferences/Study/multi_file_dump/true"
3984         if ( data.count() > 3 ) {
3985           QString section = data[1].trimmed();
3986           QString param   = data[2].trimmed();
3987           QString value   = QStringList( data.mid(3) ).join( sectionSeparator );
3988           resourceMgr()->setValue( section, param, value );
3989         }
3990       }
3991       else if ( sMod ) {
3992         // received message for the module
3993         QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
3994         sMod->message( msg );
3995       }
3996     }
3997   }
3998 }