package monolipse.ui.views;
import java.util.HashMap;
import java.util.Map;
import monolipse.core.IAssemblyReference;
import monolipse.ui.BooUI;
import monolipse.ui.IBooUIConstants;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.resource.CompositeImageDescriptor;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.ui.model.WorkbenchLabelProvider;
public class BooExplorerLabelProvider implements ILabelProvider {
private final ILabelProvider _delegate = WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider();
static class OverlayedImage extends CompositeImageDescriptor {
private Image _bg;
private ImageDescriptor _topRight;
private ImageDescriptor _bottomLeft;
public OverlayedImage(Image background, ImageDescriptor topRight, ImageDescriptor bottomLeft) {
_bg = background;
_bottomLeft = bottomLeft;
_topRight = topRight;
}
protected void drawCompositeImage(int width, int height) {
drawImage(_bg.getImageData(), 0, 0);
if (null != _topRight) {
drawImage(_topRight.getImageData(), 0, 0);
}
if (null != _bottomLeft) {
drawImage(_bottomLeft.getImageData(), 0, 8);
}
}
protected Point getSize() {
return new Point(_bg.getBounds().width, _bg.getBounds().height);
}
public int hashCode() {
int code = _bg.hashCode();
if (null != _topRight) {
code ^= _topRight.hashCode();
}
if (null != _bottomLeft) {
code ^= _bottomLeft.hashCode();
}
return code;
}
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof OverlayedImage)) return false;
OverlayedImage other = (OverlayedImage)obj;
return _bg.equals(other._bg)
&& equals(_topRight, other._topRight)
&& equals(_bottomLeft, other._bottomLeft);
}
private boolean equals(ImageDescriptor lhs, ImageDescriptor rhs) {
if (lhs == null) return rhs == null;
return lhs.equals(rhs);
}
}
public Image getImage(Object element) {
if (element instanceof ReferenceContainer) {
return BooUI.getImage(IBooUIConstants.REFERENCES);
}
if (element instanceof IAssemblyReference) {
return BooUI.getImage(IBooUIConstants.ASSEMBLY_REFERENCE);
}
Image image = _delegate.getImage(element);
ImageDescriptor errorOverlay = getErrorOverlay(element);
return null == errorOverlay
? image
: cache(new OverlayedImage(image, null, errorOverlay));
}
Map<ImageDescriptor, Image> _imageCache = new HashMap<ImageDescriptor, Image>();
private Image cache(ImageDescriptor descriptor) {
Image cached = _imageCache.get(descriptor);
if (null == cached) {
cached = descriptor.createImage();
_imageCache.put(descriptor, cached);
}
return cached;
}
private ImageDescriptor getErrorOverlay(Object element) {
ImageDescriptor overlay = null;
try {
IResource resource = ((IResource) ((IAdaptable) element).getAdapter(IResource.class));
IMarker[] markers = resource.findMarkers(
IMarker.PROBLEM, true, IResource.DEPTH_INFINITE);
// need to distinguish between errors and warnings
if (markers.length > 0) {
overlay = BooUI.getImageDescriptor(IBooUIConstants.WARNING);
for (int i = 0; i < markers.length; i++) {
IMarker marker = markers[i];
if (marker.getAttribute(IMarker.SEVERITY, -1) == IMarker.SEVERITY_ERROR) {
overlay = BooUI.getImageDescriptor(IBooUIConstants.ERROR);
break;
}
}
}
} catch (CoreException e) {
}
return overlay;
}
public String getText(Object element) {
if (element instanceof ReferenceContainer) {
return "References";
}
if (element instanceof IAssemblyReference) {
return ((IAssemblyReference)element).getAssemblyName();
}
return _delegate.getText(element);
}
public void addListener(ILabelProviderListener listener) {
_delegate.addListener(listener);
}
public void dispose() {
_delegate.dispose();
}
public boolean isLabelProperty(Object element, String property) {
return _delegate.isLabelProperty(element, property);
}
public void removeListener(ILabelProviderListener listener) {
_delegate.removeListener(listener);
}
}