/*******************************************************************************
 * Copyright (c) 2000, 2010 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.gef.tools;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPartViewer;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.Request;

/**
 * Utilities for {@link org.eclipse.gef.Tool Tools}.
 */
public class ToolUtilities {

	/**
	 * Returns a list containing the top level selected edit parts based on the
	 * viewer's selection.
	 * 
	 * @param viewer
	 *            the viewer
	 * @return the selection excluding dependants
	 */
	public static List getSelectionWithoutDependants(EditPartViewer viewer) {
		List selectedParts = viewer.getSelectedEditParts();
		List result = new ArrayList();
		for (int i = 0; i < selectedParts.size(); i++) {
			GraphicalEditPart editpart = (GraphicalEditPart) selectedParts
					.get(i);
			if (!isAncestorContainedIn(selectedParts, editpart))
				result.add(editpart);
		}
		return result;
	}

	/**
	 * Returns a list containing the top level selected edit parts based on the
	 * passed in list of selection.
	 * 
	 * @param selectedParts
	 *            the complete selection
	 * @return the selection excluding dependants
	 */
	public static List getSelectionWithoutDependants(List selectedParts) {
		List result = new ArrayList();
		for (int i = 0; i < selectedParts.size(); i++) {
			GraphicalEditPart editpart = (GraphicalEditPart) selectedParts
					.get(i);
			if (!isAncestorContainedIn(selectedParts, editpart))
				result.add(editpart);
		}
		return result;
	}

	/**
	 * Filters the given list of EditParts so that the list only contains the
	 * EditParts that understand the given request (i.e. return
	 * <code>true</code> from {@link EditPart#understandsRequest(Request)} when
	 * passed the given request).
	 * 
	 * @param list
	 *            the list of edit parts to filter
	 * @param request
	 *            the request
	 */
	public static void filterEditPartsUnderstanding(List list, Request request) {
		Iterator iter = list.iterator();
		while (iter.hasNext()) {
			EditPart ep = (EditPart) iter.next();
			if (!ep.understandsRequest(request))
				iter.remove();
		}
	}

	/**
	 * Checks if collection contains any ancestor of editpart <code>ep</code>
	 * 
	 * @param c
	 *            - collection of editparts
	 * @param ep
	 *            - the editparts to check ancestors for
	 * @return <code>true</code> if collection contains any ancestor(s) of the
	 *         editpart <code>ep</code>
	 * @since 3.6
	 */
	public static boolean isAncestorContainedIn(Collection c, EditPart ep) {
		ep = ep.getParent();
		while (ep != null) {
			if (c.contains(ep))
				return true;
			ep = ep.getParent();
		}
		return false;
	}

	/**
	 * Returns the common parent editpart for given pair of EditParts. If the
	 * two parts are identical, the result is that part. If the two parts do not
	 * have a common ancestor, some form of RuntimeException will be thrown.
	 * 
	 * @since 3.1
	 * @param ll
	 *            the first editpart
	 * @param rr
	 *            the second editpart
	 * @return the editpart which is the common ancestor.
	 */
	public static EditPart findCommonAncestor(EditPart ll, EditPart rr) {
		if (ll == rr)
			return ll;
		ArrayList leftAncestors = new ArrayList();
		ArrayList rightAncestors = new ArrayList();
		EditPart l = ll;
		EditPart r = rr;
		while (l != null) {
			leftAncestors.add(l);
			l = l.getParent();
		}
		while (r != null) {
			rightAncestors.add(r);
			r = r.getParent();
		}

		int il = leftAncestors.size() - 1;
		int ir = rightAncestors.size() - 1;
		do {
			if (leftAncestors.get(il) != rightAncestors.get(ir))
				break;
			il--;
			ir--;
		} while (il >= 0 && ir >= 0);

		return (EditPart) leftAncestors.get(il + 1);
	}

}
