package org.geogebra.desktop.gui.autocompletion; import java.util.Collections; import java.util.List; import javax.swing.AbstractListModel; import javax.swing.ListModel; /** * A simple {@link ListModel} implementation which forwards to a list. This list * should be set via the {@link #setDataList(List)} method. * * @author Julian Lettner */ public class DelegatingListModel extends AbstractListModel { private static final long serialVersionUID = 1L; private List<?> delegate = Collections.emptyList(); @Override public int getSize() { return delegate.size(); } @Override public Object getElementAt(int index) { return delegate.get(index); } /** * Method for passing in the backing list for this {@link ListModel} * instance. If the list changes after it was passed in one must call * {@link #setDataList(List)} again. * * @param dataList0 * The list */ public void setDataList(List<?> dataList0) { // Substitute null with an empty list List<?> dataList = null != dataList0 ? dataList0 : Collections .emptyList(); // Remember sizes int oldSize = delegate.size(); int newSize = dataList.size(); int minSize = Math.min(oldSize, newSize); // Set delegate delegate = dataList; // Fire a content changed event for indices which exist in both lists if (0 != minSize) { fireContentsChanged(this, 0, minSize - 1); } // Fire interval added event (new list is larger), // interval removed event (new list is smaller) // or do nothing (same size) if (newSize > oldSize) { fireIntervalAdded(this, minSize, newSize - 1); } else if (newSize < oldSize) { fireIntervalRemoved(this, minSize, oldSize - 1); } // else (newSize == oldSize) { /* do nothing */ } } }