/*
 * Copyright (C) 2006, 2007, 2010 Apple Inc. All rights reserved.
 * 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.
 */

module events {

    // Based off of proposed IDL interface for WheelEvent:
    interface WheelEvent : UIEvent {
        readonly attribute long    screenX;
        readonly attribute long    screenY;
        readonly attribute long    clientX;
        readonly attribute long    clientY;
        readonly attribute boolean ctrlKey;
        readonly attribute boolean shiftKey;
        readonly attribute boolean altKey;
        readonly attribute boolean metaKey;
        readonly attribute long    wheelDelta;
        readonly attribute long    wheelDeltaX;
        readonly attribute long    wheelDeltaY;

        // WebKit Extensions
        readonly attribute long    offsetX;
        readonly attribute long    offsetY;
        readonly attribute long    x;
        readonly attribute long    y;
        readonly attribute boolean webkitDirectionInvertedFromDevice;

#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
        readonly attribute boolean isHorizontal;
#endif /* defined(LANGUAGE_OBJECTIVE_C) */

#if !defined(LANGUAGE_JAVASCRIPT) || !LANGUAGE_JAVASCRIPT
        void initWheelEvent(in [Optional=DefaultIsUndefined] long wheelDeltaX,
                            in [Optional=DefaultIsUndefined] long wheelDeltaY, 
                            in [Optional=DefaultIsUndefined] DOMWindow view, 
                            in [Optional=DefaultIsUndefined] long screenX,
                            in [Optional=DefaultIsUndefined] long screenY,
                            in [Optional=DefaultIsUndefined] long clientX,
                            in [Optional=DefaultIsUndefined] long clientY,
                            in [Optional=DefaultIsUndefined] boolean ctrlKey,
                            in [Optional=DefaultIsUndefined] boolean altKey,
                            in [Optional=DefaultIsUndefined] boolean shiftKey,
                            in [Optional=DefaultIsUndefined] boolean metaKey);
#endif /* !defined(LANGUAGE_JAVASCRIPT) */

#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
        void initWebKitWheelEvent(in [Optional=DefaultIsUndefined] long wheelDeltaX,
                                  in [Optional=DefaultIsUndefined] long wheelDeltaY, 
                                  in [Optional=DefaultIsUndefined] DOMWindow view, 
                                  in [Optional=DefaultIsUndefined] long screenX,
                                  in [Optional=DefaultIsUndefined] long screenY,
                                  in [Optional=DefaultIsUndefined] long clientX,
                                  in [Optional=DefaultIsUndefined] long clientY,
                                  in [Optional=DefaultIsUndefined] boolean ctrlKey,
                                  in [Optional=DefaultIsUndefined] boolean altKey,
                                  in [Optional=DefaultIsUndefined] boolean shiftKey,
                                  in [Optional=DefaultIsUndefined] boolean metaKey);
#endif /* defined(LANGUAGE_JAVASCRIPT) */
    };
}
