/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.ui.tests.packageview;

import org.eclipse.core.resources.IResourceDelta;

import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaElementDelta;
import org.eclipse.jdt.core.IJavaModel;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;

/**
 * @author Jen's account
 *
 */
public class TestDelta implements IJavaElementDelta {

	private int fKind;
	private IJavaElement fElement;

	private IJavaElementDelta[] fAffectedChildren;

	public TestDelta(int kind, IJavaElement element) {
		fKind= kind;
		fElement= element;
	}
	/**
		* @see org.eclipse.jdt.core.IJavaElementDelta#getAddedChildren()
		*/
	public IJavaElementDelta[] getAddedChildren() {
		return null;
	}
	/**
		* @see org.eclipse.jdt.core.IJavaElementDelta#getAffectedChildren()
		*/
	public IJavaElementDelta[] getAffectedChildren() {
		if (fAffectedChildren == null)
			return new IJavaElementDelta[0];
		else
			return fAffectedChildren;
	}
	/**
		* @see org.eclipse.jdt.core.IJavaElementDelta#getChangedChildren()
		*/
	public IJavaElementDelta[] getChangedChildren() {
		return null;
	}
	/**
		* @see org.eclipse.jdt.core.IJavaElementDelta#getElement()
		*/
	public IJavaElement getElement() {
		return fElement;
	}
	/**
		* @see org.eclipse.jdt.core.IJavaElementDelta#getFlags()
		*/
	public int getFlags() {
		return 0;
	}
	/**
		* @see org.eclipse.jdt.core.IJavaElementDelta#getKind()
		*/
	public int getKind() {
		return fKind;
	}
	/**
		* @see org.eclipse.jdt.core.IJavaElementDelta#getMovedFromElement()
		*/
	public IJavaElement getMovedFromElement() {
		return null;
	}
	/**
		* @see org.eclipse.jdt.core.IJavaElementDelta#getMovedToElement()
		*/
	public IJavaElement getMovedToElement() {
		return null;
	}
	/**
		* @see org.eclipse.jdt.core.IJavaElementDelta#getRemovedChildren()
		*/
	public IJavaElementDelta[] getRemovedChildren() {
		return null;
	}
	/**
		* @see org.eclipse.jdt.core.IJavaElementDelta#getResourceDeltas()
		*/
	public IResourceDelta[] getResourceDeltas() {
		return null;
	}

	public void setAffectedChildren(IJavaElementDelta[] children) {
		fAffectedChildren= children;
	}
	
	public static TestDelta createParentDeltas(IPackageFragment frag, TestDelta delta) {
		IJavaElement root= frag.getParent();
		TestDelta rootDelta= new TestDelta(IJavaElementDelta.CHANGED, root);

		IJavaProject proj= root.getJavaProject();
		TestDelta projectDelta= new TestDelta(IJavaElementDelta.CHANGED, proj);

		IJavaModel model= proj.getJavaModel();
		TestDelta modelDelta= new TestDelta(IJavaElementDelta.CHANGED, model);

		//set affected children
		modelDelta.setAffectedChildren(new IJavaElementDelta[] { projectDelta });
		projectDelta.setAffectedChildren(new IJavaElementDelta[] { rootDelta });
		rootDelta.setAffectedChildren(new IJavaElementDelta[] { delta });
		return modelDelta;
	}

	public static IJavaElementDelta createCUDelta(ICompilationUnit[] cu, IPackageFragment parent, int action) {
		TestDelta fragmentDelta= new TestDelta(IJavaElementDelta.CHANGED, parent);

		TestDelta[] deltas= new TestDelta[cu.length];
		for (int i= 0; i < cu.length; i++) {
			deltas[i]= new TestDelta(action, cu[i]);
		}

		fragmentDelta.setAffectedChildren(deltas);
		return createParentDeltas(parent, fragmentDelta);
	}

	public static IJavaElementDelta createDelta(IPackageFragment frag, int action) {
		TestDelta delta= new TestDelta(action, frag);
		return createParentDeltas(frag, delta);
	}

}
