**** Merged from MCS ****
[mono-project.git] / mcs / class / System.XML / System.Xml.XPath / XPathEditableNavigator.cs
blobbd9bf2de3a6d2c58585d867eb456bdb5a3217123
1 //
2 // XPathEditableNavigator.cs
3 //
4 // Author:
5 // Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
6 //
7 // (C)2003 Atsushi Enomoto
8 //
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
18 //
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
21 //
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 #if NET_2_0
33 using System;
34 using System.Collections;
35 using System.Collections.Specialized;
36 using System.ComponentModel;
37 using System.IO;
38 using System.Security.Policy;
39 using System.Xml.Schema;
40 using System.Xml.XPath;
41 using Mono.Xml.XPath;
42 //using MS.Internal.Xml;
44 namespace System.Xml.XPath
46 public abstract class XPathEditableNavigator
47 : XPathNavigator//, IXPathEditable
49 protected XPathEditableNavigator ()
52 #if false
53 public abstract XmlWriter AppendChild ();
55 [MonoTODO]
56 public virtual XPathEditableNavigator AppendChild (
57 string xmlFragments)
59 // FIXME: should XmlParserContext be something?
60 return AppendChild (new XmlTextReader (xmlFragments, XmlNodeType.Element, null));
63 [MonoTODO]
64 public virtual XPathEditableNavigator AppendChild (
65 XmlReader reader)
67 XmlWriter w = AppendChild ();
68 while (!reader.EOF)
69 w.WriteNode (reader, false);
70 w.Close ();
71 XPathEditableNavigator nav = (XPathEditableNavigator) Clone ();
72 nav.MoveToFirstChild ();
73 while (nav.MoveToNext ())
75 return nav;
78 [MonoTODO]
79 public virtual XPathEditableNavigator AppendChild (
80 XPathNavigator nav)
82 return AppendChild (new XPathNavigatorReader (nav));
85 public void AppendChildElement (string prefix, string name, string ns, string value)
87 XmlWriter xw = AppendChild ();
88 xw.WriteStartElement (prefix, name, ns);
89 xw.WriteString (value);
90 xw.WriteEndElement ();
91 xw.Close ();
94 [MonoTODO]
95 protected void BuildSubTree (XmlReader reader, XmlWriter writer, bool useValidity)
97 throw new NotImplementedException ();
100 public virtual void CreateAttribute (string prefix, string localName, string namespaceURI, string value)
102 using (XmlWriter w = CreateAttributes ()) {
103 w.WriteAttributeString (prefix, localName, namespaceURI, value);
107 public abstract XmlWriter CreateAttributes ();
110 public virtual XPathEditableNavigator CreateEditor ()
112 return (XPathEditableNavigator) Clone ();
115 // LAMESPEC: documented as public abstract, but it conflicts
116 // with XPathNavigator.CreateNavigator ().
117 [MonoTODO]
118 public override XPathNavigator CreateNavigator ()
123 public abstract bool DeleteCurrent ();
125 public virtual XmlWriter InsertAfter ()
127 XPathEditableNavigator nav = (XPathEditableNavigator) Clone ();
128 if (nav.MoveToNext ())
129 return nav.InsertBefore ();
130 else
131 return AppendChild ();
134 public virtual XPathEditableNavigator InsertAfter (string xmlFragments)
136 return InsertAfter (new XmlTextReader (xmlFragments, XmlNodeType.Element, null));
139 [MonoTODO]
140 public virtual XPathEditableNavigator InsertAfter (XmlReader reader)
142 using (XmlWriter w = InsertAfter ()) {
143 w.WriteNode (reader, false);
145 XPathEditableNavigator nav = (XPathEditableNavigator) Clone ();
146 nav.MoveToNext ();
147 return nav;
150 [MonoTODO]
151 public virtual XPathEditableNavigator InsertAfter (XPathNavigator nav)
153 return InsertAfter (new XPathNavigatorReader (nav));
156 public abstract XmlWriter InsertBefore ();
158 public virtual XPathEditableNavigator InsertBefore (string xmlFragments)
160 return InsertBefore (new XmlTextReader (xmlFragments, XmlNodeType.Element, null));
163 [MonoTODO]
164 public virtual XPathEditableNavigator InsertBefore (XmlReader reader)
166 using (XmlWriter w = InsertBefore ()) {
167 w.WriteNode (reader, false);
169 XPathEditableNavigator nav = (XPathEditableNavigator) Clone ();
170 nav.MoveToPrevious ();
171 return nav;
174 [MonoTODO]
175 public virtual XPathEditableNavigator InsertBefore (XPathNavigator nav)
177 return InsertBefore (new XPathNavigatorReader (nav));
180 public virtual void InsertElementAfter (string prefix,
181 string localName, string namespaceURI, string value)
183 using (XmlWriter w = InsertAfter ()) {
184 w.WriteElementString (prefix, localName, namespaceURI, value);
188 public virtual void InsertElementBefore (string prefix,
189 string localName, string namespaceURI, string value)
191 using (XmlWriter w = InsertBefore ()) {
192 w.WriteElementString (prefix, localName, namespaceURI, value);
196 public virtual XmlWriter PrependChild ()
198 XPathEditableNavigator nav = (XPathEditableNavigator) Clone ();
199 if (nav.MoveToFirstChild ())
200 return nav.InsertBefore ();
201 else
202 return InsertBefore ();
205 public virtual XPathEditableNavigator PrependChild (string xmlFragments)
207 return PrependChild (new XmlTextReader (xmlFragments, XmlNodeType.Element, null));
210 [MonoTODO]
211 public virtual XPathEditableNavigator PrependChild (XmlReader reader)
213 using (XmlWriter w = PrependChild ()) {
214 w.WriteNode (reader, false);
216 XPathEditableNavigator nav = (XPathEditableNavigator) Clone ();
217 nav.MoveToFirstChild ();
218 return nav;
221 [MonoTODO]
222 public virtual XPathEditableNavigator PrependChild (XPathNavigator nav)
224 return PrependChild (new XPathNavigatorReader (nav));
227 public virtual void PrependChildElement (string prefix,
228 string localName, string namespaceURI, string value)
230 using (XmlWriter w = PrependChild ()) {
231 w.WriteElementString (prefix, localName, namespaceURI, value);
235 // Dunno the exact purpose, but maybe internal editor use
236 [MonoTODO]
237 public virtual void SetFromObject (object value)
239 throw new NotImplementedException ();
242 public abstract void SetValue (object value);
244 [MonoTODO]
245 public virtual void Validate (XmlSchemaSet schemas, ValidationEventHandler handler)
247 throw new NotImplementedException ();
250 [MonoTODO]
251 // It seems like setter is virtual but getter is overriden.
252 public virtual new string InnerXml {
253 set {
254 DeleteChildren ();
255 if (NodeType == XPathNodeType.Attribute) {
256 SetValue (value);
257 return;
259 AppendChild (new XmlTextReader (value, XmlNodeType.Element, null));
263 private void DeleteChildren ()
265 switch (NodeType) {
266 case XPathNodeType.Namespace:
267 throw new InvalidOperationException ("Removing namespace node content is not supported.");
268 case XPathNodeType.Attribute:
269 return;
270 case XPathNodeType.Text:
271 case XPathNodeType.SignificantWhitespace:
272 case XPathNodeType.Whitespace:
273 case XPathNodeType.ProcessingInstruction:
274 case XPathNodeType.Comment:
275 DeleteCurrent ();
276 return;
278 if (!HasChildren)
279 return;
280 XPathEditableNavigator nav = (XPathEditableNavigator) Clone ();
281 nav.MoveToFirstChild ();
282 while (!nav.IsSamePosition (this))
283 nav.DeleteCurrent ();
286 [MonoTODO]
287 // It seems like setter is virtual but getter is overriden.
288 public virtual new string OuterXml {
289 get {
290 return base.OuterXml;
292 set {
293 switch (NodeType) {
294 case XPathNodeType.Root:
295 case XPathNodeType.Attribute:
296 case XPathNodeType.Namespace:
297 throw new XmlException ("Setting OuterXml Root, Attribute and Namespace is not supported.");
300 // XPathEditableNavigator nav = (XPathEditableNavigator) Clone ();
301 // nav.MoveToParent ();
302 // MoveToParent ();
303 DeleteCurrent ();
304 AppendChild (value);
305 MoveToFirstChild ();
308 #endif
312 #endif