/*******************************************************************************
 * Copyright (c) 2004, 2005 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);
		}
	}
}
