]> SALOME platform Git repositories - modules/gui.git/blob - src/SalomeApp/SalomeApp_DataModel.cxx
Salome HOME
3c63e644bc7680dce5e7dd6b08f11dddf14e5ba9
[modules/gui.git] / src / SalomeApp / SalomeApp_DataModel.cxx
1 // File:      SalomeApp_DataModel.cxx
2 // Created:   10/25/2004 10:36:06 AM
3 // Author:    Sergey LITONIN
4 // Copyright (C) CEA 2004
5
6 #include "SalomeApp_DataModel.h"
7 #include "SalomeApp_Study.h"
8 #include "SalomeApp_DataObject.h"
9 #include "SalomeApp_Module.h"
10 #include "SalomeApp_Application.h"
11 #include "SalomeApp_Engine_i.hxx"
12
13 #include "LightApp_RootObject.h"
14
15 #include <CAM_DataObject.h>
16
17 #include <SUIT_Application.h>
18 #include <SUIT_ResourceMgr.h>
19 #include <SUIT_Session.h>
20
21 #include "SALOMEDS_Tool.hxx"
22
23 #include <SALOMEconfig.h>
24 #include CORBA_SERVER_HEADER(SALOME_Exception)
25
26 //=======================================================================
27 // name    : BuildTree
28 /*!Purpose : static method used by SalomeApp_Study and SalomeApp_DataModel classes
29  *           to create default SALOMEDS-based data object tree
30  */
31 //=======================================================================
32 SUIT_DataObject* SalomeApp_DataModel::BuildTree( const _PTR(SObject)& obj,
33                                                  SUIT_DataObject* parent,
34                                                  SalomeApp_Study* study,
35                                                  bool skip  )
36 {
37   SalomeApp_DataObject* aDataObj = 0;
38   if ( !obj || !study )
39     return aDataObj;
40
41   _PTR(SObject) refObj;
42   if ( obj->GetName().size() || obj->ReferencedObject( refObj ) )  // skip nameless non references SObjects
43   {
44     _PTR(SComponent) aSComp( obj );
45
46     // patch for bug IPAL9313
47     if ( aSComp && parent && skip ) 
48     {
49       QString aSName( aSComp->GetName().c_str() );
50       DataObjectList allComponents = parent->children( /*recursive=*/false );
51       for ( DataObjectListIterator it( allComponents ); it.current(); ++it ) {
52         SUIT_DataObject* componentObj = it.current();
53         if ( componentObj->name() == aSName ) {
54           //mkr : modifications for update already published in 
55           //object browser, but not loaded yet component
56           LightApp_Application* anApp = dynamic_cast<LightApp_Application*>
57             ( SUIT_Session::session()->activeApplication() );
58          // asv : corresponding DataObjects are DELETED before update (so they are re-built). 
59           if (anApp && !anApp->module(aSName)) { // if module is not loaded, delete it's DataObject
60             // jfa: remove children before DataObject deletion
61             DataObjectList chilren = componentObj->children(/*recursive=*/true);
62             for (DataObjectListIterator itc (chilren); itc.current(); ++itc)
63               componentObj->removeChild(itc.current());
64
65             // delete DataObject itself and re-create it and all its sub-objects
66             delete componentObj;
67             // don't do anything here, because iterator may be corrupted (deleted object inside it)
68             break; // proceed to build_a_data_object code below
69           }
70           else
71             return componentObj;
72         }
73       }
74     }
75
76     aDataObj = aSComp ? new SalomeApp_ModuleObject( aSComp, parent ) :
77                         new SalomeApp_DataObject  ( obj, parent );
78
79     _PTR(ChildIterator) it ( study->studyDS()->NewChildIterator( obj ) );
80     for ( ; it->More(); it->Next() ) {
81       // don't use shared_ptr here, for Data Object will take
82       // ownership of this pointer
83       _PTR(SObject) aSO( it->Value() );
84       BuildTree( aSO, aDataObj, study );
85     }
86   }
87   return aDataObj;
88 }
89
90 //=======================================================================
91 // name    : SalomeApp_DataModel::SalomeApp_DataModel
92 /*!Purpose : Constructor*/
93 //=======================================================================
94 SalomeApp_DataModel::SalomeApp_DataModel( CAM_Module* theModule )
95 : LightApp_DataModel( theModule )
96 {
97 }
98
99 //=======================================================================
100 // name    : SalomeApp_DataModel::~SalomeApp_DataModel
101 /*! Purpose : Destructor*/
102 //=======================================================================
103 SalomeApp_DataModel::~SalomeApp_DataModel()
104 {
105 }
106
107 //================================================================
108 // Function : open
109 /*! Purpose  : Open data model*/
110 //================================================================
111 bool SalomeApp_DataModel::open( const QString& name, CAM_Study* study )
112 {
113   SalomeApp_Study* aDoc = dynamic_cast<SalomeApp_Study*>( study );
114   if ( !aDoc )
115     return false;
116
117   QString anId = getRootEntry( aDoc );
118   if ( anId.isEmpty() )
119     return true; // Probably nothing to load
120
121   _PTR(Study)      aStudy ( aDoc->studyDS() ); // shared_ptr cannot be used here
122   _PTR(SComponent) aSComp ( aStudy->FindComponentID( std::string( anId.latin1() ) ) );
123   if ( aSComp )
124     buildTree( aSComp, 0, aDoc );
125
126   LightApp_DataModel::open(name, study);
127   return true;
128 }
129
130 //================================================================
131 // Function : update
132 /*! Purpose  : Update application.*/
133 //================================================================
134 void SalomeApp_DataModel::update( LightApp_DataObject*, LightApp_Study* study )
135 {
136   SalomeApp_Study* aSStudy = 0;
137   LightApp_RootObject* studyRoot = 0;
138   _PTR(SObject) sobj;
139   SalomeApp_DataObject* modelRoot = dynamic_cast<SalomeApp_DataObject*>( root() );
140   if ( !modelRoot ){ // not yet connected to a study -> try using <study> argument
141     aSStudy = dynamic_cast<SalomeApp_Study*>( study );
142     if ( !aSStudy )
143       aSStudy = dynamic_cast<SalomeApp_Study*>( getModule()->getApp()->activeStudy() );
144     if ( aSStudy ){
145       studyRoot = dynamic_cast<LightApp_RootObject*>( aSStudy->root() );
146       if ( studyRoot ) {
147         QString anId = getRootEntry( aSStudy );
148         if ( !anId.isEmpty() ){ // if nothing is published in the study for this module -> do nothing
149           _PTR(Study) aStudy ( aSStudy->studyDS() );
150           sobj = aStudy->FindComponentID( std::string( anId.latin1() ) );
151         }
152       }
153     }
154   }
155   else{
156     studyRoot = dynamic_cast<LightApp_RootObject*>( modelRoot->root() );
157     if ( studyRoot ) {
158       aSStudy = dynamic_cast<SalomeApp_Study*>( study );
159       if ( aSStudy ) {
160         aSStudy = dynamic_cast<SalomeApp_Study*>( studyRoot->study() ); // <study> value should not change here theoretically, but just to make sure
161         if ( aSStudy ) {
162           _PTR(Study) aStudy ( aSStudy->studyDS() );
163           // modelRoot->object() cannot be reused here: it is about to be deleted by buildTree() soon
164           sobj = aStudy->FindComponentID( std::string( modelRoot->entry().latin1() ) );
165         }
166       }
167     }
168   }
169   buildTree( sobj, studyRoot, aSStudy );
170 }
171
172 //================================================================
173 // Function : buildTree
174 /*! Purpose  : private method, build tree.*/
175 //================================================================
176 void SalomeApp_DataModel::buildTree( const _PTR(SObject)& obj,
177                                      SUIT_DataObject* parent,
178                                      SalomeApp_Study* study )
179 {
180   if ( !obj )
181     return;
182   //if ( !root() ){ // Build default SALOMEDS-based data object tree and insert it into study
183     SalomeApp_ModuleObject* aNewRoot = dynamic_cast<SalomeApp_ModuleObject*>( BuildTree( obj, parent, study ) );
184     if ( aNewRoot ){
185       aNewRoot->setDataModel( this );
186       setRoot( aNewRoot );
187     }
188     //}
189 }
190
191 //================================================================
192 // Function : getModule
193 /*! Purpose  : gets module*/
194 //================================================================
195
196 SalomeApp_Module* SalomeApp_DataModel::getModule() const
197 {
198   return dynamic_cast<SalomeApp_Module*>( module() );
199 }
200
201 //================================================================
202 // Function : getStudy
203 /*! Purpose  : gets study */
204 //================================================================
205 SalomeApp_Study* SalomeApp_DataModel::getStudy() const
206 {
207   if(!root()) return 0;
208   LightApp_RootObject* aRoot = dynamic_cast<LightApp_RootObject*>( root()->root() );
209   if ( !aRoot )
210     return 0;
211   SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( aRoot->study() );
212   if ( !aStudy )
213     return 0;
214   return aStudy;
215 }
216
217 //================================================================
218 // Function : getRootEntry
219 /*! Purpose  : returns study entry corresponding to this data model*/
220 //================================================================
221 QString SalomeApp_DataModel::getRootEntry( SalomeApp_Study* study ) const
222 {
223   QString anEntry;
224   if ( root() && root()->root() ) { // data model already in a study
225     SalomeApp_DataObject* anObj = dynamic_cast<SalomeApp_DataObject*>( root() );
226     if ( anObj )
227       anEntry = anObj->entry();
228   }
229   else if ( study && study->studyDS() ) { // this works even if <myRoot> is null
230     _PTR(SComponent) aSComp( study->studyDS()->FindComponent( module()->name() ) );
231     if ( aSComp )
232       anEntry = aSComp->GetID().c_str();
233   }
234   return anEntry;
235 }