package com.revolsys.swing.action;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.NoSuchElementException;
import java.util.function.Consumer;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenuItem;
import org.apache.log4j.Logger;
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 ConsumerAction extends AbstractActionMainMenuItemFactory {
private static final long serialVersionUID = -5339626097125548212L;
public static ConsumerAction action(final CharSequence name, final String toolTip,
final Icon icon, final Consumer<ActionEvent> handler) {
return action(name, toolTip, icon, null, true, handler);
}
public static ConsumerAction action(final CharSequence name, final String toolTip,
final Icon icon, final EnableCheck enableCheck, final boolean invokeLater,
final Consumer<ActionEvent> handler) {
final ConsumerAction action = new ConsumerAction(name, toolTip, icon, enableCheck, invokeLater,
handler);
return action;
}
public static ConsumerAction action(final String name, final Consumer<ActionEvent> handler) {
return action(name, null, null, null, true, handler);
}
public static ConsumerAction action(final String toolTip, final Icon icon,
final Consumer<ActionEvent> handler) {
return action(null, toolTip, icon, null, true, handler);
}
public static ConsumerAction action(final String toolTip, final Icon icon,
final EnableCheck enableCheck, final Consumer<ActionEvent> handler) {
return action(null, toolTip, icon, enableCheck, true, handler);
}
public static JButton button(final CharSequence name, final String toolTip, final Icon icon,
final Consumer<ActionEvent> handler) {
return button(name, toolTip, icon, null, true, handler);
}
public static JButton button(final CharSequence name, final String toolTip, final Icon icon,
final EnableCheck enableCheck, final boolean invokeLater, final Consumer<ActionEvent> handler) {
final ConsumerAction action = new ConsumerAction(name, toolTip, icon, enableCheck, invokeLater,
handler);
return action.newButton();
}
public static JButton button(final Icon icon, final String toolTip,
final Consumer<ActionEvent> handler) {
return button(null, toolTip, icon, null, true, handler);
}
public static JButton button(final String name, final Consumer<ActionEvent> handler) {
return button(name, null, null, null, true, handler);
}
public static JCheckBoxMenuItem checkBoxMenuItem(final CharSequence name, final String toolTip,
final Icon icon, final EnableCheck enableCheck, final boolean invokeLater,
final Consumer<ActionEvent> handler) {
final ConsumerAction action = new ConsumerAction(name, toolTip, icon, enableCheck, invokeLater,
handler);
return action.newCheckboxMenuItem();
}
public static JCheckBoxMenuItem checkBoxMenuItem(final String name,
final Consumer<ActionEvent> handler) {
return checkBoxMenuItem(name, null, null, null, false, handler);
}
public static JMenuItem menuItem(final CharSequence name, final String toolTip, final Icon icon,
final EnableCheck enableCheck, final boolean invokeLater, final Consumer<ActionEvent> handler) {
final ConsumerAction action = new ConsumerAction(name, toolTip, icon, enableCheck, invokeLater,
handler);
return action.newMenuItem();
}
public static JMenuItem menuItem(final String name, final Consumer<ActionEvent> handler) {
return menuItem(name, null, null, null, false, handler);
}
public static JMenuItem menuItem(final String name, final Icon icon,
final Consumer<ActionEvent> handler) {
return menuItem(name, null, icon, null, false, handler);
}
public static JMenuItem menuItem(final String name, final String iconName,
final Consumer<ActionEvent> handler) {
final Icon icon = Icons.getIcon(iconName);
return menuItem(name, null, icon, null, false, handler);
}
private final Consumer<ActionEvent> handler;
private final boolean invokeLater;
public ConsumerAction(final CharSequence name, final String toolTip, final Icon icon,
final EnableCheck enableCheck, final boolean invokeLater, final Consumer<ActionEvent> handler) {
this.handler = handler;
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());
}
});
}
setEnableCheck(enableCheck);
}
public void actionDo(final ActionEvent event) {
if (this.handler != null) {
try {
this.handler.accept(event);
} catch (final NoSuchElementException e) {
} catch (final Throwable e) {
Logger.getLogger(this.handler.getClass()).error("Error Performing action", e);
}
}
}
@Override
public void actionPerformed(final ActionEvent event) {
if (this.invokeLater) {
Invoke.later(() -> {
actionDo(event);
});
} else {
actionDo(event);
}
}
@Override
public String toString() {
return this.handler.toString();
}
}