EnterDescriptionAttribute.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. using System;
  2. namespace Wayne.Lib.StateEngine
  3. {
  4. /// <summary>
  5. /// Describe the enter-transition for a state class.
  6. /// </summary>
  7. [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
  8. [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1036:OverrideMethodsOnComparableTypes")]
  9. public class EnterDescriptionAttribute : Attribute, IComparable
  10. {
  11. #region Fields
  12. private readonly string conditionText;
  13. private readonly object transitionType;
  14. private readonly bool unconditionalOverriding;
  15. #endregion
  16. #region Construction
  17. /// <summary>
  18. /// Drescribe a transition that is done unconditionally when entering a state.
  19. /// </summary>
  20. /// <param name="transitionType">Transition that is performed.</param>
  21. public EnterDescriptionAttribute(object transitionType):this("",transitionType)
  22. {
  23. this.transitionType = transitionType;
  24. }
  25. /// <summary>
  26. /// Drescribe a transitin that can be done when entering a state, and what condition that triggers the transition.
  27. /// </summary>
  28. /// <param name="conditionText">A descriptive text for the condition.</param>
  29. /// <param name="transitionType">Transition that is performed.</param>
  30. public EnterDescriptionAttribute(string conditionText, object transitionType)
  31. {
  32. this.conditionText = conditionText;
  33. this.transitionType = transitionType;
  34. }
  35. /// <summary>
  36. /// Drescribe a transitin that can be done when entering a state.
  37. /// </summary>
  38. /// <param name="conditionText">A descriptive text for the condition.</param>
  39. /// <param name="transitionType">Transition that is performed.</param>
  40. /// <param name="unconditionalOverriding">Tells whether this transition unconditionally overrides all inherited ones.</param>
  41. public EnterDescriptionAttribute(string conditionText, object transitionType,
  42. bool unconditionalOverriding)
  43. {
  44. this.conditionText = conditionText;
  45. this.transitionType = transitionType;
  46. this.unconditionalOverriding = unconditionalOverriding;
  47. }
  48. #endregion
  49. #region Properties
  50. /// <summary>
  51. /// A descriptive text for the condition.
  52. /// </summary>
  53. public string ConditionText
  54. {
  55. get { return conditionText; }
  56. }
  57. /// <summary>
  58. /// Transition type that is performed.
  59. /// </summary>
  60. public object TransitionType
  61. {
  62. get { return transitionType; }
  63. }
  64. /// <summary>
  65. /// Tells whether this transition unconditionally overrides all inherited ones.
  66. /// </summary>
  67. public bool UnconditionalOverriding
  68. {
  69. get { return unconditionalOverriding; }
  70. }
  71. #endregion
  72. #region IComparable Members
  73. /// <summary>
  74. /// Compares this attribute with another one.
  75. /// </summary>
  76. /// <param name="obj"></param>
  77. /// <returns></returns>
  78. public virtual int CompareTo(object obj)
  79. {
  80. int result = 0;
  81. EventDescriptionAttribute compareEventDescriptionAttribute = obj as EventDescriptionAttribute;
  82. if ((compareEventDescriptionAttribute != null) && (!(this is EventDescriptionAttribute)))
  83. {
  84. // An EnterDescriptionAttribute should come before an EventDescriptionAttribute.
  85. result = -1;
  86. }
  87. else
  88. {
  89. EnterDescriptionAttribute compareEnterDescriptionAttribute = obj as EnterDescriptionAttribute;
  90. if (compareEnterDescriptionAttribute != null)
  91. {
  92. if ((TransitionType != null) && (compareEnterDescriptionAttribute.TransitionType != null))
  93. {
  94. result = TransitionType.ToString().CompareTo(compareEnterDescriptionAttribute.TransitionType.ToString());
  95. if (result == 0)
  96. result = ConditionText.CompareTo(compareEnterDescriptionAttribute.ConditionText);
  97. }
  98. else if (TransitionType != null)
  99. result = 1;
  100. else if (compareEnterDescriptionAttribute.TransitionType != null)
  101. result = -1;
  102. }
  103. }
  104. return result;
  105. }
  106. /// <summary>
  107. /// Equals.
  108. /// </summary>
  109. /// <param name="obj"></param>
  110. /// <returns></returns>
  111. public override bool Equals(object obj)
  112. {
  113. EnterDescriptionAttribute compareEnterDescriptionAttribute = obj as EnterDescriptionAttribute;
  114. if (compareEnterDescriptionAttribute != null)
  115. {
  116. if (transitionType == null)
  117. return (compareEnterDescriptionAttribute.transitionType == null);
  118. return transitionType.Equals(compareEnterDescriptionAttribute.transitionType);
  119. }
  120. return base.Equals(obj);
  121. }
  122. /// <summary>
  123. /// GetHashCode.
  124. /// <note>The compiler complained that this method also should be overriden when the Equals was.</note>
  125. /// </summary>
  126. /// <returns></returns>
  127. public override int GetHashCode()
  128. {
  129. return base.GetHashCode();
  130. }
  131. #endregion
  132. }
  133. }