1 /******************************************************************************* 2 * Copyright (c) 2000, 2020 IBM Corporation and others. 3 * 4 * This program and the accompanying materials 5 * are made available under the terms of the Eclipse Public License 2.0 6 * which accompanies this distribution, and is available at 7 * https://www.eclipse.org/legal/epl-2.0/ 8 * 9 * SPDX-License-Identifier: EPL-2.0 10 * 11 * Contributors: 12 * IBM Corporation - initial API and implementation 13 *******************************************************************************/ 14 package org.eclipse.jdt.internal.ui; 15 16 import org.eclipse.core.runtime.IAdaptable; 17 18 import org.eclipse.core.resources.IResource; 19 20 import org.eclipse.ui.IContainmentAdapter; 21 22 import org.eclipse.jdt.core.IJavaElement; 23 import org.eclipse.jdt.core.IJavaProject; 24 import org.eclipse.jdt.core.JavaCore; 25 26 public class JavaElementContainmentAdapter implements IContainmentAdapter { 27 28 @Override contains(Object workingSetElement, Object element, int flags)29 public boolean contains(Object workingSetElement, Object element, int flags) { 30 if (!(workingSetElement instanceof IJavaElement) || element == null) 31 return false; 32 33 IJavaElement workingSetJavaElement= (IJavaElement)workingSetElement; 34 IResource resource= null; 35 IJavaElement jElement= null; 36 if (element instanceof IJavaElement) { 37 jElement= (IJavaElement)element; 38 resource= jElement.getResource(); 39 } else { 40 if (element instanceof IAdaptable) { 41 resource= ((IAdaptable)element).getAdapter(IResource.class); 42 if (resource != null) { 43 jElement= findJavaElement(resource); 44 } 45 } 46 } 47 48 if (jElement != null) { 49 if (contains(workingSetJavaElement, jElement, flags)) 50 return true; 51 if (workingSetJavaElement.getElementType() == IJavaElement.PACKAGE_FRAGMENT && 52 resource.getType() == IResource.FOLDER && checkIfDescendant(flags)) 53 return isChild(workingSetJavaElement, resource); 54 } else if (resource != null) { 55 return contains(workingSetJavaElement, resource, flags); 56 } 57 return false; 58 } 59 findJavaElement(IResource resource)60 private static IJavaElement findJavaElement(IResource resource) { 61 IJavaProject project= JavaCore.create(resource.getProject()); 62 if (project == null) { 63 return null; 64 } 65 IJavaElement javaElement= JavaCore.create(resource, project); 66 if (javaElement != null && javaElement.exists()) { 67 return javaElement; 68 } 69 return null; 70 } 71 contains(IJavaElement workingSetElement, IJavaElement element, int flags)72 private boolean contains(IJavaElement workingSetElement, IJavaElement element, int flags) { 73 if (checkContext(flags) && workingSetElement.equals(element)) { 74 return true; 75 } 76 if (checkIfChild(flags) && workingSetElement.equals(element.getParent())) { 77 return true; 78 } 79 if (checkIfDescendant(flags) && check(workingSetElement, element)) { 80 return true; 81 } 82 if (checkIfAncestor(flags) && check(element, workingSetElement)) { 83 return true; 84 } 85 return false; 86 } 87 check(IJavaElement ancestor, IJavaElement descendent)88 private boolean check(IJavaElement ancestor, IJavaElement descendent) { 89 descendent= descendent.getParent(); 90 while (descendent != null) { 91 if (ancestor.equals(descendent)) 92 return true; 93 descendent= descendent.getParent(); 94 } 95 return false; 96 } 97 isChild(IJavaElement workingSetElement, IResource element)98 private boolean isChild(IJavaElement workingSetElement, IResource element) { 99 IResource resource= workingSetElement.getResource(); 100 if (resource == null) 101 return false; 102 return check(element, resource); 103 } 104 contains(IJavaElement workingSetElement, IResource element, int flags)105 private boolean contains(IJavaElement workingSetElement, IResource element, int flags) { 106 IResource workingSetResource= workingSetElement.getResource(); 107 if (workingSetResource == null) 108 return false; 109 if (checkContext(flags) && workingSetResource.equals(element)) { 110 return true; 111 } 112 if (checkIfChild(flags) && workingSetResource.equals(element.getParent())) { 113 return true; 114 } 115 if (checkIfDescendant(flags) && check(workingSetResource, element)) { 116 return true; 117 } 118 if (checkIfAncestor(flags) && check(element, workingSetResource)) { 119 return true; 120 } 121 return false; 122 } 123 check(IResource ancestor, IResource descendent)124 private boolean check(IResource ancestor, IResource descendent) { 125 descendent= descendent.getParent(); 126 while(descendent != null) { 127 if (ancestor.equals(descendent)) 128 return true; 129 descendent= descendent.getParent(); 130 } 131 return false; 132 } 133 checkIfDescendant(int flags)134 private boolean checkIfDescendant(int flags) { 135 return (flags & CHECK_IF_DESCENDANT) != 0; 136 } 137 checkIfAncestor(int flags)138 private boolean checkIfAncestor(int flags) { 139 return (flags & CHECK_IF_ANCESTOR) != 0; 140 } 141 checkIfChild(int flags)142 private boolean checkIfChild(int flags) { 143 return (flags & CHECK_IF_CHILD) != 0; 144 } 145 checkContext(int flags)146 private boolean checkContext(int flags) { 147 return (flags & CHECK_CONTEXT) != 0; 148 } 149 } 150