/// <summary>
 /// Adds an item to the collection.
 /// </summary>
 /// <param name="item">The item to add to the collection.</param>
 /// <returns></returns>
 public KmlValue Add(KmlValue item)
 {
     List.Add(item);
     item.Parent = Parent;
     return item;
 }
        public KmlValue Clone()
        {
            KmlValue newKmlValue = new KmlValue(this._Value, this.IsString, StartPosition.Clone(), EndPosition.Clone());

            if (StartPosition != null)
            {
                newKmlValue.StartPosition = StartPosition.Clone();
            }
            if (EndPosition != null)
            {
                newKmlValue.EndPosition = EndPosition.Clone();
            }

            //comments
            foreach (KmlComment comment in Comments)
            {
                newKmlValue.Comments.Add(comment.Clone());
            }

            return newKmlValue;
        }
 /// <summary>
 /// Removes the item from the collection.
 /// </summary>
 /// <param name="item"></param>
 public void Remove(KmlValue item)
 {
     if (List.Contains(item))
     {
         List.Remove(item);
         item.Parent = null;
     }
 }
 /// <summary>
 /// Sets the item at the specified index in the collection.
 /// </summary>
 /// <param name="index">The index to set.</param>
 /// <param name="item">The item to set.</param>
 public void Set(int index, KmlValue item)
 {
     List[index] = item;
     item.Parent = Parent;
 }
 /// <summary>
 /// Gets the index of the specified item.
 /// </summary>
 /// <param name="item">The item to get the index of.</param>
 /// <returns></returns>
 public int IndexOf(KmlValue item)
 {
     return List.IndexOf(item);
 }
 /// <summary>
 /// Copies the collection to an array starting at a specified index.
 /// </summary>
 /// <param name="array">The array to copy the collection to.</param>
 /// <param name="index">The index to start copying from.</param>
 public void CopyTo(KmlValue[] array, int index)
 {
     List.CopyTo(array, index);
 }
 /// <summary>
 /// Checks if the collection contains the specified item.
 /// </summary>
 /// <param name="item">The item to check for.</param>
 /// <returns></returns>
 public bool Contains(KmlValue item)
 {
     return List.Contains(item);
 }
 /// <summary>
 /// Adds a range of items to the collection
 /// </summary>
 /// <param name="range">The range of values to add to the collection.</param>
 public void AddRange(KmlValue[] range)
 {
     foreach (KmlValue value in range)
     {
         List.Add(value);
         value.Parent = Parent;
     }
 }
        public KmlNode ReadNode(KmlNode Parent)
        {
            StringBuilder buffer = new StringBuilder();
            bool end = false;
            bool readingValue = false;

            //record start position
            CharPosition nodeStartPosition = GetCurrentPosition();
            CharPosition valueStartPosition = GetCurrentPosition();

            //node to store values in
            KmlNode node = new KmlNode(nodeStartPosition);

            //unload comments
            node.Comments.AddRange(CommentBuffer);
            CommentBuffer.Clear();
            while (!end)
            {
                //check if we are at end of stream
                if (reader.Peek() < 0)
                {
                    throw new InvalidKmlSyntaxException(GetCurrentPosition(), new UnclosedNodeException(nodeStartPosition));
                }
                char c = (char)reader.Read();
                //keep track of characters read
                TrackPosition(c);
                //check for comment
                if (c == COMMENT_CHAR)
                {
                    ReadComment(node);
                    continue;
                }
                //check if we are reading whitespace
                if (Char.IsWhiteSpace(c) || Char.IsSeparator(c) || c== CLOSE_NODE_CHAR)
                {
                    //check if we have finished reading the node
                    if (c == CLOSE_NODE_CHAR)
                    {
                        //end reading
                        end = true;
                    }
                    //check if we have been reading a value
                    if (readingValue)
                    {
                        //create new value
                        KmlValue val = new KmlValue(buffer.ToString(), false, valueStartPosition, GetCurrentPosition());
                        //give it out comments
                        val.Comments.AddRange(CommentBuffer);
                        //clear out our comments
                        CommentBuffer.Clear();
                        //put the buffer into a value
                        node.Values.Add(val);
                        //finished reading value
                        readingValue = false;
                        //clear buffer
                        buffer = new StringBuilder();
                    }
                    //if not ignore
                }
                else
                {

                    //check if theres another node to read
                    if (c == OPEN_NODE_CHAR)
                    {
                        //read the node and add to child nodes
                        KmlNode rn = ReadNode(null);
                        node.ChildNodes.Add(rn);
                    }
                    //check if theres a string to read
                    else if (c == QUOTE_CHAR)
                    {
                        //end pos
                        CharPosition valueEndPosition = GetCurrentPosition();
                        //create our value
                        KmlValue val = new KmlValue(ReadString(), true, valueStartPosition, valueEndPosition);

                        //give it out comments
                        val.Comments.AddRange(CommentBuffer);
                        //clear out our comments
                        CommentBuffer.Clear();
                        //read the string and add it to values
                        node.Values.Add(val);
                    }
                    else
                    {
                        //check if we are reading a value
                        if (!readingValue)
                        {
                            //we arnt reading a value - but we are now
                            readingValue = true;
                            //set value start post
                            valueStartPosition = GetCurrentPosition();
                        }
                        //add the character to the buffer
                        buffer.Append(c);
                        //MessageBox.Show(c.ToString());
                    }
                }
            }

            node.EndPosition = new CharPosition(Position.Row, Position.Column + 1, Position.Offset + 1);

            return node;
        }