001 /* ===========================================================
002 * JFreeChart : a free chart library for the Java(tm) platform
003 * ===========================================================
004 *
005 * (C) Copyright 2000-2007, by Object Refinery Limited and Contributors.
006 *
007 * Project Info: http://www.jfree.org/jfreechart/index.html
008 *
009 * This library is free software; you can redistribute it and/or modify it
010 * under the terms of the GNU Lesser General Public License as published by
011 * the Free Software Foundation; either version 2.1 of the License, or
012 * (at your option) any later version.
013 *
014 * This library is distributed in the hope that it will be useful, but
015 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
016 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
017 * License for more details.
018 *
019 * You should have received a copy of the GNU Lesser General Public
020 * License along with this library; if not, write to the Free Software
021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
022 * USA.
023 *
024 * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
025 * in the United States and other countries.]
026 *
027 * ---------------
028 * ImageTitle.java
029 * ---------------
030 * (C) Copyright 2000-2007, by David Berry and Contributors;
031 *
032 * Original Author: David Berry;
033 * Contributor(s): David Gilbert (for Object Refinery Limited);
034 *
035 * $Id: ImageTitle.java,v 1.8.2.3 2007/02/02 15:03:19 mungady Exp $
036 *
037 * Changes (from 18-Sep-2001)
038 * --------------------------
039 * 18-Sep-2001 : Added standard header (DG);
040 * 07-Nov-2001 : Separated the JCommon Class Library classes, JFreeChart now
041 * requires jcommon.jar (DG);
042 * 09-Jan-2002 : Updated Javadoc comments (DG);
043 * 07-Feb-2002 : Changed blank space around title from Insets --> Spacer, to
044 * allow for relative or absolute spacing (DG);
045 * 25-Jun-2002 : Updated import statements (DG);
046 * 23-Sep-2002 : Fixed errors reported by Checkstyle (DG);
047 * 26-Nov-2002 : Added method for drawing images at left or right (DG);
048 * 22-Sep-2003 : Added checks that the Image can never be null (TM).
049 * 11-Jan-2005 : Removed deprecated code in preparation for the 1.0.0
050 * release (DG);
051 * 02-Feb-2005 : Changed padding mechanism for all titles (DG);
052 * 20-Apr-2005 : Added new draw() method (DG);
053 * ------------- JFREECHART 1.0.x ---------------------------------------------
054 * 02-Feb-2007 : Removed author tags all over JFreeChart sources (DG);
055 *
056 */
057
058 package org.jfree.chart.title;
059
060 import java.awt.Graphics2D;
061 import java.awt.Image;
062 import java.awt.geom.Rectangle2D;
063
064 import org.jfree.chart.event.TitleChangeEvent;
065 import org.jfree.ui.HorizontalAlignment;
066 import org.jfree.ui.RectangleEdge;
067 import org.jfree.ui.RectangleInsets;
068 import org.jfree.ui.Size2D;
069 import org.jfree.ui.VerticalAlignment;
070
071 /**
072 * A chart title that displays an image. This is useful, for example, if you
073 * have an image of your corporate logo and want to use as a footnote or part
074 * of a title in a chart you create.
075 * <P>
076 * ImageTitle needs an image passed to it in the constructor. For ImageTitle
077 * to work, you must have already loaded this image from its source (disk or
078 * URL). It is recomended you use something like
079 * Toolkit.getDefaultToolkit().getImage() to get the image. Then, use
080 * MediaTracker or some other message to make sure the image is fully loaded
081 * from disk.
082 */
083 public class ImageTitle extends Title {
084
085 /** The title image. */
086 private Image image;
087
088 /**
089 * Creates a new image title.
090 *
091 * @param image the image (<code>null</code> not permitted).
092 */
093 public ImageTitle(Image image) {
094 this(image, image.getHeight(null), image.getWidth(null),
095 Title.DEFAULT_POSITION, Title.DEFAULT_HORIZONTAL_ALIGNMENT,
096 Title.DEFAULT_VERTICAL_ALIGNMENT, Title.DEFAULT_PADDING);
097 }
098
099 /**
100 * Creates a new image title.
101 *
102 * @param image the image (<code>null</code> not permitted).
103 * @param position the title position.
104 * @param horizontalAlignment the horizontal alignment.
105 * @param verticalAlignment the vertical alignment.
106 */
107 public ImageTitle(Image image, RectangleEdge position,
108 HorizontalAlignment horizontalAlignment,
109 VerticalAlignment verticalAlignment) {
110
111 this(image, image.getHeight(null), image.getWidth(null),
112 position, horizontalAlignment, verticalAlignment,
113 Title.DEFAULT_PADDING);
114 }
115
116 /**
117 * Creates a new image title with the given image scaled to the given
118 * width and height in the given location.
119 *
120 * @param image the image (<code>null</code> not permitted).
121 * @param height the height used to draw the image.
122 * @param width the width used to draw the image.
123 * @param position the title position.
124 * @param horizontalAlignment the horizontal alignment.
125 * @param verticalAlignment the vertical alignment.
126 * @param padding the amount of space to leave around the outside of the
127 * title.
128 */
129 public ImageTitle(Image image, int height, int width,
130 RectangleEdge position,
131 HorizontalAlignment horizontalAlignment,
132 VerticalAlignment verticalAlignment,
133 RectangleInsets padding) {
134
135 super(position, horizontalAlignment, verticalAlignment, padding);
136 if (image == null) {
137 throw new NullPointerException("Null 'image' argument.");
138 }
139 this.image = image;
140 setHeight(height);
141 setWidth(width);
142
143 }
144
145 /**
146 * Returns the image for the title.
147 *
148 * @return The image for the title (never <code>null</code>).
149 */
150 public Image getImage() {
151 return this.image;
152 }
153
154 /**
155 * Sets the image for the title and notifies registered listeners that the
156 * title has been modified.
157 *
158 * @param image the new image (<code>null</code> not permitted).
159 */
160 public void setImage(Image image) {
161 if (image == null) {
162 throw new NullPointerException("Null 'image' argument.");
163 }
164 this.image = image;
165 notifyListeners(new TitleChangeEvent(this));
166 }
167
168 /**
169 * Draws the title on a Java 2D graphics device (such as the screen or a
170 * printer).
171 *
172 * @param g2 the graphics device.
173 * @param titleArea the area within which the title (and plot) should be
174 * drawn.
175 */
176 public void draw(Graphics2D g2, Rectangle2D titleArea) {
177
178 RectangleEdge position = getPosition();
179 if (position == RectangleEdge.TOP || position == RectangleEdge.BOTTOM) {
180 drawHorizontal(g2, titleArea);
181 }
182 else if (position == RectangleEdge.LEFT
183 || position == RectangleEdge.RIGHT) {
184 drawVertical(g2, titleArea);
185 }
186 else {
187 throw new RuntimeException("Invalid title position.");
188 }
189 }
190
191 /**
192 * Draws the title on a Java 2D graphics device (such as the screen or a
193 * printer).
194 *
195 * @param g2 the graphics device.
196 * @param chartArea the area within which the title (and plot) should be
197 * drawn.
198 *
199 * @return The size of the area used by the title.
200 */
201 protected Size2D drawHorizontal(Graphics2D g2, Rectangle2D chartArea) {
202
203 double startY = 0.0;
204 double topSpace = 0.0;
205 double bottomSpace = 0.0;
206 double leftSpace = 0.0;
207 double rightSpace = 0.0;
208
209 double w = getWidth();
210 double h = getHeight();
211 RectangleInsets padding = getPadding();
212 topSpace = padding.calculateTopOutset(h);
213 bottomSpace = padding.calculateBottomOutset(h);
214 leftSpace = padding.calculateLeftOutset(w);
215 rightSpace = padding.calculateRightOutset(w);
216
217 if (getPosition() == RectangleEdge.TOP) {
218 startY = chartArea.getY() + topSpace;
219 }
220 else {
221 startY = chartArea.getY() + chartArea.getHeight() - bottomSpace - h;
222 }
223
224 // what is our alignment?
225 HorizontalAlignment horizontalAlignment = getHorizontalAlignment();
226 double startX = 0.0;
227 if (horizontalAlignment == HorizontalAlignment.CENTER) {
228 startX = chartArea.getX() + leftSpace + chartArea.getWidth() / 2.0
229 - w / 2.0;
230 }
231 else if (horizontalAlignment == HorizontalAlignment.LEFT) {
232 startX = chartArea.getX() + leftSpace;
233 }
234 else if (horizontalAlignment == HorizontalAlignment.RIGHT) {
235 startX = chartArea.getX() + chartArea.getWidth() - rightSpace - w;
236 }
237 g2.drawImage(this.image, (int) startX, (int) startY, (int) w, (int) h,
238 null);
239
240 return new Size2D(chartArea.getWidth() + leftSpace + rightSpace,
241 h + topSpace + bottomSpace);
242
243 }
244
245 /**
246 * Draws the title on a Java 2D graphics device (such as the screen or a
247 * printer).
248 *
249 * @param g2 the graphics device.
250 * @param chartArea the area within which the title (and plot) should be
251 * drawn.
252 *
253 * @return The size of the area used by the title.
254 */
255 protected Size2D drawVertical(Graphics2D g2, Rectangle2D chartArea) {
256
257 double startX = 0.0;
258 double topSpace = 0.0;
259 double bottomSpace = 0.0;
260 double leftSpace = 0.0;
261 double rightSpace = 0.0;
262
263 double w = getWidth();
264 double h = getHeight();
265
266 RectangleInsets padding = getPadding();
267 if (padding != null) {
268 topSpace = padding.calculateTopOutset(h);
269 bottomSpace = padding.calculateBottomOutset(h);
270 leftSpace = padding.calculateLeftOutset(w);
271 rightSpace = padding.calculateRightOutset(w);
272 }
273
274 if (getPosition() == RectangleEdge.LEFT) {
275 startX = chartArea.getX() + leftSpace;
276 }
277 else {
278 startX = chartArea.getMaxX() - rightSpace - w;
279 }
280
281 // what is our alignment?
282 VerticalAlignment alignment = getVerticalAlignment();
283 double startY = 0.0;
284 if (alignment == VerticalAlignment.CENTER) {
285 startY = chartArea.getMinY() + topSpace
286 + chartArea.getHeight() / 2.0 - h / 2.0;
287 }
288 else if (alignment == VerticalAlignment.TOP) {
289 startY = chartArea.getMinY() + topSpace;
290 }
291 else if (alignment == VerticalAlignment.BOTTOM) {
292 startY = chartArea.getMaxY() - bottomSpace - h;
293 }
294
295 g2.drawImage(this.image, (int) startX, (int) startY, (int) w, (int) h,
296 null);
297
298 return new Size2D(chartArea.getWidth() + leftSpace + rightSpace,
299 h + topSpace + bottomSpace);
300
301 }
302
303 /**
304 * Draws the block within the specified area.
305 *
306 * @param g2 the graphics device.
307 * @param area the area.
308 * @param params ignored (<code>null</code> permitted).
309 *
310 * @return Always <code>null</code>.
311 */
312 public Object draw(Graphics2D g2, Rectangle2D area, Object params) {
313 draw(g2, area);
314 return null;
315 }
316
317 }