package com.revolsys.swing.menu;
import java.util.function.Consumer;
import java.util.function.Predicate;
import javax.swing.Icon;
import com.revolsys.logging.Logs;
import com.revolsys.swing.Icons;
import com.revolsys.swing.action.enablecheck.EnableCheck;
import com.revolsys.swing.tree.TreeNodes;
public interface Menus {
static <V> MenuSourceAction addCheckboxMenuItem(final MenuFactory menu, final String groupName,
final CharSequence name, final String iconName, final Predicate<V> enableCheck,
final Consumer<V> consumer, final Predicate<V> itemChecked, final boolean runInBackground) {
final MenuSourceAction action = Menus.newAction(name, iconName, enableCheck, consumer,
runInBackground);
final EnableCheck itemCheckedEnableCheck = enableCheck(itemChecked);
menu.addCheckboxMenuItem(groupName, action, itemCheckedEnableCheck);
return action;
}
static <V> MenuSourceAction addMenuItem(final MenuFactory menu, final String groupName,
final CharSequence name, final Icon icon, final Consumer<V> consumer,
final boolean runInBackground) {
return addMenuItem(menu, groupName, -1, name, icon, null, consumer, runInBackground);
}
static <V> MenuSourceAction addMenuItem(final MenuFactory menu, final String groupName,
final CharSequence name, final String iconName, final Consumer<V> consumer,
final boolean runInBackground) {
return addMenuItem(menu, groupName, -1, name, iconName, null, consumer, runInBackground);
}
static <V> MenuSourceAction addMenuItem(final MenuFactory menu, final String groupName,
final CharSequence name, final String iconName, final Predicate<V> enabledFilter,
final Consumer<V> consumer, final boolean runInBackground) {
return addMenuItem(menu, groupName, -1, name, iconName, enabledFilter, consumer,
runInBackground);
}
static <V> MenuSourceAction addMenuItem(final MenuFactory menu, final String groupName,
final int index, final CharSequence name, final Icon icon, final Predicate<V> enabledFilter,
final Consumer<V> consumer, final boolean runInBackground) {
final MenuSourceAction action = Menus.newAction(name, icon, enabledFilter, consumer,
runInBackground);
menu.addMenuItem(groupName, index, action);
return action;
}
static <V> MenuSourceAction addMenuItem(final MenuFactory menu, final String groupName,
final int index, final CharSequence name, final String iconName, final Consumer<V> consumer,
final boolean runInBackground) {
return addMenuItem(menu, groupName, index, name, iconName, null, consumer, runInBackground);
}
static <V> MenuSourceAction addMenuItem(final MenuFactory menu, final String groupName,
final int index, final CharSequence name, final String iconName, final Predicate<V> enableCheck,
final Consumer<V> consumer, final boolean runInBackground) {
final MenuSourceAction action = Menus.newAction(name, iconName, enableCheck, consumer,
runInBackground);
menu.addMenuItem(groupName, index, action);
return action;
}
static <V> EnableCheck enableCheck(final Predicate<V> filter) {
if (filter == null) {
return null;
} else {
return () -> {
final V node = MenuFactory.getMenuSource();
if (node == null) {
return false;
} else {
try {
return filter.test(node);
} catch (final Throwable e) {
Logs.debug(TreeNodes.class, "Exception processing enable check", e);
return false;
}
}
};
}
}
static <V> MenuSourceAction newAction(final CharSequence name, final Icon icon,
final Predicate<V> enabledFilter, final Consumer<V> consumer, final boolean runInBackground) {
final EnableCheck enableCheck = enableCheck(enabledFilter);
final MenuSourceAction action = new MenuSourceAction(name, null, icon, consumer,
runInBackground);
action.setEnableCheck(enableCheck);
return action;
}
static <V> MenuSourceAction newAction(final CharSequence name, final String iconName,
final Predicate<V> enabledFilter, final Consumer<V> consumer, final boolean runInBackground) {
final Icon icon = Icons.getIcon(iconName);
final MenuSourceAction action = newAction(name, icon, enabledFilter, consumer, runInBackground);
action.setIconName(iconName);
return action;
}
}