org.biojava.bio.gui.sequence.SimpleLabelRenderer Maven / Gradle / Ivy
/*
* 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.Font;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.font.FontRenderContext;
import java.awt.font.GlyphVector;
import java.awt.geom.AffineTransform;
import org.biojava.utils.AbstractChangeable;
import org.biojava.utils.ChangeEvent;
import org.biojava.utils.ChangeSupport;
import org.biojava.utils.ChangeType;
import org.biojava.utils.ChangeVetoException;
/**
* @author Matthew Pocock
*/
public class SimpleLabelRenderer
extends AbstractChangeable
implements LabelRenderer{
public static final ChangeType LABEL = new ChangeType(
"The label has changed",
"org.biojava.bio.gui.sequence.SimpleLabelRenderer",
"LABEL",
SequenceRenderContext.LAYOUT
);
private static final AffineTransform FLIP =
new AffineTransform(0.0, 1.0, -1.0, 0.0, 0.0, 0.0);
private String label;
private Shape labelGlyphH;
private Shape labelGlyphV;
protected Shape getLabelGlyph(
SequenceRenderContext src,
FontRenderContext frc
) {
Shape s;
if (src.getDirection() == SequenceRenderContext.HORIZONTAL) {
if(labelGlyphH == null) {
Font font = src.getFont();
labelGlyphH = font.createGlyphVector(frc, label).getOutline();
}
s = labelGlyphH;
} else {
if(labelGlyphV == null) {
Font font = src.getFont().deriveFont(FLIP);
labelGlyphV = font.createGlyphVector(frc, label).getOutline();
}
s = labelGlyphV;
}
return s;
}
public void setLabel(String label)
throws ChangeVetoException {
if(hasListeners()) {
ChangeSupport cs = getChangeSupport(LABEL);
synchronized(cs) {
ChangeEvent ce = new ChangeEvent(
this, SequenceRenderContext.LAYOUT, null, null, new ChangeEvent(
this, LABEL, this.label, label
)
);
cs.firePreChangeEvent(ce);
this.label = label;
this.labelGlyphH = null;
this.labelGlyphV = null;
cs.firePostChangeEvent(ce);
}
} else {
this.label = label;
this.labelGlyphH = null;
this.labelGlyphV = null;
}
}
public String getLabel() {
return label;
}
public double getMinimumWidth(SequenceRenderContext sp) {
if(label == null) {
return 0.0;
}
Font f = sp.getFont();
FontRenderContext frc = new FontRenderContext(null, true, true);
GlyphVector gv = f.createGlyphVector(frc, label);
return gv.getVisualBounds().getWidth();
}
public void paint(
Graphics2D g, SequenceRenderContext sp,
int min, int max, SequenceRenderContext.Border side
) {
/* if(label != null) {
Rectangle2D.Double labelBox = null;
Shape labelGlyph = getLabelGlyph(sp, g.getFontRenderContext());
if (sp.getDirection() == sp.HORIZONTAL) {
labelBox = new Rectangle2D.Double(
0, 0,
leading.getSize(), getDepth()
);
} else {
labelBox = new Rectangle2D.Double(
seqBox.getMinX(), seqBox.getMinY() - side.getSize(),
seqBox.getWidth(), side.getSize()
);
}
renderLabel(g, labelGlyph, labelBox, sp, side);
}*/
}
/*
private void renderLabel(
Graphics2D g,
Shape gv, Rectangle2D labelBox,
SequenceRenderContext sp, SequenceRenderContext.Border border
) {
Rectangle2D bounds = gv.getBounds2D();
double along = 0.0;
double across = 0.0;
if (sp.getDirection() == SequenceRenderContext.HORIZONTAL) {
across = labelBox.getCenterY() - bounds.getCenterY();
int balign = border.getAlignment();
if (balign == SequenceRenderContext.Border.LEADING)
along = labelBox.getMinX() - bounds.getMinX();
else if (balign == SequenceRenderContext.Border.TRAILING)
along = labelBox.getMaxX() - bounds.getMaxX();
else if (balign == SequenceRenderContext.Border.CENTER)
along = labelBox.getCenterX() - bounds.getCenterX();
AffineTransform at = g.getTransform();
g.translate(along, across);
g.fill(gv);
g.draw(gv);
g.setTransform(at);
} else {
across = labelBox.getCenterX() - bounds.getCenterX();
int balign = border.getAlignment();
if (balign == SequenceRenderContext.Border.LEADING)
along = labelBox.getMinY() - bounds.getMinY();
else if (balign == SequenceRenderContext.Border.TRAILING)
along = labelBox.getMaxY() - bounds.getMaxY();
else if (balign == SequenceRenderContext.Border.CENTER)
along = labelBox.getCenterY() - bounds.getCenterY();
AffineTransform at = g.getTransform();
g.translate(across, along);
g.fill(gv);
g.draw(gv);
g.setTransform(at);
}
}*/
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy