// Path: src/main/java/org/gwtproject/event/shared/Event.java
// public static class Type<H> {
//   private static int nextHashCode;
//   private final int index;
// 
//   /** Constructor. */
//   public Type() {
//     index = ++nextHashCode;
//   }
// 
//   @Override
//   public final int hashCode() {
//     return index;
//   }
// 
//   @Override
//   public String toString() {
//     return "Event type";
//   }
// }


import org.gwtproject.event.shared.Event.Type;
/*
 * Copyright 2011 The GWT Project Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package org.gwtproject.event.shared;


/**
 * Dispatches {@link Event}s to interested parties. Eases decoupling by allowing objects to interact
 * without having direct dependencies upon one another, and without requiring event sources to deal
 * with maintaining handler lists. There will typically be one EventBus per application,
 * broadcasting events that may be of general interest.
 *
 * @see SimpleEventBus
 * @see ResettableEventBus
 * @see org.gwtproject.event.shared.testing.CountingEventBus
 */
public abstract class EventBus implements HasHandlers {

  /**
   * Invokes {@code event.dispatch} with {@code handler}.
   *
   * <p>Protected to allow EventBus implementations in different packages to dispatch events even
   * though the {@code event.dispatch} method is protected.
   */
  protected static <H> void dispatchEvent(Event<H> event, H handler) {
    event.dispatch(handler);
  }

  /**
   * Sets {@code source} as the source of {@code event}.
   *
   * <p>Protected to allow EventBus implementations in different packages to set an event source
   * even though the {@code event.setSource} method is protected.
   */
  protected static void setSourceOfEvent(Event<?> event, Object source) {
    event.setSource(source);
  }

  /**
   * Adds an unfiltered handler to receive events of this type from all sources.
   *
   * <p>It is rare to call this method directly. More typically an {@link Event} subclass will
   * provide a static <code>register</code> method, or a widget will accept handlers directly.
   *
   * @param <H> The type of handler
   * @param type the event type associated with this handler
   * @param handler the handler
   * @return the handler registration, can be stored in order to remove the handler later
   */
// Path: src/main/java/org/gwtproject/event/shared/Event.java
// public static class Type<H> {
//   private static int nextHashCode;
//   private final int index;
// 
//   /** Constructor. */
//   public Type() {
//     index = ++nextHashCode;
//   }
// 
//   @Override
//   public final int hashCode() {
//     return index;
//   }
// 
//   @Override
//   public String toString() {
//     return "Event type";
//   }
// }


// Path: src/main/java/org/gwtproject/event/shared/EventBus.java
import org.gwtproject.event.shared.Event.Type;

/*
 * Copyright 2011 The GWT Project Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package org.gwtproject.event.shared;


/**
 * Dispatches {@link Event}s to interested parties. Eases decoupling by allowing objects to interact
 * without having direct dependencies upon one another, and without requiring event sources to deal
 * with maintaining handler lists. There will typically be one EventBus per application,
 * broadcasting events that may be of general interest.
 *
 * @see SimpleEventBus
 * @see ResettableEventBus
 * @see org.gwtproject.event.shared.testing.CountingEventBus
 */
public abstract class EventBus implements HasHandlers {

  /**
   * Invokes {@code event.dispatch} with {@code handler}.
   *
   * <p>Protected to allow EventBus implementations in different packages to dispatch events even
   * though the {@code event.dispatch} method is protected.
   */
  protected static <H> void dispatchEvent(Event<H> event, H handler) {
    event.dispatch(handler);
  }

  /**
   * Sets {@code source} as the source of {@code event}.
   *
   * <p>Protected to allow EventBus implementations in different packages to set an event source
   * even though the {@code event.setSource} method is protected.
   */
  protected static void setSourceOfEvent(Event<?> event, Object source) {
    event.setSource(source);
  }

  /**
   * Adds an unfiltered handler to receive events of this type from all sources.
   *
   * <p>It is rare to call this method directly. More typically an {@link Event} subclass will
   * provide a static <code>register</code> method, or a widget will accept handlers directly.
   *
   * @param <H> The type of handler
   * @param type the event type associated with this handler
   * @param handler the handler
   * @return the handler registration, can be stored in order to remove the handler later
   */
  public abstract <H> HandlerRegistration addHandler(Type<H> type, H handler);