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
}
}