blob: d03adaf943f4ffb1bf6bc69468b50dc6f9f6b65d [file] [log] [blame]
/*******************************************************************************
* 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);
}
}