Salome HOME
NRI : Remove dependence with VISU.
[modules/kernel.git] / src / SALOMEDS / SALOMEDS_UseCaseBuilder_i.cxx
1 using namespace std;
2 //  File      : SALOMEDS_UseCaseBuilder_i.cxx
3 //  Created   : Mon Oct 7 16:15:25 2002
4 //  Author    : Yves FRICAUD
5
6 //  Project   : SALOME
7 //  Module    : SALOMEDS
8 //  Copyright : Open CASCADE 2002
9
10 #include "SALOMEDS_UseCaseBuilder_i.hxx"
11 #include "SALOMEDS_AttributeComment_i.hxx"
12 #include "SALOMEDS_SObject_i.hxx"
13 #include "SALOMEDS_SComponent_i.hxx"
14 #include "SALOMEDS_UseCaseIterator_i.hxx"
15 #include "utilities.h"
16 #include <TDF_Label.hxx>
17 #include <TDF_Tool.hxx>
18 #include <TDF_Data.hxx>
19 #include <TDF_Reference.hxx>
20 #include <TDF_AttributeList.hxx>
21 #include <TDF_ListIteratorOfAttributeList.hxx>
22 #include <TDataStd_ChildNodeIterator.hxx>
23 #include <TCollection_AsciiString.hxx>
24 #include <TDF_ChildIterator.hxx>
25
26 #define USE_CASE_LABEL_TAG           2
27 #define USE_CASE_GUID                "AA43BB12-D9CD-11d6-945D-0050DA506788"
28
29
30 //============================================================================
31 /*! Function : constructor
32  *  Purpose  :
33  */
34 //============================================================================
35 SALOMEDS_UseCaseBuilder_i::SALOMEDS_UseCaseBuilder_i(const Handle(TDocStd_Document)& theDocument,
36                                                      CORBA::ORB_ptr orb)
37 :_doc(theDocument)
38 {
39   _orb = CORBA::ORB::_duplicate(orb);
40   if(_doc.IsNull()) return;
41
42   TDF_Label aLabel = _doc->Main().Root().FindChild(USE_CASE_LABEL_TAG); //Iterate all use cases
43   if(!aLabel.FindAttribute(Standard_GUID(USE_CASE_GUID), _root)) {
44     _root = TDataStd_TreeNode::Set(aLabel, Standard_GUID(USE_CASE_GUID));
45   }
46
47   Handle(TDF_Reference) aRef;
48   if(!_root->FindAttribute(TDF_Reference::GetID(), aRef)) {
49     aRef = TDF_Reference::Set(_root->Label(), _root->Label());  
50   }  
51
52   Handle(TDataStd_Name) aNameAttr;
53   if(!aLabel.FindAttribute(TDataStd_Name::GetID(), aNameAttr)) { 
54     aNameAttr = TDataStd_Name::Set(aLabel, "Use cases"); 
55   }
56
57 }
58
59 //============================================================================
60 /*! Function : destructor
61  *  Purpose  :
62  */
63 //============================================================================
64 SALOMEDS_UseCaseBuilder_i::~SALOMEDS_UseCaseBuilder_i()
65 {
66 }
67
68
69 //============================================================================
70 /*! Function : Append
71  *  Purpose  : 
72  */
73 //============================================================================
74 CORBA::Boolean SALOMEDS_UseCaseBuilder_i::Append(SALOMEDS::SObject_ptr theObject)
75 {
76   if(_root.IsNull() || theObject->_is_nil()) return 0;
77
78   TDF_Label aLabel;
79
80   TDF_Tool::Label(_root->Label().Data(), theObject->GetID(), aLabel);
81   if(aLabel.IsNull()) return 0;
82
83   Handle(TDataStd_TreeNode) aNode, aCurrentNode;
84   aNode = TDataStd_TreeNode::Set(aLabel, _root->ID());
85   aNode->Remove();
86
87   Handle(TDF_Reference) aRef;
88   if(!_root->FindAttribute(TDF_Reference::GetID(), aRef)) {
89     aRef = TDF_Reference::Set(_root->Label(), _root->Label());  
90   }  
91   TDF_Label aCurrent = aRef->Get();
92
93   if(aCurrent.IsNull() || !aCurrent.FindAttribute(_root->ID(), aCurrentNode)) 
94     aCurrentNode = _root;
95
96   return aCurrentNode->Append(aNode);
97 }
98
99  //============================================================================
100 /*! Function : Remove
101  *  Purpose  :
102  */
103 //============================================================================
104 CORBA::Boolean SALOMEDS_UseCaseBuilder_i::Remove(SALOMEDS::SObject_ptr theObject)
105 {
106   if(_root.IsNull() || theObject->_is_nil()) return 0;
107
108   TDF_Label aLabel;
109   TDF_Tool::Label(_root->Label().Data(), theObject->GetID(), aLabel);
110   if(aLabel.IsNull()) return 0;
111
112   Handle(TDataStd_TreeNode) aNode;
113   if(!aLabel.FindAttribute(_root->ID(), aNode)) return 0;
114
115   aNode->Remove();
116
117   TDF_AttributeList aList;
118   aList.Append(aNode);
119
120   Handle(TDF_Reference) aRef;
121   if(!_root->FindAttribute(TDF_Reference::GetID(), aRef)) {
122     aRef = TDF_Reference::Set(_root->Label(), _root->Label());  
123   }  
124   TDF_Label aCurrent = aRef->Get();
125
126   TDataStd_ChildNodeIterator aChildItr(aNode, Standard_True);
127   for(; aChildItr.More(); aChildItr.Next()) 
128     aList.Append(aChildItr.Value());
129
130   TDF_ListIteratorOfAttributeList anIterator(aList);
131   for(; anIterator.More(); anIterator.Next()) {
132     if(anIterator.Value()->Label() ==  aCurrent) { //The current node is removed
133       aRef->Set(_root->Label()); //Reset the current node to the root
134     }
135     anIterator.Value()->Label().ForgetAttribute(_root->ID());
136   }
137
138   return 1;
139 }
140
141
142 //============================================================================
143 /*! Function : AppendTo
144  *  Purpose  :
145  */
146 //============================================================================
147 CORBA::Boolean SALOMEDS_UseCaseBuilder_i::AppendTo(SALOMEDS::SObject_ptr theFather, 
148                                                    SALOMEDS::SObject_ptr theObject)
149 {
150   if(_root.IsNull() || theFather->_is_nil() || theObject->_is_nil()) return 0;
151
152   TDF_Label aFatherLabel, aLabel;
153   Handle(TDataStd_TreeNode) aFather, aNode;
154   
155   TDF_Tool::Label(_root->Label().Data(), theFather->GetID(), aFatherLabel);
156   if(aFatherLabel.IsNull()) return 0;
157   if(!aFatherLabel.FindAttribute(_root->ID(), aFather)) return 0;
158
159   TDF_Tool::Label(_root->Label().Data(), theObject->GetID(), aLabel);
160   if(aLabel.IsNull()) return 0;
161   if(!aLabel.FindAttribute(_root->ID(), aNode)) {
162     aNode = TDataStd_TreeNode::Set(aLabel, _root->ID());
163   }
164   else
165     aNode->Remove();
166
167   return aFather->Append(aNode);
168 }
169
170 //============================================================================
171 /*! Function : InsertBefore
172  *  Purpose  :
173  */
174 //============================================================================
175 CORBA::Boolean SALOMEDS_UseCaseBuilder_i::InsertBefore(SALOMEDS::SObject_ptr theFirst, 
176                                                        SALOMEDS::SObject_ptr theNext)
177 {
178   if(_root.IsNull() || theFirst->_is_nil() || theNext->_is_nil()) return 0;
179
180   TDF_Label aFirstLabel, aLabel;
181   Handle(TDataStd_TreeNode) aFirstNode, aNode;
182   
183   TDF_Tool::Label(_root->Label().Data(), theFirst->GetID(), aFirstLabel);
184   if(aFirstLabel.IsNull()) return 0;
185   if(aFirstLabel.FindAttribute(_root->ID(), aFirstNode)) {
186     aFirstNode->Remove();
187     aFirstLabel.ForgetAttribute(aFirstNode->ID());
188   }
189
190   aFirstNode = TDataStd_TreeNode::Set(aFirstLabel, _root->ID());
191   
192
193   TDF_Tool::Label(_root->Label().Data(), theNext->GetID(), aLabel);
194   if(aLabel.IsNull()) return 0;
195   if(!aLabel.FindAttribute(_root->ID(), aNode)) return 0;
196
197   return aNode->InsertBefore(aFirstNode);
198 }
199
200
201 //============================================================================
202 /*! Function : SetCurrentObject
203  *  Purpose  :
204  */
205 //============================================================================
206 CORBA::Boolean SALOMEDS_UseCaseBuilder_i::SetCurrentObject(SALOMEDS::SObject_ptr theObject)
207 {
208   if(_root.IsNull() || theObject->_is_nil()) return 0;
209
210   TDF_Label aLabel;
211   Handle(TDataStd_TreeNode) aNode;
212   TDF_Tool::Label(_root->Label().Data(), theObject->GetID(), aLabel);
213   if(aLabel.IsNull()) return 0;
214   if(!aLabel.FindAttribute(_root->ID(), aNode)) return 0;
215
216
217   Handle(TDF_Reference) aRef;
218   if(!_root->FindAttribute(TDF_Reference::GetID(), aRef)) {
219     aRef = TDF_Reference::Set(_root->Label(), aNode->Label());  
220   }
221   
222   aRef->Set(aNode->Label());
223
224   return 1;
225 }
226
227 //============================================================================
228 /*! Function : SetRootCurrent
229  *  Purpose  :
230  */
231 //============================================================================
232 CORBA::Boolean SALOMEDS_UseCaseBuilder_i::SetRootCurrent()
233 {
234   if(_root.IsNull()) return 0;
235    
236   Handle(TDF_Reference) aRef;
237   if(!_root->FindAttribute(TDF_Reference::GetID(), aRef)) 
238     aRef = TDF_Reference::Set(_root->Label(), _root->Label());  
239
240   aRef->Set(_root->Label());
241   return 1;
242 }
243
244 //============================================================================
245 /*! Function : HasChildren
246  *  Purpose  :
247  */
248 //============================================================================
249 CORBA::Boolean SALOMEDS_UseCaseBuilder_i::HasChildren(SALOMEDS::SObject_ptr theObject)
250 {
251   if(_root.IsNull()) return 0;
252
253   TDF_Label aLabel;
254   if (theObject->_is_nil()) aLabel = _root->Label();
255   else TDF_Tool::Label(_root->Label().Data(), theObject->GetID(), aLabel);
256   if(aLabel.IsNull()) return 0;
257
258   Handle(TDataStd_TreeNode) aNode;
259   if(!aLabel.FindAttribute(_root->ID(), aNode)) return 0;
260
261   return !(aNode->First().IsNull());
262 }
263
264 //============================================================================
265 /*! Function : SetName
266  *  Purpose  :
267  */
268 //============================================================================
269 CORBA::Boolean SALOMEDS_UseCaseBuilder_i::SetName(const char* theName) {
270   if(_root.IsNull()) return 0;
271
272   Handle(TDataStd_Name) aNameAttrib;
273   TCollection_ExtendedString aName(strdup(theName));
274
275   if (!_root->FindAttribute(TDataStd_Name::GetID(), aNameAttrib))
276     aNameAttrib = TDataStd_Name::Set(_root->Label(), aName);
277   else    
278     aNameAttrib->Set(aName);
279     
280   return 1;
281 }
282
283
284 //============================================================================
285 /*! Function : GetCurrentObject
286  *  Purpose  :
287  */
288 //============================================================================
289 SALOMEDS::SObject_ptr SALOMEDS_UseCaseBuilder_i::GetCurrentObject()
290 {
291   if(_root.IsNull()) return NULL;
292
293   Handle(TDF_Reference) aRef;
294   if(!_root->FindAttribute(TDF_Reference::GetID(), aRef)) {
295     aRef = TDF_Reference::Set(_root->Label(), _root->Label());  
296   }  
297   TDF_Label aCurrent = aRef->Get();  
298   if(aCurrent.IsNull()) return NULL;
299
300   SALOMEDS_SObject_i *  so_servant = new SALOMEDS_SObject_i (aCurrent, _orb);
301   SALOMEDS::SObject_var so = SALOMEDS::SObject::_narrow(so_servant->_this()); 
302   return so._retn();
303 }
304
305 //============================================================================
306 /*! Function : GetName
307  *  Purpose  :
308  */
309 //============================================================================
310 char* SALOMEDS_UseCaseBuilder_i::GetName() {
311   CORBA::String_var aString;
312   if(_root.IsNull()) return aString._retn();
313
314   Handle(TDataStd_Name) aName;
315   if (!_root->FindAttribute(TDataStd_Name::GetID(), aName)) return aString._retn();
316   aString = strdup(TCollection_AsciiString(aName->Get()).ToCString());
317   return aString._retn();
318 }
319
320 //============================================================================ 
321 /*! Function :  IsUseCase
322  *  Purpose  :  
323  */ 
324 //============================================================================ 
325 CORBA::Boolean SALOMEDS_UseCaseBuilder_i::IsUseCase(SALOMEDS::SObject_ptr theObject)
326 {
327   if(theObject->_is_nil()) return false;
328   TDF_Label aFather, aLabel; 
329   TDF_Tool::Label(_doc->GetData(), theObject->GetID(), aLabel);
330   aFather = _doc->Main().Root().FindChild(USE_CASE_LABEL_TAG);
331   if(aLabel.Father() == aFather) return true;
332   return false;
333 }
334
335 //============================================================================ 
336 /*! Function : NewUseCase 
337  *  Purpose  :  
338  */ 
339 //============================================================================ 
340 SALOMEDS::SObject_ptr SALOMEDS_UseCaseBuilder_i::AddUseCase(const char* theName)
341 {
342   Standard_GUID aBasicGUID(USE_CASE_GUID);
343
344   //Create a use cases structure if it not exists 
345
346   Handle(TDataStd_TreeNode) aFatherNode, aNode;
347   Handle(TDataStd_Integer) anInteger;
348   Handle(TDF_Reference) aRef;
349
350   TDF_Label aLabel = _doc->Main().Root().FindChild(USE_CASE_LABEL_TAG);
351
352   if(!_root->FindAttribute(TDF_Reference::GetID(), aRef)) {
353     aRef = TDF_Reference::Set(aLabel, aLabel);
354   }
355  
356   if(!aRef->Get().FindAttribute(aBasicGUID, aFatherNode)) {
357     aFatherNode = TDataStd_TreeNode::Set(aRef->Get());
358   }
359
360   if(!_root->FindAttribute(TDataStd_Integer::GetID(), anInteger)) {
361     anInteger = TDataStd_Integer::Set(aLabel, 0);
362   }
363
364   //Create a new use case
365   anInteger->Set(anInteger->Get()+1);
366   TDF_Label aChild = aLabel.FindChild(anInteger->Get());
367   aNode = TDataStd_TreeNode::Set(aChild, aBasicGUID);
368   aFatherNode->Append(aNode);
369   TDataStd_Name::Set(aChild, TCollection_ExtendedString(strdup(theName)));
370
371   SALOMEDS_SObject_i *  so_servant = new SALOMEDS_SObject_i (aChild, _orb);
372   SALOMEDS::SObject_var so = SALOMEDS::SObject::_narrow(so_servant->_this()); 
373
374   return so._retn();
375 }
376
377 //============================================================================
378 /*! Function : GetUseCaseIterator
379  *  Purpose  : Creates a new UseCase iterator, if anObject is null all use cases are iterated 
380  */
381 //============================================================================
382 SALOMEDS::UseCaseIterator_ptr SALOMEDS_UseCaseBuilder_i::GetUseCaseIterator(SALOMEDS::SObject_ptr anObject) 
383 {
384   TDF_Label aLabel;
385
386   if(!anObject->_is_nil()) {
387     TDF_Tool::Label(_doc->GetData(), anObject->GetID(), aLabel); //Iterate only sub tree in the use case
388   }
389   else {
390     aLabel = _doc->Main().Root().FindChild(USE_CASE_LABEL_TAG); //Iterate all use cases
391   }
392
393   SALOMEDS_UseCaseIterator_i* aServant = new SALOMEDS_UseCaseIterator_i(aLabel, USE_CASE_GUID, Standard_False, _orb);
394   SALOMEDS::UseCaseIterator_var anIterator = SALOMEDS::UseCaseIterator::_narrow(aServant->_this());
395
396   return anIterator._retn(); 
397 }