| /******************************************************************************* |
| * Copyright (c) 2000, 2017 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| *******************************************************************************/ |
| package org.eclipse.dltk.internal.ui.typehierarchy; |
| |
| import org.eclipse.dltk.core.Flags; |
| import org.eclipse.dltk.core.IMethod; |
| import org.eclipse.dltk.core.IModelElement; |
| import org.eclipse.dltk.core.IType; |
| import org.eclipse.dltk.core.ITypeHierarchy; |
| import org.eclipse.dltk.core.ModelException; |
| import org.eclipse.dltk.internal.core.hierarchy.TypeHierarchy; |
| import org.eclipse.dltk.ui.DLTKPluginImages; |
| import org.eclipse.dltk.ui.DLTKUIPlugin; |
| import org.eclipse.dltk.ui.ScriptElementImageDescriptor; |
| import org.eclipse.dltk.ui.ScriptElementImageProvider; |
| import org.eclipse.dltk.ui.ScriptElementLabels; |
| import org.eclipse.dltk.ui.viewsupport.AppearanceAwareLabelProvider; |
| import org.eclipse.dltk.ui.viewsupport.ScriptUILabelProvider; |
| import org.eclipse.jface.preference.IPreferenceStore; |
| import org.eclipse.jface.resource.CompositeImageDescriptor; |
| import org.eclipse.jface.resource.ImageDescriptor; |
| import org.eclipse.jface.viewers.ILabelProvider; |
| import org.eclipse.jface.viewers.ViewerFilter; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.graphics.Color; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.graphics.ImageData; |
| import org.eclipse.swt.graphics.Point; |
| import org.eclipse.swt.widgets.Display; |
| |
| /** |
| * Label provider for the hierarchy viewers. Types in the hierarchy that are not |
| * belonging to the input scope are rendered differntly. |
| */ |
| public class HierarchyLabelProvider extends AppearanceAwareLabelProvider { |
| |
| private static class FocusDescriptor extends CompositeImageDescriptor { |
| private ImageDescriptor fBase; |
| |
| public FocusDescriptor(ImageDescriptor base) { |
| fBase = base; |
| } |
| |
| @Override |
| protected void drawCompositeImage(int width, int height) { |
| drawImage(getImageData(fBase), 0, 0); |
| // drawImage(getImageData(DLTKPluginImages.DESC_OVR_FOCUS), 0, 0); |
| } |
| |
| private ImageData getImageData(ImageDescriptor descriptor) { |
| ImageData data = descriptor.getImageData(); |
| // see bug 51965: |
| // getImageData can |
| // return null |
| if (data == null) { |
| data = DEFAULT_IMAGE_DATA; |
| DLTKUIPlugin |
| .logErrorMessage("Image data not available: " + descriptor.toString()); //$NON-NLS-1$ |
| } |
| return data; |
| } |
| |
| @Override |
| protected Point getSize() { |
| return ScriptElementImageProvider.BIG_SIZE; |
| } |
| |
| @Override |
| public int hashCode() { |
| return fBase.hashCode(); |
| } |
| |
| @Override |
| public boolean equals(Object object) { |
| return object != null |
| && FocusDescriptor.class.equals(object.getClass()) |
| && ((FocusDescriptor) object).fBase.equals(fBase); |
| } |
| } |
| |
| private Color fGrayedColor; |
| private Color fSpecialColor; |
| |
| private ViewerFilter fFilter; |
| |
| private TypeHierarchyLifeCycle fHierarchy; |
| |
| public HierarchyLabelProvider(TypeHierarchyLifeCycle lifeCycle, |
| IPreferenceStore store) { |
| super(DEFAULT_TEXTFLAGS | ScriptElementLabels.USE_RESOLVED, |
| DEFAULT_IMAGEFLAGS, store); |
| fHierarchy = lifeCycle; |
| fFilter = null; |
| } |
| |
| /** |
| * @return Returns the filter. |
| */ |
| public ViewerFilter getFilter() { |
| return fFilter; |
| } |
| |
| /** |
| * @param filter |
| * The filter to set. |
| */ |
| public void setFilter(ViewerFilter filter) { |
| fFilter = filter; |
| } |
| |
| protected boolean isDifferentScope(IType type) { |
| if (fFilter != null && !fFilter.select(null, null, type)) { |
| return true; |
| } |
| |
| IModelElement input = fHierarchy.getInputElement(); |
| if (input == null || input.getElementType() == IModelElement.TYPE) { |
| return false; |
| } |
| |
| IModelElement parent = type.getAncestor(input.getElementType()); |
| if (input.getElementType() == IModelElement.PROJECT_FRAGMENT) { |
| if (parent == null |
| || parent.getElementName().equals(input.getElementName())) { |
| return false; |
| } |
| } else if (input.equals(parent)) { |
| return false; |
| } |
| return true; |
| } |
| |
| @Override |
| public String getText(Object element) { |
| if (element instanceof CumulativeType) { |
| CumulativeType cType = (CumulativeType) element; |
| return super.getText(cType.getFirst()); |
| } else if (element instanceof CumulativeType.Part) { |
| CumulativeType.Part part = (CumulativeType.Part) element; |
| return ScriptElementLabels.getDefault().getTextLabel( |
| part.type.getSourceModule(), |
| ScriptElementLabels.ALL_FULLY_QUALIFIED); |
| } else { |
| return super.getText(element); |
| } |
| } |
| |
| private boolean isCustomTypeHierarchy() { |
| final ITypeHierarchy hierarchy = fHierarchy.getHierarchy(); |
| return hierarchy != null && !(hierarchy instanceof TypeHierarchy); |
| } |
| |
| private ILabelProvider fScriptLabelProvider = null; |
| |
| private ILabelProvider getScriptLabelProvider() { |
| if (fScriptLabelProvider == null) { |
| fScriptLabelProvider = new ScriptUILabelProvider(); |
| } |
| return fScriptLabelProvider; |
| } |
| |
| @Override |
| public Image getImage(Object element) { |
| Image result = null; |
| if (element instanceof IType) { |
| if (isCustomTypeHierarchy()) { |
| // TODO (alex) think of better solution |
| return getScriptLabelProvider().getImage(element); |
| } |
| ImageDescriptor desc = getTypeImageDescriptor((IType) element); |
| if (desc != null) { |
| if (element.equals(fHierarchy.getInputElement())) { |
| desc = new FocusDescriptor(desc); |
| } |
| result = DLTKUIPlugin.getImageDescriptorRegistry().get(desc); |
| } |
| } else if (element instanceof CumulativeType) { |
| final CumulativeType cType = (CumulativeType) element; |
| ImageDescriptor desc = getTypeImageDescriptor(cType.getFirst()); |
| if (desc != null) { |
| if (cType.contains(fHierarchy.getInputElement())) { |
| desc = new FocusDescriptor(desc); |
| } |
| result = DLTKUIPlugin.getImageDescriptorRegistry().get(desc); |
| } |
| } else if (element instanceof CumulativeType.Part) { |
| final CumulativeType.Part part = (CumulativeType.Part) element; |
| result = super.getImage(part.type.getSourceModule()); |
| ImageDescriptor desc = new ScriptElementImageDescriptor( |
| ImageDescriptor.createFromImage(result), 0, |
| ScriptElementImageProvider.BIG_SIZE); |
| result = DLTKUIPlugin.getImageDescriptorRegistry().get(desc); |
| } else { |
| result = fImageLabelProvider.getImageLabel(element, |
| evaluateImageFlags(element)); |
| } |
| return decorateImage(result, element); |
| } |
| |
| private ImageDescriptor getTypeImageDescriptor(IType type) { |
| ITypeHierarchy hierarchy = fHierarchy.getHierarchy(); |
| if (hierarchy == null) { |
| return new ScriptElementImageDescriptor( |
| DLTKPluginImages.DESC_OBJS_CLASS, 0, |
| ScriptElementImageProvider.BIG_SIZE); |
| } |
| |
| int flags = hierarchy.getCachedFlags(type); |
| if (flags == -1) { |
| try { |
| flags = type.getFlags(); |
| if (hierarchy instanceof TypeHierarchy) { |
| ((TypeHierarchy) hierarchy).cacheFlags(type, flags); |
| } |
| } catch (ModelException e) { |
| } |
| } |
| // boolean isInner= (type.getDeclaringType() != null); |
| |
| ImageDescriptor desc = ScriptElementImageProvider |
| .getTypeImageDescriptor(flags, isDifferentScope(type)); |
| // (isInner, false, flags, isDifferentScope (type) ); |
| boolean isInterface = Flags.isInterface(flags); |
| int adornmentFlags = 0; |
| if (Flags.isFinal(flags)) { |
| adornmentFlags |= ScriptElementImageDescriptor.FINAL; |
| } |
| if (Flags.isAbstract(flags) && !isInterface) { |
| adornmentFlags |= ScriptElementImageDescriptor.ABSTRACT; |
| } |
| if (Flags.isStatic(flags)) { |
| adornmentFlags |= ScriptElementImageDescriptor.STATIC; |
| } |
| |
| return new ScriptElementImageDescriptor(desc, adornmentFlags, |
| ScriptElementImageProvider.BIG_SIZE); |
| } |
| |
| @Override |
| public Color getForeground(Object element) { |
| if (element instanceof IMethod) { |
| if (fSpecialColor == null) { |
| fSpecialColor = Display.getCurrent().getSystemColor( |
| SWT.COLOR_DARK_BLUE); |
| } |
| return fSpecialColor; |
| } else if (element instanceof IType |
| && isDifferentScope((IType) element)) { |
| if (fGrayedColor == null) { |
| fGrayedColor = Display.getCurrent().getSystemColor( |
| SWT.COLOR_DARK_GRAY); |
| } |
| return fGrayedColor; |
| } |
| return null; |
| } |
| |
| } |