/******************************************************************************* * Copyright (c) 2016 Weasis Team and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Nicolas Roduit - initial API and implementation *******************************************************************************/ package org.weasis.core.ui.util; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import javax.swing.AbstractListModel; import javax.swing.ComboBoxModel; import javax.swing.MutableComboBoxModel; @SuppressWarnings("serial") public class ArrayListComboBoxModel<E> extends AbstractListModel<E> implements MutableComboBoxModel<E>, ComboBoxModel<E> { private Object selectedItem; private final List<E> items; private Comparator<E> comparator; public ArrayListComboBoxModel() { this(null, null); } public ArrayListComboBoxModel(List<E> items) { this(items, null); } public ArrayListComboBoxModel(Comparator<E> comparator) { this(null, comparator); } public ArrayListComboBoxModel(List<E> items, Comparator<E> comparator) { this.items = items == null ? new ArrayList<>() : items; this.comparator = comparator; } @Override public Object getSelectedItem() { return selectedItem; } @Override public void setSelectedItem(Object newValue) { if ((selectedItem != null && !selectedItem.equals(newValue)) || selectedItem == null && newValue != null) { selectedItem = newValue; fireContentsChanged(this, -1, -1); } } @Override public int getSize() { return items.size(); } @Override public E getElementAt(int index) { if (index >= 0 && index < items.size()) { return items.get(index); } else { return null; } } public int getIndexOf(Object anObject) { return items.indexOf(anObject); } @Override public void addElement(E anObject) { int index = Collections.binarySearch(items, anObject, comparator); if (index < 0) { insertElementAt(anObject, -(index + 1)); } else { insertElementAt(anObject, index); } } @Override public void insertElementAt(E anObject, int index) { items.add(index, anObject); fireIntervalAdded(this, index, index); } @Override public void removeElementAt(int index) { if (getElementAt(index) == selectedItem) { if (index == 0) { setSelectedItem(getSize() == 1 ? null : getElementAt(index + 1)); } else { setSelectedItem(getElementAt(index - 1)); } } items.remove(index); fireIntervalRemoved(this, index, index); } @Override public void removeElement(Object anObject) { int index = items.indexOf(anObject); if (index != -1) { removeElementAt(index); } } /** * Empties the list. */ public void removeAllElements() { if (!items.isEmpty()) { int firstIndex = 0; int lastIndex = items.size() - 1; items.clear(); selectedItem = null; fireIntervalRemoved(this, firstIndex, lastIndex); } else { selectedItem = null; } } }