using System; namespace Wayne.Lib.StateEngine { /// /// Describe the enter-transition for a state class. /// [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)] [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1036:OverrideMethodsOnComparableTypes")] public class EnterDescriptionAttribute : Attribute, IComparable { #region Fields private readonly string conditionText; private readonly object transitionType; private readonly bool unconditionalOverriding; #endregion #region Construction /// /// Drescribe a transition that is done unconditionally when entering a state. /// /// Transition that is performed. public EnterDescriptionAttribute(object transitionType):this("",transitionType) { this.transitionType = transitionType; } /// /// Drescribe a transitin that can be done when entering a state, and what condition that triggers the transition. /// /// A descriptive text for the condition. /// Transition that is performed. public EnterDescriptionAttribute(string conditionText, object transitionType) { this.conditionText = conditionText; this.transitionType = transitionType; } /// /// Drescribe a transitin that can be done when entering a state. /// /// A descriptive text for the condition. /// Transition that is performed. /// Tells whether this transition unconditionally overrides all inherited ones. public EnterDescriptionAttribute(string conditionText, object transitionType, bool unconditionalOverriding) { this.conditionText = conditionText; this.transitionType = transitionType; this.unconditionalOverriding = unconditionalOverriding; } #endregion #region Properties /// /// A descriptive text for the condition. /// public string ConditionText { get { return conditionText; } } /// /// Transition type that is performed. /// public object TransitionType { get { return transitionType; } } /// /// Tells whether this transition unconditionally overrides all inherited ones. /// public bool UnconditionalOverriding { get { return unconditionalOverriding; } } #endregion #region IComparable Members /// /// Compares this attribute with another one. /// /// /// public virtual int CompareTo(object obj) { int result = 0; EventDescriptionAttribute compareEventDescriptionAttribute = obj as EventDescriptionAttribute; if ((compareEventDescriptionAttribute != null) && (!(this is EventDescriptionAttribute))) { // An EnterDescriptionAttribute should come before an EventDescriptionAttribute. result = -1; } else { EnterDescriptionAttribute compareEnterDescriptionAttribute = obj as EnterDescriptionAttribute; if (compareEnterDescriptionAttribute != null) { if ((TransitionType != null) && (compareEnterDescriptionAttribute.TransitionType != null)) { result = TransitionType.ToString().CompareTo(compareEnterDescriptionAttribute.TransitionType.ToString()); if (result == 0) result = ConditionText.CompareTo(compareEnterDescriptionAttribute.ConditionText); } else if (TransitionType != null) result = 1; else if (compareEnterDescriptionAttribute.TransitionType != null) result = -1; } } return result; } /// /// Equals. /// /// /// public override bool Equals(object obj) { EnterDescriptionAttribute compareEnterDescriptionAttribute = obj as EnterDescriptionAttribute; if (compareEnterDescriptionAttribute != null) { if (transitionType == null) return (compareEnterDescriptionAttribute.transitionType == null); return transitionType.Equals(compareEnterDescriptionAttribute.transitionType); } return base.Equals(obj); } /// /// GetHashCode. /// The compiler complained that this method also should be overriden when the Equals was. /// /// public override int GetHashCode() { return base.GetHashCode(); } #endregion } }