/*
* Copyright 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.events.client;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.GWT.UncaughtExceptionHandler;
import com.google.gwt.dom.client.Element;
class EventImpl {
protected static class RemoverImpl implements EventListenerRemover {
private native static void removeImpl(String type, JavaScriptObject source,
JavaScriptObject fn) /*-{
source.removeEventListener(type, fn, false);
}-*/;
private final String type;
private final JavaScriptObject source;
private final JavaScriptObject listener;
public RemoverImpl(String type, JavaScriptObject source,
JavaScriptObject listener) {
this.type = type;
this.source = source;
this.listener = listener;
}
public void remove() {
removeImpl(type, source, listener);
}
protected JavaScriptObject getListener() {
return listener;
}
protected JavaScriptObject getSource() {
return source;
}
protected String getType() {
return type;
}
}
protected static class WrappedEventListener implements EventListener {
private EventListener delegate;
protected WrappedEventListener(EventListener delegate) {
this.delegate = delegate;
}
public void handleEvent(Event event) {
UncaughtExceptionHandler handler = GWT.getUncaughtExceptionHandler();
if (handler != null) {
handleEventAndCatch(event, handler);
} else {
delegate.handleEvent(event);
}
}
private void handleEventAndCatch(Event event, UncaughtExceptionHandler handler) {
try {
delegate.handleEvent(event);
} catch (Throwable e) {
handler.onUncaughtException(e);
}
}
}
static EventImpl impl = GWT.create(EventImpl.class);
public EventListenerRemover addEventListener(String type,
JavaScriptObject source, EventListener listener) {
return new RemoverImpl(type, source, addEventListenerImpl(type, source,
new WrappedEventListener(listener)));
}
public native void cancelBubble(Event evt, boolean cancel) /*-{
evt.cancelBubble = cancel;
}-*/;
public native void dispose(JavaScriptObject source) /*-{
// Do nothing for browsers that don't leak circular refs.
}-*/;
public native boolean getAltKey(Event evt) /*-{
return !!evt.altKey;
}-*/;
public native int getButton(Event evt) /*-{
return evt.button || -1;
}-*/;
public native int getClientX(Event evt) /*-{
return evt.clientX || -1;
}-*/;
public native int getClientY(Event evt) /*-{
return evt.clientY || -1;
}-*/;
public native boolean getCtrlKey(Event evt) /*-{
return !!evt.ctrlKey;
}-*/;
public native Element getCurrentTarget(Event evt) /*-{
return evt.currentTarget;
}-*/;
public final native double getElapsedTime(Event evt) /*-{
return evt.elapsedTime;
}-*/;
public native int getKeyCode(Event evt) /*-{
// 'which' gives the right key value, except when it doesn't -- in which
// case, keyCode gives the right value on all browsers.
// If all else fails, return an error code
return evt.which || evt.keyCode || -1;
}-*/;
public native boolean getMetaKey(Event evt) /*-{
return !!evt.metaKey;
}-*/;
public native int getMouseWheelVelocityY(Event evt) /*-{
return Math.round(evt.wheelDelta / 120);
}-*/;
public native String getPropertyName(Event evt) /*-{
return evt.propertyName;
}-*/;
public native Element getRelatedTarget(Event evt) /*-{
return evt.relatedTarget || null;
}-*/;
public native boolean getRepeat(Event evt) /*-{
return !!evt.repeat;
}-*/;
public native int getScreenX(Event evt) /*-{
return evt.screenX || -1;
}-*/;
public native int getScreenY(Event evt) /*-{
return evt.screenY || -1;
}-*/;
public String getScrollWheelEventName() {
return "mousewheel";
}
public native boolean getShiftKey(Event evt) /*-{
return !!evt.shiftKey;
}-*/;
public native Element getTarget(Event evt) /*-{
return evt.target || null;
}-*/;
public native String getType(Event evt) /*-{
return evt.type;
}-*/;
public native void preventDefault(Event evt) /*-{
evt.preventDefault();
}-*/;
private native JavaScriptObject addEventListenerImpl(String type,
JavaScriptObject source, EventListener listener) /*-{
var f = function(event) {
listener.@com.google.gwt.events.client.EventListener::handleEvent(Lcom/google/gwt/events/client/Event;)(event);
};
source.addEventListener(type, f, false);
return f;
}-*/;
}