diff --git a/net.sf.eclipsefp.haskell.ui/icons/ovr16/error_co.gif b/net.sf.eclipsefp.haskell.ui/icons/ovr16/error_co.gif new file mode 100644 index 000000000..119dcccd5 Binary files /dev/null and b/net.sf.eclipsefp.haskell.ui/icons/ovr16/error_co.gif differ diff --git a/net.sf.eclipsefp.haskell.ui/icons/ovr16/warning_co.gif b/net.sf.eclipsefp.haskell.ui/icons/ovr16/warning_co.gif new file mode 100644 index 000000000..ee2dac4a9 Binary files /dev/null and b/net.sf.eclipsefp.haskell.ui/icons/ovr16/warning_co.gif differ diff --git a/net.sf.eclipsefp.haskell.ui/plugin.properties b/net.sf.eclipsefp.haskell.ui/plugin.properties index 0e8bb0e33..1fbeb1694 100644 --- a/net.sf.eclipsefp.haskell.ui/plugin.properties +++ b/net.sf.eclipsefp.haskell.ui/plugin.properties @@ -5,6 +5,8 @@ bundleName = Haskell Plug-in UI # extensions haskellDecorator_name = Haskell Project Folders haskellDecorator_desc = Decorates source and binary folders in Haskell projects. +problemDecorator_name = Haskell Problems +problemDecorator_desc = Decorates problems in Haskell source files and folders. haskellPerspective_name = Haskell diff --git a/net.sf.eclipsefp.haskell.ui/plugin.xml b/net.sf.eclipsefp.haskell.ui/plugin.xml index 23678a152..8a6c94f0d 100644 --- a/net.sf.eclipsefp.haskell.ui/plugin.xml +++ b/net.sf.eclipsefp.haskell.ui/plugin.xml @@ -115,6 +115,19 @@ %haskellDecorator_desc + + + + + + %haskellDecorator_desc + + diff --git a/net.sf.eclipsefp.haskell.ui/src/net/sf/eclipsefp/haskell/ui/decorators/ProblemsLabelDecorator.java b/net.sf.eclipsefp.haskell.ui/src/net/sf/eclipsefp/haskell/ui/decorators/ProblemsLabelDecorator.java new file mode 100644 index 000000000..e40ea17b3 --- /dev/null +++ b/net.sf.eclipsefp.haskell.ui/src/net/sf/eclipsefp/haskell/ui/decorators/ProblemsLabelDecorator.java @@ -0,0 +1,87 @@ +package net.sf.eclipsefp.haskell.ui.decorators; + +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 org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IFolder; +import org.eclipse.core.resources.IMarker; +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 IMarker.PROBLEM. + * + * @author Thomas ten Cate + */ +public class ProblemsLabelDecorator implements ILightweightLabelDecorator { + + private final ListenerList listeners = new ListenerList(); + + 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 ) { + try { + if( obj instanceof IFile + && ResourceUtil.hasHaskellExtension( ( IResource )obj ) ) { + return ( ( IResource )obj ).findMaxProblemSeverity( IMarker.PROBLEM, + true, IResource.DEPTH_ZERO ); + } else if( obj instanceof IFolder + && ResourceUtil.isSourceFolder( ( IFolder )obj ) ) { + return ( ( IResource )obj ).findMaxProblemSeverity( IMarker.PROBLEM, + true, IResource.DEPTH_INFINITE ); + } + } catch( CoreException e ) { + HaskellUIPlugin.log( e ); + } + return 0; + } + + private ImageDescriptor getImageDescriptor(final String name) { + return HaskellUIImages.getImageDescriptor( name ); + } + + public boolean isLabelProperty( final Object element, final String property ) { + // We currently only support labelling (some kinds of) resources + return element instanceof IResource; + } + + public void dispose() { + // nothing to dispose + } + + public void removeListener( final ILabelProviderListener listener ) { + listeners.remove(listener); + } + + public void addListener( final ILabelProviderListener listener ) { + listeners.add(listener); + } + +} diff --git a/net.sf.eclipsefp.haskell.ui/src/net/sf/eclipsefp/haskell/ui/util/HaskellUIImages.java b/net.sf.eclipsefp.haskell.ui/src/net/sf/eclipsefp/haskell/ui/util/HaskellUIImages.java index 93491b28b..daedc50d4 100644 --- a/net.sf.eclipsefp.haskell.ui/src/net/sf/eclipsefp/haskell/ui/util/HaskellUIImages.java +++ b/net.sf.eclipsefp.haskell.ui/src/net/sf/eclipsefp/haskell/ui/util/HaskellUIImages.java @@ -5,9 +5,7 @@ import java.net.URL; import java.util.HashMap; import java.util.Map; - import net.sf.eclipsefp.haskell.ui.HaskellUIPlugin; - import org.eclipse.jface.resource.CompositeImageDescriptor; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.ImageRegistry; @@ -61,6 +59,9 @@ private static void declareImages() { // decorators declare( SRC_FOLDER_DECORATOR, OVR + "sourceFolder.gif" ); + declare( ERROR_OVERLAY, OVR + "error_co.gif"); + declare( WARNING_OVERLAY, OVR + "warning_co.gif"); + // views declare( DEP_VIEW_IMPORTS, ACTION + "mdep_imports.gif" ); declare( DEP_VIEW_IMPORTEDBY, ACTION + "mdep_importedby.gif" ); diff --git a/net.sf.eclipsefp.haskell.ui/src/net/sf/eclipsefp/haskell/ui/util/IImageNames.java b/net.sf.eclipsefp.haskell.ui/src/net/sf/eclipsefp/haskell/ui/util/IImageNames.java index 457241efd..451ba9510 100644 --- a/net.sf.eclipsefp.haskell.ui/src/net/sf/eclipsefp/haskell/ui/util/IImageNames.java +++ b/net.sf.eclipsefp.haskell.ui/src/net/sf/eclipsefp/haskell/ui/util/IImageNames.java @@ -68,4 +68,8 @@ public interface IImageNames { String NEW_MODULE = ID + ".NEW_MODULE"; String IMPORT_CABAL_PACKAGE = ID + "IMPORT_CABAL_PACKAGE"; + // overlays + String ERROR_OVERLAY = ID + ".ERROR_OVERLAY"; + String WARNING_OVERLAY = ID + ".WARNING_OVERLAY"; + } \ No newline at end of file