using System;
using System.Collections;
using System.Text;
using System.Drawing.Drawing2D;
using System.Drawing;
#if AdvTree
namespace DevComponents.Tree
#elif DOTNETBAR
namespace DevComponents.DotNetBar
#endif
{
    /// 
    /// Represents Collection for the BackgroundColorBlend objects.
    /// 
    public class BackgroundColorBlendCollection : CollectionBase
    {
        #region Private Variables
        private ElementStyle m_Parent = null; 
        #endregion
        #region Internal Implementation
        /// Creates new instance of the class.
        public BackgroundColorBlendCollection() {}
        internal ElementStyle Parent
        {
            get { return m_Parent; }
            set { m_Parent = value; }
        }
        /// 
		/// Adds new object to the collection.
		/// 
        /// Object to add.
		/// Index of newly added object.
		public int Add(BackgroundColorBlend item)
		{
			return List.Add(item);
		}
        /// 
        /// Adds array of new objects to the collection.
        /// 
        /// Array of object to add.
        public void AddRange(BackgroundColorBlend[] items)
        {
            foreach (BackgroundColorBlend item in items)
                this.Add(item);
        }
		/// 
		/// Returns reference to the object in collection based on it's index.
		/// 
		public BackgroundColorBlend this[int index]
		{
			get {return (BackgroundColorBlend)(List[index]);}
			set {List[index] = value;}
		}
		/// 
		/// Inserts new object into the collection.
		/// 
		/// Position of the object.
		/// Object to insert.
		public void Insert(int index, BackgroundColorBlend value) 
		{
			List.Insert(index, value);
		}
		/// 
		/// Returns index of the object inside of the collection.
		/// 
		/// Reference to the object.
		/// Index of the object.
		public int IndexOf(BackgroundColorBlend value) 
		{
			return List.IndexOf(value);
		}
		/// 
		/// Returns whether collection contains specified object.
		/// 
		/// Object to look for.
		/// true if object is part of the collection, otherwise false.
		public bool Contains(BackgroundColorBlend value) 
		{
			return List.Contains(value);
		}
		/// 
		/// Removes specified object from the collection.
		/// 
		/// 
		public void Remove(BackgroundColorBlend value) 
		{
			List.Remove(value);
		}
        //protected override void OnRemoveComplete(int index,object value)
        //{
        //    base.OnRemoveComplete(index,value);
        //    BackgroundColorBlend me=value as BackgroundColorBlend;
        //}
        //protected override void OnInsertComplete(int index,object value)
        //{
        //    base.OnInsertComplete(index,value);
        //    BackgroundColorBlend me=value as BackgroundColorBlend;
        //}
		/// 
		/// Copies collection into the specified array.
		/// 
		/// Array to copy collection to.
		/// Starting index.
		public void CopyTo(BackgroundColorBlend[] array, int index) 
		{
			List.CopyTo(array, index);
		}
		/// 
		/// Copies contained items to the BackgroundColorBlend array.
		/// 
		/// Array to copy to.
		internal void CopyTo(BackgroundColorBlend[] array)
		{
			List.CopyTo(array,0);
		}
        /// 
        /// Creates ColorBlend object based on the members of the collection. ColorBlend object will be valid only if all members of the collection
        /// represents relative/percentage based color blends.
        /// 
        /// 
        public ColorBlend GetColorBlend()
        {
            ColorBlend blend = new ColorBlend();
            Color[] colors = new Color[this.Count];
            float[] positions = new float[this.Count];
            for(int i=0; i
        /// Adds the BackgroundColorBlend objects from the collection.
        /// 
        /// Collection to copy objects from
        public void CopyFrom(BackgroundColorBlendCollection col)
        {
            foreach (BackgroundColorBlend b in col)
                this.Add(b);
        }
        internal eBackgroundColorBlendType GetBlendType()
        {
            BackgroundColorBlendCollection c = this;
            if (c.Count == 1)
                return eBackgroundColorBlendType.SolidColor;
            if (c.Count <= 1)
                return eBackgroundColorBlendType.Invalid;
            eBackgroundColorBlendType t = eBackgroundColorBlendType.Invalid;
            foreach (BackgroundColorBlend b in c)
            {
                if (b.Position == 0 || b.Position == 1f)
                    continue;
                if (b.Position <= 1f)
                {
                    if (t == eBackgroundColorBlendType.Invalid)
                        t = eBackgroundColorBlendType.Relative;
                    else if (t == eBackgroundColorBlendType.Absolute)
                    {
                        t = eBackgroundColorBlendType.Invalid;
                        break;
                    }
                }
                else
                {
                    if (t == eBackgroundColorBlendType.Invalid)
                        t = eBackgroundColorBlendType.Absolute;
                    else if (t == eBackgroundColorBlendType.Relative)
                    {
                        t = eBackgroundColorBlendType.Invalid;
                        break;
                    }
                }
            }
            if (c.Count == 2 && c[0].Position == 0f && c[1].Position == 1f)
                return eBackgroundColorBlendType.Relative;
            if (t == eBackgroundColorBlendType.Invalid)
                return t;
            if (t == eBackgroundColorBlendType.Relative && c[0].Position != 0f && c[c.Count - 1].Position != 1f)
                return eBackgroundColorBlendType.Invalid;
            else if (t == eBackgroundColorBlendType.Absolute && ((c.Count / 2) * 2 != c.Count))
                return eBackgroundColorBlendType.Invalid;
            return t;
        }
        /// 
        /// Initializes the collection with the two color blend.
        /// 
        /// Collection to initialize.
        /// Start color.
        /// End color.
        public static void InitializeCollection(BackgroundColorBlendCollection collection, int backColor1, int backColor2)
        {
            InitializeCollection(collection, ColorScheme.GetColor(backColor1), ColorScheme.GetColor(backColor2));
        }
        /// 
        /// Initializes the collection with the two color blend.
        /// 
        /// Collection to initialize.
        /// Start color.
        /// End color.
        public static void InitializeCollection(BackgroundColorBlendCollection collection, Color backColor1, Color backColor2)
        {
            collection.Clear();
            collection.Add(new BackgroundColorBlend(backColor1, 0f));
            collection.Add(new BackgroundColorBlend(backColor2, 1f));
        }
        /// 
        /// Initializes the collection with the two color blend.
        /// 
        /// Collection to initialize.
        /// Solid Color
        public static void InitializeCollection(BackgroundColorBlendCollection collection, Color backColor)
        {
            collection.Clear();
            collection.Add(new BackgroundColorBlend(backColor, 0f));
        }
		#endregion
    }
    internal enum eBackgroundColorBlendType
    {
        Invalid,
        Relative,
        Absolute,
        SolidColor
    }
}