/*******************************************************************************
 * Copyright (c) 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
 *******************************************************************************/
package org.eclipse.wst.css.core.internal.util;



import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;

/**
 * 
 */
public class RegionIterator {

	private IStructuredDocumentRegion documentRegion = null;
	private IStructuredDocumentRegion curDocumentRegion = null;
	private int current = -1;

	/**
	 * 
	 */
	public RegionIterator(IStructuredDocument structuredDocument, int index) {
		super();

		reset(structuredDocument, index);
	}

	/**
	 * 
	 */
	public RegionIterator(IStructuredDocumentRegion flatNode, ITextRegion region) {
		super();
		reset(flatNode, region);
	}

	/**
	 * 
	 */
	public IStructuredDocumentRegion getStructuredDocumentRegion() {
		return curDocumentRegion;
	}

	/**
	 * 
	 */
	public boolean hasNext() {
		if (documentRegion == null)
			return false;
		if (current < 0)
			return false;
		if (current < documentRegion.getRegions().size())
			return true;
		return false;
	}

	/**
	 * 
	 */
	public boolean hasPrev() {
		// the same as hasNext()
		return hasNext();
	}

	/**
	 * 
	 */
	public ITextRegion next() {
		if (documentRegion == null)
			return null;
		if (current < 0 || documentRegion.getRegions() == null || documentRegion.getRegions().size() <= current)
			return null;

		ITextRegion region = documentRegion.getRegions().get(current);
		curDocumentRegion = documentRegion;

		if (current >= documentRegion.getRegions().size() - 1) {
			documentRegion = documentRegion.getNext();
			current = -1;
		}
		current++;

		return region;
	}

	/**
	 * 
	 */
	public ITextRegion prev() {
		if (documentRegion == null)
			return null;
		if (current < 0 || documentRegion.getRegions() == null || documentRegion.getRegions().size() <= current)
			return null;

		ITextRegion region = documentRegion.getRegions().get(current);
		curDocumentRegion = documentRegion;

		if (current == 0) {
			documentRegion = documentRegion.getPrevious();
			if (documentRegion != null)
				current = documentRegion.getRegions().size();
			else
				current = 0;
		}
		current--;

		return region;
	}

	/**
	 * 
	 */
	public void reset(IStructuredDocument structuredDocument, int index) {
		documentRegion = structuredDocument.getRegionAtCharacterOffset(index);
		curDocumentRegion = documentRegion;
		if (documentRegion != null) {
			ITextRegion region = documentRegion.getRegionAtCharacterOffset(index);
			current = documentRegion.getRegions().indexOf(region);
		}
	}

	/**
	 * 
	 */
	public void reset(IStructuredDocumentRegion flatNode, ITextRegion region) {
		if (region != null && flatNode != null) {
			this.documentRegion = flatNode;
			curDocumentRegion = flatNode;
			current = flatNode.getRegions().indexOf(region);
		}
	}
}