1 // Copyright (C) 2007-2015 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 // connect( myDesktop, SIGNAL( moved() ), this, SLOT( onDesktopMoved() ) );
282 // Force desktop activation (NPAL16628)
283 QApplication::postEvent(myDesktop, new QEvent(QEvent::WindowActivate));
288 Creates new instance of study.
289 By default, it is called from createEmptyStudy()
290 \sa createEmptyStudy()
292 SUIT_Study* SUIT_Application::createNewStudy()
294 return new SUIT_Study( this );
299 \param study - instance of study to be set as active
301 void SUIT_Application::setActiveStudy( SUIT_Study* study )
303 if ( myStudy == study )
307 disconnect( myStudy, SIGNAL( studyModified( SUIT_Study* ) ),
308 this, SLOT( updateCommandsStatus() ) );
310 connect( study, SIGNAL( studyModified( SUIT_Study* ) ),
311 this, SLOT( updateCommandsStatus() ) );
318 \return identificator of new toolbar in tool manager
319 \param title - title of new toolbar
320 \param name - name (identifier) of new toolbar
322 int SUIT_Application::createTool( const QString& title, const QString& name )
324 if ( !desktop() || !desktop()->toolMgr() )
327 return desktop()->toolMgr()->createToolBar( title, name );
331 Creates new toolbutton
332 \return SUIT identificator of new action
334 \param tBar - identificator of toolbar
335 \param id - proposed SUIT identificator of action (if it is -1, then must be use any free)
336 \param idx - index in toolbar
338 int SUIT_Application::createTool( QAction* a, const int tBar, const int id, const int idx )
340 if ( !desktop() || !desktop()->toolMgr() )
343 int regId = registerAction( id, a );
344 int intId = desktop()->toolMgr()->insert( a, tBar, idx );
345 return intId != -1 ? regId : -1;
349 Creates new toolbutton
350 \return SUIT identificator of new action
352 \param tBar - name of toolbar
353 \param id - proposed SUIT identificator of action (if it is -1, then must be use any free)
354 \param idx - index in toolbar
356 int SUIT_Application::createTool( QAction* a, const QString& tBar, const int id, const int idx )
358 if ( !desktop() || !desktop()->toolMgr() )
361 int regId = registerAction( id, a );
362 int intId = desktop()->toolMgr()->insert( a, tBar, idx );
363 return intId != -1 ? regId : -1;
367 Creates new toolbutton
368 \return "id" if all right or -1 otherwise
369 \param id - SUIT identificator of action
370 \param tBar - identificator of toolbar
371 \param idx - index in toolbar
373 int SUIT_Application::createTool( const int id, const int tBar, const int idx )
375 if ( !desktop() || !desktop()->toolMgr() )
378 int intId = desktop()->toolMgr()->insert( action( id ), tBar, idx );
379 return intId != -1 ? id : -1;
383 Creates new toolbutton
384 \return "id" if all right or -1 otherwise
385 \param id - SUIT identificator of action
386 \param tBar - name of toolbar
387 \param idx - index in toolbar
389 int SUIT_Application::createTool( const int id, const QString& tBar, const int idx )
391 if ( !desktop() || !desktop()->toolMgr() )
394 int intId = desktop()->toolMgr()->insert( action( id ), tBar, idx );
395 return intId != -1 ? id : -1;
399 Creates new menu item
400 \return identificator of new action in menu manager
401 \param subMenu - menu text of new item
402 \param menu - identificator of parent menu item
403 \param id - proposed identificator of action
404 \param group - group in menu manager
405 \param index - index in menu
407 int SUIT_Application::createMenu( const QString& subMenu, const int menu,
408 const int id, const int group, const int index )
410 if ( !desktop() || !desktop()->menuMgr() )
413 return desktop()->menuMgr()->insert( subMenu, menu, group, id, index );
417 Creates new menu item
418 \return identificator of new action in menu manager
419 \param subMenu - menu text of new item
420 \param menu - menu text of parent menu item
421 \param id - proposed identificator of action
422 \param group - group in menu manager
423 \param index - index in menu
425 int SUIT_Application::createMenu( const QString& subMenu, const QString& menu,
426 const int id, const int group, const int index )
428 if ( !desktop() || !desktop()->menuMgr() )
431 return desktop()->menuMgr()->insert( subMenu, menu, group, id, index );
435 Creates new menu item
436 \return SUIT identificator of new action
438 \param menu - identificator of parent menu item
439 \param id - proposed SUIT identificator of action
440 \param group - group in menu manager
441 \param index - index in menu
443 int SUIT_Application::createMenu( QAction* a, const int menu, const int id, const int group, const int index )
445 if ( !a || !desktop() || !desktop()->menuMgr() )
448 int regId = registerAction( id, a );
449 int intId = desktop()->menuMgr()->insert( a, menu, group, index );
450 return intId != -1 ? regId : -1;
454 Creates new menu item
455 \return SUIT identificator of new action
457 \param menu - menu text of parent menu item
458 \param id - proposed SUIT identificator of action
459 \param group - group in menu manager
460 \param index - index in menu
462 int SUIT_Application::createMenu( QAction* a, const QString& menu, const int id, const int group, const int index )
464 if ( !a || !desktop() || !desktop()->menuMgr() )
467 int regId = registerAction( id, a );
468 int intId = desktop()->menuMgr()->insert( a, menu, group, index );
469 return intId != -1 ? regId : -1;
473 Creates new menu item
474 \return identificator of new action in menu manager
475 \param id - SUIT identificator of action
476 \param menu - menu text of parent menu item
477 \param group - group in menu manager
478 \param index - index in menu
480 int SUIT_Application::createMenu( const int id, const int menu, const int group, const int index )
482 if ( !desktop() || !desktop()->menuMgr() )
485 int intId = desktop()->menuMgr()->insert( action( id ), menu, group, index );
486 return intId != -1 ? id : -1;
490 Creates new menu item
491 \return identificator of new action in menu manager
492 \param id - SUIT identificator of action
493 \param menu - menu text of parent menu item
494 \param group - group in menu manager
495 \param index - index in menu
497 int SUIT_Application::createMenu( const int id, const QString& menu, const int group, const int index )
499 if ( !desktop() || !desktop()->menuMgr() )
502 int intId = desktop()->menuMgr()->insert( action( id ), menu, group, index );
503 return intId != -1 ? id : -1;
507 Show/hide menu item corresponding to action
509 \param on - if it is true, the item will be shown, otherwise it will be hidden
511 void SUIT_Application::setMenuShown( QAction* a, const bool on )
513 if ( !a || !desktop() )
516 QtxActionMenuMgr* mMgr = desktop()->menuMgr();
518 mMgr->setShown( mMgr->actionId( a ), on );
522 Show/hide menu item corresponding to action
523 \param id - identificator of action in menu manager
524 \param on - if it is true, the item will be shown, otherwise it will be hidden
526 void SUIT_Application::setMenuShown( const int id, const bool on )
528 setMenuShown( action( id ), on );
532 Show/hide tool button corresponding to action
534 \param on - if it is true, the button will be shown, otherwise it will be hidden
536 void SUIT_Application::setToolShown( QAction* a, const bool on )
538 if ( !a || !desktop() )
541 QtxActionToolMgr* tMgr = desktop()->toolMgr();
543 tMgr->setShown( tMgr->actionId( a ), on );
547 Show/hide menu item corresponding to action
548 \param id - identificator of action in tool manager
549 \param on - if it is true, the button will be shown, otherwise it will be hidden
551 void SUIT_Application::setToolShown( const int id, const bool on )
553 setToolShown( action( id ), on );
557 Show/hide both menu item and tool button corresponding to action
559 \param on - if it is true, the item will be shown, otherwise it will be hidden
561 void SUIT_Application::setActionShown( QAction* a, const bool on )
563 setMenuShown( a, on );
564 setToolShown( a, on );
568 Show/hide both menu item and tool button corresponding to action
569 \param id - identificator in both menu manager and tool manager
570 \param on - if it is true, the item will be shown, otherwise it will be hidden
572 void SUIT_Application::setActionShown( const int id, const bool on )
574 setMenuShown( id, on );
575 setToolShown( id, on );
579 \return action by it's SUIT identificator
580 \param id - SUIT identificator
582 QAction* SUIT_Application::action( const int id ) const
585 if ( myActionMap.contains( id ) )
591 \return SUIT identificator of action
594 int SUIT_Application::actionId( const QAction* a ) const
597 for ( QMap<int, QAction*>::ConstIterator it = myActionMap.begin(); it != myActionMap.end() && id == -1; ++it )
599 if ( it.value() == a )
605 QList<QAction*> SUIT_Application::actions() const
607 return myActionMap.values();
610 QList<int> SUIT_Application::actionIds() const
612 return myActionMap.keys();
616 Creates action and registers it both in menu manager and tool manager
617 \return new instance of action
618 \param id - proposed SUIT identificator
619 \param text - description
620 \param icon - icon for toolbar
621 \param menu - menu text
622 \param tip - tool tip
623 \param key - shortcut
624 \param parent - parent object
625 \param toggle - if it is TRUE the action will be a toggle action, otherwise it will be a command action
626 \param reciever - object that contains slot
627 \param member - slot to be called when action is activated
629 QAction* SUIT_Application::createAction( const int id, const QString& text, const QIcon& icon,
630 const QString& menu, const QString& tip, const int key,
631 QObject* parent, const bool toggle, QObject* reciever,
632 const char* member, const QString& shortcutAction )
634 return createAction( id, text, icon, menu, tip, QKeySequence(key), parent, toggle, reciever, member, shortcutAction );
638 Creates action and registers it both in menu manager and tool manager
639 \return new instance of action
640 \param id - proposed SUIT identificator
641 \param text - description
642 \param icon - icon for toolbar
643 \param menu - menu text
644 \param tip - tool tip
645 \param key - shortcut
646 \param parent - parent object
647 \param toggle - if it is TRUE the action will be a toggle action, otherwise it will be a command action
648 \param reciever - object that contains slot
649 \param member - slot to be called when action is activated
651 QAction* SUIT_Application::createAction( const int id, const QString& text, const QIcon& icon,
652 const QString& menu, const QString& tip, const QKeySequence& key,
653 QObject* parent, const bool toggle, QObject* reciever,
654 const char* member, const QString& shortcutAction )
656 QtxAction* a = new QtxAction( text, icon, menu, key, parent, toggle, shortcutAction );
657 a->setStatusTip( tip );
659 if ( reciever && member )
660 connect( a, SIGNAL( triggered( bool ) ), reciever, member );
662 registerAction( id, a );
668 Registers action both in menu manager and tool manager
669 \param id - proposed SUIT identificator (if it is -1, auto generated one is used)
672 int SUIT_Application::registerAction( const int id, QAction* a )
674 int ident = actionId( a );
678 static int generatedId = -1;
679 ident = id == -1 ? --generatedId : id;
681 if ( action( ident ) )
682 qWarning( "Action registration id is already in use: %d", ident );
684 myActionMap.insert( ident, a );
686 if ( desktop() && desktop()->menuMgr() )
687 desktop()->menuMgr()->registerAction( a );
689 if ( desktop() && desktop()->toolMgr() )
690 desktop()->toolMgr()->registerAction( a );
693 desktop()->addAction( a );
699 \return global action used as separator
701 QAction* SUIT_Application::separator()
703 return QtxActionMgr::separator();
707 SLOT: it is called when desktop is activated
710 void SUIT_Application::onDesktopActivated()
712 emit activated( this );
716 SLOT: it is called when desktop is moved
718 /*void SUIT_Application::onDesktopMoved()
723 SLOT: is used for Help browsing
725 void SUIT_Application::onHelpContextModule( const QString& /*theComponentName*/,
726 const QString& /*theFileName*/,
727 const QString& /*theContext*/ )