1 // Copyright (C) 2007-2021 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 "CAF_Application.h"
25 #include "CAF_Tools.h"
26 #include "CAF_Study.h"
28 #include <SUIT_Desktop.h>
29 #include <SUIT_MessageBox.h>
30 #include <SUIT_ResourceMgr.h>
32 #include <QtxAction.h>
33 #include <QtxListAction.h>
36 #include <QStringList>
38 #include <Resource_Manager.hxx>
39 #include <TColStd_SequenceOfAsciiString.hxx>
42 \brief Create new instance of CAF_Application.
43 \return new instance of CAF_Application class
45 extern "C" CAF_EXPORT SUIT_Application* createApplication()
47 return new CAF_Application();
51 \class CAF_Application
52 \brief OCC OCAF-based application.
54 Defines application configuration and behaviour for application using
55 standard OCC OCAF data model. Allows using OCC OCAF serives
56 (for example, undo/redo mechanizm).
60 \brief Default constructor.
62 CAF_Application::CAF_Application()
69 \param app OCAF application
71 CAF_Application::CAF_Application( const Handle( TDocStd_Application )& app )
80 CAF_Application::~CAF_Application()
85 \brief Get application name.
86 \return application name
88 QString CAF_Application::applicationName() const
90 return QString( "CAFApplication" );
94 \brief Get OCAF application.
95 \return handle to OCAF application object
97 Handle( TDocStd_Application ) CAF_Application::stdApp() const
103 \brief Get file extension filter.
105 The file extension filter is used in Open/Save dialog boxes.
107 \return file filters for open/save document dialog box
109 QString CAF_Application::getFileFilter( bool open ) const
111 if ( stdApp().IsNull() )
114 TColStd_SequenceOfAsciiString formats;
116 stdApp()->ReadingFormats( formats );
118 stdApp()->WritingFormats( formats );
121 QMap<QString, QStringList> wildCards;
122 Handle(Resource_Manager) resMgr = new Resource_Manager( stdApp()->ResourcesName() );
123 for ( int i = 1; i <= formats.Length(); i++ )
126 QString extResStr = CAF_Tools::toQString( formats.Value( i ) ) + QString( ".FileExtension" );
127 if ( resMgr->Find( extResStr.toLatin1().data() ) )
128 extension = QString( resMgr->Value( extResStr.toLatin1().data() ) );
131 QString descrResStr = CAF_Tools::toQString( formats.Value( i ) ) + QString( ".Description" );
132 if ( resMgr->Find( (char*)descrResStr.toLatin1().data() ) )
133 descr = QString( resMgr->Value( (char*)descrResStr.toLatin1().data() ) );
135 if ( !descr.isEmpty() && !extension.isEmpty() )
137 if ( !wildCards.contains( descr ) )
138 wildCards.insert( descr, QStringList() );
139 wildCards[descr].append( QString( "*.%1" ).arg( extension ) );
140 allWC.append( QString( "*.%1" ).arg( extension ) );
144 if ( wildCards.isEmpty() )
148 for ( QMap<QString, QStringList>::ConstIterator it = wildCards.begin(); it != wildCards.end(); ++it )
149 filters.append( QString( "%1 (%2)" ).arg( it.key() ).arg( it.value().join( "; " ) ) );
151 if ( wildCards.count() > 1 )
152 filters.prepend( QString( "%1 (%2)" ).arg( tr( "INF_ALL_DOCUMENTS_FILTER" ) ).arg( allWC.join( "; " ) ) );
154 if ( !filters.isEmpty() )
155 filters.append( tr( "INF_ALL_FILTER" ) );
157 return filters.join( ";;" );
161 \brief Create menu and toolbars actions.
163 void CAF_Application::createActions()
165 STD_Application::createActions();
167 SUIT_Desktop* desk = desktop();
168 SUIT_ResourceMgr* resMgr = resourceMgr();
170 QtxListAction* editUndo =
171 new QtxListAction( tr( "TOT_APP_EDIT_UNDO" ),
172 resMgr->loadPixmap( "STD", tr( "ICON_EDIT_UNDO" ) ),
173 tr( "MEN_APP_EDIT_UNDO" ), Qt::CTRL+Qt::Key_Z, desk );
174 editUndo->setStatusTip( tr( "PRP_APP_EDIT_UNDO" ) );
175 registerAction( EditUndoId, editUndo );
177 QtxListAction* editRedo =
178 new QtxListAction( tr( "TOT_APP_EDIT_REDO" ),
179 resMgr->loadPixmap( "STD", tr( "ICON_EDIT_REDO" ) ),
180 tr( "MEN_APP_EDIT_REDO" ), Qt::CTRL+Qt::Key_Y, desk );
181 editRedo->setStatusTip( tr( "PRP_APP_EDIT_REDO" ) );
182 registerAction( EditRedoId, editRedo );
184 editUndo->setComment( tr( "INF_APP_UNDOACTIONS" ) );
185 editRedo->setComment( tr( "INF_APP_REDOACTIONS" ) );
187 connect( editUndo, SIGNAL( triggered( int ) ), this, SLOT( onUndo( int ) ) );
188 connect( editRedo, SIGNAL( triggered( int ) ), this, SLOT( onRedo( int ) ) );
190 int editMenu = createMenu( tr( "MEN_DESK_EDIT" ), -1, -1, 10 );
192 createMenu( EditUndoId, editMenu, 0 );
193 createMenu( EditRedoId, editMenu, 0 );
194 createMenu( separator(), editMenu, -1, 0 );
196 int stdTBar = createTool( tr( "INF_DESK_TOOLBAR_STANDARD" ), // title (language-dependant)
197 QString( "SalomeStandard" ) ); // name (language-independant)
199 createTool( separator(), stdTBar );
200 createTool( EditUndoId, stdTBar );
201 createTool( EditRedoId, stdTBar );
202 createTool( separator(), stdTBar );
206 \brief Undo latest command operation for specified document.
207 \param doc OCAF document
208 \return \c true on success
210 bool CAF_Application::undo( CAF_Study* doc )
212 bool success = false;
215 success = doc->undo();
223 \brief Redo latest command operation undo for specified document.
224 \param doc OCAF document
225 \return \c true on success
227 bool CAF_Application::redo(CAF_Study* doc)
229 bool success = false;
232 success = doc->redo();
240 \brief Called when user activates "Undo" menu action.
242 Undo operation on the active document.
244 \param numActions undo depth (number of commands)
245 \return \c true on success
247 bool CAF_Application::onUndo( int numActions )
250 while ( numActions > 0 )
252 CAF_Study* cafStudy = dynamic_cast<CAF_Study*>( activeStudy() );
255 if ( !undo( cafStudy ) )
263 updateCommandsStatus(); /* enable/disable undo/redo */
268 \brief Called when user activates "Redo" menu action.
270 Redo latest undo commands on the active document.
272 \param numActions redo depth (number of commands)
273 \return \c true on success
275 bool CAF_Application::onRedo( int numActions )
278 while ( numActions > 0 )
280 CAF_Study* cafStudy = dynamic_cast<CAF_Study*>( activeStudy() );
283 if ( !redo( cafStudy ) )
291 updateCommandsStatus(); /* enable/disable undo/redo */
296 \brief Update actions state (Undo/Redo).
298 void CAF_Application::updateCommandsStatus()
300 STD_Application::updateCommandsStatus();
302 CAF_Study* cafStudy = 0;
303 if ( activeStudy() && activeStudy()->inherits( "CAF_Study" ) )
304 cafStudy = (CAF_Study*)activeStudy();
306 QtxListAction* undo = qobject_cast<QtxListAction*>( action( EditUndoId ) );
307 if ( cafStudy && undo )
308 undo->addNames( cafStudy->undoNames() );
310 QtxListAction* redo = qobject_cast<QtxListAction*>( action( EditRedoId ) );
311 if ( cafStudy && redo )
312 redo->addNames( cafStudy->redoNames() );
315 undo->setEnabled( cafStudy && cafStudy->canUndo() );
317 redo->setEnabled( cafStudy && cafStudy->canRedo() );
321 \brief Called when user activatees Help->About main menu command.
323 void CAF_Application::onHelpAbout()
325 SUIT_MessageBox::information( desktop(), tr( "About" ), tr( "ABOUT_INFO" ) );
329 \brief Create new empty study.
332 SUIT_Study* CAF_Application::createNewStudy()
334 return new CAF_Study( this );
338 \brief Set OCAF application.
339 \param app new OCAF application
341 void CAF_Application::setStdApp( const Handle(TDocStd_Application)& app )