]> SALOME platform Git repositories - modules/gui.git/blob - src/SalomeApp/SalomeApp_Application.cxx
Salome HOME
f33c25e2e0f2c6d66d54f12ed664cc5f5f4c2e8d
[modules/gui.git] / src / SalomeApp / SalomeApp_Application.cxx
1 // File:      SalomeApp_Application.cxx
2 // Created:   10/22/2004 3:23:45 PM
3 // Author:    Sergey LITONIN
4 // Copyright (C) CEA 2004
5
6 #include "SalomeApp_PyInterp.h" // WARNING! This include must be the first!
7
8 #include "SalomeApp_Application.h"
9
10 #include "SalomeApp_Study.h"
11 #include "SalomeApp_Module.h"
12 #include "SalomeApp_OBFilter.h"
13 #include "SalomeApp_DataObject.h"
14 #include "SalomeApp_EventFilter.h"
15 #include "SalomeApp_WidgetContainer.h"
16
17 #include "SalomeApp_AboutDlg.h"
18 #include "SalomeApp_ModuleDlg.h"
19
20 #include "SalomeApp_GLSelector.h"
21 #include "SalomeApp_OBSelector.h"
22 #include "SalomeApp_OCCSelector.h"
23 #include "SalomeApp_VTKSelector.h"
24 #include "SalomeApp_SelectionMgr.h"
25
26 #include <LogWindow.h>
27
28 #include <GLViewer_Viewer.h>
29 #include <GLViewer_ViewManager.h>
30
31 #include <Plot2d_ViewManager.h>
32
33 #include <OCCViewer_ViewManager.h>
34 #include <SOCC_ViewModel.h>
35
36 #include <SVTK_ViewModel.h>
37 #include <SVTK_ViewManager.h>
38
39 #include <STD_TabDesktop.h>
40
41 #include <SUIT_Tools.h>
42 #include <SUIT_Session.h>
43
44 #include <QtxToolBar.h>
45 #include <QtxDockAction.h>
46
47 #include <OB_Browser.h>
48
49 #include <PythonConsole_PyConsole.h>
50
51 #include <SUIT_MessageBox.h>
52 #include <SUIT_ResourceMgr.h>
53 #include <SUIT_ActionOperation.h>
54
55 #include <Utils_ORB_INIT.hxx>
56 #include <Utils_SINGLETON.hxx>
57 #include <SALOME_ModuleCatalog_impl.hxx>
58 #include <SALOME_LifeCycleCORBA.hxx>
59
60 #include <qmap.h>
61 #include <qdir.h>
62 #include <qlabel.h>
63 #include <qimage.h>
64 #include <qaction.h>
65 #include <qmenubar.h>
66 #include <qcombobox.h>
67 #include <qmessagebox.h>
68 #include <qapplication.h>
69
70 #include "SALOMEDS_StudyManager.hxx"
71
72 #define OBJECT_BROWSER_WIDTH 300
73
74 static const char* imageEmptyIcon[] = {
75 "20 20 1 1",
76 ".      c None",
77 "....................",
78 "....................",
79 "....................",
80 "....................",
81 "....................",
82 "....................",
83 "....................",
84 "....................",
85 "....................",
86 "....................",
87 "....................",
88 "....................",
89 "....................",
90 "....................",
91 "....................",
92 "....................",
93 "....................",
94 "....................",
95 "....................",
96 "...................."};
97
98 extern "C" SALOMEAPP_EXPORT SUIT_Application* createApplication()
99 {
100   return new SalomeApp_Application();
101 }
102
103 /*
104   Class       : SalomeApp_Application
105   Description : Application containing SalomeApp module
106 */
107
108 SalomeApp_Application::SalomeApp_Application()
109 : CAM_Application( false )
110 {
111   STD_TabDesktop* desk = new STD_TabDesktop();
112
113   setDesktop( desk );
114
115   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
116   QPixmap aLogo = aResMgr->loadPixmap( "SalomeApp", tr( "APP_DEFAULT_ICO" ) );
117
118   desktop()->setIcon( aLogo );
119   desktop()->setDockableMenuBar( true );
120   desktop()->setDockableStatusBar( false );
121
122   clearViewManagers();
123
124   mySelMgr = new SalomeApp_SelectionMgr( this );
125
126   connect( desk, SIGNAL( closing( SUIT_Desktop*, QCloseEvent* ) ),
127            this, SLOT( onDesktopClosing( SUIT_Desktop*, QCloseEvent* ) ) );
128
129   connect( mySelMgr, SIGNAL( selectionChanged() ), this, SLOT( onSelection() ) );
130 }
131
132 SalomeApp_Application::~SalomeApp_Application()
133 {
134   saveWindowsGeometry();
135
136   if ( resourceMgr() )
137   {
138     if ( desktop() )
139       desktop()->saveGeometry( resourceMgr(), "desktop" );
140     resourceMgr()->save();
141   }
142
143   delete mySelMgr;
144
145   SalomeApp_EventFilter::Destroy();
146 }
147
148 void SalomeApp_Application::start()
149 {
150   if ( desktop() )
151     desktop()->loadGeometry( resourceMgr(), "desktop" );
152
153   CAM_Application::start();
154
155   QAction* a = action( ViewWindowsId );
156   if ( a && a->inherits( "QtxDockAction" ) )
157     ((QtxDockAction*)a)->setAutoPlace( true );
158
159   SalomeApp_EventFilter::Init();
160
161   updateWindows();
162   updateViewManagers();
163
164   putInfo( "" );
165 }
166
167 QString SalomeApp_Application::applicationName() const 
168
169   return tr( "APP_NAME" );
170 }
171
172 QString SalomeApp_Application::applicationVersion() const
173 {
174   static QString _app_version;
175
176   if ( _app_version.isEmpty() )
177   {
178     QString path( ::getenv( "GUI_ROOT_DIR" ) );
179     if ( !path.isEmpty() )
180       path += QDir::separator();
181     path += QString( "bin/salome/VERSION" );
182   
183     QFile vf( path );
184     if ( vf.open( IO_ReadOnly ) )
185     {
186       QString line;
187       vf.readLine( line, 1024 );
188       vf.close();
189
190       if ( !line.isEmpty() )
191       {
192         while ( !line.isEmpty() && line.at( line.length() - 1 ) == QChar( '\n' ) )
193           line.remove( line.length() - 1, 1 );
194
195         int idx = line.findRev( ":" );
196         if ( idx != -1 )
197           _app_version = line.mid( idx + 1 ).stripWhiteSpace();
198       }
199     }
200   }
201
202   return _app_version;
203 }
204
205 CAM_Module* SalomeApp_Application::loadModule( const QString& name )
206 {
207   CAM_Module* mod = CAM_Application::loadModule( name );
208   if ( mod )
209   {
210     connect( this, SIGNAL( studyOpened() ), mod, SLOT( onModelOpened() ) );
211     connect( this, SIGNAL( studySaved() ),  mod, SLOT( onModelSaved() ) );
212     connect( this, SIGNAL( studyClosed() ), mod, SLOT( onModelClosed() ) );
213   }
214   return mod;
215 }
216
217 bool SalomeApp_Application::activateModule( const QString& modName )
218 {
219   QString actName;
220   CAM_Module* prevMod = activeModule();
221
222   if ( prevMod )
223     actName = prevMod->moduleName();
224
225   if ( actName == modName )
226     return true;
227
228   saveWindowsGeometry();
229
230   bool status = CAM_Application::activateModule( modName );
231
232   updateModuleActions();
233
234   if ( !status )
235     return false;
236
237   updateWindows();
238   updateViewManagers();
239
240   return true;
241 }
242
243 SalomeApp_SelectionMgr* SalomeApp_Application::selectionMgr() const
244 {
245   return mySelMgr;
246 }
247
248 void SalomeApp_Application::createActions()
249 {
250   STD_Application::createActions();
251
252   SUIT_Desktop* desk = desktop();
253   SUIT_ResourceMgr* resMgr = resourceMgr();
254
255   // default icon for neutral point ('SALOME' module)
256   QPixmap defIcon = resMgr->loadPixmap( "SalomeApp", tr( "APP_DEFAULT_ICO" ) );
257   if ( defIcon.isNull() )
258     defIcon = QPixmap( imageEmptyIcon );
259
260   // default icon for any module
261   QPixmap modIcon = resMgr->loadPixmap( "SalomeApp", tr( "APP_MODULE_ICO" ) );
262   if ( modIcon.isNull() )
263     modIcon = QPixmap( imageEmptyIcon );
264
265   QToolBar* modTBar = new QtxToolBar( true, desk );
266   modTBar->setLabel( tr( "INF_TOOLBAR_MODULES" ) );
267
268   QActionGroup* modGroup = new QActionGroup( this );
269   modGroup->setExclusive( true );
270   modGroup->setUsesDropDown( true );
271
272   QAction* a = createAction( -1, tr( "APP_NAME" ), defIcon, tr( "APP_NAME" ),
273                              tr( "PRP_APP_MODULE" ), 0, desk, true );
274   modGroup->add( a );
275   myActions.insert( QString(), a );
276
277   QMap<QString, QString> iconMap;
278   moduleIconNames( iconMap );
279
280   const int iconSize = 20;
281
282   modGroup->addTo( modTBar );
283   modTBar->addSeparator();
284
285   QStringList modList;
286   modules( modList, false );
287
288   for ( QStringList::Iterator it = modList.begin(); it != modList.end(); ++it )
289   {
290     if ( (*it).isEmpty() )
291       continue;
292
293     QString iconName;
294     if ( iconMap.contains( *it ) )
295       iconName = iconMap[*it];
296
297     QString modName = moduleName( *it );
298
299     QPixmap icon = resMgr->loadPixmap( modName, iconName );
300     if ( icon.isNull() )
301       icon = modIcon;
302
303     icon.convertFromImage( icon.convertToImage().smoothScale( iconSize, iconSize, QImage::ScaleMin ) );
304
305     QAction* a = createAction( -1, *it, icon, *it, tr( "PRP_MODULE" ).arg( *it ), 0, desk, true );
306     a->addTo( modTBar );
307     modGroup->add( a );
308
309     myActions.insert( *it, a );
310   }
311
312   SUIT_Tools::simplifySeparators( modTBar );
313
314   // New window
315
316   int windowMenu = createMenu( tr( "MEN_DESK_WINDOW" ), -1, 100 );
317   int newWinMenu = createMenu( tr( "MEN_DESK_NEWWINDOW" ), windowMenu, -1, 0 );
318   createMenu( separator(), windowMenu, -1, 1 );
319
320   QMap<int, int> accelMap;
321   accelMap[NewGLViewId]  = ALT+Key_G;
322   accelMap[NewPlot2dId]  = ALT+Key_P;
323   accelMap[NewOCCViewId] = ALT+Key_O;
324   accelMap[NewVTKViewId] = ALT+Key_K;
325
326   for ( int id = NewGLViewId; id <= NewVTKViewId; id++ )
327   {
328     QAction* a = createAction( id, tr( QString( "NEW_WINDOW_%1" ).arg( id - NewGLViewId ) ), QIconSet(), 
329                                tr( QString( "NEW_WINDOW_%1" ).arg( id - NewGLViewId ) ),
330                                tr( QString( "NEW_WINDOW_%1" ).arg( id - NewGLViewId ) ),
331                                accelMap.contains( id ) ? accelMap[id] : 0, desk, false, this, SLOT( onNewWindow() ) );
332     createMenu( a, newWinMenu, -1 );
333   }
334
335   connect( modGroup, SIGNAL( selected( QAction* ) ), this, SLOT( onModuleActivation( QAction* ) ) );
336 }
337
338 void SalomeApp_Application::onModuleActivation( QAction* a )
339 {
340   if ( !a )
341     return;
342
343   QString modName = a->menuText();
344   if ( modName == tr( "APP_NAME" ) )
345     modName = QString::null;
346
347   // Force user to create/open a study before module activation
348   QMap<QString, QString> iconMap;
349   moduleIconNames( iconMap );
350   QPixmap icon = resourceMgr()->loadPixmap( moduleName( modName ), iconMap[ modName ] );
351
352   bool cancelled = false;
353   while ( !modName.isEmpty() && !activeStudy() && !cancelled ){
354     SalomeApp_ModuleDlg aDlg( desktop(), modName, icon );
355     int res = aDlg.exec();
356
357     switch ( res ){
358     case 1:
359       onNewDoc();
360       break;
361     case 2:
362       onOpenDoc();
363       break;
364     case 3:
365       //onLoadStudy();
366       //break;
367     case 0:
368     default:
369       putInfo( tr("INF_CANCELLED") );
370       myActions[QString()]->setOn( true );
371       cancelled = true;
372     }
373   }
374
375   if ( !cancelled )
376     activateModule( modName );
377 }
378
379 QString SalomeApp_Application::defaultModule() const
380 {
381   QStringList aModuleNames;
382   modules( aModuleNames, false ); // obtain a complete list of module names for the current configuration
383   // If there's the one and only module --> activate it automatically
384   // TODO: Possible improvement - default module can be taken from preferences
385   return aModuleNames.count() > 1 ? "" : ( aModuleNames.count() ? aModuleNames.first() : "" );
386 }
387
388 void SalomeApp_Application::onNewWindow()
389 {
390   const QObject* obj = sender();
391   if ( !obj || !obj->inherits( "QAction" ) )
392     return;
393
394   QString type;
395   int id = actionId( (QAction*)obj );
396   switch ( id )
397   {
398   case NewGLViewId:
399     type = GLViewer_Viewer::Type();
400     break;
401   case NewPlot2dId:
402     type = Plot2d_Viewer::Type();
403     break;
404   case NewOCCViewId:
405     type = OCCViewer_Viewer::Type();
406     break;
407   case NewVTKViewId:
408     type = VTKViewer_Viewer::Type();
409     break;
410   }
411
412   if ( !type.isEmpty() )
413     createViewManager( type );
414 }
415
416 //=======================================================================
417 // name    : onNewDoc
418 // Purpose : SLOT. Create new document
419 //=======================================================================
420 void SalomeApp_Application::onNewDoc()
421 {
422   SUIT_Study* study = activeStudy();
423
424   saveWindowsGeometry();
425
426   CAM_Application::onNewDoc();
427   
428   if ( !study ) // new study will be create in THIS application
429   {
430     updateWindows();
431     updateViewManagers();
432   }
433 }
434
435 //=======================================================================
436 // name    : onOpenDoc
437 // Purpose : SLOT. Open new document
438 //=======================================================================
439 void SalomeApp_Application::onOpenDoc()
440 {
441   SUIT_Study* study = activeStudy();
442   saveWindowsGeometry();
443
444   CAM_Application::onOpenDoc();
445   
446   if ( !study ) // new study will be create in THIS application
447   {
448     updateWindows();
449     updateViewManagers();
450   }
451 }
452
453 void SalomeApp_Application::onSelection()
454 {
455   onSelectionChanged();
456
457   if ( activeModule() && activeModule()->inherits( "SalomeApp_Module" ) )
458     ((SalomeApp_Module*)activeModule())->selectionChanged();
459 }
460
461 void SalomeApp_Application::onSelectionChanged()
462 {
463 }
464
465 void SalomeApp_Application::setActiveStudy( SUIT_Study* study )
466 {
467   CAM_Application::setActiveStudy( study );
468     
469   activateWindows();
470 }
471
472 //=======================================================================
473 // name    : createNewStudy
474 // Purpose : Create new study
475 //=======================================================================
476 SUIT_Study* SalomeApp_Application::createNewStudy() 
477
478   SalomeApp_Study* aStudy = new SalomeApp_Study( this ); 
479   
480   // Set up processing of major study-related events
481   connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
482   connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
483   connect( aStudy, SIGNAL( saved  ( SUIT_Study* ) ), this, SLOT( onStudySaved  ( SUIT_Study* ) ) );
484   connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
485
486   return aStudy; 
487 }
488
489 //=======================================================================
490 // name    : createNewStudy
491 // Purpose : Enable/Disable menu items and toolbar buttons. Rebuild menu
492 //=======================================================================
493 void SalomeApp_Application::updateCommandsStatus()
494 {
495   CAM_Application::updateCommandsStatus();
496
497   for ( int id = NewGLViewId; id <= NewVTKViewId; id++ )
498   {
499     QAction* a = action( id );
500     if ( a )
501       a->setEnabled( activeStudy() );
502   }
503 }
504
505 //=======================================================================
506 // name    : onHelpAbout
507 // Purpose : SLOT. Display "About" message box
508 //=======================================================================
509 void SalomeApp_Application::onHelpAbout()
510 {
511   SalomeApp_AboutDlg* dlg = new SalomeApp_AboutDlg( applicationName(), applicationVersion(), desktop() );
512   dlg->exec();
513   delete dlg;
514 }
515
516 QWidget* SalomeApp_Application::window( const int flag, const int studyId ) const
517 {
518   QWidget* wid = 0;
519
520   int sId = studyId;
521   if ( sId < 0 )
522   {
523     if ( !activeStudy() )
524       return 0;
525     else
526       sId = activeStudy()->id();
527   }
528
529   if ( myWindows.contains( flag ) )
530     wid = myWindows[flag]->widget( sId );
531
532   return wid;
533 }
534
535 void SalomeApp_Application::addWindow( QWidget* wid, const int flag, const int studyId )
536 {
537   if ( !wid )
538     return;
539
540   int sId = studyId;
541   if ( sId < 0 )
542   {
543     if ( !activeStudy() )
544       return;
545     else
546       sId = activeStudy()->id();
547   }
548
549   if ( !myWindows.contains( flag ) )
550   {
551     QMap<int, int> winMap;
552     currentWindows( winMap );
553
554     myWindows.insert( flag, new SalomeApp_WidgetContainer( flag, desktop() ) );
555     if ( winMap.contains( flag ) )
556       desktop()->moveDockWindow( myWindows[flag], (Dock)winMap[flag] );
557
558     myWindows[flag]->setResizeEnabled( true );
559     myWindows[flag]->setCloseMode( QDockWindow::Always );
560     myWindows[flag]->setName( QString( "dock_window_%1" ).arg( flag ) );
561   }
562
563   myWindows[flag]->insert( sId, wid );
564
565   setWindowShown( flag, !myWindows[flag]->isEmpty() );
566 }
567
568 void SalomeApp_Application::removeWindow( const int flag, const int studyId )
569 {
570   if ( !myWindows.contains( flag ) )
571     return;
572
573   int sId = studyId;
574   if ( sId < 0 )
575   {
576     if ( !activeStudy() )
577       return;
578     else
579       sId = activeStudy()->id();
580   }
581
582   QWidget* wid = myWindows[flag]->widget( sId );
583   myWindows[flag]->remove( sId );
584   delete wid;
585
586   setWindowShown( flag, !myWindows[flag]->isEmpty() );
587 }
588
589 QWidget* SalomeApp_Application::getWindow( const int flag, const int studyId )
590 {
591   QWidget* wid = window( flag, studyId );
592   if ( !wid )
593     addWindow( wid = createWindow( flag ), flag, studyId );
594
595   return wid;
596 }
597
598 bool SalomeApp_Application::isWindowVisible( const int type ) const
599 {
600   bool res = false;
601   if ( myWindows.contains( type ) )
602   {
603     SUIT_Desktop* desk = ((SalomeApp_Application*)this)->desktop();
604     res = desk && desk->appropriate( myWindows[type] );
605   }
606   return res;
607 }
608
609 void SalomeApp_Application::setWindowShown( const int type, const bool on )
610 {
611   if ( !desktop() || !myWindows.contains( type ) )
612     return;
613
614   QDockWindow* dw = myWindows[type];
615   desktop()->setAppropriate( dw, on );
616   on ? dw->show() : dw->hide();
617 }
618
619 OB_Browser* SalomeApp_Application::objectBrowser()
620 {
621   OB_Browser* ob = 0;
622   QWidget* wid = getWindow( WT_ObjectBrowser );
623   if ( wid->inherits( "OB_Browser" ) )
624     ob = (OB_Browser*)wid;
625   return ob;
626 }
627
628 LogWindow* SalomeApp_Application::logWindow()
629 {
630   LogWindow* lw = 0;
631   QWidget* wid = getWindow( WT_LogWindow );
632   if ( wid->inherits( "LogWindow" ) )
633     lw = (LogWindow*)wid;
634   return lw;
635 }
636
637 SUIT_ViewManager* SalomeApp_Application::getViewManager( const QString& vmType, const bool create )
638 {
639   SUIT_ViewManager* aVM = viewManager( vmType );
640   SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
641   if ( anActiveVM && anActiveVM->getType() == vmType )
642     aVM = anActiveVM;
643   else if ( aVM )
644   {
645     if ( !aVM->getActiveView() )
646       aVM->createView();
647   }
648   else if ( create )
649     aVM = createViewManager( vmType );
650   return aVM;
651 }
652
653 SUIT_ViewManager* SalomeApp_Application::createViewManager( const QString& vmType )
654 {
655   SUIT_ViewManager* viewMgr = 0;
656   if ( vmType == GLViewer_Viewer::Type() )
657   {
658     viewMgr = new GLViewer_ViewManager( activeStudy(), desktop() );
659     new SalomeApp_GLSelector( (GLViewer_Viewer2d*)viewMgr->getViewModel(), mySelMgr );
660   }
661   else if ( vmType == Plot2d_Viewer::Type() )
662     viewMgr = new Plot2d_ViewManager( activeStudy(), desktop() );
663   else if ( vmType == OCCViewer_Viewer::Type() )
664   {
665     viewMgr = new OCCViewer_ViewManager( activeStudy(), desktop() );
666     viewMgr->setViewModel( new SOCC_Viewer() );// custom view model, which extends SALOME_View interface
667     new SalomeApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
668   }
669   else if ( vmType == SVTK_Viewer::Type() )
670   {
671     viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
672     new SalomeApp_VTKSelector((SVTK_Viewer*)viewMgr->getViewModel(),mySelMgr);
673   }
674
675   if ( !viewMgr )
676     return 0;
677
678   addViewManager( viewMgr );
679   SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
680
681   if ( viewWin && desktop() )
682     viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
683
684   connect( viewMgr, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
685            this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
686
687   return viewMgr;
688 }
689
690 void SalomeApp_Application::onCloseView( SUIT_ViewManager* theVM )
691 {
692   removeViewManager( theVM );
693 }
694
695 void SalomeApp_Application::onStudyCreated( SUIT_Study* theStudy )
696 {
697   SUIT_DataObject* aRoot = 0;
698   if ( theStudy && theStudy->root() )
699   {
700     aRoot = theStudy->root();
701     //aRoot->setName( tr( "DATA_MODELS" ) );
702   }
703   if ( objectBrowser() != 0 )
704     objectBrowser()->setRootObject( aRoot );
705
706   activateModule( defaultModule() );
707 }
708
709 void SalomeApp_Application::onStudyOpened( SUIT_Study* theStudy )
710 {
711   SUIT_DataObject* aRoot = 0;
712   if ( theStudy && theStudy->root() )
713   {
714     aRoot = theStudy->root();
715     //aRoot->dump();
716   }
717   if ( objectBrowser() != 0 ) {
718     objectBrowser()->setRootObject( aRoot );
719   }
720
721   activateWindows();
722
723   activateModule( defaultModule() );
724
725   emit studyOpened();
726 }
727
728 void SalomeApp_Application::onStudySaved( SUIT_Study* )
729 {
730   emit studySaved();
731 }
732
733 void SalomeApp_Application::onStudyClosed( SUIT_Study* )
734 {
735   emit studyClosed();
736
737   activateModule( "" );
738
739   saveWindowsGeometry();
740 }
741
742 QString SalomeApp_Application::getFileFilter() const
743 {
744   return "(*.hdf)";
745 }
746
747 void SalomeApp_Application::beforeCloseDoc( SUIT_Study* s )
748 {
749   CAM_Application::beforeCloseDoc( s );
750
751   for ( WindowMap::ConstIterator itr = myWindows.begin(); s && itr != myWindows.end(); ++itr )
752     removeWindow( itr.key(), s->id() );
753 }
754
755 void SalomeApp_Application::updateActions()
756 {
757   updateCommandsStatus();
758 }
759
760 QWidget* SalomeApp_Application::createWindow( const int flag )
761 {
762   QWidget* wid = 0;
763
764   if ( flag == WT_ObjectBrowser )
765   {
766     OB_Browser* ob = new OB_Browser( desktop() );
767     ob->setAutoUpdate( true );
768     ob->setAutoOpenLevel( 1 );
769     ob->setCaption( tr( "OBJECT_BROWSER" ) );
770     ob->resize( OBJECT_BROWSER_WIDTH, ob->height() );
771     ob->setFilter( new SalomeApp_OBFilter( selectionMgr() ) );
772
773     ob->setNameTitle( tr( "OBJ_BROWSER_NAME" ) );
774     for ( int i = SalomeApp_DataObject::CT_Value; i <= SalomeApp_DataObject::CT_RefEntry; i++ )
775       ob->addColumn( tr( QString().sprintf( "OBJ_BROWSER_COLUMN_%d", i ) ), i );
776
777     // Create OBSelector
778     new SalomeApp_OBSelector( ob, mySelMgr );
779
780     wid = ob;
781
782     ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
783   }
784   else if ( flag == WT_PyConsole )
785   {
786     PythonConsole* pyCons = new PythonConsole( desktop(), new SalomeApp_PyInterp() );
787     pyCons->setCaption( tr( "PYTHON_CONSOLE" ) );
788     wid = pyCons;
789
790     //    pyCons->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
791   }
792   else if ( flag == WT_LogWindow )
793   {
794     LogWindow* logWin = new LogWindow( desktop() );
795     logWin->setCaption( tr( "LOG_WINDOW" ) );
796     wid = logWin;
797
798     logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
799   }
800
801   return wid;
802 }
803
804 void SalomeApp_Application::defaultWindows( QMap<int, int>& aMap ) const
805 {
806   aMap.insert( WT_ObjectBrowser, Qt::DockLeft );
807   aMap.insert( WT_PyConsole, Qt::DockBottom );
808   aMap.insert( WT_LogWindow, Qt::DockBottom );
809 }
810
811 void SalomeApp_Application::defaultViewManagers( QStringList& ) const
812 {
813 }
814
815 void SalomeApp_Application::afterCloseDoc()
816 {
817   updateWindows();
818
819   CAM_Application::afterCloseDoc();
820 }
821
822 CORBA::ORB_var SalomeApp_Application::orb()
823 {
824   ORB_INIT& init = *SINGLETON_<ORB_INIT>::Instance();
825   static CORBA::ORB_var _orb = init( qApp->argc(), qApp->argv() );
826   return _orb;
827 }
828
829 SALOMEDSClient_StudyManager* SalomeApp_Application::studyMgr()
830 {
831   static SALOMEDSClient_StudyManager* _sm = new SALOMEDS_StudyManager();
832   return _sm;
833 }
834
835 SALOME_NamingService* SalomeApp_Application::namingService()
836 {
837   static SALOME_NamingService* _ns = new SALOME_NamingService( orb() );
838   return _ns;
839 }
840
841 SALOME_LifeCycleCORBA* SalomeApp_Application::lcc()
842 {
843   static SALOME_LifeCycleCORBA* _lcc = new SALOME_LifeCycleCORBA( namingService() );
844   return _lcc;
845 }
846
847 QString SalomeApp_Application::defaultEngineIOR()
848 {
849   // Look for a default module engine (needed for CORBAless modules to use SALOMEDS persistence)
850   QString anIOR( "" );
851   CORBA::Object_ptr anEngine = namingService()->Resolve( "/SalomeAppEngine" );
852   if ( !CORBA::is_nil( anEngine ) )
853     anIOR = orb()->object_to_string( anEngine );
854   return anIOR;
855 }
856
857 void SalomeApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
858 {
859   iconMap.clear();
860
861   SUIT_ResourceMgr* resMgr = resourceMgr();
862   if ( !resMgr )
863     return;
864
865   QStringList modList;
866   modules( modList, false );
867
868   for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
869   {
870     QString modName = *it;
871     QString modIntr = moduleName( modName );
872     QString modIcon = resMgr->stringValue( modIntr, "icon", QString::null );
873
874     if ( modIcon.isEmpty() )
875       continue;
876
877     if ( SUIT_Tools::extension( modIcon ).isEmpty() )
878       modIcon += QString( ".png" );
879
880     iconMap.insert( modName, modIcon );
881   }
882 }
883
884 void SalomeApp_Application::updateModuleActions()
885 {
886   QString modName;
887   if ( activeModule() )
888     modName = activeModule()->moduleName();
889
890   if ( myActions.contains( modName ) )
891     myActions[modName]->setOn( true );
892 }
893
894 void SalomeApp_Application::currentWindows( QMap<int, int>& winMap ) const
895 {
896   winMap.clear();
897   if ( !activeStudy() )
898     return;
899
900   if ( activeModule() && activeModule()->inherits( "SalomeApp_Module" ) )
901     ((SalomeApp_Module*)activeModule())->windows( winMap );
902   else
903     defaultWindows( winMap );
904 }
905
906 void SalomeApp_Application::currentViewManagers( QStringList& lst ) const
907 {
908   lst.clear();
909   if ( !activeStudy() )
910     return;
911
912   if ( activeModule() && activeModule()->inherits( "SalomeApp_Module" ) )
913     ((SalomeApp_Module*)activeModule())->viewManagers( lst );
914   else
915     defaultViewManagers( lst );
916 }
917
918 void SalomeApp_Application::updateWindows()
919 {
920   QMap<int, int> winMap;
921   currentWindows( winMap );
922
923   for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
924     getWindow( it.key() );
925
926   loadWindowsGeometry();
927
928   for ( WindowMap::ConstIterator itr = myWindows.begin(); itr != myWindows.end(); ++itr )
929     setWindowShown( itr.key(), !itr.data()->isEmpty() && winMap.contains( itr.key() ) );
930 }
931
932 void SalomeApp_Application::updateViewManagers()
933 {
934   QStringList lst;
935   currentViewManagers( lst );
936
937   for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
938     getViewManager( *it, true );
939 }
940
941 void SalomeApp_Application::loadWindowsGeometry()
942 {
943   QtxDockAction* dockMgr = 0;
944
945   QAction* a = action( ViewWindowsId );
946   if ( a && a->inherits( "QtxDockAction" ) )
947     dockMgr = (QtxDockAction*)a;
948
949   if ( !dockMgr )
950     return;
951
952   QString modName;
953   if ( activeModule() )
954     modName = moduleLibrary( activeModule()->moduleName(), false );
955   
956   QString section = QString( "windows_geometry" );
957   if ( !modName.isEmpty() )
958     section += QString( "." ) + modName;
959
960   dockMgr->loadGeometry( resourceMgr(), section, false );
961   dockMgr->restoreGeometry();
962 }
963
964 void SalomeApp_Application::saveWindowsGeometry()
965 {
966   QtxDockAction* dockMgr = 0;
967
968   QAction* a = action( ViewWindowsId );
969   if ( a && a->inherits( "QtxDockAction" ) )
970     dockMgr = (QtxDockAction*)a;
971
972   if ( !dockMgr )
973     return;
974
975   QString modName;
976   if ( activeModule() )
977     modName = moduleLibrary( activeModule()->moduleName(), false );
978   
979   QString section = QString( "windows_geometry" );
980   if ( !modName.isEmpty() )
981     section += QString( "." ) + modName;
982
983   dockMgr->storeGeometry();
984   dockMgr->saveGeometry( resourceMgr(), section, false );
985 }
986
987 void SalomeApp_Application::activateWindows()
988 {
989   if ( activeStudy() )
990   {
991     for ( WindowMap::Iterator itr = myWindows.begin(); itr != myWindows.end(); ++itr )
992       itr.data()->activate( activeStudy()->id() );
993   }
994 }