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);
        }
    }
}
      