return nativeKeyUpDispatcher.handled;
}
private TextAreaElement createInputElement() {
final TextAreaElement inputElement = Elements.createTextAreaElement();
// Ensure it is offscreen
inputElement.getStyle().setPosition(CSSStyleDeclaration.Position.ABSOLUTE);
inputElement.getStyle().setLeft("-100000px");
inputElement.getStyle().setTop("0");
inputElement.getStyle().setHeight("1px");
inputElement.getStyle().setWidth("1px");
/*
* Firefox doesn't seem to respect just the NOWRAP value, so we need to set
* the legacy wrap attribute.
*/
inputElement.setAttribute("wrap", "off");
// Attach listeners
/*
* For text events, call inputHandler.handleInput(event, text) if the text
* entered was > 1 character -> from a paste event. This gets fed directly
* into the document. Single keypresses all get captured by signalEventListener
* and passed through the shortcut system.
*
* TODO: This isn't actually true, there could be paste events
* of only one character. Change this to check if the event was a clipboard
* event.
*/
inputElement.addEventListener(EVENT_TEXTINPUT, new EventListener() {
@Override
public void handleEvent(Event event) {
/*
* TODO: figure out best event to listen to. Tried "input",
* but see http://code.google.com/p/chromium/issues/detail?id=76516
*/
String text = ((TextEvent) event).getData();
if (text.length() <= 1) {
return;
}
setInputText("");
activeInputScheme.handleEvent(SignalEventUtils.create(event), text);
}
}, false);
if (BrowserUtils.isFirefox()) {
inputElement.addEventListener(Event.INPUT, new EventListener() {
@Override
public void handleEvent(Event event) {
/*
* TODO: FF doesn't support textInput, and Chrome's input
* is buggy.
*/
String text = getInputText();
if (text.length() <= 1) {
return;
}
setInputText("");
activeInputScheme.handleEvent(SignalEventUtils.create(event), text);
event.preventDefault();
event.stopPropagation();
}
}, false);
}
EventListener signalEventListener = new EventListener() {
@Override
public void handleEvent(Event event) {
SignalEvent signalEvent = SignalEventUtils.create(event);
if (signalEvent != null) {
processSignalEvent(signalEvent);
} else if ("keyup".equals(event.getType())) {
boolean handled = dispatchKeyUp(event);
if (handled) {
// Prevent any browser handling.
event.preventDefault();
event.stopPropagation();
}
}
}
};
/*
* Attach to all of key events, and the SignalEvent logic will filter
* appropriately
*/
inputElement.addEventListener(Event.KEYDOWN, signalEventListener, false);
inputElement.addEventListener(Event.KEYPRESS, signalEventListener, false);
inputElement.addEventListener(Event.KEYUP, signalEventListener, false);
inputElement.addEventListener(Event.COPY, signalEventListener, false);
inputElement.addEventListener(Event.PASTE, signalEventListener, false);
inputElement.addEventListener(Event.CUT, signalEventListener, false);
return inputElement;
}