Salome HOME
updated copyright message
[modules/gui.git] / src / SUIT / SUIT_Application.cxx
old mode 100755 (executable)
new mode 100644 (file)
index 042b6fc..331f0fb
@@ -1,30 +1,32 @@
-//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2023  CEA, EDF, OPEN CASCADE
 //
-//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
 //
-//  This library is free software; you can redistribute it and/or
-//  modify it under the terms of the GNU Lesser General Public
-//  License as published by the Free Software Foundation; either
-//  version 2.1 of the License.
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
 //
-//  This library is distributed in the hope that it will be useful,
-//  but WITHOUT ANY WARRANTY; without even the implied warranty of
-//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-//  Lesser General Public License for more details.
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
 //
-//  You should have received a copy of the GNU Lesser General Public
-//  License along with this library; if not, write to the Free Software
-//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
-//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
 #include "SUIT_Application.h"
 
 #include "SUIT_Study.h"
 #include "SUIT_Session.h"
 #include "SUIT_Desktop.h"
 #include "SUIT_ResourceMgr.h"
+#include "SUIT_ShortcutMgr.h"
 
 #include <QTimer>
 #include <QLabel>
@@ -36,6 +38,7 @@
 #include <QtxActionMenuMgr.h>
 #include <QtxActionToolMgr.h>
 
+
 /*!
   \class StatusLabel
   \brief Status bar customization label. Used to workaroubd desktop resizing bug.
@@ -55,7 +58,8 @@ SUIT_Application::SUIT_Application()
 : QObject( 0 ),
   myStudy( 0 ),
   myDesktop( 0 ),
-  myStatusLabel( 0 )
+  myStatusLabel( 0 ),
+  myPostRoutines( QList<PostRoutine>() )
 {
   if ( SUIT_Session::session() )
     SUIT_Session::session()->insertApplication( this );
@@ -71,6 +75,9 @@ SUIT_Application::~SUIT_Application()
   delete s;
 
   setDesktop( 0 );
+
+  foreach ( PostRoutine routine, myPostRoutines )
+    routine();
 }
 
 /*!
@@ -82,8 +89,8 @@ SUIT_Desktop* SUIT_Application::desktop()
 }
 
 /*!
-   \return FALSE if application can not be closed (because of non saved data for example).
-   This method called by SUIT_Session whin closing of application was requested.
+   \return \c false if application can not be closed (because of non saved data for example).
+   This method called by SUIT_Session when closing of application was requested.
 */
 bool SUIT_Application::isPossibleToClose( bool& )
 {
@@ -122,6 +129,9 @@ void SUIT_Application::start()
 {
   if ( desktop() )
     desktop()->show();
+
+  // Initialize shortcut manager
+  SUIT_ShortcutMgr::Init();
 }
 
 /*!
@@ -173,6 +183,15 @@ SUIT_ResourceMgr* SUIT_Application::resourceMgr() const
   return SUIT_Session::session()->resourceMgr();
 }
 
+/*!
+  \brief Get access to shortcut manager.
+  \return global shortcut manager
+*/
+SUIT_ShortcutMgr* SUIT_Application::shortcutMgr() const
+{
+  return SUIT_ShortcutMgr::getShortcutMgr();
+}
+
 #define DEFAULT_MESSAGE_DELAY 3000
 
 /*!
@@ -257,10 +276,13 @@ void SUIT_Application::setDesktop( SUIT_Desktop* desk )
   if ( myDesktop == desk )
     return;
 
-  delete myDesktop;
+  // >> VSR 09/06/2009: workaround about the Qt 4.5.0 bug: SIGSEGV on desktop delete
+  myDesktop->deleteLater(); // delete myDesktop;
+  // << VSR 09/06/2009
   myDesktop = desk;
   if ( myDesktop ) {
     connect( myDesktop, SIGNAL( activated() ), this, SLOT( onDesktopActivated() ) );
+//    connect( myDesktop, SIGNAL( moved() ), this, SLOT( onDesktopMoved() ) );
     // Force desktop activation (NPAL16628)
     QApplication::postEvent(myDesktop, new QEvent(QEvent::WindowActivate));
   }
@@ -287,10 +309,10 @@ void SUIT_Application::setActiveStudy( SUIT_Study* study )
 
   if ( myStudy )
     disconnect( myStudy, SIGNAL( studyModified( SUIT_Study* ) ),
-               this, SLOT( updateCommandsStatus() ) );
+                this, SLOT( updateCommandsStatus() ) );
   if ( study )
     connect( study, SIGNAL( studyModified( SUIT_Study* ) ),
-            this, SLOT( updateCommandsStatus() ) );
+             this, SLOT( updateCommandsStatus() ) );
 
   myStudy = study;
 }
@@ -298,14 +320,15 @@ void SUIT_Application::setActiveStudy( SUIT_Study* study )
 /*!
   Creates new toolbar
   \return identificator of new toolbar in tool manager
-  \param name - name of new toolbar
+  \param title - title of new toolbar
+  \param name - name (identifier) of new toolbar
 */
-int SUIT_Application::createTool( const QString& name )
+int SUIT_Application::createTool( const QString& title, const QString& name )
 {
   if ( !desktop() || !desktop()->toolMgr() )
     return -1;
 
-  return desktop()->toolMgr()->createToolBar( name );
+  return desktop()->toolMgr()->createToolBar( title, name );
 }
 
 /*!
@@ -376,6 +399,16 @@ int SUIT_Application::createTool( const int id, const QString& tBar, const int i
   return intId != -1 ? id : -1;
 }
 
+/*!
+  Clears given toolbar.
+  \param title - title of toolbar
+*/
+void SUIT_Application::clearTool( const QString& title )
+{
+  if ( desktop() && desktop()->toolMgr() )
+    desktop()->toolMgr()->clear( title );
+}
+
 /*!
   Creates new menu item
   \return identificator of new action in menu manager
@@ -487,7 +520,7 @@ int SUIT_Application::createMenu( const int id, const QString& menu, const int g
 /*!
   Show/hide menu item corresponding to action
   \param a - action
-  \param on - if it is true, the item will be shown, otherwise it will be hidden
+  \param on - if it is \c true, the item will be shown, otherwise it will be hidden
 */
 void SUIT_Application::setMenuShown( QAction* a, const bool on )
 {
@@ -502,7 +535,7 @@ void SUIT_Application::setMenuShown( QAction* a, const bool on )
 /*!
   Show/hide menu item corresponding to action
   \param id - identificator of action in menu manager
-  \param on - if it is true, the item will be shown, otherwise it will be hidden
+  \param on - if it is \c true, the item will be shown, otherwise it will be hidden
 */
 void SUIT_Application::setMenuShown( const int id, const bool on )
 {
@@ -512,7 +545,7 @@ void SUIT_Application::setMenuShown( const int id, const bool on )
 /*!
   Show/hide tool button corresponding to action
   \param a - action
-  \param on - if it is true, the button will be shown, otherwise it will be hidden
+  \param on - if it is \c true, the button will be shown, otherwise it will be hidden
 */
 void SUIT_Application::setToolShown( QAction* a, const bool on )
 {
@@ -527,7 +560,7 @@ void SUIT_Application::setToolShown( QAction* a, const bool on )
 /*!
   Show/hide menu item corresponding to action
   \param id - identificator of action in tool manager
-  \param on - if it is true, the button will be shown, otherwise it will be hidden
+  \param on - if it is \c true, the button will be shown, otherwise it will be hidden
 */
 void SUIT_Application::setToolShown( const int id, const bool on )
 {
@@ -537,7 +570,7 @@ void SUIT_Application::setToolShown( const int id, const bool on )
 /*!
   Show/hide both menu item and tool button corresponding to action
   \param a - action
-  \param on - if it is true, the item will be shown, otherwise it will be hidden
+  \param on - if it is \c true, the item will be shown, otherwise it will be hidden
 */
 void SUIT_Application::setActionShown( QAction* a, const bool on )
 {
@@ -548,7 +581,7 @@ void SUIT_Application::setActionShown( QAction* a, const bool on )
 /*!
   Show/hide both menu item and tool button corresponding to action
   \param id - identificator in both menu manager and tool manager
-  \param on - if it is true, the item will be shown, otherwise it will be hidden
+  \param on - if it is \c true, the item will be shown, otherwise it will be hidden
 */
 void SUIT_Application::setActionShown( const int id, const bool on )
 {
@@ -603,15 +636,38 @@ QList<int> SUIT_Application::actionIds() const
   \param tip - tool tip
   \param key - shortcut
   \param parent - parent object
-  \param toggle - if it is TRUE the action will be a toggle action, otherwise it will be a command action
+  \param toggle - if it is \c true the action will be a toggle action, otherwise it will be a command action
   \param reciever - object that contains slot
   \param member - slot to be called when action is activated
 */
 QAction* SUIT_Application::createAction( const int id, const QString& text, const QIcon& icon,
                                          const QString& menu, const QString& tip, const int key,
-                                         QObject* parent, const bool toggle, QObject* reciever, const char* member )
+                                         QObject* parent, const bool toggle, QObject* reciever, 
+                                        const char* member, const QString& shortcutAction )
 {
-  QtxAction* a = new QtxAction( text, icon, menu, key, parent, toggle );
+  return createAction( id, text, icon, menu, tip, QKeySequence(key), parent, toggle, reciever, member, shortcutAction );
+}
+
+/*!
+  Creates action and registers it both in menu manager and tool manager
+  \return new instance of action
+  \param id - proposed SUIT identificator
+  \param text - description
+  \param icon - icon for toolbar
+  \param menu - menu text
+  \param tip - tool tip
+  \param key - shortcut
+  \param parent - parent object
+  \param toggle - if it is TRUE the action will be a toggle action, otherwise it will be a command action
+  \param reciever - object that contains slot
+  \param member - slot to be called when action is activated
+*/
+QAction* SUIT_Application::createAction( const int id, const QString& text, const QIcon& icon,
+                                         const QString& menu, const QString& tip, const QKeySequence& key,
+                                         QObject* parent, const bool toggle, QObject* reciever, 
+                                        const char* member, const QString& shortcutAction )
+{
+  QtxAction* a = new QtxAction( text, icon, menu, key, parent, toggle, shortcutAction );
   a->setStatusTip( tip );
 
   if ( reciever && member )
@@ -647,7 +703,8 @@ int SUIT_Application::registerAction( const int id, QAction* a )
   if ( desktop() && desktop()->toolMgr() )
     desktop()->toolMgr()->registerAction( a );
 
-  if ( desktop() )
+  if ( desktop() && a->shortcutContext() != Qt::WidgetShortcut &&
+       a->shortcutContext() != Qt::WidgetWithChildrenShortcut )
     desktop()->addAction( a );
 
   return ident;
@@ -670,11 +727,24 @@ void SUIT_Application::onDesktopActivated()
   emit activated( this );
 }
 
+/*!
+  SLOT: it is called when desktop is moved
+*/
+/*void SUIT_Application::onDesktopMoved()
+{
+  emit moving();
+}*/
 /*!
   SLOT: is used for Help browsing
 */
 void SUIT_Application::onHelpContextModule( const QString& /*theComponentName*/,
                                             const QString& /*theFileName*/,
-                                           const QString& /*theContext*/ )
+                                            const QString& /*theContext*/ )
+{
+}
+
+void SUIT_Application::addPostRoutine( PostRoutine theRoutine )
 {
+  if ( !myPostRoutines.contains( theRoutine ) )
+    myPostRoutines << theRoutine;
 }