package org.korsakow.ide.ui.components.pool; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import javax.swing.event.EventListenerList; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; public abstract class AbstractPoolModel<HE extends HeaderEntry> { protected EventListenerList listeners = new EventListenerList(); protected List<HE> data = new ArrayList<HE>(); protected HashMap<Object, HE> entrymap = new HashMap<Object, HE>(); protected boolean isBatchUpdate = false; public void beginBatchUpdate() { isBatchUpdate = true; } public void endBatchUpdate() { isBatchUpdate = false; sort(); fireContentsChanged(-1, -1); } public void add(HE entry) { data.add(entry); entrymap.put(getId(entry), entry); if (!isBatchUpdate) { sort(); fireIntervalAdded(data.size()-1, data.size()-1); } } public Collection<HE> getData() { return data; } public HE getEntry(int index) { return data.get(index); } public HE getEntry(Object id) { return entrymap.get(id); } public void updateEntry(HeaderEntry entry) { sort(); fireContentsChanged(data.indexOf(entry), data.indexOf(entry)); } public void addListDataListener(ListDataListener listener) { listeners.add(ListDataListener.class, listener); } public void removeListDataListener(ListDataListener listener) { listeners.remove(ListDataListener.class, listener); } public void fireIntervalAdded(int index0, int index1) { ListDataEvent event = new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index0, index1); for (ListDataListener listener : listeners.getListeners(ListDataListener.class)) { listener.intervalAdded(event); } } public void fireContentsChanged(int index0, int index1) { ListDataEvent event = new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, index0, index1); for (ListDataListener listener : listeners.getListeners(ListDataListener.class)) { listener.contentsChanged(event); } } protected abstract Object getId(HE entry); protected void sort() { Collections.sort(data); } }