package com.limegroup.gnutella.gui;
import java.awt.Dimension;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.SwingConstants;
import com.limegroup.gnutella.gui.actions.LimeAction;
import com.limegroup.gnutella.settings.UISettings;
/**
* A JButton that uses an Icon.
*/
public class IconButton extends JButton {
private String message;
private String iconName;
/**
* The super constructors of JButton call {@link #updateUI()} before we
* had a chance to set our values. So ignore these calls in
* {@link #updateButton()}.
*/
private boolean initialized;
private PropertyChangeListener listener = null;
/**
* Constructs a new IconButton with the given text & icon name.
*/
public IconButton(String text, String iconName) {
setRolloverEnabled(true);
this.iconName = iconName;
this.message = text;
initialized = true;
updateButton();
}
/**
* Constructs an IconButton for an action.
* <p>
* Actions must provide a value for the key {@link LimeAction#ICON_NAME}
* and can provide a short name which is shown below the icon with
* {@link LimeAction#SHORT_NAME}. If the short name is not provided it'll
* fall back on {@link Action#NAME}.
* @param action
*/
public IconButton(Action action) {
super(action);
setRolloverEnabled(true);
initialized = true;
}
/**
* Overriden for internal reasons, no api changes.
*/
public void setAction(Action a) {
Action oldAction = getAction();
if (oldAction != null) {
oldAction.removePropertyChangeListener(getListener());
}
super.setAction(a);
setButtonFromAction(a);
a.addPropertyChangeListener(getListener());
}
private void setButtonFromAction(Action action) {
iconName = (String)action.getValue(LimeAction.ICON_NAME);
message = (String)action.getValue(LimeAction.SHORT_NAME);
// fall back on Action.NAME
if (message == null) {
message = (String)action.getValue(Action.NAME);
}
updateButton();
}
private PropertyChangeListener getListener() {
if (listener == null) {
listener = new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
setButtonFromAction((Action)evt.getSource());
}
};
}
return listener;
}
/**
* Updates the UI, possibly changing the icons or text.
*/
public void updateUI() {
super.updateUI();
updateButton();
}
/**
* Updates the text of the icon.
*/
public void setText(String text) {
message = text;
updateButton();
}
/**
* Updates the button.
*/
private void updateButton() {
if (!initialized)
return;
Icon icon = IconManager.instance().getIconForButton(iconName);
if(icon == null) {
super.setText(message);
setVerticalTextPosition(SwingConstants.CENTER);
setHorizontalTextPosition(SwingConstants.CENTER);
setContentAreaFilled(true);
setBorderPainted(true);
setOpaque(true);
} else {
super.setIcon(icon);
Icon rollover =
IconManager.instance().getRolloverIconForButton(iconName);
super.setRolloverIcon(rollover);
if(UISettings.TEXT_WITH_ICONS.getValue() &&
message != null && !message.equals("")) {
super.setText(message);
setPreferredSize(null);
} else {
super.setText(null);
int height = icon.getIconHeight() + 15;
int width = icon.getIconWidth() + 15;
if(message != null && message.equals("")) {
height = icon.getIconHeight();
width = icon.getIconWidth();
}
setPreferredSize(new Dimension(height, width));
}
setVerticalTextPosition(SwingConstants.BOTTOM);
setHorizontalTextPosition(SwingConstants.CENTER);
setContentAreaFilled(false);
setBorderPainted(false);
setOpaque(false);
}
}
}