package com.onaro.sanscreen.client.view; import java.util.Collection; import java.util.HashSet; import java.util.Set; public class CompositeDirectorUtils { protected CompositeDirectorUtils() { //do nothing } /** * TODO: optimize this method. * * @return The view director, or null. */ public static ViewDirector getDescendentById(ICompositeDirector compositeDirector, String targetViewId) { if (compositeDirector == null) throw new IllegalArgumentException("compositeDirector"); //$NON-NLS-1$ if (targetViewId == null) throw new IllegalArgumentException("targetViewId"); //$NON-NLS-1$ Set descendents = getDescendents(compositeDirector); for (ViewDirector descendent : descendents) { String descendentId = descendent.getId(); if (targetViewId.equals(descendentId)) return descendent; } return null; } /** * TODO: optimize this method. * * @return The view director, or null. */ public static ViewDirector getDescendentByName(ICompositeDirector compositeDirector, String targetViewName) { if (compositeDirector == null) throw new IllegalArgumentException("compositeDirector"); //$NON-NLS-1$ if (targetViewName == null) throw new IllegalArgumentException("targetViewName"); //$NON-NLS-1$ Set descendents = getDescendents(compositeDirector); for (ViewDirector descendent : descendents) { String descendentName = descendent.getName(); if (targetViewName.equals(descendentName)) return descendent; } return null; } /** * Get all the descendent view directors of a given composite director. */ public static Set getDescendents(ICompositeDirector compositeDirector) { if (compositeDirector == null) throw new IllegalArgumentException("compositeDirector"); //$NON-NLS-1$ Set descendents = new HashSet(); getDescendents(compositeDirector, descendents); return descendents; } /** * Get all the descendent view directors (of a given class type) of a given composite director. */ public static Set getDescendentsOfType(ICompositeDirector compositeDirector, Class viewDirectorClass) { if (compositeDirector == null) throw new IllegalArgumentException("compositeDirector"); //$NON-NLS-1$ if (viewDirectorClass == null) throw new IllegalArgumentException("viewDirectorClass"); //$NON-NLS-1$ Set descendents = getDescendents(compositeDirector); Set descendentsOfType = new HashSet(); for (ViewDirector descendent : descendents) { if (viewDirectorClass.isInstance(descendent)) { descendentsOfType.add(viewDirectorClass.cast(descendent)); } } return descendentsOfType; } /** * Do a BFS finding all the descendent view directors of a given composite director. */ public static void getDescendents(ICompositeDirector compositeDirector, Collection descendents) { if (compositeDirector == null) throw new IllegalArgumentException("compositeDirector"); //$NON-NLS-1$ if (descendents == null) throw new IllegalArgumentException("descendents"); //$NON-NLS-1$ Collection childViewDirectors = compositeDirector.getChildViewDirectors(); for (ViewDirector childViewDirector : childViewDirectors) { boolean added = descendents.add(childViewDirector); if (added && childViewDirector instanceof ICompositeDirector) { ICompositeDirector subCompositeDirector = (ICompositeDirector) childViewDirector; getDescendents(subCompositeDirector, descendents); } } } }