package com.revolsys.swing.map.layer.record;
import java.awt.Component;
import java.awt.event.MouseEvent;
import java.lang.ref.Reference;
import java.lang.ref.WeakReference;
import java.util.function.Consumer;
import java.util.function.Predicate;
import javax.swing.Icon;
import com.revolsys.collection.EmptyReference;
import com.revolsys.logging.Logs;
import com.revolsys.record.Record;
import com.revolsys.swing.Icons;
import com.revolsys.swing.action.RunnableAction;
import com.revolsys.swing.action.enablecheck.EnableCheck;
import com.revolsys.swing.menu.MenuFactory;
import com.revolsys.swing.tree.TreeNodes;
public class LayerRecordMenu extends MenuFactory {
private static Reference<LayerRecord> eventRecord = new EmptyReference<>();
public static <V extends Record> RunnableAction addMenuItem(final MenuFactory menu,
final String groupName, final CharSequence name, final String iconName,
final EnableCheck enableCheck, final Consumer<V> consumer) {
return addMenuItem(menu, groupName, -1, name, null, iconName, enableCheck, consumer);
}
public static <V extends Record> RunnableAction addMenuItem(final MenuFactory menu,
final String groupName, final int index, final CharSequence name, final String toolTip,
final String iconName, final EnableCheck enableCheck, final Consumer<V> consumer) {
final Icon icon = Icons.getIcon(iconName);
final RunnableAction action = MenuFactory.newMenuItem(name, toolTip, icon, enableCheck, () -> {
final V record = getEventRecord();
if (record != null && consumer != null) {
consumer.accept(record);
}
});
menu.addComponentFactory(groupName, index, action);
return action;
}
public static <V extends Record> RunnableAction addMenuItem(final MenuFactory menu,
final String groupName, final int index, final CharSequence name, final String toolTip,
final String iconName, final Predicate<V> enabledFilter, final Consumer<V> consumer) {
final EnableCheck enableCheck = enableCheck(enabledFilter);
return addMenuItem(menu, groupName, index, name, toolTip, iconName, enableCheck, consumer);
}
public static <V extends Record> EnableCheck enableCheck(final Predicate<V> filter) {
if (filter == null) {
return null;
} else {
return () -> {
final V node = getEventRecord();
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;
}
}
};
}
}
@SuppressWarnings("unchecked")
public static <R extends Record> R getEventRecord() {
return (R)eventRecord.get();
}
public static void setEventRecord(final LayerRecord eventRecord) {
LayerRecordMenu.eventRecord = new WeakReference<>(eventRecord);
}
private final AbstractRecordLayer layer;
public LayerRecordMenu(final AbstractRecordLayer layer) {
super(layer.getName());
this.layer = layer;
}
public <V extends Record> RunnableAction addMenuItem(final String groupName,
final CharSequence name, final String iconName, final Consumer<V> consumer) {
return addMenuItem(groupName, name, iconName, (Predicate<V>)null, consumer);
}
public <V extends Record> RunnableAction addMenuItem(final String groupName,
final CharSequence name, final String iconName, final Predicate<V> enabledFilter,
final Consumer<V> consumer) {
return addMenuItem(this, groupName, -1, name, null, iconName, enabledFilter, consumer);
}
public <V extends Record> RunnableAction addMenuItem(final String groupName, final int index,
final CharSequence name, final String toolTip, final String iconName,
final Predicate<V> enabledFilter, final Consumer<V> consumer) {
return addMenuItem(this, groupName, index, name, toolTip, iconName, enabledFilter, consumer);
}
public void showMenu(final LayerRecord record, final MouseEvent e) {
if (record != null) {
setEventRecord(record);
super.showMenu(this.layer, e);
}
}
@Override
public void showMenu(final Object source, final Component component, final int x, final int y) {
super.showMenu(source, component, x, y);
}
@Override
public boolean showMenu(final Object source, final MouseEvent e) {
return super.showMenu(this.layer, e);
}
}