/*
 * Copyright (c) 2006 World Wide Web Consortium,
 *
 * (Massachusetts Institute of Technology, European Research Consortium for
 * Informatics and Mathematics, Keio University). All Rights Reserved. This
 * work is distributed under the W3C(r) Software License [1] 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.
 *
 * [1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
 */

package org.apache.batik.w3c.dom.events;

import org.w3c.dom.events.UIEvent;
import org.w3c.dom.views.AbstractView;

/**
 *  The <code>KeyboardEvent</code> interface provides specific contextual 
 * information associated with keyboard devices. Each keyboard event 
 * references a key using an identifier. Keyboard events are commonly 
 * directed at the element that has the focus. 
 * <p> The <code>KeyboardEvent</code> interface provides convenient attributes 
 * for some common modifiers keys: <code>KeyboardEvent.ctrlKey</code>, 
 * <code>KeyboardEvent.shiftKey</code>, <code>KeyboardEvent.altKey</code>, 
 * <code>KeyboardEvent.metaKey</code>. These attributes are equivalent to 
 * use the method 
 * <code>KeyboardEvent.getModifierState(keyIdentifierArg)</code> with 
 * "Control", "Shift", "Alt", or "Meta" respectively. 
 * <p> To create an instance of the <code>KeyboardEvent</code> interface, use 
 * the <code>DocumentEvent.createEvent("KeyboardEvent")</code> method call. 
 * <p>See also the <a href='http://www.w3.org/TR/2006/WD-DOM-Level-3-Events-20060413'>
   Document Object Model (DOM) Level 3 Events Specification
  </a>.
 * @since DOM Level 3
 */
public interface KeyboardEvent extends UIEvent {
    // KeyLocationCode
    /**
     *  The key activation is not distinguished as the left or right version 
     * of the key, and did not originate from the numeric keypad (or did not 
     * originate with a virtual key corresponding to the numeric keypad). 
     * Example: the 'Q' key on a PC 101 Key US keyboard. 
     */
    int DOM_KEY_LOCATION_STANDARD = 0x00;
    /**
     *  The key activated is in the left key location (there is more than one 
     * possible location for this key). Example: the left Shift key on a PC 
     * 101 Key US keyboard. 
     */
    int DOM_KEY_LOCATION_LEFT     = 0x01;
    /**
     *  The key activation is in the right key location (there is more than 
     * one possible location for this key). Example: the right Shift key on 
     * a PC 101 Key US keyboard. 
     */
    int DOM_KEY_LOCATION_RIGHT    = 0x02;
    /**
     *  The key activation originated on the numeric keypad or with a virtual 
     * key corresponding to the numeric keypad. Example: the '1' key on a PC 
     * 101 Key US keyboard located on the numeric pad. 
     */
    int DOM_KEY_LOCATION_NUMPAD   = 0x03;

    /**
     *  <code>keyIdentifier</code> holds the identifier of the key. The key 
     * identifiers are defined in Appendix A.2 "". Implementations that are 
     * unable to identify a key must use the key identifier 
     * <code>"Unidentified"</code>. 
     */
    String getKeyIdentifier();

    /**
     *  The <code>keyLocation</code> attribute contains an indication of the 
     * location of they key on the device, as described in . 
     */
    int getKeyLocation();

    /**
     *  <code>true</code> if the control (Ctrl) key modifier is activated. 
     */
    boolean getCtrlKey();

    /**
     *  <code>true</code> if the shift (Shift) key modifier is activated. 
     */
    boolean getShiftKey();

    /**
     *  <code>true</code> if the alternative (Alt) key modifier is activated. 
     * <p ><b>Note:</b>  The Option key modifier on Macintosh systems must be 
     * represented using this key modifier. 
     */
    boolean getAltKey();

    /**
     *  <code>true</code> if the meta (Meta) key modifier is activated. 
     * <p ><b>Note:</b>  The Command key modifier on Macintosh systems must be 
     * represented using this key modifier. 
     */
    boolean getMetaKey();

    /**
     *  This methods queries the state of a modifier using a key identifier. 
     * See also . 
     * @param keyIdentifierArg  A modifier key identifier. Common modifier 
     *   keys are <code>"Alt"</code>, <code>"AltGraph"</code>, 
     *   <code>"CapsLock"</code>, <code>"Control"</code>, <code>"Meta"</code>
     *   , <code>"NumLock"</code>, <code>"Scroll"</code>, or 
     *   <code>"Shift"</code>. 
     * <p ><b>Note:</b>    If an application wishes to distinguish between 
     *   right and left modifiers, this information could be deduced using 
     *   keyboard events and <code>KeyboardEvent.keyLocation</code>. 
     * @return  <code>true</code> if it is modifier key and the modifier is 
     *   activated, <code>false</code> otherwise. 
     */
    boolean getModifierState(String keyIdentifierArg);

    /**
     *  The <code>initKeyboardEvent</code> method is used to initialize the 
     * value of a <code>KeyboardEvent</code> object and has the same 
     * behavior as <code>UIEvent.initUIEvent()</code>. The value of 
     * <code>UIEvent.detail</code> remains undefined. 
     * @param typeArg  Refer to the <code>UIEvent.initUIEvent()</code> method 
     *   for a description of this parameter. 
     * @param canBubbleArg  Refer to the <code>UIEvent.initUIEvent()</code> 
     *   method for a description of this parameter. 
     * @param cancelableArg  Refer to the <code>UIEvent.initUIEvent()</code> 
     *   method for a description of this parameter. 
     * @param viewArg  Refer to the <code>UIEvent.initUIEvent()</code> method 
     *   for a description of this parameter. 
     * @param keyIdentifierArg  Specifies 
     *   <code>KeyboardEvent.keyIdentifier</code>. 
     * @param keyLocationArg  Specifies <code>KeyboardEvent.keyLocation</code>
     *   . 
     * @param modifiersList  A <a href='http://www.w3.org/TR/2004/REC-xml-20040204/#NT-S'>white space</a> separated
     *                       list of modifier key identifiers to be activated on this
     *   object. 
     */
    void initKeyboardEvent(String typeArg,
                           boolean canBubbleArg,
                           boolean cancelableArg,
                           AbstractView viewArg,
                           String keyIdentifierArg,
                           int keyLocationArg,
                           String modifiersList);

    /**
     *  The <code>initKeyboardEventNS</code> method is used to initialize the 
     * value of a <code>KeyboardEvent</code> object and has the same 
     * behavior as <code>UIEvent.initUIEventNS()</code>. The value of 
     * <code>UIEvent.detail</code> remains undefined. 
     * @param namespaceURI  Refer to the <code>UIEvent.initUIEventNS()</code> 
     *   method for a description of this parameter. 
     * @param typeArg  Refer to the <code>UIEvent.initUIEventNS()</code> 
     *   method for a description of this parameter. 
     * @param canBubbleArg  Refer to the <code>UIEvent.initUIEventNS()</code> 
     *   method for a description of this parameter. 
     * @param cancelableArg  Refer to the <code>UIEvent.initUIEventNS()</code>
     *    method for a description of this parameter. 
     * @param viewArg  Refer to the <code>UIEvent.initUIEventNS()</code> 
     *   method for a description of this parameter. 
     * @param keyIdentifierArg  Refer to the 
     *   <code>KeyboardEvent.initKeyboardEvent()</code> method for a 
     *   description of this parameter. 
     * @param keyLocationArg  Refer to the 
     *   <code>KeyboardEvent.initKeyboardEvent()</code> method for a 
     *   description of this parameter. 
     * @param modifiersList  A <a href='http://www.w3.org/TR/2004/REC-xml-20040204/#NT-S'>white space</a> separated
     *                       list of modifier key identifiers to be activated on this
     *   object. As an example, <code>"Control Alt"</code> will activated 
     *   the control and alt modifiers. 
     */
    void initKeyboardEventNS(String namespaceURI,
                             String typeArg,
                             boolean canBubbleArg,
                             boolean cancelableArg,
                             AbstractView viewArg,
                             String keyIdentifierArg,
                             int keyLocationArg,
                             String modifiersList);

}
