using System; using System.Collections.Generic; namespace DMX2 { public struct EventData { public string id; public byte value; } public interface IEventProvider { string MenuName{ get; } string[] GetEventList(); bool Bind (string eventId, IEventTarget target); void Unbind (string eventId, IEventTarget target); Gtk.Menu GetProviderSubMenu( Gtk.ButtonPressEventHandler handler ); } public interface IEventTarget { bool FireEvent(EventData data); } public class EventManager { class eventBinding { private eventBinding(){} public eventBinding(string _id, IEventTarget _target, IEventProvider _provider){ id=_id; target=_target; provider=_provider; } public string id; public IEventTarget target; public IEventProvider provider; } List bindings = new List(); List providers = new List(); public EventManager () { } public void RegisterProvider (IEventProvider prov) { providers.Add (prov); List evList = new List(prov.GetEventList()); foreach (eventBinding b in bindings) { if(b.provider == null && evList.Contains(b.id)) { prov.Bind(b.id,b.target); b.provider = prov; } } } public Gtk.Menu GetMenu ( Gtk.ButtonPressEventHandler handler ) { Gtk.Menu menu = new Gtk.Menu(); return menu; } public void UnregisterProvider (IEventProvider prov) { foreach (eventBinding b in bindings) if(b.provider == prov) b.provider = null; providers.Remove(prov); } public bool Bind (string eventId, IEventTarget target) { foreach (IEventProvider prov in providers) { if (prov.Bind (eventId, target)) { bindings.Add(new eventBinding(eventId,target,prov)); return true; } } bindings.Add(new eventBinding(eventId,target,null)); return false; } eventBinding findBinding (string eventId, IEventTarget target) { foreach (eventBinding b in bindings) { if (b.id == eventId && b.target == target) { return b; } } return null; } public void Unbind (string eventId, IEventTarget target) { eventBinding b = findBinding(eventId,target); if(b==null)return; b.provider.Unbind(eventId,target); bindings.Remove (b); } } }