/*******************************************************************************
 * Copyright (c) 2005, 2007 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
 *
 
 *******************************************************************************/
package org.eclipse.dltk.core;

import org.eclipse.core.resources.IResourceDelta;





public interface IModelElementDelta {

	/**
	 * Status constant indicating that the element has been added.
	 * Note that an added model element delta has no children, as they are all implicitely added.
	 */
	public int ADDED = 1;

	/**
	 * Status constant indicating that the element has been removed.
	 * Note that a removed model element delta has no children, as they are all implicitely removed.
	 */
	public int REMOVED = 2;

	/**
	 * Status constant indicating that the element has been changed,
	 * as described by the change flags.
	 * 
	 * @see #getFlags()
	 */
	public int CHANGED = 4;

	/**
	 * Change flag indicating that the content of the element has changed.
	 * This flag is only valid for elements which correspond to files.
	 */
	public int F_CONTENT = 0x00001;

	/**
	 * Change flag indicating that the modifiers of the element have changed.
	 * This flag is only valid if the element is an <code>IMember</code>. 
	 */
	public int F_MODIFIERS = 0x00002;

	/**
	 * Change flag indicating that there are changes to the children of the element.
	 * This flag is only valid if the element is an <code>IParent</code>. 
	 */
	public int F_CHILDREN = 0x00008;

	/**
	 * Change flag indicating that the element was moved from another location.
	 * The location of the old element can be retrieved using <code>getMovedFromElement</code>.
	 */
	public int F_MOVED_FROM = 0x00010;

	/**
	 * Change flag indicating that the element was moved to another location.
	 * The location of the new element can be retrieved using <code>getMovedToElement</code>.
	 */
	public int F_MOVED_TO = 0x00020;
	
	/**
	 * Change flag indicating that a buildpath entry corresponding to the element has been added to the project's buildpath. 
	 * This flag is only valid if the element is an <code>IProjectFragment</code>.
	 */
	public int F_ADDED_TO_BUILDPATH = 0x00040;

	/**
	 * Change flag indicating that a buildpath entry corresponding to the element has been removed from the project's 
	 * buildpath. This flag is only valid if the element is an <code>IProjectFragment</code>.
	 */
	public int F_REMOVED_FROM_BUILDPATH = 0x00080;

	/**
	 * Change flag indicating that the element has changed position relatively to its siblings. 
	 * If the element is an <code>IProjectFragment</code>,  a buildpath entry corresponding 
	 * to the element has changed position in the project's buildpath.
	 */
	public int F_REORDER = 0x00100;
	
	/**
	 * Change flag indicating that the underlying <code>IProject</code> has been
	 * opened. This flag is only valid if the element is an <code>IScriptProject</code>. 
	 */
	public int F_OPENED = 0x000200;
	
	/**
	 * Change flag indicating that the underlying <code>IProject</code> has been
	 * closed. This flag is only valid if the element is an <code>IScriptProject</code>. 
	 */
	public int F_CLOSED = 0x000400;
	
	/**
	 * Change flag indicating that one of the supertypes of an <code>IType</code>
	 * has changed.
	 */
	public int F_SUPER_TYPES = 0x00800;
	
	/**
	 * Change flag indicating that this is a fine-grained delta, that is, an analysis down
	 * to the members level was done to determine if there were structural changes to
	 * members.
	 * <p>
	 * Clients can use this flag to find out if a compilation unit 
     * that have a <code>F_CONTENT</code> change should assume that there are 
     * no finer grained changes (<code>F_FINE_GRAINED</code> is set) or if 
     * finer grained changes were not considered (<code>F_FINE_GRAINED</code> 
     * is not set). 
	 */
	public int F_FINE_GRAINED = 0x04000;
	
	/**
	 * Change flag indicating that the element's archive content on the buildpath has changed.
	 * This flag is only valid if the element is an <code>IProjectFragment</code>
	 * which is an archive.
	 * 
	 * @see IProjectFragment#isArchive()
	 */
	public int F_ARCHIVE_CONTENT_CHANGED = 0x008000;
	
	/**
	 * Change flag indicating that a compilation unit has become a primary working copy, or that a 
	 * primary working copy has reverted to a compilation unit.
	 * This flag is only valid if the element is an <code>ISourceModule</code>.
	 */
	public int F_PRIMARY_WORKING_COPY = 0x10000;
	
	/**
	 * Change flag indicating that the raw buildpath of a project has changed. 
	 * This flag is only valid if the element is an <code>IScriptProject</code>.
	 */
	public int F_BUILDPATH_CHANGED = 0x20000;
	
	/**
	 * Change flag indicating that the resource of a primary compilation unit has changed.
	 * This flag is only valid if the element is a primary <code>ISourceModule</code>.
	 */
	public int F_PRIMARY_RESOURCE = 0x040000;
	
	/**
	 * Returns the element that this delta describes a change to.
	 * @return the element that this delta describes a change to
	 */
	public IModelElement getElement();
	
	/**
	 * Returns deltas for the children that have been added.
	 * @return deltas for the children that have been added
	 */
	public IModelElementDelta[] getAddedChildren();

	
	/**
	 * Returns deltas for the affected (added, removed, or changed) children.
	 * @return deltas for the affected (added, removed, or changed) children
	 */
	public IModelElementDelta[] getAffectedChildren();
	
	/**
	 * Returns the kind of this delta - one of <code>ADDED</code>, <code>REMOVED</code>,
	 * or <code>CHANGED</code>.
	 * 
	 * @return the kind of this delta
	 */
	public int getKind();
	
	/**
	 * Returns flags that describe how an element has changed. 
	 * Such flags should be tested using the <code>&</code> operand. For example:
	 * <pre>
	 * if ((delta.getFlags() & IModelElementDelta.F_CONTENT) != 0) {
	 * 	// the delta indicates a content change
	 * }
	 * </pre>
	 *
	 * @return flags that describe how an element has changed
	 */
	public int getFlags();
	
	/**
	 * Returns the collection of resource deltas.
	 * <p>
	 * Note that resource deltas, like Model element deltas, are generally only valid
	 * for the dynamic scope of an event notification. Clients must not hang on to
	 * these objects.
	 * </p>
	 *
	 * @return the underlying resource deltas, or <code>null</code> if none
	 */
	public IResourceDelta[] getResourceDeltas();
	
	/**
	 * Returns an element describing this element before it was moved
	 * to its current location, or <code>null</code> if the
	 * <code>F_MOVED_FROM</code> change flag is not set. 
	 * 
	 * @return an element describing this element before it was moved
	 * to its current location, or <code>null</code> if the
	 * <code>F_MOVED_FROM</code> change flag is not set
	 */
	public IModelElement getMovedFromElement();

	/**
	 * Returns an element describing this element in its new location,
	 * or <code>null</code> if the <code>F_MOVED_TO</code> change
	 * flag is not set.
	 * 
	 * @return an element describing this element in its new location,
	 * or <code>null</code> if the <code>F_MOVED_TO</code> change
	 * flag is not set
	 */
	public IModelElement getMovedToElement();
}
