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