/*******************************************************************************
* 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.core;
import java.util.ArrayList;
import java.util.List;
import org.weasis.acquire.explorer.util.AbstractBean;
public class ItemList<T> extends AbstractBean<ItemList.eProperty> {
public enum eProperty {
INTERVAL_ADDED, INTERVAL_REMOVED, CONTENT_CHANGED
}
protected final ArrayList<T> itemList;
public ItemList() {
itemList = new ArrayList<>();
}
public ItemList(List<T> itemList) {
this.itemList = new ArrayList<>(itemList);
}
public int getSize() {
return itemList.size();
}
public boolean isEmpty() {
return itemList.isEmpty();
}
public T getFirstItem() {
return getItem(0);
}
public T getLastItem() {
return getItem(itemList.size() - 1);
}
public T getItem(int index) {
if (index >= 0 && index < itemList.size()) {
return itemList.get(index);
} else {
return null;
}
}
public int getIndex(T item) {
return itemList.indexOf(item);
}
public boolean containsItem(T item) {
return itemList.contains(item);
}
public List<T> getList() {
return itemList;
}
public void addItem(T item) {
insertItem(Integer.MAX_VALUE, item); // append to the end of list
}
public void insertItem(int index, T item) {
if (item != null && !itemList.contains(item)) {
int insert = index < 0 ? 0 : index >= itemList.size() ? itemList.size() : index;
itemList.add(insert, item);
firePropertyChange(eProperty.INTERVAL_ADDED, null, new Interval(insert, insert));
}
}
public void addItems(List<T> list) {
if (list != null && !list.isEmpty()) {
for (T item : list) {
if (item != null) {
itemList.add(item);
}
}
firePropertyChange(eProperty.INTERVAL_ADDED, null,
new Interval(itemList.size() - list.size(), itemList.size() - 1));
}
}
public void removeItem(T item) {
removeItem(itemList.indexOf(item));
}
public void removeItem(int index) {
if (index >= 0 && index < itemList.size()) {
firePropertyChange(eProperty.INTERVAL_REMOVED, null, new Interval(index, index));
itemList.remove(index);
}
}
public void removeItems(List<T> list) {
if (list != null && !list.isEmpty()) {
for (T item : list) {
removeItem(item);
}
}
}
public void clear() {
int size = itemList.size();
if (size > 0) {
firePropertyChange(eProperty.INTERVAL_REMOVED, null, new Interval(0, size - 1));
itemList.clear();
}
}
public void notifyItemUpdate(T item) {
notifyItemUpdate(itemList.indexOf(item));
}
public void notifyItemUpdate(int index) {
if (index >= 0 && index < itemList.size()) {
firePropertyChange(eProperty.CONTENT_CHANGED, null, new Interval(index, index));
}
}
public void notifyItemsUpdate(List<T> list) {
for (T item : list) {
notifyItemUpdate(item);
}
}
public static class Interval {
private final int min;
private final int max;
public Interval(int index0, int index1) {
this.min = Math.min(index0, index1);
this.max = Math.max(index0, index1);
}
public int getMin() {
return min;
}
public int getMax() {
return max;
}
}
}