package gnu.javax.swing.text.html; import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.io.Serializable; import javax.swing.Icon; import javax.swing.plaf.metal.MetalLookAndFeel; /** * Creates icons for ImageView. The icons reflect the basic ideas of the Sun's * icons as they would be described in the text (sheet of paper with image and * broken sheet of paper with image). They are not pixel to pixel identical and * contain elements from the metal icon factory. * * @author Audrius Meskauskas (audriusa@bioinformatics.org) */ public class ImageViewIconFactory { private static Icon noImageIcon; private static Icon loadingImageIcon; /** * This icon reflects the general concept (broken sheet of paper with * image), but is currently not pixel to pixel identical with the Sun's * implementation. */ public static class NoImageIcon implements Icon, Serializable { /** * Creates a new icon. */ public NoImageIcon() { // Nothing to do here. } /** * Returns the width of the icon, in pixels. * * @return The width of the icon. */ public int getIconWidth() { return 38; } /** * Returns the height of the icon, in pixels. * * @return The height of the icon. */ public int getIconHeight() { return 38; } /** * Paints the icon using colors from the {@link MetalLookAndFeel}. * * @param c * the component (ignored). * @param g * the graphics device. * @param x * the x-coordinate for the top-left of the icon. * @param y * the y-coordinate for the top-left of the icon. */ public void paintIcon(Component c, Graphics g, int x, int y) { // frame Color savedColor = g.getColor(); g.setColor(MetalLookAndFeel.getBlack()); g.drawLine(x, y, x + 19, y); g.drawLine(x, y + 1, x, y + 5); g.drawLine(x, y + 13, x, y + 25); g.drawLine(x, y + 25, x + 22, y + 25); g.drawLine(x + 22, y + 25, x + 22, y + 21); g.drawLine(x + 22, y + 13, x + 22, y + 6); g.drawLine(x + 22, y + 6, x + 19, y); g.drawLine(x + 17, y + 2, x + 21, y + 6); g.drawLine(x + 18, y + 1, x + 19, y + 1); g.setColor(MetalLookAndFeel.getControlShadow()); g.drawLine(x + 1, y + 1, x + 17, y + 1); g.drawLine(x + 1, y + 1, x + 1, y + 5); g.drawLine(x + 1, y + 13, x + 1, y + 24); g.drawLine(x + 1, y + 24, x + 21, y + 24); g.drawLine(x + 21, y + 24, x + 21, y + 21); g.drawLine(x + 21, y + 13, x + 21, y + 7); g.drawLine(x + 18, y + 2, x + 20, y + 4); // Breaking line // Shadow g.drawLine(x + 1, y + 6, x + 20, y + 13); g.drawLine(x + 1, y + 13, x + 20, y + 20); // Edge g.setColor(MetalLookAndFeel.getBlack()); g.drawLine(x, y + 6, x + 21, y + 14); g.drawLine(x, y + 12, x + 21, y + 20); // Picture y += 1; x += 3; g.setColor(MetalLookAndFeel.getBlack()); // roof g.drawLine(x + 4, y + 5, x + 8, y + 1); g.drawLine(x + 8, y + 1, x + 15, y + 8); // chimney g.drawLine(x + 11, y + 2, x + 11, y + 4); g.drawLine(x + 12, y + 2, x + 12, y + 5); g.setColor(MetalLookAndFeel.getControlDarkShadow()); // roof paint int xx = x + 8; for (int i = 0; i < 4; i++) g.drawLine(xx - i, y + 2 + i, xx + i, y + 2 + i); g.fillRect(x + 4, y + 6, 9, 2); // base of house g.drawLine(x + 3, y + 14, x + 3, y + 18); g.drawLine(x + 3, y + 18, x + 13, y + 18); g.setColor(savedColor); } } /** * This icon reflects the general concept (sheet of paper with image), but is * currently not pixel to pixel identical with the Sun's implementation. */ public static class LoadingImageIcon implements Icon, Serializable { /** * Creates a new icon. */ public LoadingImageIcon() { // Nothing to do here. } /** * Returns the width of the icon, in pixels. * * @return The width of the icon. */ public int getIconWidth() { return 38; } /** * Returns the height of the icon, in pixels. * * @return The height of the icon. */ public int getIconHeight() { return 38; } /** * Paints the icon using colors from the {@link MetalLookAndFeel}. * * @param c * the component (ignored). * @param g * the graphics device. * @param x * the x-coordinate for the top-left of the icon. * @param y * the y-coordinate for the top-left of the icon. */ public void paintIcon(Component c, Graphics g, int x, int y) { // frame Color savedColor = g.getColor(); g.setColor(Color.black); g.drawLine(x, y, x + 19, y); g.drawLine(x, y + 1, x, y + 25); g.drawLine(x, y + 25, x + 22, y + 25); g.drawLine(x + 22, y + 25, x + 22, y + 6); g.drawLine(x + 22, y + 6, x + 19, y); g.drawLine(x + 17, y + 2, x + 21, y + 6); g.drawLine(x + 18, y + 1, x + 19, y + 1); g.setColor(new Color(204, 204, 255)); g.drawLine(x + 1, y + 1, x + 17, y + 1); g.drawLine(x + 1, y + 1, x + 1, y + 24); g.drawLine(x + 1, y + 24, x + 21, y + 24); g.drawLine(x + 21, y + 24, x + 21, y + 7); g.drawLine(x + 18, y + 2, x + 20, y + 4); // Picture (house) y += 3; x += 3; g.setColor(MetalLookAndFeel.getBlack()); // roof g.drawLine(x + 1, y + 8, x + 8, y + 1); g.drawLine(x + 8, y + 1, x + 15, y + 8); // base of house g.drawLine(x + 3, y + 6, x + 3, y + 15); g.drawLine(x + 3, y + 15, x + 13, y + 15); g.drawLine(x + 13, y + 6, x + 13, y + 15); // door frame g.drawLine(x + 6, y + 9, x + 6, y + 15); g.drawLine(x + 6, y + 9, x + 10, y + 9); g.drawLine(x + 10, y + 9, x + 10, y + 15); // chimney g.drawLine(x + 11, y + 2, x + 11, y + 4); g.drawLine(x + 12, y + 2, x + 12, y + 5); g.setColor(MetalLookAndFeel.getControlDarkShadow()); // roof paint int xx = x + 8; for (int i = 0; i < 4; i++) g.drawLine(xx - i, y + 2 + i, xx + i, y + 2 + i); g.fillRect(x + 4, y + 6, 9, 2); // door knob g.drawLine(x + 9, y + 12, x + 9, y + 12); // house paint g.setColor(MetalLookAndFeel.getPrimaryControl()); g.drawLine(x + 4, y + 8, x + 12, y + 8); g.fillRect(x + 4, y + 9, 2, 6); g.fillRect(x + 11, y + 9, 2, 6); g.setColor(savedColor); } } public static Icon getNoImageIcon() { if (noImageIcon == null) noImageIcon = new NoImageIcon(); return noImageIcon; } public static Icon getLoadingImageIcon() { if (loadingImageIcon == null) loadingImageIcon = new LoadingImageIcon(); return loadingImageIcon; } }