]> SALOME platform Git repositories - modules/gui.git/blob - src/LightApp/LightApp_Application.cxx
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     vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
1469     vm->enableSelection(    resMgr->booleanValue( "OCCViewer", "enable_selection",    vm->isSelectionEnabled() ) );
1470
1471     viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1472     new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
1473   }
1474 #endif
1475 #ifndef DISABLE_VTKVIEWER
1476 #ifndef DISABLE_SALOMEOBJECT
1477   if ( vmType == SVTK_Viewer::Type() )
1478 #else
1479   if ( vmType == VTKViewer_Viewer::Type() )
1480 #endif
1481   {
1482 #ifndef DISABLE_SALOMEOBJECT
1483     viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
1484     SVTK_Viewer* vm = dynamic_cast<SVTK_Viewer*>( viewMgr->getViewModel() );
1485     if( vm )
1486     {
1487       vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
1488       vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1489       vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1490                             resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
1491       vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
1492       vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1493       vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1494       vm->setPreSelectionMode(resMgr->integerValue( "VTKViewer", "preselection", vm->preSelectionMode() ) );
1495       vm->enableSelection( resMgr->booleanValue( "VTKViewer", "enable_selection", vm->isSelectionEnabled() ) );
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
2278   // ... "Selection" group <<start>>
2279   int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2280   pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2281   // .... -> preselection
2282   int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ),  vtkSelectionGroup, 
2283                                              LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2284   aValuesList.clear();
2285   anIndicesList.clear();
2286   aValuesList   << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2287   anIndicesList << 0 << 1 << 2;
2288   pref->setItemProperty( "strings", aValuesList,   vtkPreselection );
2289   pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2290   // .... -> enable selection
2291   pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2292   // ... "Selection" group <<end>>
2293
2294   // ... -> empty frame (for layout) <<end>>
2295
2296   // ... space mouse sub-group <<start>>
2297   int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2298   //pref->setItemProperty( "columns", 2, vtkSM );
2299   // .... -> decrease speed increment
2300   int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2301                                              LightApp_Preferences::Selector, "VTKViewer",
2302                                              "spacemouse_func1_btn" );
2303   // .... -> increase speed increment
2304   int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2305                                              LightApp_Preferences::Selector, "VTKViewer",
2306                                              "spacemouse_func2_btn" );
2307   // .... -> dominant / combined switch  
2308   int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2309                                              LightApp_Preferences::Selector, "VTKViewer",
2310                                              "spacemouse_func5_btn" ); //
2311   aValuesList.clear();
2312   anIndicesList.clear();
2313   aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" )  << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2314   aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" )  << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2315   aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" )  << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2316   aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2317   anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2318   pref->setItemProperty( "strings", aValuesList,   spacemousePref1 );
2319   pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2320   pref->setItemProperty( "strings", aValuesList,   spacemousePref2 );
2321   pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2322   pref->setItemProperty( "strings", aValuesList,   spacemousePref3 );
2323   pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2324   // ... space mouse sub-group <<end>>
2325
2326   // ... avi recording sub-group <<start>>
2327   int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2328   pref->setItemProperty( "columns", 2, vtkRec );
2329   // .... -> recording mode
2330   int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2331                                       LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2332   aValuesList.clear();
2333   anIndicesList.clear();
2334   aValuesList   << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2335   anIndicesList << 0                           << 1;
2336   pref->setItemProperty( "strings", aValuesList,   modePref );
2337   pref->setItemProperty( "indexes", anIndicesList, modePref );
2338   // .... -> fps
2339   int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2340                                      LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2341   pref->setItemProperty( "min", 0.1, fpsPref );
2342   pref->setItemProperty( "max", 100, fpsPref );
2343   // .... -> quality
2344   int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2345                                          LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2346   pref->setItemProperty( "min", 1, qualityPref );
2347   pref->setItemProperty( "max", 100, qualityPref );
2348   // .... -> progressive mode
2349   pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2350                        LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2351   // ... avi recording sub-group <<end>>
2352
2353   // ... group names sub-group <<start>>
2354   int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2355                                    LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2356   pref->setItemProperty( "columns", 2, vtkGN );
2357   // .... -> text color
2358   pref->addPreference( tr(  "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2359                        LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2360   // .... -> transparency
2361   int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2362                                        LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2363   pref->setItemProperty( "min", 0.0, transPref );
2364   pref->setItemProperty( "max", 1.0, transPref );
2365   pref->setItemProperty( "step", 0.1, transPref );
2366   // ... -> group names sub-group <<end>>
2367   // .. "VTK viewer" group <<end>>
2368
2369   // .. "Plot2d viewer" group <<start>>
2370   int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2371   //pref->setItemProperty( "columns", 2, plot2dGroup );
2372
2373   // ... -> show legend
2374   pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dGroup,
2375                        LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2376   // ... -> legend position
2377   int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dGroup,
2378                                             LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2379   aValuesList.clear();
2380   anIndicesList.clear();
2381   aValuesList   << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2382   anIndicesList << 0               << 1                << 2              << 3                ;
2383   pref->setItemProperty( "strings", aValuesList,   legendPosition );
2384   pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2385   // ... -> legend font
2386   pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2387   // ... -> curve type
2388   int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dGroup,
2389                                        LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2390   aValuesList.clear();
2391   anIndicesList.clear();
2392   aValuesList   << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2393   anIndicesList << 0                 << 1                << 2                ;
2394   pref->setItemProperty( "strings", aValuesList,   curveType );
2395   pref->setItemProperty( "indexes", anIndicesList, curveType );
2396   // ... -> marker size
2397   int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dGroup,
2398                                         LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2399   pref->setItemProperty( "min", 0, markerSize );
2400   pref->setItemProperty( "max", 100, markerSize );
2401   // ... -> horizontal scaling mode
2402   int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dGroup,
2403                                       LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2404   aValuesList.clear();
2405   anIndicesList.clear();
2406   aValuesList   << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2407   anIndicesList << 0                 << 1                     ;
2408   pref->setItemProperty( "strings", aValuesList,   horScale );
2409   pref->setItemProperty( "indexes", anIndicesList, horScale );
2410   // ... -> vertical scaling mode
2411   int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dGroup,
2412                                       LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2413   pref->setItemProperty( "strings", aValuesList,   verScale );
2414   pref->setItemProperty( "indexes", anIndicesList, verScale );
2415   // ... -> background
2416   pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2417                        LightApp_Preferences::Color, "Plot2d", "Background" );
2418   // ... -> font color
2419   pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2420   // ... -> selection font color
2421   pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2422   // ... -> selection color
2423   pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2424                        LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2425   // ... -> errors/deviation colot
2426   pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dGroup,
2427                        LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2428   // ... -> deviation markers line size
2429   int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dGroup,
2430                                         LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2431   pref->setItemProperty( "min", 1, deviationMarkerLw );
2432   pref->setItemProperty( "max", 5, deviationMarkerLw );
2433   // ... -> deviation markers tick mark size
2434   int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dGroup,
2435                                         LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2436   pref->setItemProperty( "min", 1, deviationMarkerTs );
2437   pref->setItemProperty( "max", 5, deviationMarkerTs );
2438   // .. "Plot2d viewer" group <<end>>
2439
2440   // .. "Directories" preferences tab <<start>>
2441   int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2442   // ... --> quick directories list
2443   int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2444   pref->addPreference( tr( "" ), dirGroup,
2445                        LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2446   // .. "Directories" preferences tab <<end>>
2447
2448   // .. "Object browser" preferences tab <<start>>
2449   int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2450
2451   // ... "Search tool" group <<start>>
2452   int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2453   // .... --> auto-hide
2454   pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2455                        "ObjectBrowser", "auto_hide_search_tool" );
2456   // ... "Search tool" group <<end>>
2457
2458   // ... "Object browser settings" group <<start>>
2459   int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2460   pref->setItemProperty( "columns", 2, objSetGroup );
2461   // .... -> auto size first column
2462   pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2463                        "ObjectBrowser", "auto_size_first" );
2464   // .... -> auto size other columns
2465   pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2466                        "ObjectBrowser", "auto_size" );
2467   // .... -> resize columns on expand item
2468   pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2469                        "ObjectBrowser", "resize_on_expand_item" );
2470   // .... -> browse to published object
2471   int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
2472                                              "ObjectBrowser", "browse_published_object" );
2473   aValuesList.clear();
2474   anIndicesList.clear();
2475   aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
2476   anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
2477   pref->setItemProperty( "strings", aValuesList,   browsePublished );
2478   pref->setItemProperty( "indexes", anIndicesList, browsePublished );
2479   // ... "Object browser settings" group <<end>>
2480   // .. "Object browser" preferences tab <<end>>
2481
2482   // .. "Shortcuts" preferences tab <<start>>
2483   int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
2484   // ... "Shortcuts settings" group <<start>>
2485   int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
2486   pref->addPreference( tr( "" ), shortcutGroup,
2487                        LightApp_Preferences::ShortcutTree, "shortcuts" );
2488   // ... "Shortcuts settings" group <<end>>
2489   // .. "Shortcuts" preferences tab <<end>>
2490   // . Top-level "SALOME" preferences group <<end>>
2491
2492   pref->retrieve();
2493 }
2494
2495 /*!
2496   Changes appearance of application according to changed preferences
2497   \param sec - section
2498   \param param - name of changed parameter
2499 */
2500 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
2501 {
2502   SUIT_ResourceMgr* resMgr = resourceMgr();
2503   if ( !resMgr )
2504     return;
2505
2506   if ( sec == "viewers" && param == "drop_down_buttons" )
2507   {
2508     ViewManagerList vmlist = viewManagers();
2509     foreach( SUIT_ViewManager* vm, vmlist )
2510     {
2511       QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
2512       foreach( SUIT_ViewWindow* vw, vwlist )
2513         if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
2514     }
2515   }
2516
2517   if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
2518   {
2519     double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
2520     bool relative = resMgr->booleanValue( sec, "relative_size", true );
2521     QList<SUIT_ViewManager*> lst;
2522 #ifndef DISABLE_OCCVIEWER
2523     viewManagers( OCCViewer_Viewer::Type(), lst );
2524     QListIterator<SUIT_ViewManager*> itOCC( lst );
2525     while ( itOCC.hasNext() && sz >= 0 )
2526     {
2527       SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2528       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2529         continue;
2530
2531       OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2532       occVM->setTrihedronSize( sz, relative );
2533       occVM->getAISContext()->UpdateCurrentViewer();
2534     }
2535 #endif
2536 #ifndef DISABLE_VTKVIEWER
2537 #ifndef DISABLE_SALOMEOBJECT
2538     viewManagers( SVTK_Viewer::Type(), lst );
2539     QListIterator<SUIT_ViewManager*> itVTK( lst );
2540     while ( itVTK.hasNext() && sz >= 0 )
2541     {
2542       SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2543       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2544         continue;
2545
2546       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2547       if( vtkVM )
2548       {
2549         vtkVM->setTrihedronSize( sz, relative );
2550         vtkVM->Repaint();
2551       }
2552     }
2553 #endif
2554 #endif
2555   }
2556
2557   if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
2558   {
2559     bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
2560     QList<SUIT_ViewManager*> lst;
2561 #ifndef DISABLE_OCCVIEWER
2562     viewManagers( OCCViewer_Viewer::Type(), lst );
2563     QListIterator<SUIT_ViewManager*> itOCC( lst );
2564     while ( itOCC.hasNext() )
2565     {
2566       SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2567       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2568         continue;
2569
2570       OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
2571       if( occVM )
2572       {
2573         occVM->setStaticTrihedronDisplayed( isVisible );
2574       }
2575     }
2576 #endif
2577 #ifndef DISABLE_VTKVIEWER
2578 #ifndef DISABLE_SALOMEOBJECT
2579     viewManagers( SVTK_Viewer::Type(), lst );
2580     QListIterator<SUIT_ViewManager*> itVTK( lst );
2581     while ( itVTK.hasNext() )
2582     {
2583       SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2584       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2585         continue;
2586
2587       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2588       if( vtkVM )
2589       {
2590         vtkVM->setStaticTrihedronVisible( isVisible );
2591         vtkVM->Repaint();
2592       }
2593     }
2594 #endif
2595 #endif
2596   }
2597
2598   if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
2599   {
2600     int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
2601     QList<SUIT_ViewManager*> lst;
2602 #ifndef DISABLE_OCCVIEWER
2603     viewManagers( OCCViewer_Viewer::Type(), lst );
2604     QListIterator<SUIT_ViewManager*> itOCC( lst );
2605     while ( itOCC.hasNext() )
2606     {
2607       SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2608       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2609         continue;
2610
2611       OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2612       occVM->setInteractionStyle( mode );
2613     }
2614 #endif
2615 #ifndef DISABLE_VTKVIEWER
2616 #ifndef DISABLE_SALOMEOBJECT
2617     viewManagers( SVTK_Viewer::Type(), lst );
2618     QListIterator<SUIT_ViewManager*> itVTK( lst );
2619     while ( itVTK.hasNext() )
2620     {
2621       SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2622       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2623         continue;
2624
2625       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2626       if( vtkVM ) vtkVM->setInteractionStyle( mode );
2627     }
2628 #endif
2629 #endif
2630   }
2631
2632 #ifndef DISABLE_OCCVIEWER
2633   if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
2634   {
2635     bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
2636     QList<SUIT_ViewManager*> lst;
2637     viewManagers( OCCViewer_Viewer::Type(), lst );
2638     QListIterator<SUIT_ViewManager*> it( lst );
2639     while ( it.hasNext() )
2640     {
2641       SUIT_ViewModel* vm = it.next()->getViewModel();
2642       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2643         continue;
2644
2645       OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2646       occVM->enablePreselection( isToEnablePreselection );
2647     }
2648   }
2649 #endif
2650
2651 #ifndef DISABLE_OCCVIEWER
2652   if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
2653   {
2654     bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
2655     QList<SUIT_ViewManager*> lst;
2656     viewManagers( OCCViewer_Viewer::Type(), lst );
2657     QListIterator<SUIT_ViewManager*> it( lst );
2658     while ( it.hasNext() )
2659     {
2660       SUIT_ViewModel* vm = it.next()->getViewModel();
2661       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2662         continue;
2663
2664       OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2665       occVM->enableSelection( isToEnableSelection );
2666     }
2667   }
2668 #endif
2669
2670   if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
2671   {
2672     int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
2673     QList<SUIT_ViewManager*> lst;
2674 #ifndef DISABLE_OCCVIEWER
2675     viewManagers( OCCViewer_Viewer::Type(), lst );
2676     QListIterator<SUIT_ViewManager*> itOCC( lst );
2677     while ( itOCC.hasNext() )
2678     {
2679       SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2680       if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2681         continue;
2682
2683       OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2684       occVM->setZoomingStyle( mode );
2685     }
2686 #endif
2687 #ifndef DISABLE_VTKVIEWER
2688 #ifndef DISABLE_SALOMEOBJECT
2689     viewManagers( SVTK_Viewer::Type(), lst );
2690     QListIterator<SUIT_ViewManager*> itVTK( lst );
2691     while ( itVTK.hasNext() )
2692     {
2693       SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2694       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2695         continue;
2696
2697       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2698       if( vtkVM ) vtkVM->setZoomingStyle( mode );
2699     }
2700 #endif
2701 #endif
2702   }
2703
2704 #ifndef DISABLE_VTKVIEWER
2705   if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
2706   {
2707     int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
2708     int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
2709     QList<SUIT_ViewManager*> lst;
2710 #ifndef DISABLE_SALOMEOBJECT
2711     viewManagers( SVTK_Viewer::Type(), lst );
2712     QListIterator<SUIT_ViewManager*> it( lst );
2713     while ( it.hasNext() )
2714     {
2715       SUIT_ViewModel* vm = it.next()->getViewModel();
2716       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2717         continue;
2718
2719       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2720       if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
2721     }
2722 #endif
2723   }
2724 #endif
2725
2726 #ifndef DISABLE_VTKVIEWER
2727   if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
2728   {
2729     int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
2730     QList<SUIT_ViewManager*> lst;
2731 #ifndef DISABLE_SALOMEOBJECT
2732     viewManagers( SVTK_Viewer::Type(), lst );
2733     QListIterator<SUIT_ViewManager*> it( lst );
2734     while ( it.hasNext() )
2735     {
2736       SUIT_ViewModel* vm = it.next()->getViewModel();
2737       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2738         continue;
2739
2740       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2741       if( vtkVM ) vtkVM->setProjectionMode( mode );
2742     }
2743 #endif
2744   }
2745 #endif
2746
2747 #ifndef DISABLE_VTKVIEWER
2748   if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
2749   {
2750     int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
2751     QList<SUIT_ViewManager*> lst;
2752 #ifndef DISABLE_SALOMEOBJECT
2753     viewManagers( SVTK_Viewer::Type(), lst );
2754     QListIterator<SUIT_ViewManager*> it( lst );
2755     while ( it.hasNext() )
2756     {
2757       SUIT_ViewModel* vm = it.next()->getViewModel();
2758       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2759         continue;
2760
2761       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2762       if( vtkVM ) vtkVM->setPreSelectionMode( mode );
2763     }
2764 #endif
2765   }
2766 #endif
2767
2768 #ifndef DISABLE_VTKVIEWER
2769   if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
2770   {
2771     bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
2772     QList<SUIT_ViewManager*> lst;
2773 #ifndef DISABLE_SALOMEOBJECT
2774     viewManagers( SVTK_Viewer::Type(), lst );
2775     QListIterator<SUIT_ViewManager*> it( lst );
2776     while ( it.hasNext() )
2777     {
2778       SUIT_ViewModel* vm = it.next()->getViewModel();
2779       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2780         continue;
2781
2782       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2783       if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
2784     }
2785 #endif
2786   }
2787 #endif
2788
2789 #ifndef DISABLE_VTKVIEWER
2790   if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
2791                                          param == QString( "spacemouse_func2_btn" ) ||
2792                                          param == QString( "spacemouse_func5_btn" ) ) )
2793   {
2794     int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
2795     int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
2796     int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
2797     QList<SUIT_ViewManager*> lst;
2798 #ifndef DISABLE_SALOMEOBJECT
2799     viewManagers( SVTK_Viewer::Type(), lst );
2800     QListIterator<SUIT_ViewManager*> it( lst );
2801     while ( it.hasNext() )
2802     {
2803       SUIT_ViewModel* vm = it.next()->getViewModel();
2804       if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2805         continue;
2806
2807       SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2808       if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
2809     }
2810 #endif
2811   }
2812 #endif
2813   if( sec=="ObjectBrowser" )
2814   {
2815     SUIT_DataBrowser* ob = objectBrowser();
2816     if ( !ob )
2817       return;
2818
2819     if ( param=="auto_size_first" )
2820     {
2821       bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
2822       ob->setAutoSizeFirstColumn( autoSizeFirst );
2823       if ( autoSizeFirst )
2824         ob->adjustFirstColumnWidth();
2825     }
2826     else if ( param=="auto_size" ) {
2827       bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
2828       ob->setAutoSizeColumns(autoSize);
2829       if ( autoSize )
2830         ob->adjustColumnsWidth();
2831     }
2832     else if ( param=="resize_on_expand_item" ) {
2833       bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
2834       ob->setResizeOnExpandItem(resizeOnExpandItem);
2835     }
2836     else if ( param == "auto_hide_search_tool" ) {
2837       ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
2838     }
2839   }
2840
2841   if( sec=="Study" )
2842   {
2843     if( param=="store_positions" )
2844       updateWindows();
2845     if( param=="auto_save_interval" ) {
2846       myAutoSaveTimer->stop();
2847       int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
2848       if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
2849     }
2850   }
2851
2852 #ifndef DISABLE_PYCONSOLE
2853   if( sec=="PyConsole" && pythonConsole() )
2854   {
2855     if ( param=="font" ) {
2856       pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
2857     }
2858     else if ( param=="show_banner" ) {
2859       pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
2860     }
2861   }
2862 #endif
2863
2864   if( sec=="MRU" )
2865   {
2866     QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
2867     if ( mru ) {
2868       if ( param == "visible_count" )
2869         mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) );    // 5 MRU items by default
2870       else if ( param == "max_count" )
2871         mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) );       // unlimited history by default
2872       else if ( param == "insert_mode" )
2873         mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) );        // QtxMRUAction::MoveFirst by default
2874       else if ( param == "link_type" )
2875         mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) );            // QtxMRUAction::LinkAuto by default
2876       else if ( param == "show_clear" )
2877         mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) );  // do not show "Clear" item by default
2878       else if ( param == "show_mru" )
2879         mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) );          // do not show MRU menu item by default
2880     }
2881   }
2882   if ( sec == "language" && param == "language" )
2883   {
2884     SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
2885   }
2886   if ( sec == "desktop" && param == "opaque_resize" ) {
2887     bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
2888     QMainWindow::DockOptions dopts = desktop()->dockOptions();
2889     if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
2890     else                dopts &= ~QMainWindow::AnimatedDocks;
2891     desktop()->setDockOptions( dopts );
2892     desktop()->setOpaqueResize( opaqueResize );
2893     if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
2894       dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
2895   }
2896
2897   if ( sec == "ExternalBrowser" && param == "use_external_browser" ) {
2898     if ( resMgr->booleanValue("ExternalBrowser", "use_external_browser", false ) )
2899       {
2900         if(QtxWebBrowser::webBrowser())
2901           QtxWebBrowser::webBrowser()->close();
2902       }
2903   }
2904
2905 #ifndef DISABLE_PLOT2DVIEWER
2906   if ( sec == "Plot2d" ) {
2907     if( param == "SelectionColor" ) {
2908       QColor c = resMgr->colorValue( sec, param );
2909       Plot2d_Object::setSelectionColor(c);
2910     }
2911     else if (param == "SelectedLegendFontColor") {
2912       QColor c = resMgr->colorValue( sec, param );      
2913       Plot2d_Object::setHighlightedLegendTextColor(c);
2914     }
2915   }
2916 #endif
2917 }
2918
2919 /*!
2920   Loads preferences
2921 */
2922 void LightApp_Application::loadPreferences()
2923 {
2924   CAM_Application::loadPreferences();
2925
2926   SUIT_ResourceMgr* aResMgr = resourceMgr();
2927
2928   if ( !aResMgr )
2929     return;
2930
2931   static bool mru_load = true;
2932   if ( mru_load )
2933   {
2934     QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
2935     if ( mru ) {
2936       mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) );         // do not show MRU menu item by default
2937       mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) );   // 5 MRU items by default
2938       mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) );      // unlimited history by default
2939       mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) );       // QtxMRUAction::MoveFirst by default
2940       mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) );           // QtxMRUAction::LinkAuto by default
2941       mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
2942       mru->loadLinks( aResMgr, "MRU" );
2943     }
2944     mru_load = false;
2945   }
2946
2947   myWinGeom.clear();
2948   QStringList mods = aResMgr->parameters( "windows_geometry" );
2949   for ( QStringList::const_iterator it = mods.begin(); it != mods.end(); ++it )
2950   {
2951     QByteArray arr;
2952     if ( aResMgr->value( "windows_geometry", *it, arr ) )
2953       myWinGeom.insert( *it, arr );
2954   }
2955
2956   myWinVis.clear();
2957   mods = aResMgr->parameters( "windows_visibility" );
2958   for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
2959   {
2960     QByteArray arr;
2961     if ( aResMgr->value( "windows_visibility", *itr, arr ) )
2962       myWinVis.insert( *itr, arr );
2963   }
2964
2965   if ( desktop() ) {
2966     desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
2967     bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
2968     QMainWindow::DockOptions dopts = desktop()->dockOptions();
2969     if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
2970     else                dopts &= ~QMainWindow::AnimatedDocks;
2971     desktop()->setDockOptions( dopts );
2972     desktop()->setOpaqueResize( opaqueResize );
2973     if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
2974       dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
2975   }
2976 }
2977
2978 /*!
2979   Saves preferences
2980 */
2981 void LightApp_Application::savePreferences()
2982 {
2983   CAM_Application::savePreferences();
2984
2985   saveDockWindowsState();
2986
2987   SUIT_ResourceMgr* aResMgr = resourceMgr();
2988
2989   if ( !aResMgr )
2990     return;
2991
2992   QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
2993   if ( mru )
2994     mru->saveLinks( aResMgr, "MRU" );
2995
2996   for ( WinGeom::const_iterator it = myWinGeom.begin(); it != myWinGeom.end(); ++it )
2997     aResMgr->setValue( "windows_geometry", it.key(), it.value() );
2998
2999   for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3000     aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3001
3002   if ( desktop() )
3003     aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3004
3005   aResMgr->save();
3006 }
3007
3008 /*!
3009   Updates desktop title
3010 */
3011 void LightApp_Application::updateDesktopTitle()
3012 {
3013   QString aTitle = applicationName();
3014   QString aVer = applicationVersion();
3015   if ( !aVer.isEmpty() )
3016     aTitle += QString( " " ) + aVer;
3017
3018   if ( activeStudy() ) {
3019     QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3020     aTitle += QString( " - [%1]" ).arg( sName );
3021   }
3022
3023   desktop()->setWindowTitle( aTitle );
3024 }
3025
3026 /*!
3027   \brief Get map of the operations which can be performed
3028   on the module activation.
3029
3030   The method should return the map of the kind \c {<id>:<name>}
3031   where \c <id> is an integer identifier of the operation and
3032   \c <name> is a title for the button to be added to the
3033   dialog box. After user selects the required operation by the
3034   clicking the corresponding button in the dialog box, its identifier
3035   is passed to the moduleActionSelected() method to process
3036   the made choice.
3037
3038   \return map of the operations
3039   \sa moduleActionSelected()
3040 */
3041 QMap<int, QString> LightApp_Application::activateModuleActions() const
3042 {
3043   QMap<int, QString> opmap;
3044   opmap.insert( NewStudyId,  tr( "ACTIVATE_MODULE_OP_NEW" ) );
3045   opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3046   return opmap;
3047 }
3048
3049 /*!
3050   \brief Called when the used selectes required operation chosen
3051   from "Activate module" dialog box.
3052
3053   Performs the required operation according to the user choice.
3054
3055   \param id operation identifier
3056   \sa activateModuleActions()
3057 */
3058 void LightApp_Application::moduleActionSelected( const int id )
3059 {
3060   switch ( id ) {
3061   case NewStudyId:
3062     onNewDoc();
3063     break;
3064   case OpenStudyId:
3065     onOpenDoc();
3066     break;
3067   default:
3068     break;
3069   }
3070 }
3071
3072 /*!
3073   Updates windows after close document
3074 */
3075 void LightApp_Application::afterCloseDoc()
3076 {
3077   updateWindows();
3078
3079   CAM_Application::afterCloseDoc();
3080 }
3081
3082 /*!
3083   Updates actions of active module
3084 */
3085 void LightApp_Application::updateModuleActions()
3086 {
3087   QString modName;
3088   if ( activeModule() ) {
3089     modName = activeModule()->moduleName();
3090     if ( !isModuleAccessible( modName ) ) {
3091       QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3092       foreach( SUIT_Application* app, apps ) {
3093         LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3094         if ( lapp && lapp != this )
3095           lapp->removeModuleAction( modName );
3096       }
3097     }
3098   }
3099
3100   LightApp_ModuleAction* moduleAction =
3101     qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3102   if ( moduleAction )
3103     moduleAction->setActiveModule( modName );
3104 }
3105
3106 void LightApp_Application::removeModuleAction( const QString& modName )
3107 {
3108   LightApp_ModuleAction* moduleAction =
3109     qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3110   if ( moduleAction )
3111     moduleAction->removeModule( modName );
3112 }
3113
3114 /*!
3115   Gets current windows.
3116   \param winMap - output current windows map.
3117 */
3118 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3119 {
3120   winMap.clear();
3121   if ( !activeStudy() )
3122     return;
3123
3124   if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3125     ((LightApp_Module*)activeModule())->windows( winMap );
3126   else
3127     defaultWindows( winMap );
3128 }
3129
3130 /*!
3131   Gets current view managers.
3132   \param lst - output current view managers list.
3133 */
3134 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3135 {
3136   lst.clear();
3137   if ( !activeStudy() )
3138     return;
3139
3140   if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3141     ((LightApp_Module*)activeModule())->viewManagers( lst );
3142   else
3143     defaultViewManagers( lst );
3144 }
3145
3146 /*!
3147   Updates windows
3148 */
3149 void LightApp_Application::updateWindows()
3150 {
3151   QMap<int, int> winMap;
3152   currentWindows( winMap );
3153
3154   if ( activeStudy() )
3155   {
3156     for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
3157     {
3158       if ( !dockWindow( it.key() ) )
3159         getWindow( it.key() );
3160     }
3161   }
3162
3163   for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
3164   {
3165     QWidget* wid = it.value();
3166     if ( activeStudy() )
3167       wid->setVisible( winMap.contains( it.key() ) );
3168     else
3169       delete wid;
3170   }
3171
3172   if ( activeStudy() )
3173     loadDockWindowsState();
3174   else
3175     myWin.clear();
3176 }
3177
3178 /*!
3179   Updates view managers
3180 */
3181 void LightApp_Application::updateViewManagers()
3182 {
3183   QStringList lst;
3184   currentViewManagers( lst );
3185
3186   for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
3187     getViewManager( *it, true );
3188 }
3189
3190 /*!
3191   Loads windows geometry
3192 */
3193 void LightApp_Application::loadDockWindowsState()
3194 {
3195   if ( !desktop() )
3196     return;
3197
3198   bool store = resourceMgr()->booleanValue( "Study", "store_positions", true );
3199   if( !store )
3200     return;
3201
3202   QString modName;
3203   if ( activeModule() )
3204     modName = activeModule()->name();
3205
3206   if ( myWinGeom.contains( modName ) )
3207     desktop()->restoreState( myWinGeom[modName] );
3208
3209   if ( !myWinVis.contains( modName ) )
3210     return;
3211
3212   QMap<QString, bool> tbMap, dwMap;
3213   dockWindowsState( myWinVis[modName], tbMap, dwMap );
3214
3215   QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
3216   for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
3217   {
3218     QToolBar* tb = *tit;
3219
3220     QObject* po = Qtx::findParent( tb, "QMainWindow" );
3221     if ( po != desktop() )
3222       continue;
3223
3224     if ( tbMap.contains( tb->objectName() ) )
3225       tb->setVisible( tbMap[tb->objectName()] );
3226   }
3227
3228   QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
3229   for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
3230   {
3231     QDockWidget* dw = *dit;
3232
3233     QObject* po = Qtx::findParent( dw, "QMainWindow" );
3234     if ( po != desktop() )
3235       continue;
3236
3237     if ( dwMap.contains( dw->objectName() ) )
3238       dw->setVisible( dwMap[dw->objectName()] );
3239   }
3240 }
3241
3242 /*!
3243   Saves windows geometry
3244 */
3245 void LightApp_Application::saveDockWindowsState()
3246 {
3247   if ( !desktop() )
3248     return;
3249
3250   bool store = resourceMgr()->booleanValue( "Study", "store_positions", true );
3251   if( !store )
3252     return;
3253
3254   QString modName;
3255   if ( activeModule() )
3256     modName = activeModule()->name();
3257
3258   myWinGeom.insert( modName, desktop()->saveState() );
3259
3260   QByteArray visArr;
3261   if ( myWinVis.contains( modName ) )
3262     visArr = myWinVis[modName];
3263
3264   QMap<QString, bool> tbMap, dwMap;
3265   dockWindowsState( visArr, tbMap, dwMap );
3266
3267   QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
3268   for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
3269   {
3270     QToolBar* tb = *it;
3271     tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
3272   }
3273
3274   QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
3275   for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
3276   {
3277     QDockWidget* wid = *it;
3278     dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
3279   }
3280
3281   visArr = dockWindowsState( tbMap, dwMap );
3282
3283   myWinVis.insert( modName, visArr );
3284 }
3285
3286 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
3287 {
3288   QByteArray visArr;
3289   QDataStream stream( &visArr, QIODevice::WriteOnly );
3290
3291   stream << (uchar)ToolBarMarker;
3292   stream << tb.size();
3293   for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
3294   {
3295     stream << tit.key();
3296     stream << (uchar)( tit.value() ? 1 : 0 );
3297   }
3298
3299   stream << (uchar)DockWidgetMarker;
3300   stream << dw.size();
3301   for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
3302   {
3303     stream << wit.key();
3304     stream << (uchar)( wit.value() ? 1 : 0 );
3305   }
3306
3307   return visArr;
3308 }
3309
3310 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
3311 {
3312   tb.clear();
3313   dw.clear();
3314
3315   QByteArray visArr = arr;
3316   QDataStream stream( &visArr, QIODevice::ReadOnly );
3317
3318   uchar marker;
3319   stream >> marker;
3320   if ( marker != ToolBarMarker )
3321     return;
3322
3323   int lines;
3324   stream >> lines;
3325   for ( int i = 0; i < lines; ++i )
3326   {
3327     QString objectName;
3328     stream >> objectName;
3329     uchar shown;
3330     stream >> shown;
3331     tb.insert( objectName, shown );
3332   }
3333
3334   stream >> marker;
3335   if ( marker != DockWidgetMarker )
3336     return;
3337
3338   stream >> lines;
3339   for ( int j = 0; j < lines; ++j )
3340   {
3341     QString objectName;
3342     stream >> objectName;
3343     uchar shown;
3344     stream >> shown;
3345     dw.insert( objectName, shown );
3346   }
3347 }
3348
3349 /*!
3350   Adds icon names for modules
3351 */
3352 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
3353 {
3354   iconMap.clear();
3355
3356   SUIT_ResourceMgr* resMgr = resourceMgr();
3357   if ( !resMgr )
3358     return;
3359
3360   QStringList modList;
3361   modules( modList, false );
3362
3363   for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
3364   {
3365     QString modName = *it;
3366     QString modIntr = moduleName( modName );
3367     QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
3368
3369     if ( modIcon.isEmpty() )
3370       continue;
3371
3372     if ( SUIT_Tools::extension( modIcon ).isEmpty() )
3373       modIcon += QString( ".png" );
3374
3375     iconMap.insert( modName, modIcon );
3376   }
3377 }
3378
3379 /*!
3380   Inserts items in popup, which necessary for current application
3381 */
3382 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
3383 {
3384   //Add "Rename" item
3385   LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
3386   bool cacheIsOn = selMgr->isSelectionCacheEnabled();
3387   selMgr->setSelectionCacheEnabled( true );
3388
3389   SUIT_DataBrowser* ob = objectBrowser();
3390
3391   CAM_Application::contextMenuPopup( type, thePopup, title );
3392
3393   if ( ob && type == ob->popupClientType() ) {
3394     thePopup->addSeparator();
3395     QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
3396     if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
3397       a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
3398   }
3399
3400   if ( selMgr && ob ) {
3401     SALOME_ListIO selected;
3402     selMgr->selectedObjects( selected );
3403     if(selected.Extent() == 1){
3404       Handle(SALOME_InteractiveObject) anIObject = selected.First();
3405       SUIT_DataObject* obj = findObject(anIObject->getEntry());
3406       if(obj && obj->renameAllowed()) {
3407         QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
3408         connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
3409         if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
3410           a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
3411
3412         QList<QAction*> acts = thePopup->actions();
3413         QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
3414         thePopup->insertAction(firstAction,a);
3415       }
3416     }
3417   }
3418
3419   selMgr->setSelectionCacheEnabled( cacheIsOn );
3420 }
3421
3422 /*!
3423   Create empty study
3424 */
3425 void LightApp_Application::createEmptyStudy()
3426 {
3427   CAM_Application::createEmptyStudy();
3428
3429   if ( objectBrowser() )
3430     objectBrowser()->updateTree();
3431
3432   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3433   if ( aResMgr && activeStudy() ) {
3434     int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
3435     if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3436   }
3437 }
3438
3439 /*!Set desktop:*/
3440 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
3441 {
3442   CAM_Application::setDesktop( desk );
3443
3444   if ( desk ) {
3445     connect( desk, SIGNAL( message( const QString& ) ),
3446              this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
3447   }
3448 }
3449
3450 /*!
3451   Activates module
3452   \param mod - module to be activated
3453 */
3454 bool LightApp_Application::activateModule( CAM_Module* mod )
3455 {
3456   bool res = CAM_Application::activateModule( mod );
3457
3458   if ( objectBrowser() )
3459     objectBrowser()->updateTree();
3460
3461   return res;
3462 }
3463
3464 /*!
3465   \return keyborad accelerators manager object
3466 */
3467 SUIT_Accel* LightApp_Application::accel() const
3468 {
3469   return myAccel;
3470 }
3471
3472 /*!
3473   Removes dead widget container from map
3474 */
3475 void LightApp_Application::onWCDestroyed( QObject* ob )
3476 {
3477   // remove destroyed widget container from windows map
3478   for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
3479   {
3480     if ( itr.value() != ob )
3481       continue;
3482
3483     int key = itr.key();
3484     myWin.remove( key );
3485     break;
3486   }
3487 }
3488
3489 void LightApp_Application::onMRUActivated( const QString& name )
3490 {
3491   SUIT_Session* s = SUIT_Session::session();
3492   if ( s && s->activeApplication() == this )
3493     onOpenDoc( name );
3494 }
3495
3496 void LightApp_Application::onStylePreferences()
3497 {
3498   Style_PrefDlg dlg( desktop() );
3499   dlg.exec();
3500
3501   resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
3502 }
3503
3504 void LightApp_Application::onFullScreen(){
3505   if(myScreenHelper) {
3506     if(desktop()->isFullScreen())
3507       myScreenHelper->switchToNormalScreen();
3508     else
3509       myScreenHelper->switchToFullScreen();
3510   }
3511 }
3512
3513 /*!
3514   Connects just added view manager
3515 */
3516 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
3517 {
3518   connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
3519            this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
3520   CAM_Application::addViewManager( vm );
3521 }
3522
3523 /*!
3524   Remove view manager from memory
3525 */
3526 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
3527 {
3528   disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
3529            this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
3530   LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
3531   if (aStudy )
3532     aStudy->removeViewMgr(vm->getGlobalId());
3533
3534   CAM_Application::removeViewManager( vm );
3535
3536   LightApp_SelectionMgr* selMgr = selectionMgr();
3537   QList<SUIT_Selector*> selectors;
3538   selMgr->selectors( selectors );
3539   foreach( SUIT_Selector* selector, selectors ) {
3540     if ( selector->owner() == vm->getViewModel() ) {
3541       delete selector;
3542     }
3543   }
3544
3545   // IPAL22894: Crash on closing OCC view
3546   //delete vm;
3547   vm->deleteLater();
3548 }
3549
3550 /*!
3551   Renames active window of desktop
3552 */
3553 void LightApp_Application::onRenameWindow()
3554 {
3555   if( !desktop() )
3556     return;
3557
3558   QWidget* w = desktop()->activeWindow();
3559   if( !w )
3560     return;
3561
3562   bool ok;
3563   QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
3564   if( ok && !name.isEmpty() )
3565     w->setWindowTitle( name );
3566 }
3567
3568 /*!
3569   Closes active window of desktop
3570 */
3571 void LightApp_Application::onCloseWindow()
3572 {
3573   if( !desktop() )
3574     return;
3575
3576   QWidget* w = desktop()->activeWindow();
3577   if( !w )
3578     return;
3579
3580   w->close();
3581 }
3582
3583 /*!
3584   Closes all windows of desktop
3585 */
3586 void LightApp_Application::onCloseAllWindow()
3587 {
3588   STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
3589   if( !desk )
3590     return;
3591
3592   QList<SUIT_ViewWindow*> wndList = desk->windows();
3593   SUIT_ViewWindow* wnd;
3594   foreach( wnd, wndList )
3595   {
3596     if ( wnd )
3597       wnd->close();
3598   }
3599 }
3600
3601 /*!
3602   Groups all windows of desktop
3603 */
3604 void LightApp_Application::onGroupAllWindow()
3605 {
3606   STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
3607   if( !desk )
3608     return;
3609
3610   QtxWorkstack* wgStack = desk->workstack();
3611   if ( wgStack )
3612     wgStack->stack();
3613 }
3614
3615 /*!
3616   \return if the library of module exists
3617   \param moduleTitle - title of module
3618 */
3619 bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
3620 {
3621   if( moduleTitle.isEmpty() )
3622     return false;
3623
3624   QString lib = moduleLibrary( moduleTitle );
3625
3626   //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
3627   bool isPythonModule = lib.contains("SalomePyQtGUI");
3628   bool isPythonLightModule = lib.contains("SalomePyQtGUILight");
3629
3630   QStringList paths;
3631 #ifdef WIN32
3632   paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
3633 #else
3634   paths = QString(::getenv( "LD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
3635 #endif
3636
3637   bool isLibFound = false;
3638   QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
3639   for( ; anIt!=aLast; anIt++ )
3640   {
3641     QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
3642
3643     if( inf.exists() )
3644       {
3645         isLibFound = true;
3646         break;
3647       }
3648   }
3649
3650   if ( !isLibFound )
3651     {
3652       INFOS( "****************************************************************" << std::endl
3653           << "*    Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
3654           << "*    Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
3655           << "****************************************************************" << std::endl );
3656     }
3657   else if ( !isPythonModule && !isPythonLightModule)
3658     return true;
3659
3660   if ( isPythonModule || isPythonLightModule)
3661     {
3662       QString pylib = moduleName( moduleTitle ) + QString(".py");
3663       QString pylibgui = moduleName( moduleTitle ) + QString("GUI.py");
3664
3665       // Check the python library
3666 // #ifdef WIN32
3667 //       paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
3668 // #else
3669       paths = QString(::getenv( "PYTHONPATH" )).split( ":", QString::SkipEmptyParts );
3670 // #endif
3671       bool isPyLib = false, isPyGuiLib = false;
3672       QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
3673       for( ; anIt!=aLast; anIt++ )
3674         {
3675           QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
3676           QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
3677
3678           if(!isPythonLightModule)
3679             if( !isPyLib && inf.exists() )
3680               isPyLib = true;
3681
3682           if( !isPyGuiLib && infgui.exists() )
3683             isPyGuiLib = true;
3684
3685           if ((isPyLib || isPythonLightModule ) && isPyGuiLib && isLibFound)
3686             return true;
3687         }
3688
3689       printf( "****************************************************************\n" );
3690       printf( "*    Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
3691       if (!isPyLib)
3692         printf( "*    No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
3693       if (!isPyGuiLib)
3694         printf( "*    No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).toLatin1().constData() );
3695       printf( "****************************************************************\n" );
3696       return true;
3697   }
3698   return false;
3699 }
3700
3701 /*!
3702   \return default name for an active study
3703 */
3704 void LightApp_Application::setDefaultStudyName( const QString& theName )
3705 {
3706   QStringList anInfoList;
3707   modules( anInfoList, false );
3708
3709   LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
3710   if( anInfoList.count() == 1 && // to avoid a conflict between different modules
3711       !aStudy->isSaved() )
3712   {
3713     aStudy->setStudyName( theName );
3714     updateDesktopTitle();
3715   }
3716 }
3717
3718 /*!
3719   Custom event handler
3720 */
3721 bool LightApp_Application::event( QEvent* e )
3722 {
3723   if( e && e->type()==2000 )
3724   {
3725     SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
3726     QString* d = ( QString* )ce->data();
3727     if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
3728                                   d ? *d : "",
3729                                   SUIT_MessageBox::Yes | SUIT_MessageBox::No,
3730                                   SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
3731       showPreferences( tr( "PREF_APP" ) );
3732     if( d )
3733       delete d;
3734     return true;
3735   }
3736   return CAM_Application::event( e );
3737 }
3738
3739 /*! Check data object */
3740 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
3741 {
3742   if (theObj)
3743     {
3744       bool isSuitable = !theObj->entry().isEmpty() &&
3745                         !theObj->componentDataType().isEmpty() &&
3746                         !theObj->name().isEmpty();
3747       return isSuitable;
3748     }
3749
3750   return false;
3751 }
3752
3753 int LightApp_Application::openChoice( const QString& aName )
3754 {
3755   int choice = CAM_Application::openChoice( aName );
3756
3757   if ( choice == OpenExist ) // The document is already open.
3758   {
3759     // Do you want to reload it?
3760     if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
3761                                     SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
3762       choice = OpenReload;
3763   }
3764
3765   return choice;
3766 }
3767
3768 bool LightApp_Application::openAction( const int choice, const QString& aName )
3769 {
3770   bool res = false;
3771   switch ( choice )
3772   {
3773   case OpenReload:
3774     {
3775       STD_Application* app = 0;
3776       SUIT_Session* session = SUIT_Session::session();
3777       QList<SUIT_Application*> appList = session->applications();
3778       for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
3779       {
3780         if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
3781           app = ::qobject_cast<STD_Application*>( *it );
3782       }
3783
3784       if ( app )
3785       {
3786         app->onCloseDoc( false );
3787         appList = session->applications();
3788         STD_Application* other = 0;
3789         for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
3790           other = ::qobject_cast<STD_Application*>( *it );
3791
3792         if ( other )
3793           res = other->onOpenDoc( aName );
3794       }
3795     }
3796     break;
3797   default:
3798     res = CAM_Application::openAction( choice, aName );
3799     break;
3800   }
3801
3802   return res;
3803 }
3804
3805 QStringList LightApp_Application::viewManagersTypes() const
3806 {
3807   QStringList aTypesList;
3808   aTypesList += myUserWmTypes;
3809 #ifndef DISABLE_GLVIEWER
3810   aTypesList<<GLViewer_Viewer::Type();
3811 #endif
3812 #ifndef DISABLE_PLOT2DVIEWER
3813   aTypesList<<Plot2d_Viewer::Type();
3814 #endif
3815 #ifndef DISABLE_QXGRAPHVIEWER
3816   aTypesList<<QxScene_Viewer::Type();
3817 #endif
3818 #ifndef DISABLE_OCCVIEWER
3819   aTypesList<<OCCViewer_Viewer::Type();
3820 #endif
3821 #ifndef DISABLE_VTKVIEWER
3822  #ifndef DISABLE_SALOMEOBJECT
3823   aTypesList<<SVTK_Viewer::Type();
3824  #else
3825   aTypesList<<VTKViewer_Viewer::Type();
3826  #endif
3827 #endif
3828   return aTypesList;
3829 }
3830 /*!
3831  * Removes all view managers of known types
3832  * Other view managers are ignored
3833  */
3834 void LightApp_Application::clearKnownViewManagers()
3835 {
3836   QStringList aTypesList = viewManagersTypes();
3837   QList<SUIT_ViewManager*> aMgrList;
3838   viewManagers( aMgrList );
3839   foreach (SUIT_ViewManager* aMgr, aMgrList) {
3840     if (aTypesList.contains(aMgr->getType()))
3841       removeViewManager(aMgr);
3842   }
3843 }
3844
3845 /*!
3846   Copy of current selection
3847  */
3848 void LightApp_Application::onCopy()
3849 {
3850   LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
3851   if( m )
3852     m->copy();
3853 }
3854
3855 /*!
3856   Paste of current data in clipboard
3857  */
3858 void LightApp_Application::onPaste()
3859 {
3860   LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
3861   if( m )
3862     m->paste();
3863 }
3864
3865 /*!
3866   Browse (i.e. set focus on) the published objects
3867   \param theIsApplyAndClose - flag indicating that the dialog for creating objects
3868                               has been accepted by Ok (or Apply & Close) button
3869   \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
3870                                   (to select the first published object only)
3871   \return entry of the selected object
3872  */
3873 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
3874                                              const bool theIsApplyAndClose,
3875                                              const bool theIsOptimizedBrowsing )
3876 {
3877   QString aResult;
3878   if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
3879   {
3880     int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
3881     switch( aBrowsePolicy )
3882     {
3883       case BP_Never:
3884         return aResult;
3885       case BP_ApplyAndClose:
3886         if( !theIsApplyAndClose )
3887           return aResult;
3888       case BP_Always:
3889       default:
3890         break;
3891     }
3892   }
3893
3894   LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
3895   if( !aStudy )
3896     return aResult;
3897
3898   SUIT_DataBrowser* anOB = objectBrowser();
3899   if( !anOB )
3900     return aResult;
3901
3902   SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
3903   if( !aModel )
3904     return aResult;
3905
3906   QStringListIterator anIter( theEntryList );
3907   if( theIsOptimizedBrowsing )
3908   {
3909     // go to the last entry
3910     anIter.toBack();
3911     if( anIter.hasPrevious() )
3912       anIter.previous();
3913   }
3914
3915   // scroll to each entry in the list
3916   // (in optimized mode - to the last entry only)
3917   QString anEntry;
3918   LightApp_DataObject* anObject = 0;
3919   while( anIter.hasNext() )
3920   {
3921     anEntry = anIter.next();
3922     if( !anEntry.isEmpty() )
3923     {
3924       anObject = aStudy->findObjectByEntry( anEntry );
3925       if( anObject )
3926       {
3927         QModelIndex anIndex = aModel->index( anObject );
3928         anOB->treeView()->scrollTo( anIndex );
3929       }
3930     }
3931   }
3932
3933   // always select the last object
3934   if( anObject && !anEntry.isEmpty() )
3935   {
3936     QList<SUIT_Selector*> aSelectorList;
3937     selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
3938     if( !aSelectorList.isEmpty() )
3939     {
3940       if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
3941       {
3942         bool anIsAutoBlock = aSelector->autoBlock();
3943
3944         // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
3945         aSelector->setAutoBlock( false );
3946
3947         SUIT_DataOwnerPtrList aList;
3948 #ifndef DISABLE_SALOMEOBJECT
3949         Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
3950           ( anObject->entry().toLatin1().constData(),
3951             anObject->componentDataType().toLatin1().constData(),
3952             anObject->name().toLatin1().constData() );
3953         LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj  );
3954 #else
3955         LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
3956 #endif
3957
3958         aList.append( owner );
3959         selectionMgr()->setSelected( aList );
3960         aResult = anEntry;
3961
3962         // restore auto block flag
3963         aSelector->setAutoBlock( anIsAutoBlock );
3964       }
3965     }
3966   }
3967
3968   return aResult;
3969 }
3970
3971 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
3972 {
3973   LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
3974   return study ? study->findObjectByEntry( id ) : 0;
3975 }
3976
3977 /*!
3978   Checks that an object can be renamed.
3979   \param entry entry of the object
3980   \brief Return \c true if object can be renamed
3981 */
3982 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
3983   return false;
3984 }
3985
3986 /*!
3987   Rename object by entry.
3988   \param entry entry of the object
3989   \param name new name of the object
3990   \brief Return \c true if rename operation finished successfully, \c false otherwise.
3991 */
3992 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
3993   return false;
3994 }
3995
3996 /*! Process standard messages from desktop */
3997 void LightApp_Application::onDesktopMessage( const QString& message )
3998 {
3999   const QString sectionSeparator = "/";
4000
4001   if ( message.toLower() == "updateobjectbrowser" ||
4002        message.toLower() == "updateobjbrowser" ) {
4003     // update object browser
4004     updateObjectBrowser();
4005   }
4006   else {
4007     QStringList data = message.split( sectionSeparator );
4008     if ( data.count() > 1 ) {
4009       QString msgType = data[0].trimmed();
4010       LightApp_Module* sMod = 0;
4011       CAM_Module* mod = module( msgType );
4012       if ( !mod )
4013         mod = module( moduleTitle( msgType ) );
4014       if ( mod && mod->inherits( "LightApp_Module" ) )
4015         sMod = (LightApp_Module*)mod;
4016
4017       if ( msgType.toLower() == "preferences" ) {
4018         // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4019         // for example "preferences/Study/multi_file_dump/true"
4020         if ( data.count() > 3 ) {
4021           QString section = data[1].trimmed();
4022           QString param   = data[2].trimmed();
4023           QString value   = QStringList( data.mid(3) ).join( sectionSeparator );
4024           resourceMgr()->setValue( section, param, value );
4025         }
4026       }
4027       else if ( sMod ) {
4028         // received message for the module
4029         QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4030         sMod->message( msg );
4031       }
4032     }
4033   }
4034 }