Salome HOME
modified method getStudy
[modules/gui.git] / src / SalomeApp / SalomeApp_DataModel.cxx
index 1d771e2c64cd96249256d87d51eb2f7f40adf2c2..e2b9fbef297a4fb62e4e75f2d2acb4dba2c6540e 100644 (file)
@@ -25,8 +25,9 @@
 
 //=======================================================================
 // 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,
@@ -50,21 +51,26 @@ SUIT_DataObject* SalomeApp_DataModel::BuildTree( const _PTR(SObject)& obj,
       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;
+        }
       }
     }
 
@@ -72,7 +78,7 @@ SUIT_DataObject* SalomeApp_DataModel::BuildTree( const _PTR(SObject)& obj,
                         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() );
@@ -84,7 +90,7 @@ SUIT_DataObject* SalomeApp_DataModel::BuildTree( const _PTR(SObject)& obj,
 
 //=======================================================================
 // name    : SalomeApp_DataModel::SalomeApp_DataModel
-// Purpose : Constructor
+/*!Purpose : Constructor*/
 //=======================================================================
 SalomeApp_DataModel::SalomeApp_DataModel( CAM_Module* theModule )
 : CAM_DataModel( theModule )
@@ -93,7 +99,7 @@ SalomeApp_DataModel::SalomeApp_DataModel( CAM_Module* theModule )
 
 //=======================================================================
 // name    : SalomeApp_DataModel::~SalomeApp_DataModel
-// Purpose : Destructor
+/*! Purpose : Destructor*/
 //=======================================================================
 SalomeApp_DataModel::~SalomeApp_DataModel()
 {
@@ -101,7 +107,7 @@ SalomeApp_DataModel::~SalomeApp_DataModel()
 
 //================================================================
 // Function : open
-// Purpose  :
+/*! Purpose  : Open data model*/
 //================================================================
 bool SalomeApp_DataModel::open( const QString&, CAM_Study* study )
 {
@@ -154,7 +160,7 @@ bool SalomeApp_DataModel::open( const QString&, CAM_Study* study )
 
 //================================================================
 // Function : save
-// Purpose  :
+/*! Purpose  : Emit saved()*/
 //================================================================
 bool SalomeApp_DataModel::save()
 {
@@ -164,7 +170,7 @@ bool SalomeApp_DataModel::save()
 
 //================================================================
 // Function : saveAs
-// Purpose  :
+/*! Purpose  : Emit saved() */
 //================================================================
 bool SalomeApp_DataModel::saveAs( const QString&, CAM_Study* )
 {
@@ -174,7 +180,7 @@ bool SalomeApp_DataModel::saveAs( const QString&, CAM_Study* )
 
 //================================================================
 // Function : close
-// Purpose  :
+/*! Purpose  : Emit closed()*/
 //================================================================
 bool SalomeApp_DataModel::close()
 {
@@ -184,7 +190,7 @@ bool SalomeApp_DataModel::close()
 
 //================================================================
 // Function : update
-// Purpose  :
+/*! Purpose  : Update application.*/
 //================================================================
 void SalomeApp_DataModel::update( SalomeApp_DataObject*, SalomeApp_Study* study )
 {
@@ -217,7 +223,7 @@ 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,
@@ -236,7 +242,7 @@ void SalomeApp_DataModel::buildTree( const _PTR(SObject)& obj,
 
 //================================================================
 // Function : getModule
-// Purpose  :
+/*! Purpose  : gets module*/
 //================================================================
 
 SalomeApp_Module* SalomeApp_DataModel::getModule() const
@@ -246,10 +252,11 @@ 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;
@@ -258,7 +265,7 @@ SalomeApp_Study* SalomeApp_DataModel::getStudy() const
 
 //================================================================
 // 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
 {
@@ -278,7 +285,7 @@ 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
 {
@@ -287,7 +294,7 @@ 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
 {
@@ -298,7 +305,7 @@ 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
@@ -318,7 +325,7 @@ std::vector<std::string> SalomeApp_DataModel::GetListOfFiles() 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,
@@ -337,7 +344,7 @@ void SalomeApp_DataModel::SetListOfFiles (const std::vector<std::string> theList
 
 //================================================================
 // 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)
@@ -349,7 +356,7 @@ std::string SalomeApp_DataModel::GetTmpDir (const char* theURL,
 
 //================================================================
 // Function : RemoveTemporaryFiles
-// Purpose  : to be used by CORBAless modules
+/*! Purpose  : to be used by CORBAless modules*/
 //================================================================
 void SalomeApp_DataModel::RemoveTemporaryFiles (const bool isMultiFile) const
 {