//=======================================================================
// name : BuildTree
-// Purpose : static method used by SalomeApp_Study and SalomeApp_DataModel classes
-// to create default SALOMEDS-based data object tree
+/*!Purpose : static method used by SalomeApp_Study and SalomeApp_DataModel classes
+ * to create default SALOMEDS-based data object tree
+ */
//=======================================================================
SUIT_DataObject* SalomeApp_DataModel::BuildTree( const _PTR(SObject)& obj,
SUIT_DataObject* parent,
for ( DataObjectListIterator it( allComponents ); it.current(); ++it ) {
SUIT_DataObject* componentObj = it.current();
if ( componentObj->name() == aSName ) {
- //mkr : modifications for update already published in
- //object browser, but not loaded yet component
- //get names list of loaded modules
- QStringList aLoadedModNames;
- CAM_Application* anApp = dynamic_cast<CAM_Application*>( SUIT_Session::session()->activeApplication() );
- if ( anApp ) anApp->modules( aLoadedModNames, /*loaded*/true );
- if ( !aLoadedModNames.isEmpty() && aLoadedModNames.contains( aSName ) == 0 ) {
- // delete DataObject and re-create it and all its sub-objects
+ // mkr : modifications for update of already published in
+ // object browser, but not loaded yet components
+ CAM_Application* anApp = dynamic_cast<CAM_Application*>
+ (SUIT_Session::session()->activeApplication());
+
+ // asv : corresponding DataObjects are DELETED before update (so they are re-built).
+ if (anApp && !anApp->module(aSName)) { // if module is not loaded, delete it's DataObject
+ // jfa: remove children before DataObject deletion
+ DataObjectList chilren = componentObj->children(/*recursive=*/true);
+ for (DataObjectListIterator itc (chilren); itc.current(); ++itc)
+ componentObj->removeChild(itc.current());
+
+ // delete DataObject itself and re-create it and all its sub-objects
delete componentObj;
// don't do anything here, because iterator may be corrupted (deleted object inside it)
- break;
- }
- else
- return componentObj;
- }
+ break; // proceed to build_a_data_object code below
+ }
+ else
+ return componentObj;
+ }
}
}
new SalomeApp_DataObject ( obj, parent );
_PTR(ChildIterator) it ( study->studyDS()->NewChildIterator( obj ) );
- for ( ; it->More();it->Next() ) {
+ for ( ; it->More(); it->Next() ) {
// don't use shared_ptr here, for Data Object will take
// ownership of this pointer
_PTR(SObject) aSO( it->Value() );
//=======================================================================
// name : SalomeApp_DataModel::SalomeApp_DataModel
-// Purpose : Constructor
+/*!Purpose : Constructor*/
//=======================================================================
SalomeApp_DataModel::SalomeApp_DataModel( CAM_Module* theModule )
: CAM_DataModel( theModule )
//=======================================================================
// name : SalomeApp_DataModel::~SalomeApp_DataModel
-// Purpose : Destructor
+/*! Purpose : Destructor*/
//=======================================================================
SalomeApp_DataModel::~SalomeApp_DataModel()
{
//================================================================
// Function : open
-// Purpose :
+/*! Purpose : Open data model*/
//================================================================
bool SalomeApp_DataModel::open( const QString&, CAM_Study* study )
{
//================================================================
// Function : save
-// Purpose :
+/*! Purpose : Emit saved()*/
//================================================================
bool SalomeApp_DataModel::save()
{
//================================================================
// Function : saveAs
-// Purpose :
+/*! Purpose : Emit saved() */
//================================================================
bool SalomeApp_DataModel::saveAs( const QString&, CAM_Study* )
{
//================================================================
// Function : close
-// Purpose :
+/*! Purpose : Emit closed()*/
//================================================================
bool SalomeApp_DataModel::close()
{
//================================================================
// Function : update
-// Purpose :
+/*! Purpose : Update application.*/
//================================================================
void SalomeApp_DataModel::update( SalomeApp_DataObject*, SalomeApp_Study* study )
{
//================================================================
// Function : buildTree
-// Purpose : private method
+/*! Purpose : private method, build tree.*/
//================================================================
void SalomeApp_DataModel::buildTree( const _PTR(SObject)& obj,
SUIT_DataObject* parent,
//================================================================
// Function : getModule
-// Purpose :
+/*! Purpose : gets module*/
//================================================================
SalomeApp_Module* SalomeApp_DataModel::getModule() const
//================================================================
// Function : getStudy
-// Purpose :
+/*! Purpose : gets study */
//================================================================
SalomeApp_Study* SalomeApp_DataModel::getStudy() const
{
+ if(!root()) return 0;
SalomeApp_RootObject* aRoot = dynamic_cast<SalomeApp_RootObject*>( root()->root() );
if ( !aRoot )
return 0;
//================================================================
// Function : getRootEntry
-// Purpose : returns study entry corresponding to this data model
+/*! Purpose : returns study entry corresponding to this data model*/
//================================================================
QString SalomeApp_DataModel::getRootEntry( SalomeApp_Study* study ) const
{
//================================================================
// Function : isModified
-// Purpose : default implementation, always returns false so as not to mask study's isModified()
+/*! Purpose : default implementation, always returns false so as not to mask study's isModified()*/
//================================================================
bool SalomeApp_DataModel::isModified() const
{
//================================================================
// Function : isSaved
-// Purpose : default implementation, always returns true so as not to mask study's isSaved()
+/*! Purpose : default implementation, always returns true so as not to mask study's isSaved()*/
//================================================================
bool SalomeApp_DataModel::isSaved() const
{
//================================================================
// Function : GetListOfFiles
-// Purpose : to be used by CORBAless modules
+/*! Purpose : to be used by CORBAless modules*/
//================================================================
std::vector<std::string> SalomeApp_DataModel::GetListOfFiles() const
//(const int theStudyId, const char* theComponentName) const
//================================================================
// Function : SetListOfFiles
-// Purpose : to be used by CORBAless modules
+/*! Purpose : to be used by CORBAless modules*/
//================================================================
void SalomeApp_DataModel::SetListOfFiles (const std::vector<std::string> theListOfFiles)
//(const std::vector<std::string> theListOfFiles,
//================================================================
// Function : GetTmpDir
-// Purpose : Static method. To be used by CORBAless modules
+/*! Purpose : Static method. To be used by CORBAless modules*/
//================================================================
std::string SalomeApp_DataModel::GetTmpDir (const char* theURL,
const bool isMultiFile)
//================================================================
// Function : RemoveTemporaryFiles
-// Purpose : to be used by CORBAless modules
+/*! Purpose : to be used by CORBAless modules*/
//================================================================
void SalomeApp_DataModel::RemoveTemporaryFiles (const bool isMultiFile) const
{