forked from LupusNobilis/java-org.hwo.ui
121 lines
2.5 KiB
Java
121 lines
2.5 KiB
Java
package org.hwo.models;
|
|
|
|
import java.util.Arrays;
|
|
import java.util.LinkedList;
|
|
|
|
public class History<E> {
|
|
private LinkedList<HistoryListener<E>> historyListeners = new LinkedList<>();
|
|
private LinkedList<E> items = new LinkedList<>();
|
|
private int historySize = 10;
|
|
|
|
public History(){
|
|
}
|
|
|
|
public History(int historySize) {
|
|
this.historySize = historySize;
|
|
}
|
|
|
|
public void addHistoryListener(HistoryListener<E> listener) {
|
|
historyListeners.add(listener);
|
|
}
|
|
public void removeHistoryListener(HistoryListener<E> listener) {
|
|
historyListeners.remove(listener);
|
|
}
|
|
|
|
protected void fireHistoryChanged() {
|
|
for (HistoryListener<E> historyListener : historyListeners) {
|
|
historyListener.HistoryChanged(this);
|
|
}
|
|
}
|
|
protected void fireHistoryItemAdded(E item) {
|
|
for (HistoryListener<E> historyListener : historyListeners) {
|
|
historyListener.HistoryItemAdded(this,item);
|
|
}
|
|
}
|
|
protected void fireHistoryItemRemoved(E item) {
|
|
for (HistoryListener<E> historyListener : historyListeners) {
|
|
historyListener.HistoryItemRemoved(this, item);
|
|
}
|
|
}
|
|
|
|
public void clear() {
|
|
items.clear();
|
|
fireHistoryChanged();
|
|
}
|
|
|
|
public boolean contains(E item) {
|
|
return items.contains(item);
|
|
}
|
|
|
|
public int size() {
|
|
return this.items.size();
|
|
}
|
|
|
|
public E get(int index) {
|
|
return this.items.get(index);
|
|
}
|
|
|
|
public Object[] getItems(){
|
|
return items.toArray();
|
|
}
|
|
|
|
public E[] getItems(E[] at) {
|
|
return items.toArray(at);
|
|
}
|
|
|
|
public void setItems(E[] items) {
|
|
this.items.clear();
|
|
this.items.addAll(Arrays.asList(items));
|
|
fireHistoryChanged();
|
|
|
|
clampHistory();
|
|
}
|
|
|
|
public void add(E item) {
|
|
if (this.items.contains(item)) {
|
|
if (this.items.indexOf(item) > 0) {
|
|
this.items.remove(item);
|
|
this.items.add(0,item);
|
|
fireHistoryChanged();
|
|
clampHistory();
|
|
return;
|
|
}
|
|
} else {
|
|
this.items.add(0,item);
|
|
fireHistoryItemAdded(item);
|
|
clampHistory();
|
|
}
|
|
}
|
|
|
|
public void remove(E item) {
|
|
this.items.remove(item);
|
|
fireHistoryItemRemoved(item);
|
|
}
|
|
|
|
private void clampHistory() {
|
|
if (items.size() > historySize) {
|
|
while (items.size() > historySize) {
|
|
fireHistoryItemRemoved(items.removeLast());
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public int getHistorySize() {
|
|
return historySize;
|
|
}
|
|
|
|
public void setHistorySize(int historySize) {
|
|
this.historySize = historySize;
|
|
}
|
|
|
|
|
|
|
|
public static interface HistoryListener<T> {
|
|
void HistoryChanged(History<T> history);
|
|
void HistoryItemAdded(History<T> history,T item);
|
|
void HistoryItemRemoved(History<T> history,T item);
|
|
}
|
|
}
|