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