/*
 * Copyright (C) 2006 Apple Computer, Inc.
 * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library 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
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public License
 * along with this library; see the file COPYING.LIB.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

[
    ConstructorConditional=DOM4_EVENTS_CONSTRUCTOR,
    ConstructorTemplate=Event
] interface KeyboardEvent : UIEvent {

#if !defined(LANGUAGE_JAVASCRIPT) || !LANGUAGE_JAVASCRIPT
    // KeyLocationCode
    const unsigned long       KEY_LOCATION_STANDARD      = 0x00;
    const unsigned long       KEY_LOCATION_LEFT          = 0x01;
    const unsigned long       KEY_LOCATION_RIGHT         = 0x02;
    const unsigned long       KEY_LOCATION_NUMPAD        = 0x03;
#endif

    [InitializedByEventConstructor] readonly attribute DOMString        keyIdentifier;
    [InitializedByEventConstructor] readonly attribute unsigned long    keyLocation;
    [InitializedByEventConstructor] readonly attribute boolean          ctrlKey;
    [InitializedByEventConstructor] readonly attribute boolean          shiftKey;
    [InitializedByEventConstructor] readonly attribute boolean          altKey;
    [InitializedByEventConstructor] readonly attribute boolean          metaKey;
    readonly attribute boolean          altGraphKey;

#if !defined(LANGUAGE_JAVASCRIPT) || !LANGUAGE_JAVASCRIPT
    boolean getModifierState(in [Optional=DefaultIsUndefined] DOMString keyIdentifierArg);
#endif

    // FIXME: this does not match the version in the DOM spec.
    void initKeyboardEvent(in [Optional=DefaultIsUndefined] DOMString type, 
                           in [Optional=DefaultIsUndefined] boolean canBubble, 
                           in [Optional=DefaultIsUndefined] boolean cancelable, 
                           in [Optional=DefaultIsUndefined] DOMWindow view, 
                           in [Optional=DefaultIsUndefined] DOMString keyIdentifier,
                           in [Optional=DefaultIsUndefined] unsigned long keyLocation,
                           in [Optional=DefaultIsUndefined] boolean ctrlKey,
                           in [Optional=DefaultIsUndefined] boolean altKey,
                           in [Optional=DefaultIsUndefined] boolean shiftKey,
                           in [Optional=DefaultIsUndefined] boolean metaKey,
                           in [Optional=DefaultIsUndefined] boolean altGraphKey);

    // WebKit Extensions
#if !defined(LANGUAGE_JAVASCRIPT) || !LANGUAGE_JAVASCRIPT
    readonly attribute long             keyCode;
    readonly attribute long             charCode;
    
    void initKeyboardEvent(in [Optional=DefaultIsUndefined] DOMString type, 
                           in [Optional=DefaultIsUndefined] boolean canBubble, 
                           in [Optional=DefaultIsUndefined] boolean cancelable, 
                           in [Optional=DefaultIsUndefined] DOMWindow view, 
                           in [Optional=DefaultIsUndefined] DOMString keyIdentifier,
                           in [Optional=DefaultIsUndefined] unsigned long keyLocation,
                           in [Optional=DefaultIsUndefined] boolean ctrlKey,
                           in [Optional=DefaultIsUndefined] boolean altKey,
                           in [Optional=DefaultIsUndefined] boolean shiftKey,
                           in [Optional=DefaultIsUndefined] boolean metaKey);
#endif

};

