package dr.app.tracer.traces;
import dr.app.gui.chart.Axis;
import dr.app.gui.chart.DiscreteAxis;
import dr.app.gui.chart.JChart;
import java.awt.*;
import java.awt.geom.GeneralPath;
import java.awt.geom.Line2D;
import java.util.ArrayList;
public class JIntervalsChart extends JChart {
//private static final int MAX_POINTS = 1000;
// private boolean isLinePlot = false;
private class Interval {
String name;
double value, upper, lower;
boolean bold;
Interval(String name, double value, double upper, double lower, boolean bold) {
this.name = name;
this.value = value;
this.upper = upper;
this.lower = lower;
this.bold = bold;
}
}
private final ArrayList<Interval> intervals = new ArrayList<Interval>();
public JIntervalsChart(Axis yAxis) {
super(new DiscreteAxis(true, true), yAxis);
}
public JIntervalsChart(Axis xAxis, Axis yAxis) {
super(xAxis, yAxis);
intervals.clear();
}
public void addIntervals(String name, double mean, double upper, double lower, boolean bold) {
intervals.add(new Interval(name, mean, upper, lower, bold));
xAxis.addRange(1, intervals.size());
yAxis.addRange(lower, upper);
recalibrate();
repaint();
}
public void removeAllIntervals() {
intervals.clear();
xAxis.setRange(Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY);
yAxis.setRange(Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY);
removeAllPlots();
recalibrate();
repaint();
}
protected void calibrate(Graphics2D g2, Dimension size) {
}
protected boolean hasContents() {
if (intervals.size() > 0) {
return intervals.size() > 0;
} else {
return super.hasContents();
}
}
protected void paintMajorTick(Graphics2D g2, double value, boolean horizontalAxis) {
if (intervals.size() > 0 && horizontalAxis) {
g2.setPaint(getAxisPaint());
g2.setStroke(getAxisStroke());
int index = ((int) value) - 1;
Interval interval = intervals.get(index);
String label = interval.name;
double pos = transformX(value);
Line2D line = new Line2D.Double(pos, getPlotBounds().getMaxY(), pos, getPlotBounds().getMaxY() + getMajorTickSize());
g2.draw(line);
g2.setPaint(getLabelPaint());
double width = g2.getFontMetrics().stringWidth(label);
g2.drawString(label, (float) (pos - (width / 2)), (float) (getPlotBounds().getMaxY() + (getMajorTickSize() * 1.25) + getXTickLabelOffset()));
} else {
super.paintMajorTick(g2, value, horizontalAxis);
}
}
protected void paintContents(Graphics2D g2) {
if (intervals.size() > 0) {
for (int i = 0; i < intervals.size(); i++) {
Interval interval = intervals.get(i);
float x = (float) transformX(i + 1);
float xLeft = (float) transformX(((double) i + 1) - 0.1);
float xRight = (float) transformX(((double) i + 1) + 0.1);
//float y = (float)transformY(interval.value);
float yUpper = (float) transformY(interval.upper);
float yLower = (float) transformY(interval.lower);
GeneralPath path = new GeneralPath();
path.moveTo(xLeft, yUpper);
path.lineTo(xRight, yUpper);
path.moveTo(x, yUpper);
path.lineTo(x, yLower);
path.moveTo(xLeft, yLower);
path.lineTo(xRight, yLower);
if (interval.bold) {
g2.setStroke(new BasicStroke(2.0f));
} else {
g2.setStroke(new BasicStroke(1.0f));
}
g2.setPaint(Color.black);
g2.draw(path);
}
} else {
super.paintContents(g2);
}
}
}