Advertisement
BeniS

Multi Events Handler (GWT)

Feb 16th, 2013
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 11.66 KB | None | 0 0
  1. Index: src/main/java/net/customware/gwt/presenter/client/DefaultEventBus.java
  2. ===================================================================
  3. --- src/main/java/net/customware/gwt/presenter/client/DefaultEventBus.java (revision 70)
  4. +++ src/main/java/net/customware/gwt/presenter/client/DefaultEventBus.java (working copy)
  5. @@ -1,16 +1,236 @@
  6. package net.customware.gwt.presenter.client;
  7.  
  8.  
  9. -import com.google.gwt.event.shared.HandlerManager;
  10. +import java.util.ArrayList;
  11. +import java.util.HashMap;
  12. +import java.util.Map;
  13. +import com.google.gwt.event.shared.EventHandler;
  14. +import com.google.gwt.event.shared.HandlerRegistration;
  15. import com.google.inject.Inject;
  16. import com.google.inject.Singleton;
  17. +import net.customware.gwt.presenter.client.BaseEvent.Type;
  18.  
  19. @Singleton
  20. -public class DefaultEventBus extends HandlerManager implements EventBus {
  21. +public class DefaultEventBus implements EventBus {
  22.  
  23. @Inject
  24. public DefaultEventBus() {
  25. - super( null );
  26. + this(null,false);
  27. }
  28.  
  29. + /**
  30. + * Creates a handler manager with the given source. Handlers will be fired in
  31. + * the order that they are added.
  32. + *
  33. + * @param source the event source
  34. + */
  35. + public DefaultEventBus(Object source) {
  36. + this(source, false);
  37. + }
  38. +
  39. + /**
  40. + * Creates an event bus with the given source, specifying the order in
  41. + * which handlers are fired.
  42. + *
  43. + * @param source the event source
  44. + * @param fireInReverseOrder true to fire handlers in reverse order
  45. + */
  46. + public DefaultEventBus(Object source, boolean fireInReverseOrder) {
  47. + registry = new HandlerRegistry();
  48. + this.source = source;
  49. + this.isReverseOrder = fireInReverseOrder;
  50. + }
  51. +
  52. + /**
  53. + * Inner class used to actually contain the handlers.
  54. + */
  55. + private static class HandlerRegistry {
  56. + private final HashMap<BaseEvent.Type<?>, ArrayList<?>> map = new HashMap<BaseEvent.Type<?>, ArrayList<?>>();
  57. +
  58. + private <H extends EventHandler> void addHandler(Type<H> type, H handler) {
  59. + ArrayList<H> l = get(type);
  60. + if (l == null) {
  61. + l = new ArrayList<H>();
  62. + map.put(type, l);
  63. + }
  64. + l.add(handler);
  65. + }
  66. +
  67. + private <H extends EventHandler> void fireEvent(BaseEvent<H> event,
  68. + boolean isReverseOrder) {
  69. + Type<H> type = event.getAssociatedType();
  70. + int count = getHandlerCount(type);
  71. + if (isReverseOrder) {
  72. + for (int i = count - 1; i >= 0; i--) {
  73. + H handler = this.<H> getHandler(type, i);
  74. + event.dispatch(handler);
  75. + }
  76. + } else {
  77. + for (int i = 0; i < count; i++) {
  78. + H handler = this.<H> getHandler(type, i);
  79. + event.dispatch(handler);
  80. + }
  81. + }
  82. + }
  83. +
  84. + @SuppressWarnings("unchecked")
  85. + private <H> ArrayList<H> get(BaseEvent.Type<H> type) {
  86. + // This cast is safe because we control the puts.
  87. + return (ArrayList<H>) map.get(type);
  88. + }
  89. +
  90. + private <H extends EventHandler> H getHandler(BaseEvent.Type<H> eventKey,
  91. + int index) {
  92. + ArrayList<H> l = get(eventKey);
  93. + return l.get(index);
  94. + }
  95. +
  96. + private int getHandlerCount(BaseEvent.Type<?> eventKey) {
  97. + ArrayList<?> l = map.get(eventKey);
  98. + return l == null ? 0 : l.size();
  99. + }
  100. +
  101. + private boolean isEventHandled(BaseEvent.Type<?> eventKey) {
  102. + return map.containsKey(eventKey);
  103. + }
  104. +
  105. + private <H> void removeHandler(BaseEvent.Type<H> eventKey, H handler) {
  106. + ArrayList<H> l = get(eventKey);
  107. + boolean result = l.remove(handler);
  108. + if (l.size() == 0) {
  109. + map.remove(eventKey);
  110. + }
  111. + assert result : "Tried to remove unknown handler: " + handler + " from "
  112. + + eventKey;
  113. + }
  114. + }
  115. +
  116. + private boolean isReverseOrder;
  117. +
  118. + // map storing the actual handlers
  119. + private HandlerRegistry registry;
  120. +
  121. + // source of the event.
  122. + private final Object source;
  123. +
  124. +
  125. + /**
  126. + * Adds a handle.
  127. + *
  128. + * @param <H> The type of handler
  129. + * @param type the event type associated with this handler
  130. + * @param handler the handler
  131. + * @return the handler registration, can be stored in order to remove the
  132. + * handler later
  133. + */
  134. + public <H extends EventHandler> HandlerRegistration addHandler(
  135. + BaseEvent.Type<H> type, final H handler) {
  136. + assert type != null : "Cannot add a handler with a null type";
  137. + assert handler != null : "Cannot add a null handler";
  138. + doAdd(type, handler);
  139. +
  140. + return new BaseHandlerRegistration(this, type, handler);
  141. + }
  142. +
  143. + /**
  144. + * Fires the given event to the handlers listening to the event's type.
  145. + *
  146. + * Note, any subclass should be very careful about overriding this method, as
  147. + * adds/removes of handlers will not be safe except within this
  148. + * implementation.
  149. + *
  150. + * @param event the event
  151. + */
  152. + public void fireEvent(BaseEvent<?> event) {
  153. + // If it not live we should revive it.
  154. + if (!event.isLive()) {
  155. + event.revive();
  156. + }
  157. + Object oldSource = event.getSource();
  158. + event.setSource(source);
  159. + registry.fireEvent(event, isReverseOrder);
  160. + if (oldSource == null) {
  161. + // This was my event, so I should kill it now that I'm done.
  162. + event.kill();
  163. + } else {
  164. + // Restoring the source for the next handler to use.
  165. + event.setSource(oldSource);
  166. + }
  167. + }
  168. +
  169. + /**
  170. + * Gets the handler at the given index.
  171. + *
  172. + * @param <H> the event handler type
  173. + * @param index the index
  174. + * @param type the handler's event type
  175. + * @return the given handler
  176. + */
  177. + public <H extends EventHandler> H getHandler(BaseEvent.Type<H> type, int index) {
  178. + assert index < getHandlerCount(type) : "handlers for " + type.getClass()
  179. + + " have size: " + getHandlerCount(type)
  180. + + " so do not have a handler at index: " + index;
  181. + return registry.getHandler(type, index);
  182. + }
  183. +
  184. + /**
  185. + * Gets the number of handlers listening to the event type.
  186. + *
  187. + * @param type the event type
  188. + * @return the number of registered handlers
  189. + */
  190. + public int getHandlerCount(Type<?> type) {
  191. + return registry.getHandlerCount(type);
  192. + }
  193. +
  194. + /**
  195. + * Does this handler manager handle the given event type?
  196. + *
  197. + * @param e the event type
  198. + * @return whether the given event type is handled
  199. + */
  200. + public boolean isEventHandled(Type<?> e) {
  201. + return registry.isEventHandled(e);
  202. + }
  203. +
  204. + /**
  205. + * Removes the given handler from the specified event type. Normally,
  206. + * applications should call {@link HandlerRegistration#removeHandler()}
  207. + * instead.
  208. + *
  209. + * @param <H> handler type
  210. + *
  211. + * @param type the event type
  212. + * @param handler the handler
  213. + * @deprecated This method is likely to be removed along with "listener"
  214. + * interfaces in a future release. If you have a reason it should
  215. + * be retained beyond that time, please add your comments to GWT
  216. + * <a href="http://code.google.com/p/google-web-toolkit/issues/detail?id=3102">issue 3102</a>
  217. + */
  218. + @Deprecated
  219. + public <H extends EventHandler> void removeHandler(BaseEvent.Type<H> type,
  220. + final H handler) {
  221. + doRemove(type, handler);
  222. + }
  223. +
  224. + /**
  225. + * Not part of the public API, available only to allow visualization tools to
  226. + * be developed in gwt-incubator.
  227. + *
  228. + * @return a map of all handlers in this handler manager
  229. + */
  230. + Map<BaseEvent.Type<?>, ArrayList<?>> createHandlerInfo() {
  231. + return registry.map;
  232. + }
  233. +
  234. + private <H extends EventHandler> void doAdd(BaseEvent.Type<H> type,
  235. + final H handler) {
  236. + registry.addHandler(type, handler);
  237. + }
  238. +
  239. + private <H extends EventHandler> void doRemove(BaseEvent.Type<H> type,
  240. + final H handler) {
  241. + registry.removeHandler(type, handler);
  242. + }
  243. +
  244. }
  245. Index: src/main/java/net/customware/gwt/presenter/client/EventBus.java
  246. ===================================================================
  247. --- src/main/java/net/customware/gwt/presenter/client/EventBus.java (revision 70)
  248. +++ src/main/java/net/customware/gwt/presenter/client/EventBus.java (working copy)
  249. @@ -1,14 +1,13 @@
  250. package net.customware.gwt.presenter.client;
  251.  
  252. import com.google.gwt.event.shared.EventHandler;
  253. -import com.google.gwt.event.shared.GwtEvent;
  254. import com.google.gwt.event.shared.HandlerRegistration;
  255. -import com.google.gwt.event.shared.GwtEvent.Type;
  256. +import net.customware.gwt.presenter.client.BaseEvent.Type;
  257.  
  258. public interface EventBus {
  259. <H extends EventHandler> HandlerRegistration addHandler( Type<H> type, H handler );
  260.  
  261. - void fireEvent( GwtEvent<?> event );
  262. + void fireEvent( BaseEvent<?> event );
  263.  
  264. <H extends EventHandler> H getHandler( Type<H> type, int index );
  265.  
  266. Index: src/main/java/net/customware/gwt/presenter/client/place/PlaceChangedEvent.java
  267. ===================================================================
  268. --- src/main/java/net/customware/gwt/presenter/client/place/PlaceChangedEvent.java (revision 70)
  269. +++ src/main/java/net/customware/gwt/presenter/client/place/PlaceChangedEvent.java (working copy)
  270. @@ -1,17 +1,17 @@
  271. package net.customware.gwt.presenter.client.place;
  272.  
  273. -import com.google.gwt.event.shared.GwtEvent;
  274. +import net.customware.gwt.presenter.client.BaseEvent;
  275.  
  276. /**
  277. * This event is triggered when the request has changed manually (ie, not due to a
  278. * {@link PlaceRequestEvent}). This allows the {@link PlaceManager} to keep
  279. * track of the current location. Other classes may, but will typically not need
  280. * to, implement {@link PlaceChangedHandler} to be informed of manual changes.
  281. - *
  282. + *
  283. * @author David Peterson
  284. - *
  285. + *
  286. */
  287. -public class PlaceChangedEvent extends GwtEvent<PlaceChangedHandler> {
  288. +public class PlaceChangedEvent extends BaseEvent<PlaceChangedHandler> {
  289.  
  290. private static Type<PlaceChangedHandler> TYPE;
  291.  
  292. @@ -33,7 +33,7 @@
  293. }
  294.  
  295. @Override
  296. - public com.google.gwt.event.shared.GwtEvent.Type<PlaceChangedHandler> getAssociatedType() {
  297. + public BaseEvent.Type<PlaceChangedHandler> getAssociatedType() {
  298. return getType();
  299. }
  300.  
  301. Index: src/main/java/net/customware/gwt/presenter/client/place/PlaceRequestEvent.java
  302. ===================================================================
  303. --- src/main/java/net/customware/gwt/presenter/client/place/PlaceRequestEvent.java (revision 70)
  304. +++ src/main/java/net/customware/gwt/presenter/client/place/PlaceRequestEvent.java (working copy)
  305. @@ -1,8 +1,8 @@
  306. package net.customware.gwt.presenter.client.place;
  307.  
  308. -import com.google.gwt.event.shared.GwtEvent;
  309. +import net.customware.gwt.presenter.client.BaseEvent;
  310.  
  311. -public class PlaceRequestEvent extends GwtEvent<PlaceRequestHandler> {
  312. +public class PlaceRequestEvent extends BaseEvent<PlaceRequestHandler> {
  313.  
  314. private static Type<PlaceRequestHandler> TYPE;
  315.  
  316. Index: src/main/java/net/customware/gwt/presenter/client/PresenterRevealedEvent.java
  317. ===================================================================
  318. --- src/main/java/net/customware/gwt/presenter/client/PresenterRevealedEvent.java (revision 70)
  319. +++ src/main/java/net/customware/gwt/presenter/client/PresenterRevealedEvent.java (working copy)
  320. @@ -1,8 +1,6 @@
  321. package net.customware.gwt.presenter.client;
  322.  
  323. -import net.customware.gwt.presenter.client.Presenter;
  324.  
  325. -import com.google.gwt.event.shared.GwtEvent;
  326.  
  327. /**
  328. * Presenters can send this event to the {@link EventBus} to notify other
  329. @@ -10,17 +8,17 @@
  330. * is particularly useful for situations where a presenter contains other
  331. * presenters and wants needs to reveal itself when a child presenter is
  332. * revealed.
  333. - *
  334. + *
  335. * @author David Peterson
  336. - *
  337. + *
  338. */
  339. -public class PresenterRevealedEvent extends GwtEvent<PresenterRevealedHandler> {
  340. +public class PresenterRevealedEvent extends BaseEvent<PresenterRevealedHandler> {
  341.  
  342. - private static final GwtEvent.Type<PresenterRevealedHandler> TYPE = new GwtEvent.Type<PresenterRevealedHandler>();
  343. + private static final BaseEvent.Type<PresenterRevealedHandler> TYPE = new BaseEvent.Type<PresenterRevealedHandler>();
  344.  
  345. private Presenter presenter;
  346.  
  347. - public static GwtEvent.Type<PresenterRevealedHandler> getType() {
  348. + public static BaseEvent.Type<PresenterRevealedHandler> getType() {
  349. return TYPE;
  350. }
  351.  
  352. @@ -38,7 +36,7 @@
  353. }
  354.  
  355. @Override
  356. - public GwtEvent.Type<PresenterRevealedHandler> getAssociatedType() {
  357. + public BaseEvent.Type<PresenterRevealedHandler> getAssociatedType() {
  358. return getType();
  359. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement