/*
* LayeredIcon.java
* 2006-08-09
*/
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Insets;
import java.util.ArrayList;
import javax.swing.Icon;
import javax.swing.SwingConstants;
/**
* @author Christopher Bach
*/
public class LayeredIcon implements Icon {
public static final int TOP = SwingConstants.TOP, LEFT = SwingConstants.LEFT,
BOTTOM = SwingConstants.BOTTOM, RIGHT = SwingConstants.RIGHT, CENTER = SwingConstants.CENTER;
private Dimension ourPrefSize = new Dimension(0, 0);
private ArrayList ourLayers = new ArrayList();
private Insets ourPadding = new Insets(0, 0, 0, 0);
/**
*
*/
public LayeredIcon() {
}
/**
*
*/
public LayeredIcon(int padding) {
setPadding(padding, padding, padding, padding);
}
/**
* Creates a new instance of LayeredIcon with the specified width and height,
* but no graphic.
*/
public LayeredIcon(int width, int height) {
setIconSize(width, height);
}
/**
*
*/
public LayeredIcon(int width, int height, int padding) {
setIconSize(width, height);
setPadding(padding, padding, padding, padding);
}
/**
*
*/
public LayeredIcon(int topPadding, int leftPadding, int bottomPadding, int rightPadding) {
setPadding(topPadding, leftPadding, bottomPadding, rightPadding);
}
/**
*
*/
public LayeredIcon(int width, int height, int topPadding, int leftPadding, int bottomPadding,
int rightPadding) {
setIconSize(width, height);
setPadding(topPadding, leftPadding, bottomPadding, rightPadding);
}
/**
* If any client Icons have been added and painting is enabled, paints the
* client Icons at the specified coordinates into the provided graphics
* context for the indicated Component.
*/
public void paintIcon(Component c, Graphics g, int x, int y) {
Dimension iconSize = getIconSize();
for (int i = 0, size = ourLayers.size(); i < size; i++) {
Layer layer = (Layer) ourLayers.get(i);
if (layer.painted) {
int w = layer.icon.getIconWidth();
int h = layer.icon.getIconHeight();
int dx = (layer.halign == LEFT ? 0 : iconSize.width - w);
if (layer.halign != RIGHT)
dx = dx / 2;
dx += ourPadding.left;
int dy = (layer.valign == TOP ? 0 : iconSize.height - h);
if (layer.valign != BOTTOM)
dy = dy / 2;
dy += ourPadding.top;
layer.icon.paintIcon(c, g, x + dx, y + dy);
}
}
}
/**
* Returns the width of the LayeredIcon. If any client Icons have been added,
* returns the max width of all client Icons. Otherwise, returns the
* LayeredIcon's explicit width.
*/
public int getIconWidth() {
return getIconSize().width + ourPadding.left + ourPadding.right;
}
/**
* Returns the height of the LayeredIcon. If any client Icons have been added,
* returns the max height of all client Icons. Otherwise, returns the
* LayeredIcon's explicit height.
*/
public int getIconHeight() {
return getIconSize().height + ourPadding.top + ourPadding.bottom;
}
/**
* Sets the explicit size of the LayeredIcon to be used when no client Icons
* have been added.
*/
public void setIconSize(int width, int height) {
ourPrefSize.width = width;
ourPrefSize.height = height;
}
/**
*
*/
public void setPadding(int padding) {
ourPadding.top = padding;
ourPadding.left = padding;
ourPadding.bottom = padding;
ourPadding.right = padding;
}
/**
*
*/
public void setPadding(int topPadding, int leftPadding, int bottomPadding, int rightPadding) {
ourPadding.top = topPadding;
ourPadding.left = leftPadding;
ourPadding.bottom = bottomPadding;
ourPadding.right = rightPadding;
}
/**
*
*/
public Insets getPadding() {
return new Insets(ourPadding.top, ourPadding.left, ourPadding.bottom, ourPadding.right);
}
/**
*
*/
public void addIcon(Icon icon) {
if (icon != null) {
ourLayers.add(new Layer(icon));
}
}
/**
*
*/
public void addIcon(Icon icon, int index) {
if (icon != null && index >= 0 && index <= ourLayers.size()) {
ourLayers.add(index, new Layer(icon));
}
}
/**
*
*/
public void addIcon(Icon icon, int halign, int valign) {
if (icon != null) {
ourLayers.add(new Layer(icon, checkHAlign(halign), checkVAlign(valign)));
}
}
/**
*
*/
public void addIcon(Icon icon, int index, int halign, int valign) {
if (icon != null && index >= 0 && index <= ourLayers.size()) {
ourLayers.add(index, new Layer(icon, checkHAlign(halign), checkVAlign(valign)));
}
}
/**
*
*/
public void removeIcon(Icon icon) {
Layer layer = getLayer(icon);
if (layer != null) {
ourLayers.remove(layer);
}
}
/**
*
*/
public void clear() {
ourLayers.clear();
}
/**
*
*/
public Icon getIcon(int index) {
Layer layer = (Layer) ourLayers.get(index);
if (layer != null)
return layer.icon;
else
return null;
}
/**
*
*/
public int indexOf(Icon icon) {
for (int i = 0, size = ourLayers.size(); i < size; i++) {
Layer layer = (Layer) ourLayers.get(i);
if (layer.icon == icon)
return i;
}
return -1;
}
/**
*
*/
public int iconCount() {
return ourLayers.size();
}
/**
*
*/
public boolean isIconPainted(int iconIndex) {
Layer layer = (Layer) ourLayers.get(iconIndex);
if (layer != null)
return layer.painted;
else
return false;
}
/**
*
*/
public void setIconPainted(int iconIndex, boolean painted) {
Layer layer = (Layer) ourLayers.get(iconIndex);
if (layer != null)
layer.painted = painted;
}
/**
*
*/
public boolean isIconPainted(Icon icon) {
Layer layer = getLayer(icon);
if (layer != null)
return layer.painted;
else
return false;
}
/**
*
*/
public void setIconPainted(Icon icon, boolean painted) {
Layer layer = getLayer(icon);
if (layer != null)
layer.painted = painted;
}
/**
*
*/
public void setIconAlignment(Icon icon, int halign, int valign) {
Layer layer = getLayer(icon);
if (layer != null) {
layer.halign = checkHAlign(halign);
layer.valign = checkVAlign(valign);
}
}
/**
*
*/
public void setIconAlignment(int iconIndex, int halign, int valign) {
Layer layer = (Layer) ourLayers.get(iconIndex);
if (layer != null) {
layer.halign = checkHAlign(halign);
layer.valign = checkVAlign(valign);
}
}
/**
*
*/
public int getIconHAlignment(Icon icon) {
Layer layer = getLayer(icon);
if (layer != null)
return layer.halign;
else
return CENTER;
}
/**
*
*/
public int getIconVAlignment(Icon icon) {
Layer layer = getLayer(icon);
if (layer != null)
return layer.valign;
else
return CENTER;
}
/**
*
*/
public int getIconHAlignment(int iconIndex) {
Layer layer = (Layer) ourLayers.get(iconIndex);
if (layer != null)
return layer.halign;
else
return CENTER;
}
/**
*
*/
public int getIconVAlignment(int iconIndex) {
Layer layer = (Layer) ourLayers.get(iconIndex);
if (layer != null)
return layer.valign;
else
return CENTER;
}
/**
*
*/
private int checkHAlign(int halign) {
if (halign != LEFT && halign != RIGHT && halign != CENTER)
return CENTER;
else
return halign;
}
/**
*
*/
private int checkVAlign(int valign) {
if (valign != TOP && valign != BOTTOM && valign != CENTER)
return CENTER;
else
return valign;
}
/**
*
*/
private Layer getLayer(Icon icon) {
for (int i = 0, size = ourLayers.size(); i < size; i++) {
Layer layer = (Layer) ourLayers.get(i);
if (layer.icon == icon)
return layer;
}
return null;
}
/**
*
*/
private Dimension getIconSize() {
if (ourLayers.size() == 0)
return ourPrefSize;
Dimension d = new Dimension(0, 0);
for (int i = 0, size = ourLayers.size(); i < size; i++) {
Layer layer = (Layer) ourLayers.get(i);
d.height = Math.max(d.height, layer.icon.getIconHeight());
d.width = Math.max(d.width, layer.icon.getIconWidth());
}
return d;
}
/**
*
*/
private class Layer {
public Icon icon = null;
public boolean painted = true;
public int halign = CENTER;
public int valign = CENTER;
public Layer() {
}
public Layer(Icon icon) {
this.icon = icon;
}
public Layer(Icon icon, int halign, int valign) {
this.icon = icon;
this.halign = halign;
this.valign = valign;
}
}
}