1 11 package org.eclipse.ui.internal.views.properties.tabbed.view; 12 13 import java.util.ArrayList ; 14 import java.util.HashMap ; 15 import java.util.HashSet ; 16 import java.util.Iterator ; 17 import java.util.List ; 18 import java.util.Map ; 19 import java.util.Set ; 20 21 import org.eclipse.jface.viewers.IFilter; 22 import org.eclipse.jface.viewers.ISelection; 23 import org.eclipse.jface.viewers.IStructuredSelection; 24 import org.eclipse.ui.views.properties.tabbed.ISectionDescriptor; 25 import org.eclipse.ui.views.properties.tabbed.ITypeMapper; 26 27 33 public class TabbedPropertyRegistryClassSectionFilter { 34 35 private ITypeMapper typeMapper = null; 36 37 40 protected TabbedPropertyRegistryClassSectionFilter(ITypeMapper typeMapper) { 41 super(); 42 this.typeMapper = typeMapper; 43 } 44 45 49 protected boolean appliesToSelection(ISectionDescriptor descriptor, 50 ISelection selection) { 51 52 if (selection instanceof IStructuredSelection 53 && selection.isEmpty() == false) { 54 55 if (descriptor.getEnablesFor() != ISectionDescriptor.ENABLES_FOR_ANY 56 && ((IStructuredSelection) selection).size() != descriptor 57 .getEnablesFor()) { 58 62 return false; 63 } 64 65 IFilter filter = descriptor.getFilter(); 66 67 if (filter != null) { 68 for (Iterator i = ((IStructuredSelection) selection).iterator(); i 69 .hasNext();) { 70 Object object = i.next(); 71 72 if (filter != null && filter.select(object) == false) { 73 77 return false; 78 } 79 } 80 83 return true; 84 } 85 86 Set effectiveTypes = new HashSet (); 87 88 for (Iterator i = ((IStructuredSelection) selection).iterator(); i 89 .hasNext();) { 90 91 Object object = i.next(); 92 93 Class remapType = object.getClass(); 94 if (typeMapper != null) { 95 remapType = typeMapper.mapType(object); 96 } 97 98 if (effectiveTypes.add(remapType)) { 99 100 if (appliesToEffectiveType(descriptor, remapType) == false) { 102 return false; 103 } 104 } 105 } 106 } 107 108 return true; 109 } 110 111 private boolean appliesToEffectiveType(ISectionDescriptor descriptor, 112 Class inputClass) { 113 114 ArrayList classTypes = getClassTypes(inputClass); 115 116 List sectionInputTypes = descriptor.getInputTypes(); 117 for (Iterator j = sectionInputTypes.iterator(); j.hasNext();) { 118 String type = (String ) j.next(); 119 if (classTypes.contains(type)) { 120 return true; 122 } 123 } 124 125 return false; 126 } 127 128 132 protected ArrayList getClassTypes(Class target) { 133 ArrayList result = new ArrayList (); 134 List classes = computeClassOrder(target); 136 for (Iterator i = classes.iterator(); i.hasNext();) { 137 result.add(((Class ) i.next()).getName()); 138 } 139 result.addAll(computeInterfaceOrder(classes)); 141 return result; 142 } 143 144 private List computeClassOrder(Class target) { 145 List result = new ArrayList (4); 146 Class clazz = target; 147 while (clazz != null) { 148 result.add(clazz); 149 clazz = clazz.getSuperclass(); 150 } 151 return result; 152 } 153 154 private List computeInterfaceOrder(List classes) { 155 List result = new ArrayList (4); 156 Map seen = new HashMap (4); 157 for (Iterator iter = classes.iterator(); iter.hasNext();) { 158 Class [] interfaces = ((Class ) iter.next()).getInterfaces(); 159 internalComputeInterfaceOrder(interfaces, result, seen); 160 } 161 return result; 162 } 163 164 private void internalComputeInterfaceOrder(Class [] interfaces, List result, 165 Map seen) { 166 List newInterfaces = new ArrayList (seen.size()); 167 for (int i = 0; i < interfaces.length; i++) { 168 Class interfac = interfaces[i]; 169 if (seen.get(interfac) == null) { 170 result.add(interfac.getName()); 171 seen.put(interfac, interfac); 172 newInterfaces.add(interfac); 173 } 174 } 175 for (Iterator iter = newInterfaces.iterator(); iter.hasNext();) { 176 internalComputeInterfaceOrder( 177 ((Class ) iter.next()).getInterfaces(), result, seen); 178 } 179 } 180 } 181 | Popular Tags |