package org.geogebra.web.web.gui;
import org.geogebra.common.main.Feature;
import org.geogebra.common.util.lang.Unicode;
import org.geogebra.web.html5.Browser;
import org.geogebra.web.html5.gui.HasKeyboardTF;
import org.geogebra.web.html5.gui.inputfield.FieldHandler;
import org.geogebra.web.html5.gui.textbox.GTextBox;
import org.geogebra.web.html5.main.AppW;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.FocusEvent;
import com.google.gwt.event.dom.client.FocusHandler;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
// Later this shall inherit from MyTextField instead of TextBox
public class AngleTextFieldW extends GTextBox implements KeyUpHandler,
HasKeyboardTF {
AppW app;
boolean dummyCursor = false;
public AngleTextFieldW(int columns, AppW app) {
super();
this.app = app;
setVisibleLength(columns);
this.addKeyUpHandler(this);
}
@Override
public void onKeyUp(KeyUpEvent e) {
boolean modifierKeyPressed = app.isMacOS() ? e.isControlKeyDown() : e
.isAltKeyDown();
// we don't want to act when AltGr is down
// as it is used eg for entering {[}] is some locales
// NB e.isAltGraphDown() doesn't work
if (e.isAltKeyDown() && e.isControlKeyDown()) {
modifierKeyPressed = false;
}
// Application.debug(e+"");
String insertString = "";
switch (Character.toChars(e.getNativeEvent().getCharCode())[0]) {
default:
// do nothing
break;
case 'o':
insertString = Unicode.DEGREE;
break;
case 'p':
insertString = Unicode.PI_STRING;
break;
}
if (modifierKeyPressed && !"".equals(insertString)) {
int start = getCursorPos();
int end = start + getSelectionLength();
// clear selection if there is one
if (start != end) {
int pos = getCursorPos();
String oldText = getText();
StringBuilder sb = new StringBuilder();
sb.append(oldText.substring(0, start));
sb.append(oldText.substring(end));
setText(sb.toString());
if (pos < sb.length()) {
setCursorPos(pos);
}
}
String oldText = getText();
// don't insert more than one degree sign or pi *in total*
if (oldText.indexOf(Unicode.DEGREE_CHAR) == -1
&& oldText.indexOf(Unicode.pi) == -1) {
int pos = oldText.length(); // getCaretPosition();
StringBuilder sb = new StringBuilder();
sb.append(oldText.substring(0, pos));
sb.append(insertString);
sb.append(oldText.substring(pos));
setText(sb.toString());
setCursorPos(pos + insertString.length());
}
// e.consume();
}
}
@Override
public void startOnscreenKeyboardEditing() {
if (Browser.isAndroid()) {
addDummyCursor();
}
}
@Override
public void endOnscreenKeyboardEditing() {
if (Browser.isAndroid()) {
removeDummyCursor();
}
}
public void enableGGBKeyboard() {
if (!app.has(Feature.KEYBOARD_BEHAVIOUR)) {
return;
}
if (Browser.isTabletBrowser()) {
// avoid native keyboard opening
setReadOnly(true);
}
addFocusHandler(new FocusHandler() {
@Override
public void onFocus(FocusEvent event) {
FieldHandler.focusGained(AngleTextFieldW.this, app);
}
});
addBlurHandler(new BlurHandler() {
@Override
public void onBlur(BlurEvent event) {
FieldHandler.focusLost(AngleTextFieldW.this, app);
}
});
}
@Override
public void addDummyCursor() {
if (dummyCursor) {
return;
}
Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
@Override
public void execute() {
int caretPos = getCursorPos();
addDummyCursor(caretPos);
}
});
}
@Override
public int removeDummyCursor() {
if (!dummyCursor) {
return -1;
}
String text = getText();
int cpos = getCursorPos();
text = text.substring(0, cpos) + text.substring(cpos + 1);
setValue(text);
dummyCursor = false;
return cpos;
}
public void addDummyCursor(int caretPos) {
if (dummyCursor) {
return;
}
String text = getText();
text = text.substring(0, caretPos) + '|' + text.substring(caretPos);
setValue(text);
setCursorPos(caretPos);
dummyCursor = true;
}
}