/** * Copyright (c) 2011 Cloudsmith Inc. and other contributors, as listed below. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Cloudsmith * */ package org.cloudsmith.geppetto.pp.dsl.ui.jdt_ersatz; import org.cloudsmith.geppetto.pp.dsl.ui.internal.PPDSLActivator; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IMarkerDelta; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.viewers.IDecoration; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ILightweightLabelDecorator; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI; /** * Simple decorator for error and warning (right now hacking/testing). * */ public class AggregateErrorLabelDecorator implements ILightweightLabelDecorator { private static String decoratorId = "org.cloudsmith.geppetto.pp.dsl.ui.errorDecorator"; private IResourceChangeListener listener = null; private boolean useJDT; public AggregateErrorLabelDecorator() { useJDT = PPDSLActivator.isJavaEnabled(); if(useJDT) return; IWorkspace workspace = ResourcesPlugin.getWorkspace(); listener = new IResourceChangeListener() { @Override public void resourceChanged(IResourceChangeEvent event) { IMarkerDelta[] markerDeltas = event.findMarkerDeltas(IMarker.PROBLEM, true); if(markerDeltas.length > 0) PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { @Override public void run() { PlatformUI.getWorkbench().getDecoratorManager().update(decoratorId); } }); } }; workspace.addResourceChangeListener(listener); } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener) */ @Override public void addListener(ILabelProviderListener listener) { } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.ILightweightLabelDecorator#decorate(java.lang.Object, org.eclipse.jface.viewers.IDecoration) */ @Override public void decorate(Object element, IDecoration decoration) { if(useJDT) return; if(element instanceof IResource == false) return; // // should be installed for IFolder and IProject, but better check // if(!(element instanceof IFolder || element instanceof IProject)) // return; // get the max severity from markers IResource resource = (IResource) element; if(!resource.isAccessible()) return; int severity = -1; try { severity = resource.findMaxProblemSeverity(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE); } catch(CoreException e) { // TODO should be logged - (should not really happen) e.printStackTrace(); } if(severity < IMarker.SEVERITY_WARNING) { decoration.addOverlay(null, IDecoration.BOTTOM_LEFT); return; } ImageDescriptor overlay = null; if(severity == IMarker.SEVERITY_ERROR) overlay = getErrorImageDescriptor(); else overlay = getWarningImageDescriptor(); decoration.addOverlay(overlay, IDecoration.BOTTOM_LEFT); } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose() */ @Override public void dispose() { if(listener != null) ResourcesPlugin.getWorkspace().removeResourceChangeListener(listener); } private ImageDescriptor getErrorImageDescriptor() { ImageDescriptor result = PlatformUI.getWorkbench().getSharedImages().getImageDescriptor( ISharedImages.IMG_DEC_FIELD_ERROR); // TODO: remove workaround see https://bugs.eclipse.org/bugs/show_bug.cgi?id=304397 return result != null ? result : JFaceResources.getImageRegistry().getDescriptor("org.eclipse.jface.fieldassist.IMG_DEC_FIELD_ERROR"); } private ImageDescriptor getWarningImageDescriptor() { ImageDescriptor result = PlatformUI.getWorkbench().getSharedImages().getImageDescriptor( ISharedImages.IMG_DEC_FIELD_WARNING); // TODO: remove workaround see https://bugs.eclipse.org/bugs/show_bug.cgi?id=304397 return result != null ? result : JFaceResources.getImageRegistry().getDescriptor("org.eclipse.jface.fieldassist.IMG_DEC_FIELD_WARNING"); } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String) */ @Override public boolean isLabelProperty(Object element, String property) { return false; } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener) */ @Override public void removeListener(ILabelProviderListener listener) { } }