package com.drawbridge.jsengine.ast; import java.util.LinkedList; import com.drawbridge.jsengine.Scope; import com.drawbridge.jsengine.jsobjects.JSNumber; import com.drawbridge.jsengine.jsobjects.JSType; import com.drawbridge.text.TextPanel; import com.drawbridge.utils.Utils; import com.drawbridge.vl.blocks.BlockPrimitive; import com.google.caja.parser.js.RealLiteral; public class RealLiteralEvaluator extends NumberLiteralEvaluator<Double> { private RealLiteral mRealLiteral; private Double max = Double.MAX_VALUE; private Double min = Double.MIN_VALUE; public RealLiteralEvaluator(Evaluator parent, Scope scope, RealLiteral realLiteral) { super(parent, scope, realLiteral.getFilePosition()); mRealLiteral = realLiteral; Utils.out.println(this.getClass(), ">>>>" + mRealLiteral); } @Override public JSType evaluate() throws EvaluatorException { return new JSNumber(mRealLiteral.doubleValue()); } @Override public LinkedList<com.drawbridge.vl.blocks.Block> getBlocks() { LinkedList<com.drawbridge.vl.blocks.Block> results = new LinkedList<com.drawbridge.vl.blocks.Block>(); results.add(new BlockPrimitive(getFilePosition(), this, "" + mRealLiteral.doubleValue())); return results; } @Override public boolean compare(Evaluator e) { if (!e.getClass().equals(getClass())) return false; RealLiteralEvaluator rle = (RealLiteralEvaluator) e; if (rle.mRealLiteral == mRealLiteral && e.getFilePosition().equals(getFilePosition())) return true; else return false; } public Double getValidValue(Double newVal) { if ((Double)newVal > max) return max; else if ((Double)newVal < min) return min; else return newVal; } @Override public boolean isValidValue(Double newVal) { return !(newVal > max ||newVal < min); } public void modifyValue(ParserListener listener, Double newVal, boolean updateSnapshot) { double newValidValue = getValidValue((Double)newVal); // Apply a valid value mRealLiteral = new RealLiteral(getFilePosition(), newValidValue); // Update TextPanel based on modifiedValue if (TextPanel.hasInstance() && updateSnapshot) { String before = ""; String after = ""; try { int line = getFilePosition().startLineNo()-1; String text = DBParser.getInstance().getSnapshot(); String [] lines = text.split("\n"); if(line < lines.length){ before = lines[line].substring(0, getFilePosition().startCharInLine()-1); after = lines[line].substring(getFilePosition().startCharInLine()-1 + getFilePosition().length(), lines[line].length()); } String finalText = ""; for(int i = 0; i < lines.length;i++){ if(i != line){ finalText += lines[i]; } else{ finalText += before + newValidValue + after; } if(i < lines.length -1) finalText += "\n"; } DBParser.getInstance().setSnapshot(finalText); } catch (StringIndexOutOfBoundsException e) { Utils.out.println("String index exception"); e.printStackTrace(); } } // Make the parser aware DBParser.getInstance().notifyOfEvalChange(listener); // if (oldValue != newValidValue && !DBParser.getInstance().mRecentlyChangedEvaluators.contains(this)) DBParser.getInstance().mRecentlyChangedEvaluators.add(this); } @Override public String toString() { return "RealLiteralEvaluator (" + mRealLiteral + ")"; } public Double getMaxValue() { return max; } public Double getMinValue() { return min; } public boolean hasCustomMax(){ return (max != Double.MAX_VALUE); } public boolean hasCustomMin(){ return (min != Double.MIN_VALUE); } public int getFPDiff(Double newVal) { int integerLength = ("" + mRealLiteral.getValue().intValue()).length(); int newValLength = ("" + newVal).length(); Utils.out.println("Length of " + mRealLiteral.getValue().intValue() + " is " + integerLength + ", Length of new value " + newVal + " is " + newValLength + " diff:" + (newValLength - integerLength)); return newValLength - integerLength; } @Override public void setMaximum(Double max) { this.max = max; } @Override public void setMinimum(Double min) { this.min = min; } }