| // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| part of $LIBRARYNAME; |
| |
| $(ANNOTATIONS)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC { |
| |
| factory WheelEvent(String type, |
| {Window view, int deltaX: 0, int deltaY: 0, |
| int detail: 0, int screenX: 0, int screenY: 0, int clientX: 0, |
| int clientY: 0, int button: 0, bool canBubble: true, |
| bool cancelable: true, bool ctrlKey: false, bool altKey: false, |
| bool shiftKey: false, bool metaKey: false, EventTarget relatedTarget}) { |
| |
| if (view == null) { |
| view = window; |
| } |
| var eventType = 'WheelEvent'; |
| if (Device.isFirefox) { |
| eventType = 'MouseScrollEvents'; |
| } |
| final event = document.$dom_createEvent(eventType); |
| $if DART2JS |
| // If polyfilling, then flip these because we'll flip them back to match |
| // the W3C standard: |
| // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-WheelEvent-deltaY |
| if (JS('bool', '#.deltaY === undefined', event)) { |
| deltaX = -deltaX; |
| deltaY = -deltaY; |
| } |
| if (event._hasInitWheelEvent) { |
| var modifiers = []; |
| if (ctrlKey) { |
| modifiers.push('Control'); |
| } |
| if (altKey) { |
| modifiers.push('Alt'); |
| } |
| if (shiftKey) { |
| modifiers.push('Shift'); |
| } |
| if (metaKey) { |
| modifiers.push('Meta'); |
| } |
| event._initWheelEvent(type, canBubble, cancelable, view, detail, screenX, |
| screenY, clientX, clientY, button, relatedTarget, modifiers.join(' '), |
| deltaX, deltaY, 0, 0); |
| } else if (event._hasInitMouseScrollEvent) { |
| var axis = 0; |
| var detail = 0; |
| if (deltaX != 0 && deltaY != 0) { |
| throw new UnsupportedError( |
| 'Cannot modify deltaX and deltaY simultaneously'); |
| } |
| if (deltaY != 0) { |
| detail = deltaY; |
| axis = JS('int', 'MouseScrollEvent.VERTICAL_AXIS'); |
| } else if (deltaX != 0) { |
| detail = deltaX; |
| axis = JS('int', 'MouseScrollEvent.HORIZONTAL_AXIS'); |
| } |
| event._initMouseScrollEvent(type, canBubble, cancelable, view, detail, |
| screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, |
| metaKey, button, relatedTarget, axis); |
| } else { |
| $else |
| // Dartium always needs these flipped because we're essentially always |
| // polyfilling (see similar dart2js code as well) |
| deltaX = -deltaX; |
| deltaY = -deltaY; |
| $endif |
| // Fallthrough for Dartium. |
| event.$dom_initMouseEvent(type, canBubble, cancelable, view, detail, |
| screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, |
| metaKey, button, relatedTarget); |
| event.$dom_initWebKitWheelEvent(deltaX, |
| deltaY ~/ 120, // Chrome does an auto-convert to pixels. |
| view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, |
| metaKey); |
| $if DART2JS |
| } |
| $endif |
| |
| return event; |
| } |
| |
| $!MEMBERS |
| |
| $if DART2JS |
| /** |
| * The amount that is expected to scroll vertically, in units determined by |
| * [deltaMode]. |
| * |
| * See also: |
| * |
| * * [WheelEvent.deltaY](http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-WheelEvent-deltaY) from the W3C. |
| */ |
| @DomName('WheelEvent.deltaY') |
| num get deltaY { |
| if (JS('bool', '#.deltaY !== undefined', this)) { |
| // W3C WheelEvent |
| return this._deltaY; |
| } else if (JS('bool', '#.wheelDelta !== undefined', this)) { |
| // Chrome and IE |
| return -this._wheelDelta; |
| } else if (JS('bool', '#.detail !== undefined', this)) { |
| // Firefox |
| |
| // Handle DOMMouseScroll case where it uses detail and the axis to |
| // differentiate. |
| if (JS('bool', '#.axis == MouseScrollEvent.VERTICAL_AXIS', this)) { |
| var detail = this._detail; |
| // Firefox is normally the number of lines to scale (normally 3) |
| // so multiply it by 40 to get pixels to move, matching IE & WebKit. |
| if (detail.abs() < 100) { |
| return -detail * 40; |
| } |
| return -detail; |
| } |
| return 0; |
| } |
| throw new UnsupportedError( |
| 'deltaY is not supported'); |
| } |
| |
| /** |
| * The amount that is expected to scroll horizontally, in units determined by |
| * [deltaMode]. |
| * |
| * See also: |
| * |
| * * [WheelEvent.deltaX](http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-WheelEvent-deltaX) from the W3C. |
| */ |
| @DomName('WheelEvent.deltaX') |
| num get deltaX { |
| if (JS('bool', '#.deltaX !== undefined', this)) { |
| // W3C WheelEvent |
| return this._deltaX; |
| } else if (JS('bool', '#.wheelDeltaX !== undefined', this)) { |
| // Chrome |
| return -this._wheelDeltaX; |
| } else if (JS('bool', '#.detail !== undefined', this)) { |
| // Firefox and IE. |
| // IE will have detail set but will not set axis. |
| |
| // Handle DOMMouseScroll case where it uses detail and the axis to |
| // differentiate. |
| if (JS('bool', '#.axis !== undefined && ' |
| '#.axis == MouseScrollEvent.HORIZONTAL_AXIS', this, this)) { |
| var detail = this._detail; |
| // Firefox is normally the number of lines to scale (normally 3) |
| // so multiply it by 40 to get pixels to move, matching IE & WebKit. |
| if (detail < 100) { |
| return -detail * 40; |
| } |
| return -detail; |
| } |
| return 0; |
| } |
| throw new UnsupportedError( |
| 'deltaX is not supported'); |
| } |
| |
| @DomName('WheelEvent.deltaMode') |
| int get deltaMode { |
| if (JS('bool', '!!(#.deltaMode)', this)) { |
| return JS('int', '#.deltaMode', this); |
| } |
| // If not available then we're poly-filling and doing pixel scroll. |
| return 0; |
| } |
| |
| num get _deltaY => JS('num', '#.deltaY', this); |
| num get _deltaX => JS('num', '#.deltaX', this); |
| num get _wheelDelta => JS('num', '#.wheelDelta', this); |
| num get _wheelDeltaX => JS('num', '#.wheelDeltaX', this); |
| num get _detail => JS('num', '#.detail', this); |
| |
| bool get _hasInitMouseScrollEvent => |
| JS('bool', '!!(#.initMouseScrollEvent)', this); |
| |
| @JSName('initMouseScrollEvent') |
| void _initMouseScrollEvent( |
| String type, |
| bool canBubble, |
| bool cancelable, |
| Window view, |
| int detail, |
| int screenX, |
| int screenY, |
| int clientX, |
| int clientY, |
| bool ctrlKey, |
| bool altKey, |
| bool shiftKey, |
| bool metaKey, |
| int button, |
| EventTarget relatedTarget, |
| int axis) native; |
| |
| bool get _hasInitWheelEvent => |
| JS('bool', '!!(#.initWheelEvent)', this); |
| @JSName('initWheelEvent') |
| void _initWheelEvent( |
| String eventType, |
| bool canBubble, |
| bool cancelable, |
| Window view, |
| int detail, |
| int screenX, |
| int screenY, |
| int clientX, |
| int clientY, |
| int button, |
| EventTarget relatedTarget, |
| String modifiersList, |
| int deltaX, |
| int deltaY, |
| int deltaZ, |
| int deltaMode) native; |
| |
| $else |
| /** |
| * The amount that is expected to scroll horizontally, in units determined by |
| * [deltaMode]. |
| * |
| * See also: |
| * |
| * * [WheelEvent.deltaX](http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-WheelEvent-deltaX) from the W3C. |
| */ |
| @DomName('WheelEvent.deltaX') |
| num get deltaX => -_wheelDeltaX; |
| |
| /** |
| * The amount that is expected to scroll vertically, in units determined by |
| * [deltaMode]. |
| * |
| * See also: |
| * |
| * * [WheelEvent.deltaY](http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-WheelEvent-deltaY) from the W3C. |
| */ |
| @DomName('WheelEvent.deltaY') |
| num get deltaY => -_wheelDeltaY; |
| $endif |
| } |