package org.limewire.ui.swing.table;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeSet;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.table.TableColumnExt;
import ca.odell.glazedlists.gui.TableFormat;
/**
* Creates a Popup Menu for selecting which TableColumns are visible in the table.
*/
public class TableColumnSelector {
private final JPopupMenu popupMenu;
private final JXTable table;
private final ColumnListener listener;
public TableColumnSelector(JXTable table, VisibleTableFormat format) {
popupMenu = new JPopupMenu();
this.listener = new ColumnListener();
this.table = table;
addColumnHeader(format);
}
private void addColumnHeader(VisibleTableFormat format) {
Map<String, Integer> map = new HashMap<String, Integer>();
for(int i = 0; i < format.getColumnCount(); i++) {
if(!format.isColumnHideable(i))
continue;
map.put(format.getColumnName(i), Integer.valueOf(i));
}
TreeSet<String> sortedSet = new TreeSet<String>(map.keySet());
for(String value : sortedSet) {
JMenuItem item = createMenuItem(format, map.get(value));
item.addActionListener(listener);
popupMenu.add(item);
}
}
private JMenuItem createMenuItem(TableFormat format, int index) {
return new JCheckBoxMenuItem(format.getColumnName(index), table.getColumnExt(format.getColumnName(index)).isVisible());
}
public JPopupMenu getPopupMenu() {
return popupMenu;
}
private class ColumnListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
String columnName = e.getActionCommand();
TableColumnExt column = table.getColumnExt(columnName);
if(column.isVisible() && table.getColumnCount(false) == 1) {
//TODO: show error message?
return;
}
column.setVisible(!column.isVisible());
}
}
}