/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package common.condition;
import configuration.PointShapeDrawer;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.Map;
import render.DrawOrientation;
import render.RegularFilledPoint;
import render.RegularUnfilledWhitePoint;
import render.RingPoint;
import render.WhiteWithBlackCenterPoint;
import render.WithOuterAndInnerCircle;
import static common.condition.DotHueType.*;
import static common.condition.DotStyleType.*;
import java.awt.geom.Line2D;
import render.TPoint;
import render.WithSizes;
import static util.DrawUtil.*;
import util.PointData;
/**
*
* @author Tristan Goffman(tgoffman@gmail.com) Oct 13, 2011
*/
public class ConditionMaps {
private final static Map<DotHueType, Integer> dotHueNumMap;
private final static Map<Integer, Color> numToColorMap;
private final static Map<DotStyleType, Integer> dotStyleNumMap;
private final static Map<DotStyleType, PointShapeDrawer> dotStyleDrawer;
//Instantiation
static {
//This method of tracking conditions is not as efficient, but much easier to read (a better way might in fact be to use classes and then only build
//classes when necessary, then caching the objects as they are produced (but hopefully this will do for now)
//Num to DotHue mapping
dotHueNumMap = new EnumMap<DotHueType, Integer>(DotHueType.class);
dotHueNumMap.put(Black, 1);
dotHueNumMap.put(DarkGray, 2);
dotHueNumMap.put(MidGray, 3);
dotHueNumMap.put(LightGray, 4);
dotHueNumMap.put(Mixed, 5);
dotHueNumMap.put(IsoGray, 6);
dotHueNumMap.put(IsoRed, 7);
dotHueNumMap.put(IsoGreen, 8);
dotHueNumMap.put(IsoBlue, 9);
//Num to color
numToColorMap = new HashMap<Integer, Color>();
numToColorMap.put(1, Color.black);
numToColorMap.put(2, new Color(83, 83, 83));
numToColorMap.put(3, new Color(145, 145, 145));
numToColorMap.put(4, new Color(201, 201, 201));
numToColorMap.put(6, new Color(122, 122, 122));
numToColorMap.put(7, new Color(217, 13, 13));
numToColorMap.put(8, new Color(0, 151, 0));
numToColorMap.put(9, new Color(81, 81, 253));
//DotStyle to Num
dotStyleNumMap = new EnumMap<DotStyleType, Integer>(DotStyleType.class);
dotStyleNumMap.put(Filled, 1);
dotStyleNumMap.put(Unfilled, 2);
dotStyleNumMap.put(WhiteOutBlackIn, 3);
dotStyleNumMap.put(BlackOutWhiteIn, 4);
dotStyleNumMap.put(ThinRing, 6);
dotStyleNumMap.put(MedRing, 7);
dotStyleNumMap.put(ThickRing, 8);
dotStyleNumMap.put(Point, 9);
//NOTE: space between nums..?
dotStyleNumMap.put(Plusses, 11);
dotStyleNumMap.put(UprightGeometricT, 12);
dotStyleNumMap.put(RightGeometricT, 13);
dotStyleNumMap.put(BottomGeometricT, 14);
dotStyleNumMap.put(LeftGeometricT, 15);
dotStyleNumMap.put(UprightCentroidT, 16);
dotStyleNumMap.put(RightCentroidT, 17);
dotStyleNumMap.put(BottomCentroidT, 18);
dotStyleNumMap.put(LeftCentroidT, 19);
//NOTE: space between nums..?
dotStyleNumMap.put(Ring, 21);
dotStyleNumMap.put(Triangle, 22);
dotStyleNumMap.put(X, 23);
dotStyleNumMap.put(Plus, 24);
dotStyleDrawer = new EnumMap<DotStyleType, PointShapeDrawer>(DotStyleType.class);
dotStyleDrawer.put(Filled, new RegularFilledPoint());
dotStyleDrawer.put(Unfilled, new RegularUnfilledWhitePoint());
dotStyleDrawer.put(WhiteOutBlackIn, new WhiteWithBlackCenterPoint());
dotStyleDrawer.put(BlackOutWhiteIn, new WithOuterAndInnerCircle() {
@Override
public void drawPointWith(Shape outerCircle, Shape innerCircle) {
drawShape(dat().graphics(), outerCircle, Color.BLACK, Color.BLACK);
drawShape(dat().graphics(), innerCircle, Color.white, Color.white);
}
});
dotStyleDrawer.put(ThinRing, new RingPoint() {
@Override
public int ringStrokeSize() {
return 1;
}
});
dotStyleDrawer.put(MedRing, new RingPoint() {
@Override
public int ringStrokeSize() {
return 2;
}
});
dotStyleDrawer.put(ThickRing, new RingPoint() {
@Override
public int ringStrokeSize() {
return 3;
}
});
//TODO: Is this exactly the same as first?
dotStyleDrawer.put(Point, new RegularFilledPoint());
dotStyleDrawer.put(Point, new WithSizes() {
@Override
public void drawPoint(PointData data) {
Graphics2D g2 = data.graphics();
double y_cent = data.yCenter();
double x_cent = data.xCenter();
Shape plusSignHoriz = new Line2D.Double(x_cent - halfSize(), y_cent, x_cent + halfSize(), y_cent);
Shape plusSignVert = new Line2D.Double(x_cent, y_cent - halfSize(), x_cent, y_cent + halfSize());
//g2.draw(outerCircle);
g2.setPaint(data.pointColor());
g2.draw(plusSignHoriz);
g2.draw(plusSignVert);
}
});
//Geometrics
dotStyleDrawer.put(UprightGeometricT, new TPoint() {
@Override
public DrawOrientation orient() {
return DrawOrientation.Upright;
}
});
dotStyleDrawer.put(RightGeometricT, new TPoint() {
@Override
public DrawOrientation orient() {
return DrawOrientation.Right;
}
});
dotStyleDrawer.put(BottomGeometricT, new TPoint() {
@Override
public DrawOrientation orient() {
return DrawOrientation.Bottom;
}
});
dotStyleDrawer.put(LeftGeometricT, new TPoint() {
@Override
public DrawOrientation orient() {
return DrawOrientation.Left;
}
});
//Centroids
dotStyleDrawer.put(UprightCentroidT, new TPoint() {
@Override
public DrawOrientation orient() {
return DrawOrientation.Upright;
}
});
dotStyleDrawer.put(RightCentroidT, new TPoint() {
@Override
public DrawOrientation orient() {
return DrawOrientation.Right;
}
});
dotStyleDrawer.put(BottomCentroidT, new TPoint() {
@Override
public DrawOrientation orient() {
return DrawOrientation.Bottom;
}
});
dotStyleDrawer.put(LeftCentroidT, new TPoint() {
@Override
public DrawOrientation orient() {
return DrawOrientation.Left;
}
});
dotStyleDrawer.put(Ring, new RingPoint() {
@Override
public int ringStrokeSize() {
return 1;
}
});
dotStyleDrawer.put(Triangle, new PointShapeDrawer() {
@Override
public void drawPoint(PointData data) {
drawTri(data.graphics(), data.xCenter(), data.yCenter(), data.size(), data.pointColor());
}
});
dotStyleDrawer.put(Plus, new PointShapeDrawer() {
@Override
public void drawPoint(PointData data) {
drawPlus(data.graphics(), data.xCenter(), data.xCenter(), data.size(), data.pointColor());
}
}) ;
dotStyleDrawer.put(X, new PointShapeDrawer() {
@Override
public void drawPoint(PointData data) {
drawX(data.graphics(), data.xCenter(), data.yCenter(), data.size(), data.pointColor());
}
}) ;
}
//HELPER METHODS
public static Color getDotColor(int fillCol) {
synchronized (numToColorMap) {
return numToColorMap.get(fillCol);
}
}
public static PointShapeDrawer getPointShapeDrawer(int pointStyle) {
DotStyleType type;
DotStyleType val = null;
//O(n) for no real reason
synchronized(dotStyleNumMap){
DotStyleType[] vals = DotStyleType.values();
for (int i = 0; i < vals.length; i++) {
val = vals[i];
if (dotStyleNumMap.get(val) == pointStyle)
break;
}
}
synchronized(dotStyleDrawer){
return dotStyleDrawer.get(val);
}
}
public static int getDotHueIndex(DotHueType type) {
synchronized (dotHueNumMap) {
return dotHueNumMap.get(type);
}
}
public static int getDotStyleIndex(DotStyleType type) {
synchronized (dotStyleNumMap) {
return dotStyleNumMap.get(type);
}
}
}