/* KeyEventPostProcessor.java -- performs actions after a key event dispatch
   Copyright (C) 2002, 2005  Free Software Foundation, Inc.

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.KeyEvent;

/**
 * An instance of this interface coordinates with a KeyboardFocusManager to
 * target and dispatch all key events that are otherwise unconsumed. This
 * allows events which take place when nothing has focus to still operate,
 * such as menu keyboard shortcuts.
 *
 * <p>By default, the KeyboardFocusManager is the sink for all key events not
 * post-processed elsewhere. Therefore, it is unnecessary for the user
 * to register the focus manager as a dispatcher.
 *
 * @author Eric Blake (ebb9@email.byu.edu)
 * @see KeyboardFocusManager#addKeyEventPostProcessor(KeyEventPostProcessor)
 * @see KeyboardFocusManager#removeKeyEventPostProcessor(KeyEventPostProcessor)
 * @since 1.4
 * @status updated to 1.4
 */
public interface KeyEventPostProcessor
{
  /**
   * Called by the KeyboardFocusManager to request that a key event be
   * post-processed. Typically, the event has already been dispatched and
   * handled, unless no object has focus. Thus, this allows global event
   * handling for things like menu shortcuts. If this post-processor chooses
   * to dispatch the event, it should call <code>redispatchEvent</code>
   * to avoid infinite recursion.
   *
   * <p>If the return value is false, the KeyEvent is passed to the next
   * dispatcher in the chain, ending with the KeyboardFocusManager. If the
   * return value is true, the event has been consumed (although it might
   * have been ignored), and no further action will be taken on the event. Be
   * sure to check whether the event was consumed before dispatching it
   * further.
   *
   * @param e the key event
   * @return true if the event has been consumed
   * @see KeyboardFocusManager#redispatchEvent(Component, AWTEvent)
   */
  boolean postProcessKeyEvent(KeyEvent e);
} // interface KeyEventPostProcessor
