/* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License * Version 1.0 (the "License"). You may not use this file except in * compliance with the License. A copy of the License is available at * http://www.sun.com/ * * The Original Code is NetBeans. The Initial Developer of the Original * Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun * Microsystems, Inc. All Rights Reserved. */ package org.openide.util.enums; import java.util.Enumeration; /** Composes more enumerations into one. * * @author Jaroslav Tulach * @author Petr Nejedly * @version 0.20 */ public class SequenceEnumeration extends Object implements Enumeration { /** enumeration of Enumerations */ private Enumeration en; /** current enumeration */ private Enumeration current; /** is {@link #current} up-to-date and has more elements? * The combination <CODE>current == null</CODE> and * <CODE>checked == true means there are no more elements * in this enumeration. */ private boolean checked = false; /** Constructs new enumeration from already existing. The elements * of <CODE>en</CODE> should be also enumerations. The resulting * enumeration contains elements of such enumerations. * * @param en enumeration of Enumerations that should be sequenced */ public SequenceEnumeration (Enumeration en) { this.en = en; } /** Composes two enumerations into one. * @param first first enumeration * @param second second enumeration */ public SequenceEnumeration (Enumeration first, Enumeration second) { this (new ArrayEnumeration (new Enumeration[] { first, second })); } /** Ensures that current enumeration is set. If there aren't more * elements in the Enumerations, sets the field <CODE>current</CODE> to null. */ private void ensureCurrent () { while (current == null || !current.hasMoreElements ()) { if (en.hasMoreElements ()) { current = (Enumeration)en.nextElement (); } else { // no next valid enumeration current = null; return; } } } /** @return true if we have more elements */ public boolean hasMoreElements () { if( !checked ) { ensureCurrent (); checked = true; } return current != null; } /** @return next element * @exception NoSuchElementException if there is no next element */ public synchronized Object nextElement () { if( !checked ) { ensureCurrent (); } if( current != null ) { checked = false; return current.nextElement (); } else { checked = true; throw new java.util.NoSuchElementException (); } } }