package com.revolsys.swing.field;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Collection;
import javax.swing.MutableComboBoxModel;
import com.revolsys.datatype.DataType;
import com.revolsys.swing.list.ArrayListModel;
public class ArrayListComboBoxModel<T> extends ArrayListModel<T>
implements MutableComboBoxModel<T>, Serializable {
private static final long serialVersionUID = 1L;
private T selectedObject;
public ArrayListComboBoxModel() {
}
public ArrayListComboBoxModel(final Collection<T> elements) {
super(elements);
if (!isEmpty()) {
this.selectedObject = getElementAt(0);
}
}
public ArrayListComboBoxModel(@SuppressWarnings("unchecked") final T... elements) {
this(Arrays.asList(elements));
}
@Override
public void add(final int index, final T element) {
super.add(index, element);
if (this.selectedObject == null && element != null && !isEmpty()) {
setSelectedItem(element);
}
}
@Override
public void addElement(final T element) {
add(element);
}
@Override
public void clear() {
super.clear();
this.selectedObject = null;
}
@Override
public T getSelectedItem() {
return this.selectedObject;
}
@Override
public void insertElementAt(final T element, final int index) {
add(index, element);
}
@Override
public T remove(final int index) {
final T oldValue = super.get(index);
if (oldValue == this.selectedObject) {
T selectedObject = this.selectedObject;
if (index == 0) {
if (getSize() == 1) {
selectedObject = null;
} else {
selectedObject = get(index + 1);
}
} else {
selectedObject = get(index - 1);
}
setSelectedItem(selectedObject);
}
return super.remove(index);
}
@Override
public void removeElement(final Object element) {
remove(element);
}
@Override
public void removeElementAt(final int index) {
remove(index);
}
@Override
public T set(final int index, final T element) {
final T oldValue = super.set(index, element);
if (DataType.equal(oldValue, this.selectedObject)) {
setSelectedItem(element);
}
return oldValue;
}
@Override
public void setAll(final Iterable<? extends T> elements) {
super.setAll(elements);
if (!contains(this.selectedObject)) {
if (isEmpty()) {
setSelectedItem(null);
} else {
setSelectedItem(get(0));
}
}
}
@SuppressWarnings("unchecked")
@Override
public void setSelectedItem(final Object element) {
if (!DataType.equal(this.selectedObject, element)) {
this.selectedObject = (T)element;
if (!isEmpty()) {
fireContentsChanged(0, size());
}
}
}
}