Improved ComboBoxHistoryModel

master
Harald Wolff 2018-02-22 17:11:02 +01:00
parent 53eafa9b4b
commit c545d64984
2 changed files with 167 additions and 44 deletions

View File

@ -1,36 +1,50 @@
package org.hwo.models; package org.hwo.models;
import java.util.Arrays;
import java.util.LinkedList; import java.util.LinkedList;
import javax.swing.ComboBoxModel; import javax.swing.ComboBoxModel;
import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener; import javax.swing.event.ListDataListener;
public class ComboBoxHistoryModel<E> implements ComboBoxModel<E> { import org.hwo.models.History.HistoryListener;
public class ComboBoxHistoryModel<E> implements ComboBoxModel<E>,HistoryListener<E> {
private LinkedList<ListDataListener> listDataListeners = new LinkedList<>(); private LinkedList<ListDataListener> listDataListeners = new LinkedList<>();
private LinkedList<E> items = new LinkedList<>(); private History<E> history;
private E selectedItem; private E selectedItem;
private int historySize;
public ComboBoxHistoryModel() public ComboBoxHistoryModel()
{ {
this.setHistory(new History<>());
this.selectedItem = null; this.selectedItem = null;
this.historySize = 10;
} }
public ComboBoxHistoryModel(int historySize) public ComboBoxHistoryModel(int historySize)
{ {
this.setHistory(new History<E>(historySize));
this.selectedItem = null; this.selectedItem = null;
this.historySize = historySize; }
public ComboBoxHistoryModel(History<E> history){
this.setHistory(history);
} }
public History<E> getHistory() {
return history;
}
public void setHistory(History<E> history) {
if (this.history != null) {
this.history.removeHistoryListener(this);
}
this.history = history;
if (this.history != null) {
this.history.addHistoryListener(this);
fireContentsChanged();
}
}
private void fireContentsChanged() private void fireContentsChanged()
{ {
ListDataEvent lde = new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, 0, this.items.size()); ListDataEvent lde = new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, 0, this.history.size());
for (ListDataListener l: listDataListeners) { for (ListDataListener l: listDataListeners) {
l.contentsChanged(lde); l.contentsChanged(lde);
} }
@ -43,12 +57,12 @@ public class ComboBoxHistoryModel<E> implements ComboBoxModel<E> {
@Override @Override
public E getElementAt(int arg0) { public E getElementAt(int arg0) {
return items.get(arg0); return history.get(arg0);
} }
@Override @Override
public int getSize() { public int getSize() {
return items.size(); return history.size();
} }
@Override @Override
@ -64,65 +78,54 @@ public class ComboBoxHistoryModel<E> implements ComboBoxModel<E> {
@Override @Override
public void setSelectedItem(Object arg0) { public void setSelectedItem(Object arg0) {
selectedItem = (E)arg0; selectedItem = (E)arg0;
if (items.contains(selectedItem)) { if (selectedItem != null) {
items.remove(selectedItem); this.history.add(selectedItem);
}
items.add(0,selectedItem);
if (!clampHistory()) {
fireContentsChanged();
} }
} }
public int getHistorySize() { public int getHistorySize() {
return historySize; return history.getHistorySize();
} }
public void setHistorySize(int historySize) { public void setHistorySize(int historySize) {
this.historySize = historySize; this.history.setHistorySize(historySize);
} }
public Object[] getItems(){ public Object[] getItems(){
return items.toArray(); return history.getItems();
} }
public E[] getItems(E[] at) { public E[] getItems(E[] at) {
return items.toArray(at); return history.getItems(at);
} }
public void setItems(E[] items) { public void setItems(E[] items) {
this.items.clear(); history.setItems(items);
this.items.addAll(Arrays.asList(items));
if (!this.items.contains(selectedItem)) {
selectedItem = null;
}
if (!clampHistory())
fireContentsChanged();
} }
private boolean clampHistory() {
if (items.size() > historySize) {
while (items.size() > historySize) {
items.removeLast();
}
fireContentsChanged();
return true;
}
return false;
}
public void addElement(E element) { public void addElement(E element) {
this.items.add(0,element); this.history.add(element);
if (!clampHistory())
fireContentsChanged();
} }
public void clear() { public void clear() {
items.clear(); this.history.clear();
fireContentsChanged();
} }
public boolean contains(E val) { public boolean contains(E val) {
return items.contains(val); return history.contains(val);
}
@Override
public void HistoryChanged(History<E> history) {
fireContentsChanged();
}
@Override
public void HistoryItemAdded(History<E> history, E item) {
fireContentsChanged();
}
@Override
public void HistoryItemRemoved(History<E> history, E item) {
fireContentsChanged();
} }
} }

View File

@ -0,0 +1,120 @@
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);
}
}