package org.geogebra.desktop.gui;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import org.geogebra.common.util.StringUtil;
import org.geogebra.common.util.lang.Unicode;
import org.geogebra.desktop.gui.inputfield.MyTextFieldD;
import org.geogebra.desktop.main.AppD;
/*
* Michael Borcherds
*
* Extends JTextField
* Alt-o inserts a degree sign at the end (only one allowed)
* Alt-p inserts pi at the end (only one allowed)
* Ctrl-o Ctrl-p on Mac OSX
*/
public class AngleTextField extends MyTextFieldD implements KeyListener {
private static final long serialVersionUID = 1L;
public AngleTextField(int columns, AppD app) {
super(app, columns);
this.addKeyListener(this);
}
@Override
public void keyPressed(KeyEvent e) {
// do nothing
}
@Override
public void keyTyped(KeyEvent e) {
// do nothing
}
@Override
public void keyReleased(KeyEvent e) {
boolean modifierKeyPressed = AppD.MAC_OS ? e.isControlDown()
: e.isAltDown();
// 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.isAltDown() && e.isControlDown()) {
modifierKeyPressed = false;
}
// Application.debug(e+"");
String insertString = "";
switch (StringUtil.toLowerCase(KeyEvent.getKeyText(e.getKeyCode()))
.charAt(0)) {
default:
// do nothing
break;
case 'o':
insertString = Unicode.DEGREE;
break;
case 'p':
insertString = Unicode.PI_STRING;
break;
}
if (modifierKeyPressed && !"".equals(insertString)) {
int start = getSelectionStart();
int end = getSelectionEnd();
// clear selection if there is one
if (start != end) {
int pos = getCaretPosition();
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()) {
setCaretPosition(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());
setCaretPosition(pos + insertString.length());
}
e.consume();
}
}
}