#if FAIRYGUI_TOLUA using System; using LuaInterface; #endif namespace FairyGUI { /// /// /// class EventBridge { public EventDispatcher owner; EventCallback0 _callback0; EventCallback1 _callback1; EventCallback1 _captureCallback; internal bool _dispatching; public EventBridge(EventDispatcher owner) { this.owner = owner; } public void AddCapture(EventCallback1 callback) { _captureCallback -= callback; _captureCallback += callback; } public void RemoveCapture(EventCallback1 callback) { _captureCallback -= callback; } public void Add(EventCallback1 callback) { _callback1 -= callback; _callback1 += callback; } public void Remove(EventCallback1 callback) { _callback1 -= callback; } public void Add(EventCallback0 callback) { _callback0 -= callback; _callback0 += callback; } public void Remove(EventCallback0 callback) { _callback0 -= callback; } #if FAIRYGUI_TOLUA public void Add(LuaFunction func, LuaTable self) { EventCallback1 callback; if(self != null) callback = (EventCallback1)DelegateTraits.Create(func, self); else callback = (EventCallback1)DelegateTraits.Create(func); _callback1 -= callback; _callback1 += callback; } public void Add(LuaFunction func, GComponent self) { if (self._peerTable == null) throw new Exception("self is not connected to lua."); Add(func, self._peerTable); } public void Remove(LuaFunction func, LuaTable self) { LuaState state = func.GetLuaState(); LuaDelegate target; if (self != null) target = state.GetLuaDelegate(func, self); else target = state.GetLuaDelegate(func); Delegate[] ds = _callback1.GetInvocationList(); for (int i = 0; i < ds.Length; i++) { LuaDelegate ld = ds[i].Target as LuaDelegate; if (ld != null && ld.Equals(target)) { _callback1 = (EventCallback1)Delegate.Remove(_callback1, ds[i]); //DelayDispose will cause problem //state.DelayDispose(ld.func); //if (ld.self != null) // state.DelayDispose(ld.self); break; } } } public void Remove(LuaFunction func, GComponent self) { if (self._peerTable == null) throw new Exception("self is not connected to lua."); Remove(func, self._peerTable); } #endif public bool isEmpty { get { return _callback1 == null && _callback0 == null && _captureCallback == null; } } public void Clear() { #if FAIRYGUI_TOLUA //if (_callback1 != null) //{ // Delegate[] ds = _callback1.GetInvocationList(); // for (int i = 0; i < ds.Length; i++) // { // LuaDelegate ld = ds[i].Target as LuaDelegate; // if (ld != null) // { // LuaState state = ld.func.GetLuaState(); // state.DelayDispose(ld.func); // if (ld.self != null) // state.DelayDispose(ld.self); // } // } //} #endif _callback1 = null; _callback0 = null; _captureCallback = null; } public void CallInternal(EventContext context) { _dispatching = true; context.sender = owner; try { if (_callback1 != null) _callback1(context); if (_callback0 != null) _callback0(); } finally { _dispatching = false; } } public void CallCaptureInternal(EventContext context) { if (_captureCallback == null) return; _dispatching = true; context.sender = owner; try { _captureCallback(context); } finally { _dispatching = false; } } } }