package org.limewire.ui.swing.components;
import java.awt.Insets;
import java.awt.event.MouseListener;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.SwingConstants;
import org.limewire.ui.swing.action.AbstractAction;
import org.limewire.ui.swing.listener.ActionHandListener;
public class IconButton extends JButton {
private MouseListener actionHandListener;
public IconButton() {
init();
}
public IconButton(Action a) {
super(a);
init();
}
public IconButton(Icon icon) {
super(icon);
init();
}
public IconButton(String text, Icon icon) {
super(text, icon);
init();
}
public IconButton(Icon icon, Icon rolloverIcon) {
super(icon);
init();
setRolloverIcon(rolloverIcon);
}
public IconButton(Icon icon, Icon rolloverIcon, Icon pressedIcon) {
super(icon);
init();
setRolloverIcon(rolloverIcon);
setPressedIcon(pressedIcon);
}
public IconButton(Icon icon, Icon rolloverIcon, Icon pressedIcon, Icon selectedIcon) {
super(icon);
init();
setRolloverIcon(rolloverIcon);
setPressedIcon(pressedIcon);
setSelectedIcon(selectedIcon);
}
@Override
public void setIcon(Icon defaultIcon) {
super.setIcon(defaultIcon);
if(getSelectedIcon() == null || getSelectedIcon() instanceof CustomShiftedIcon) {
if(defaultIcon == null) {
setSelectedIcon(null);
} else {
setSelectedIcon(new CustomShiftedIcon(1, 1, defaultIcon));
}
}
}
/** Sets all properties to make the button look like an icon button. */
public static void setIconButtonProperties(JButton button) {
button.setMargin(new Insets(0, 0, 0, 0));
button.setBorderPainted(false);
button.setContentAreaFilled(false);
button.setFocusPainted(false);
button.setRolloverEnabled(false);
button.setHideActionText(true);
button.setBorder(BorderFactory.createEmptyBorder());
button.setOpaque(false);
button.setHorizontalTextPosition(SwingConstants.CENTER);
button.setVerticalTextPosition(SwingConstants.BOTTOM);
button.setIconTextGap(2);
}
private void init() {
setIconButtonProperties(this);
actionHandListener = new ActionHandListener();
addMouseListener(actionHandListener);
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
ActionHandListener.setActionHandDrawingDisabled(this, !enabled);
}
public void removeActionHandListener() {
removeMouseListener(actionHandListener);
}
public void resetDefaultCursor() {
ActionHandListener.resetDefaultCursor(this);
}
@Override
protected void configurePropertiesFromAction(Action a) {
super.configurePropertiesFromAction(a);
if (hasSelectedKey(a)) {
setSelectedFromAction(a);
}
Icon icon = (Icon)a.getValue(AbstractAction.PRESSED_ICON);
if(icon != null) {
setPressedIcon(icon);
}
icon = (Icon)a.getValue(AbstractAction.ROLLOVER_ICON);
if(icon != null) {
setRolloverIcon(icon);
}
}
@Override
protected void actionPropertyChanged(Action action, String propertyName) {
super.actionPropertyChanged(action, propertyName);
if (propertyName == Action.SELECTED_KEY && hasSelectedKey(action)) {
setSelectedFromAction(action);
} else if (propertyName == AbstractAction.PRESSED_ICON) {
setPressedIcon((Icon)action.getValue(AbstractAction.PRESSED_ICON));
} else if (propertyName == AbstractAction.ROLLOVER_ICON) {
setRolloverIcon((Icon)action.getValue(AbstractAction.ROLLOVER_ICON));
}
}
/** Sets the selected state of the button from the action. */
private void setSelectedFromAction(Action a) {
boolean selected = false;
if (a != null) {
selected = Boolean.TRUE.equals(a.getValue(Action.SELECTED_KEY));
}
if (selected != isSelected()) {
setSelected(selected);
}
}
private static boolean hasSelectedKey(Action a) {
return (a != null && a.getValue(Action.SELECTED_KEY) != null);
}
/** An extension so we can check instanceof for our custom selected icons. */
private static class CustomShiftedIcon extends ShiftedIcon {
public CustomShiftedIcon(int shiftWidth, int shiftHeight, Icon icon) {
super(shiftWidth, shiftHeight, icon);
}
}
}