Salome HOME
Fix pb with Object Browser update, when several not-loaded components have data....
authorjfa <jfa@opencascade.com>
Tue, 16 Aug 2005 11:30:33 +0000 (11:30 +0000)
committerjfa <jfa@opencascade.com>
Tue, 16 Aug 2005 11:30:33 +0000 (11:30 +0000)
src/SalomeApp/SalomeApp_DataModel.cxx

index 703995a5516ebe2749a1ea1a0468c3749f265422..4a39c9943ea3ae4e6c4d8c010ecc96c97f0ced0b 100644 (file)
@@ -51,17 +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 of already published in object browser, but not loaded yet components
+         // 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). 
-         CAM_Application* anApp = dynamic_cast<CAM_Application*>( SUIT_Session::session()->activeApplication() );
-         if ( anApp && !anApp->module( aSName ) ) { // if module is not loaded, delete it's DataObject
-           delete componentObj; // delete DataObject and re-create it and all its sub-objects
-           break; // proceed to build_a_data_object code below
+         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)
-         }
-         else
-           return componentObj;
-       }
+           break; // proceed to build_a_data_object code below
+          }
+          else
+            return componentObj;
+        }
       }
     }
 
@@ -69,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() );