KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > prefuse > render > AxisRenderer


1 package prefuse.render;
2
3 import java.awt.FontMetrics JavaDoc;
4 import java.awt.Graphics2D JavaDoc;
5 import java.awt.Shape JavaDoc;
6 import java.awt.geom.Line2D JavaDoc;
7 import java.awt.geom.Point2D JavaDoc;
8 import java.awt.geom.Rectangle2D JavaDoc;
9
10 import prefuse.Constants;
11 import prefuse.util.ColorLib;
12 import prefuse.util.GraphicsLib;
13 import prefuse.visual.VisualItem;
14
15 /**
16  * Renderer for drawing an axis tick mark and label.
17  *
18  * @author <a HREF="http://jheer.org">jeffrey heer</a>
19  */

20 public class AxisRenderer extends AbstractShapeRenderer {
21
22     private Line2D JavaDoc m_line = new Line2D.Double JavaDoc();
23     private Rectangle2D JavaDoc m_box = new Rectangle2D.Double JavaDoc();
24     
25     private int m_xalign;
26     private int m_yalign;
27     private int m_ascent;
28     
29     /**
30      * Create a new AxisRenderer. By default, axis labels are drawn along the
31      * left edge and underneath the tick marks.
32      */

33     public AxisRenderer() {
34         this(Constants.LEFT, Constants.BOTTOM);
35     }
36     
37     /**
38      * Create a new AxisRenderer.
39      * @param xalign the horizontal alignment for the axis label. One of
40      * {@link prefuse.Constants#LEFT}, {@link prefuse.Constants#RIGHT},
41      * or {@link prefuse.Constants#CENTER}.
42      * @param yalign the vertical alignment for the axis label. One of
43      * {@link prefuse.Constants#TOP}, {@link prefuse.Constants#BOTTOM},
44      * or {@link prefuse.Constants#CENTER}.
45      */

46     public AxisRenderer(int xalign, int yalign) {
47         m_xalign = xalign;
48         m_yalign = yalign;
49     }
50     
51     /**
52      * Set the horizontal alignment of axis labels.
53      * @param xalign the horizontal alignment for the axis label. One of
54      * {@link prefuse.Constants#LEFT}, {@link prefuse.Constants#RIGHT},
55      * or {@link prefuse.Constants#CENTER}.
56      */

57     public void setHorizontalAlignment(int xalign) {
58         m_xalign = xalign;
59     }
60     
61     /**
62      * Set the vertical alignment of axis labels.
63      * @param yalign the vertical alignment for the axis label. One of
64      * {@link prefuse.Constants#TOP}, {@link prefuse.Constants#BOTTOM},
65      * or {@link prefuse.Constants#CENTER}.
66      */

67     public void setVerticalAlignment(int yalign) {
68         m_yalign = yalign;
69     }
70     
71     /**
72      * @see prefuse.render.AbstractShapeRenderer#getRawShape(prefuse.visual.VisualItem)
73      */

74     protected Shape JavaDoc 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 JavaDoc label = item.getString(VisualItem.LABEL);
85         if ( label == null ) return m_line;
86         
87         FontMetrics JavaDoc 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         // get text x-coord
95
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         // get text y-coord
113
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     /**
135      * @see prefuse.render.Renderer#render(java.awt.Graphics2D, prefuse.visual.VisualItem)
136      */

137     public void render(Graphics2D JavaDoc g, VisualItem item) {
138         Shape JavaDoc s = getShape(item);
139         GraphicsLib.paint(g, item, m_line, getStroke(item), getRenderType(item));
140         
141         // check if we have a text label, if so, render it
142
if ( s == m_box ) {
143             float x = (float)m_box.getMinX();
144             float y = (float)m_box.getMinY() + m_ascent;
145             
146             // draw label background
147
GraphicsLib.paint(g, item, s, null, RENDER_TYPE_FILL);
148             
149             String JavaDoc 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     /**
157      * @see prefuse.render.Renderer#locatePoint(java.awt.geom.Point2D, prefuse.visual.VisualItem)
158      */

159     public boolean locatePoint(Point2D JavaDoc p, VisualItem item) {
160         Shape JavaDoc 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     /**
175      * @see prefuse.render.Renderer#setBounds(prefuse.visual.VisualItem)
176      */

177     public void setBounds(VisualItem item) {
178         if ( !m_manageBounds ) return;
179         Shape JavaDoc 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 } // end of class AxisRenderer
193
Popular Tags