package org.eclipse.uml2.diagram.common.sheet.chooser; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Set; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EReference; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.uml2.uml.Element; import org.eclipse.uml2.uml.ElementImport; import org.eclipse.uml2.uml.UMLPackage; public class UMLContainmentFilter extends ViewerFilter { private static MetaclassContainmentFilter TEMPLATE_EXCLUDED; private static MetaclassContainmentFilter NOTHING_EXCLUDED; private Set<EClass> myAllowedMetaclasses; public UMLContainmentFilter(EReference feature, boolean considerUMLTemplates) { MetaclassContainmentFilter metaFilter = considerUMLTemplates ? getTemplateAwareInstance() : getWithoutTemplatesInstance(); myAllowedMetaclasses = metaFilter.getAncestorsOrSelf(feature.getEReferenceType()); } @Override public boolean select(Viewer viewer, Object parentElement, Object object) { if (false == object instanceof Element) { return true; //we don't care } Element umlElement = (Element) object; if (umlElement instanceof ElementImport) { umlElement = ((ElementImport) umlElement).getImportedElement(); } return umlElement != null && myAllowedMetaclasses.contains(umlElement.eClass()); } public static MetaclassContainmentFilter getTemplateAwareInstance() { if (NOTHING_EXCLUDED == null) { NOTHING_EXCLUDED = new MetaclassContainmentFilter(UMLPackage.eINSTANCE, Collections.<EReference> emptyList()); } return NOTHING_EXCLUDED; } public static MetaclassContainmentFilter getWithoutTemplatesInstance() { if (TEMPLATE_EXCLUDED == null) { UMLPackage UML = UMLPackage.eINSTANCE; List<EReference> templateRelated = Arrays.asList(new EReference[] { UML.getTemplateableElement_TemplateBinding(), UML.getTemplateSignature_OwnedParameter(), UML.getTemplateParameter_OwnedParameteredElement(), UML.getTemplateParameter_OwnedDefault(), }); TEMPLATE_EXCLUDED = new MetaclassContainmentFilter(UML, templateRelated); } return TEMPLATE_EXCLUDED; } }