/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2008 Sun Microsystems, Inc. */ package org.opends.guitools.controlpanel.datamodel; import java.util.Collection; import java.util.Comparator; import java.util.SortedSet; import java.util.TreeSet; import javax.swing.AbstractListModel; /** * Note: this implementation does not call automatically fireContentsChanged, * its up to the caller of the different methods of this implementation to * call it explicitly. This is done because in general there is a series * of calls to the add/remove methods and a single call to notify that * things have changed is enough. * * @param <T> */ public class SortableListModel<T> extends AbstractListModel { private static final long serialVersionUID = 3241258779190228463L; private SortedSet<T> data = new TreeSet<T>(); /** * Returns the size of the list model. * @return the size of the list model. */ public int getSize() { return data.size(); } /** * Sets the comparator to be used to sort the list. * @param comp the comparator. */ public void setComparator(Comparator<T> comp) { SortedSet<T> copy = data; data = new TreeSet<T>(comp); data.addAll(copy); } /** * Returns the element at the specified index. * @param i the index of the element. * @return the element at the specified index. */ public T getElementAt(int i) { int index = 0; for (T element : data) { if (index == i) { return element; } index++; } throw new ArrayIndexOutOfBoundsException( "The index "+i+" is bigger than the maximum size: "+getSize()); } /** * Adds a value to the list model. * @param value the value to be added. */ public void add(T value) { data.add(value); } /** * Removes a value from the list model. * @param value the value to be removed. * @return <CODE>true</CODE> if the element was on the list and * <CODE>false</CODE> otherwise. */ public boolean remove(T value) { return data.remove(value); } /** * Clears the list model. * */ public void clear() { data.clear(); } /** * Adds all the elements in the collection to the list model. * @param newData the collection containing the elements to be added. */ public void addAll(Collection<T> newData) { data.addAll(newData); } /** * {@inheritDoc} */ public void fireContentsChanged(Object source, int index0, int index1) { super.fireContentsChanged(source, index0, index1); } /** * Returns the data in this list model ordered. * @return the data in this list model ordered. */ public SortedSet<T> getData() { return new TreeSet<T>(data); } }