/*
 * (c) Copyright IBM Corp. 2000, 2001.
 * All Rights Reserved.
 */
package org.eclipse.compare.structuremergeviewer;

import java.util.Iterator;
import java.util.ArrayList;
import org.eclipse.swt.graphics.Image;


/**
 * The standard implementation of a diff container element.
 * <p>
 * This class may be instantiated, or further subclassed.
 * </p>
 */
public abstract class DiffContainer extends DiffElement implements IDiffContainer {

	private static IDiffElement[] fgEmptyArray= new IDiffElement[0];
	private ArrayList fChildren;
	
	/**
	 * Creates a new container with the specified kind under the given parent. 
	 *
	 * @param parent under which the new container is added as a child or <code>null</code>.
	 * @param name of the container
	 * @param kind of difference (defined in <code>Differencer</code>).
	 */
	public DiffContainer(IDiffContainer parent, int kind) {
		super(parent, kind);
	}
	
	/**
	 * Tries to find the child with the given name.
	 * Returns <code>null</code> if no such child exists.
	 * 
	 * @param name of the child to find
	 * @return the first element with a matching name
	 */
	public IDiffElement findChild(String name) {
		Object[] children= getChildren();
		for (int i= 0; i < children.length; i++) {
			IDiffElement child= (IDiffElement) children[i];
			if (name.equals(child.getName()))
				return child;
		}
		return null;
	}

	/* (non Javadoc)
	 * see IDiffContainer.add
	 */
	public void add(IDiffElement diff) {
		if (fChildren == null)
			fChildren= new ArrayList();
		fChildren.add(diff);
		diff.setParent(this);
	}

	/**
	 * Removes the given child from this container.
	 * If the container becomes empty it is removed from its container.
	 */
	/* (non Javadoc)
	 * see IDiffContainer.removeToRoot
	 */
	public void removeToRoot(IDiffElement child) {
		if (fChildren != null) {
			fChildren.remove(child);
			child.setParent(null);
			if (fChildren.size() == 0) {
				IDiffContainer p= getParent();
				if (p != null)
					p.removeToRoot(this);
			}
		}
	}

	/**
	 * Removes the given child (non-recursively) from this container.
	 *
	 * @param child to remove
	 */
	public void remove(IDiffElement child) {
		if (fChildren != null) {
			fChildren.remove(child);
			child.setParent(null);
		}
	}
	
	/* (non Javadoc)
	 * see IDiffContainer.hasChildren
	 */
	public boolean hasChildren() {
		return fChildren != null && fChildren.size() > 0;
	}

	/* (non Javadoc)
	 * see IDiffContainer.getChildren
	 */
	public IDiffElement[] getChildren() {
		if (fChildren != null)
			return (IDiffElement[]) fChildren.toArray(fgEmptyArray);
		return fgEmptyArray;
	}
}

