package org.lemsml.jlems.viz.plot; import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import org.lemsml.jlems.core.logging.E; public class YAxisCanvas extends BaseCanvas implements RangeListener { static final long serialVersionUID = 1001; double ylow; double yhigh; int ntick = 5; String labY; final static int[] intervals = {1, 2, 5}; AffineTransform upTransform; AffineTransform normalTransform; public YAxisCanvas() { super(); upTransform = new AffineTransform(); upTransform.setToRotation(-1 * Math.PI/2.); normalTransform = new AffineTransform(); } public void setLabel(String s) { labY = s; } public void rangeChanged(double[] xyxylims) { ylow = xyxylims[1]; yhigh = xyxylims[3]; repaint(); } public void paint2D(Graphics2D g) { drawAxis(g); } public final void drawAxis(Graphics2D g) { FontMetrics fm = g.getFontMetrics(); g.setColor (getNormalForeground()); int width = getWidth(); int height = getHeight(); double yran = Math.abs(yhigh - ylow); double dy = 1.5 * yran / ntick; double log = Math.log (dy) / Math.log(10.); double powten = (int) Math.floor(log); int iiind = (int) (2.999 * (log - powten)); if (iiind < 0 || iiind >= 3) { E.error ("error gdc, 650: " + log + " " + powten + " " + iiind); iiind = 2; } int ii = intervals[iiind]; dy = Math.pow(10.0, powten) * ii; int i0 = (int)(ylow / dy); int i1 = (int)(yhigh / dy); for (int i = i0; i <= i1; i++) { double yy = i * dy; String lab = "0"; if (i == 0) { // OK; } else if (dy >= 0.999 && dy < 1.e4) { lab = String.valueOf((int)(yy)); } else { lab = String.valueOf((float)(yy)); } int iy = height - (int) (height * (yy - ylow) / (yhigh - ylow)); int off = fm.stringWidth(lab); g.drawString(lab, width - 12 - off, iy + 4); g.drawLine (width - 5, iy, width, iy); if (labY != null) { int ilx = 18; int ily = height / 2 + fm.stringWidth(labY) / 2; AffineTransform at = g.getTransform(); g.translate((double)ilx, (double)ily); g.rotate(-1 * Math.PI / 2); g.drawString(labY, 0, 0); g.setTransform(at); } } } }