package com.revolsys.swing.action;
import java.awt.event.InputEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JMenuItem;
import javax.swing.JToggleButton;
import javax.swing.KeyStroke;
import com.revolsys.i18n.I18nCharSequence;
import com.revolsys.swing.Icons;
import com.revolsys.swing.action.enablecheck.EnableCheck;
import com.revolsys.swing.menu.Button;
import com.revolsys.swing.menu.CheckBoxMenuItem;
import com.revolsys.swing.menu.ToggleButton;
import com.revolsys.util.OS;
import com.revolsys.util.Property;
public abstract class AbstractAction extends javax.swing.AbstractAction {
private static final long serialVersionUID = 1L;
private boolean checkBox;
private EnableCheck enableCheck;
private final ActionEnabledPropertyChangeListener enabledListener = new ActionEnabledPropertyChangeListener(
this);
public AbstractAction() {
}
public AbstractAction(final CharSequence name, final String toolTip, final Icon icon) {
if (name != null) {
putValue(NAME, name.toString());
}
if (toolTip != null) {
putValue(SHORT_DESCRIPTION, toolTip.toString());
}
if (icon != null) {
putValue(SMALL_ICON, icon);
}
if (name instanceof I18nCharSequence) {
final I18nCharSequence i18nName = (I18nCharSequence)name;
i18nName.getI18n().addPropertyChangeListener("locale", new PropertyChangeListener() {
@Override
public void propertyChange(final PropertyChangeEvent evt) {
putValue(NAME, name.toString());
}
});
}
}
public Icon getDisabledIcon() {
final Icon icon = getIcon();
return Icons.getDisabledIcon(icon);
}
public EnableCheck getEnableCheck() {
return this.enableCheck;
}
public Icon getIcon() {
return (Icon)getValue(SMALL_ICON);
}
public Icon getLargeIcon() {
return (Icon)getValue(LARGE_ICON_KEY);
}
public Integer getMnemonic() {
return (Integer)getValue(MNEMONIC_KEY);
}
public String getName() {
return (String)getValue(NAME);
}
public String getToolTip() {
return (String)getValue(SHORT_DESCRIPTION);
}
public boolean isCheckBox() {
return this.checkBox;
}
@Override
public boolean isEnabled() {
if (this.enableCheck != null) {
return this.enableCheck.isEnabled();
}
return super.isEnabled();
}
public JButton newButton() {
final Button button = new Button(this);
return button;
}
public CheckBoxMenuItem newCheckboxMenuItem() {
final CheckBoxMenuItem menuItem = new CheckBoxMenuItem(this);
final Icon disabledIcon = getDisabledIcon();
menuItem.setDisabledIcon(disabledIcon);
menuItem.setEnabled(isEnabled());
return menuItem;
}
public JMenuItem newMenuItem() {
final JMenuItem menuItem = new JMenuItem(this);
final Icon disabledIcon = getDisabledIcon();
menuItem.setDisabledIcon(disabledIcon);
final boolean enabled = isEnabled();
menuItem.setEnabled(enabled);
return menuItem;
}
public JToggleButton newToggleButton() {
final ToggleButton button = new ToggleButton(this);
return button;
}
public void setAcceleratorControlKey(final int keyCode) {
int modifiers;
if (OS.isMac()) {
modifiers = InputEvent.META_MASK;
} else {
modifiers = InputEvent.CTRL_MASK;
}
setAcceleratorKey(KeyStroke.getKeyStroke(keyCode, modifiers));
setMnemonicKey(keyCode);
}
public void setAcceleratorKey(final KeyStroke keyStroke) {
putValue(ACCELERATOR_KEY, keyStroke);
}
public void setAcceleratorShiftControlKey(final int keyCode) {
int modifiers = InputEvent.SHIFT_MASK;
if (OS.isMac()) {
modifiers |= InputEvent.META_MASK;
} else {
modifiers |= InputEvent.CTRL_MASK;
}
setAcceleratorKey(KeyStroke.getKeyStroke(keyCode, modifiers));
}
protected void setCheckBox(final boolean checkBox) {
this.checkBox = checkBox;
}
public void setEnableCheck(final EnableCheck enableCheck) {
Property.removeListener(this.enableCheck, "enabled", this.enabledListener);
this.enableCheck = enableCheck;
if (this.enableCheck != null) {
Property.addListener(this.enableCheck, "enabled", this.enabledListener);
final boolean enabled = enableCheck.isEnabled();
firePropertyChange("enabled", !enabled, enabled);
}
}
public void setIcon(final Icon icon) {
putValue(SMALL_ICON, icon);
}
public void setMnemonicKey(final int key) {
putValue(MNEMONIC_KEY, key);
}
public void setName(final String name) {
putValue(NAME, name);
}
public void setToolTip(final CharSequence toolTip) {
if (toolTip == null) {
setToolTip(null);
} else {
setToolTip(toolTip.toString());
}
}
public void setToolTip(final String toolTip) {
putValue(SHORT_DESCRIPTION, toolTip);
}
@Override
public String toString() {
String name = getName();
if (name == null) {
name = getToolTip();
if (name == null) {
return super.toString();
}
}
return name;
}
}