package net.sf.openrocket.gui.preset; import javax.swing.*; import javax.swing.plaf.basic.BasicComboBoxRenderer; import java.awt.*; import java.util.HashSet; import java.util.Set; /** * A combo box that allows for items to be deselected. */ public class DeselectableComboBox extends JComboBox { public DeselectableComboBox() { super(); super.setRenderer(new DeselectedtemsRenderer()); } private Set<Integer> disabled_items = new HashSet<Integer>(); public void addItem(Object anObject, boolean disabled) { super.addItem(anObject); if (disabled) { disabled_items.add(getItemCount() - 1); } } @Override public void removeAllItems() { super.removeAllItems(); disabled_items = new HashSet<Integer>(); } @Override public void removeItemAt(final int anIndex) { super.removeItemAt(anIndex); disabled_items.remove(anIndex); } @Override public void removeItem(final Object anObject) { for (int i = 0; i < getItemCount(); i++) { if (getItemAt(i) == anObject) { disabled_items.remove(i); } } super.removeItem(anObject); } @Override public void setSelectedIndex(int index) { if (!disabled_items.contains(index)) { super.setSelectedIndex(index); } } private class DeselectedtemsRenderer extends BasicComboBoxRenderer { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { if (isSelected) { setBackground(list.getSelectionBackground()); setForeground(list.getSelectionForeground()); } else { setBackground(list.getBackground()); setForeground(list.getForeground()); } if (disabled_items.contains(index)) { setBackground(list.getBackground()); setForeground(UIManager.getColor("Label.disabledForeground")); } setFont(list.getFont()); setText((value == null) ? "" : value.toString()); return this; } } }