001 /*
002 * $Id: TextPainter.java,v 1.5 2006/04/26 02:14:26 joshy Exp $
003 *
004 * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
005 * Santa Clara, California 95054, U.S.A. All rights reserved.
006 *
007 * This library is free software; you can redistribute it and/or
008 * modify it under the terms of the GNU Lesser General Public
009 * License as published by the Free Software Foundation; either
010 * version 2.1 of the License, or (at your option) any later version.
011 *
012 * This library is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015 * Lesser General Public License for more details.
016 *
017 * You should have received a copy of the GNU Lesser General Public
018 * License along with this library; if not, write to the Free Software
019 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
020 */
021
022 package org.jdesktop.swingx.painter;
023
024 import java.awt.Color;
025 import java.awt.Font;
026 import java.awt.FontMetrics;
027 import java.awt.Graphics2D;
028 import java.awt.Paint;
029 import java.awt.geom.Point2D;
030 import javax.swing.JComponent;
031 import org.jdesktop.swingx.util.Resize;
032
033 /**
034 * "Paints" text at the given location. The location should be a point where
035 * the x and y values are in the range of 0 to 1. Similar to the CSS background
036 * positioning algorithm, each value will be scaled along each axis of the component
037 * this TextPainter is painting, and then used to position the text. A value of
038 * 0,0 would put the text in the upper lefthand corner. 0.5,0.5 would position the
039 * text in the center and 1.0,1.0 would be at the lower righthand corner. For a more
040 * complete defintion of the positioning algorithm see the
041 * <a href="http://www.w3.org/TR/CSS21/colors.html#propdef-background-position">CSS 2.1 spec</a>.
042 *
043 * @author rbair
044 */
045 public class TextPainter extends AbstractPainter {
046 private Resize resize;
047 private String text = "";
048 private Font font;
049 private Paint paint;
050 private Point2D location = new Point2D.Double(.0, .0);
051
052 /** Creates a new instance of TextPainter */
053 public TextPainter() {
054 }
055
056 public TextPainter(String text) {
057 this(text, new Font("Dialog", Font.PLAIN, 12));
058 }
059
060 public TextPainter(String text, Font font) {
061 this(text, font, Color.BLACK);
062 }
063
064 public TextPainter(String text, Font font, Paint paint) {
065 this.text = text;
066 this.font = font;
067 this.paint = paint;
068 }
069
070 public void setFont(Font f) {
071 Font old = getFont();
072 this.font = f;
073 firePropertyChange("font", old, getFont());
074 }
075
076 public Font getFont() {
077 return font;
078 }
079
080 public void setText(String text) {
081 String old = getText();
082 this.text = text == null ? "" : text;
083 firePropertyChange("text", old, getText());
084 }
085
086 public String getText() {
087 return text;
088 }
089
090 public void setPaint(Paint paint) {
091 Paint old = getPaint();
092 this.paint = paint;
093 firePropertyChange("paint", old, getPaint());
094 }
095
096 public Paint getPaint() {
097 return paint;
098 }
099
100 public void setLocation(Point2D location) {
101 Point2D old = getLocation();
102 this.location = location == null ? new Point2D.Double(.0, .0) : location;
103 firePropertyChange("location", old, getLocation());
104 }
105
106 public Point2D getLocation() {
107 return location;
108 }
109
110 protected void paintBackground(Graphics2D g, JComponent component) {
111 Font font = getFont();
112 if (font != null) {
113 g.setFont(font);
114 }
115
116 Paint paint = getPaint();
117 if (paint != null) {
118 g.setPaint(paint);
119 }
120
121 FontMetrics metrics = g.getFontMetrics(g.getFont());
122 String text = getText();
123
124 Point2D location = getLocation();
125 int tw = metrics.stringWidth(text);
126 int th = metrics.getHeight();
127 double x = location.getX() * (component.getWidth()-tw);
128 double y = location.getY() * (component.getHeight()-th);
129 y += metrics.getAscent();
130
131 //double stringWidth = SwingUtilities.computeStringWidth(metrics, text);
132 //x -= stringWidth/2;
133 g.drawString(text, (float)x, (float)y);
134 }
135 }