edu.uci.ics.jung.visualization.annotations.AnnotationPaintable Maven / Gradle / Ivy
/*
* Copyright (c) 2005, The JUNG Authors
* All rights reserved.
*
* This software is open-source under the BSD license; see either "license.txt"
* or https://github.com/jrtom/jung/blob/master/LICENSE for a description.
*
*
*/
package edu.uci.ics.jung.visualization.annotations;
import edu.uci.ics.jung.visualization.MultiLayerTransformer.Layer;
import edu.uci.ics.jung.visualization.RenderContext;
import edu.uci.ics.jung.visualization.VisualizationServer;
import edu.uci.ics.jung.visualization.transform.AffineTransformer;
import edu.uci.ics.jung.visualization.transform.LensTransformer;
import edu.uci.ics.jung.visualization.transform.MutableTransformer;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import javax.swing.JComponent;
/**
* handles the actual drawing of annotations
*
* @author Tom Nelson - [email protected]
*/
public class AnnotationPaintable implements VisualizationServer.Paintable {
@SuppressWarnings("rawtypes")
protected Set annotations = new HashSet();
protected AnnotationRenderer annotationRenderer;
protected RenderContext, ?> rc;
protected AffineTransformer transformer;
public AnnotationPaintable(RenderContext, ?> rc, AnnotationRenderer annotationRenderer) {
this.rc = rc;
this.annotationRenderer = annotationRenderer;
MutableTransformer mt = rc.getMultiLayerTransformer().getTransformer(Layer.LAYOUT);
if (mt instanceof AffineTransformer) {
transformer = (AffineTransformer) mt;
} else if (mt instanceof LensTransformer) {
transformer = (AffineTransformer) ((LensTransformer) mt).getDelegate();
}
}
public void add(Annotation> annotation) {
annotations.add(annotation);
}
public void remove(Annotation> annotation) {
annotations.remove(annotation);
}
/** @return the annotations */
@SuppressWarnings("rawtypes")
public Set getAnnotations() {
return Collections.unmodifiableSet(annotations);
}
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
Color oldColor = g.getColor();
for (Annotation> annotation : annotations) {
Object ann = annotation.getAnnotation();
if (ann instanceof Shape) {
Shape shape = (Shape) ann;
Paint paint = annotation.getPaint();
Shape s = transformer.transform(shape);
g2d.setPaint(paint);
if (annotation.isFill()) {
g2d.fill(s);
} else {
g2d.draw(s);
}
} else if (ann instanceof String) {
Point2D p = annotation.getLocation();
String label = (String) ann;
Component component = prepareRenderer(rc, annotationRenderer, label);
component.setForeground((Color) annotation.getPaint());
if (annotation.isFill()) {
((JComponent) component).setOpaque(true);
component.setBackground((Color) annotation.getPaint());
component.setForeground(Color.black);
}
Dimension d = component.getPreferredSize();
AffineTransform old = g2d.getTransform();
AffineTransform base = new AffineTransform(old);
AffineTransform xform = transformer.getTransform();
double rotation = transformer.getRotation();
// unrotate the annotation
AffineTransform unrotate = AffineTransform.getRotateInstance(-rotation, p.getX(), p.getY());
base.concatenate(xform);
base.concatenate(unrotate);
g2d.setTransform(base);
rc.getRendererPane()
.paintComponent(
g,
component,
rc.getScreenDevice(),
(int) p.getX(),
(int) p.getY(),
d.width,
d.height,
true);
g2d.setTransform(old);
}
}
g.setColor(oldColor);
}
public Component prepareRenderer(
RenderContext, ?> rc, AnnotationRenderer annotationRenderer, Object value) {
return annotationRenderer.getAnnotationRendererComponent(rc.getScreenDevice(), value);
}
public boolean useTransform() {
return true;
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy