package org.geogebra.desktop.gui.dialog;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowEvent;
import javax.swing.text.JTextComponent;
import org.geogebra.common.euclidian.EuclidianController;
import org.geogebra.common.gui.InputHandler;
import org.geogebra.common.gui.dialog.handler.NumberInputHandler;
import org.geogebra.common.kernel.Construction;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.kernelND.GeoPointND;
import org.geogebra.common.kernel.kernelND.GeoSegmentND;
import org.geogebra.common.main.DialogManager;
import org.geogebra.common.util.AsyncOperation;
import org.geogebra.common.util.StringUtil;
import org.geogebra.common.util.lang.Unicode;
import org.geogebra.desktop.gui.GuiManagerD;
import org.geogebra.desktop.main.AppD;
public class InputDialogAngleFixedD extends AngleInputDialogD
implements KeyListener {
private static String defaultRotateAngle = Unicode.FORTY_FIVE_DEGREES;
GeoSegmentND[] segments;
GeoPointND[] points;
private Kernel kernel;
private EuclidianController ec;
public InputDialogAngleFixedD(AppD app, String title, InputHandler handler,
GeoSegmentND[] segments, GeoPointND[] points,
Kernel kernel, EuclidianController ec) {
super(app, app.getLocalization().getMenu("Angle"), title,
defaultRotateAngle, false, handler, false);
this.segments = segments;
this.points = points;
this.kernel = kernel;
this.ec = ec;
this.inputPanel.getTextComponent().addKeyListener(this);
}
/**
* Handles button clicks for dialog.
*/
@Override
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
try {
if (source == btOK || source == inputPanel.getTextComponent()) {
processInput();
} else if (source == btApply) {
processInput();
} else if (source == btCancel) {
setVisibleForTools(false);
}
} catch (Exception ex) {
// do nothing on uninitializedValue
setVisibleForTools(false);
}
}
private void processInput() {
// avoid labeling of num
final Construction cons = kernel.getConstruction();
final boolean oldVal = cons.isSuppressLabelsActive();
cons.setSuppressLabelCreation(true);
inputText = inputPanel.getText();
// negative orientation ?
if (rbClockWise.isSelected()) {
inputText = "-(" + inputText + ")";
}
getInputHandler().processInput(inputText, this,
new AsyncOperation<Boolean>() {
@Override
public void callback(Boolean ok) {
cons.setSuppressLabelCreation(oldVal);
if (ok) {
String angleText = getText();
// keep angle entered if it ends with 'degrees'
if (angleText.endsWith(Unicode.DEGREE)) {
defaultRotateAngle = angleText;
} else {
defaultRotateAngle = Unicode.FORTY_FIVE_DEGREES;
}
DialogManager.doAngleFixed(kernel, segments, points,
((NumberInputHandler) getInputHandler())
.getNum(),
rbClockWise.isSelected(), ec);
}
setVisibleForTools(!ok);
}
});
}
@Override
public void windowGainedFocus(WindowEvent arg0) {
if (!wrappedDialog.isModal()) {
app.setCurrentSelectionListener(null);
}
((GuiManagerD) app.getGuiManager()).setCurrentTextfield(this, true);
}
@Override
public void keyTyped(KeyEvent e) {
// only handle key release
}
@Override
public void keyPressed(KeyEvent e) {
// only handle key release
}
/*
* auto-insert degree symbol when appropriate
*/
@Override
public void keyReleased(KeyEvent e) {
JTextComponent tc = inputPanel.getTextComponent();
String text = tc.getText();
String input = StringUtil.addDegreeSignIfNumber(e.getKeyChar(), text);
int caretPos = tc.getCaretPosition();
tc.setText(input);
tc.setCaretPosition(caretPos);
}
}