2008-02-19 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / System.XML / Mono.Xml.XPath / XPathEditableDocument.cs
index 75f10cfb3770881833fc55f1f5bf26785bf03860..d7a008ebcfb0aa854710b866330901d4a5339a7b 100644 (file)
@@ -74,7 +74,8 @@ namespace Mono.Xml.XPath
                XmlNode parent;
                XmlNode current;
                XmlNode nextSibling;
-               Stack nodeStack = new Stack ();
+               WriteState state;
+               XmlAttribute attribute;
 
                public XmlDocumentInsertionWriter (XmlNode owner, XmlNode nextSibling)
                {
@@ -85,6 +86,7 @@ namespace Mono.Xml.XPath
                        case XmlNodeType.Document:
                                current = ((XmlDocument) parent).CreateDocumentFragment ();
                                break;
+                       case XmlNodeType.DocumentFragment:
                        case XmlNodeType.Element:
                                current = parent.OwnerDocument.CreateDocumentFragment ();
                                break;
@@ -95,20 +97,15 @@ namespace Mono.Xml.XPath
                        state = WriteState.Content;
                }
 
-               WriteState state;
-               XmlAttribute attribute;
-
                public override WriteState WriteState {
                        get { return state; }
                }
 
                public override void Close ()
                {
-                       while (nodeStack.Count > 0) {
-                               XmlNode n = nodeStack.Pop () as XmlNode;
-                               n.AppendChild (current);
-                               current = n;
-                       }
+                       while (current.ParentNode != null)
+                               current = current.ParentNode;
+
                        parent.InsertBefore ((XmlDocumentFragment) current, nextSibling);
                        if (Closed != null)
                                Closed (this);
@@ -116,8 +113,6 @@ namespace Mono.Xml.XPath
 
                internal event XmlWriterClosedEventHandler Closed;
 
-               internal XmlNode AppendedFirstChild;
-
                public override void Flush ()
                {
                }
@@ -131,6 +126,8 @@ namespace Mono.Xml.XPath
                {
                        if (state != WriteState.Content)
                                throw new InvalidOperationException ("Current state is not inside element. Cannot start attribute.");
+                       if (prefix == null && ns != null && ns.Length > 0)
+                               prefix = LookupPrefix (ns);
                        attribute = current.OwnerDocument.CreateAttribute (prefix, name, ns);
                        state = WriteState.Attribute;
                }
@@ -155,17 +152,18 @@ namespace Mono.Xml.XPath
 
                public override void WriteStartElement (string prefix, string name, string ns)
                {
+                       if (prefix == null && ns != null && ns.Length > 0)
+                               prefix = LookupPrefix (ns);
                        XmlElement el = current.OwnerDocument.CreateElement (prefix, name, ns);
                        current.AppendChild (el);
-                       nodeStack.Push (current);
                        current = el;
                }
 
                public override void WriteEndElement ()
                {
-                       if (nodeStack.Count == 0)
+                       current = current.ParentNode;
+                       if (current == null)
                                throw new InvalidOperationException ("No element is opened.");
-                       current = nodeStack.Pop () as XmlNode;
                }
 
                public override void WriteFullEndElement ()
@@ -267,6 +265,8 @@ namespace Mono.Xml.XPath
        internal class XmlDocumentAttributeWriter : XmlWriter
        {
                XmlElement element;
+               WriteState state;
+               XmlAttribute attribute;
 
                public XmlDocumentAttributeWriter (XmlNode owner)
                {
@@ -276,9 +276,6 @@ namespace Mono.Xml.XPath
                        state = WriteState.Content;
                }
 
-               WriteState state;
-               XmlAttribute attribute;
-
                public override WriteState WriteState {
                        get { return state; }
                }
@@ -300,6 +297,8 @@ namespace Mono.Xml.XPath
                {
                        if (state != WriteState.Content)
                                throw new InvalidOperationException ("Current state is not inside element. Cannot start attribute.");
+                       if (prefix == null && ns != null && ns.Length > 0)
+                               prefix = LookupPrefix (ns);
                        attribute = element.OwnerDocument.CreateAttribute (prefix, name, ns);
                        state = WriteState.Attribute;
                }
@@ -451,6 +450,10 @@ namespace Mono.Xml.XPath
                        get { return navigator.BaseURI; }
                }
 
+               public override bool CanEdit {
+                       get { return true; }
+               }
+
                public override bool IsEmptyElement {
                        get { return navigator.IsEmptyElement; }
                }
@@ -625,7 +628,7 @@ namespace Mono.Xml.XPath
                        XPathNavigator parentNav = Clone ();
                        parentNav.MoveToParent ();
 
-                       w.Closed += delegate (XmlWriter w) {
+                       w.Closed += delegate (XmlWriter writer) {
                                XmlNode parent = start.ParentNode;
                                XmlNode next;
                                bool loop = true;