package hep.aida.ref.plotter.style.registry;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.ButtonGroup;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.MenuElement;
import org.freehep.util.FreeHEPLookup;
public class CategoryMenu extends JPopupMenu {
static String none = "[NONE]";
private IStyleRegistry registry;
public CategoryMenu(String title) {
super(title);
}
protected void firePopupMenuWillBecomeVisible() {
clearMenu();
fillMenu();
super.firePopupMenuWillBecomeVisible();
}
private void clearMenu() {
MenuElement[] elements = getSubElements();
if (elements == null) return;
for (int i=0; i<elements.length; i++) {
if (elements[i] instanceof JMenu) {
removeAll();
} else if (elements[i] instanceof JMenuItem){
remove((JMenuItem) elements[i]);
}
}
}
private void fillMenu() {
if (registry == null) registry = (IStyleRegistry) FreeHEPLookup.instance().lookup(IStyleRegistry.class);
String[] keys = registry.getAvailableCategoryKeys();
if (keys == null) return;
for (int i=0; i<keys.length; i++) {
String key = keys[i];
String[] values = registry.getAvailableCategoryValues(key);
String current = registry.getCategoryCurrentValue(key);
ButtonGroup group = new ButtonGroup();
JMenu menu = new JMenu(key);
JRadioButtonMenuItem item = new JRadioButtonMenuItem(new CategoryAction(key, none));
group.add(item);
menu.add(item);
if (current == null || current.trim().equals("")) item.doClick();
for (int j=0; j<values.length; j++) {
item = new JRadioButtonMenuItem(new CategoryAction(key, values[j]));
group.add(item);
menu.add(item);
if (values[j] != null && values[j].equals(current)) item.doClick();
}
this.add(menu);
}
}
private void setCategory(String key, String value) {
if (registry == null) registry = (IStyleRegistry) FreeHEPLookup.instance().lookup(IStyleRegistry.class);
if (none.equals(value)) value = null;
System.out.println("Setting Category: key="+key+", value="+value);
registry.setCategoryCurrentValue(key, value);
}
class CategoryAction extends AbstractAction {
String key;
CategoryAction(String key, String value) {
super(value);
this.key = key;
}
public void actionPerformed(ActionEvent ev) {
String action = ev.getActionCommand();
setCategory(key, (String) getValue(AbstractAction.NAME));
}
}
}