/*
 * Copyright 2010 Google Inc.
 * 
 * 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 com.google.gwt.view.client;

import com.google.gwt.event.shared.EventHandler;
import com.google.gwt.event.shared.GwtEvent;

/**
 * Represents a selection change event.
 */
public class SelectionChangeEvent extends
    GwtEvent<SelectionChangeEvent.Handler> {

  /**
   * Handler interface for {@link SelectionChangeEvent} events.
   */
  public static interface Handler extends EventHandler {

    /**
     * Called when a {@link SelectionChangeEvent} is fired.
     *
     * @param event the {@link SelectionChangeEvent} that was fired
     */
    void onSelectionChange(SelectionChangeEvent event);
  }

  /**
   * Handler type.
   */
  private static Type<SelectionChangeEvent.Handler> TYPE;

  /**
   * Fires a selection change event on all registered handlers in the handler
   * manager. If no such handlers exist, this method will do nothing.
   *
   * @param source the source of the handlers
   */
  public static void fire(SelectionModel<?> source) {
    if (TYPE != null) {
      SelectionChangeEvent event = new SelectionChangeEvent();
      source.fireEvent(event);
    }
  }

  /**
   * Gets the type associated with this event.
   *
   * @return returns the handler type
   */
  public static Type<SelectionChangeEvent.Handler> getType() {
    if (TYPE == null) {
      TYPE = new Type<SelectionChangeEvent.Handler>();
    }
    return TYPE;
  }

  /**
   * Creates a selection change event.
   */
  SelectionChangeEvent() {
  }

  @Override
  public final Type<SelectionChangeEvent.Handler> getAssociatedType() {
    return TYPE;
  }

  @Override
  protected void dispatch(SelectionChangeEvent.Handler handler) {
    handler.onSelectionChange(this);
  }
}
