/*******************************************************************************
* Copyright (c) 2000, 2005 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
*
* Contributors:
* IBM Corporation - initial API and implementation
* Vlad Dumitrescu
*******************************************************************************/
package org.erlide.ui.editors.erl.outline;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.jface.util.SafeRunnable;
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.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.erlide.engine.model.erlang.IErlModule;
import org.erlide.engine.model.root.IErlElement;
import org.erlide.engine.model.root.IErlExternal;
import org.erlide.engine.model.root.IErlExternalRoot;
import org.erlide.util.StringUtils;
public class ErlangLabelProvider implements ILabelProvider, IColorProvider {
private static final int LABEL_LENGTH_LIMIT = 200;
protected ListenerList fListeners = new ListenerList(1);
protected ErlangElementImageProvider fImageLabelProvider;
private List<ILabelDecorator> fLabelDecorators;
private int fImageFlags;
private long fTextFlags;
/**
* Creates a new label provider with default flags.
*/
public ErlangLabelProvider() {
this(0, ErlangElementImageProvider.OVERLAY_ICONS);
}
/**
* @param textFlags
* Flags defined in <code>ErlangElementLabels</code>.
* @param imageFlags
* Flags defined in <code>ErlangElementImageProvider</code>.
*/
public ErlangLabelProvider(final long textFlags, final int imageFlags) {
fImageLabelProvider = new ErlangElementImageProvider();
fLabelDecorators = null;
fImageFlags = imageFlags;
fTextFlags = textFlags;
}
/**
* Adds a decorator to the label provider
*/
public void addLabelDecorator(final ILabelDecorator decorator) {
if (fLabelDecorators == null) {
fLabelDecorators = new ArrayList<ILabelDecorator>(2);
}
fLabelDecorators.add(decorator);
}
/**
* Sets the textFlags.
*
* @param textFlags
* The textFlags to set
*/
public final void setTextFlags(final long textFlags) {
fTextFlags = textFlags;
}
/**
* Sets the imageFlags
*
* @param imageFlags
* The imageFlags to set
*/
public final void setImageFlags(final int imageFlags) {
fImageFlags = imageFlags;
}
/**
* Gets the image flags. Can be overwriten by super classes.
*
* @return Returns a int
*/
public final int getImageFlags() {
return fImageFlags;
}
/**
* Gets the text flags.
*
* @return Returns a int
*/
public final long getTextFlags() {
return fTextFlags;
}
/**
* Evaluates the image flags for a element. Can be overwriten by super
* classes.
*
* @return Returns a int
*/
protected int evaluateImageFlags(final Object element) {
return getImageFlags();
}
/**
* Evaluates the text flags for a element. Can be overwriten by super
* classes.
*
* @return Returns a int
*/
protected long evaluateTextFlags(final Object element) {
return getTextFlags();
}
protected Image decorateImage(final Image image0, final Object element) {
Image image = image0;
if (fLabelDecorators != null && image != null) {
for (int i = 0; i < fLabelDecorators.size(); i++) {
final ILabelDecorator decorator = fLabelDecorators.get(i);
image = decorator.decorateImage(image, element);
}
}
return image;
}
@Override
public Image getImage(final Object element) {
final Image result = fImageLabelProvider.getImageLabel(element,
evaluateImageFlags(element));
return decorateImage(result, element);
}
protected String decorateText(final String text0, final Object element) {
String text = text0;
if (fLabelDecorators != null && text.length() > 0) {
for (int i = 0; i < fLabelDecorators.size(); i++) {
final ILabelDecorator decorator = fLabelDecorators.get(i);
text = decorator.decorateText(text, element);
}
}
return text;
}
@Override
public String getText(final Object element) {
final String label = getLabelString(element);
return decorateText(label, element);
}
public static String getLabelString(final Object element) {
String label;
if (element instanceof IErlModule || element instanceof IErlExternalRoot
|| element instanceof IErlExternal) {
label = ((IErlElement) element).getName();
} else if (element instanceof IErlElement) {
label = StringUtils.normalizeSpaces(element.toString());
} else {
label = element.toString();
}
if (label.length() > LABEL_LENGTH_LIMIT) {
int i = label.indexOf(',', LABEL_LENGTH_LIMIT);
if (i == -1) {
i = LABEL_LENGTH_LIMIT;
}
label = label.substring(0, i) + "...";
}
return label;
}
@Override
public void dispose() {
if (fLabelDecorators != null) {
for (int i = 0; i < fLabelDecorators.size(); i++) {
final ILabelDecorator decorator = fLabelDecorators.get(i);
decorator.dispose();
}
fLabelDecorators = null;
}
fImageLabelProvider.dispose();
}
@Override
public void addListener(final ILabelProviderListener listener) {
if (fLabelDecorators != null) {
for (int i = 0; i < fLabelDecorators.size(); i++) {
final ILabelDecorator decorator = fLabelDecorators.get(i);
decorator.addListener(listener);
}
}
fListeners.add(listener);
}
@Override
public boolean isLabelProperty(final Object element, final String property) {
return true;
}
@Override
public void removeListener(final ILabelProviderListener listener) {
if (fLabelDecorators != null) {
for (int i = 0; i < fLabelDecorators.size(); i++) {
final ILabelDecorator decorator = fLabelDecorators.get(i);
decorator.removeListener(listener);
}
}
fListeners.remove(listener);
}
public static ILabelDecorator[] getDecorators(final boolean errortick,
final ILabelDecorator extra) {
if (errortick) {
if (extra == null) {
return new ILabelDecorator[] {};
}
return new ILabelDecorator[] { extra };
}
if (extra != null) {
return new ILabelDecorator[] { extra };
}
return null;
}
@Override
public Color getForeground(final Object element) {
return null;
}
@Override
public Color getBackground(final Object element) {
return null;
}
/**
* Fires a label provider changed event to all registered listeners Only
* listeners registered at the time this method is called are notified.
*
* @param event
* a label provider changed event
*
* @see ILabelProviderListener#labelProviderChanged
*/
protected void fireLabelProviderChanged(final LabelProviderChangedEvent event) {
final Object[] listeners = fListeners.getListeners();
for (final Object element : listeners) {
final ILabelProviderListener l = (ILabelProviderListener) element;
SafeRunner.run(new SafeRunnable() {
@Override
public void run() {
l.labelProviderChanged(event);
}
});
}
}
}