package com.pixelmaid.dresscode.antlr.types.tree.functions;
import java.util.List;
import com.pixelmaid.dresscode.antlr.types.VarType;
import com.pixelmaid.dresscode.antlr.types.tree.DCNode;
import com.pixelmaid.dresscode.antlr.types.tree.NodeEvent;
import com.pixelmaid.dresscode.drawing.datatype.Point;
import com.pixelmaid.dresscode.drawing.primitive2d.Drawable;
import com.pixelmaid.dresscode.drawing.primitive2d.Polygon;
public class LAddNode extends NodeEvent implements DCNode {
protected List<DCNode> params;
protected int line;
public LAddNode(List<DCNode> ps, int l) {
params= ps;
line = l;
}
//TODO:address this with grouping of drawables and identifers.
@Override
public VarType evaluate() {
if(params.size()>=2){
VarType a = params.get(0).evaluate();
VarType b = params.get(1).evaluate();
// number + number
if(params.size()==2){
if(a.isDrawable() && b.isDrawable()) {
Drawable d1 = a.asDrawable();
Drawable d2 = b.asDrawable();
d1.addToGroup(d2);
d1.setLine(line);
return new VarType(d1);
}
if(a.isDrawable() && b.isPoint()) {
Point p = b.asPoint();
Drawable pl = null;
if(a.isEllipse()){
pl = a.asEllipse().toPolygon();
((Polygon)pl).addDynamicPoint(p);
}
else if(a.isRectangle()){
pl = a.asRectangle().toPolygon();
((Polygon)pl).addDynamicPoint(p);
}
else if(a.isLine()){
pl = a.asLine().toPolygon();
((Polygon)pl).addDynamicPoint(p);
}
else if(a.isCurve()){
pl = a.asCurve().toPolygon();
((Polygon)pl).addDynamicPoint(p);
}
else if(a.isPolygon()){
pl = a.asPolygon();
((Polygon)pl).addDynamicPoint(p);
}
else if(a.isDrawable()){
pl = a.asDrawable();
pl.addToGroup(p.toDrawable());
}
if(pl!=null){
pl.setLine(line);
return new VarType(pl);
}
}
// list + any
if(a.isList()) {
List<VarType> list = a.asList();
list.add(b);
return new VarType(list);
}
// string + any
if(a.isString()&& b.isString()) {
return new VarType(a.asString() + "" + b.toString());
}
}
else if(params.size()==3){
VarType c = params.get(2).evaluate();
if(b.isNumber()&&c.isNumber()){
Point p = new Point(b.asDouble(),c.asDouble());
Drawable pl = null;
if(a.isEllipse()){
pl = a.asEllipse().toPolygon();
((Polygon)pl).addDynamicPoint(p);
}
else if(a.isRectangle()){
pl = a.asRectangle().toPolygon();
((Polygon)pl).addDynamicPoint(p);
}
else if(a.isLine()){
pl = a.asLine().toPolygon();
((Polygon)pl).addDynamicPoint(p);
}
else if(a.isCurve()){
pl = a.asCurve().toPolygon();
((Polygon)pl).addDynamicPoint(p);
}
else if(a.isPolygon()){
pl = a.asPolygon();
((Polygon)pl).addDynamicPoint(p);
}
else if(a.isDrawable()){
pl = a.asDrawable();
pl.addToGroup(p.toDrawable());
}
if(pl!=null){
pl.setLine(line);
return new VarType(pl);
}
}
else if(c.isNumber()){
int index = c.asDouble().intValue();
if(a.isDrawable() && b.isDrawable()) {
Drawable d1 = a.asDrawable();
Drawable d2 = b.asDrawable();
d1.addToGroup(d2,index);
d1.setLine(line);
return new VarType(d1);
}
// list + any
if(a.isList()) {
List<VarType> list = a.asList();
list.add(index,b);
return new VarType(list);
}
// string + any
if(a.isString()&&b.isString()) {
return new VarType(a.asString().substring(0,index) + b.asString()+a.asString().substring(index,a.asString().length()));
}
}
}
}
throw new RuntimeException("illegal expression: " + this);
}
}