// drawHorizontalLine(layer, bounds);
// TODO: cache this based on domainWidth(?)
// shouldn't change in the case where the user is just scrolling left/right.
final double domainWidth = plot.getDomain().length();
TickFormatter tickFormatter = getBestFormatter(domainWidth);
//log("best formatter for domain " + (long)domainWidth + ": " + tickFormatter);
final double labelWidth = tickFormatter.getMaxTickLabelWidth(layer, gssProperties);
final double labelWidthDiv2 = labelWidth / 2.0;
final int maxTicksForScreen = calcMaxTicksForScreen(layer, bounds,
domainWidth, tickFormatter);
final int idealTickStep = tickFormatter
.calcIdealTickStep(domainWidth, maxTicksForScreen);
//log("dw=" + (long)domainWidth + "; maxTicks=" + maxTicksForScreen +
// "; idealStep=" + idealTickStep);
tickFormatter
.resetToQuantizedTick(plot.getDomain().getStart(), idealTickStep);
boolean stillEnoughSpace = true; // enough space to draw another tick+label?
boolean isFirstTick = true;
firstTickX = bounds.width;
lastTickX = -1;
double prevTickScreenPos = 0.0;
int actualTickStep = 0;
// log("idealTickStep=" + idealTickStep +
// "; maxTicks=" + maxTicksForScreen +
// "; domainStart=" + (long)plot.getDomain().getStart() +
// "; domainLen=" + (long)plot.getDomain().length() +
// "; quantizedDomainValue=" + (long)tickFormatter.getTickDomainValue() +
// "; idealTickStep=" + idealTickStep
// );
while (stillEnoughSpace) {
double tickScreenPos = this.domainToScreenX(tickFormatter.getTickDomainValue(), bounds);
stillEnoughSpace = tickScreenPos + labelWidthDiv2 < bounds.width;
// log("tickScreenPos=" + tickScreenPos +
// "; tickDomainValue=" + (long)tickFormatter.getTickDomainValue() +
// "; boundsRightX=" + boundsRightX);
if ((tickScreenPos > 0) && stillEnoughSpace) {
// Quantized tick date may have gone off the left edge; need to guard
// against this case.
// if (tickScreenPos >= bounds.x) {
String tickLabel = tickFormatter.format();
boolean bold = tickFormatter.isBoundary(idealTickStep);
drawTick(layer, plot, bounds, tickScreenPos, TICK_HEIGHT, bold);
drawTickLabel(layer, bounds, tickScreenPos, tickLabel, bold, labelWidth);
// }
}
// Draw auxiliary sub-ticks
if (!isFirstTick) {
int subTickStep = tickFormatter.getSubTickStep(actualTickStep);
if (subTickStep > 1) {
double auxTickWidth = (tickScreenPos - prevTickScreenPos)
/ subTickStep;
double auxTickPos = prevTickScreenPos + auxTickWidth;
for (int i = 0; i < subTickStep - 1; i++) {
// if (MathUtil.isBounded(auxTickPos, bounds.x, boundsRightX)) {
if (MathUtil.isBounded(auxTickPos, 0, bounds.width)) {
drawTick(layer, plot, bounds, auxTickPos, SUB_TICK_HEIGHT, false);
}
auxTickPos += auxTickWidth;
}
}
}
actualTickStep = tickFormatter.incrementTick(idealTickStep);
prevTickScreenPos = tickScreenPos;
isFirstTick = false;
}
if (labelProperties.visible) {