using UnityEngine;
using System.Collections.Generic;
using FairyGUI.Utils;
namespace FairyGUI
{
    /// 
    /// GObjectPool is use for GObject pooling.
    /// 
    public class GObjectPool
    {
        /// 
        /// Callback function when a new object is creating.
        /// 
        /// 
        public delegate void InitCallbackDelegate(GObject obj);
        /// 
        /// Callback function when a new object is creating.
        /// 
        public InitCallbackDelegate initCallback;
        Dictionary> _pool;
        Transform _manager;
        /// 
        /// 需要设置一个manager,加入池里的对象都成为这个manager的孩子
        /// 
        /// 
        public GObjectPool(Transform manager)
        {
            _manager = manager;
            _pool = new Dictionary>();
        }
        /// 
        /// Dispose all objects in the pool.
        /// 
        public void Clear()
        {
            foreach (KeyValuePair> kv in _pool)
            {
                Queue list = kv.Value;
                foreach (GObject obj in list)
                    obj.Dispose();
            }
            _pool.Clear();
        }
        /// 
        /// 
        /// 
        public int count
        {
            get { return _pool.Count; }
        }
        /// 
        /// 
        /// 
        /// 
        /// 
        public GObject GetObject(string url)
        {
            url = UIPackage.NormalizeURL(url);
            if (url == null)
                return null;
            Queue arr;
            if (_pool.TryGetValue(url, out arr)
                && arr.Count > 0)
                return arr.Dequeue();
            GObject obj = UIPackage.CreateObjectFromURL(url);
            if (obj != null)
            {
                if (initCallback != null)
                    initCallback(obj);
            }
            return obj;
        }
        /// 
        /// 
        /// 
        /// 
        public void ReturnObject(GObject obj)
        {
            if (obj.displayObject.isDisposed)
                return;
            string url = obj.resourceURL;
            Queue arr;
            if (!_pool.TryGetValue(url, out arr))
            {
                arr = new Queue();
                _pool.Add(url, arr);
            }
            if (_manager != null)
                obj.displayObject.cachedTransform.SetParent(_manager, false);
            arr.Enqueue(obj);
        }
    }
}