package org.radargun.reporting.html; import java.awt.*; import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.List; import org.jfree.chart.axis.LogAxis; import org.jfree.chart.axis.NumberTick; import org.jfree.chart.axis.TickType; import org.jfree.data.Range; import org.jfree.ui.RectangleEdge; import org.jfree.ui.TextAnchor; /** * Logarithmic axis that shows time * * @author Radim Vansa <rvansa@redhat.com> */ class LogTimeAxis extends LogAxis { protected final double tickLabelAngle; protected final int[] minorTicks; public LogTimeAxis(String label) { this(label, Math.PI / 4, new int[] {2, 3, 4, 5, 6, 7, 8, 9}); } public LogTimeAxis(String label, double tickLabelAngle, int[] minorTicks) { super(label); this.tickLabelAngle = tickLabelAngle; this.minorTicks = minorTicks; } @Override protected List refreshTicksHorizontal(Graphics2D g2, Rectangle2D dataArea, RectangleEdge edge) { return refreshTicks(g2, edge == RectangleEdge.TOP ? TextAnchor.BOTTOM_RIGHT : TextAnchor.TOP_LEFT); } @Override protected List refreshTicksVertical(Graphics2D g2, Rectangle2D dataArea, RectangleEdge edge) { return refreshTicks(g2, edge == RectangleEdge.RIGHT ? TextAnchor.CENTER_LEFT : TextAnchor.CENTER_RIGHT); } private List refreshTicks(Graphics2D g2, TextAnchor textAnchor) { Range range = getRange(); List ticks = new ArrayList(); Font tickLabelFont = getTickLabelFont(); g2.setFont(tickLabelFont); double start = Math.pow(10, Math.floor(Math.log10(range.getLowerBound()))); double end = Math.pow(10, Math.floor(Math.log10(range.getUpperBound()))); double current = start; while (current <= end) { if (range.contains(current)) { ticks.add(new NumberTick(TickType.MAJOR, current, tickLabel(current), textAnchor, textAnchor, tickLabelAngle)); } for (int i : minorTicks) { if (range.contains(current * i)) { ticks.add(new NumberTick(TickType.MINOR, current * i, tickLabel(current * i), textAnchor, TextAnchor.TOP_LEFT, tickLabelAngle)); } } current *= 10; } return ticks; } protected double findMaximumTickLabelHeight(List ticks, Graphics2D g2, Rectangle2D drawArea, boolean vertical) { return ChartsHelper.getMaximumTickLabelHeight(ticks, g2, getTickLabelInsets(), getTickLabelFont(), tickLabelAngle); } protected double findMaximumTickLabelWidth(List ticks, Graphics2D g2, Rectangle2D drawArea, boolean vertical) { return ChartsHelper.getMaximumTickLabelWidth(ticks, g2, getTickLabelInsets(), getTickLabelFont(), tickLabelAngle); } protected String tickLabel(double value) { String unit; if (value < 1000d) { unit = "ns"; } else if (value < 1000000d) { unit = "us"; value /= 1000d; } else if (value < 1000000000d) { unit = "ms"; value /= 1000000d; } else { unit = "s"; value /= 1000000000d; } return String.format("%.0f %s", value, unit); } }