package org.erlide.debug.ui.utils;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.erlide.engine.model.IErlElement;
/**
* A label provider for ResourceDecorator objects. It creates labels with a
* resource full path for duplicates. It uses the Platform UI label decorator
* for providing extra resource info.
*/
public class ModuleItemLabelProvider extends LabelProvider
implements ILabelProviderListener, IStyledLabelProvider {
// Need to keep our own list of listeners
protected final ListenerList listeners = new ListenerList();
protected WorkbenchLabelProvider provider = new WorkbenchLabelProvider();
public ModuleItemLabelProvider() {
super();
provider.addListener(this);
}
@Override
public Image getImage(final Object element) {
final IResource resource = getElementResource(element);
if (resource == null) {
return super.getImage(element);
}
return provider.getImage(resource);
}
protected IResource getElementResource(final Object element) {
if (element instanceof IResource) {
return (IResource) element;
}
if (element instanceof IErlElement) {
final IErlElement erlElement = (IErlElement) element;
return erlElement.getCorrespondingResource();
}
return null;
}
@Override
public String getText(final Object element) {
final IResource res = getElementResource(element);
if (res == null) {
return super.getText(element);
}
final String name = res.getName();
if (showFullPath(element)) {
return name + " - " + res.getParent().getFullPath().makeRelative().toString(); //$NON-NLS-1$
}
return name;
}
@Override
public StyledString getStyledText(final Object element) {
if (getElementResource(element) == null) {
return new StyledString(super.getText(element));
}
final String text = getText(element);
final StyledString str = new StyledString(text);
final int index = text.indexOf(" - ");
if (index != -1) {
str.setStyle(index, text.length() - index, StyledString.QUALIFIER_STYLER);
}
return str;
}
@Override
public void dispose() {
provider.removeListener(this);
provider.dispose();
super.dispose();
}
@Override
public void addListener(final ILabelProviderListener listener) {
listeners.add(listener);
}
@Override
public void removeListener(final ILabelProviderListener listener) {
listeners.remove(listener);
}
@Override
public void labelProviderChanged(final LabelProviderChangedEvent event) {
final Object[] l = listeners.getListeners();
for (int i = 0; i < listeners.size(); i++) {
((ILabelProviderListener) l[i]).labelProviderChanged(event);
}
}
protected boolean showFullPath(final Object item) {
return true;
}
}