package shipmaker.render;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import render.MouseEventType;
import render.OverlayManager;
import render.RenderNode;
import render.RenderPreferences;
import render.XYTRenderNode;
import shipmaker.BlueprintLocation;
import shipmaker.partplacer.FloatTextControl;
import shipmaker.partplacer.TextInputControl;
public class PropertyTable extends XYTRenderNode {
private int c2Width;
private int c1Width;
private ArrayList<TableRow> rows;
private OverlayManager om;
private static final int ROW_HEIGHT = 20;
private interface TableRow {
void render(Graphics2D g, RenderPreferences prefs, int y);
}
public class TableName implements TableRow {
private String name;
public TableName(String name) {
this.name = name;
rows.add(this);
}
public void render(Graphics2D g, RenderPreferences prefs, int y) {
int mid = (c1Width + c2Width)/2;
g.setColor(prefs.overlayInactiveTextColor());
g.setFont(new Font("SansSerif", Font.BOLD, 14));
g.drawString(name, mid - g.getFontMetrics().stringWidth(name)/2, 15+y);
g.setColor(Color.white);
g.drawLine(2, y+ROW_HEIGHT, c1Width+c2Width-2, y+ROW_HEIGHT);
}
}
public class TableFixedProp implements TableRow {
private String name;
private String value;
public TableFixedProp(String name, String value) {
this.name = name;
this.value = value;
rows.add(this);
}
public void render(Graphics2D g, RenderPreferences prefs, int y) {
g.setColor(prefs.overlayInactiveTextColor());
g.setFont(new Font("SansSerif", Font.BOLD, 14));
g.drawString(name,10, 15+y);
g.drawString(value,10+c1Width, 15+y);
g.setColor(Color.white);
g.drawLine(2, y+ROW_HEIGHT, c1Width+c2Width-2, y+ROW_HEIGHT);
g.drawLine(c1Width, y, c1Width, 20+y);
}
}
public class TableSetProp implements TableRow {
private String name;
private IconEditField value;
public TableSetProp(String name, TextInputControl value, OverlayManager om) {
this.name = name;
this.value = new IconEditField(10+c1Width, 10+ROW_HEIGHT*rows.size(), 0, om, value);
addChild(this.value);
rows.add(this);
}
public void render(Graphics2D g, RenderPreferences prefs, int y) {
g.setColor(prefs.overlayInactiveTextColor());
g.setFont(new Font("SansSerif", Font.BOLD, 14));
g.drawString(name,10, 15+y);
g.setColor(Color.white);
g.drawLine(2, y+ROW_HEIGHT, c1Width+c2Width-2, y+ROW_HEIGHT);
g.drawLine(c1Width, y, c1Width, 20+y);
}
}
public PropertyTable(double x, double y, double theta,
int c1Width, int c2Width, OverlayManager om) {
super(x, y, theta);
this.c1Width = c1Width;
this.c2Width = c2Width;
rows = new ArrayList<>();
this.om = om;
}
public void draw(Graphics2D g, RenderPreferences prefs) {
int y = 0;
g.setColor(Color.white);
g.setStroke(new BasicStroke(2));
for (TableRow row : rows) {
row.render(g, prefs, y);
y+=ROW_HEIGHT;
}
g.drawRoundRect(0, 0, c1Width+c2Width, ROW_HEIGHT*rows.size(), 8, 8);
}
public void addPosition(final BlueprintLocation bp, OverlayManager om) {
new TableName("Position");
new TableSetProp("X", new FloatTextControl("","") {
public boolean drawIcon(Graphics2D g, RenderPreferences prefs) {
return false;
}
protected void set(float f) {
if (f <=1000)
bp.x = f;
}
protected float get() {
return bp.x;
}
}, om);
new TableSetProp("Y", new FloatTextControl("","") {
public boolean drawIcon(Graphics2D g, RenderPreferences prefs) {
return false;
}
protected void set(float f) {
if (f <= 1000)
bp.y = f;
}
protected float get() {
return bp.y;
}
}, om);
new TableSetProp("R", new FloatTextControl("","") {
public boolean drawIcon(Graphics2D g, RenderPreferences prefs) {
return false;
}
protected void set(float f) {
if (f <= 1000)
bp.r = f;
}
protected float get() {
return bp.r;
}
}, om);
new TableSetProp("T1 (\u03c0)", new FloatTextControl("","") {
public boolean drawIcon(Graphics2D g, RenderPreferences prefs) {
return false;
}
public void set(float f) {
f = f % 2;
if (f < 0) f+=2;
bp.t1 = (float) (f*Math.PI);
}
public float get() {
return (float) (bp.t1/Math.PI);
}
}, om);
new TableSetProp("T2 (\u03c0)", new FloatTextControl("","") {
public boolean drawIcon(Graphics2D g, RenderPreferences prefs) {
return false;
}
public void set(float f) {
f = f % 2;
if (f < 0) f+=2;
bp.t2 = (float) (f*Math.PI);
}
public float get() {
return (float) (bp.t2/Math.PI);
}
}, om);
}
public boolean interacted(AffineTransform root, MouseEvent e, MouseEventType t) {
if (t!=MouseEventType.MOUSE_PRESS) return false;
Point2D.Float pt = RenderNode.reverse(root, e);
if (pt.x > 0 && pt.x < c1Width + c2Width && pt.y > 0 && pt.y < rows.size() * ROW_HEIGHT) {
om.lowPriorityInteraction = new Runnable() {
public void run() {
//inhibit de-selection by registering this
}
};
}
return false;
}
}