001    package nl.cwi.sen1.gui.plugin;
002    
003    import java.awt.FontMetrics;
004    import java.awt.Graphics2D;
005    import java.awt.Polygon;
006    import java.awt.Shape;
007    import java.awt.geom.Ellipse2D;
008    import java.awt.geom.Rectangle2D;
009    
010    import prefuse.render.LabelRenderer;
011    import prefuse.util.ColorLib;
012    import prefuse.visual.VisualItem;
013    
014    public class GraphNodeRenderer extends LabelRenderer {
015    
016        public GraphNodeRenderer(String string) {
017            super(string);
018        }
019    
020        protected Shape getRawShape(VisualItem item) {
021            Rectangle2D bounds = super.getRawShape(item).getBounds2D();
022            double x = bounds.getX();
023            double y = bounds.getY();
024            double width = bounds.getWidth();
025            double height = bounds.getHeight();
026            Shape result = null;
027    
028            nl.cwi.sen1.graph.types.Shape shape = (nl.cwi.sen1.graph.types.Shape) item
029                    .get(GraphConstants.SHAPE);
030            if (shape.isDiamond()) {
031                result = getDiamondShape(x, y, width, height);
032            } else if (shape.isBox()) {
033                result = getBoxShape(x, y, width, height);
034            } else if (shape.isEllipse()) {
035                result = getEllipseShape(x, y, width, height);
036            } else if (shape.isCircle()) {
037                result = getCircleShape(x, y, width, height);
038            } else {
039                result = getBoxShape(x, y, width, height);
040            }
041    
042            return new GraphCompositeShape(super.getRawShape(item), result);
043        }
044    
045        private Shape getCircleShape(double x, double y, double width, double height) {
046            double radius = Math.max(width, height);
047            return new Ellipse2D.Double(x, y, radius, radius);
048        }
049    
050        private Shape getEllipseShape(double x, double y, double width,
051                double height) {
052            return new Ellipse2D.Double(x, y, width, height);
053        }
054    
055        private Shape getBoxShape(double x, double y, double width, double height) {
056            return new Rectangle2D.Double(x, y, width, height);
057        }
058    
059        private Shape getDiamondShape(double x, double y, double width,
060                double height) {
061            int ix = (int) x;
062            int iy = (int) y;
063            int iw = (int) width;
064            int ih = (int) height;
065            int[] xs = new int[] { ix - (iw / ih) * (ih / 2), ix + iw / 2,
066                    ix + iw + (iw / ih) * (ih / 2), ix + iw / 2 };
067            int[] ys = new int[] { iy + ih / 2, iy + ih + (ih / iw) * (iw / 2),
068                    iy + ih / 2, iy - (ih / iw) * (iw / 2) };
069    
070            return new Polygon(xs, ys, 4);
071        }
072    
073        public void render(Graphics2D g, VisualItem item) {
074            GraphCompositeShape comp = (GraphCompositeShape) getShape(item);
075    
076            Shape outer = comp.getOuterShape();
077            drawShape(g, item, outer);
078    
079            Shape inner = comp.getInnerShape();
080            renderText(g, item, inner);
081        }
082    
083        public void renderText(Graphics2D g, VisualItem item, Shape shape) {
084            String s = getText(item);
085            int textColor = item.getTextColor();
086            if (s != null) {
087                Rectangle2D r = shape.getBounds2D();
088                g.setPaint(ColorLib.getColor(textColor));
089                g.setFont(m_font);
090                FontMetrics fm = g.getFontMetrics();
091                double size = item.getSize();
092                double x = r.getX() + size * m_horizBorder;
093                double y = r.getY() + size * m_vertBorder;
094                g.drawString(s, (float) x, (float) y + fm.getAscent());
095                // if ( isHyperlink(item) ) {
096                // int lx = (int)Math.round(x), ly = (int)Math.round(y);
097                // g.drawLine(lx,ly,lx+fm.stringWidth(s),ly+fm.getHeight()-1);
098                // }
099            }
100        }
101    }