/**
* @(#)DualIcon.java 1.0 03/18/09
*/
package darrylbu.renderer;
import java.awt.Component;
import java.awt.Graphics;
import javax.swing.Icon;
import javax.swing.SwingConstants;
/**
* A composite Icon class used to compose two Icon objects into a single Icon
* by painting the icons in turn at the precomputed offsets. For example,
* this class may be used to add a custom icon to a component like JCheckBox
* or JRadioButton, in addition to the default icon provided by the
* Look and Feel.
*
* @version 1.0 03/11/09
* @author Darryl
*/
public class DualIcon implements Icon, SwingConstants {
Icon icon1;
Icon icon2;
private int width;
private int height;
private int icon1HOffset;
private int icon1VOffset;
private int icon2HOffset;
private int icon2VOffset;
private int iconIconGap;
/**
* Creates a DualIcon with the specified icons, the default
* horizontal and vertical positioning and default gap.
* icon2 is positioned to the right of icon1
* with a 4 pixel gap, and the vertical centers of the icons are aligned.
*
* @param icon1 the first icon
* @param icon2 the second icon
*/
public DualIcon(Icon icon1, Icon icon2) {
this(icon1, icon2, RIGHT, CENTER, 4);
}
/**
* Creates a DualIcon with the specified icons, the specified
* horizontal and vertical positioning and the specified gap.
*
* @param icon1 the first icon
* @param icon2 the second icon
* @param horizontalPosition of the second icon relative to the first.
*
* One of the following values:
*
* @param verticalPosition of the second icon relative to the first.
*
* One of the following values:
*
* @param iconIconGap the gap between the icons in pizels, ignored if the
* horizontalPosition and verticalPosition are both
* SwingConstants.CENTER.
*/
public DualIcon(Icon icon1, Icon icon2,
int horizontalPosition, int verticalPosition, int iconIconGap) {
if (icon1 == null || icon2 == null) {
throw new NullPointerException("Icons cannot be null");
}
horizontalPosition = checkHorizontalKey(horizontalPosition,
"horizontalPosition");
verticalPosition = checkVerticalKey(verticalPosition,
"verticalPosition");
this.icon1 = icon1;
this.icon2 = icon2;
this.iconIconGap = iconIconGap;
if (horizontalPosition == CENTER) {
width = Math.max(icon1.getIconWidth(),
icon2.getIconWidth());
} else {
width = icon1.getIconWidth() + iconIconGap +
icon2.getIconWidth();
}
if (verticalPosition == CENTER || horizontalPosition != CENTER) {
height = Math.max(icon1.getIconHeight(),
icon2.getIconHeight());
} else {
height = icon1.getIconHeight() + iconIconGap +
icon2.getIconHeight();
}
switch (horizontalPosition) {
case LEFT:
icon1HOffset = 0;
icon2HOffset = icon1.getIconWidth() + iconIconGap;
break;
case CENTER:
icon1HOffset = (width - icon1.getIconWidth()) / 2;
icon2HOffset = (width - icon2.getIconWidth()) / 2;
break;
case RIGHT:
icon1HOffset = icon2.getIconWidth() + iconIconGap;
icon2HOffset = 0;
break;
}
if (verticalPosition == CENTER) {
icon1VOffset = (height - icon1.getIconHeight()) / 2;
icon2VOffset = (height - icon2.getIconHeight()) / 2;
} else {
if (horizontalPosition == CENTER) {
icon1VOffset = verticalPosition == TOP
? 0 : icon2.getIconHeight() + iconIconGap;
icon2VOffset = verticalPosition == TOP
? icon1.getIconHeight() + iconIconGap : 0;
} else {
icon1VOffset = verticalPosition == TOP
? 0 : height - icon1.getIconHeight();
icon2VOffset = verticalPosition == TOP
? 0 : height - icon2.getIconHeight();
}
}
}
/**
* Paints the icons of this compound icon at the specified location
* with the precomputed offsets.
*
* @param c The component to which the icon is painted, which may be used
* to get properties useful for painting, e.g. the foreground or background
* color or selection status.
* @param g the graphics context
* @param x the X coordinate of the compound icon's top-left corner
* @param y the Y coordinate of the compound icon's top-left corner
*/
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
icon1.paintIcon(c, g,
x + icon1HOffset, y + icon1VOffset);
icon2.paintIcon(c, g,
x + icon2HOffset, y + icon2VOffset);
}
/**
* Gets the width of the bounding rectangle of this
* DualIcon.
*
* @return the width in pixels
*/
@Override
public int getIconWidth() {
return width;
}
/**
* Gets the height of the the bounding rectangle of this
* DualIcon.
*
* @return the height in pixels
*/
@Override
public int getIconHeight() {
return height;
}
private int checkHorizontalKey(int key, String exception) {
if ((key == LEFT) || (key == CENTER) || (key == RIGHT)) {
return key;
} else {
throw new IllegalArgumentException(exception);
}
}
private int checkVerticalKey(int key, String exception) {
if ((key == TOP) || (key == CENTER) || (key == BOTTOM)) {
return key;
} else {
throw new IllegalArgumentException(exception);
}
}
}