-// Copyright (C) 2005 OPEN CASCADE, CEA/DEN, EDF R&D, PRINCIPIA R&D
-//
+// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// 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 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
+// 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.
//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
+// 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/
+// 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 <qlabel.h>
-#include <qtimer.h>
-#include <qstatusbar.h>
+#include <QTimer>
+#include <QLabel>
+#include <QStatusBar>
+#include <QApplication>
+#include <QSize>
#include <QtxAction.h>
#include <QtxActionMenuMgr.h>
#include <QtxActionToolMgr.h>
+
+/*!
+ \class StatusLabel
+ \brief Status bar customization label. Used to workaroubd desktop resizing bug.
+ \internal
+*/
+class StatusLabel : public QLabel
+{
+public:
+ StatusLabel( QWidget* parent ) : QLabel( parent ) {}
+ QSize minimumSizeHint () const { return QSize( 0, QLabel::minimumSizeHint().height() ); }
+};
+
/*!
Default constructor
*/
SUIT_Application::SUIT_Application()
: QObject( 0 ),
-myStudy( 0 ),
-myDesktop( 0 ),
-myStatusLabel( 0 )
-{
+ myStudy( 0 ),
+ myDesktop( 0 ),
+ myStatusLabel( 0 )
+{
+ if ( SUIT_Session::session() )
+ SUIT_Session::session()->insertApplication( this );
}
/*!
Destructor
*/
-SUIT_Application::~SUIT_Application()
+SUIT_Application::~SUIT_Application()
{
- delete myStudy;
- myStudy = 0;
+ SUIT_Study* s = myStudy;
+ setActiveStudy( 0 );
+ delete s;
setDesktop( 0 );
}
}
/*!
- \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 SUIT_Application::isPossibleToClose( bool& )
{
return true;
}
*/
QString SUIT_Application::applicationVersion() const
{
- return QString::null;
+ return QString();
}
/*!
{
if ( desktop() )
desktop()->show();
+
+ // Initialize shortcut manager
+ SUIT_ShortcutMgr::Init();
}
/*!
return status;
}
-/*!
- Opens other study into active Study. If Study is empty - creates it.
- \param theName - name of study
-*/
-bool SUIT_Application::useStudy( const QString& theName )
-{
- return false;
-}
-
/*!
Creates new empty Study if active Study = 0
*/
}
/*!
- \return number of Studies.
+ \return number of Studies.
Must be redefined in Applications which support several studies for one Application instance.
*/
int SUIT_Application::getNbStudies() 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
/*!
- Puts the message to the status bar
+ Puts the message to the status bar
\param msg - text of message
\param msec - time in milliseconds, after that the status label will be cleared
*/
-void SUIT_Application::putInfo ( const QString& msg, const int msec )
+void SUIT_Application::putInfo( const QString& msg, const int msec )
{
if ( !desktop() )
return;
if ( !myStatusLabel )
{
- myStatusLabel = new QLabel( desktop()->statusBar() );
+ myStatusLabel = new StatusLabel( desktop()->statusBar() );
desktop()->statusBar()->addWidget( myStatusLabel, 1 );
myStatusLabel->show();
}
+ QString prev = myStatusLabel->text();
+
myStatusLabel->setText( msg );
if ( msec != -1 )
- QTimer::singleShot( msec <= 0 ? DEFAULT_MESSAGE_DELAY : msec, myStatusLabel, SLOT( clear() ) );
+ QTimer::singleShot( msec <= 0 ? DEFAULT_MESSAGE_DELAY : msec, this, SLOT( onInfoClear() ) );
+
+ if ( prev != msg )
+ emit infoChanged( msg );
+}
+
+/*!
+ Clear the information label in status bar after delay.
+*/
+void SUIT_Application::onInfoClear()
+{
+ if ( !myStatusLabel )
+ return;
+
+ bool changed = !myStatusLabel->text().isEmpty();
+ myStatusLabel->clear();
+ if ( changed )
+ emit infoChanged( QString() );
+}
+
+/*!
+ Update status of the registerd actions
+*/
+void SUIT_Application::updateCommandsStatus()
+{
}
/*!
*/
SUIT_Application* SUIT_Application::startApplication( int argc, char** argv ) const
{
- return startApplication( name(), argc, argv );
+ return startApplication( objectName(), argc, argv );
}
/*!
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 )
+ 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));
+ }
}
/*!
if ( myStudy == study )
return;
+ if ( myStudy )
+ disconnect( myStudy, SIGNAL( studyModified( SUIT_Study* ) ),
+ this, SLOT( updateCommandsStatus() ) );
+ if ( study )
+ connect( study, SIGNAL( studyModified( SUIT_Study* ) ),
+ this, SLOT( updateCommandsStatus() ) );
+
myStudy = 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 );
}
/*!
/*!
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 )
{
- setMenuShown( actionId( a ), on );
+ if ( !a || !desktop() )
+ return;
+
+ QtxActionMenuMgr* mMgr = desktop()->menuMgr();
+ if ( mMgr )
+ mMgr->setShown( mMgr->actionId( a ), 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 )
{
- if ( desktop() && desktop()->menuMgr() )
- desktop()->menuMgr()->setShown( id, on );
+ setMenuShown( action( id ), 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 )
{
- setToolShown( actionId( a ), on );
+ if ( !a || !desktop() )
+ return;
+
+ QtxActionToolMgr* tMgr = desktop()->toolMgr();
+ if ( tMgr )
+ tMgr->setShown( tMgr->actionId( a ), 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 )
{
- if ( desktop() && desktop()->toolMgr() )
- desktop()->toolMgr()->setShown( id, on );
+ setToolShown( action( id ), 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 )
{
/*!
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 )
{
int SUIT_Application::actionId( const QAction* a ) const
{
int id = -1;
- for ( QMap<int, QAction*>::ConstIterator it = myActionMap.begin();
- it != myActionMap.end() && id == -1;
- ++it ) {
- if ( it.data() == a )
+ for ( QMap<int, QAction*>::ConstIterator it = myActionMap.begin(); it != myActionMap.end() && id == -1; ++it )
+ {
+ if ( it.value() == a )
id = it.key();
}
return id;
}
+QList<QAction*> SUIT_Application::actions() const
+{
+ return myActionMap.values();
+}
+
+QList<int> SUIT_Application::actionIds() const
+{
+ return myActionMap.keys();
+}
+
/*!
Creates action and registers it both in menu manager and tool manager
\return new instance of action
\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 QIconSet& icon,
+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, 0, 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 )
- connect( a, SIGNAL( activated() ), reciever, member );
+ connect( a, SIGNAL( triggered( bool ) ), reciever, member );
registerAction( id, a );
static int generatedId = -1;
ident = id == -1 ? --generatedId : id;
- if ( action( ident ) )
+ if ( action( ident ) )
qWarning( "Action registration id is already in use: %d", ident );
myActionMap.insert( ident, a );
if ( desktop() && desktop()->toolMgr() )
desktop()->toolMgr()->registerAction( a );
+ if ( desktop() )
+ desktop()->addAction( a );
+
return ident;
}
{
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*/ )
+{
+}