// ----------------------------------------------------------------------- // // Copyright 2014 MIT Licence. See licence.md for more information. // // ----------------------------------------------------------------------- namespace Perspex.Interactivity { using System; using System.Reflection; public enum RoutingStrategy { Tunnel, Bubble, Direct, } public class RoutedEvent { public RoutedEvent( string name, RoutingStrategy routingStrategy, Type eventArgsType, Type ownerType) { Contract.Requires(name != null); Contract.Requires(eventArgsType != null); Contract.Requires(ownerType != null); Contract.Requires(typeof(RoutedEventArgs).GetTypeInfo().IsAssignableFrom(eventArgsType.GetTypeInfo())); Contract.Requires(typeof(Interactive).GetTypeInfo().IsAssignableFrom(ownerType.GetTypeInfo())); this.EventArgsType = eventArgsType; this.Name = name; this.OwnerType = ownerType; this.RoutingStrategy = routingStrategy; } public Type EventArgsType { get; private set; } public string Name { get; private set; } public Type OwnerType { get; private set; } public RoutingStrategy RoutingStrategy { get; private set; } public static RoutedEvent Register( string name, RoutingStrategy routingStrategy) where TOwner : Interactive where TEventArgs : RoutedEventArgs { Contract.Requires(name != null); return new RoutedEvent(name, routingStrategy, typeof(TOwner)); } public static RoutedEvent Register( string name, RoutingStrategy routingStrategy, Type ownerType) where TEventArgs : RoutedEventArgs { Contract.Requires(name != null); return new RoutedEvent(name, routingStrategy, ownerType); } } public class RoutedEvent : RoutedEvent where TEventArgs : RoutedEventArgs { public RoutedEvent(string name, RoutingStrategy routingStrategy, Type ownerType) : base(name, routingStrategy, typeof(TEventArgs), ownerType) { Contract.Requires(name != null); Contract.Requires(ownerType != null); Contract.Requires(typeof(Interactive).GetTypeInfo().IsAssignableFrom(ownerType.GetTypeInfo())); } } }