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"
34 #include "utilities.h"
38 static Handle(TDataStd_TreeNode) GetNode(SALOMEDS::AttributeTreeNode_ptr value,
39 const Handle(TDataStd_TreeNode)& aNode)
41 Handle(TDataStd_TreeNode) aResult = new TDataStd_TreeNode;
42 CORBA::String_var aString = CORBA::string_dup(value->Label());
44 TDF_Tool::Label(aNode->Label().Data(), TCollection_AsciiString(aString), aLabel, 0);
45 if (aLabel.IsNull()) {
46 MESSAGE("SALOMEDS_AttributeTreeNode_i class: no such label")
47 MESSAGE("SALOMEDS_AttributeTreeNode_i class: no such label")
50 if (!aLabel.FindAttribute(aNode->ID(), aResult)) {
51 MESSAGE("SALOMEDS_AttributeTreeNode_i class: no such attribute")
52 MESSAGE("SALOMEDS_AttributeTreeNode_i class: no such attribute")
57 void SALOMEDS_AttributeTreeNode_i::SetFather(SALOMEDS::AttributeTreeNode_ptr theValue) {
59 _myAttr->SetFather(GetNode(theValue,_myAttr));
62 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::HasFather() {
63 return _myAttr->HasFather();
66 SALOMEDS::AttributeTreeNode_ptr SALOMEDS_AttributeTreeNode_i::GetFather() {
67 SALOMEDS_AttributeTreeNode_i* aTreeNode =
68 new SALOMEDS_AttributeTreeNode_i(_myAttr->Father(),_mySObject);
69 return aTreeNode->_this();
72 void SALOMEDS_AttributeTreeNode_i::SetPrevious(SALOMEDS::AttributeTreeNode_ptr theValue) {
74 _myAttr->SetPrevious(GetNode(theValue,_myAttr));
77 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::HasPrevious() {
78 return _myAttr->HasPrevious();
81 SALOMEDS::AttributeTreeNode_ptr SALOMEDS_AttributeTreeNode_i::GetPrevious() {
82 SALOMEDS_AttributeTreeNode_i* aTreeNode =
83 new SALOMEDS_AttributeTreeNode_i(_myAttr->Previous(),_mySObject);
84 return aTreeNode->_this();
87 void SALOMEDS_AttributeTreeNode_i::SetNext(SALOMEDS::AttributeTreeNode_ptr theValue) {
89 _myAttr->SetNext(GetNode(theValue,_myAttr));
92 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::HasNext() {
93 return _myAttr->HasNext();
96 SALOMEDS::AttributeTreeNode_ptr SALOMEDS_AttributeTreeNode_i::GetNext() {
97 SALOMEDS_AttributeTreeNode_i* aTreeNode =
98 new SALOMEDS_AttributeTreeNode_i(_myAttr->Next(),_mySObject);
99 return aTreeNode->_this();
102 void SALOMEDS_AttributeTreeNode_i::SetFirst(SALOMEDS::AttributeTreeNode_ptr theValue) {
104 _myAttr->SetFirst(GetNode(theValue,_myAttr));
107 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::HasFirst() {
108 return _myAttr->HasFirst();
111 SALOMEDS::AttributeTreeNode_ptr SALOMEDS_AttributeTreeNode_i::GetFirst() {
112 SALOMEDS_AttributeTreeNode_i* aTreeNode =
113 new SALOMEDS_AttributeTreeNode_i(_myAttr->First(),_mySObject);
114 return aTreeNode->_this();
117 void SALOMEDS_AttributeTreeNode_i::SetTreeID(const char* value) {
119 _myAttr->SetTreeID(Standard_GUID(_myAttr->ID()));
122 char* SALOMEDS_AttributeTreeNode_i::GetTreeID() {
124 _myAttr->ID().ToCString(aGUID);
125 return CORBA::string_dup(aGUID);
128 void SALOMEDS_AttributeTreeNode_i::Append(SALOMEDS::AttributeTreeNode_ptr theValue) {
130 _myAttr->Append(GetNode(theValue,_myAttr));
133 void SALOMEDS_AttributeTreeNode_i::Prepend(SALOMEDS::AttributeTreeNode_ptr theValue) {
135 _myAttr->Prepend(GetNode(theValue,_myAttr));
138 void SALOMEDS_AttributeTreeNode_i::InsertBefore(SALOMEDS::AttributeTreeNode_ptr theValue) {
140 _myAttr->InsertBefore(GetNode(theValue,_myAttr));
143 void SALOMEDS_AttributeTreeNode_i::InsertAfter(SALOMEDS::AttributeTreeNode_ptr theValue) {
145 _myAttr->InsertAfter(GetNode(theValue,_myAttr));
148 void SALOMEDS_AttributeTreeNode_i::Remove() {
153 CORBA::Long SALOMEDS_AttributeTreeNode_i::Depth() {
154 return _myAttr->Depth();
157 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::IsRoot() {
158 return _myAttr->IsRoot();
161 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::IsDescendant(SALOMEDS::AttributeTreeNode_ptr theValue) {
162 return _myAttr->IsDescendant(GetNode(theValue,_myAttr));
165 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::IsFather(SALOMEDS::AttributeTreeNode_ptr theValue) {
166 return _myAttr->IsFather(GetNode(theValue,_myAttr));
169 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::IsChild(SALOMEDS::AttributeTreeNode_ptr theValue) {
170 return _myAttr->IsChild(GetNode(theValue,_myAttr));
173 char* SALOMEDS_AttributeTreeNode_i::Label() {
174 TCollection_AsciiString aLabelName;
175 TDF_Tool::Entry(_myAttr->Label(),aLabelName);
176 return CORBA::string_dup(aLabelName.ToCString());
179 char* SALOMEDS_AttributeTreeNode_i::Store() {
182 if (HasFather()) aStr[0] = GetFather()->Label(); else aStr[0] = "!";
183 if (HasPrevious()) aStr[1] = GetPrevious()->Label(); else aStr[1] = "!";
184 if (HasNext()) aStr[2] = GetNext()->Label(); else aStr[2] = "!";
185 if (HasFirst()) aStr[3] = GetFirst()->Label(); else aStr[3] = "!";
188 aLength += strlen(aStr[0]) + strlen(aStr[1]) + strlen(aStr[2]) + strlen(aStr[3]);
189 CORBA::String_var aResult = new char[aLength];
190 sprintf(aResult, "%s %s %s %s", aStr[0], aStr[1], aStr[2], aStr[3]);
191 return aResult._retn();
194 void SALOMEDS_AttributeTreeNode_i::Restore(const char* value) {
195 Handle(TDataStd_TreeNode) aNode = Handle(TDataStd_TreeNode)::DownCast(_myAttr);
196 Handle(TDF_Data) DF = TDocStd_Document::Get(_myAttr->Label())->GetData();
198 char* aCopy = strdup(value);
199 char* adr = strtok(aCopy, " ");
202 Handle(TDataStd_TreeNode) aDepNode;
204 if (adr && adr[0] != '!') {
205 TDF_Tool::Label(DF, adr, aLabel, 1);
206 if (!aLabel.FindAttribute(aNode->ID(), aDepNode)) aDepNode = TDataStd_TreeNode::Set(aLabel, aNode->ID());
207 aNode->SetFather(aDepNode);
210 adr = strtok(NULL, " ");
211 if (adr && adr[0] != '!') {
212 TDF_Tool::Label(DF, adr, aLabel, 1);
213 if (!aLabel.FindAttribute(aNode->ID(), aDepNode)) aDepNode = TDataStd_TreeNode::Set(aLabel, aNode->ID());
214 aNode->SetPrevious(aDepNode);
217 adr = strtok(NULL, " ");
218 if (adr && adr[0] != '!') {
219 TDF_Tool::Label(DF, adr, aLabel, 1);
220 if (!aLabel.FindAttribute(aNode->ID(), aDepNode)) aDepNode = TDataStd_TreeNode::Set(aLabel, aNode->ID());
221 aNode->SetNext(aDepNode);
224 adr = strtok(NULL, " ");
225 if (adr && adr[0] != '!') {
226 TDF_Tool::Label(DF, adr, aLabel, 1);
227 if (!aLabel.FindAttribute(aNode->ID(), aDepNode)) aDepNode = TDataStd_TreeNode::Set(aLabel, aNode->ID());
228 aNode->SetFirst(aDepNode);