/*******************************************************************************
 * Copyright (c) 2001, 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Jens Lukowski/Innoopract - initial renaming/restructuring
 *     
 *******************************************************************************/
package org.eclipse.wst.sse.core.internal.text;



import java.util.Enumeration;
import java.util.NoSuchElementException;

import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
import org.eclipse.wst.sse.core.internal.util.Debug;


public class StructuredDocumentRegionEnumeration implements Enumeration {

	private int count;
	private IStructuredDocumentRegion head;
	private IStructuredDocumentRegion oldHead;

	/**
	 * StructuredDocumentRegionEnumeration constructor comment.
	 */
	public StructuredDocumentRegionEnumeration(IStructuredDocumentRegion newHead) {
		super();
		IStructuredDocumentRegion countNode = head = newHead;
		while (countNode != null) {
			count++;
			countNode = countNode.getNext();
		}
		if (Debug.DEBUG > 5) {
			System.out.println("N Nodes in StructuredDocumentRegionEnumeration Contructor: " + count); //$NON-NLS-1$
		}
	}

	/**
	 * StructuredDocumentRegionEnumeration constructor comment.
	 */
	public StructuredDocumentRegionEnumeration(IStructuredDocumentRegion start, IStructuredDocumentRegion end) {
		super();
		IStructuredDocumentRegion countNode = head = start;
		if ((start == null) || (end == null)) {
			// error condition
			count = 0;
			return;
		}
		//If both nodes are non-null, we assume there is always at least one
		// item
		count = 1;
		while (countNode != end) {
			count++;
			countNode = countNode.getNext();
		}
		if (org.eclipse.wst.sse.core.internal.util.Debug.DEBUG > 5) {
			System.out.println("N Nodes in StructuredDocumentRegionEnumeration Contructor: " + count); //$NON-NLS-1$
		}
	}

	/**
	 * hasMoreElements method comment.
	 */
	public synchronized boolean hasMoreElements() {
		return count > 0;
	}

	/**
	 * nextElement method comment.
	 */
	public synchronized Object nextElement() {
		if (count > 0) {
			count--;
			oldHead = head;
			head = head.getNext();
			return oldHead;
		}
		throw new NoSuchElementException("StructuredDocumentRegionEnumeration"); //$NON-NLS-1$
	}
}
