/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package robotinterface.plugin.cmdpack.util; import java.awt.Color; import java.awt.Shape; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.geom.Area; import java.awt.geom.Ellipse2D; import java.awt.geom.GeneralPath; import java.awt.geom.Rectangle2D; import java.text.DecimalFormat; import robotinterface.algorithm.procedure.Procedure; import java.util.ArrayList; import java.util.Collection; import java.util.NoSuchElementException; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.fife.ui.autocomplete.Completion; import org.fife.ui.autocomplete.CompletionProvider; import org.fife.ui.autocomplete.FunctionCompletion; import org.fife.ui.autocomplete.ParameterizedCompletion; import org.nfunk.jep.JEP; import robotinterface.algorithm.parser.FunctionToken; import robotinterface.algorithm.parser.parameterparser.Argument; import robotinterface.drawable.swing.DrawableProcedureBlock; import robotinterface.drawable.GraphicObject; import robotinterface.drawable.swing.MutableWidgetContainer; import robotinterface.drawable.swing.component.Component; import robotinterface.drawable.swing.component.SubLineBreak; import robotinterface.drawable.swing.component.WidgetLine; import robotinterface.drawable.swing.component.TextLabel; import robotinterface.drawable.swing.component.Widget; import robotinterface.drawable.util.QuickFrame; import robotinterface.gui.GUI; import robotinterface.gui.panels.sidepanel.Item; import robotinterface.interpreter.ExecutionException; import robotinterface.interpreter.ResourceManager; import robotinterface.util.trafficsimulator.Clock; import robotinterface.util.trafficsimulator.Timer; /** * */ public class PrintString extends Procedure implements FunctionToken<PrintString> { private static Color myColor = Color.decode("#08B9AC"); private final Timer timer = new Timer(5); public PrintString() { super(new Argument("", Argument.TEXT)); } @Deprecated public PrintString(String str, String... vars) { this(); } private PrintString(Argument[] args) { super(args); setProcedure(toString()); } @Override public void begin(ResourceManager rm) throws ExecutionException { Clock clock = rm.getResource(Clock.class); JEP parser = rm.getResource(JEP.class); String out = getArg(0).getStringValue(); String padps = "%V"; //printAllDecimalPlacesStr String ptdps = "%v"; //printTwoDecimalPlacesStr String replace; DecimalFormat df = new DecimalFormat("0.00"); Argument arg; for (int i = 1; i < getArgSize(); i++) { arg = getArg(i); arg.parse(parser); if (parser.hasError()) { // throw new ExecutionException(parser.getErrorInfo() + " in \"" + arg.getStatement() + "\""); } int padpi = out.indexOf(padps); //printAllDecimalPlacesIndex int ptdpi = out.indexOf(ptdps); //printTwoDecimalPlacesIndex boolean printTwoDecimalPlaces = ((padpi == -1) ? true : ((ptdpi == -1) ? false : (ptdpi < padpi))); replace = (printTwoDecimalPlaces) ? ptdps : padps; Object value = arg.getValue(); if (printTwoDecimalPlaces && value instanceof Double) { out = out.replaceFirst(replace, df.format((Double) value)); } else { out = out.replaceFirst(replace, "" + value); } } GUI.print(out); //System.out.println(out); timer.reset(); clock.addTimer(timer); } @Override public boolean perform(ResourceManager rm) { return timer.isConsumed(); } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("print("); boolean format = true; for (Argument arg : getArgs()) { if (format) { sb.append("\""); sb.append(arg.getStringValue()); sb.append("\""); format = false; } else { sb.append(", ").append(arg); } } sb.append(")"); return sb.toString(); } @Override public Item getItem() { GeneralPath tmpShape = new GeneralPath(); double mx = 10; double my = 12; double a = 4; double b = 8; tmpShape.reset(); tmpShape.moveTo(a, 0); tmpShape.lineTo(mx + a, 0); tmpShape.curveTo(mx + b + a, 0, mx + b + a, my, mx + a, my); tmpShape.lineTo(a, my); tmpShape.lineTo(0, my / 2); tmpShape.closePath(); Area myShape = new Area(); myShape.add(new Area(tmpShape)); myShape.subtract(new Area(new Ellipse2D.Double(5, 3, 11, 6))); //myShape.exclusiveOr(new Area( new Ellipse2D.Double(8, 3, 6, 6))); //oh hell no! return new Item("Exibir", myShape, myColor, "Quando executado exibe uma mensagem no Terminal, útil para saber o valor de variáveis em alguns pontos do programa"); } public static MutableWidgetContainer createDrawablePrintString(final PrintString p) { //LINES final WidgetLine varSelectiteonLine = new WidgetLine() { @Override public void createRow(Collection<Component> components, final MutableWidgetContainer container, int index) { Argument a = p.addLineArg(index, Argument.SINGLE_VARIABLE); createGenericField(p, a, "v" + index + ":", 80, 25, components, container, WidgetLine.ARG_COMBOBOX | WidgetLine.ARG_TEXTFIELD, false); //components.add(new LineBreak(false)); } @Override public void toString(StringBuilder sb, ArrayList<Argument> arguments, MutableWidgetContainer container) { if (arguments.size() > 0) { String varName = arguments.get(0).toString(); sb.append(", ").append(varName); } } }; //HEADER LINE final WidgetLine headerLine = new WidgetLine() { @Override public void createRow(Collection<Component> components, final MutableWidgetContainer container, int index) { components.add(new TextLabel("Exibir:", true)); components.add(new SubLineBreak()); Widget wtfName = createGenericField(p, p.addLineArg(0, Argument.TEXT), "Formato:", 130, 25, components, container, WidgetLine.ARG_TEXTFIELD)[0]; final JTextField tfName = (JTextField) wtfName.getJComponent(); tfName.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { container.setString(tfName.getText()); container.updateStructure(); tfName.requestFocusInWindow(); } @Override public void removeUpdate(DocumentEvent e) { container.setString(tfName.getText()); container.updateStructure(); tfName.requestFocusInWindow(); } @Override public void changedUpdate(DocumentEvent e) { container.setString(tfName.getText()); container.updateStructure(); tfName.requestFocusInWindow(); } }); JButton bTmp = new JButton(new ImageIcon(getClass().getResource("/resources/fugue/asterisk.png"))); components.add(new Widget(bTmp, 25, 25)); bTmp.setToolTipText("Adicionar referencia"); bTmp.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { tfName.setText(tfName.getText() + " %v"); } }); } @Override public void toString(StringBuilder sb, ArrayList<Argument> arguments, MutableWidgetContainer container) { try { sb.append("\""); //JTextField 1 String str = arguments.iterator().next().toString(); // p.resetArgs(new Argument(str, Argument.TEXT)); if (!str.isEmpty()) { sb.append(str); } sb.append("\""); } catch (NoSuchElementException e) { e.printStackTrace(); } } }; DrawableProcedureBlock dcb = new DrawableProcedureBlock(p, myColor) { private GeneralPath myShape = new GeneralPath(); { super.shapeStartX = 16; } @Override public void updateStructure() { if (boxLabel.startsWith("print")) { clear(); } if (getSize() == 0) { addLine(headerLine); } String subStr = "%v"; int ocorrences = (boxLabel.length() - boxLabel.toLowerCase().replace(subStr, "").length()) / subStr.length();; ocorrences -= getSize() - 1; for (int i = 0; i < ocorrences; i++) { addLine(varSelectiteonLine); } for (int i = ocorrences; i < 0; i++) { removeLine(getSize() - 1); } } @Override public Shape updateShape(Rectangle2D bounds) { double mx = bounds.getWidth(); double my = bounds.getHeight(); int a = 10; int b = 15; int c = 20; myShape.reset(); myShape.moveTo(a, 0); myShape.lineTo(mx + a, 0); myShape.curveTo(mx + a + c, 0, mx + a + c, my, mx + a, my); myShape.lineTo(a, my); myShape.lineTo(a - b, my / 2); myShape.closePath(); return myShape; } @Override public String getBoxLabel() { String str = "print(" + super.getBoxLabel() + ")"; p.setProcedure(str); return str; } }; return dcb; } private GraphicObject resource = null; @Override public GraphicObject getDrawableResource() { if (resource == null) { resource = createDrawablePrintString(this); } return resource; } @Override public Object createInstance() { return new PrintString(""); } @Override public int getParameters() { return -2; } @Override public PrintString createInstance(Argument[] args) { return new PrintString(args); } public static void main(String[] args) { Procedure p = new PrintString("ANDERSON"); QuickFrame.applyLookAndFeel(); QuickFrame.drawTest(p.getDrawableResource()); } @Override public Completion getInfo(CompletionProvider provider) { FunctionCompletion fc = new FunctionCompletion(provider, "print(", null); fc.setShortDescription("Função exibir."); ArrayList<ParameterizedCompletion.Parameter> params = new ArrayList<>(); params.add(new ParameterizedCompletion.Parameter("var", "format", true)); fc.setParams(params); return fc; } @Override public String getToken() { return "print"; } }