Integration of OCCT 6.5.0 from SVN
[occt.git] / src / LDOM / LDOM_Node.cxx
1 // File:      LDOM_Node.cxx
2 // Created:   27.06.01 15:56:11
3 // Author:    Alexander GRIGORIEV
4 // Copyright: OpenCascade 2001
5 // History:
6
7 #include <LDOM_MemManager.hxx>
8 #include <LDOM_BasicAttribute.hxx>
9 #include <LDOM_BasicElement.hxx>
10 #include <LDOM_BasicText.hxx>
11
12 //=======================================================================
13 //function : Origin
14 //purpose  : 
15 //=======================================================================
16
17 const LDOM_BasicNode& LDOM_Node::Origin () const
18 {
19   if (myOrigin == NULL) {
20     static LDOM_BasicNode aNullNode;
21     return aNullNode;
22   }
23   return * myOrigin;
24 }
25
26 //=======================================================================
27 //function : getOwnerDocument
28 //purpose  : 
29 //=======================================================================
30
31 const LDOM_MemManager& LDOM_Node::getOwnerDocument () const
32 {
33   return myDocument -> Self();
34 }
35
36 //=======================================================================
37 //function : operator =
38 //purpose  : Assignment
39 //=======================================================================
40
41 LDOM_Node& LDOM_Node::operator = (const LDOM_Node& theOther)
42
43   myDocument    = theOther.myDocument;
44   myOrigin      = theOther.myOrigin;
45   myLastChild   = theOther.myLastChild;
46   return * this;
47 }
48
49 //=======================================================================
50 //function : operator =
51 //purpose  : Nullify
52 //=======================================================================
53
54 LDOM_Node& LDOM_Node::operator = (const LDOM_NullPtr * /*aNull*/)
55 {
56   myDocument.Nullify();
57   myOrigin    = NULL;
58   myLastChild = NULL;
59   return * this;
60 }
61
62 //=======================================================================
63 //function : isNull
64 //purpose  : 
65 //=======================================================================
66
67 Standard_Boolean LDOM_Node::isNull () const
68 {
69   return myOrigin == NULL || myOrigin -> isNull();
70 }
71
72 //=======================================================================
73 //function : operator ==
74 //purpose  : Compare two Nodes
75 //=======================================================================
76
77 Standard_Boolean LDOM_Node::operator == (const LDOM_Node& anOther) const
78 {
79   if (isNull())
80     return anOther.isNull();
81   return myOrigin == anOther.myOrigin;
82 }
83
84 //=======================================================================
85 //function : operator !=
86 //purpose  : Compare two Nodes
87 //=======================================================================
88
89 Standard_Boolean LDOM_Node::operator != (const LDOM_Node& anOther) const
90 {
91   if (isNull())
92     return !anOther.isNull();
93   return myOrigin != anOther.myOrigin;
94 }
95
96 //=======================================================================
97 //function : getNodeType
98 //purpose  : 
99 //=======================================================================
100
101 LDOM_Node::NodeType LDOM_Node::getNodeType () const
102 {
103   return myOrigin == NULL ? UNKNOWN : myOrigin -> getNodeType();
104 }
105
106 //=======================================================================
107 //function : getNodeName
108 //purpose  : 
109 //=======================================================================
110
111 LDOMString LDOM_Node::getNodeName () const
112 {
113   switch (getNodeType()) {
114   case ELEMENT_NODE:
115     {
116       const LDOM_BasicElement& anElement= *(const LDOM_BasicElement *) myOrigin;
117       return LDOMString::CreateDirectString (anElement.GetTagName(),
118                                              myDocument -> Self());
119     }
120   case ATTRIBUTE_NODE:
121     {
122       const LDOM_BasicAttribute& anAttr= *(const LDOM_BasicAttribute*) myOrigin;
123       return LDOMString::CreateDirectString (anAttr.GetName(),
124                                              myDocument -> Self());
125     }
126   default: ;
127   }
128   return LDOMString ();
129 }
130
131 //=======================================================================
132 //function : getNodeValue
133 //purpose  : 
134 //=======================================================================
135
136 LDOMString LDOM_Node::getNodeValue () const
137 {
138   switch (getNodeType()) {
139   case ATTRIBUTE_NODE:
140     {
141       const LDOM_BasicAttribute& anAttr= *(const LDOM_BasicAttribute*) myOrigin;
142       return LDOMString (anAttr.GetValue(), myDocument -> Self());
143     }
144   case TEXT_NODE:
145   case CDATA_SECTION_NODE:
146   case COMMENT_NODE:
147     {
148       const LDOM_BasicText& aText = * (const LDOM_BasicText *) myOrigin;
149       return LDOMString (aText.GetData(), myDocument -> Self());
150     }
151   default: ;
152   }
153   return LDOMString ();
154 }
155
156 //=======================================================================
157 //function : getFirstChild
158 //purpose  : 
159 //=======================================================================
160
161 LDOM_Node LDOM_Node::getFirstChild () const
162 {
163   const NodeType aType = getNodeType ();
164   if (aType == ELEMENT_NODE) {
165     const LDOM_BasicElement& anElement = * (const LDOM_BasicElement *) myOrigin;
166     const LDOM_BasicNode * aChild = anElement.GetFirstChild();
167     if (aChild)
168       if (aChild -> getNodeType() != LDOM_Node::ATTRIBUTE_NODE)
169         return LDOM_Node (* aChild, myDocument);
170   }
171   return LDOM_Node ();
172 }
173
174 //=======================================================================
175 //function : getLastChild
176 //purpose  : 
177 //=======================================================================
178
179 LDOM_Node LDOM_Node::getLastChild () const
180 {
181   const NodeType aType = getNodeType ();
182   if (aType == ELEMENT_NODE) {
183     if (myLastChild == NULL) {
184       const LDOM_BasicElement& anElement = *(const LDOM_BasicElement*) myOrigin;
185       (const LDOM_BasicNode *&) myLastChild = anElement.GetLastChild();
186     }
187     return LDOM_Node (* myLastChild, myDocument);
188   }
189   return LDOM_Node ();
190 }
191
192 //=======================================================================
193 //function : getNextSibling
194 //purpose  : 
195 //=======================================================================
196
197 LDOM_Node LDOM_Node::getNextSibling () const
198 {
199   const LDOM_BasicNode * aSibling = myOrigin -> mySibling;
200   if (aSibling)
201     if (aSibling -> getNodeType () != ATTRIBUTE_NODE)
202       return LDOM_Node (* aSibling, myDocument);
203   return LDOM_Node ();
204 }
205
206 //=======================================================================
207 //function : removeChild
208 //purpose  : 
209 //=======================================================================
210
211 void LDOM_Node::removeChild (const LDOM_Node& aChild)
212 {
213   const NodeType aType = getNodeType ();
214   if (aType == ELEMENT_NODE) {
215     const LDOM_BasicElement& anElement = * (LDOM_BasicElement *) myOrigin;
216     if (aChild != NULL)
217       anElement.RemoveChild (aChild.myOrigin);
218     if (aChild.myOrigin == myLastChild)
219 //      myLastChild = anElement.GetLastChild();
220       myLastChild = NULL;
221   }
222 }
223
224 //=======================================================================
225 //function : appendChild
226 //purpose  : 
227 //=======================================================================
228
229 void LDOM_Node::appendChild (const LDOM_Node& aChild)
230 {
231   const NodeType aType = getNodeType ();
232   if (aType == ELEMENT_NODE && aChild != NULL) {
233     if (myLastChild) {
234       aChild.myOrigin -> SetSibling (myLastChild -> mySibling);
235       (const LDOM_BasicNode *&) myLastChild -> mySibling = aChild.myOrigin;
236     }else{
237       const LDOM_BasicElement& anElement = * (LDOM_BasicElement *) myOrigin;
238       anElement.AppendChild (aChild.myOrigin, myLastChild);
239     }
240     myLastChild = aChild.myOrigin;
241   }
242 }
243
244 //=======================================================================
245 //function : hasChildNodes
246 //purpose  : 
247 //=======================================================================
248
249 Standard_Boolean LDOM_Node::hasChildNodes () const
250 {
251   const NodeType aType = getNodeType ();
252   if (aType == ELEMENT_NODE) {
253     const LDOM_BasicElement& anElement = * (const LDOM_BasicElement *) myOrigin;
254     const LDOM_BasicNode * aChild = anElement.GetFirstChild();
255     if (aChild) return ! aChild -> isNull(); 
256   }
257   return Standard_False;
258 }
259
260 //=======================================================================
261 //function : SetValueClear
262 //purpose  : 
263 //=======================================================================
264
265 void LDOM_Node::SetValueClear () const
266 {
267   LDOMBasicString * aValue = NULL;
268   switch (getNodeType()) {
269   case ATTRIBUTE_NODE:
270     {
271       const LDOM_BasicAttribute& anAttr= *(const LDOM_BasicAttribute*) myOrigin;
272       aValue = (LDOMBasicString *) & anAttr.GetValue();
273       break;
274     }
275   case TEXT_NODE:
276   case CDATA_SECTION_NODE:
277   case COMMENT_NODE:
278     {
279       const LDOM_BasicText& aText = * (const LDOM_BasicText *) myOrigin;
280       aValue = (LDOMBasicString *) & aText.GetData();
281       break;
282     }
283   default: return;
284   }
285   if (aValue -> Type() == LDOMBasicString::LDOM_AsciiDoc)
286     aValue -> myType = LDOMBasicString::LDOM_AsciiDocClear;
287 }