/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.dlect.ui.helper; import java.util.ArrayList; import java.util.EnumSet; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.ComboBoxModel; import javax.swing.event.ListDataListener; /** * * @author lee */ public class EnumComboBoxModel<E extends Enum<E>> implements ComboBoxModel { private E selected = null; private final List<E> data; private final String none; private final Map<String, E> valueMap; private final Class<E> enumClass; private final int size; private final boolean isNoneEnabled; public EnumComboBoxModel(Class<E> cls) { this(cls, null); } public EnumComboBoxModel(Class<E> cls, String noneString) { data = new ArrayList<E>(EnumSet.allOf(cls)); if (data.isEmpty()) { throw new IllegalArgumentException("The enum contains no constants. Enum Class: " + cls); } //we could size these, probably not worth it; enums are usually small valueMap = new HashMap<String, E>(); enumClass = cls; none = noneString; isNoneEnabled = noneString != null; size = data.size() + (isNoneEnabled ? 1 : 0); for (E e : data) { String s = e.toString(); if (valueMap.containsKey(s)) { throw new IllegalArgumentException( "multiple constants map to one string value"); } valueMap.put(s, e); } } @Override public void setSelectedItem(Object anItem) { if (enumClass.isInstance(anItem)) { selected = (E) anItem; } else if (anItem instanceof String) { selected = valueMap.get((String) anItem); } else { selected = null; } if (selected == null && !isNoneEnabled) { selected = data.get(0); } } @Override public Object getSelectedItem() { if (selected == null && isNoneEnabled) { return none; } else if (selected == null && !isNoneEnabled) { selected = data.get(0); return selected; } else { return selected; } } @Override public int getSize() { return size; } @Override public Object getElementAt(int index) { if (index < 0 || index >= size) { return null; } else if (isNoneEnabled) { if (index == 0) { return none; } else { return data.get(index - 1); } } else { return data.get(index); } } @Override public void addListDataListener(ListDataListener l) { //No Op } @Override public void removeListDataListener(ListDataListener l) { // No Op } }