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

    // Introduced in DOM Level 2:
    interface [
        GenerateConstructor
    ] MouseEvent : 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 unsigned short   button;
        readonly attribute EventTarget      relatedTarget;
        
        [OldStyleObjC] void initMouseEvent(in AtomicString type, 
                                           in boolean canBubble, 
                                           in boolean cancelable, 
                                           in DOMWindow view, 
                                           in long detail, 
                                           in long screenX, 
                                           in long screenY, 
                                           in long clientX, 
                                           in long clientY, 
                                           in boolean ctrlKey, 
                                           in boolean altKey, 
                                           in boolean shiftKey, 
                                           in boolean metaKey, 
                                           in unsigned short button, 
                                           in EventTarget relatedTarget);

        // extensions
        readonly attribute long             offsetX;
        readonly attribute long             offsetY;
        readonly attribute long             x;
        readonly attribute long             y;
        readonly attribute Node             fromElement;
        readonly attribute Node             toElement;

#if defined(LANGUAGE_JAVASCRIPT)
        readonly attribute Clipboard        dataTransfer;
#endif
    };

}
