blob: 622eb1889b794526b58e4b7fc44c052a160b4885 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2009 David A Carlson.
* 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:
* David A Carlson (XMLmodeling.com) - initial API and implementation
*
* $Id$
*******************************************************************************/
package org.eclipse.mdht.uml.ui.navigator.internal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EValidator;
import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
import org.eclipse.emf.validation.model.EvaluationMode;
import org.eclipse.emf.validation.service.IValidationListener;
import org.eclipse.emf.validation.service.ModelValidationService;
import org.eclipse.emf.validation.service.ValidationEvent;
import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IDecoration;
import org.eclipse.jface.viewers.ILabelDecorator;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.mdht.uml.ui.navigator.UMLDomainNavigatorItem;
import org.eclipse.mdht.uml.ui.navigator.internal.plugin.Activator;
import org.eclipse.swt.graphics.Image;
public class ProblemsDecorator implements ILabelDecorator {
/** Resources whose markers are cached. */
;
private List cachedResources = new ArrayList();
/** key=EObject, value=IMarker */
private Map errorMarkers = new HashMap();
private Map warningMarkers = new HashMap();
/**
* Refresh problem markers after validation.
*/
private IValidationListener validationListener = new IValidationListener() {
public void validationOccurred(final ValidationEvent event) {
if (event.getClientContextIds().contains("org.eclipse.mdht.uml.ui.validation.refresh") &&
event.getEvaluationMode() == EvaluationMode.BATCH) {
cachedResources.clear();
errorMarkers.clear();
warningMarkers.clear();
cacheMarkers(event.getValidationTargets());
}
}
};
public ProblemsDecorator() {
ModelValidationService.getInstance().addValidationListener(validationListener);
}
public void dispose() {
ModelValidationService.getInstance().removeValidationListener(validationListener);
}
protected void cacheMarkers(Collection targets) {
for (Iterator iterator = targets.iterator(); iterator.hasNext();) {
Object target = iterator.next();
if (target instanceof EObject) {
cacheMarkers((EObject) target);
}
}
}
private void cacheMarkers(EObject eObject) {
URI resourceURI = eObject.eResource().getURI();
if (!cachedResources.contains(resourceURI)) {
cachedResources.add(resourceURI);
}
IMarker[] markers = getValidationMarkers(eObject);
for (int i = 0; i < markers.length; i++) {
try {
EObject markerEObject = null;
Object markerURIAttr = markers[i].getAttribute(EValidator.URI_ATTRIBUTE);
if (markerURIAttr != null) {
URI markerURI = URI.createURI(markerURIAttr.toString());
markerEObject = eObject.eResource().getEObject(markerURI.fragment());
}
int markerSeverity = ((Integer) markers[i].getAttribute(IMarker.SEVERITY)).intValue();
if (IMarker.SEVERITY_ERROR == markerSeverity) {
EObject errorObject = markerEObject;
while (errorObject != null) {
errorMarkers.put(errorObject, markers[i]);
errorObject = errorObject.eContainer();
}
} else if (IMarker.SEVERITY_WARNING == markerSeverity) {
EObject warningObject = markerEObject;
while (warningObject != null) {
warningMarkers.put(warningObject, markers[i]);
warningObject = warningObject.eContainer();
}
}
} catch (CoreException e) {
// ignore this marker
}
}
}
private IMarker[] getValidationMarkers(EObject eObject) {
IFile file = WorkspaceSynchronizer.getFile(eObject.eResource());
if (file != null) {
try {
// return file.findMarkers(MarkerUtil.VALIDATION_MARKER_TYPE, true, IResource.DEPTH_ZERO);
return file.findMarkers(EValidator.MARKER, true, IResource.DEPTH_ZERO);
} catch (CoreException e) {
// ignore these markers
}
}
return new IMarker[0];
}
public boolean hasError(EObject eObject) {
URI resourceURI = eObject.eResource().getURI();
if (!cachedResources.contains(resourceURI)) {
cacheMarkers(eObject);
}
return errorMarkers.get(eObject) != null;
}
public boolean hasWarning(EObject eObject) {
URI resourceURI = eObject.eResource().getURI();
if (!cachedResources.contains(resourceURI)) {
cacheMarkers(eObject);
}
return warningMarkers.get(eObject) != null;
}
public Image decorateImage(Image image, Object element) {
EObject eObject = null;
if (element instanceof EObject) {
eObject = (EObject) element;
} else if (element instanceof UMLDomainNavigatorItem) {
eObject = ((UMLDomainNavigatorItem) element).getEObject();
}
if (eObject != null && eObject.eResource() != null) {
if (hasError(eObject)) {
return getErrorIcon(image);
} else if (hasWarning(eObject)) {
return getWarningIcon(image);
}
}
return image;
}
private Image getErrorIcon(Image baseImage) {
ImageDescriptor errorIcon = Activator.getBundledImageDescriptor("icons/ovr16/error_co.gif");
ImageDescriptor decorated = new org.eclipse.jface.viewers.DecorationOverlayIcon(
baseImage, errorIcon, IDecoration.BOTTOM_LEFT);
return ExtendedImageRegistry.getInstance().getImage(decorated);
}
private Image getWarningIcon(Image baseImage) {
ImageDescriptor errorIcon = Activator.getBundledImageDescriptor("icons/ovr16/warning_co.gif");
ImageDescriptor decorated = new org.eclipse.jface.viewers.DecorationOverlayIcon(
baseImage, errorIcon, IDecoration.BOTTOM_LEFT);
return ExtendedImageRegistry.getInstance().getImage(decorated);
}
public String decorateText(String text, Object element) {
return text;
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void addListener(ILabelProviderListener listener) {
}
public void removeListener(ILabelProviderListener listener) {
}
}