/*******************************************************************************
* 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.acquire.explorer.gui.model.list;
import java.beans.PropertyChangeListener;
import javax.swing.ComboBoxModel;
import org.weasis.acquire.explorer.core.ItemList;
import org.weasis.acquire.explorer.core.ItemList.Interval;
public class ItemListComboBoxModel<T> extends ItemListModel<T> implements ComboBoxModel<T> {
private static final long serialVersionUID = -7664267643457177724L;
private T selectedItem = null;
private T lastSelectedItem = null;
public ItemListComboBoxModel() {
super();
if (itemList.getSize() > 0) {
selectedItem = itemList.getItem(0);
}
}
public ItemListComboBoxModel(ItemList<T> itemList) {
super(itemList);
if (itemList.getSize() > 0) {
selectedItem = itemList.getItem(0);
}
}
@Override
public T getSelectedItem() {
return selectedItem;
}
@SuppressWarnings("unchecked")
@Override
public void setSelectedItem(Object anItem) {
// Let assume anItem is included in itemList and is an instance of T
// Same implementation as done in DefaultComboBoxModel since contentsChanged is
// interpreted in a JCombobox as a selectedItemChanged
if ((selectedItem != null && !selectedItem.equals(anItem)) || selectedItem == null && anItem != null) {
// itemList.containsItem((T) anItem)
// lastSelectedItem = itemList.containsItem((T) selectedItem) ? selectedItem : null;
lastSelectedItem = selectedItem;
selectedItem = ((anItem == null) || !itemList.containsItem((T) anItem)) ? null : (T) anItem;
fireContentsChanged(this, -1, -1);
}
}
@Override
protected PropertyChangeListener getPropertyChangeListener() {
return evt -> {
if (evt.getNewValue() instanceof Interval) {
Interval interval = (Interval) evt.getNewValue();
switch (ItemList.eProperty.valueOf(evt.getPropertyName())) {
case INTERVAL_ADDED:
fireIntervalAdded(ItemListComboBoxModel.this, interval.getMin(), interval.getMax());
if (selectedItem == null && itemList.getSize() > 0) {
setSelectedItem(itemList.getLastItem());
}
break;
case INTERVAL_REMOVED:
for (int i = interval.getMin(); i <= interval.getMax(); i++) {
T item = itemList.getItem(i);
if (item != null && item.equals(selectedItem)) {
int lastSelectionIndex = itemList.getIndex(lastSelectedItem);
if (interval.getMin() <= lastSelectionIndex
&& interval.getMax() >= lastSelectionIndex) {
setSelectedItem(null);
} else {
setSelectedItem(lastSelectedItem);
}
break;
}
}
fireIntervalRemoved(ItemListComboBoxModel.this, interval.getMin(), interval.getMax());
break;
case CONTENT_CHANGED:
fireContentsChanged(ItemListComboBoxModel.this, interval.getMin(), interval.getMax());
// note : used by JComboBox only to check if selectedItem has changed but not used by
// the renderer
break;
}
}
};
}
}