+// Copyright (C) 2007-2012 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
+// 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
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
#include "CAF_Study.h"
#include "CAF_Tools.h"
-#include "CAF_Operation.h"
+#include "CAF_Application.h"
+
+#include <Basics_OCCTVersion.hxx>
#include <SUIT_Desktop.h>
#include <SUIT_MessageBox.h>
#include <SUIT_Application.h>
+#include <QDir>
+
#include <TDF_Delta.hxx>
#include <TDF_ListIteratorOfDeltaList.hxx>
+#include <TDocStd_Application.hxx>
+
+#include <Standard_Failure.hxx>
+#include <Standard_ErrorHandler.hxx>
-//////////////////////////////////////////////////////////////////////
-// Construction/Destruction
-//////////////////////////////////////////////////////////////////////
+/*!
+ \class CAF_Study
+ \brief Represents study for using in CAF module.
+
+ A study contains reference to OCAF std document and allows using OCAF services.
+ Provides necessary functionality for OCC transactions management.
+*/
+/*!
+ \brief Constructor.
+ \param theApp application
+*/
CAF_Study::CAF_Study(SUIT_Application* theApp)
: SUIT_Study( theApp ),
-myModifiedCnt( 0 )
+ myModifiedCnt( 0 )
{
}
+/*!
+ \brief Constructor.
+ \param theApp application
+ \param aStdDoc OCAF document
+*/
CAF_Study::CAF_Study(SUIT_Application* theApp, Handle (TDocStd_Document)& aStdDoc)
: SUIT_Study( theApp ),
-myStdDoc( aStdDoc ),
-myModifiedCnt( 0 )
+ myStdDoc( aStdDoc ),
+ myModifiedCnt( 0 )
{
}
+/*!
+ \brief Destructor.
+*/
CAF_Study::~CAF_Study()
{
}
-bool CAF_Study::startOperation()
+/*!
+ \brief Get OCAF document.
+ \return handle to the OCAF document object
+*/
+Handle(TDocStd_Document) CAF_Study::stdDoc() const
+{
+ return myStdDoc;
+}
+
+/*!
+ \brief Set OCAF document.
+ \param aStdDoc new OCAF document
+*/
+void CAF_Study::setStdDoc( Handle(TDocStd_Document)& aStdDoc )
+{
+ myStdDoc = aStdDoc;
+}
+
+/*!
+ \brief Customize document initialization.
+ \param doc study name
+ \return \c true on success and \c false on error
+*/
+bool CAF_Study::createDocument( const QString& doc )
{
- if ( myStdDoc.IsNull() )
+ bool res = SUIT_Study::createDocument( doc );
+
+ CAF_Application* app = cafApplication();
+ if ( res && app && !app->stdApp().IsNull() )
+ {
+ try {
+#if OCC_VERSION_LARGE > 0x06010000
+ OCC_CATCH_SIGNALS;
+#endif
+ TColStd_SequenceOfExtendedString formats;
+ app->stdApp()->Formats( formats );
+ if ( !formats.IsEmpty() )
+ app->stdApp()->NewDocument( formats.First(), myStdDoc );
+ }
+ catch ( Standard_Failure ) {
+ res = false;
+ }
+ }
+ return res;
+}
+
+/*!
+ \brief Close document.
+ \param permanently if \c true, a document is closed permanently
+*/
+void CAF_Study::closeDocument( bool permanently )
+{
+ Handle(TDocStd_Application) app = stdApp();
+ if ( !app.IsNull() && !stdDoc().IsNull() )
+ app->Close( stdDoc() );
+
+ SUIT_Study::closeDocument( permanently );
+}
+
+/*!
+ \brief Open document.
+ \param fname study file name
+ \return \c true on success and \c false if document cannot be opened
+*/
+bool CAF_Study::openDocument( const QString& fname )
+{
+ Handle(TDocStd_Application) app = stdApp();
+ if ( app.IsNull() )
+ return false;
+
+ bool status = false;
+ try {
+#if OCC_VERSION_LARGE > 0x06010000
+ OCC_CATCH_SIGNALS;
+#endif
+
+#if OCC_VERSION_LARGE > 0x06050100 // for OCC-6.5.2 and higher version
+ status = app->Open( CAF_Tools::toExtString( fname ), myStdDoc ) == PCDM_RS_OK;
+#else
+ status = app->Open( CAF_Tools::toExtString( fname ), myStdDoc ) == CDF_RS_OK;
+#endif
+ }
+ catch ( Standard_Failure ) {
+ status = false;
+ }
+
+ return status && SUIT_Study::openDocument( fname );
+}
+
+/*!
+ \brief Save document with other name.
+ \param fname study file name
+*/
+bool CAF_Study::saveDocumentAs( const QString& fname )
+{
+ Handle(TDocStd_Application) app = stdApp();
+ if ( app.IsNull() )
+ return false;
+
+ bool save = false;
+ if ( !stdDoc().IsNull() && stdDoc()->IsSaved() )
+ {
+ QString path = QDir::convertSeparators( CAF_Tools::toQString( stdDoc()->GetPath() ) );
+ save = path == QDir::convertSeparators( fname );
+ }
+
+ bool status = false;
+ try {
+#if OCC_VERSION_LARGE > 0x06010000
+ OCC_CATCH_SIGNALS;
+#endif
+ if ( save )
+#if OCC_VERSION_LARGE > 0x06050100 // for OCC-6.5.2 and higher version
+ status = app->Save( stdDoc() ) == PCDM_SS_OK;
+#else
+ status = app->Save( stdDoc() ) == CDF_SS_OK;
+#endif
+ else
+ {
+ TCollection_ExtendedString format, path( CAF_Tools::toExtString( fname ) );
+ app->Format( path, format );
+
+ if ( format.Length() )
+ stdDoc()->ChangeStorageFormat( format );
+
+#if OCC_VERSION_LARGE > 0x06050100 // for OCC-6.5.2 and higher version
+ status = app->SaveAs( stdDoc(), path ) == PCDM_SS_OK;
+#else
+ status = app->SaveAs( stdDoc(), path ) == CDF_SS_OK;
+#endif
+ }
+ }
+ catch ( Standard_Failure ) {
+ status = false;
+ }
+
+ if ( status )
+ status = SUIT_Study::saveDocumentAs( fname );
+
+ if ( status )
+ myModifiedCnt = 0;
+
+ return status;
+}
+
+/*!
+ \brief Open OCAF transaction.
+ \return \c true if transaction is opened successfully
+*/
+bool CAF_Study::openTransaction()
+{
+ if ( myStdDoc.IsNull() )
return false;
bool res = true;
try {
+#if OCC_VERSION_LARGE > 0x06010000
+ OCC_CATCH_SIGNALS;
+#endif
if ( myStdDoc->HasOpenCommand() )
myStdDoc->AbortCommand();
myStdDoc->OpenCommand();
}
- catch( Standard_Failure ) {
+ catch ( Standard_Failure ) {
res = false;
}
return res;
}
-void CAF_Study::abortOperation()
+/*!
+ \brief Abort OCAF transaction.
+ \return \c true if transaction is aborted successfully
+*/
+bool CAF_Study::abortTransaction()
{
- if ( myStdDoc.IsNull() )
- return;
+ if ( myStdDoc.IsNull() )
+ return false;
- try {
+ bool res = true;
+ try {
+#if OCC_VERSION_LARGE > 0x06010000
+ OCC_CATCH_SIGNALS;
+#endif
myStdDoc->AbortCommand();
- update();
+ update();
}
catch ( Standard_Failure ) {
+ res = false;
}
+ return res;
}
-void CAF_Study::commitOperation()
+/*!
+ \brief Commit OCAF transaction
+ \return \c true if transaction is committed successfully
+*/
+bool CAF_Study::commitTransaction( const QString& name )
{
- if ( myStdDoc.IsNull() )
- return;
+ if ( myStdDoc.IsNull() )
+ return false;
- try {
+ bool res = true;
+ try {
+#if OCC_VERSION_LARGE > 0x06010000
+ OCC_CATCH_SIGNALS;
+#endif
myStdDoc->CommitCommand();
if ( canUndo() )
{
- CAF_Operation* cafOp = 0;
- if ( activeOperation() && activeOperation()->inherits( "CAF_Operation" ) )
- cafOp = (CAF_Operation*)activeOperation();
-
Handle(TDF_Delta) d = myStdDoc->GetUndos().Last();
- if ( cafOp && !d.IsNull() )
- d->SetName( CAF_Tools::toExtString( cafOp->getName() ) );
+ if ( !d.IsNull() )
+ d->SetName( CAF_Tools::toExtString( name ) );
}
}
catch ( Standard_Failure ) {
+ res = false;
}
+ return res;
+}
+
+/*!
+ \brief Check if there is any transaction opened.
+ \return \c true if there is opened OCAF transaction
+*/
+bool CAF_Study::hasTransaction() const
+{
+ if ( myStdDoc.IsNull() )
+ return false;
+
+ return myStdDoc->HasOpenCommand();
}
/*!
- Returns whether the document was saved in file. [ public ]
+ \brief Check if the study is saved.
+ \return \c true if the document has been saved to file
*/
bool CAF_Study::isSaved() const
{
- if ( myStdDoc.IsNull() )
+ if ( myStdDoc.IsNull() )
return false;
return myStdDoc->IsSaved();
}
/*!
- Returns whether the document is modified. [ public ]
+ \brief Check if the study is modified.
+ \return \c true if the document has been modified
*/
bool CAF_Study::isModified() const
{
- return ( myModifiedCnt != 0 );
+ if ( myStdDoc.IsNull() )
+ return false;
+
+// return myStdDoc->IsModified();
+ return myModifiedCnt;
}
/*!
- Increments modification count. If 'undoable' is 'true', this modification
- can be rolled back by 'undoModified' otherwise the document will be marked
- as 'modiifed' until saved. [ protected ]
+ \brief Increment modifications count.
+
+ If \a undoable is \c true, this modification can be rolled back by
+ undoModified(), otherwise the document will be marked as \c modified
+ until it is saved.
+
+ \param undoable if \c true the operation is undoable
+ \sa undoModified(), clearModified()
*/
void CAF_Study::doModified( bool undoable )
{
- if ( myStdDoc.IsNull() )
+ if ( myStdDoc.IsNull() )
return;
- myModifiedCnt++;
+ myModifiedCnt++;
- /* Assumed that number of available undos / redos is NOT changed dynamically */
- if ( !undoable )
+ /* Assumed that number of available undos / redos is NOT changed dynamically */
+ if ( !undoable )
myModifiedCnt += myStdDoc->GetAvailableUndos();
}
/*!
- Decrements modification count. [ protected ]
+ \brief Decrement modifications count.
+ \sa doModified(), clearModified()
*/
void CAF_Study::undoModified()
{
}
/*!
- Clears modification count. [ public ]
+ \brief Clear modifications count.
+ \sa doModified(), undoModified()
*/
void CAF_Study::clearModified()
{
}
/*!
- Undoes the last command. [ public ]
+ \brief Undo the last command.
+ \return \c true on success and \c false on error
*/
bool CAF_Study::undo()
{
- if ( myStdDoc.IsNull() )
+ if ( myStdDoc.IsNull() )
return false;
try {
+#if OCC_VERSION_LARGE > 0x06010000
+ OCC_CATCH_SIGNALS;
+#endif
myStdDoc->Undo();
undoModified(); /* decrement modification counter */
}
catch ( Standard_Failure ) {
- SUIT_MessageBox::error1( application()->desktop(), tr( "ERR_ERROR" ),
- tr( "ERR_DOC_UNDO" ), tr ( "BUT_OK" ) );
- return false;
- }
+ SUIT_MessageBox::critical(application()->desktop(), tr( "ERR_ERROR" ),
+ tr( "ERR_DOC_UNDO" ));
+ return false;
+ }
return true;
}
/*!
- Redoes the last undo. [ public ]
+ \brief Redo the last undo.
+ \return \c true on success and \c false on error
*/
bool CAF_Study::redo()
{
- if ( myStdDoc.IsNull() )
+ if ( myStdDoc.IsNull() )
return false;
try {
+#if OCC_VERSION_LARGE > 0x06010000
+ OCC_CATCH_SIGNALS;
+#endif
myStdDoc->Redo();
doModified(); /* increment modification counter */
}
catch ( Standard_Failure ) {
- SUIT_MessageBox::error1( application()->desktop(), tr( "ERR_ERROR" ),
- tr( "ERR_DOC_REDO" ), tr ( "BUT_OK" ) );
+ SUIT_MessageBox::critical( application()->desktop(), tr( "ERR_ERROR" ),
+ tr( "ERR_DOC_REDO" ) );
return false;
}
return true;
}
/*!
- Check if possible to perform 'undo' command. [ public ]
+ \brief Check if it is possible to undo last command.
+ \return \c true if undo is avaiable
*/
bool CAF_Study::canUndo() const
{
}
/*!
- Check if possible to perform 'redo' command. [ public ]
+ \brief Check if it is possible to redo last undo.
+ \return \c true if redo is avaiable
*/
bool CAF_Study::canRedo() const
{
}
/*!
- Returns the list of names of 'undo' actions available. [ public ]
+ \brief Get names of available undo commands.
+ \return list of commands names
*/
QStringList CAF_Study::undoNames() const
{
}
/*!
- Returns the list of names of 'redo' actions available. [ public ]
+ \brief Get names of available redo commands.
+ \return list of commands names
*/
QStringList CAF_Study::redoNames() const
{
}
return names;
}
+
+/*!
+ \brief Get OCAF application.
+ \return handle to the OCAF application object
+*/
+Handle(TDocStd_Application) CAF_Study::stdApp() const
+{
+ Handle(TDocStd_Application) stdApp;
+ CAF_Application* app = cafApplication();
+ if ( app )
+ stdApp = app->stdApp();
+ return stdApp;
+}
+
+/*!
+ \brief Get application.
+ \return application object (CAF_Application)
+*/
+CAF_Application* CAF_Study::cafApplication() const
+{
+ return qobject_cast<CAF_Application*>( application() );
+}