/*******************************************************************************
* Copyright (c) 2007 IBM Corporation.
* 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
*
* Contributors:
* Robert Fuhrer (rfuhrer@watson.ibm.com) - initial API and implementation
*******************************************************************************/
/**
*
*/
package org.eclipse.imp.editor;
import java.util.ArrayList;
import org.eclipse.core.resources.IStorage;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.imp.language.ILanguageService;
import org.eclipse.jface.viewers.IColorProvider;
import org.eclipse.jface.viewers.ILabelDecorator;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
public class OutlineLabelProvider implements ILabelProvider, IColorProvider, ILanguageService /*, IPropertyChangeListener (to react to preference changes) */{
boolean fShowDefiningType;
private boolean fIsShowingInheritedMembers;
protected ListenerList fListeners= new ListenerList();
private final ILabelProvider fLanguageLabelProvider;
private ArrayList<ILabelDecorator> fLabelDecorators;
protected final StorageLabelProvider fStorageLabelProvider;
protected final IElementImageProvider fImageLabelProvider;
private Color fForegroundColor;
public interface IElementImageProvider extends ILanguageService {
Image getImageLabel(Object element, long imageFlags);
}
public OutlineLabelProvider(ILabelProvider langLabelProvider, IElementImageProvider elemImageProvider, boolean showInheritedMembers, boolean showStorage, Color foregroundColor) {
fLanguageLabelProvider= langLabelProvider;
fImageLabelProvider= elemImageProvider; // new JikesPGElementImageProvider();
fIsShowingInheritedMembers= showInheritedMembers;
fForegroundColor= foregroundColor;
fStorageLabelProvider= showStorage ? new StorageLabelProvider() : null;
}
/**
* Adds a decorator to the label provider
*/
public void addLabelDecorator(ILabelDecorator decorator) {
if (fLabelDecorators == null) {
fLabelDecorators= new ArrayList<ILabelDecorator>(2);
}
fLabelDecorators.add(decorator);
}
/*
* @see ILabelProvider#getText
*/
public String getText(Object element) {
String result= fLanguageLabelProvider.getText(element); // JikesPGElementLabels.getTextLabel(element, getTextFlags(element));
if (result.length() == 0 && (element instanceof IStorage)) {
result= fStorageLabelProvider.getText(element);
}
result= decorateText(result, element);
if (fShowDefiningType) {
// IType type= getDefiningType(element);
// if (type != null) {
// StringBuffer buf= new StringBuffer(super.getText(type));
// buf.append(JavaElementLabels.CONCAT_STRING);
// buf.append(result);
// return buf.toString();
// }
}
return result;
}
private long getTextFlags(Object element) {
// TODO Auto-generated method stub
return 0;
}
private long getImageFlags(Object element) {
// TODO Auto-generated method stub
return 0;
}
protected String decorateText(String text, Object element) {
if (fLabelDecorators != null && text.length() > 0) {
for(int i= 0; i < fLabelDecorators.size(); i++) {
ILabelDecorator decorator= (ILabelDecorator) fLabelDecorators.get(i);
text= decorator.decorateText(text, element);
}
}
return text;
}
/*
* @see org.eclipse.jdt.internal.ui.viewsupport.JavaUILabelProvider#getForeground(java.lang.Object)
*/
public Color getForeground(Object element) {
if (fIsShowingInheritedMembers) {
// if (element instanceof ASTNode) {
// ASTNode node= (ASTNode) element;
//
// if (fInput.getElementType() == IJavaElement.CLASS_FILE)
// je= je.getAncestor(IJavaElement.CLASS_FILE);
// else
// je= je.getAncestor(IJavaElement.COMPILATION_UNIT);
// if (fInput.equals(je)) {
// return null;
// }
// }
return fForegroundColor;
}
return null;
}
public Color getBackground(Object element) {
return null;
}
public void setShowDefiningType(boolean showDefiningType) {
fShowDefiningType= showDefiningType;
}
public boolean isShowDefiningType() {
return fShowDefiningType;
}
// private IType getDefiningType(Object element) {
// int kind= ((IJavaElement) element).getElementType();
// if (kind != IJavaElement.METHOD && kind != IJavaElement.FIELD && kind != IJavaElement.INITIALIZER) {
// return null;
// }
// IType declaringType= ((IMember) element).getDeclaringType();
// if (kind != IJavaElement.METHOD) {
// return declaringType;
// }
// ITypeHierarchy hierarchy= getSuperTypeHierarchy(declaringType);
// if (hierarchy == null) {
// return declaringType;
// }
// IMethod method= (IMethod) element;
// int flags= method.getFlags();
// if (Flags.isPrivate(flags) || Flags.isStatic(flags) || method.isConstructor()) {
// return declaringType;
// }
// IMethod res= JavaModelUtil.findMethodDeclarationInHierarchy(hierarchy, declaringType, method.getElementName(), method.getParameterTypes(), false);
// if (res == null || method.equals(res)) {
// return declaringType;
// }
// return res.getDeclaringType();
// }
public Image getImage(Object element) {
Image result= null;
if (fImageLabelProvider != null)
result= fImageLabelProvider.getImageLabel(element, getImageFlags(element));
else if (fLanguageLabelProvider != null)
result= fLanguageLabelProvider.getImage(element);
if (result == null && (element instanceof IStorage)) {
result= fStorageLabelProvider.getImage(element);
}
return decorateImage(result, element);
}
protected Image decorateImage(Image image, Object element) {
if (fLabelDecorators != null && image != null) {
for(int i= 0; i < fLabelDecorators.size(); i++) {
ILabelDecorator decorator= (ILabelDecorator) fLabelDecorators.get(i);
image= decorator.decorateImage(image, element);
}
}
return image;
}
public void addListener(ILabelProviderListener listener) {
fListeners.add(listener);
}
public void dispose() {
if (fLabelDecorators != null) {
for(int i= 0; i < fLabelDecorators.size(); i++) {
ILabelDecorator decorator= (ILabelDecorator) fLabelDecorators.get(i);
decorator.dispose();
}
fLabelDecorators= null;
}
if (fStorageLabelProvider != null)
fStorageLabelProvider.dispose();
}
public boolean isLabelProperty(Object element, String property) {
return true;
}
public void removeListener(ILabelProviderListener listener) {
if (fLabelDecorators != null) {
for(int i= 0; i < fLabelDecorators.size(); i++) {
ILabelDecorator decorator= (ILabelDecorator) fLabelDecorators.get(i);
decorator.removeListener(listener);
}
}
fListeners.remove(listener);
}
}