]> SALOME platform Git repositories - modules/kernel.git/blob - src/SALOMEDS/SALOMEDS_AttributeTreeNode_i.cxx
Salome HOME
PR: merge from tag mergeto_trunk_17Jan05
[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 #include <TDocStd_Document.hxx>
30 #include <TDF_Tool.hxx>
31
32 #include "SALOMEDS_AttributeTreeNode_i.hxx"
33
34 #include "utilities.h"
35
36 using namespace std;
37
38 static Handle(TDataStd_TreeNode) GetNode(SALOMEDS::AttributeTreeNode_ptr value,
39                                          const Handle(TDataStd_TreeNode)& aNode) 
40 {
41   Handle(TDataStd_TreeNode) aResult = new TDataStd_TreeNode;
42   CORBA::String_var aString = CORBA::string_dup(value->Label());
43   TDF_Label aLabel;
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")
48     return aResult;
49   }
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")
53   }
54   return aResult;
55 }
56
57 void SALOMEDS_AttributeTreeNode_i::SetFather(SALOMEDS::AttributeTreeNode_ptr theValue) {
58   CheckLocked();
59   _myAttr->SetFather(GetNode(theValue,_myAttr));
60 }
61
62 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::HasFather() {
63   return _myAttr->HasFather();
64 }
65
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();
70 }
71
72 void SALOMEDS_AttributeTreeNode_i::SetPrevious(SALOMEDS::AttributeTreeNode_ptr theValue) {
73   CheckLocked();
74   _myAttr->SetPrevious(GetNode(theValue,_myAttr));
75 }
76
77 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::HasPrevious() {
78   return _myAttr->HasPrevious();
79 }
80
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();
85 }
86
87 void SALOMEDS_AttributeTreeNode_i::SetNext(SALOMEDS::AttributeTreeNode_ptr theValue) {
88   CheckLocked();
89   _myAttr->SetNext(GetNode(theValue,_myAttr));
90 }
91
92 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::HasNext() {
93   return _myAttr->HasNext();
94 }
95
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();
100 }
101
102 void SALOMEDS_AttributeTreeNode_i::SetFirst(SALOMEDS::AttributeTreeNode_ptr theValue) {
103   CheckLocked();
104   _myAttr->SetFirst(GetNode(theValue,_myAttr));
105 }
106
107 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::HasFirst() {
108   return _myAttr->HasFirst();
109 }
110
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();
115 }
116
117 void SALOMEDS_AttributeTreeNode_i::SetTreeID(const char* value) {
118   CheckLocked();
119   _myAttr->SetTreeID(Standard_GUID(_myAttr->ID()));
120 }
121
122 char* SALOMEDS_AttributeTreeNode_i::GetTreeID() {
123   char aGUID[40];
124   _myAttr->ID().ToCString(aGUID);
125   return CORBA::string_dup(aGUID);
126 }
127
128 void SALOMEDS_AttributeTreeNode_i::Append(SALOMEDS::AttributeTreeNode_ptr theValue) {
129   CheckLocked();
130   _myAttr->Append(GetNode(theValue,_myAttr));
131 }
132
133 void SALOMEDS_AttributeTreeNode_i::Prepend(SALOMEDS::AttributeTreeNode_ptr theValue) {
134   CheckLocked();
135   _myAttr->Prepend(GetNode(theValue,_myAttr));
136 }
137
138 void SALOMEDS_AttributeTreeNode_i::InsertBefore(SALOMEDS::AttributeTreeNode_ptr theValue) {
139   CheckLocked();
140   _myAttr->InsertBefore(GetNode(theValue,_myAttr));
141 }
142
143 void SALOMEDS_AttributeTreeNode_i::InsertAfter(SALOMEDS::AttributeTreeNode_ptr theValue) {
144   CheckLocked();
145   _myAttr->InsertAfter(GetNode(theValue,_myAttr));
146 }
147
148 void SALOMEDS_AttributeTreeNode_i::Remove() {
149   CheckLocked();
150   _myAttr->Remove();
151 }
152
153 CORBA::Long SALOMEDS_AttributeTreeNode_i::Depth() {
154   return _myAttr->Depth();
155 }
156
157 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::IsRoot() {
158   return _myAttr->IsRoot();
159 }
160
161 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::IsDescendant(SALOMEDS::AttributeTreeNode_ptr theValue) {
162   return _myAttr->IsDescendant(GetNode(theValue,_myAttr));
163 }
164
165 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::IsFather(SALOMEDS::AttributeTreeNode_ptr theValue) {
166   return _myAttr->IsFather(GetNode(theValue,_myAttr));
167 }
168
169 CORBA::Boolean SALOMEDS_AttributeTreeNode_i::IsChild(SALOMEDS::AttributeTreeNode_ptr theValue) {
170   return _myAttr->IsChild(GetNode(theValue,_myAttr));
171 }
172
173 char* SALOMEDS_AttributeTreeNode_i::Label() {
174   TCollection_AsciiString aLabelName;
175   TDF_Tool::Entry(_myAttr->Label(),aLabelName);
176   return CORBA::string_dup(aLabelName.ToCString());
177 }
178
179 char* SALOMEDS_AttributeTreeNode_i::Store() {
180   char* aStr[4];
181
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] = "!";
186
187   int aLength = 4;
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();
192 }
193
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();
197   
198   char* aCopy = strdup(value);
199   char* adr = strtok(aCopy, " ");
200   
201   TDF_Label aLabel;
202   Handle(TDataStd_TreeNode) aDepNode;
203
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);
208   }
209
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);
215   }
216
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);
222   }
223
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);
229   }
230 }