/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.ui.smartTree;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyDownEvent;
import com.google.gwt.event.dom.client.KeyDownHandler;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.Widget;
import org.eclipse.che.ide.util.browser.UserAgent;
/**
* @author Vlad Zhukovskiy
*/
public class KeyboardNavigationHandler {
class InternalHandler implements KeyDownHandler, KeyPressHandler {
@Override
public void onKeyDown(KeyDownEvent event) {
handleEvent(event.getNativeEvent());
}
@Override
public void onKeyPress(KeyPressEvent event) {
handleEvent(event.getNativeEvent());
}
}
private static int keyEvent = Event.ONKEYDOWN;
private Widget component;
private boolean preventDefault;
static {
if (UserAgent.isIE() || UserAgent.isWebkit()) {
keyEvent = Event.ONKEYDOWN;
} else {
keyEvent = Event.ONKEYPRESS;
}
}
public static int getKeyEvent() {
return keyEvent;
}
private InternalHandler handler = new InternalHandler();
private HandlerRegistration registration;
public KeyboardNavigationHandler() {
}
public KeyboardNavigationHandler(Widget target) {
bind(target);
}
public void bind(Widget target) {
if (component != null) {
registration.removeHandler();
}
if (target != null) {
if (keyEvent == Event.ONKEYDOWN) {
registration = target.addDomHandler(handler, KeyDownEvent.getType());
} else {
registration = target.addDomHandler(handler, KeyPressEvent.getType());
}
}
component = target;
}
public Widget getComponent() {
return component;
}
public boolean getPreventDefault() {
return preventDefault;
}
public void handleEvent(NativeEvent event) {
int code = event.getKeyCode();
NativeEvent e = event;
String type = event.getType();
if ("keydown".equals(type) && keyEvent == Event.ONKEYDOWN || "keypress".equals(type) && keyEvent == Event.ONKEYPRESS) {
} else {
return;
}
if (component != null && component.getElement() != e.getCurrentEventTarget().cast()) {
return;
}
if (preventDefault) {
event.preventDefault();
}
onKeyPress(e);
switch (code) {
case KeyCodes.KEY_ALT:
onAlt(e);
break;
case KeyCodes.KEY_BACKSPACE:
onBackspace(e);
break;
case KeyCodes.KEY_CTRL:
onControl(e);
break;
case KeyCodes.KEY_DELETE:
onDelete(e);
break;
case KeyCodes.KEY_DOWN:
onDown(e);
break;
case KeyCodes.KEY_END:
onEnd(e);
break;
case KeyCodes.KEY_ENTER:
onEnter(e);
break;
case KeyCodes.KEY_ESCAPE:
onEsc(e);
break;
case KeyCodes.KEY_HOME:
onHome(e);
break;
case KeyCodes.KEY_LEFT:
onLeft(e);
break;
case KeyCodes.KEY_PAGEDOWN:
onPageDown(e);
break;
case KeyCodes.KEY_PAGEUP:
onPageUp(e);
break;
case KeyCodes.KEY_SHIFT:
onShift(e);
break;
case KeyCodes.KEY_TAB:
onTab(e);
break;
case KeyCodes.KEY_RIGHT:
onRight(e);
break;
case KeyCodes.KEY_UP:
onUp(e);
break;
}
}
public void onAlt(NativeEvent evt) {
}
public void onBackspace(NativeEvent evt) {
}
public void onControl(NativeEvent evt) {
}
public void onDelete(NativeEvent evt) {
}
public void onDown(NativeEvent evt) {
}
public void onEnd(NativeEvent evt) {
}
public void onEnter(NativeEvent evt) {
}
public void onEsc(NativeEvent evt) {
}
public void onHome(NativeEvent evt) {
}
public void onKeyPress(NativeEvent evt) {
}
public void onLeft(NativeEvent evt) {
}
public void onPageDown(NativeEvent evt) {
}
public void onPageUp(NativeEvent evt) {
}
public void onRight(NativeEvent evt) {
}
public void onShift(NativeEvent evt) {
}
public void onTab(NativeEvent evt) {
}
public void onUp(NativeEvent evt) {
}
public void setPreventDefault(boolean preventDefault) {
this.preventDefault = preventDefault;
}
}