/*
* 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.gen2.event.dom.client;
import com.google.gwt.gen2.event.shared.AbstractEvent;
import com.google.gwt.gen2.event.shared.EventHandler;
import com.google.gwt.gen2.event.shared.HandlerManager;
import com.google.gwt.gen2.event.shared.HasHandlerManager;
import com.google.gwt.gen2.event.shared.AbstractEvent.Type;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.FocusListener;
import com.google.gwt.user.client.ui.KeyboardListener;
import com.google.gwt.user.client.ui.MouseListener;
import com.google.gwt.user.client.ui.Widget;
import java.util.EventListener;
/**
* legacy listener support for dom events. Will eventually be moved into
* user.ui.
*
* @param <ListenerType> listener type
*
*/
abstract class ListenerWrapperImpl<ListenerType> implements EventHandler {
static class Click extends ListenerWrapperImpl<ClickListener> implements
ClickHandler {
public static void removeWrappedListener(HasHandlerManager eventSource,
ClickListener listener) {
removeWrappedListene(eventSource, listener, ClickEvent.TYPE);
}
protected Click(ClickListener listener) {
super(listener);
}
public void onClick(ClickEvent event) {
listener.onClick(source(event));
}
}
/*
* Handler wrapper for {@link FocusListener}.
*/
static class Focus extends ListenerWrapperImpl<FocusListener> implements
FocusHandler, BlurHandler {
public Focus(FocusListener listener) {
super(listener);
}
public void onBlur(BlurEvent event) {
listener.onLostFocus(source(event));
}
public void onFocus(FocusEvent event) {
listener.onFocus(source(event));
}
}
static class Keyboard extends ListenerWrapperImpl<KeyboardListener> implements
KeyDownHandler, KeyUpHandler, KeyPressHandler {
public static void removeWrappedListener(HasHandlerManager eventSource,
KeyboardListener listener) {
ListenerWrapperImpl.removeWrappedListene(eventSource, listener,
KeyDownEvent.TYPE, KeyUpEvent.TYPE, KeyPressEvent.TYPE);
}
public Keyboard(KeyboardListener listener) {
super(listener);
}
public void onKeyDown(KeyDownEvent event) {
listener.onKeyDown(source(event), (char) event.getKeyCode(),
event.getKeyModifiers());
}
public void onKeyPress(KeyPressEvent event) {
listener.onKeyPress(source(event),
(char) event.getNativeEvent().getKeyCode(), event.getKeyModifiers());
}
public void onKeyUp(KeyUpEvent event) {
source(event);
listener.onKeyUp(source(event), (char) event.getKeyCode(),
event.getKeyModifiers());
}
}
static class Mouse extends ListenerWrapperImpl<MouseListener> implements
MouseDownHandler, MouseUpHandler, MouseOutHandler, MouseOverHandler,
MouseMoveHandler {
public static <EventSourceType extends HasHandlerManager & HasMouseDownHandlers & HasMouseUpHandlers & HasMouseOutHandlers & HasMouseOverHandlers & HasMouseMoveHandlers, HandlerType extends MouseDownHandler & MouseUpHandler & MouseOutHandler & MouseOverHandler & MouseMoveHandler> void addHandlers(
EventSourceType source, HandlerType handlers) {
source.addMouseDownHandler(handlers);
source.addMouseUpHandler(handlers);
source.addMouseOutHandler(handlers);
source.addMouseOverHandler(handlers);
source.addMouseMoveHandler(handlers);
}
public static void remove(HasHandlerManager eventSource,
MouseListener listener) {
removeWrappedListene(eventSource, listener, MouseDownEvent.TYPE,
MouseUpEvent.TYPE, MouseOverEvent.TYPE, MouseOutEvent.TYPE);
}
protected Mouse(MouseListener listener) {
super(listener);
}
public void onMouseDown(MouseDownEvent event) {
listener.onMouseDown(source(event), event.getClientX(),
event.getScreenY());
}
public void onMouseMove(MouseMoveEvent event) {
listener.onMouseMove(source(event), event.getClientX(),
event.getClientY());
}
public void onMouseOut(MouseOutEvent event) {
listener.onMouseLeave(source(event));
}
public void onMouseOver(MouseOverEvent event) {
listener.onMouseEnter(source(event));
}
public void onMouseUp(MouseUpEvent event) {
listener.onMouseUp(source(event), event.getClientX(), event.getClientY());
}
}
protected static void removeWrappedListene(HasHandlerManager eventSource,
EventListener listener, Type... keys) {
HandlerManager manager = eventSource.getHandlerManager();
for (Type key : keys) {
int handlerCount = manager.getHandlerCount(key);
for (int i = 0; i < handlerCount; i++) {
EventHandler handler = manager.getHandler(key, i);
if (handler instanceof ListenerWrapperImpl
&& ((ListenerWrapperImpl) handler).listener.equals(listener)) {
manager.removeHandler(key, handler);
}
}
}
}
protected final ListenerType listener;
ListenerWrapperImpl(ListenerType listener) {
this.listener = listener;
}
Widget source(AbstractEvent e) {
return (Widget) e.getSource();
}
}