
/* AWTEvent.java -- the root event in AWT
   Copyright (C) 1999, 2000, 2002, 2005 Free Software Foundation

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */


package java.awt;

import java.awt.event.ActionEvent;
import java.awt.event.AdjustmentEvent;
import java.awt.event.ComponentEvent;
import java.awt.event.ContainerEvent;
import java.awt.event.FocusEvent;
import java.awt.event.InputMethodEvent;
import java.awt.event.InvocationEvent;
import java.awt.event.ItemEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.PaintEvent;
import java.awt.event.TextEvent;
import java.awt.event.WindowEvent;
import java.util.EventObject;

/**
 * AWTEvent is the root event class for all AWT events in the JDK 1.1 event 
 * model. It supersedes the Event class from JDK 1.0. Subclasses outside of
 * the java.awt package should have IDs greater than RESERVED_ID_MAX.
 *
 * <p>Event masks defined here are used by components in
 * <code>enableEvents</code> to select event types not selected by registered
 * listeners. Event masks are appropriately set when registering on
 * components.
 *
 * @author Warren Levy  (warrenl@cygnus.com)
 * @author Aaron M. Renn (arenn@urbanophile.com)
 * @since 1.1
 * @status updated to 1.4
 */
public abstract class AWTEvent extends EventObject
{
  /**
   * Compatible with JDK 1.1+.
   */
  private static final long serialVersionUID = -1825314779160409405L;

  /**
   * The ID of the event.
   *
   * @see #getID()
   * @see #AWTEvent(Object, int)
   * @serial the identifier number of this event
   */
  protected int id;

  /**
   * Indicates if the event has been consumed. False mean it is passed to
   * the peer, true means it has already been processed. Semantic events
   * generated by low-level events always have the value true.
   *
   * @see #consume()
   * @see #isConsumed()
   * @serial whether the event has been consumed
   */
  protected boolean consumed;

  /**
   * Used for implementing a simple linked list in EventQueue.
   */
  transient AWTEvent queueNext;

  /**
   * Who knows? It's in the serial version.
   *
   * @serial No idea what this is for.
   */
  byte[] bdata;

  /**
   * Indicates if this event is dispatched by the KeyboardFocusManager.
   */
  boolean isFocusManagerEvent = false;

  /** Mask for selecting component events. */
  public static final long COMPONENT_EVENT_MASK = 0x00001;

  /** Mask for selecting container events. */
  public static final long CONTAINER_EVENT_MASK = 0x00002;

  /** Mask for selecting component focus events. */
  public static final long FOCUS_EVENT_MASK = 0x00004;

  /** Mask for selecting keyboard events. */
  public static final long KEY_EVENT_MASK = 0x00008;

  /** Mask for mouse button events. */
  public static final long MOUSE_EVENT_MASK = 0x00010;

  /** Mask for mouse motion events. */
  public static final long MOUSE_MOTION_EVENT_MASK = 0x00020;

  /** Mask for window events. */
  public static final long WINDOW_EVENT_MASK = 0x00040;

  /** Mask for action events. */
  public static final long ACTION_EVENT_MASK = 0x00080;

  /** Mask for adjustment events. */
  public static final long ADJUSTMENT_EVENT_MASK = 0x00100;

  /** Mask for item events. */
  public static final long ITEM_EVENT_MASK = 0x00200;

  /** Mask for text events. */
  public static final long TEXT_EVENT_MASK = 0x00400;

  /**
   * Mask for input method events.
   * @since 1.3
   */
  public static final long INPUT_METHOD_EVENT_MASK = 0x00800;

  /**
   * Mask if input methods are enabled. Package visible only.
   */
  static final long INPUT_ENABLED_EVENT_MASK = 0x01000;

  /**
   * Mask for paint events.
   * @since 1.3
   */
  public static final long PAINT_EVENT_MASK = 0x02000;

  /**
   * Mask for invocation events.
   * @since 1.3
   */
  public static final long INVOCATION_EVENT_MASK = 0x04000;

  /**
   * Mask for hierarchy events.
   * @since 1.3
   */
  public static final long HIERARCHY_EVENT_MASK = 0x08000;

  /**
   * Mask for hierarchy bounds events.
   * @since 1.3
   */
  public static final long HIERARCHY_BOUNDS_EVENT_MASK = 0x10000;

  /**
   * Mask for mouse wheel events.
   * @since 1.4
   */
  public static final long MOUSE_WHEEL_EVENT_MASK = 0x20000;

  /**
   * Mask for window state events.
   * @since 1.4
   */
  public static final long WINDOW_STATE_EVENT_MASK = 0x40000;

  /**
   * Mask for window focus events.
   * @since 1.4
   */
  public static final long WINDOW_FOCUS_EVENT_MASK = 0x80000;

  /**
  * This is the highest number for event ids that are reserved for use by
  * the AWT system itself. Subclasses outside of java.awt should use higher
  * ids.
  */
  public static final int RESERVED_ID_MAX = 1999;


  /**
   * Initializes a new AWTEvent from the old Java 1.0 event object.
   *
   * @param event the old-style event
   * @throws NullPointerException if event is null
   */
  public AWTEvent(Event event)
  {
    this(event.target, event.id);
    consumed = event.consumed;
  }

  /**
   * Create an event on the specified source object and id.
   *
   * @param source the object that caused the event
   * @param id the event id
   * @throws IllegalArgumentException if source is null
   */
  public AWTEvent(Object source, int id)
  {
    super(source);
    this.id = id;
  }

  /**
   * Retarget the event, such as converting a heavyweight component to a
   * lightweight child of the original. This is not for general use, but
   * is for event targeting systems like KeyboardFocusManager.
   *
   * @param source the new source
   */
  public void setSource(Object source)
  {
    this.source = source;
  }

  /**
   * Returns the event type id.
   *
   * @return the id number of this event
   */
  public int getID()
  {
    return id;
  }

  /**
   * Create a string that represents this event in the format
   * <code>classname[eventstring] on sourcecomponentname</code>.
   *
   * @return a string representing this event
   */
  public String toString ()
  {
    String src;
    if (source instanceof Component)
      src = ((Component) source).getName();
    else if (source instanceof MenuComponent)
      src = ((MenuComponent) source).getName();
    else if (source != null)
      src = source.toString();
    else
      src = "null";
    String string = getClass ().getName () + "[" + paramString () + "] on "
                    + src;
    return string;
  }

  /**
   * Returns a string representation of the state of this event. It may be
   * empty, but must not be null; it is implementation defined.
   *
   * @return a string representation of this event
   */
  public String paramString()
  {
    return "";
  }

  /**
   * Consumes this event so that it will not be processed in the default
   * manner.
   */
  protected void consume()
  {
    consumed = true;
  }

  /**
   * Tests whether not not this event has been consumed. A consumed event
   * is not processed in the default manner.
   *
   * @return true if this event has been consumed
   */
  protected boolean isConsumed()
  {
    return consumed;
  }

  /**
   * Converts an event id to the appropriate event mask.
   *
   * @param id the event id
   *
   * @return the event mask for the specified id
   */
  static long eventIdToMask(int id)
  {
    long mask = 0;
    switch (id)
    {
      case ActionEvent.ACTION_PERFORMED:
        mask = ACTION_EVENT_MASK;
        break;
      case AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED:
        mask = ADJUSTMENT_EVENT_MASK;
        break;
      case ComponentEvent.COMPONENT_MOVED:
      case ComponentEvent.COMPONENT_RESIZED:
      case ComponentEvent.COMPONENT_SHOWN:
      case ComponentEvent.COMPONENT_HIDDEN:
        mask = COMPONENT_EVENT_MASK;
        break;
      case ContainerEvent.COMPONENT_ADDED:
      case ContainerEvent.COMPONENT_REMOVED:
        mask = CONTAINER_EVENT_MASK;
        break;
      case FocusEvent.FOCUS_GAINED:
      case FocusEvent.FOCUS_LOST:
        mask = FOCUS_EVENT_MASK;
        break;
      case InputMethodEvent.INPUT_METHOD_TEXT_CHANGED:
      case InputMethodEvent.CARET_POSITION_CHANGED:
        mask = INPUT_METHOD_EVENT_MASK;
        break;
      case InvocationEvent.INVOCATION_DEFAULT:
        mask = INVOCATION_EVENT_MASK;
        break;
      case ItemEvent.ITEM_STATE_CHANGED:
        mask = ITEM_EVENT_MASK;
        break;
      case KeyEvent.KEY_TYPED:
      case KeyEvent.KEY_PRESSED:
      case KeyEvent.KEY_RELEASED:
        mask = KEY_EVENT_MASK;
        break;
      case MouseEvent.MOUSE_CLICKED:
      case MouseEvent.MOUSE_PRESSED:
      case MouseEvent.MOUSE_RELEASED:
        mask = MOUSE_EVENT_MASK;
        break;
      case MouseEvent.MOUSE_MOVED:
      case MouseEvent.MOUSE_ENTERED:
      case MouseEvent.MOUSE_EXITED:
      case MouseEvent.MOUSE_DRAGGED:
        mask = MOUSE_MOTION_EVENT_MASK;
        break;
      case MouseEvent.MOUSE_WHEEL:
        mask = MOUSE_WHEEL_EVENT_MASK;
        break;
      case PaintEvent.PAINT:
      case PaintEvent.UPDATE:
        mask = PAINT_EVENT_MASK;
        break;
      case TextEvent.TEXT_VALUE_CHANGED:
        mask = TEXT_EVENT_MASK;
        break;
      case WindowEvent.WINDOW_OPENED:
      case WindowEvent.WINDOW_CLOSING:
      case WindowEvent.WINDOW_CLOSED:
      case WindowEvent.WINDOW_ICONIFIED:
      case WindowEvent.WINDOW_DEICONIFIED:
      case WindowEvent.WINDOW_ACTIVATED:
      case WindowEvent.WINDOW_DEACTIVATED:
        mask = WINDOW_EVENT_MASK;
        break;
      case WindowEvent.WINDOW_GAINED_FOCUS:
      case WindowEvent.WINDOW_LOST_FOCUS:
        mask = WINDOW_FOCUS_EVENT_MASK;
        break;
      case WindowEvent.WINDOW_STATE_CHANGED:
        mask = WINDOW_STATE_EVENT_MASK;
        break;
      default:
        mask = 0;
    }
    return mask;
  }
} // class AWTEvent
