in application/org.openjdk.jmc.ui/src/main/java/org/openjdk/jmc/ui/charts/AWTChartToolkit.java [293:371]
public static void drawAxis(
Graphics2D ctx, SubdividedQuantityRange range, int axisPos, boolean labelAhead, int labelLimit,
boolean vertical) {
int axisSize = range.getPixelExtent();
FontMetrics fm = ctx.getFontMetrics();
int textAscent = fm.getAscent();
int textYadjust = textAscent / 2;
int labelYPos = labelAhead ? axisPos - TICK_SIZE : axisPos + TICK_SIZE + textAscent;
final int labelSpacing;
if (vertical) {
ctx.drawLine(axisPos, Y_AXIS_TOP_SPACE, axisPos, axisSize - 1);
drawUpArrow(ctx, axisPos, Y_AXIS_TOP_SPACE, Math.min(ARROW_SIZE, axisSize - 2));
labelSpacing = fm.getHeight() - textAscent;
} else {
ctx.drawLine(0, axisPos, axisSize - 1, axisPos);
labelSpacing = fm.charWidth(' ') * 2;
}
IRange<IQuantity> firstBucket = QuantityRange.createWithEnd(range.getSubdivider(0), range.getSubdivider(1));
IQuantity lastShownTick = null;
final IFormatter<IQuantity> formatter = range.getStart().getType().getFormatterResolving(firstBucket);
final IIncrementalFormatter changeFormatter;
if (formatter instanceof IIncrementalFormatter) {
changeFormatter = (IIncrementalFormatter) formatter;
if (!vertical && (labelLimit < 0)) {
lastShownTick = range.getSubdivider(0);
if (lastShownTick.compareTo(range.getStart()) < 0) {
lastShownTick = range.getSubdivider(1);
}
String label = changeFormatter.formatContext(lastShownTick);
int labelWidth = fm.stringWidth(label);
ctx.drawString(label, labelLimit, labelYPos);
labelLimit += labelWidth + labelSpacing;
}
} else {
changeFormatter = null;
}
int numTicks = range.getNumSubdividers();
for (int i = 0; i < numTicks; i++) {
int tickPos = (int) range.getSubdividerPixel(i);
if (tickPos >= axisSize) {
break;
} else if (tickPos >= 0) {
IQuantity currentTick = range.getSubdivider(i);
final String label;
if (vertical) {
ctx.drawLine(axisPos - TICK_LINE, axisSize - 1 - tickPos, axisPos + TICK_LINE,
axisSize - 1 - tickPos);
if ((tickPos + textYadjust) >= axisSize) {
break;
} else if ((tickPos - textYadjust) >= labelLimit) {
label = formatter.format(currentTick);
int labelXPos = labelAhead ? axisPos - TICK_SIZE - fm.stringWidth(label) : axisPos + TICK_SIZE;
ctx.drawString(label, labelXPos, axisSize - 1 - tickPos + textYadjust);
labelLimit = tickPos + textYadjust + labelSpacing;
}
} else {
if (changeFormatter != null) {
label = changeFormatter.formatAdjacent(lastShownTick, range.getSubdivider(i));
} else {
label = formatter.format(currentTick);
}
ctx.drawLine(tickPos, axisPos - TICK_LINE, tickPos, axisPos + TICK_LINE);
int textXadjust = fm.stringWidth(label) / 2;
// FIXME: Decide if truncated labels should be shown
// if ((tickPos + textXadjust) >= axisSize) {
if (tickPos >= axisSize) {
break;
} else if ((tickPos - textXadjust) >= labelLimit) {
ctx.drawString(label, tickPos - textXadjust, labelYPos);
labelLimit = tickPos + textXadjust + labelSpacing;
lastShownTick = currentTick;
}
}
}
}
}