1 // SALOME SALOMEDS : data structure of SALOME and sources of Salome data server
3 // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
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.
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.
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
20 // See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
24 // File : SALOMEDS_AttributeTreeNode_i.cxx
25 // Author : Yves FRICAUD
29 #include <TDocStd_Document.hxx>
30 #include <TDF_Tool.hxx>
32 #include "SALOMEDS_AttributeTreeNode_i.hxx"
33 #include "SALOMEDS.hxx"
35 #include "utilities.h"
39 static Handle(TDataStd_TreeNode) GetNode(SALOMEDS::AttributeTreeNode_ptr value,
40 const Handle(TDataStd_TreeNode)& aNode)
42 Handle(TDataStd_TreeNode) aResult = new TDataStd_TreeNode;
43 CORBA::String_var aString = CORBA::string_dup(value->Label());
45 TDF_Tool::Label(aNode->Label().Data(), TCollection_AsciiString(aString), aLabel, 0);
46 if (aLabel.IsNull()) {
47 MESSAGE("SALOMEDS_AttributeTreeNode_i class: no such label")
48 MESSAGE("SALOMEDS_AttributeTreeNode_i class: no such label")
51 if (!aLabel.FindAttribute(aNode->ID(), aResult)) {
52 MESSAGE("SALOMEDS_AttributeTreeNode_i class: no such attribute")
53 MESSAGE("SALOMEDS_AttributeTreeNode_i class: no such attribute")
58 void SALOMEDS_AttributeTreeNode_i::SetFather(SALOMEDS::AttributeTreeNode_ptr theValue) {
59 SALOMEDS::Locker lock;
62 _myAttr->SetFather(GetNode(theValue,_myAttr));
65 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::HasFather() {
66 SALOMEDS::Locker lock;
68 return _myAttr->HasFather();
71 SALOMEDS::AttributeTreeNode_ptr SALOMEDS_AttributeTreeNode_i::GetFather() {
72 SALOMEDS::Locker lock;
74 SALOMEDS_AttributeTreeNode_i* aTreeNode =
75 new SALOMEDS_AttributeTreeNode_i(_myAttr->Father(),_mySObject);
76 return aTreeNode->_this();
79 void SALOMEDS_AttributeTreeNode_i::SetPrevious(SALOMEDS::AttributeTreeNode_ptr theValue) {
80 SALOMEDS::Locker lock;
83 _myAttr->SetPrevious(GetNode(theValue,_myAttr));
86 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::HasPrevious() {
87 SALOMEDS::Locker lock;
89 return _myAttr->HasPrevious();
92 SALOMEDS::AttributeTreeNode_ptr SALOMEDS_AttributeTreeNode_i::GetPrevious() {
93 SALOMEDS::Locker lock;
95 SALOMEDS_AttributeTreeNode_i* aTreeNode =
96 new SALOMEDS_AttributeTreeNode_i(_myAttr->Previous(),_mySObject);
97 return aTreeNode->_this();
100 void SALOMEDS_AttributeTreeNode_i::SetNext(SALOMEDS::AttributeTreeNode_ptr theValue) {
101 SALOMEDS::Locker lock;
104 _myAttr->SetNext(GetNode(theValue,_myAttr));
107 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::HasNext() {
108 SALOMEDS::Locker lock;
110 return _myAttr->HasNext();
113 SALOMEDS::AttributeTreeNode_ptr SALOMEDS_AttributeTreeNode_i::GetNext() {
114 SALOMEDS::Locker lock;
116 SALOMEDS_AttributeTreeNode_i* aTreeNode =
117 new SALOMEDS_AttributeTreeNode_i(_myAttr->Next(),_mySObject);
118 return aTreeNode->_this();
121 void SALOMEDS_AttributeTreeNode_i::SetFirst(SALOMEDS::AttributeTreeNode_ptr theValue) {
122 SALOMEDS::Locker lock;
125 _myAttr->SetFirst(GetNode(theValue,_myAttr));
128 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::HasFirst() {
129 SALOMEDS::Locker lock;
131 return _myAttr->HasFirst();
134 SALOMEDS::AttributeTreeNode_ptr SALOMEDS_AttributeTreeNode_i::GetFirst() {
135 SALOMEDS::Locker lock;
137 SALOMEDS_AttributeTreeNode_i* aTreeNode =
138 new SALOMEDS_AttributeTreeNode_i(_myAttr->First(),_mySObject);
139 return aTreeNode->_this();
142 void SALOMEDS_AttributeTreeNode_i::SetTreeID(const char* value) {
143 SALOMEDS::Locker lock;
146 _myAttr->SetTreeID(Standard_GUID(_myAttr->ID()));
149 char* SALOMEDS_AttributeTreeNode_i::GetTreeID() {
150 SALOMEDS::Locker lock;
153 _myAttr->ID().ToCString(aGUID);
154 return CORBA::string_dup(aGUID);
157 void SALOMEDS_AttributeTreeNode_i::Append(SALOMEDS::AttributeTreeNode_ptr theValue) {
158 SALOMEDS::Locker lock;
161 _myAttr->Append(GetNode(theValue,_myAttr));
164 void SALOMEDS_AttributeTreeNode_i::Prepend(SALOMEDS::AttributeTreeNode_ptr theValue) {
165 SALOMEDS::Locker lock;
168 _myAttr->Prepend(GetNode(theValue,_myAttr));
171 void SALOMEDS_AttributeTreeNode_i::InsertBefore(SALOMEDS::AttributeTreeNode_ptr theValue) {
172 SALOMEDS::Locker lock;
175 _myAttr->InsertBefore(GetNode(theValue,_myAttr));
178 void SALOMEDS_AttributeTreeNode_i::InsertAfter(SALOMEDS::AttributeTreeNode_ptr theValue) {
179 SALOMEDS::Locker lock;
182 _myAttr->InsertAfter(GetNode(theValue,_myAttr));
185 void SALOMEDS_AttributeTreeNode_i::Remove() {
186 SALOMEDS::Locker lock;
192 CORBA::Long SALOMEDS_AttributeTreeNode_i::Depth() {
193 SALOMEDS::Locker lock;
195 return _myAttr->Depth();
198 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::IsRoot() {
199 SALOMEDS::Locker lock;
201 return _myAttr->IsRoot();
204 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::IsDescendant(SALOMEDS::AttributeTreeNode_ptr theValue) {
205 SALOMEDS::Locker lock;
207 return _myAttr->IsDescendant(GetNode(theValue,_myAttr));
210 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::IsFather(SALOMEDS::AttributeTreeNode_ptr theValue) {
211 SALOMEDS::Locker lock;
213 return _myAttr->IsFather(GetNode(theValue,_myAttr));
216 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::IsChild(SALOMEDS::AttributeTreeNode_ptr theValue) {
217 SALOMEDS::Locker lock;
219 return _myAttr->IsChild(GetNode(theValue,_myAttr));
222 char* SALOMEDS_AttributeTreeNode_i::Label() {
223 TCollection_AsciiString aLabelName;
224 TDF_Tool::Entry(_myAttr->Label(),aLabelName);
225 return CORBA::string_dup(aLabelName.ToCString());
228 char* SALOMEDS_AttributeTreeNode_i::Store() {
229 SALOMEDS::Locker lock;
233 if (HasFather()) aStr[0] = GetFather()->Label(); else aStr[0] = "!";
234 if (HasPrevious()) aStr[1] = GetPrevious()->Label(); else aStr[1] = "!";
235 if (HasNext()) aStr[2] = GetNext()->Label(); else aStr[2] = "!";
236 if (HasFirst()) aStr[3] = GetFirst()->Label(); else aStr[3] = "!";
239 aLength += strlen(aStr[0]) + strlen(aStr[1]) + strlen(aStr[2]) + strlen(aStr[3]);
240 CORBA::String_var aResult = new char[aLength];
241 sprintf(aResult, "%s %s %s %s", aStr[0], aStr[1], aStr[2], aStr[3]);
242 return aResult._retn();
245 void SALOMEDS_AttributeTreeNode_i::Restore(const char* value) {
246 SALOMEDS::Locker lock;
248 Handle(TDataStd_TreeNode) aNode = Handle(TDataStd_TreeNode)::DownCast(_myAttr);
249 Handle(TDF_Data) DF = TDocStd_Document::Get(_myAttr->Label())->GetData();
251 char* aCopy = strdup(value);
252 char* adr = strtok(aCopy, " ");
255 Handle(TDataStd_TreeNode) aDepNode;
257 if (adr && adr[0] != '!') {
258 TDF_Tool::Label(DF, adr, aLabel, 1);
259 if (!aLabel.FindAttribute(aNode->ID(), aDepNode)) aDepNode = TDataStd_TreeNode::Set(aLabel, aNode->ID());
260 aNode->SetFather(aDepNode);
263 adr = strtok(NULL, " ");
264 if (adr && adr[0] != '!') {
265 TDF_Tool::Label(DF, adr, aLabel, 1);
266 if (!aLabel.FindAttribute(aNode->ID(), aDepNode)) aDepNode = TDataStd_TreeNode::Set(aLabel, aNode->ID());
267 aNode->SetPrevious(aDepNode);
270 adr = strtok(NULL, " ");
271 if (adr && adr[0] != '!') {
272 TDF_Tool::Label(DF, adr, aLabel, 1);
273 if (!aLabel.FindAttribute(aNode->ID(), aDepNode)) aDepNode = TDataStd_TreeNode::Set(aLabel, aNode->ID());
274 aNode->SetNext(aDepNode);
277 adr = strtok(NULL, " ");
278 if (adr && adr[0] != '!') {
279 TDF_Tool::Label(DF, adr, aLabel, 1);
280 if (!aLabel.FindAttribute(aNode->ID(), aDepNode)) aDepNode = TDataStd_TreeNode::Set(aLabel, aNode->ID());
281 aNode->SetFirst(aDepNode);