public static void drawAxis()

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;
					}
				}
			}
		}
	}