/*
* @(#)HandleEnumerator.java
*
* Project: JHotdraw - a GUI framework for technical drawings
* http://www.jhotdraw.org
* http://jhotdraw.sourceforge.net
* Copyright: (c) by the original author(s) and all contributors
* License: Lesser GNU Public License (LGPL)
* http://www.opensource.org/licenses/lgpl-license.html
*/
package org.jhotdraw.standard;
import org.jhotdraw.util.CollectionsFactory;
import org.jhotdraw.framework.HandleEnumeration;
import org.jhotdraw.framework.Handle;
import java.util.Iterator;
import java.util.Collection;
import java.util.List;
/**
* @author Wolfram Kaiser <mrfloppy@sourceforge.net>
* @version <$CURRENT_VERSION$>
*/
public class HandleEnumerator implements HandleEnumeration {
private Iterator myIterator;
private Collection myInitialCollection;
private static HandleEnumerator singletonEmptyEnumerator =
new HandleEnumerator(CollectionsFactory.current().createList());
public HandleEnumerator(Collection c) {
myInitialCollection = c;
reset();
}
/**
* Returns true if the enumeration contains more elements; false
* if its empty.
*/
public boolean hasNextHandle() {
return myIterator.hasNext();
}
/**
* Returns the next element of the enumeration. Calls to this
* method will enumerate successive elements.
* @exception java.util.NoSuchElementException If no more elements exist.
*/
public Handle nextHandle() {
return (Handle)myIterator.next();
}
/**
* Returns a list with all elements currently available in the enumeration.
* That means, elements retrieved already by calling nextHandle() are not
* contained. This method does not change the position of the enumeration.
* Warning: this method is not necessarily synchronized so this enumeration should not
* be modified at the same time!
*
* @return list with all elements currently available in the enumeration.
*/
public List toList() {
List handles = CollectionsFactory.current().createList();
while (hasNextHandle()) {
handles.add(nextHandle());
}
// copy/reset iterator to original content
myIterator = handles.iterator();
return handles;
}
/**
* Reset the enumeration so it can be reused again. However, the
* underlying collection might have changed since the last usage
* so the elements and the order may vary when using an enumeration
* which has been reset.
*/
public void reset() {
myIterator = myInitialCollection.iterator();
}
public static HandleEnumeration getEmptyEnumeration() {
return singletonEmptyEnumerator;
}
}