package org.jboss.tools.bpmn2.reddeer.finder; import java.util.ArrayList; import java.util.List; import java.util.Stack; import org.eclipse.gef.EditPart; import org.hamcrest.Matcher; /** * Serves for finding EditPart's by given Matcher Method find doesn't include argument parent in output, even if parent * matches given Matcher * * @author jomarko * */ public class AllChildEditPartFinder extends Finder<EditPart> { @Override public List<EditPart> find(EditPart parent, Matcher<?> matcher) { List<EditPart> list = new ArrayList<EditPart>(); Stack<EditPart> stack = new Stack<EditPart>(); // Initial push stack.push(parent); // Depth first search while (!stack.isEmpty()) { // Pop figure EditPart child = stack.pop(); // If null then continue if (child == null) { continue; } // Does it matches? if (parent != child && matcher.matches(child)) { list.add(child); } // Push another children for (EditPart t : getChildren(child)) { stack.push(t); } } return list; } @Override public List<EditPart> getChildren(EditPart child) { return (List<EditPart>) child.getChildren(); } }