}
public void calculateBounds() {
PreciseRectangle chartBBox = chart.getBBox();
ListStore<M> store = chart.getCurrentStore();
min = new PrecisePoint(Double.NaN, Double.NaN);
max = new PrecisePoint(Double.NaN, Double.NaN);
scale = new PrecisePoint();
bbox.setX(chartBBox.getX() + chart.getMaxGutter()[0]);
bbox.setY(chartBBox.getY() + chart.getMaxGutter()[1]);
bbox.setWidth(chartBBox.getWidth() - (chart.getMaxGutter()[0] * 2));
bbox.setHeight(chartBBox.getHeight() - (chart.getMaxGutter()[1] * 2));
Axis<M, ?> axis = chart.getAxis(yAxisPosition);
if (axis != null) {
if (axis.getPosition() == Position.TOP || axis.getPosition() == Position.BOTTOM) {
min.setX(axis.getFrom());
max.setX(axis.getTo());
} else {
min.setY(axis.getFrom());
max.setY(axis.getTo());
}
} else if (yField != null) {
NumericAxis<M> numAxis = new NumericAxis<M>();
numAxis.setChart(chart);
numAxis.addField(yField);
numAxis.calcEnds();
min.setY(numAxis.getFrom());
max.setY(numAxis.getTo());
}
axis = chart.getAxis(xAxisPosition);
if (axis != null) {
if (axis.getPosition() == Position.TOP || axis.getPosition() == Position.BOTTOM) {
min.setX(axis.getFrom());
max.setX(axis.getTo());
} else {
min.setY(axis.getFrom());
max.setY(axis.getTo());
}
} else if (xField != null) {
NumericAxis<M> numAxis = new NumericAxis<M>();
numAxis.setChart(chart);
numAxis.addField(xField);
numAxis.calcEnds();
min.setX(numAxis.getFrom());
max.setX(numAxis.getTo());
}
if (Double.isNaN(min.getX())) {
min.setX(0);
scale.setX(bbox.getWidth() / (store.size() - 1));
} else {
scale.setX(bbox.getWidth() / (max.getX() - min.getX()));
}
if (Double.isNaN(min.getY())) {
min.setY(0);
scale.setY(bbox.getHeight() / (store.size() - 1));
} else {
scale.setY(bbox.getHeight() / (max.getY() - min.getY()));
}
coordinates.clear();
for (int i = 0; i < store.size(); i++) {
M model = store.get(i);
final double xValue;
final double yValue;
// Ensure a value
if (xField == null) {
xValue = i;
} else if (xField.getValue(model) != null) {
xValue = xField.getValue(model).doubleValue();
} else {
xValue = Double.NaN;
}
if (yField == null) {
yValue = i;
} else if (yField.getValue(model) != null) {
yValue = yField.getValue(model).doubleValue();
} else {
yValue = Double.NaN;
}
double x = bbox.getX() + (xValue - min.getX()) * scale.getX();
double y = bbox.getY() + bbox.getHeight() - (yValue - min.getY()) * scale.getY();
if (!Double.isNaN(x) && !Double.isNaN(y)) {
coordinates.put(i, new PrecisePoint(x, y));
}
}
if (coordinates.size() > bbox.getWidth()) {
coordinates = shrink(bbox.getWidth());