package com.revolsys.swing.tree;
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.RunnableAction;
import com.revolsys.swing.action.enablecheck.EnableCheck;
import com.revolsys.swing.menu.MenuFactory;
public interface TreeNodes {
static <V extends BaseTreeNode> void addMenuItem(final MenuFactory menu, final String groupName,
final CharSequence name, final String iconName, final Consumer<V> consumer) {
addMenuItem(menu, groupName, name, iconName, null, consumer);
}
static <V extends BaseTreeNode> void addMenuItem(final MenuFactory menu, final String groupName,
final CharSequence name, final String iconName, final Predicate<V> enabledFilter,
final Consumer<V> consumer) {
addMenuItem(menu, groupName, -1, name, iconName, enabledFilter, consumer);
}
static <V extends BaseTreeNode> void addMenuItem(final MenuFactory menu, final String groupName,
final int index, final CharSequence name, final String iconName,
final Predicate<V> enabledFilter, final Consumer<V> consumer) {
final Icon icon = Icons.getIcon(iconName);
final EnableCheck enableCheck = enableCheck(enabledFilter);
final RunnableAction action = new RunnableAction(name, name.toString(), icon, true, () -> {
final V object = BaseTree.getMenuNode();
consumer.accept(object);
});
action.setEnableCheck(enableCheck);
menu.addMenuItem(groupName, action);
}
static <V> void addMenuItemNodeValue(final MenuFactory menu, final String groupName,
final CharSequence name, final String iconName, final Consumer<V> consumer) {
addMenuItemNodeValue(menu, groupName, name, iconName, null, consumer);
}
static <V> void addMenuItemNodeValue(final MenuFactory menu, final String groupName,
final CharSequence name, final String iconName, final Predicate<V> enabledFilter,
final Consumer<V> consumer) {
addMenuItemNodeValue(menu, groupName, -1, name, iconName, enabledFilter, consumer);
}
static <V> void addMenuItemNodeValue(final MenuFactory menu, final String groupName,
final int index, final CharSequence name, final String iconName, final Consumer<V> consumer) {
addMenuItemNodeValue(menu, groupName, index, name, iconName, null, consumer);
}
static <V> void addMenuItemNodeValue(final MenuFactory menu, final String groupName,
final int index, final CharSequence name, final String iconName,
final Predicate<V> enabledFilter, final Consumer<V> consumer) {
final Icon icon = Icons.getIcon(iconName);
final EnableCheck enableCheck = enableCheckNodeValue(enabledFilter);
final RunnableAction action = new RunnableAction(name, name.toString(), icon, true, () -> {
final BaseTreeNode node = BaseTree.getMenuNode();
if (node != null) {
@SuppressWarnings("unchecked")
final V value = (V)node.getUserObject();
if (value != null) {
consumer.accept(value);
}
}
});
action.setEnableCheck(enableCheck);
menu.addMenuItem(groupName, index, action);
}
static <V extends BaseTreeNode> EnableCheck enableCheck(final Predicate<V> filter) {
if (filter == null) {
return null;
} else {
return () -> {
final V node = BaseTree.getMenuNode();
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> EnableCheck enableCheckNodeValue(final Predicate<V> filter) {
if (filter == null) {
return null;
} else {
return () -> {
final BaseTreeNode node = BaseTree.getMenuNode();
if (node == null) {
return false;
} else {
@SuppressWarnings("unchecked")
final V value = (V)node.getUserObject();
if (value == null) {
return false;
} else {
try {
return filter.test(value);
} catch (final Throwable e) {
Logs.debug(TreeNodes.class, "Exception processing enable check", e);
return false;
}
}
}
};
}
}
}