/*******************************************************************************
 * Copyright (c) 2001, 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 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Jens Lukowski/Innoopract - initial renaming/restructuring
 *     
 *******************************************************************************/
package org.eclipse.wst.sse.core.internal.provisional.text;

/**
 * A ITextRegionCollection is a collection of ITextRegions. It is a structural
 * unit, but a minimal one. For example, in might consist of a "start tag" but
 * not a whole XML element.
 */
public interface IStructuredDocumentRegion extends ITextRegionCollection {

	/**
	 * Adds a text region to the end of the collection of regions contained by
	 * this region. It is the parsers responsibility to make sure its a
	 * correct region (that is, its start offset is one greater than previous
	 * regions end offset)
	 * 
	 * For use by parsers and reparsers only.
	 */
	void addRegion(ITextRegion aRegion);

	/**
	 * Returns the structured document region that follows this one or null if
	 * at end of document.
	 * 
	 * @return the structured document region that follows this one.
	 * 
	 * ISSUE: for thread safety, this should be more restrictive.
	 */
	IStructuredDocumentRegion getNext();

	/**
	 * Returns this regions parent document.
	 * 
	 * @return this regions parent document.
	 */
	IStructuredDocument getParentDocument();

	/**
	 * Returns the structured document region that preceeds this one or null
	 * if at beginning of document.
	 * 
	 * @return the structured document region that follows this one.
	 * 
	 * ISSUE: for thread safety, this should be more restrictive.
	 */
	IStructuredDocumentRegion getPrevious();

	/**
	 * Returns true if this document has been deleted, and is no longer part
	 * of the actual structured document. This field can be used in
	 * multi-threaded operations, which may retrieve a long list of regions
	 * and be iterating through them at the same time the document is
	 * modified, and regions deleted.
	 * 
	 * @return true if this region is no longer part of document.
	 */
	boolean isDeleted();

	/**
	 * Returns true if this structured document region was ended "naturally"
	 * by syntactic rules, or if simply assumed to end so another could be
	 * started.
	 * 
	 * @return true if region has syntactic end.
	 */
	boolean isEnded();

	/**
	 * Tests is region is equal to this one, ignoring position offsets of
	 * shift.
	 * 
	 * For use by parsers and reparsers only.
	 * 
	 * @param region
	 * @param shift
	 * @return
	 */
	boolean sameAs(IStructuredDocumentRegion region, int shift);

	/**
	 * Tests if <code>oldRegion</code> is same as <code>newRegion</code>,
	 * ignoring position offsets of <code>shift</code>.
	 * 
	 * ISSUE: which document region are old and new in?
	 * 
	 * For use by parsers and reparsers only.
	 * 
	 * @param oldRegion
	 * @param documentRegion
	 * @param newRegion
	 * @param shift
	 * @return
	 */
	boolean sameAs(ITextRegion oldRegion, IStructuredDocumentRegion documentRegion, ITextRegion newRegion, int shift);

	/**
	 * Set to true if/when this region is removed from a document, during the
	 * process of re-parsing.
	 * 
	 * For use by parsers and reparsers only.
	 * 
	 * @param deleted
	 */
	void setDeleted(boolean deleted);

	/**
	 * Set to true by parser/reparser if region deemed to end syntactically.
	 * 
	 * For use by parsers and reparsers only.
	 * 
	 * @param hasEnd
	 */
	void setEnded(boolean hasEnd);

	/**
	 * Sets length of region.
	 * 
	 * For use by parsers and reparsers only.
	 */
	void setLength(int newLength);

	/**
	 * Assigns pointer to next region, or null if last region.
	 * 
	 * For use by parsers and reparsers only.
	 */
	void setNext(IStructuredDocumentRegion newNext);

	/**
	 * Assigns parent documnet.
	 * 
	 * For use by parsers and reparsers only.
	 */
	void setParentDocument(IStructuredDocument document);

	/**
	 * Assigns pointer to previous region, or null if first region.
	 * 
	 * For use by parsers and reparsers only.
	 */
	void setPrevious(IStructuredDocumentRegion newPrevious);

	/**
	 * Sets start offset of region, relative to beginning of document.
	 * 
	 * For use by parsers and reparsers only.
	 */
	void setStart(int newStart);



}
