Skip to content

Commit

Permalink
Added problem decorators in the Project Explorer.
Browse files Browse the repository at this point in the history
Files with compilation errors and warnings are now decorated with a little icon.
The icons were borrowed from the JDT.
  • Loading branch information
ttencate committed Jun 29, 2009
1 parent eda9be7 commit 387723a
Show file tree
Hide file tree
Showing 7 changed files with 109 additions and 2 deletions.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions net.sf.eclipsefp.haskell.ui/plugin.properties
Expand Up @@ -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

Expand Down
13 changes: 13 additions & 0 deletions net.sf.eclipsefp.haskell.ui/plugin.xml
Expand Up @@ -115,6 +115,19 @@
%haskellDecorator_desc
</description>
</decorator>
<decorator
label="%haskellDecorator_name"
lightweight="true"
class="net.sf.eclipsefp.haskell.ui.decorators.ProblemsLabelDecorator"
state="true"
id="net.sf.eclipsefp.haskell.ui.decorators.ProblemsLabelDecorator">
<enablement>
<objectClass name="org.eclipse.core.resources.IResource"/>
</enablement>
<description>
%haskellDecorator_desc
</description>
</decorator>
</extension>
<extension
point="org.eclipse.ui.perspectives">
Expand Down
@@ -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 <code>IMarker.PROBLEM</code>.
*
* @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);
}

}
Expand Up @@ -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;
Expand Down Expand Up @@ -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" );
Expand Down
Expand Up @@ -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";

}

0 comments on commit 387723a

Please sign in to comment.