package org.lodder.subtools.multisubdownloader.gui.extra;
import java.awt.Component;
import java.util.ArrayList;
import javax.swing.JComboBox;
import javax.swing.JList;
import javax.swing.plaf.basic.BasicComboBoxRenderer;
/**
*
* @author http://vetruvet.blogspot.com/2011/03/jcombobox-with-disabled-items.html
*/
public class PartialDisableComboBox extends JComboBox<Object> {
private static final long serialVersionUID = -1690671707274328126L;
private ArrayList<Boolean> itemsState = new ArrayList<Boolean>();
@SuppressWarnings("unchecked")
public PartialDisableComboBox(Object[] items) {
super();
for (Object o : items) {
addItem(o);
}
this.setRenderer(new BasicComboBoxRenderer() {
private static final long serialVersionUID = -2774241371293899669L;
@SuppressWarnings("rawtypes")
@Override
public Component getListCellRendererComponent(JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus) {
Component c =
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
boolean disabled = index >= 0 && index < itemsState.size() && !itemsState.get(index);
c.setEnabled(!disabled);
c.setFocusable(!disabled);
return c;
}
});
}
@Override
public void addItem(Object item) {
this.addItem(item, true);
}
public void addItem(Object item, boolean enabled) {
super.addItem(item);
itemsState.add(enabled);
}
@Override
public void insertItemAt(Object item, int index) {
this.insertItemAt(item, index, true);
}
public void insertItemAt(Object item, int index, boolean enabled) {
super.insertItemAt(item, index);
itemsState.add(index, enabled);
}
@Override
public void removeAllItems() {
super.removeAllItems();
itemsState.clear();
}
@Override
public void removeItemAt(int index) {
if (index < 0 || index >= itemsState.size())
throw new IllegalArgumentException("Item Index out of Bounds!");
super.removeItemAt(index);
itemsState.remove(index);
}
@Override
public void removeItem(Object item) {
for (int q = 0; q < this.getItemCount(); q++) {
if (this.getItemAt(q) == item) itemsState.remove(q);
}
super.removeItem(item);
}
@Override
public void setSelectedIndex(int index) {
if (index < 0 || index >= itemsState.size())
throw new IllegalArgumentException("Item Index out of Bounds!");
if (itemsState.get(index)) super.setSelectedIndex(index);
}
public void setItemEnabled(int index, boolean enabled) {
if (index < 0 || index >= itemsState.size())
throw new IllegalArgumentException("Item Index out of Bounds!");
itemsState.set(index, enabled);
}
public boolean isItemEnabled(int index) {
if (index < 0 || index >= itemsState.size())
throw new IllegalArgumentException("Item Index out of Bounds!");
return itemsState.get(index);
}
}