/* * 03/21/2010 * * Copyright (C) 2010 Robert Futrell * robert_futrell at users.sourceforge.net * http://fifesoft.com/rsyntaxtextarea * * This library is distributed under a modified BSD license. See the included * RSTALanguageSupport.License.txt file for details. */ package org.fife.rsta.ac.java; import java.awt.Component; import java.awt.Graphics; import java.util.ArrayList; import java.util.List; import javax.swing.Icon; /** * An icon that can have an optional "decorations" icon beside of it. * * @author Robert Futrell * @version 1.0 */ public class DecoratableIcon implements Icon { /** * The width of this icon. */ private int width; /** * The "main" icon (the icon that is decorated). */ private Icon mainIcon; /** * The "decoration" icons. */ private List decorations; /** * Whether this icon is for a "deprecated" item. */ private boolean deprecated; /** * The width of a decoratable icon (16 + 8 + 8, - 8 for overlap). */ private static final int DEFAULT_WIDTH = 24; /** * Constructor. * * @param mainIcon The "main" icon. This cannot be <code>null</code>. */ public DecoratableIcon(Icon mainIcon) { this(DEFAULT_WIDTH, mainIcon); } /** * Constructor. * * @param width The width for this icon. * @param mainIcon The "main" icon. This cannot be <code>null</code>. */ public DecoratableIcon(int width, Icon mainIcon) { setMainIcon(mainIcon); this.width = width; } /** * Adds a decoration icon. * * @param decoration A new decoration icon. This cannot be * <code>null</code>. * @see #setMainIcon(Icon) */ public void addDecorationIcon(Icon decoration) { if (decoration==null) { throw new IllegalArgumentException("decoration cannot be null"); } if (decorations==null) { decorations = new ArrayList(1); // Usually just 1 } decorations.add(decoration); } /** * {@inheritDoc} */ public int getIconHeight() { return mainIcon.getIconHeight(); } /** * {@inheritDoc} */ public int getIconWidth() { return width; } /** * {@inheritDoc} */ public void paintIcon(Component c, Graphics g, int x, int y) { if (deprecated) { IconFactory.get().getIcon(IconFactory.DEPRECATED_ICON). paintIcon(c, g, x, y); } mainIcon.paintIcon(c, g, x, y); if (decorations!=null) { x = x + getIconWidth() - 8; for (int i=decorations.size()-1; i>=0; i--) { Icon icon = (Icon)decorations.get(i); icon.paintIcon(c, g, x, y); x -= 8; } } } /** * Sets whether this icon is for a deprecated item. * * @param deprecated Whether this icon is for a deprecated item. */ public void setDeprecated(boolean deprecated) { this.deprecated = deprecated; } /** * Sets the main icon. * * @param icon The "main" icon. This cannot be <code>null</code>. * @see #addDecorationIcon(Icon) */ public void setMainIcon(Icon icon) { if (icon==null) { throw new IllegalArgumentException("icon cannot be null"); } this.mainIcon = icon; } }