package rpn.graphics;

import rpn.basic.Item;
import rpn.Calculator;
import rpn.basic.DoubleValue;
import rpn.basic.CalcErr;
import rpn.basic.ComplexValue;

public class LinetoItem extends Item {
	
	public LinetoItem(Calculator ca) {
		super(ca);
		ca.systemInstall(this);
	}
	
	public void exec() {
		Item a, b;
		if (ca.check(2) 
			&& (a = ca.peek(1)) instanceof DoubleValue
			&& (b = ca.peek(0)) instanceof DoubleValue) {
			CalculatorCanvas c;
			if (ca instanceof GraphicsCalculator
				&& (c = ((GraphicsCalculator) ca).getCanvas()) != null) {
				double x = ((DoubleValue) a).doubleValue();
				double y = ((DoubleValue) b).doubleValue();
				try {
					c.lineto(x, y);
					ca.pop(2);
				} catch(NoCurrentPointException e) {
					ca.error(this, CalcErr.NoCurrentPoint);
				}
			} else {
				ca.pop(2);
			}
		} else if (ca.check(1) && (a = ca.peek(0)) instanceof ComplexValue) {
			CalculatorCanvas c;
			if (ca instanceof GraphicsCalculator
				&& (c = ((GraphicsCalculator) ca).getCanvas()) != null) {
				double x[] = ((ComplexValue) a).complexValue();
				try {
					c.lineto(x[0], x[1]);
					ca.pop(1);
				} catch(NoCurrentPointException e) {
					ca.error(this, CalcErr.NoCurrentPoint);
				}
			} else {
				ca.pop(1);
			}
		} else {
			ca.error(this, CalcErr.Type);
		}
			
	}
	
	public String toString() {
		return("lineto");
	}
}
