1 package prefuse.render; 2 3 import java.awt.FontMetrics ; 4 import java.awt.Graphics2D ; 5 import java.awt.Shape ; 6 import java.awt.geom.Line2D ; 7 import java.awt.geom.Point2D ; 8 import java.awt.geom.Rectangle2D ; 9 10 import prefuse.Constants; 11 import prefuse.util.ColorLib; 12 import prefuse.util.GraphicsLib; 13 import prefuse.visual.VisualItem; 14 15 20 public class AxisRenderer extends AbstractShapeRenderer { 21 22 private Line2D m_line = new Line2D.Double (); 23 private Rectangle2D m_box = new Rectangle2D.Double (); 24 25 private int m_xalign; 26 private int m_yalign; 27 private int m_ascent; 28 29 33 public AxisRenderer() { 34 this(Constants.LEFT, Constants.BOTTOM); 35 } 36 37 46 public AxisRenderer(int xalign, int yalign) { 47 m_xalign = xalign; 48 m_yalign = yalign; 49 } 50 51 57 public void setHorizontalAlignment(int xalign) { 58 m_xalign = xalign; 59 } 60 61 67 public void setVerticalAlignment(int yalign) { 68 m_yalign = yalign; 69 } 70 71 74 protected Shape getRawShape(VisualItem item) { 75 double x1 = item.getDouble(VisualItem.X); 76 double y1 = item.getDouble(VisualItem.Y); 77 double x2 = item.getDouble(VisualItem.X2); 78 double y2 = item.getDouble(VisualItem.Y2); 79 m_line.setLine(x1,y1,x2,y2); 80 81 if ( !item.canGetString(VisualItem.LABEL) ) 82 return m_line; 83 84 String label = item.getString(VisualItem.LABEL); 85 if ( label == null ) return m_line; 86 87 FontMetrics fm = DEFAULT_GRAPHICS.getFontMetrics(item.getFont()); 88 m_ascent = fm.getAscent(); 89 int h = fm.getHeight(); 90 int w = fm.stringWidth(label); 91 92 double tx, ty; 93 94 switch ( m_xalign ) { 96 case Constants.FAR_RIGHT: 97 tx = x2 + 2; 98 break; 99 case Constants.FAR_LEFT: 100 tx = x1 - w - 2; 101 break; 102 case Constants.CENTER: 103 tx = x1 + (x2-x1)/2 - w/2; 104 break; 105 case Constants.RIGHT: 106 tx = x2 - w; 107 break; 108 case Constants.LEFT: 109 default: 110 tx = x1; 111 } 112 switch ( m_yalign ) { 114 case Constants.FAR_TOP: 115 ty = y1-h; 116 break; 117 case Constants.FAR_BOTTOM: 118 ty = y2; 119 break; 120 case Constants.CENTER: 121 ty = y1 + (y2-y1)/2 - h/2; 122 break; 123 case Constants.TOP: 124 ty = y1; 125 break; 126 case Constants.BOTTOM: 127 default: 128 ty = y2-h; 129 } 130 m_box.setFrame(tx,ty,w,h); 131 return m_box; 132 } 133 134 137 public void render(Graphics2D g, VisualItem item) { 138 Shape s = getShape(item); 139 GraphicsLib.paint(g, item, m_line, getStroke(item), getRenderType(item)); 140 141 if ( s == m_box ) { 143 float x = (float)m_box.getMinX(); 144 float y = (float)m_box.getMinY() + m_ascent; 145 146 GraphicsLib.paint(g, item, s, null, RENDER_TYPE_FILL); 148 149 String str = item.getString(VisualItem.LABEL); 150 g.setFont(item.getFont()); 151 g.setColor(ColorLib.getColor(item.getTextColor())); 152 g.drawString(str, x, y); 153 } 154 } 155 156 159 public boolean locatePoint(Point2D p, VisualItem item) { 160 Shape s = getShape(item); 161 if ( s == null ) { 162 return false; 163 } else if ( s == m_box && m_box.contains(p) ) { 164 return true; 165 } else { 166 double width = Math.max(2, item.getSize()); 167 double halfWidth = width/2.0; 168 return s.intersects(p.getX()-halfWidth, 169 p.getY()-halfWidth, 170 width,width); 171 } 172 } 173 174 177 public void setBounds(VisualItem item) { 178 if ( !m_manageBounds ) return; 179 Shape shape = getShape(item); 180 if ( shape == null ) { 181 item.setBounds(item.getX(), item.getY(), 0, 0); 182 } else if ( shape == m_line ) { 183 GraphicsLib.setBounds(item, shape, getStroke(item)); 184 } else { 185 m_box.add(m_line.getX1(),m_line.getY1()); 186 m_box.add(m_line.getX2(),m_line.getY2()); 187 item.setBounds(m_box.getMinX(), m_box.getMinY(), 188 m_box.getWidth(), m_box.getHeight()); 189 } 190 } 191 192 } | Popular Tags |