+// Copyright (C) 2007-2013 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 "SUIT_Study.h"
#include "SUIT_Desktop.h"
#include "SUIT_DataObject.h"
#include "SUIT_MessageBox.h"
#include "SUIT_Application.h"
-#include <qvaluevector.h>
/*!\class SUIT_Study
* Support study management. Object management. Operation management.
SUIT_Study::SUIT_Study( SUIT_Application* app )
: QObject(),
myApp( app ),
+myName( "" ),
myIsSaved( false ),
myIsModified( false ),
-myName( "" ),
myBlockChangeState( false )
{
static int _id = 0;
myId = ++_id;
myRoot = new SUIT_DataObject();
- myOperations.setAutoDelete( false );
-
- connect( this, SIGNAL( changeOperationState( bool ) ), this, SLOT( onChangeOperationState( bool ) ) );
-
- myOperations.setAutoDelete( false );
}
/*!Destructor.*/
*/
SUIT_Operation* SUIT_Study::activeOperation() const
{
- return myOperations.count() > 0 ? myOperations.getLast() : 0;
+ return myOperations.count() > 0 ? myOperations.last() : 0;
}
/*!
/*!
*Close document. NOT IMPLEMENTED.
*/
-void SUIT_Study::closeDocument(bool permanently)
+void SUIT_Study::closeDocument(bool /*permanently*/)
{
}
-void SUIT_Study::createDocument()
+/*!
+ Custom document initialization to be performed \n
+ within onNewDoc() handler can be put here
+*/
+bool SUIT_Study::createDocument( const QString& )
{
- /*! Custom document initialization to be performed \n
- * within onNewDoc() handler can be put here
- */
+ return true;
}
/*!
void SUIT_Study::abortAllOperations()
{
myBlockChangeState = true;
- for( SUIT_Operation* op = myOperations.first(); op; op = myOperations.next() )
- op->abort();
+ while ( !myOperations.isEmpty() ) {
+ Operations::iterator it = myOperations.begin();
+ (*it)->abort();
+ }
myBlockChangeState = false;
myOperations.clear();
}
myIsModified = on;
}
+/*!
+ Set study modified to \a on.
+ */
+void SUIT_Study::Modified()
+{
+ setIsModified( true );
+ sendChangesNotification();
+}
+
/*!
Set root object.
*/
if ( myRoot == obj )
return;
+ // This is necessary in order not to destroy the complete tree of objects
+ if ( obj )
+ obj->reparentChildren( myRoot );
+
delete myRoot;
myRoot = obj;
}
return 0;
Operations tmpOps( myOperations );
- SUIT_Operation* anOp = 0;
- for ( anOp = tmpOps.last(); anOp; anOp = tmpOps.prev() )
+ for ( Operations::const_iterator it = tmpOps.end(); it != tmpOps.begin(); )
{
+ it--;
+ SUIT_Operation* anOp = *it;
if ( anOp != 0 && anOp!= theOp && !anOp->isValid( theOp ) )
return anOp;
}
*/
bool SUIT_Study::start( SUIT_Operation* theOp, const bool toCheck )
{
- if ( !theOp || myOperations.find( theOp ) >= 0 )
+ if ( !theOp || myOperations.contains( theOp ) )
return false;
theOp->setExecStatus( SUIT_Operation::Rejected );
if ( toCheck )
{
- while( SUIT_Operation* anOp = blockingOperation( theOp ) )
+ while ( SUIT_Operation* anOp = blockingOperation( theOp ) )
{
- int anAnsw = SUIT_MessageBox::warn2( application()->desktop(),
- tr( "OPERATION_LAUNCH" ), tr( "PREVIOUS_NOT_FINISHED" ),
- tr( "CONTINUE" ), tr( "CANCEL" ), 0, 1, 1 );
+ int anAnsw = SUIT_MessageBox::question( application()->desktop(),
+ tr( "OPERATION_LAUNCH" ), tr( "PREVIOUS_NOT_FINISHED" ),
+ tr( "CONTINUE" ), tr( "CANCEL" ) );
- if( anAnsw == 1 )
+ if ( anAnsw == 1 )
return false;
else
anOp->abort();
theOp->setState( SUIT_Operation::Running );
myOperations.append( theOp );
+
emit theOp->started( theOp );
+ operationStarted( theOp );
theOp->startOperation();
-
+
return true;
}
*/
bool SUIT_Study::abort( SUIT_Operation* theOp )
{
- if ( !theOp || myOperations.find( theOp ) == -1 )
+ if ( !theOp || !myOperations.contains( theOp ) )
return false;
- theOp->abortOperation();
theOp->setExecStatus( SUIT_Operation::Rejected );
+
+ theOp->abortOperation();
+ operationAborted( theOp );
emit theOp->aborted( theOp );
+
stop( theOp );
+
return true;
}
*/
bool SUIT_Study::commit( SUIT_Operation* theOp )
{
- if ( !theOp || myOperations.find( theOp ) == -1 )
+ if ( !theOp || !myOperations.contains( theOp ) )
return false;
- theOp->commitOperation();
theOp->setExecStatus( SUIT_Operation::Accepted );
+
+ theOp->commitOperation();
+ operationCommited( theOp );
emit theOp->committed( theOp );
+
stop( theOp );
+
emit studyModified( this );
+
return true;
}
*/
bool SUIT_Study::suspend( SUIT_Operation* theOp )
{
- if ( !theOp || myOperations.find( theOp ) == -1 || theOp->state() == SUIT_Operation::Suspended )
+ if ( !theOp || !myOperations.contains( theOp ) || theOp->state() == SUIT_Operation::Suspended )
return false;
theOp->setState( SUIT_Operation::Suspended );
*/
bool SUIT_Study::resume( SUIT_Operation* theOp )
{
- if ( !theOp || myOperations.find( theOp ) == -1 ||
+ if ( !theOp || !myOperations.contains( theOp ) ||
theOp->state() == SUIT_Operation::Running ||
blockingOperation( theOp ) != 0 )
return false;
// Move operation at the end of list in order to sort it in the order of activation.
// As result active operation is a last operation of list, operation which was active
// before currently active operation is located before it and so on
- myOperations.remove( theOp );
+ myOperations.removeAll( theOp );
myOperations.append( theOp );
emit theOp->resumed( theOp );
void SUIT_Study::stop( SUIT_Operation* theOp )
{
theOp->setState( SUIT_Operation::Waiting );
- myOperations.remove( theOp );
+ myOperations.removeAll( theOp );
// get last operation which can be resumed
- SUIT_Operation* anOp, *aResultOp = 0;
- for( anOp = myOperations.last(); anOp; anOp = myOperations.prev() )
+ SUIT_Operation* aResultOp = 0;
+
+ QListIterator<SUIT_Operation*> it (myOperations);
+ it.toBack();
+ while( it.hasPrevious() )
+ {
+ SUIT_Operation* anOp = it.previous();
if ( anOp && anOp != theOp && blockingOperation( anOp ) == 0 )
{
aResultOp = anOp;
break;
}
+ }
+ theOp->stopOperation();
+ operationStopped( theOp );
emit theOp->stopped( theOp );
+
if ( aResultOp )
resume( aResultOp );
}
* \brief Get all started operations
* \return List of all started operations
*/
-const QPtrList<SUIT_Operation>& SUIT_Study::operations() const
+const QList<SUIT_Operation*>& SUIT_Study::operations() const
{
return myOperations;
}
+/*!
+ * \brief Perform some actions when operation starting
+*/
+void SUIT_Study::operationStarted( SUIT_Operation* op )
+{
+ if ( !op )
+ return;
+ if ( op->testFlags( SUIT_Operation::Transaction ) )
+ op->openTransaction();
+}
+/*!
+ * \brief Perform some actions when operation aborted
+*/
+void SUIT_Study::operationAborted( SUIT_Operation* op )
+{
+ if ( op->testFlags( SUIT_Operation::Transaction ) )
+ op->abortTransaction();
+}
+/*!
+ * \brief Perform some actions when operation commited
+*/
+void SUIT_Study::operationCommited( SUIT_Operation* op )
+{
+ if ( op->testFlags( SUIT_Operation::Transaction ) )
+ op->commitTransaction( op->operationName() );
+}
+/*!
+ * \brief Perform some actions when operation stopped
+*/
+void SUIT_Study::operationStopped( SUIT_Operation* )
+{
+}
+/*!
+ * \brief Opens transaction for data modifications.
+*/
+bool SUIT_Study::openTransaction()
+{
+ return true;
+}
+/*!
+ * \brief Aborts transaction and all performed data modifications.
+*/
+bool SUIT_Study::abortTransaction()
+{
+ return true;
+}
+/*!
+ * \brief Commits transaction and all performed data modifications.
+*/
+bool SUIT_Study::commitTransaction( const QString& )
+{
+ return true;
+}
+/*!
+ * \brief Returns TRUE if transaction is opened.
+*/
+bool SUIT_Study::hasTransaction() const
+{
+ return false;
+}
+/*!
+ * \brief Restores the study state.
+ */
+void SUIT_Study::restoreState(int /*savePoint*/)
+{
+}