package ctagsinterface.main;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Vector;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
@SuppressWarnings("serial")
public class TagListFilterMenu extends JMenuBar
{
private TagListModelHandler handler;
static final String MISSING_EXTENSION = "<none>";
public interface TagListModelHandler
{
void clear();
void add(Tag t);
void done();
}
public TagListFilterMenu(TagListModelHandler handler)
{
this.handler = handler;
}
public void setTags(final List<Tag> tags)
{
if (handler == null)
return;
removeAll();
handler.clear();
if (tags == null)
return;
HashMap<String, HashSet<String>> menus =
new HashMap<String, HashSet<String>>();
for (int i = 0; i < tags.size(); i++)
{
Tag tag = tags.get(i);
handler.add(tag);
Vector<String> missingExtensions = new Vector<String>(menus.keySet());
for (String ext: tag.getExtensions())
{
missingExtensions.remove(ext);
HashSet<String> keys = menus.get(ext);
if (keys == null)
{
keys = new HashSet<String>();
menus.put(ext, keys);
if (i > 0) // Previous tags did not have this extension
keys.add(MISSING_EXTENSION);
}
keys.add(tag.getExtension(ext));
}
// Add a <missing extension> item to menus for missing extensions
for (String missing: missingExtensions)
{
HashSet<String> keys = menus.get(missing);
if (keys == null)
continue;
keys.add(MISSING_EXTENSION);
}
}
handler.done();
Vector<String> keys = new Vector<String>(menus.keySet());
Collections.sort(keys);
for (final String key: keys)
{
if (menus.get(key).size() < 2)
continue; // Avoid redundant menus
JMenu m = new JMenu(key);
add(m);
Vector<String> values = new Vector<String>(menus.get(key));
Collections.sort(values);
for (final String value: values)
{
JMenuItem item = new JMenuItem(value);
m.add(item);
item.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
handler.clear();
for (Tag t: tags)
{
String ext = t.getExtension(key);
if (ext == null)
ext = MISSING_EXTENSION;
if (value.equals(ext))
handler.add(t);
}
handler.done();
}
});
}
}
validate();
repaint();
}
}