// Decompiled with JetBrains decompiler
// Type: Microsoft.Iris.Library.TreeNodeCollection
// Assembly: UIX, Version=4.8.0.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217
// MVID: A56C6C9D-B7F6-46A9-8BDE-B3D9B8D60B11
// Assembly location: C:\Program Files\Zune\UIX.dll

using System;
using System.Collections;
using System.Collections.Generic;

namespace Microsoft.Iris.Library
{
    public struct TreeNodeCollection : IList, ICollection, IEnumerable, IList<TreeNode>
    {
        private TreeNode _nodeSubject;

        internal TreeNodeCollection(TreeNode nodeSubject) => _nodeSubject = nodeSubject;

        public int Count => _nodeSubject.ChildCount;

        bool ICollection.IsSynchronized => false;

        object ICollection.SyncRoot => null;

        bool IList.IsFixedSize => false;

        public bool IsReadOnly => false;

        object IList.this[int index]
        {
            get => this[index];
            set
            {
            }
        }

        public TreeNode this[int childIndex]
        {
            get
            {
                int num = 0;
                foreach (TreeNode treeNode in this)
                {
                    if (childIndex == num)
                        return treeNode;
                    ++num;
                }
                return null;
            }
            set
            {
            }
        }

        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();

        public IEnumerator<TreeNode> GetEnumerator() => new TreeNodeEnumerator(_nodeSubject);

        void ICollection.CopyTo(Array destList, int destIndex)
        {
            foreach (TreeNode treeNode in this)
                destList.SetValue(treeNode, destIndex++);
        }

        public void CopyTo(TreeNode[] destList, int destIndex) => ((ICollection)this).CopyTo(destList, destIndex);

        int IList.Add(object value)
        {
            Add((TreeNode)value);
            return _nodeSubject.ChildCount - 1;
        }

        public void Add(TreeNode nodeChild) => nodeChild.ChangeParent(_nodeSubject, null, TreeNode.LinkType.Last);

        public void Clear() => _nodeSubject.RemoveAllChildren(true);

        bool IList.Contains(object nodeChild) => Contains((TreeNode)nodeChild);

        public bool Contains(TreeNode nodeChild) => nodeChild.Parent == _nodeSubject;

        int IList.IndexOf(object nodeChild) => IndexOf((TreeNode)nodeChild);

        public int IndexOf(TreeNode nodeChild)
        {
            if (nodeChild.Parent != _nodeSubject)
                return -1;
            int num = 0;
            foreach (TreeNode treeNode in this)
            {
                if (nodeChild == treeNode)
                    return num;
                ++num;
            }
            return -1;
        }

        void IList.Insert(int insertAtIndex, object nodeChild) => Insert(insertAtIndex, (TreeNode)nodeChild);

        public void Insert(int insertAtIndex, TreeNode nodeChild)
        {
            TreeNode nodeSibling = null;
            TreeNode.LinkType lt = TreeNode.LinkType.Last;
            if (insertAtIndex < Count)
            {
                nodeSibling = this[insertAtIndex];
                lt = TreeNode.LinkType.Before;
            }
            nodeChild.ChangeParent(_nodeSubject, nodeSibling, lt);
        }

        void IList.Remove(object nodeChild) => Remove((TreeNode)nodeChild);

        public void Remove(TreeNode nodeChild) => nodeChild.ChangeParent(null);

        public void RemoveAt(int removeAtIndex) => this[removeAtIndex].ChangeParent(null);

        bool ICollection<TreeNode>.Remove(TreeNode item)
        {
            Remove(item);
            return true;
        }
    }
}
