001 package net.minecraftforge.event;
002
003 import static java.lang.annotation.ElementType.TYPE;
004 import static java.lang.annotation.RetentionPolicy.RUNTIME;
005
006 import java.lang.annotation.Retention;
007 import java.lang.annotation.Target;
008
009
010 /**
011 * Base Event class that all other events are derived from
012 */
013 public class Event
014 {
015 @Retention(value = RUNTIME)
016 @Target(value = TYPE)
017 public @interface HasResult{}
018
019 public enum Result
020 {
021 DENY,
022 DEFAULT,
023 ALLOW
024 }
025
026 private boolean isCanceled = false;
027 private final boolean isCancelable;
028 private Result result = Result.DEFAULT;
029 private final boolean hasResult;
030 private static ListenerList listeners = new ListenerList();
031
032 public Event()
033 {
034 setup();
035 isCancelable = hasAnnotation(Cancelable.class);
036 hasResult = hasAnnotation(HasResult.class);
037 }
038
039 private boolean hasAnnotation(Class annotation)
040 {
041 Class cls = this.getClass();
042 while (cls != Event.class)
043 {
044 if (cls.isAnnotationPresent(Cancelable.class))
045 {
046 return true;
047 }
048 cls = cls.getSuperclass();
049 }
050 return false;
051 }
052
053 /**
054 * Determine if this function is cancelable at all.
055 * @return If access to setCanceled should be allowed
056 */
057 public boolean isCancelable()
058 {
059 return isCancelable;
060 }
061
062 /**
063 * Determine if this event is canceled and should stop executing.
064 * @return The current canceled state
065 */
066 public boolean isCanceled()
067 {
068 return isCanceled;
069 }
070
071 /**
072 * Sets the state of this event, not all events are cancelable, and any attempt to
073 * cancel a event that can't be will result in a IllegalArgumentException.
074 *
075 * The functionality of setting the canceled state is defined on a per-event bases.
076 *
077 * @param cancel The new canceled value
078 */
079 public void setCanceled(boolean cancel)
080 {
081 if (!isCancelable())
082 {
083 throw new IllegalArgumentException("Attempted to cancel a uncancelable event");
084 }
085 isCanceled = cancel;
086 }
087
088 /**
089 * Determines if this event expects a significant result value.
090 */
091 public boolean hasResult()
092 {
093 return hasResult;
094 }
095
096 /**
097 * Returns the value set as the result of this event
098 */
099 public Result getResult()
100 {
101 return result;
102 }
103
104 /**
105 * Sets the result value for this event, not all events can have a result set, and any attempt to
106 * set a result for a event that isn't expecting it will result in a IllegalArgumentException.
107 *
108 * The functionality of setting the result is defined on a per-event bases.
109 *
110 * @param value The new result
111 */
112 public void setResult(Result value)
113 {
114 result = value;
115 }
116 /**
117 * Called by the base constructor, this is used by ASM generated
118 * event classes to setup various functionality such as the listener's list.
119 */
120 protected void setup()
121 {
122 }
123
124 /**
125 * Returns a ListenerList object that contains all listeners
126 * that are registered to this event.
127 *
128 * @return Listener List
129 */
130 public ListenerList getListenerList()
131 {
132 return listeners;
133 }
134 }