1 // Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
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.
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
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 #include "SUIT_Application.h"
25 #include "SUIT_Study.h"
26 #include "SUIT_Session.h"
27 #include "SUIT_Desktop.h"
28 #include "SUIT_ResourceMgr.h"
29 #include "SUIT_ShortcutMgr.h"
34 #include <QApplication>
37 #include <QtxAction.h>
38 #include <QtxActionMenuMgr.h>
39 #include <QtxActionToolMgr.h>
44 \brief Status bar customization label. Used to workaroubd desktop resizing bug.
47 class StatusLabel : public QLabel
50 StatusLabel( QWidget* parent ) : QLabel( parent ) {}
51 QSize minimumSizeHint () const { return QSize( 0, QLabel::minimumSizeHint().height() ); }
57 SUIT_Application::SUIT_Application()
63 if ( SUIT_Session::session() )
64 SUIT_Session::session()->insertApplication( this );
70 SUIT_Application::~SUIT_Application()
72 SUIT_Study* s = myStudy;
80 \return main window of application (desktop)
82 SUIT_Desktop* SUIT_Application::desktop()
88 \return FALSE if application can not be closed (because of non saved data for example).
89 This method called by SUIT_Session whin closing of application was requested.
91 bool SUIT_Application::isPossibleToClose( bool& )
97 Performs some finalization of life cycle of this application.
98 For instance, the application can force its documents(s) to close.
100 void SUIT_Application::closeApplication()
102 emit applicationClosed( this );
106 \return active Study. If Application supports wirking with several studies this method should be redefined
108 SUIT_Study* SUIT_Application::activeStudy() const
114 \return version of application
116 QString SUIT_Application::applicationVersion() const
122 Shows the application's main widget. For non GUI application must be redefined.
124 void SUIT_Application::start()
129 // Initialize shortcut manager
130 SUIT_ShortcutMgr::Init();
134 Opens document into active Study. If Study is empty - creates it.
135 \param theFileName - name of document file
137 bool SUIT_Application::useFile( const QString& theFileName )
140 SUIT_Study* study = activeStudy();
142 bool status = study ? study->openDocument( theFileName ) : false;
154 Creates new empty Study if active Study = 0
156 void SUIT_Application::createEmptyStudy()
158 if ( !activeStudy() )
159 setActiveStudy( createNewStudy() );
163 \return number of Studies.
164 Must be redefined in Applications which support several studies for one Application instance.
166 int SUIT_Application::getNbStudies() const
168 return activeStudy() ? 1 : 0;
172 \return global resource manager
174 SUIT_ResourceMgr* SUIT_Application::resourceMgr() const
176 if ( !SUIT_Session::session() )
179 return SUIT_Session::session()->resourceMgr();
183 \brief Get access to shortcut manager.
184 \return global shortcut manager
186 SUIT_ShortcutMgr* SUIT_Application::shortcutMgr() const
188 return SUIT_ShortcutMgr::getShortcutMgr();
191 #define DEFAULT_MESSAGE_DELAY 3000
194 Puts the message to the status bar
195 \param msg - text of message
196 \param msec - time in milliseconds, after that the status label will be cleared
198 void SUIT_Application::putInfo( const QString& msg, const int msec )
203 if ( !myStatusLabel )
205 myStatusLabel = new StatusLabel( desktop()->statusBar() );
206 desktop()->statusBar()->addWidget( myStatusLabel, 1 );
207 myStatusLabel->show();
210 QString prev = myStatusLabel->text();
212 myStatusLabel->setText( msg );
214 QTimer::singleShot( msec <= 0 ? DEFAULT_MESSAGE_DELAY : msec, this, SLOT( onInfoClear() ) );
217 emit infoChanged( msg );
221 Clear the information label in status bar after delay.
223 void SUIT_Application::onInfoClear()
225 if ( !myStatusLabel )
228 bool changed = !myStatusLabel->text().isEmpty();
229 myStatusLabel->clear();
231 emit infoChanged( QString() );
235 Update status of the registerd actions
237 void SUIT_Application::updateCommandsStatus()
242 Initialize with application arguments
243 \param argc - number of application arguments
244 \param argv - array of application arguments
246 SUIT_Application* SUIT_Application::startApplication( int argc, char** argv ) const
248 return startApplication( objectName(), argc, argv );
252 Initialize with application name and arguments
253 \param name - name of application
254 \param argc - number of application arguments
255 \param argv - array of application arguments
257 SUIT_Application* SUIT_Application::startApplication( const QString& name, int argc, char** argv ) const
259 SUIT_Session* session = SUIT_Session::session();
263 return session->startApplication( name, argc, argv );
267 Sets the main window of application
268 \param desk - new main window (desktop)
270 void SUIT_Application::setDesktop( SUIT_Desktop* desk )
272 if ( myDesktop == desk )
275 // >> VSR 09/06/2009: workaround about the Qt 4.5.0 bug: SIGSEGV on desktop delete
276 myDesktop->deleteLater(); // delete myDesktop;
280 connect( myDesktop, SIGNAL( activated() ), this, SLOT( onDesktopActivated() ) );
281 // Force desktop activation (NPAL16628)
282 QApplication::postEvent(myDesktop, new QEvent(QEvent::WindowActivate));
287 Creates new instance of study.
288 By default, it is called from createEmptyStudy()
289 \sa createEmptyStudy()
291 SUIT_Study* SUIT_Application::createNewStudy()
293 return new SUIT_Study( this );
298 \param study - instance of study to be set as active
300 void SUIT_Application::setActiveStudy( SUIT_Study* study )
302 if ( myStudy == study )
306 disconnect( myStudy, SIGNAL( studyModified( SUIT_Study* ) ),
307 this, SLOT( updateCommandsStatus() ) );
309 connect( study, SIGNAL( studyModified( SUIT_Study* ) ),
310 this, SLOT( updateCommandsStatus() ) );
317 \return identificator of new toolbar in tool manager
318 \param name - name of new toolbar
320 int SUIT_Application::createTool( const QString& name )
322 if ( !desktop() || !desktop()->toolMgr() )
325 return desktop()->toolMgr()->createToolBar( name );
329 Creates new toolbutton
330 \return SUIT identificator of new action
332 \param tBar - identificator of toolbar
333 \param id - proposed SUIT identificator of action (if it is -1, then must be use any free)
334 \param idx - index in toolbar
336 int SUIT_Application::createTool( QAction* a, const int tBar, const int id, const int idx )
338 if ( !desktop() || !desktop()->toolMgr() )
341 int regId = registerAction( id, a );
342 int intId = desktop()->toolMgr()->insert( a, tBar, idx );
343 return intId != -1 ? regId : -1;
347 Creates new toolbutton
348 \return SUIT identificator of new action
350 \param tBar - name of toolbar
351 \param id - proposed SUIT identificator of action (if it is -1, then must be use any free)
352 \param idx - index in toolbar
354 int SUIT_Application::createTool( QAction* a, const QString& tBar, const int id, const int idx )
356 if ( !desktop() || !desktop()->toolMgr() )
359 int regId = registerAction( id, a );
360 int intId = desktop()->toolMgr()->insert( a, tBar, idx );
361 return intId != -1 ? regId : -1;
365 Creates new toolbutton
366 \return "id" if all right or -1 otherwise
367 \param id - SUIT identificator of action
368 \param tBar - identificator of toolbar
369 \param idx - index in toolbar
371 int SUIT_Application::createTool( const int id, const int tBar, const int idx )
373 if ( !desktop() || !desktop()->toolMgr() )
376 int intId = desktop()->toolMgr()->insert( action( id ), tBar, idx );
377 return intId != -1 ? id : -1;
381 Creates new toolbutton
382 \return "id" if all right or -1 otherwise
383 \param id - SUIT identificator of action
384 \param tBar - name of toolbar
385 \param idx - index in toolbar
387 int SUIT_Application::createTool( const int id, const QString& tBar, const int idx )
389 if ( !desktop() || !desktop()->toolMgr() )
392 int intId = desktop()->toolMgr()->insert( action( id ), tBar, idx );
393 return intId != -1 ? id : -1;
397 Creates new menu item
398 \return identificator of new action in menu manager
399 \param subMenu - menu text of new item
400 \param menu - identificator of parent menu item
401 \param id - proposed identificator of action
402 \param group - group in menu manager
403 \param index - index in menu
405 int SUIT_Application::createMenu( const QString& subMenu, const int menu,
406 const int id, const int group, const int index )
408 if ( !desktop() || !desktop()->menuMgr() )
411 return desktop()->menuMgr()->insert( subMenu, menu, group, id, index );
415 Creates new menu item
416 \return identificator of new action in menu manager
417 \param subMenu - menu text of new item
418 \param menu - menu text of parent menu item
419 \param id - proposed identificator of action
420 \param group - group in menu manager
421 \param index - index in menu
423 int SUIT_Application::createMenu( const QString& subMenu, const QString& menu,
424 const int id, const int group, const int index )
426 if ( !desktop() || !desktop()->menuMgr() )
429 return desktop()->menuMgr()->insert( subMenu, menu, group, id, index );
433 Creates new menu item
434 \return SUIT identificator of new action
436 \param menu - identificator of parent menu item
437 \param id - proposed SUIT identificator of action
438 \param group - group in menu manager
439 \param index - index in menu
441 int SUIT_Application::createMenu( QAction* a, const int menu, const int id, const int group, const int index )
443 if ( !a || !desktop() || !desktop()->menuMgr() )
446 int regId = registerAction( id, a );
447 int intId = desktop()->menuMgr()->insert( a, menu, group, index );
448 return intId != -1 ? regId : -1;
452 Creates new menu item
453 \return SUIT identificator of new action
455 \param menu - menu text of parent menu item
456 \param id - proposed SUIT identificator of action
457 \param group - group in menu manager
458 \param index - index in menu
460 int SUIT_Application::createMenu( QAction* a, const QString& menu, const int id, const int group, const int index )
462 if ( !a || !desktop() || !desktop()->menuMgr() )
465 int regId = registerAction( id, a );
466 int intId = desktop()->menuMgr()->insert( a, menu, group, index );
467 return intId != -1 ? regId : -1;
471 Creates new menu item
472 \return identificator of new action in menu manager
473 \param id - SUIT identificator of action
474 \param menu - menu text of parent menu item
475 \param group - group in menu manager
476 \param index - index in menu
478 int SUIT_Application::createMenu( const int id, const int menu, const int group, const int index )
480 if ( !desktop() || !desktop()->menuMgr() )
483 int intId = desktop()->menuMgr()->insert( action( id ), menu, group, index );
484 return intId != -1 ? id : -1;
488 Creates new menu item
489 \return identificator of new action in menu manager
490 \param id - SUIT identificator of action
491 \param menu - menu text of parent menu item
492 \param group - group in menu manager
493 \param index - index in menu
495 int SUIT_Application::createMenu( const int id, const QString& menu, const int group, const int index )
497 if ( !desktop() || !desktop()->menuMgr() )
500 int intId = desktop()->menuMgr()->insert( action( id ), menu, group, index );
501 return intId != -1 ? id : -1;
505 Show/hide menu item corresponding to action
507 \param on - if it is true, the item will be shown, otherwise it will be hidden
509 void SUIT_Application::setMenuShown( QAction* a, const bool on )
511 if ( !a || !desktop() )
514 QtxActionMenuMgr* mMgr = desktop()->menuMgr();
516 mMgr->setShown( mMgr->actionId( a ), on );
520 Show/hide menu item corresponding to action
521 \param id - identificator of action in menu manager
522 \param on - if it is true, the item will be shown, otherwise it will be hidden
524 void SUIT_Application::setMenuShown( const int id, const bool on )
526 setMenuShown( action( id ), on );
530 Show/hide tool button corresponding to action
532 \param on - if it is true, the button will be shown, otherwise it will be hidden
534 void SUIT_Application::setToolShown( QAction* a, const bool on )
536 if ( !a || !desktop() )
539 QtxActionToolMgr* tMgr = desktop()->toolMgr();
541 tMgr->setShown( tMgr->actionId( a ), on );
545 Show/hide menu item corresponding to action
546 \param id - identificator of action in tool manager
547 \param on - if it is true, the button will be shown, otherwise it will be hidden
549 void SUIT_Application::setToolShown( const int id, const bool on )
551 setToolShown( action( id ), on );
555 Show/hide both menu item and tool button corresponding to action
557 \param on - if it is true, the item will be shown, otherwise it will be hidden
559 void SUIT_Application::setActionShown( QAction* a, const bool on )
561 setMenuShown( a, on );
562 setToolShown( a, on );
566 Show/hide both menu item and tool button corresponding to action
567 \param id - identificator in both menu manager and tool manager
568 \param on - if it is true, the item will be shown, otherwise it will be hidden
570 void SUIT_Application::setActionShown( const int id, const bool on )
572 setMenuShown( id, on );
573 setToolShown( id, on );
577 \return action by it's SUIT identificator
578 \param id - SUIT identificator
580 QAction* SUIT_Application::action( const int id ) const
583 if ( myActionMap.contains( id ) )
589 \return SUIT identificator of action
592 int SUIT_Application::actionId( const QAction* a ) const
595 for ( QMap<int, QAction*>::ConstIterator it = myActionMap.begin(); it != myActionMap.end() && id == -1; ++it )
597 if ( it.value() == a )
603 QList<QAction*> SUIT_Application::actions() const
605 return myActionMap.values();
608 QList<int> SUIT_Application::actionIds() const
610 return myActionMap.keys();
614 Creates action and registers it both in menu manager and tool manager
615 \return new instance of action
616 \param id - proposed SUIT identificator
617 \param text - description
618 \param icon - icon for toolbar
619 \param menu - menu text
620 \param tip - tool tip
621 \param key - shortcut
622 \param parent - parent object
623 \param toggle - if it is TRUE the action will be a toggle action, otherwise it will be a command action
624 \param reciever - object that contains slot
625 \param member - slot to be called when action is activated
627 QAction* SUIT_Application::createAction( const int id, const QString& text, const QIcon& icon,
628 const QString& menu, const QString& tip, const int key,
629 QObject* parent, const bool toggle, QObject* reciever,
630 const char* member, const QString& shortcutAction )
632 QtxAction* a = new QtxAction( text, icon, menu, key, parent, toggle, shortcutAction );
633 a->setStatusTip( tip );
635 if ( reciever && member )
636 connect( a, SIGNAL( triggered( bool ) ), reciever, member );
638 registerAction( id, a );
644 Registers action both in menu manager and tool manager
645 \param id - proposed SUIT identificator (if it is -1, auto generated one is used)
648 int SUIT_Application::registerAction( const int id, QAction* a )
650 int ident = actionId( a );
654 static int generatedId = -1;
655 ident = id == -1 ? --generatedId : id;
657 if ( action( ident ) )
658 qWarning( "Action registration id is already in use: %d", ident );
660 myActionMap.insert( ident, a );
662 if ( desktop() && desktop()->menuMgr() )
663 desktop()->menuMgr()->registerAction( a );
665 if ( desktop() && desktop()->toolMgr() )
666 desktop()->toolMgr()->registerAction( a );
669 desktop()->addAction( a );
675 \return global action used as separator
677 QAction* SUIT_Application::separator()
679 return QtxActionMgr::separator();
683 SLOT: it is called when desktop is activated
686 void SUIT_Application::onDesktopActivated()
688 emit activated( this );
692 SLOT: is used for Help browsing
694 void SUIT_Application::onHelpContextModule( const QString& /*theComponentName*/,
695 const QString& /*theFileName*/,
696 const QString& /*theContext*/ )