package anglecommands;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JLabel;
import lipstone.joshua.parser.Parser;
import lipstone.joshua.parser.Tokenizer;
import lipstone.joshua.parser.exceptions.ParserException;
import lipstone.joshua.parser.exceptions.PluginConflictException;
import lipstone.joshua.parser.plugin.ParserPlugin;
import lipstone.joshua.parser.plugin.helpdata.Command;
import lipstone.joshua.parser.plugin.settings.ParserSettingsComboBox;
import lipstone.joshua.parser.plugin.types.CommandPlugin;
import lipstone.joshua.parser.plugin.types.SettingsPlugin;
import lipstone.joshua.parser.util.AngleType;
import lipstone.joshua.parser.util.ConsCell;
import lipstone.joshua.parser.util.ConsType;
public class AngleCommands extends ParserPlugin implements CommandPlugin, SettingsPlugin {
@Override
public void loadCommands() throws PluginConflictException {
addCommand(new Command("setAngle", "set the angle to Degrees, Radians, or Grads", this));
ConsCell temp = getData("angle");
AngleType angle = (temp == null) ? parser.getAngleType() : parser.getAngleType(temp.toString());
parser.setAngleType(angle);
addCommand(new Command("showAngle", "shows the active angle measurment system", this));
}
@Override
public ConsCell runCommand(String command, ArrayList<ConsCell> arguments) throws ParserException {
if (command.equals("setAngle") && arguments.size() == 1) {
String arg = arguments.get(0).toString().trim();
if (parser.getAngleType(arg) == null && arg.length() > 1) {
if (arg.charAt(0) > 64 && arg.charAt(0) < 91)
arg = ((char) (arg.charAt(0) + 32)) + arg.substring(1);
else if (arg.charAt(0) > 96 && arg.charAt(0) < 123)
arg = ((char) (arg.charAt(0) - 32)) + arg.substring(1);
arguments.set(0, Tokenizer.tokenizeString(arg));
}
if (parser.getAngleType(arg) != null) {
parser.setAngleType(parser.getAngleType(arg));
saveData("angle", arguments.get(0));
return new ConsCell("Set the angle type to " + arg, ConsType.IDENTIFIER);
}
else
throw new ParserException(arguments.get(0) + " is not a valid angle type. Valid angle types are: Degrees, Radians, Grads", this);
}
if (command.equals("showAngle") && arguments.size() == 0)
return new ConsCell("The current angle type is " + parser.getAngleType() + ".", ConsType.IDENTIFIER);
return null;
}
@Override
public void unloadCommands() {/*Nothing to do here*/}
@Override
public void loadSettings() {
getSettingsPanel().setName("Angles");
getSettingsPanel().add(new JLabel("Angle Type: "));
final ParserSettingsComboBox<AngleType> angleBox = new ParserSettingsComboBox<AngleType>("angle", this, false, parser.Degrees, parser.Radians, parser.Grads) {
@Override
public void onEnter() {
super.onEnter();
parser.setAngleType(parser.getAngleType(getValue().toString()));
}
};
addSettingsItem(angleBox);
parser.addPropertyListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (((DefaultComboBoxModel<AngleType>) angleBox.getGUIItem().getModel()).getIndexOf((AngleType) evt.getNewValue()) == -1)
((DefaultComboBoxModel<AngleType>) angleBox.getGUIItem().getModel()).addElement((AngleType) evt.getNewValue());
}
}, Parser.AngleTypeAdded);
parser.addPropertyListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
((DefaultComboBoxModel<AngleType>) angleBox.getGUIItem().getModel()).removeElement((AngleType) evt.getOldValue());
}
}, Parser.AngleTypeRemoved);
parser.addPropertyListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
angleBox.getGUIItem().setSelectedItem(evt.getNewValue());
}
}, parser.AngleTypeChanged);
}
@Override
public void unloadSettings() {}
}