/* * BioJava development code * * This code may be freely distributed and modified under the * terms of the GNU Lesser General Public Licence. This should * be distributed with the code. If you do not have a copy, * see: * * http://www.gnu.org/copyleft/lesser.html * * Copyright for this code is held jointly by the individual * authors. These should be listed in @author doc comments. * * For more information on the BioJava project and its aims, * or to join the biojava-l mailing list, visit the home page * at: * * http://www.biojava.org/ * */ package org.biojava.bio.gui.sequence; import java.awt.Graphics2D; import java.awt.Paint; import java.awt.Stroke; import java.awt.geom.RoundRectangle2D; import org.biojava.bio.seq.Feature; import org.biojava.bio.symbol.Location; /** * RoundRectangularBeadRenderer renders features * as rectangles with rounded corners. Their outline and fill * Paint, Stroke, feature depth, Y-axis * displacement are configurable. * * @author Keith James * @since 1.2 */ public class RoundRectangularBeadRenderer extends AbstractBeadRenderer { protected RoundRectangle2D rect; protected double arcWidth; protected double arcHeight; /** * Creates a new RoundRectangularBeadRenderer * object with the default settings. */ public RoundRectangularBeadRenderer() { super(); rect = new RoundRectangle2D.Double(); arcWidth = 5.0; arcHeight = 5.0; } /** * Creates a new RoundRectangularBeadRenderer. * * @param beadDepth a double. * @param beadDisplacement a double. * @param beadOutline a Paint. * @param beadFill a Paint. * @param beadStroke a Stroke. * @param arcWidth a double value which sets the arc * width of the corners. * @param arcHeight a double value which sets the arc * height of the corners. */ public RoundRectangularBeadRenderer(double beadDepth, double beadDisplacement, Paint beadOutline, Paint beadFill, Stroke beadStroke, double arcWidth, double arcHeight) { super(beadDepth, beadDisplacement, beadOutline, beadFill, beadStroke); rect = new RoundRectangle2D.Double(); this.arcWidth = arcWidth; this.arcHeight = arcHeight; } /** * renderBead renders features as a rectangle with * rounded corners. * * @param g2 a Graphics2D. * @param f a Feature to render. * @param context a SequenceRenderContext context. */ public void renderBead(Graphics2D g2, Feature f, SequenceRenderContext context) { Location loc = f.getLocation(); int min = loc.getMin(); int max = loc.getMax(); int dif = max - min; if (context.getDirection() == SequenceRenderContext.HORIZONTAL) { double posXW = context.sequenceToGraphics(min); double posYN = beadDisplacement; double width = Math.max(((double) (dif + 1)) * context.getScale(), 1.0); double height = Math.min(beadDepth, width / 2.0); // If the bead height occupies less than the full height // of the renderer, move it down so that it is central if (height < beadDepth) posYN += ((beadDepth - height) / 2.0); rect.setRoundRect(posXW, posYN, Math.floor(width), Math.floor(height), arcWidth, arcHeight); } else { double posXW = beadDisplacement; double posYN = context.sequenceToGraphics(min); double height = Math.max(((double) dif + 1) * context.getScale(), 1.0); double width = Math.min(beadDepth, height / 2.0); if (width < beadDepth) posXW += ((beadDepth - width) / 2.0); rect.setRoundRect(posXW, posYN, Math.floor(width), Math.floor(height), arcWidth, arcHeight); } g2.setPaint(beadFill); g2.fill(rect); g2.setStroke(beadStroke); g2.setPaint(beadOutline); g2.draw(rect); } /** * getDepth calculates the depth required by this * renderer to display its beads. * * @param context a SequenceRenderContext. * * @return a double. */ public double getDepth(SequenceRenderContext context) { // Get max depth of delegates using base class method double maxDepth = super.getDepth(context); return Math.max(maxDepth, (beadDepth + beadDisplacement)); } }