package org.geogebra.web.html5.gui.textbox;
import org.geogebra.web.html5.gui.inputfield.HasSymbolPopup;
import org.geogebra.web.html5.gui.util.MathKeyboardListener;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Event.NativePreviewEvent;
import com.google.gwt.user.client.Event.NativePreviewHandler;
import com.google.gwt.user.client.ui.TextBox;
/**
* This class is created so that the bluetooth keyboard works in Safari iOS.
*
* @author Balazs
*/
public class GTextBox extends TextBox implements NativePreviewHandler,
HasSymbolPopup, MathKeyboardListener {
// On iOS when using a bluetooth keyboard, the onkeyup event reports
// the charcode to be 0. To solve this, we save the character code
// in the onkeydown event, and we use that for the onkeyup
protected int keyCode;
protected boolean isControlKeyDown;
protected boolean isAltKeyDown;
protected boolean isShiftKeyDown;
protected boolean isMetaKeyDown;
public GTextBox(Element e) {
super(e);
}
public GTextBox() {
this(false, null);
}
public GTextBox(boolean autocomplete, HasSymbolPopup hsp) {
Event.addNativePreviewHandler(this);
if (!autocomplete) {
// suggestion from here to disable autocomplete
// https://code.google.com/p/google-web-toolkit/issues/detail?id=6065
//
// #3878
getElement().setAttribute("autocomplete", "off");
getElement().setAttribute("autocapitalize", "off");
setPopupCallback(hsp);
}
}
@Override
public HandlerRegistration addKeyUpHandler(KeyUpHandler handler) {
final KeyUpHandler finalHandler = handler;
return super.addKeyUpHandler(new KeyUpHandler() {
@Override
public void onKeyUp(KeyUpEvent event) {
if (event.getNativeKeyCode() == 0) {
NativeEvent nativeEvent = Document.get().createKeyUpEvent(
isControlKeyDown, isAltKeyDown, isShiftKeyDown,
isMetaKeyDown, keyCode);
event.setNativeEvent(nativeEvent);
}
finalHandler.onKeyUp(event);
}
});
}
@Override
public void onPreviewNativeEvent(NativePreviewEvent event) {
if (event.getTypeInt() == Event.ONKEYDOWN) {
NativeEvent nativeEvent = event.getNativeEvent();
keyCode = nativeEvent.getKeyCode();
isAltKeyDown = nativeEvent.getAltKey();
isShiftKeyDown = nativeEvent.getShiftKey();
isControlKeyDown = nativeEvent.getCtrlKey();
isMetaKeyDown = nativeEvent.getMetaKey();
}
}
private HasSymbolPopup showSymbolElement;
public void setPopupCallback(HasSymbolPopup element) {
this.showSymbolElement = element;
}
@Override
public void showPopup(boolean show) {
if (showSymbolElement != null) {
showSymbolElement.showPopup(show);
}
}
@Override
public void ensureEditing() {
this.setFocus(true);
}
@Override
public void setFocus(boolean b, boolean sv) {
this.setFocus(b);
}
@Override
public void onEnter(boolean b) {
// TODO Auto-generated method stub
}
@Override
public boolean needsAutofocus() {
return false;
}
}