package net.sourceforge.pmd.eclipse.ui;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import net.sourceforge.pmd.eclipse.plugin.UISettings;
import net.sourceforge.pmd.eclipse.runtime.PMDRuntimeConstants;
import net.sourceforge.pmd.eclipse.runtime.builder.MarkerUtil;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IDecoration;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ILightweightLabelDecorator;
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
/**
*
* @author Brian Remedios
*/
public class RuleLabelDecorator implements ILightweightLabelDecorator {
private Collection<ILabelProviderListener> listeners;
private Map<Integer, ImageDescriptor> overlaysByPriority;
public RuleLabelDecorator() {
reloadDecorators();
}
public void addListener(ILabelProviderListener listener) {
if (listeners == null) listeners = new HashSet<ILabelProviderListener>();
listeners.add(listener);
}
public void dispose() {
}
public void changed(Collection<IResource> resources) {
if (listeners == null) return;
LabelProviderChangedEvent lpce = new LabelProviderChangedEvent(this, resources.toArray());
for (ILabelProviderListener listener : listeners) {
listener.labelProviderChanged(lpce);
}
}
public void reloadDecorators() {
overlaysByPriority = UISettings.markerImgDescriptorsByPriority();
}
public boolean isLabelProperty(Object element, String property) { return false; }
public void removeListener(ILabelProviderListener listener) {
if (listeners == null) return;
listeners.remove(listener);
}
public void decorate(Object element, IDecoration decoration) {
if ( !(element instanceof IResource) ) return;
IResource resource = (IResource)element;
Set<Integer> range = null;
try {
range = MarkerUtil.priorityRangeOf(resource, PMDRuntimeConstants.RULE_MARKER_TYPES, 5);
} catch (CoreException e1) {
return;
}
if (range.isEmpty()) return;
Integer first = range.iterator().next();
ImageDescriptor overlay = overlaysByPriority.get(first);
try {
boolean hasMarkers = MarkerUtil.hasAnyRuleMarkers(resource);
if (hasMarkers) decoration.addOverlay(overlay);
} catch (CoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}