1 // Copyright (C) 2007-2020 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 bool keepDetached = property("keep_detached").toBool();
781 if ( (*it)->getType() == vmType && (!(*it)->getDetached() || keepDetached))
787 /*! \param vmType - input view manager type name
788 * \param lst - output list of view managers with types \a vmType.
790 void STD_Application::viewManagers( const QString& vmType, ViewManagerList& lst ) const
792 for ( QList<SUIT_ViewManager*>::const_iterator it = myViewMgrs.begin(); it != myViewMgrs.end(); ++it )
794 if ( (*it)->getType() == vmType )
799 /*!\param lst - output list of all view managers.*/
800 void STD_Application::viewManagers( ViewManagerList& lst ) const
802 for ( QList<SUIT_ViewManager*>::const_iterator it = myViewMgrs.begin(); it != myViewMgrs.end(); ++it )
806 /*!\retval ViewManagerList - const list of all view managers.*/
807 ViewManagerList STD_Application::viewManagers() const
814 /*!\retval SUIT_ViewManager - return pointer to active view manager.*/
815 SUIT_ViewManager* STD_Application::activeViewManager() const
817 return myActiveViewMgr;
820 /*!Add view manager to view managers list, if it not already there.*/
821 void STD_Application::addViewManager( SUIT_ViewManager* vm )
826 if ( !containsViewManager( vm ) )
828 myViewMgrs.append( vm );
829 connect( vm, SIGNAL( activated( SUIT_ViewManager* ) ),
830 this, SLOT( onViewManagerActivated( SUIT_ViewManager* ) ) );
831 vm->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
833 emit viewManagerAdded( vm );
836 if ( !activeViewManager() && myViewMgrs.count() == 1 )
837 setActiveViewManager( vm );
841 /*!Remove view manager from view managers list.*/
842 void STD_Application::removeViewManager( SUIT_ViewManager* vm )
849 emit viewManagerRemoved( vm );
851 vm->disconnectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
852 disconnect( vm, SIGNAL( activated( SUIT_ViewManager* ) ),
853 this, SLOT( onViewManagerActivated( SUIT_ViewManager* ) ) );
854 myViewMgrs.removeAll( vm );
856 if ( myActiveViewMgr == vm )
860 /*!Remove all view managers from view managers list.*/
861 void STD_Application::clearViewManagers()
866 for ( QList<SUIT_ViewManager*>::iterator it = lst.begin(); it != lst.end(); ++it )
868 QPointer<SUIT_ViewManager> vm = *it;
869 removeViewManager( vm );
874 /*!\retval \c true, if view manager \a vm, already in view manager list (\a myViewMgrs).*/
875 bool STD_Application::containsViewManager( SUIT_ViewManager* vm ) const
877 return myViewMgrs.contains( vm );
880 /*!Private slot, sets active manager to \vm, if \vm in view managers list.*/
881 void STD_Application::onViewManagerActivated( SUIT_ViewManager* vm )
883 setActiveViewManager( vm );
886 /*!Shows status bar, if on is \c true, else hides status bar.*/
887 void STD_Application::onViewStatusBar( bool on )
890 desktop()->statusBar()->show();
892 desktop()->statusBar()->hide();
895 /*!Call SUIT_MessageBox::info1(...) with about information.*/
896 void STD_Application::onHelpAbout()
898 SUIT_MessageBox::information( desktop(), tr( "About" ), tr( "ABOUT_INFO" ) );
901 /*!Create empty study. \n
902 * Create new view manager and adding it to view managers list.
904 void STD_Application::createEmptyStudy()
906 SUIT_Application::createEmptyStudy();
909 /*!Sets active manager to \vm, if \vm in view managers list.*/
910 void STD_Application::setActiveViewManager( SUIT_ViewManager* vm )
912 if ( !containsViewManager( vm ) )
915 myActiveViewMgr = vm;
916 emit viewManagerActivated( vm );
920 void STD_Application::onConnectPopupRequest( SUIT_PopupClient* client, QContextMenuEvent* e )
922 QtxMenu* popup = new QtxMenu();
923 // fill popup by own items
925 contextMenuPopup( client->popupClientType(), popup, title );
926 popup->setTitleText( title );
928 popup->addSeparator();
929 // add items from popup client
930 client->contextMenuPopup( popup );
932 SUIT_Tools::simplifySeparators( popup );
934 if ( !popup->actions().isEmpty() )
935 popup->exec( e->globalPos() );
939 /*!\retval QString - return file extension(s).*/
940 QString STD_Application::getFileFilter( bool /*open*/ ) const
945 /*!\retval QString - return file name from dialog.*/
946 QString STD_Application::getFileName( bool open, const QString& initial, const QString& filters,
947 const QString& caption, QWidget* parent )
952 return QFileDialog::getOpenFileName( parent, caption, initial, filters );
957 QString anOldPath = initial;
962 // It is preferrable to use OS-specific file dialog box here !!!
963 aName = QFileDialog::getSaveFileName( parent, caption, anOldPath, filters, &aUsedFilter );
965 if ( aName.isNull() )
969 int aEnd = aUsedFilter.lastIndexOf( ')' );
970 int aStart = aUsedFilter.lastIndexOf( '(', aEnd );
971 QString wcStr = aUsedFilter.mid( aStart + 1, aEnd - aStart - 1 );
975 QRegExp rx( "[\b\\*]*\\.([\\w]+)" );
976 while ( ( idx = rx.indexIn( wcStr, idx ) ) != -1 )
978 extList.append( rx.cap( 1 ) );
979 idx += rx.matchedLength();
982 if ( !extList.isEmpty() && !extList.contains( SUIT_Tools::extension( aName ) ) )
983 aName += QString( ".%1" ).arg( extList.first() );
985 if ( QFileInfo( aName ).exists() )
987 int aAnswer = SUIT_MessageBox::question( desktop(), tr( "TIT_FILE_SAVEAS" ),
988 tr( "MSG_FILE_EXISTS" ).arg( aName ),
989 SUIT_MessageBox::Yes | SUIT_MessageBox::No | SUIT_MessageBox::Cancel, SUIT_MessageBox::Yes );
990 if ( aAnswer == SUIT_MessageBox::Cancel )
995 else if ( aAnswer == SUIT_MessageBox::No ) // not save to this file
996 anOldPath = aName; // not to return to the same initial dir at each "while" step
997 else // overwrite the existing file
1008 /*!\retval QString - return directory name from dialog.*/
1009 QString STD_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1014 return QFileDialog::getExistingDirectory( parent, caption, initial );
1019 \param desk - new desktop
1021 void STD_Application::setDesktop( SUIT_Desktop* desk )
1023 SUIT_Application::setDesktop( desk );
1026 connect( desk, SIGNAL( closing( SUIT_Desktop*, QCloseEvent* ) ),
1027 this, SLOT( onDesktopClosing( SUIT_Desktop*, QCloseEvent* ) ), Qt::UniqueConnection );
1032 Allow to load preferences before the desktop will be shown.
1034 void STD_Application::loadPreferences()
1039 Allow to save preferences before the application will be closed.
1041 void STD_Application::savePreferences()
1046 Custom activity after study is created
1047 Updates desktop and actions
1049 void STD_Application::studyCreated( SUIT_Study* )
1051 updateDesktopTitle();
1052 updateCommandsStatus();
1056 Custom activity after study is opened
1057 Updates desktop and actions
1059 void STD_Application::studyOpened( SUIT_Study* )
1061 updateDesktopTitle();
1062 updateCommandsStatus();
1066 Custom activity after study is opened
1067 Updates desktop and actions
1069 void STD_Application::studySaved( SUIT_Study* )
1071 updateDesktopTitle();
1072 updateCommandsStatus();
1076 Return index of the view ma
1078 int STD_Application::viewManagerId( const SUIT_ViewManager* theManager) const
1080 return myViewMgrs.indexOf(const_cast<SUIT_ViewManager*>(theManager));
1084 \brief Abort active operations if there are any
1085 \return \c false if some operation cannot be aborted
1087 bool STD_Application::abortAllOperations()
1093 \brief Gets the notification manager. Creates it if not exists.
1094 \return \c notification manager instance
1096 QtxNotify* STD_Application::notifyMgr()
1100 myNotify = new QtxNotify(desktop());
1101 myNotify->setWindow(desktop());
1103 SUIT_ResourceMgr* aResMgr = resourceMgr();
1106 int anim = aResMgr->integerValue("notification", "animation", 0);
1107 myNotify->setAnimationTime(anim);
1109 double size = aResMgr->integerValue("notification", "size", 250);
1110 myNotify->setNotificationSize(size);