package net.sf.eclipsefp.haskell.ui.decorators; import net.sf.eclipsefp.haskell.buildwrapper.BuildWrapperPlugin; import net.sf.eclipsefp.haskell.core.util.ResourceUtil; import net.sf.eclipsefp.haskell.ui.HaskellUIPlugin; import net.sf.eclipsefp.haskell.ui.util.HaskellUIImages; import net.sf.eclipsefp.haskell.ui.util.IImageNames; import net.sf.eclipsefp.haskell.util.FileUtil; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.ListenerList; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.IDecoration; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ILightweightLabelDecorator; /** * LabelDecorator that decorates an element's image with error and warning * overlays that represent the severity of markers attached to the element's * underlying resource. To see a problem decoration for a marker, the marker * needs to be a subtype of <code>IMarker.PROBLEM</code>. * * @author Thomas ten Cate */ public class ProblemsLabelDecorator implements ILightweightLabelDecorator { private final ListenerList listeners = new ListenerList(); @Override public void decorate( final Object element, final IDecoration decoration ) { int adornmentFlags = computeAdornmentFlags( element ); ImageDescriptor desc; switch (adornmentFlags) { case IMarker.SEVERITY_ERROR: desc = getImageDescriptor( IImageNames.ERROR_OVERLAY ); break; case IMarker.SEVERITY_WARNING: desc = getImageDescriptor( IImageNames.WARNING_OVERLAY ); break; default: desc = null; // unchanged break; } if (desc != null) { decoration.addOverlay( desc, IDecoration.BOTTOM_LEFT ); } } protected int computeAdornmentFlags( final Object obj ) { if (obj instanceof IResource && !((IResource)obj).exists()){ return 0; } try { // haskell files: source or cabal if( obj instanceof IFile && (FileUtil.hasHaskellExtension( ( IResource )obj ) || FileUtil.hasCabalExtension( ( IResource )obj ) )) { return ( ( IResource )obj ).findMaxProblemSeverity( BuildWrapperPlugin.PROBLEM_MARKER_ID , true, IResource.DEPTH_ZERO ); // source folders } else if( obj instanceof IFolder && ResourceUtil.isSourceFolder( ( IFolder )obj ) ) { return ( ( IResource )obj ).findMaxProblemSeverity( BuildWrapperPlugin.PROBLEM_MARKER_ID, true, IResource.DEPTH_INFINITE ); // haskell projects } else if (obj instanceof IProject && ResourceUtil.hasHaskellNature( ((IProject) obj ))){ return ( ( IResource )obj ).findMaxProblemSeverity( BuildWrapperPlugin.PROBLEM_MARKER_ID, true, IResource.DEPTH_INFINITE ); } } catch( CoreException e ) { HaskellUIPlugin.log( e ); } return 0; } private ImageDescriptor getImageDescriptor(final String name) { return HaskellUIImages.getImageDescriptor( name ); } @Override public boolean isLabelProperty( final Object element, final String property ) { // We currently only support labelling (some kinds of) resources return element instanceof IResource; } @Override public void dispose() { // nothing to dispose } @Override public void removeListener( final ILabelProviderListener listener ) { listeners.remove(listener); } @Override public void addListener( final ILabelProviderListener listener ) { listeners.add(listener); } }