/*
* ScaleGridPainter.java
*
* Copyright (C) 2006-2014 Andrew Rambaut
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package figtree.treeviewer.painters;
import figtree.treeviewer.ScaleAxis;
import figtree.treeviewer.TreePane;
import figtree.treeviewer.decorators.Decorator;
import figtree.treeviewer.treelayouts.RadialTreeLayout;
import jebl.evolution.trees.Tree;
import jebl.util.Attributable;
import jam.controlpalettes.ControlPalette;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.util.Collection;
import java.util.Set;
/**
* @author Andrew Rambaut
* @version $Id$
*
* $HeadURL$
*
* $LastChangedBy$
* $LastChangedDate$
* $LastChangedRevision$
*/
public class ScaleGridPainter extends LabelPainter<TreePane> implements ScalePainter {
public ScaleGridPainter() {
super(null);
}
public void setTreePane(TreePane treePane) {
this.treePane = treePane;
}
public Rectangle2D calibrate(Graphics2D g2, TreePane treePane) {
preferredWidth = treePane.getTreeBounds().getWidth();
preferredHeight = treePane.getTreeBounds().getHeight();
return new Rectangle2D.Double(0.0, 0.0, preferredWidth, preferredHeight);
}
public void paint(Graphics2D g2, TreePane treePane, Justification justification, Rectangle2D bounds) {
Paint oldPaint = g2.getPaint();
Stroke oldStroke = g2.getStroke();
if (TreePane.DEBUG_OUTLINE) {
g2.setPaint(Color.blue);
g2.draw(bounds);
}
if (treePane.getTreeLayout() instanceof RadialTreeLayout) {
// Unless the layout is the rectilinear or polar one, the grid won't make sense...
return;
}
if (getBackground() != null) {
g2.setPaint(getBackground());
g2.fill(bounds);
}
if (getBorderPaint() != null && getBorderStroke() != null) {
g2.setPaint(getBorderPaint());
g2.setStroke(getBorderStroke());
g2.draw(bounds);
}
paintAxis(g2, bounds);
g2.setPaint(oldPaint);
g2.setStroke(oldStroke);
}
protected void paintAxis(Graphics2D g2, Rectangle2D axisBounds)
{
ScaleAxis axis = treePane.getScaleAxis();
g2.setPaint(getForeground());
int n1 = axis.getMajorTickCount();
int n2, i, j;
n2 = axis.getMinorTickCount(-1);
if (axis.getLabelFirst()) { // Draw first minor tick as a major one (with a label)
paintMajorLine(g2, axisBounds, axis, axis.getMinorTickValue(0, -1));
for (j = 1; j < n2; j++) {
paintMinorLine(g2, axisBounds, axis.getMinorTickValue(j, -1));
}
} else {
for (j = 0; j < n2; j++) {
paintMinorLine(g2, axisBounds, axis.getMinorTickValue(j, -1));
}
}
for (i = 0; i < n1; i++) {
paintMajorLine(g2, axisBounds, axis, axis.getMajorTickValue(i));
n2 = axis.getMinorTickCount(i);
if (i == (n1-1) && axis.getLabelLast()) { // Draw last minor tick as a major one
paintMajorLine(g2, axisBounds, axis, axis.getMinorTickValue(0, i));
for (j = 1; j < n2; j++) {
paintMinorLine(g2, axisBounds, axis.getMinorTickValue(j, i));
}
} else {
for (j = 0; j < n2; j++) {
paintMinorLine(g2, axisBounds, axis.getMinorTickValue(j, i));
}
}
}
}
protected void paintMajorLine(Graphics2D g2, Rectangle2D axisBounds, ScaleAxis axis, double value) {
g2.setStroke(getMajorStroke());
Shape line = treePane.getAxisLine(value);
g2.draw(line);
}
protected void paintMinorLine(Graphics2D g2, Rectangle2D axisBounds, double value) {
g2.setStroke(getMinorStroke());
Shape line = treePane.getAxisLine(value);
g2.draw(line);
}
public double getPreferredWidth() {
return preferredWidth;
}
public double getPreferredHeight() {
return preferredHeight;
}
public double getHeightBound() {
return preferredHeight;
}
public BasicStroke getMajorStroke() {
return majorStroke;
}
public void setMajorStroke(BasicStroke majorStroke) {
this.majorStroke = majorStroke;
firePainterChanged();
}
public BasicStroke getMinorStroke() {
return minorStroke;
}
public void setMinorStroke(BasicStroke minorStroke) {
this.minorStroke = minorStroke;
firePainterChanged();
}
public void setControlPalette(ControlPalette controlPalette) {
// nothing to do
}
public String[] getAttributes() {
return new String[0];
}
public void setupAttributes(Collection<? extends Tree> trees) {
// nothing to do...
}
@Override
public String getDisplayAttribute() {
throw new UnsupportedOperationException("getDisplayAttribute not implmented");
}
public void setDisplayAttribute(String displayAttribute) {
throw new UnsupportedOperationException("setDisplayAttribute not implemented in ScaleGridPainter");
}
public void setTextDecorator(Decorator textDecorator) {
}
public Set<Attributable> getAttributableItems() {
return null;
}
private BasicStroke majorStroke = new BasicStroke(0.5f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL);
private BasicStroke minorStroke = new BasicStroke(0.25f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL);
private double preferredHeight;
private double preferredWidth;
protected TreePane treePane;
}