Salome HOME
PAL10110 - incorrect title of dialog of file selection for file preference item
[modules/gui.git] / src / SalomeApp / SalomeApp_DataModel.cxx
index 13c08038e05a96c9870ac3442c23a55399e3fbf3..e2b9fbef297a4fb62e4e75f2d2acb4dba2c6540e 100644 (file)
@@ -51,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;
+        }
       }
     }
 
@@ -73,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() );
@@ -251,6 +256,7 @@ SalomeApp_Module* SalomeApp_DataModel::getModule() const
 //================================================================
 SalomeApp_Study* SalomeApp_DataModel::getStudy() const
 {
+  if(!root()) return 0;
   SalomeApp_RootObject* aRoot = dynamic_cast<SalomeApp_RootObject*>( root()->root() );
   if ( !aRoot )
     return 0;