1 11 package org.eclipse.jdt.internal.ui.typehierarchy; 12 13 import org.eclipse.swt.SWT; 14 import org.eclipse.swt.graphics.Color; 15 import org.eclipse.swt.graphics.Image; 16 import org.eclipse.swt.graphics.ImageData; 17 import org.eclipse.swt.graphics.Point; 18 import org.eclipse.swt.widgets.Display; 19 20 import org.eclipse.jface.resource.CompositeImageDescriptor; 21 import org.eclipse.jface.resource.ImageDescriptor; 22 import org.eclipse.jface.resource.JFaceResources; 23 import org.eclipse.jface.viewers.ViewerFilter; 24 25 import org.eclipse.jdt.core.Flags; 26 import org.eclipse.jdt.core.IJavaElement; 27 import org.eclipse.jdt.core.IMethod; 28 import org.eclipse.jdt.core.IType; 29 import org.eclipse.jdt.core.ITypeHierarchy; 30 31 import org.eclipse.jdt.ui.JavaElementImageDescriptor; 32 import org.eclipse.jdt.ui.JavaElementLabels; 33 34 import org.eclipse.jdt.internal.ui.JavaPlugin; 35 import org.eclipse.jdt.internal.ui.JavaPluginImages; 36 import org.eclipse.jdt.internal.ui.viewsupport.AppearanceAwareLabelProvider; 37 import org.eclipse.jdt.internal.ui.viewsupport.ColoredViewersManager; 38 import org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider; 39 40 44 public class HierarchyLabelProvider extends AppearanceAwareLabelProvider { 45 46 private static class FocusDescriptor extends CompositeImageDescriptor { 47 private ImageDescriptor fBase; 48 public FocusDescriptor(ImageDescriptor base) { 49 fBase= base; 50 } 51 protected void drawCompositeImage(int width, int height) { 52 drawImage(getImageData(fBase), 0, 0); 53 drawImage(getImageData(JavaPluginImages.DESC_OVR_FOCUS), 0, 0); 54 } 55 56 private ImageData getImageData(ImageDescriptor descriptor) { 57 ImageData data= descriptor.getImageData(); if (data == null) { 59 data= DEFAULT_IMAGE_DATA; 60 JavaPlugin.logErrorMessage("Image data not available: " + descriptor.toString()); } 62 return data; 63 } 64 65 protected Point getSize() { 66 return JavaElementImageProvider.BIG_SIZE; 67 } 68 public int hashCode() { 69 return fBase.hashCode(); 70 } 71 public boolean equals(Object object) { 72 return object != null && FocusDescriptor.class.equals(object.getClass()) && ((FocusDescriptor)object).fBase.equals(fBase); 73 } 74 } 75 76 private Color fSpecialColor; 77 78 private ViewerFilter fFilter; 79 80 private TypeHierarchyLifeCycle fHierarchy; 81 82 public HierarchyLabelProvider(TypeHierarchyLifeCycle lifeCycle) { 83 super(DEFAULT_TEXTFLAGS | JavaElementLabels.USE_RESOLVED, DEFAULT_IMAGEFLAGS); 84 85 fHierarchy= lifeCycle; 86 fFilter= null; 87 } 88 89 92 public ViewerFilter getFilter() { 93 return fFilter; 94 } 95 96 99 public void setFilter(ViewerFilter filter) { 100 fFilter= filter; 101 } 102 103 protected boolean isDifferentScope(IType type) { 104 if (fFilter != null && !fFilter.select(null, null, type)) { 105 return true; 106 } 107 108 IJavaElement input= fHierarchy.getInputElement(); 109 if (input == null || input.getElementType() == IJavaElement.TYPE) { 110 return false; 111 } 112 113 IJavaElement parent= type.getAncestor(input.getElementType()); 114 if (input.getElementType() == IJavaElement.PACKAGE_FRAGMENT) { 115 if (parent == null || parent.getElementName().equals(input.getElementName())) { 116 return false; 117 } 118 } else if (input.equals(parent)) { 119 return false; 120 } 121 return true; 122 } 123 124 127 public Image getImage(Object element) { 128 Image result= null; 129 if (element instanceof IType) { 130 ImageDescriptor desc= getTypeImageDescriptor((IType) element); 131 if (desc != null) { 132 if (element.equals(fHierarchy.getInputElement())) { 133 desc= new FocusDescriptor(desc); 134 } 135 result= JavaPlugin.getImageDescriptorRegistry().get(desc); 136 } 137 } else { 138 result= fImageLabelProvider.getImageLabel(element, evaluateImageFlags(element)); 139 } 140 return decorateImage(result, element); 141 } 142 143 private ImageDescriptor getTypeImageDescriptor(IType type) { 144 ITypeHierarchy hierarchy= fHierarchy.getHierarchy(); 145 if (hierarchy == null) { 146 return new JavaElementImageDescriptor(JavaPluginImages.DESC_OBJS_CLASS, 0, JavaElementImageProvider.BIG_SIZE); 147 } 148 149 int flags= hierarchy.getCachedFlags(type); 150 if (flags == -1) { 151 return new JavaElementImageDescriptor(JavaPluginImages.DESC_OBJS_CLASS, 0, JavaElementImageProvider.BIG_SIZE); 152 } 153 154 boolean isInterface= Flags.isInterface(flags); 155 boolean isInner= (type.getDeclaringType() != null); 156 157 ImageDescriptor desc= JavaElementImageProvider.getTypeImageDescriptor(isInner, false, flags, isDifferentScope(type)); 158 159 int adornmentFlags= 0; 160 if (Flags.isFinal(flags)) { 161 adornmentFlags |= JavaElementImageDescriptor.FINAL; 162 } 163 if (Flags.isAbstract(flags) && !isInterface) { 164 adornmentFlags |= JavaElementImageDescriptor.ABSTRACT; 165 } 166 if (Flags.isStatic(flags)) { 167 adornmentFlags |= JavaElementImageDescriptor.STATIC; 168 } 169 170 return new JavaElementImageDescriptor(desc, adornmentFlags, JavaElementImageProvider.BIG_SIZE); 171 } 172 173 176 public Color getForeground(Object element) { 177 if (element instanceof IMethod) { 178 if (fSpecialColor == null) { 179 fSpecialColor= Display.getCurrent().getSystemColor(SWT.COLOR_DARK_BLUE); 180 } 181 return fSpecialColor; 182 } else if (element instanceof IType && isDifferentScope((IType) element)) { 183 return JFaceResources.getColorRegistry().get(ColoredViewersManager.QUALIFIER_COLOR_NAME); 184 } 185 return null; 186 } 187 188 189 190 } 191 | Popular Tags |