Salome HOME
DCQ : Merge with Ecole_ete_a6.
[modules/kernel.git] / src / SALOMEDS / SALOMEDS_AttributeTreeNode_i.cxx
1 //  SALOME SALOMEDS : data structure of SALOME and sources of Salome data server 
2 //
3 //  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
5 // 
6 //  This library is free software; you can redistribute it and/or 
7 //  modify it under the terms of the GNU Lesser General Public 
8 //  License as published by the Free Software Foundation; either 
9 //  version 2.1 of the License. 
10 // 
11 //  This library is distributed in the hope that it will be useful, 
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of 
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
14 //  Lesser General Public License for more details. 
15 // 
16 //  You should have received a copy of the GNU Lesser General Public 
17 //  License along with this library; if not, write to the Free Software 
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
19 // 
20 //  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
21 //
22 //
23 //
24 //  File   : SALOMEDS_AttributeTreeNode_i.cxx
25 //  Author : Yves FRICAUD
26 //  Module : SALOME
27 //  $Header$
28
29 using namespace std;
30 #include "SALOMEDS_AttributeTreeNode_i.hxx"
31 #include "SALOMEDS_SObject_i.hxx"
32 #include "utilities.h"
33 #include <TDocStd_Document.hxx>
34 #include <TDF_Tool.hxx>
35
36 static Handle(TDataStd_TreeNode) GetNode(SALOMEDS::AttributeTreeNode_ptr value,
37                                          const Handle(TDataStd_TreeNode)& aNode) {
38   Handle(TDataStd_TreeNode) aResult = new TDataStd_TreeNode;
39   CORBA::String_var aString = CORBA::string_dup(value->Label());
40   TDF_Label aLabel;
41   TDF_Tool::Label(aNode->Label().Data(), TCollection_AsciiString(aString), aLabel, 0);
42   if (aLabel.IsNull()) {
43     MESSAGE("SALOMEDS_AttributeTreeNode_i class: no such label")
44     MESSAGE("SALOMEDS_AttributeTreeNode_i class: no such label")
45     return aResult;
46   }
47   if (!aLabel.FindAttribute(aNode->ID(), aResult)) {
48     MESSAGE("SALOMEDS_AttributeTreeNode_i class: no such attribute")
49     MESSAGE("SALOMEDS_AttributeTreeNode_i class: no such attribute")
50   }
51   return aResult;
52 }
53
54 void SALOMEDS_AttributeTreeNode_i::SetFather(SALOMEDS::AttributeTreeNode_ptr value) {
55   CheckLocked();
56   Handle(TDataStd_TreeNode) aNode = Handle(TDataStd_TreeNode)::DownCast(_myAttr);
57   aNode->SetFather(GetNode(value, aNode));
58 }
59
60 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::HasFather() {
61   return Handle(TDataStd_TreeNode)::DownCast(_myAttr)->HasFather();
62 }
63
64 SALOMEDS::AttributeTreeNode_ptr SALOMEDS_AttributeTreeNode_i::GetFather() {
65   SALOMEDS_AttributeTreeNode_i* aFather = new SALOMEDS_AttributeTreeNode_i(Handle(TDataStd_TreeNode)::DownCast(_myAttr)->Father(), _myOrb);
66   return aFather->POA_SALOMEDS::AttributeTreeNode::_this();
67 }
68
69 void SALOMEDS_AttributeTreeNode_i::SetPrevious(SALOMEDS::AttributeTreeNode_ptr value) {
70   CheckLocked();
71   Handle(TDataStd_TreeNode) aNode = Handle(TDataStd_TreeNode)::DownCast(_myAttr);
72   aNode->SetPrevious(GetNode(value, aNode));
73 }
74
75 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::HasPrevious() {
76   return Handle(TDataStd_TreeNode)::DownCast(_myAttr)->HasPrevious();
77 }
78
79 SALOMEDS::AttributeTreeNode_ptr SALOMEDS_AttributeTreeNode_i::GetPrevious() {
80   SALOMEDS_AttributeTreeNode_i* aPrevious = new SALOMEDS_AttributeTreeNode_i(Handle(TDataStd_TreeNode)::DownCast(_myAttr)->Previous(), _myOrb);
81   return aPrevious->POA_SALOMEDS::AttributeTreeNode::_this();
82 }
83
84 void SALOMEDS_AttributeTreeNode_i::SetNext(SALOMEDS::AttributeTreeNode_ptr value) {
85   CheckLocked();
86   Handle(TDataStd_TreeNode) aNode = Handle(TDataStd_TreeNode)::DownCast(_myAttr);
87   aNode->SetNext(GetNode(value, aNode));
88 }
89
90 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::HasNext() {
91   return Handle(TDataStd_TreeNode)::DownCast(_myAttr)->HasNext();
92 }
93
94 SALOMEDS::AttributeTreeNode_ptr SALOMEDS_AttributeTreeNode_i::GetNext() {
95   SALOMEDS_AttributeTreeNode_i* aNext = new SALOMEDS_AttributeTreeNode_i(Handle(TDataStd_TreeNode)::DownCast(_myAttr)->Next(), _myOrb);
96   return aNext->POA_SALOMEDS::AttributeTreeNode::_this();
97 }
98
99 void SALOMEDS_AttributeTreeNode_i::SetFirst(SALOMEDS::AttributeTreeNode_ptr value) {
100   CheckLocked();
101   Handle(TDataStd_TreeNode) aNode = Handle(TDataStd_TreeNode)::DownCast(_myAttr);
102   aNode->SetFirst(GetNode(value, aNode));
103 }
104
105 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::HasFirst() {
106   return Handle(TDataStd_TreeNode)::DownCast(_myAttr)->HasFirst();
107 }
108
109 SALOMEDS::AttributeTreeNode_ptr SALOMEDS_AttributeTreeNode_i::GetFirst() {
110   SALOMEDS_AttributeTreeNode_i* aFirst = new SALOMEDS_AttributeTreeNode_i(Handle(TDataStd_TreeNode)::DownCast(_myAttr)->First(), _myOrb);
111   return aFirst->POA_SALOMEDS::AttributeTreeNode::_this();
112 }
113
114 void SALOMEDS_AttributeTreeNode_i::SetTreeID(const char* value) {
115   CheckLocked();
116   Handle(TDataStd_TreeNode) aNode = Handle(TDataStd_TreeNode)::DownCast(_myAttr);
117   aNode->SetTreeID(Standard_GUID(aNode->ID()));
118 }
119
120 char* SALOMEDS_AttributeTreeNode_i::GetTreeID() {
121   Handle(TDataStd_TreeNode) aNode = Handle(TDataStd_TreeNode)::DownCast(_myAttr);
122   char aGUID[40];
123   aNode->ID().ToCString(aGUID);
124   return CORBA::String_var(CORBA::string_dup(aGUID))._retn();
125 }
126
127 void SALOMEDS_AttributeTreeNode_i::Append(SALOMEDS::AttributeTreeNode_ptr value) {
128   CheckLocked();
129   Handle(TDataStd_TreeNode) aNode = Handle(TDataStd_TreeNode)::DownCast(_myAttr);
130   aNode->Append(GetNode(value, aNode));
131 }
132
133 void SALOMEDS_AttributeTreeNode_i::Prepend(SALOMEDS::AttributeTreeNode_ptr value) {
134   CheckLocked();
135   Handle(TDataStd_TreeNode) aNode = Handle(TDataStd_TreeNode)::DownCast(_myAttr);
136   aNode->Prepend(GetNode(value, aNode));
137 }
138
139 void SALOMEDS_AttributeTreeNode_i::InsertBefore(SALOMEDS::AttributeTreeNode_ptr value) {
140   CheckLocked();
141   Handle(TDataStd_TreeNode) aNode = Handle(TDataStd_TreeNode)::DownCast(_myAttr);
142   aNode->InsertBefore(GetNode(value, aNode));
143 }
144
145 void SALOMEDS_AttributeTreeNode_i::InsertAfter(SALOMEDS::AttributeTreeNode_ptr value) {
146   CheckLocked();
147   Handle(TDataStd_TreeNode) aNode = Handle(TDataStd_TreeNode)::DownCast(_myAttr);
148   aNode->InsertAfter(GetNode(value, aNode));
149 }
150
151 void SALOMEDS_AttributeTreeNode_i::Remove() {
152   CheckLocked();
153   Handle(TDataStd_TreeNode) aNode = Handle(TDataStd_TreeNode)::DownCast(_myAttr);
154   aNode->Remove();
155 }
156
157 CORBA::Long SALOMEDS_AttributeTreeNode_i::Depth() {
158   Handle(TDataStd_TreeNode) aNode = Handle(TDataStd_TreeNode)::DownCast(_myAttr);
159   return aNode->Depth();
160 }
161
162 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::IsRoot() {
163   Handle(TDataStd_TreeNode) aNode = Handle(TDataStd_TreeNode)::DownCast(_myAttr);
164   return aNode->IsRoot();
165 }
166
167 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::IsDescendant(SALOMEDS::AttributeTreeNode_ptr value) {
168   Handle(TDataStd_TreeNode) aNode = Handle(TDataStd_TreeNode)::DownCast(_myAttr);
169   return aNode->IsDescendant(GetNode(value, aNode));
170 }
171
172 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::IsFather(SALOMEDS::AttributeTreeNode_ptr value) {
173   Handle(TDataStd_TreeNode) aNode = Handle(TDataStd_TreeNode)::DownCast(_myAttr);
174   return aNode->IsFather(GetNode(value, aNode));
175 }
176
177 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::IsChild(SALOMEDS::AttributeTreeNode_ptr value) {
178   Handle(TDataStd_TreeNode) aNode = Handle(TDataStd_TreeNode)::DownCast(_myAttr);
179   return aNode->IsChild(GetNode(value, aNode));
180 }
181
182 char* SALOMEDS_AttributeTreeNode_i::Label() {
183   TCollection_AsciiString aLabelName;
184   TDF_Tool::Entry(_myAttr->Label(),aLabelName);
185   return CORBA::String_var(CORBA::string_dup(aLabelName.ToCString()))._retn();
186 }
187
188 char* SALOMEDS_AttributeTreeNode_i::Store() {
189   char* aStr[4];
190
191   if (HasFather()) aStr[0] = GetFather()->Label(); else aStr[0] = "!";
192   if (HasPrevious()) aStr[1] = GetPrevious()->Label(); else aStr[1] = "!";
193   if (HasNext()) aStr[2] = GetNext()->Label(); else aStr[2] = "!";
194   if (HasFirst()) aStr[3] = GetFirst()->Label(); else aStr[3] = "!";
195
196   int aLength = 4;
197   aLength += strlen(aStr[0]) + strlen(aStr[1]) + strlen(aStr[2]) + strlen(aStr[3]);
198   CORBA::String_var aResult = new char[aLength];
199   sprintf(aResult, "%s %s %s %s", aStr[0], aStr[1], aStr[2], aStr[3]);
200   return aResult._retn();
201 }
202
203 void SALOMEDS_AttributeTreeNode_i::Restore(const char* value) {
204   Handle(TDataStd_TreeNode) aNode = Handle(TDataStd_TreeNode)::DownCast(_myAttr);
205   Handle(TDF_Data) DF = TDocStd_Document::Get(_myAttr->Label())->GetData();
206   
207   char* aCopy = strdup(value);
208   char* adr = strtok(aCopy, " ");
209   
210   TDF_Label aLabel;
211   Handle(TDataStd_TreeNode) aDepNode;
212
213   if (adr && adr[0] != '!') {
214     TDF_Tool::Label(DF, adr, aLabel, 1);
215     if (!aLabel.FindAttribute(aNode->ID(), aDepNode)) aDepNode = TDataStd_TreeNode::Set(aLabel, aNode->ID());
216     aNode->SetFather(aDepNode);
217   }
218
219   adr = strtok(NULL, " ");
220   if (adr && adr[0] != '!') {
221     TDF_Tool::Label(DF, adr, aLabel, 1);
222     if (!aLabel.FindAttribute(aNode->ID(), aDepNode)) aDepNode = TDataStd_TreeNode::Set(aLabel, aNode->ID());
223     aNode->SetPrevious(aDepNode);
224   }
225
226   adr = strtok(NULL, " ");
227   if (adr && adr[0] != '!') {
228     TDF_Tool::Label(DF, adr, aLabel, 1);
229     if (!aLabel.FindAttribute(aNode->ID(), aDepNode)) aDepNode = TDataStd_TreeNode::Set(aLabel, aNode->ID());
230     aNode->SetNext(aDepNode);
231   }
232
233   adr = strtok(NULL, " ");
234   if (adr && adr[0] != '!') {
235     TDF_Tool::Label(DF, adr, aLabel, 1);
236     if (!aLabel.FindAttribute(aNode->ID(), aDepNode)) aDepNode = TDataStd_TreeNode::Set(aLabel, aNode->ID());
237     aNode->SetFirst(aDepNode);
238   }
239 }