/*
* DiscreteJChart.java
*
* Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard
*
* This file is part of BEAST.
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership and licensing.
*
* BEAST is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* BEAST is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with BEAST; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
package dr.app.gui.chart;
import java.awt.*;
import java.awt.geom.Line2D;
import java.util.Map;
/**
*
*/
public class DiscreteJChart extends JChart {
// todo merge with dr.stats.FrequencyCounter
protected Map<Integer, String> categoryDataMap;
public DiscreteJChart(Axis xAxis, Axis yAxis) {
super(xAxis, yAxis);
}
public void setXAxis(boolean isInteger, Map<Integer, String> categoryDataMap) {
if (isInteger || (categoryDataMap != null && !categoryDataMap.isEmpty())) {
super.setXAxis(new DiscreteAxis(true, true));
} else {
super.setXAxis(new LinearAxis(Axis.AT_MAJOR_TICK_PLUS, Axis.AT_MAJOR_TICK_PLUS));
}
this.categoryDataMap = categoryDataMap;
}
public void setYAxis(boolean isInteger, Map<Integer, String> categoryDataMap) {
if (isInteger || (categoryDataMap != null && !categoryDataMap.isEmpty())) {
super.setYAxis(new DiscreteAxis(true, true));
} else {
super.setYAxis(new LinearAxis());
}
this.categoryDataMap = categoryDataMap;
}
protected void paintMajorTick(Graphics2D g2, double value, String label, boolean horizontalAxis) {
g2.setPaint(getAxisPaint());
g2.setStroke(getAxisStroke());
if (label == null) label = " ";
if (horizontalAxis) {
double pos = transformX(value);
Line2D line = new Line2D.Double(pos, getPlotBounds().getMaxY(), pos, getPlotBounds().getMaxY() + getMajorTickSize());
g2.draw(line);
g2.setPaint(getLabelPaint());
double width = g2.getFontMetrics().stringWidth(label);
if (label == null) label = xAxis.format(value);
g2.drawString(label, (float) (pos - (width / 2)), (float) (getPlotBounds().getMaxY() + (getMajorTickSize() * 1.25) + getXTickLabelOffset()));
} else {
double pos = transformY(value);
Line2D line = new Line2D.Double(getPlotBounds().getMinX(), pos, getPlotBounds().getMinX() - getMajorTickSize(), pos);
g2.draw(line);
g2.setPaint(getLabelPaint());
double width = g2.getFontMetrics().stringWidth(label);
if (label == null) label = yAxis.format(value);
g2.drawString(label, (float)(getPlotBounds().getMinX() - width - (getMajorTickSize() * 1.25)), (float)(pos + getYTickLabelOffset()));
}
}
protected void paintAxis(Graphics2D g2, Axis axis, boolean horizontalAxis) {
if (categoryDataMap != null && (!categoryDataMap.isEmpty()) && axis.getIsDiscrete()) {
int n1 = axis.getMajorTickCount();
int n2, i, j;
n2 = axis.getMinorTickCount(-1);
for (i = 0; i < n1; i++) {
paintMajorTick(g2, axis.getMajorTickValue(i), categoryDataMap.get((int) axis.getMajorTickValue(i)), horizontalAxis);
n2 = axis.getMinorTickCount(i);
if (i == (n1 - 1) && axis.getLabelLast()) { // Draw last minor tick as a major one
paintMajorTick(g2, axis.getMinorTickValue(0, i), categoryDataMap.get((int) axis.getMinorTickValue(0, i)), horizontalAxis);
for (j = 1; j < n2; j++) {
paintMinorTick(g2, axis.getMinorTickValue(j, i), horizontalAxis);
}
} else {
for (j = 0; j < n2; j++) {
paintMinorTick(g2, axis.getMinorTickValue(j, i), horizontalAxis);
}
}
}
} else {
super.paintAxis(g2, axis, horizontalAxis);
}
}
}