1 // Copyright (C) 2007-2019 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 "STD_Application.h"
25 #include "STD_MDIDesktop.h"
27 #include <SUIT_Tools.h>
28 #include <SUIT_Study.h>
29 #include <SUIT_Desktop.h>
30 #include <SUIT_Session.h>
31 #include <SUIT_MessageBox.h>
32 #include <SUIT_ViewManager.h>
33 #include <SUIT_ResourceMgr.h>
35 #include <QtxDockAction.h>
37 #include <QtxActionMenuMgr.h>
38 #include <QtxActionToolMgr.h>
42 #include <QCloseEvent>
43 #include <QFileDialog>
44 #include <QApplication>
46 /*!Create and return new instance of STD_Application*/
47 extern "C" STD_EXPORT SUIT_Application* createApplication()
49 return new STD_Application();
53 STD_Application::STD_Application()
57 myExitConfirm( true ),
60 setDesktop( new STD_MDIDesktop() );
64 STD_Application::~STD_Application()
69 /*! \retval requirement of exit confirmation*/
70 bool STD_Application::exitConfirmation() const
75 /*! Set the requirement of exit confirmation*/
76 void STD_Application::setExitConfirmation( const bool on )
81 /*! \retval QString "StdApplication"*/
82 QString STD_Application::applicationName() const
84 return QString( "StdApplication" );
87 /*!Start STD_Application*/
88 void STD_Application::start()
93 updateCommandsStatus();
94 setEditEnabled( myEditEnabled );
98 SUIT_Application::start();
102 Close the Application
104 void STD_Application::closeApplication()
108 SUIT_Study* study = activeStudy();
112 beforeCloseDoc( study );
114 study->closeDocument();
124 SUIT_Application::closeApplication();
127 /*!Event on closing desktop*/
128 void STD_Application::onDesktopClosing( SUIT_Desktop*, QCloseEvent* e )
130 if ( SUIT_Session::session()->applications().count() < 2 )
136 bool closePermanently;
137 if ( !isPossibleToClose( closePermanently ) )
146 /*!Create actions, menus and tools*/
147 void STD_Application::createActions()
149 SUIT_Desktop* desk = desktop();
150 SUIT_ResourceMgr* resMgr = resourceMgr();
151 if ( !desk || !resMgr )
156 createAction( FileNewId, tr( "TOT_DESK_FILE_NEW" ),
157 resMgr->loadPixmap( "STD", tr( "ICON_FILE_NEW" ) ),
158 tr( "MEN_DESK_FILE_NEW" ), tr( "PRP_DESK_FILE_NEW" ),
159 Qt::CTRL+Qt::Key_N, desk, false, this, SLOT( onNewDoc() ) );
161 createAction( FileOpenId, tr( "TOT_DESK_FILE_OPEN" ),
162 resMgr->loadPixmap( "STD", tr( "ICON_FILE_OPEN" ) ),
163 tr( "MEN_DESK_FILE_OPEN" ), tr( "PRP_DESK_FILE_OPEN" ),
164 Qt::CTRL+Qt::Key_O, desk, false, this, SLOT( onOpenDoc() ) );
166 createAction( FileReopenId, tr( "TOT_DESK_FILE_REOPEN" ), QIcon(),
167 tr( "MEN_DESK_FILE_REOPEN" ), tr( "PRP_DESK_FILE_REOPEN" ),
168 0, desk, false, this, SLOT( onReopenDoc() ) );
170 createAction( FileCloseId, tr( "TOT_DESK_FILE_CLOSE" ),
171 resMgr->loadPixmap( "STD", tr( "ICON_FILE_CLOSE" ) ),
172 tr( "MEN_DESK_FILE_CLOSE" ), tr( "PRP_DESK_FILE_CLOSE" ),
173 Qt::CTRL+Qt::Key_W, desk, false, this, SLOT( onCloseDoc() ) );
174 //no need in this action for mono-study application as it is same as NewDoc
175 action( FileCloseId )->setVisible( false );
177 createAction( FileExitId, tr( "TOT_DESK_FILE_EXIT" ), QIcon(),
178 tr( "MEN_DESK_FILE_EXIT" ), tr( "PRP_DESK_FILE_EXIT" ),
179 Qt::CTRL+Qt::Key_Q, desk, false, this, SLOT( onExit() ) );
181 createAction( FileSaveId, tr( "TOT_DESK_FILE_SAVE" ),
182 resMgr->loadPixmap( "STD", tr( "ICON_FILE_SAVE" ) ),
183 tr( "MEN_DESK_FILE_SAVE" ), tr( "PRP_DESK_FILE_SAVE" ),
184 Qt::CTRL+Qt::Key_S, desk, false, this, SLOT( onSaveDoc() ) );
186 createAction( FileSaveAsId, tr( "TOT_DESK_FILE_SAVEAS" ), QIcon(),
187 tr( "MEN_DESK_FILE_SAVEAS" ), tr( "PRP_DESK_FILE_SAVEAS" ),
188 Qt::CTRL+Qt::SHIFT+Qt::Key_S, desk, false, this, SLOT( onSaveAsDoc() ) );
190 createAction( EditCopyId, tr( "TOT_DESK_EDIT_COPY" ),
191 resMgr->loadPixmap( "STD", tr( "ICON_EDIT_COPY" ) ),
192 tr( "MEN_DESK_EDIT_COPY" ), tr( "PRP_DESK_EDIT_COPY" ),
193 Qt::CTRL+Qt::Key_C, desk, false, this, SLOT( onCopy() ) );
195 createAction( EditPasteId, tr( "TOT_DESK_EDIT_PASTE" ),
196 resMgr->loadPixmap( "STD", tr( "ICON_EDIT_PASTE" ) ),
197 tr( "MEN_DESK_EDIT_PASTE" ), tr( "PRP_DESK_EDIT_PASTE" ),
198 Qt::CTRL+Qt::Key_V, desk, false, this, SLOT( onPaste() ) );
200 QAction* a = createAction( ViewStatusBarId, tr( "TOT_DESK_VIEW_STATUSBAR" ),
201 QIcon(), tr( "MEN_DESK_VIEW_STATUSBAR" ),
202 tr( "PRP_DESK_VIEW_STATUSBAR" ), Qt::ALT+Qt::SHIFT+Qt::Key_S, desk, true );
203 a->setChecked( desk->statusBar()->isVisibleTo( desk ) );
204 connect( a, SIGNAL( toggled( bool ) ), this, SLOT( onViewStatusBar( bool ) ) );
206 createAction( NewWindowId, tr( "TOT_DESK_NEWWINDOW" ), QIcon(),
207 tr( "MEN_DESK_NEWWINDOW" ), tr( "PRP_DESK_NEWWINDOW" ), 0, desk );
209 createAction( HelpAboutId, tr( "TOT_DESK_HELP_ABOUT" ),
210 resMgr->loadPixmap( "STD", tr( "ICON_DESK_ABOUT" ) ),
211 tr( "MEN_DESK_HELP_ABOUT" ), tr( "PRP_DESK_HELP_ABOUT" ),
212 Qt::ALT+Qt::SHIFT+Qt::Key_A, desk, false, this, SLOT( onHelpAbout() ) );
215 QtxDockAction* dwa = new QtxDockAction( tr( "TOT_DOCKWINDOWS" ), tr( "MEN_DESK_VIEW_DOCKWINDOWS" ), desk );
216 dwa->setDockType( QtxDockAction::DockWidget );
217 registerAction( ViewWindowsId, dwa );
219 QtxDockAction* tba = new QtxDockAction( tr( "TOT_TOOLBARS" ), tr( "MEN_DESK_VIEW_TOOLBARS" ), desk );
220 tba->setDockType( QtxDockAction::ToolBar );
221 registerAction( ViewToolBarsId, tba );
225 int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1, MenuFileId, 0 );
226 // Let the application developers insert some menus between Edit and View
227 int editMenu = createMenu( tr( "MEN_DESK_EDIT" ), -1, MenuEditId, 5 );
228 int viewMenu = createMenu( tr( "MEN_DESK_VIEW" ), -1, MenuViewId, 10 );
229 int helpMenu = createMenu( tr( "MEN_DESK_HELP" ), -1, MenuHelpId, 1000 );
233 createMenu( FileNewId, fileMenu, 0 );
234 createMenu( FileOpenId, fileMenu, 0 );
235 createMenu( FileReopenId, fileMenu, 0 );
236 createMenu( FileSaveId, fileMenu, 5 );
237 createMenu( FileSaveAsId, fileMenu, 5 );
238 createMenu( FileCloseId, fileMenu, 5 );
239 createMenu( separator(), fileMenu, -1, 5 );
241 createMenu( separator(), fileMenu );
242 createMenu( FileExitId, fileMenu );
244 createMenu( EditCopyId, editMenu );
245 createMenu( EditPasteId, editMenu );
246 createMenu( separator(), editMenu );
248 createMenu( ViewToolBarsId, viewMenu, 0 );
249 createMenu( ViewWindowsId, viewMenu, 0 );
250 createMenu( separator(), viewMenu, -1, 10 );
251 createMenu( ViewStatusBarId, viewMenu, 10 );
252 createMenu( separator(), viewMenu );
254 createMenu( HelpAboutId, helpMenu );
255 createMenu( separator(), helpMenu );
259 int stdTBar = createTool( tr( "INF_DESK_TOOLBAR_STANDARD" ), // title (language-dependant)
260 QString( "SalomeStandard" ) ); // name (language-independant)
264 createTool( FileNewId, stdTBar );
265 createTool( FileOpenId, stdTBar );
266 createTool( FileSaveId, stdTBar );
267 createTool( FileCloseId, stdTBar );
268 createTool( separator(), stdTBar );
269 createTool( EditCopyId, stdTBar );
270 createTool( EditPasteId, stdTBar );
273 /*!Opens new application*/
274 void STD_Application::onNewDoc()
276 onNewDoc( QString() );
279 /*!Opens new application*/
280 bool STD_Application::onNewDoc( const QString& name )
282 QApplication::setOverrideCursor( Qt::WaitCursor );
285 if ( !activeStudy() )
288 res = activeStudy()->createDocument( name );
290 studyCreated( activeStudy() );
293 SUIT_Study* st = activeStudy();
300 SUIT_Application* aApp = startApplication( 0, 0 );
301 if ( aApp->inherits( "STD_Application" ) )
302 res = ((STD_Application*)aApp)->onNewDoc( name );
305 aApp->createEmptyStudy();
306 res = aApp->activeStudy()->createDocument( name );
309 aApp->closeApplication();
312 QApplication::restoreOverrideCursor();
317 /*!Put file name from file dialog to onOpenDoc(const QString&) function*/
318 void STD_Application::onOpenDoc()
320 // It is preferrable to use OS-specific file dialog box here !!!
321 QString aName = getFileName( true, QString(), getFileFilter( true ), QString(), 0 );
322 if ( aName.isNull() )
328 /*! \retval \c true, if document was opened successful, else \c false.*/
329 bool STD_Application::onOpenDoc( const QString& aName )
331 if ( !abortAllOperations() )
334 QApplication::setOverrideCursor( Qt::WaitCursor );
336 bool res = openAction( openChoice( aName ), aName );
338 QApplication::restoreOverrideCursor();
343 /*! Reload document from the file.*/
344 bool STD_Application::onReopenDoc()
348 SUIT_Study* study = activeStudy();
349 if ( study && study->isSaved() ) {
350 // ask user for the confirmation
351 if ( SUIT_MessageBox::question( desktop(), tr( "REOPEN_STUDY" ), tr( "REOPEN_QUESTION" ),
352 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No
353 ) == SUIT_MessageBox::No )
356 // remember study name
357 QString studyName = study->studyName();
360 beforeCloseDoc( study );
361 study->closeDocument( true );
363 // update views / windows / status bar / title
371 // post closing actions
374 // reload study from the file
375 res = useFile( studyName ) && activeStudy();
377 // if reloading is failed, close the desktop
378 if ( activeStudy() && !res )
382 updateDesktopTitle();
383 updateCommandsStatus();
389 /*!Virtual function. Not implemented here.*/
390 void STD_Application::beforeCloseDoc( SUIT_Study* )
394 /*!Virtual function. Not implemented here.*/
395 void STD_Application::afterCloseDoc()
399 /*!Close document, if it's possible.*/
400 void STD_Application::onCloseDoc( bool ask )
405 /*!Close document, if it's possible.*/
406 bool STD_Application::closeDoc( bool ask )
408 bool closePermanently = true;
410 if ( ask && !isPossibleToClose( closePermanently ) )
413 return closeActiveDoc( closePermanently );
417 bool STD_Application::closeActiveDoc( bool permanently )
419 SUIT_Study* study = activeStudy();
420 if ( !study ) // no active study
423 beforeCloseDoc( study );
426 study->closeDocument( permanently );
433 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
434 for ( int i = 0; i < apps.count(); i++ )
435 aNbStudies += apps.at( i )->getNbStudies();
444 updateDesktopTitle();
445 updateCommandsStatus();
448 // IPAL19532: deleting study should be performed after calling setDesktop(0)
458 /*!Check the application on closing.
459 * \retval \c true if possible, else \c false
461 bool STD_Application::isPossibleToClose( bool& closePermanently )
465 activeStudy()->abortAllOperations();
466 if ( activeStudy()->isModified() )
468 QString sName = activeStudy()->studyName().trimmed();
469 return closeAction( closeChoice( sName ), closePermanently );
475 int STD_Application::closeChoice( const QString& docName )
477 int answer = SUIT_MessageBox::question( desktop(), tr( "CLOSE_STUDY" ), tr( "CLOSE_QUESTION" ),
478 SUIT_MessageBox::Save | SUIT_MessageBox::Discard | SUIT_MessageBox::Cancel,
479 SUIT_MessageBox::Save );
481 int res = CloseCancel;
482 if ( answer == SUIT_MessageBox::Save )
484 else if ( answer == SUIT_MessageBox::Discard )
490 bool STD_Application::closeAction( const int choice, bool& closePermanently )
496 if ( activeStudy()->isSaved() )
498 else if ( !onSaveAsDoc() )
511 int STD_Application::openChoice( const QString& aName )
513 SUIT_Session* aSession = SUIT_Session::session();
515 bool isAlreadyOpen = false;
516 QList<SUIT_Application*> aAppList = aSession->applications();
517 for ( QList<SUIT_Application*>::iterator it = aAppList.begin(); it != aAppList.end() && !isAlreadyOpen; ++it )
518 isAlreadyOpen = (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName;
519 return isAlreadyOpen ? OpenExist : OpenNew;
522 bool STD_Application::openAction( const int choice, const QString& aName )
529 SUIT_Application* aApp = 0;
530 SUIT_Session* aSession = SUIT_Session::session();
531 QList<SUIT_Application*> aAppList = aSession->applications();
532 for ( QList<SUIT_Application*>::iterator it = aAppList.begin(); it != aAppList.end() && !aApp; ++it )
534 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
538 aApp->desktop()->activateWindow();
544 if ( !activeStudy() )
545 res = useFile( aName );
548 SUIT_Application* aApp = startApplication( 0, 0 );
550 res = aApp->useFile( aName );
552 aApp->closeApplication();
563 /*!Save document if all ok, else error message.*/
564 void STD_Application::onSaveDoc()
566 if ( !activeStudy() )
569 if ( !abortAllOperations() )
573 if ( activeStudy()->isSaved() )
575 putInfo( tr( "INF_DOC_SAVING" ) + activeStudy()->studyName() );
577 QApplication::setOverrideCursor( Qt::WaitCursor );
579 isOk = activeStudy()->saveDocument();
581 QApplication::restoreOverrideCursor();
586 // displaying a message box as SUIT_Validator in case file can't be written (the most frequent case)
587 SUIT_MessageBox::critical( desktop(), tr( "ERR_ERROR" ),
588 tr( "INF_DOC_SAVING_FAILS" ).arg( activeStudy()->studyName() ) );
591 putInfo( tr( "INF_DOC_SAVED" ).arg( "" ) );
595 studySaved( activeStudy() );
600 /*! \retval \c true, if document saved successfully, else \c false.*/
601 bool STD_Application::onSaveAsDoc()
603 SUIT_Study* study = activeStudy();
607 if ( !abortAllOperations() )
613 QString aName = getFileName( false, study->studyName(), getFileFilter( false ), QString(), 0 );
614 if ( aName.isNull() )
617 QApplication::setOverrideCursor( Qt::WaitCursor );
619 putInfo( tr( "INF_DOC_SAVING" ) + aName );
620 isOk = study->saveDocumentAs( aName );
622 putInfo( isOk ? tr( "INF_DOC_SAVED" ).arg( aName ) : "" );
624 QApplication::restoreOverrideCursor();
627 SUIT_MessageBox::critical( desktop(), tr( "ERROR" ), tr( "INF_DOC_SAVING_FAILS" ).arg( aName ) );
630 studySaved( activeStudy() );
635 /*!Closing session.*/
636 void STD_Application::onExit()
638 int aAnswer = SUIT_MessageBox::Ok;
639 if ( exitConfirmation() )
640 aAnswer = SUIT_MessageBox::question( desktop(), tr( "INF_DESK_EXIT" ), tr( "QUE_DESK_EXIT" ),
641 SUIT_MessageBox::Ok | SUIT_MessageBox::Cancel, SUIT_MessageBox::Cancel );
642 if ( aAnswer == SUIT_MessageBox::Ok )
643 SUIT_Session::session()->closeSession();
646 /*!Virtual slot. Not implemented here.*/
647 void STD_Application::onCopy()
651 /*!Virtual slot. Not implemented here.*/
652 void STD_Application::onPaste()
656 /*!Sets \a theEnable for menu manager and for tool manager.*/
657 void STD_Application::setEditEnabled( bool theEnable )
659 myEditEnabled = theEnable;
661 QtxActionMenuMgr* mMgr = desktop()->menuMgr();
662 QtxActionToolMgr* tMgr = desktop()->toolMgr();
664 for ( int i = EditCopyId; i <= EditPasteId; i++ )
666 mMgr->setShown( mMgr->actionId(action(i)), myEditEnabled );
667 tMgr->setShown( tMgr->actionId(action(i)), myEditEnabled );
671 /*!\retval \c true, if document opened successfully, else \c false.*/
672 bool STD_Application::useFile(const QString& theFileName)
674 bool res = SUIT_Application::useFile( theFileName );
677 studyOpened( activeStudy() );
682 /*!Update desktop title.*/
683 void STD_Application::updateDesktopTitle()
685 QString aTitle = applicationName();
686 QString aVer = applicationVersion();
687 if ( !aVer.isEmpty() )
688 aTitle += QString( " " ) + aVer;
692 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
693 if ( !sName.isEmpty() )
694 aTitle += QString( " - [%1]" ).arg( sName );
697 desktop()->setWindowTitle( aTitle );
700 /*!Update commands status.*/
701 void STD_Application::updateCommandsStatus()
703 SUIT_Application::updateCommandsStatus();
705 bool aHasStudy = activeStudy() != 0;
706 bool aSaved = aHasStudy && activeStudy()->isSaved();
707 bool aModified = aHasStudy && activeStudy()->isModified();
708 bool aIsNeedToSave = aHasStudy && ( !aSaved || aModified );
710 if ( action( FileReopenId ) )
711 action( FileReopenId )->setEnabled( aSaved );
712 if ( action( FileSaveId ) )
713 action( FileSaveId )->setEnabled( aIsNeedToSave );
714 if ( action( FileSaveAsId ) )
715 action( FileSaveAsId )->setEnabled( aHasStudy );
716 if ( action( FileCloseId ) )
717 action( FileCloseId )->setEnabled( aHasStudy );
718 if ( action( NewWindowId ) )
719 action( NewWindowId )->setEnabled( aHasStudy );
723 \brief Show notification with specified text and title.
725 Notification will be automatically hidden after specified \a timeout
726 (given in milliseconds). If \a timeout is zero, the notification
727 is not automatically hidden; it can be only closed by the user manually.
729 \param text - Notification text
730 \param title - Notification title
731 \param timeout - Timeout in milliseconds
732 \return Notification's unique identifier
734 int STD_Application::showNotification(const QString& message, const QString& title, int timeout)
737 QtxNotify* ntfMgr = notifyMgr();
743 SUIT_ResourceMgr* aResMgr = resourceMgr();
745 delay = aResMgr->integerValue("notification", "timeout", 0) * 1000;
747 uid = ntfMgr->showNotification(message, title, qMax(delay, 0));
753 \brief Close notifications with specified text.
754 \param text - Notification text
756 void STD_Application::hideNotification(const QString& message)
758 QtxNotify* ntfMgr = notifyMgr();
760 ntfMgr->hideNotification(message);
764 \brief Closes the notifications with specified identifier.
765 \param id - Notification identifier
767 void STD_Application::hideNotification(int id)
769 QtxNotify* ntfMgr = notifyMgr();
771 ntfMgr->hideNotification(id);
774 /*!\retval SUIT_ViewManager by viewer manager type name.*/
775 SUIT_ViewManager* STD_Application::viewManager( const QString& vmType ) const
777 SUIT_ViewManager* vm = 0;
778 for ( QList<SUIT_ViewManager*>::const_iterator it = myViewMgrs.begin(); it != myViewMgrs.end() && !vm; ++it )
780 if ( (*it)->getType() == vmType && !(*it)->getDetached())
786 /*! \param vmType - input view manager type name
787 * \param lst - output list of view managers with types \a vmType.
789 void STD_Application::viewManagers( const QString& vmType, ViewManagerList& lst ) const
791 for ( QList<SUIT_ViewManager*>::const_iterator it = myViewMgrs.begin(); it != myViewMgrs.end(); ++it )
793 if ( (*it)->getType() == vmType )
798 /*!\param lst - output list of all view managers.*/
799 void STD_Application::viewManagers( ViewManagerList& lst ) const
801 for ( QList<SUIT_ViewManager*>::const_iterator it = myViewMgrs.begin(); it != myViewMgrs.end(); ++it )
805 /*!\retval ViewManagerList - const list of all view managers.*/
806 ViewManagerList STD_Application::viewManagers() const
813 /*!\retval SUIT_ViewManager - return pointer to active view manager.*/
814 SUIT_ViewManager* STD_Application::activeViewManager() const
816 return myActiveViewMgr;
819 /*!Add view manager to view managers list, if it not already there.*/
820 void STD_Application::addViewManager( SUIT_ViewManager* vm )
825 if ( !containsViewManager( vm ) )
827 myViewMgrs.append( vm );
828 connect( vm, SIGNAL( activated( SUIT_ViewManager* ) ),
829 this, SLOT( onViewManagerActivated( SUIT_ViewManager* ) ) );
830 vm->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
832 emit viewManagerAdded( vm );
835 if ( !activeViewManager() && myViewMgrs.count() == 1 )
836 setActiveViewManager( vm );
840 /*!Remove view manager from view managers list.*/
841 void STD_Application::removeViewManager( SUIT_ViewManager* vm )
848 emit viewManagerRemoved( vm );
850 vm->disconnectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
851 disconnect( vm, SIGNAL( activated( SUIT_ViewManager* ) ),
852 this, SLOT( onViewManagerActivated( SUIT_ViewManager* ) ) );
853 myViewMgrs.removeAll( vm );
855 if ( myActiveViewMgr == vm )
859 /*!Remove all view managers from view managers list.*/
860 void STD_Application::clearViewManagers()
865 for ( QList<SUIT_ViewManager*>::iterator it = lst.begin(); it != lst.end(); ++it )
867 QPointer<SUIT_ViewManager> vm = *it;
868 removeViewManager( vm );
873 /*!\retval \c true, if view manager \a vm, already in view manager list (\a myViewMgrs).*/
874 bool STD_Application::containsViewManager( SUIT_ViewManager* vm ) const
876 return myViewMgrs.contains( vm );
879 /*!Private slot, sets active manager to \vm, if \vm in view managers list.*/
880 void STD_Application::onViewManagerActivated( SUIT_ViewManager* vm )
882 setActiveViewManager( vm );
885 /*!Shows status bar, if on is \c true, else hides status bar.*/
886 void STD_Application::onViewStatusBar( bool on )
889 desktop()->statusBar()->show();
891 desktop()->statusBar()->hide();
894 /*!Call SUIT_MessageBox::info1(...) with about information.*/
895 void STD_Application::onHelpAbout()
897 SUIT_MessageBox::information( desktop(), tr( "About" ), tr( "ABOUT_INFO" ) );
900 /*!Create empty study. \n
901 * Create new view manager and adding it to view managers list.
903 void STD_Application::createEmptyStudy()
905 SUIT_Application::createEmptyStudy();
908 /*!Sets active manager to \vm, if \vm in view managers list.*/
909 void STD_Application::setActiveViewManager( SUIT_ViewManager* vm )
911 if ( !containsViewManager( vm ) )
914 myActiveViewMgr = vm;
915 emit viewManagerActivated( vm );
919 void STD_Application::onConnectPopupRequest( SUIT_PopupClient* client, QContextMenuEvent* e )
921 QtxMenu* popup = new QtxMenu();
922 // fill popup by own items
924 contextMenuPopup( client->popupClientType(), popup, title );
925 popup->setTitleText( title );
927 popup->addSeparator();
928 // add items from popup client
929 client->contextMenuPopup( popup );
931 SUIT_Tools::simplifySeparators( popup );
933 if ( !popup->actions().isEmpty() )
934 popup->exec( e->globalPos() );
938 /*!\retval QString - return file extension(s).*/
939 QString STD_Application::getFileFilter( bool /*open*/ ) const
944 /*!\retval QString - return file name from dialog.*/
945 QString STD_Application::getFileName( bool open, const QString& initial, const QString& filters,
946 const QString& caption, QWidget* parent )
951 return QFileDialog::getOpenFileName( parent, caption, initial, filters );
956 QString anOldPath = initial;
961 // It is preferrable to use OS-specific file dialog box here !!!
962 aName = QFileDialog::getSaveFileName( parent, caption, anOldPath, filters, &aUsedFilter );
964 if ( aName.isNull() )
968 int aEnd = aUsedFilter.lastIndexOf( ')' );
969 int aStart = aUsedFilter.lastIndexOf( '(', aEnd );
970 QString wcStr = aUsedFilter.mid( aStart + 1, aEnd - aStart - 1 );
974 QRegExp rx( "[\b\\*]*\\.([\\w]+)" );
975 while ( ( idx = rx.indexIn( wcStr, idx ) ) != -1 )
977 extList.append( rx.cap( 1 ) );
978 idx += rx.matchedLength();
981 if ( !extList.isEmpty() && !extList.contains( SUIT_Tools::extension( aName ) ) )
982 aName += QString( ".%1" ).arg( extList.first() );
984 if ( QFileInfo( aName ).exists() )
986 int aAnswer = SUIT_MessageBox::question( desktop(), tr( "TIT_FILE_SAVEAS" ),
987 tr( "MSG_FILE_EXISTS" ).arg( aName ),
988 SUIT_MessageBox::Yes | SUIT_MessageBox::No | SUIT_MessageBox::Cancel, SUIT_MessageBox::Yes );
989 if ( aAnswer == SUIT_MessageBox::Cancel )
994 else if ( aAnswer == SUIT_MessageBox::No ) // not save to this file
995 anOldPath = aName; // not to return to the same initial dir at each "while" step
996 else // overwrite the existing file
1007 /*!\retval QString - return directory name from dialog.*/
1008 QString STD_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1013 return QFileDialog::getExistingDirectory( parent, caption, initial );
1018 \param desk - new desktop
1020 void STD_Application::setDesktop( SUIT_Desktop* desk )
1022 SUIT_Application::setDesktop( desk );
1025 connect( desk, SIGNAL( closing( SUIT_Desktop*, QCloseEvent* ) ),
1026 this, SLOT( onDesktopClosing( SUIT_Desktop*, QCloseEvent* ) ), Qt::UniqueConnection );
1031 Allow to load preferences before the desktop will be shown.
1033 void STD_Application::loadPreferences()
1038 Allow to save preferences before the application will be closed.
1040 void STD_Application::savePreferences()
1045 Custom activity after study is created
1046 Updates desktop and actions
1048 void STD_Application::studyCreated( SUIT_Study* )
1050 updateDesktopTitle();
1051 updateCommandsStatus();
1055 Custom activity after study is opened
1056 Updates desktop and actions
1058 void STD_Application::studyOpened( SUIT_Study* )
1060 updateDesktopTitle();
1061 updateCommandsStatus();
1065 Custom activity after study is opened
1066 Updates desktop and actions
1068 void STD_Application::studySaved( SUIT_Study* )
1070 updateDesktopTitle();
1071 updateCommandsStatus();
1075 Return index of the view ma
1077 int STD_Application::viewManagerId( const SUIT_ViewManager* theManager) const
1079 return myViewMgrs.indexOf(const_cast<SUIT_ViewManager*>(theManager));
1083 \brief Abort active operations if there are any
1084 \return \c false if some operation cannot be aborted
1086 bool STD_Application::abortAllOperations()
1092 \brief Gets the notification manager. Creates it if not exists.
1093 \return \c notification manager instance
1095 QtxNotify* STD_Application::notifyMgr()
1099 myNotify = new QtxNotify(desktop());
1100 myNotify->setWindow(desktop());
1102 SUIT_ResourceMgr* aResMgr = resourceMgr();
1105 int anim = aResMgr->integerValue("notification", "animation", 0);
1106 myNotify->setAnimationTime(anim);
1108 double size = aResMgr->integerValue("notification", "size", 250);
1109 myNotify->setNotificationSize(size);