/**
* Copyright (C) 2002-2012 The FreeCol Team
*
* This file is part of FreeCol.
*
* FreeCol is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* FreeCol is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with FreeCol. If not, see <http://www.gnu.org/licenses/>.
*/
package net.sf.freecol.client.gui.panel;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import org.freecolandroid.repackaged.javax.swing.AbstractButton;
import org.freecolandroid.repackaged.javax.swing.Action;
import org.freecolandroid.repackaged.javax.swing.Icon;
import org.freecolandroid.repackaged.javax.swing.JButton;
import net.sf.freecol.client.gui.action.ActionManager;
import net.sf.freecol.client.gui.action.FreeColAction;
/**
* A button with a set of images which is used to give commands
* to a unit with the mouse instead of the keyboard. The UnitButton
* has rollover highlighting, can be grayed out if it is unusable,
* and will use a separate image for being pressed.
* The UnitButton is useless by itself, this object needs to
* be placed on a JComponent in order to be useable.
*/
public final class UnitButton extends JButton {
private String actionId;
private ActionManager am;
/**
* The basic constructor.
* @param am The action manager which holds all FreeColAction.
* @param actionId The key for the action to be used with this button
*/
public UnitButton(ActionManager am, String actionId) {
super(am.getFreeColAction(actionId));
this.actionId = actionId;
this.am = am;
}
/**
* Refreshes the the reference to the FreeColAction stored in the
* action manager.
*/
public void refreshAction() {
setAction(null);
setAction(am.getFreeColAction(actionId));
}
protected void configurePropertiesFromAction(Action a) {
super.configurePropertiesFromAction(a);
if (a != null) {
setRolloverEnabled(true);
Icon bi = (Icon) a.getValue(FreeColAction.BUTTON_IMAGE);
setIcon(bi);
setRolloverIcon((Icon) a.getValue(FreeColAction.BUTTON_ROLLOVER_IMAGE));
setPressedIcon((Icon) a.getValue(FreeColAction.BUTTON_PRESSED_IMAGE));
setDisabledIcon((Icon) a.getValue(FreeColAction.BUTTON_DISABLED_IMAGE));
setToolTipText((String) a.getValue(FreeColAction.NAME));
setText(null);
setFocusPainted(false);
setContentAreaFilled(false);
setBorderPainted(false);
if (bi == null) {
throw new IllegalArgumentException("The given action is missing \"BUTTON_IMAGE\".");
}
setSize(bi.getIconWidth(), bi.getIconHeight());
}
}
protected PropertyChangeListener createActionPropertyChangeListener(Action a) {
return new UnitButtonActionPropertyChangeListener(this);
}
private static class UnitButtonActionPropertyChangeListener implements PropertyChangeListener {
private AbstractButton button;
UnitButtonActionPropertyChangeListener(AbstractButton button) {
this.button = button;
}
public void propertyChange(PropertyChangeEvent e) {
String propertyName = e.getPropertyName();
if (e.getPropertyName().equals(Action.NAME)
|| e.getPropertyName().equals(Action.SHORT_DESCRIPTION)) {
String text = (String) e.getNewValue();
button.setToolTipText(text);
} else if (propertyName.equals("enabled")) {
Boolean enabledState = (Boolean) e.getNewValue();
button.setEnabled(enabledState.booleanValue());
button.repaint();
} else if (e.getPropertyName().equals(Action.SMALL_ICON)) {
Icon icon = (Icon) e.getNewValue();
button.setIcon(icon);
button.repaint();
} else if (e.getPropertyName().equals(FreeColAction.BUTTON_IMAGE)) {
Icon icon = (Icon) e.getNewValue();
button.setIcon(icon);
button.repaint();
} else if (e.getPropertyName().equals(FreeColAction.BUTTON_ROLLOVER_IMAGE)) {
Icon icon = (Icon) e.getNewValue();
button.setRolloverIcon(icon);
button.repaint();
} else if (e.getPropertyName().equals(FreeColAction.BUTTON_PRESSED_IMAGE)) {
Icon icon = (Icon) e.getNewValue();
button.setPressedIcon(icon);
button.repaint();
} else if (e.getPropertyName().equals(FreeColAction.BUTTON_DISABLED_IMAGE)) {
Icon icon = (Icon) e.getNewValue();
button.setDisabledIcon(icon);
button.repaint();
} else if (e.getPropertyName().equals(Action.MNEMONIC_KEY)) {
Integer mn = (Integer) e.getNewValue();
button.setMnemonic(mn.intValue());
button.repaint();
} else if (e.getPropertyName().equals(Action.ACTION_COMMAND_KEY)) {
button.setActionCommand((String)e.getNewValue());
}
}
}
}