de9fbf0e90
This should be invisible to end users, but basically brings dart:html in-line with the core libraries. BUG= Review URL: https://codereview.chromium.org//12061008 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@17929 260f80e4-7a28-3924-810f-c04153c831b5
205 lines
6.1 KiB
Plaintext
205 lines
6.1 KiB
Plaintext
// 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 $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 (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 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 {
|
|
$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
|
|
@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 < 100) {
|
|
return detail * 40;
|
|
}
|
|
return detail;
|
|
}
|
|
return 0;
|
|
}
|
|
throw new UnsupportedError(
|
|
'deltaY is not supported');
|
|
}
|
|
|
|
@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');
|
|
}
|
|
|
|
int get deltaMode {
|
|
if (JS('bool', '!!#.deltaMode', this)) {
|
|
// If not available then we're poly-filling and doing pixel scroll.
|
|
return 0;
|
|
}
|
|
return this._deltaMode;
|
|
}
|
|
|
|
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);
|
|
int get _deltaMode => JS('int', '#.deltaMode', 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
|
|
@DomName('WheelEvent.deltaX')
|
|
num get deltaX => $dom_wheelDeltaX;
|
|
@DomName('WheelEvent.deltaY')
|
|
num get deltaY => $dom_wheelDeltaY;
|
|
@DomName('WheelEvent.deltaMode')
|
|
int get deltaMode => 0;
|
|
|
|
$endif
|
|
}
|