/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package robotinterface.plugin.cmdpack.begginer; import java.awt.Color; import java.awt.Polygon; import java.awt.Shape; import java.awt.geom.Area; import java.awt.geom.GeneralPath; import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.Collection; import javax.swing.JComboBox; import javax.swing.JOptionPane; import javax.swing.JSpinner; import javax.swing.SpinnerNumberModel; import org.fife.ui.autocomplete.Completion; import org.fife.ui.autocomplete.CompletionProvider; import org.fife.ui.autocomplete.FunctionCompletion; import org.nfunk.jep.JEP; import robotinterface.algorithm.parser.FunctionToken; import robotinterface.algorithm.parser.parameterparser.Argument; import robotinterface.algorithm.procedure.Procedure; import robotinterface.drawable.GraphicObject; import robotinterface.drawable.swing.DrawableProcedureBlock; import robotinterface.drawable.swing.MutableWidgetContainer; import robotinterface.drawable.swing.component.Component; import robotinterface.drawable.swing.component.SubLineBreak; import robotinterface.drawable.swing.component.TextLabel; import robotinterface.drawable.swing.component.Widget; import robotinterface.drawable.swing.component.WidgetLine; import robotinterface.drawable.util.QuickFrame; import robotinterface.gui.panels.sidepanel.Classifiable; import robotinterface.gui.panels.sidepanel.Item; import robotinterface.interpreter.ExecutionException; import robotinterface.interpreter.ForceInterruptionException; import robotinterface.interpreter.ResourceManager; import robotinterface.util.trafficsimulator.Clock; import robotinterface.util.trafficsimulator.Timer; /** * * @author antunes */ public class KeyboardInput extends Procedure implements FunctionToken<KeyboardInput> { private static Color myColor = Color.decode("#996622"); private Argument arg0; private Argument arg1; public KeyboardInput() { arg0 = new Argument("", Argument.SINGLE_VARIABLE); arg1 = new Argument("", Argument.TEXT); } private KeyboardInput(Argument[] args) { this(); arg0.set(args[0]); if (args.length > 1) { arg1.set(args[1]); } } @Override public void begin(ResourceManager rm) throws ExecutionException { JEP parser = rm.getResource(JEP.class); arg0.parse(parser); String message = arg1.getStringValue(); String result = JOptionPane.showInputDialog(null, (message.isEmpty()) ? "Insira um valor:" : message, "Entrada", JOptionPane.QUESTION_MESSAGE); if (result == null || result.isEmpty()) { throw new ForceInterruptionException(); } if (!arg0.getVariableName().isEmpty()) { execute(arg0.getVariableName() + " = " + result, rm); } } @Override public Item getItem() { Area myShape = new Area(); Polygon tmpShape = new Polygon(); tmpShape.addPoint(4, 0); tmpShape.addPoint(16,0); tmpShape.addPoint(12,16); tmpShape.addPoint(0,16); myShape.add(new Area(tmpShape)); tmpShape.reset(); tmpShape.addPoint(6, 4); tmpShape.addPoint(12, 4); tmpShape.addPoint(10, 12); tmpShape.addPoint(4, 12); myShape.subtract(new Area(tmpShape)); return new Item("Entrada", myShape, myColor, "Mantém o robô se movendo ou faz o programa esperar por alguns milissegundos"); } @Override public Object createInstance() { return new KeyboardInput(); } @Override public Completion getInfo(CompletionProvider provider) { FunctionCompletion fc = new FunctionCompletion(provider, "kin(v);", null); fc.setShortDescription("..."); return fc; } @Override public String getToken() { return "kin"; } @Override public void toString(String ident, StringBuilder sb) { if (!arg1.getStringValue().isEmpty()) { setProcedure("kin(" + arg0 + ",\"" + arg1 + "\")"); } else { setProcedure("kin(" + arg0 + ")"); } super.toString(ident, sb); } private GraphicObject resource = null; @Override public GraphicObject getDrawableResource() { if (resource == null) { resource = createDrawableMove(this); } return resource; } public static MutableWidgetContainer createDrawableMove(final KeyboardInput k) { //HEADER LINE final WidgetLine headerLine = new WidgetLine() { @Override public void createRow(Collection<Component> components, final MutableWidgetContainer container, int index) { components.add(new TextLabel("Entrada:", true)); components.add(new SubLineBreak()); JComboBox comboboxVar = new JComboBox(); MutableWidgetContainer.setAutoFillComboBox(comboboxVar, k, false); Widget wcomboboxvar = new Widget(comboboxVar, 100, 25); components.add(new TextLabel("Variavel:")); components.add(wcomboboxvar); container.entangle(k.arg0, wcomboboxvar); components.add(new SubLineBreak()); createGenericField(k, k.arg1, "Texto:", 130, 25, components, container, WidgetLine.ARG_TEXTFIELD); components.add(new SubLineBreak(true)); } @Override public void toString(StringBuilder sb, ArrayList<Argument> arguments, MutableWidgetContainer container) { sb.append("kin("); sb.append(arguments.get(0)); String text = arguments.get(1).getStringValue(); if (!text.isEmpty()) { sb.append(",\"").append(text).append("\""); } sb.append(")"); } }; DrawableProcedureBlock dcb = new DrawableProcedureBlock(k, myColor) { private GeneralPath myShape = new GeneralPath(); { super.shapeStartX = 10; } @Override public void updateStructure() { clear(); addLine(headerLine); boxLabel = getBoxLabel(); } @Override public Shape updateShape(Rectangle2D bounds) { double w = bounds.getWidth(); double h = bounds.getHeight(); int x = 10; myShape.reset(); myShape.moveTo(x, 0); myShape.lineTo(w + 2 * x, 0); myShape.lineTo(w + x, h); myShape.lineTo(0, h); myShape.closePath(); return myShape; } }; return dcb; } @Override public Procedure copy(Procedure copy) { super.copy(copy); if (copy instanceof KeyboardInput) { ((KeyboardInput) copy).arg0.set(arg0); ((KeyboardInput) copy).arg1.set(arg1); } return copy; } @Override public int getParameters() { return -2; } @Override public KeyboardInput createInstance(Argument[] args) { KeyboardInput w = new KeyboardInput(args); return w; } }