blob: 9f0600be7f1ff8caf7a4aeea17e70441dc9ebdc4 [file] [log] [blame]
// 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._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 {
// Chrome does an auto-convert to pixels.
deltaY = deltaY ~/ 120;
$else
// Dartium always needs these flipped because we're using the legacy
// _initWebKitWheelEvent instead of the more modern WheelEvent constructor
// which isn't yet properly exposed by the Dartium bindings.
deltaX = -deltaX;
deltaY = -deltaY;
$endif
// Fallthrough for Dartium.
event._initMouseEvent(type, canBubble, cancelable, view, detail,
screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey,
metaKey, button, relatedTarget);
event._initWebKitWheelEvent(deltaX, deltaY,
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 _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 => _deltaX;
/**
* 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 => _deltaY;
$endif
}