package games.strategy.ui;
import java.awt.event.ActionEvent;
import java.lang.reflect.InvocationTargetException;
import java.util.function.Consumer;
import javax.swing.AbstractAction;
import javax.swing.SwingUtilities;
import games.strategy.debug.ClientLogger;
/**
* Builder class for using Lambda expressions to create 'AbstractAction'
*
* <p>
* For example, instead of:
* </p>
*
* <pre>
* new AbstractionAction("text") {
* private final long serialVersion = ..
* @Override public void actionPerformed(ActionEvent e ) { doSomething(); }
* }
* </pre>
*
* <p>
* You can rewrite the above using 'SwingAction.of(..)':
* </p>
*
* <pre>
* SwingAction.of(e -> doSomething());
* </pre>
*/
public class SwingAction {
/**
* @param name Name for the abstract action, passed along to the AbstractAction constructor.
* @param swingAction Lambda java.tools.function.Consumer object, accepts one arg and returns void.
*/
public static AbstractAction of(final String name, final Consumer<ActionEvent> swingAction) {
return new AbstractAction(name) {
private static final long serialVersionUID = 6751222534195121860L;
@Override
public void actionPerformed(final ActionEvent e) {
swingAction.accept(e);
}
};
}
public static AbstractAction of(final Consumer<ActionEvent> swingAction) {
return new AbstractAction() {
private static final long serialVersionUID = 12331L;
@Override
public void actionPerformed(final ActionEvent e) {
swingAction.accept(e);
}
};
}
public static void invokeAndWait(final Runnable action) {
try {
if (SwingUtilities.isEventDispatchThread()) {
action.run();
} else {
SwingUtilities.invokeAndWait(() -> action.run());
}
} catch (final InvocationTargetException e) {
ClientLogger.logError(e);
} catch (final InterruptedException e) {
ClientLogger.logQuietly(e);
}
}
}