package com.limegroup.gnutella.gui.search; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Iterator; import java.util.List; import javax.swing.JCheckBoxMenuItem; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; /** * Manages creating and displaying a JPopupMenu of selectors. */ class SelectorMenu { /** * The property which the selector should be put in. */ private static final String SELECTOR = "selector"; /** * The actual JPopupMenu. */ private final JPopupMenu MENU = new JPopupMenu(); /** * Constructs a new SelectorMenu. */ SelectorMenu(FilterBox box) { ActionListener listener = new SelectionListener(box); List options = box.getMetadataModel().getSelectorOptions(); String currentSchema = ""; JMenu currentSchemaMenu = null; for(Iterator i = options.iterator(); i.hasNext();) { Selector selector = (Selector)i.next(); JMenuItem item = createItem(box, selector); item.addActionListener(listener); if(selector.isFieldSelector()) { if(!selector.getSchema().equals(currentSchema)) { currentSchema = selector.getSchema(); String title = NamedMediaType.getFromDescription(currentSchema).getName(); currentSchemaMenu = new JMenu(title); MENU.add(currentSchemaMenu); } currentSchemaMenu.add(item); } else { MENU.add(item); } } } /** * Returns the component to display. */ JPopupMenu getComponent() { return MENU; } /** * Constructs a new JCheckBoxMenuItem for the specified selector. */ private JMenuItem createItem(FilterBox box, Selector selector) { String title = selector.getTitle(); boolean isSelected = box.getSelector().equals(selector); JMenuItem item = new JCheckBoxMenuItem(title, isSelected); item.putClientProperty(SELECTOR, selector); return item; } /** * Constructs a SelectionListener to change the Selector. */ private static class SelectionListener implements ActionListener { private final FilterBox BOX; SelectionListener(FilterBox box) { BOX = box; } public void actionPerformed(ActionEvent e) { JMenuItem item = (JMenuItem)e.getSource(); Selector selector = (Selector)item.getClientProperty(SELECTOR); BOX.setSelector(selector); } } }