blob: 6f70ba558a2be804420d9d289eb004bf92e1ad0f [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 IBM Corporation and others.
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// which accompanies this distribution, and is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// Contributors:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.common.utils;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.font.FontRenderContext;
import java.awt.font.LineBreakMeasurer;
import java.awt.font.TextAttribute;
import java.awt.font.TextLayout;
import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;
import java.text.AttributedCharacterIterator;
import java.text.AttributedString;
import java.util.HashMap;
import java.util.Map;
/**
* Utility class for creating image files.
*
* @author Kelvin Low
* @since 1.0
*/
public class ImageUtil {
// The BufferedImage cache.
private static HashMap<String, BufferedImage> imageCache = new HashMap<String, BufferedImage>();
/**
* Private constructor to prevent this class from being instantiated. All
* methods in this class should be static.
*/
private ImageUtil() {
}
/**
* Creates a <code>BufferedImage</code> from the given image file.
*
* @param imageFile
* an image file
* @param c
* an AWT component
*/
public static BufferedImage getBufferedImage(String imageFile, Component c) {
if (imageFile == null || c == null) {
return null;
}
BufferedImage bufferedImage = (BufferedImage) imageCache.get(imageFile);
if (bufferedImage != null) {
return bufferedImage;
}
Image image = c.getToolkit().getImage(imageFile);
MediaTracker tracker = new MediaTracker(c);
tracker.addImage(image, 0);
try {
tracker.waitForAll();
} catch (InterruptedException e) {
}
bufferedImage = new BufferedImage(image.getWidth(c),
image.getHeight(c), BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = bufferedImage.createGraphics();
g2d.drawImage(image, 0, 0, c);
imageCache.put(imageFile, bufferedImage);
return bufferedImage;
}
/**
* Returns <code>true</code> if the given image is loaded successfully.
*
* @param image
* an AWT image
* @param c
* an AWT component
*/
public static boolean waitForImage(Image image, Component c) {
MediaTracker tracker = new MediaTracker(c);
tracker.addImage(image, 0);
try {
tracker.waitForAll();
} catch (InterruptedException ie) {
}
return (!tracker.isErrorAny());
}
/**
* Draws the given text.
*
* @param g2d
* the <code>Graphics2D</code> context
* @param text
* the text to be rendered
* @param font
* the font used for rendering the text
* @param color
* the color used for rendering the text
* @param x
* the horizontal coordinate used for rendering the text
* @param y
* the verticalcoordinate used for rendering the text
*/
public static void drawText(Graphics2D g2d, String text, Font font,
Color color, int x, int y) {
if (text == null || text.length() == 0) {
return;
}
g2d.setColor(color);
FontRenderContext frc = g2d.getFontRenderContext();
TextLayout textlayout = new TextLayout(text, font, frc);
textlayout.draw(g2d, x, y);
}
/**
* Draws the given text and wraps it based on the given width.
*
* @param g2d
* the <code>Graphics2D</code> context
* @param text
* the text to be rendered
* @param font
* the font used for rendering the text
* @param color
* the color used for rendering the text
* @param x
* the horizontal coordinate used for rendering the text
* @param y
* the verticalcoordinate used for rendering the text
* @param width
* the maximum width used for wrapping the text
* @param maxLine
* the maximum number of line of wrapped text
*/
public static void drawText(Graphics2D g2d, String text, Font font,
Color color, int x, int y, float width, int maxLine) {
if (text == null || text.length() == 0) {
return;
}
float maxWrapWidth = width - 10;
g2d.setColor(color);
Point2D.Float pen = new Point2D.Float(x, y);
Map<TextAttribute, Font> attributes = new HashMap<TextAttribute, Font>();
attributes.put(TextAttribute.FONT, font);
AttributedCharacterIterator textIterator = new AttributedString(text,
attributes).getIterator();
FontRenderContext frc = g2d.getFontRenderContext();
LineBreakMeasurer measurer = new LineBreakMeasurer(textIterator, frc);
int line = 1;
while (line <= maxLine) {
TextLayout layout = measurer.nextLayout(maxWrapWidth);
if (layout == null)
break;
pen.y += layout.getAscent();
float dx = 0;
if (layout.isLeftToRight()) {
dx = (width - layout.getAdvance());
}
layout.draw(g2d, pen.x + dx / 2, pen.y);
pen.y += layout.getDescent() + layout.getLeading() - 1;
line++;
}
}
}