public class WaitingView : MonoSingleton<WaitingView>, IPointerClickHandler
{
    public static WaitingView mInstance;
    Action<object> _CBTimeout;
    object _Param;
    Coroutine _TimeCounter;
    private List<GameObject> _ExecutableGos = new List<GameObject>();
    public GameObject _UIObject;
    public GameObject _UIObjectText;
    private bool _ForceWait;
    public override void Awake()
    {
        mInstance = this;
        base.Awake();
        gameObject.SetActive(false);
    }
    
    public void StartWait(float timeout, Action<object> cb = null,object param = null,bool forceWait = false)
    {
        _UIObject.SetActive(true);
        _UIObjectText.SetActive(false);
        StartWaiting(timeout,cb,param,forceWait);
    }
    public void StartWaitWithoutImage(float timeout, Action<object> cb = null, object param = null, bool forceWait = false)
    {
        _UIObject.SetActive(false);
        _UIObjectText.SetActive(false);
        StartWaiting(timeout, cb, param, forceWait);
    }
    public void StartWaitAddText(float timeout,string title, Action<object> cb = null, object param = null, bool forceWait = false)
    {
        if (!String.IsNullOrEmpty(title))
        {
            _UIObjectText.GetComponentInChildren<LocalizedText>().SetLocalizationName(title);
        }
        _UIObjectText.SetActive(true);
        _UIObject.SetActive(false);
        StartWaiting(timeout, cb, param, forceWait);
    }
    void StartWaiting(float timeout, Action<object> cb, object param, bool forceWait)
    {
        gameObject.SetActive(true);
        _CBTimeout = cb;
        _Param = param;
        _ForceWait = forceWait;
        _TimeCounter = StartCoroutine(TimeCounter(timeout));
    }
    void CloseWaiting() {
        gameObject.SetActive(false);
        _ForceWait = false;
        if (_TimeCounter != null)
        {
            StopCoroutine(_TimeCounter);
        }
    }
    IEnumerator TimeCounter(float timeout)
    {
        yield return new WaitForSeconds(timeout);
        if (_CBTimeout != null)
        {
            _CBTimeout(_Param);
        }
        CloseWaiting();
    }
    public void StopWait()
    {
        CloseWaiting();
    }
    public bool IsWaitingView() {
        if (_UIObject.activeInHierarchy || _UIObjectText.activeInHierarchy)
        {
            return true;
        }
        else {
            return false;
        }
    }
    public bool IsForceWait() {
        return _ForceWait;
    }
    #region EventData
    public void AddExecutableObject(GameObject go) {
        if (!_ExecutableGos.Contains(go))
        {
            _ExecutableGos.Add(go);
        }
    }
    public void RemoveExecutableObject(GameObject go) {
        if (!_ExecutableGos.Contains(go))
        {
            _ExecutableGos.Remove(go);
        }
    }
    public void OnPointerClick(PointerEventData eventData)
    {
        PassEvent(eventData, ExecuteEvents.pointerClickHandler);
    }
    //把事件透下去
    public void PassEvent<T>(PointerEventData data, ExecuteEvents.EventFunction<T> function) where T : IEventSystemHandler
    {
        if (_ExecutableGos.Count == 0)
        {
            return;
        }
        List<RaycastResult> results = new List<RaycastResult>();
        EventSystem.current.RaycastAll(data, results);
        for (int i = 0; i < results.Count; i++)
        {
            if (_ExecutableGos.Contains(results[i].gameObject))
            {
                ExecuteEvents.Execute(results[i].gameObject, data, function);
            }
        }
    }
    #endregion
}