/******************************************************************************* * Copyright (c) 2005, 2012 eBay Inc. * 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.vjet.eclipse.internal.ui.typehierarchy; import org.eclipse.vjet.eclipse.core.ClassFileConstants; import org.eclipse.vjet.eclipse.ui.VjoElementImageDescriptor; import org.eclipse.vjet.eclipse.ui.VjoElementImageProvider; import org.eclipse.dltk.mod.ast.Modifiers; import org.eclipse.dltk.mod.core.IMethod; import org.eclipse.dltk.mod.core.IModelElement; import org.eclipse.dltk.mod.core.IType; import org.eclipse.dltk.mod.core.ITypeHierarchy; import org.eclipse.dltk.mod.core.ModelException; import org.eclipse.dltk.mod.internal.ui.typehierarchy.TypeHierarchyLifeCycle; import org.eclipse.dltk.mod.ui.DLTKPluginImages; import org.eclipse.dltk.mod.ui.DLTKUIPlugin; import org.eclipse.dltk.mod.ui.ScriptElementImageDescriptor; import org.eclipse.dltk.mod.ui.ScriptElementImageProvider; import org.eclipse.dltk.mod.ui.ScriptElementLabels; import org.eclipse.dltk.mod.ui.viewsupport.AppearanceAwareLabelProvider; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.resource.CompositeImageDescriptor; import org.eclipse.jface.resource.ImageDescriptor; 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; public class VjoHierarchyLabelProvider extends AppearanceAwareLabelProvider { /** Flag to render the abstract adornment. */ public final static int ABSTRACT = 0x001; /** Flag to render the final adornment. */ public final static int FINAL = 0x002; /** Flag to render the mixin adorment. */ public final static int MIXIN = 0x004; /** Flag to render the static adornment. */ public final static int STATIC = 0x008; private static class FocusDescriptor extends CompositeImageDescriptor { private ImageDescriptor fBase; public FocusDescriptor(ImageDescriptor base) { fBase = base; } 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; } protected Point getSize() { return ScriptElementImageProvider.BIG_SIZE; } public int hashCode() { return fBase.hashCode(); } 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 VjoHierarchyLabelProvider(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; } /* * (non-Javadoc) * * @see ILabelProvider#getText */ public String getText(Object element) { String text = super.getText(element); return decorateText(text, element); } /* * (non-Javadoc) * * @see ILabelProvider#getImage */ public Image getImage(Object element) { Image result = null; if (element instanceof IType) { ImageDescriptor desc = getTypeImageDescriptor((IType) element); if (desc != null) { if (element.equals(fHierarchy.getInputElement())) { desc = new FocusDescriptor(desc); } 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 VjoElementImageDescriptor( DLTKPluginImages.DESC_OBJS_CLASS, 0, ScriptElementImageProvider.BIG_SIZE); } int flags = -1; try { flags = type.getFlags(); } catch (ModelException e) { e.printStackTrace(); } if (flags == -1) { return new VjoElementImageDescriptor( DLTKPluginImages.DESC_OBJS_CLASS, 0, ScriptElementImageProvider.BIG_SIZE); } boolean isInterface = (flags & ClassFileConstants.AccInterface) != 0; ; boolean isInner = (type.getDeclaringType() != null); ImageDescriptor desc = VjoElementImageProvider.getTypeImageDescriptor( flags, false);// (isInner, false, flags, // isDifferentScope(type)); int adornmentFlags = 0; if ((flags & Modifiers.AccFinal) != 0) { adornmentFlags |= FINAL; } if ((flags & Modifiers.AccAbstract) != 0 && !isInterface) { adornmentFlags |= ABSTRACT; } if ((flags & Modifiers.AccStatic) != 0) { adornmentFlags |= STATIC; } if((flags & Modifiers.AccModule) != 0) { adornmentFlags |= MIXIN; } return new ScriptElementImageDescriptor(desc, adornmentFlags, ScriptElementImageProvider.BIG_SIZE); } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object) */ 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; } }