package com.revolsys.swing.action;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenuItem;
import com.revolsys.i18n.I18nCharSequence;
import com.revolsys.swing.Icons;
import com.revolsys.swing.action.enablecheck.EnableCheck;
import com.revolsys.swing.menu.AbstractActionMainMenuItemFactory;
import com.revolsys.swing.parallel.Invoke;
public class RunnableAction extends AbstractActionMainMenuItemFactory {
private static final long serialVersionUID = -5339626097125548212L;
public static JButton newButton(final CharSequence name, final String toolTip, final Icon icon,
final Runnable runnable) {
final RunnableAction action = new RunnableAction(name, toolTip, icon, true, runnable);
return action.newButton();
}
public static JButton newButton(final String name, final EnableCheck enableCheck,
final Runnable runnable) {
final RunnableAction action = new RunnableAction(name, name, null, enableCheck, runnable);
return action.newButton();
}
public static JButton newButton(final String name, final Runnable runnable) {
final RunnableAction action = new RunnableAction(name, runnable);
return action.newButton();
}
public static JCheckBoxMenuItem newCheckBoxMenuItem(final String name, final Runnable runnable) {
final RunnableAction action = new RunnableAction(name, runnable);
action.setCheckBox(true);
return (JCheckBoxMenuItem)action.newComponent();
}
public static JMenuItem newMenuItem(final String name, final Icon icon, final Runnable runnable) {
final RunnableAction action = new RunnableAction(name, icon, runnable);
return action.newComponent();
}
public static JMenuItem newMenuItem(final String name, final Runnable runnable) {
final RunnableAction action = new RunnableAction(name, runnable);
return action.newComponent();
}
public static JMenuItem newMenuItem(final String name, final String iconName,
final Runnable runnable) {
final Icon icon = Icons.getIcon(iconName);
final RunnableAction action = new RunnableAction(name, icon, runnable);
action.setIconName(iconName);
return action.newComponent();
}
private String iconName;
private boolean invokeLater;
private Runnable runnable;
public RunnableAction() {
}
public RunnableAction(final CharSequence name, final boolean invokeLater,
final Runnable runnable) {
this(name, null, invokeLater, runnable);
}
public RunnableAction(final CharSequence name, final Icon icon, final boolean invokeLater,
final Runnable runnable) {
this.runnable = runnable;
this.invokeLater = invokeLater;
if (name != null) {
putValue(NAME, name.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 RunnableAction(final CharSequence name, final Icon icon, final Runnable runnable) {
this(name, icon, false, runnable);
};
public RunnableAction(final CharSequence name, final Runnable runnable) {
this(name, null, false, runnable);
}
public RunnableAction(final CharSequence name, final String toolTip, final Icon icon,
final boolean invokeLater, final Runnable runnable) {
this.runnable = runnable;
this.invokeLater = invokeLater;
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 RunnableAction(final CharSequence name, final String toolTip, final Icon icon,
final EnableCheck enableCheck, final Runnable runnable) {
this(name, toolTip, icon, true, runnable);
setEnableCheck(enableCheck);
}
public RunnableAction(final CharSequence name, final String toolTip, final Icon icon,
final Runnable runnable) {
this(name, toolTip, icon, true, runnable);
}
public RunnableAction(final Icon icon, final boolean invokeLater, final Runnable runnable) {
this(null, icon, invokeLater, runnable);
}
public RunnableAction(final Icon icon, final Runnable runnable) {
this(null, icon, false, runnable);
}
public RunnableAction(final Runnable runnable) {
this(null, null, false, runnable);
}
@Override
public void actionPerformed(final ActionEvent event) {
if (this.invokeLater) {
Invoke.later(this.runnable);
} else {
this.runnable.run();
}
}
@Override
public String getIconName() {
return this.iconName;
}
public void setIconName(final String iconName) {
this.iconName = iconName;
}
@Override
public String toString() {
return super.toString();
}
}