| //------------------------------------------------------------------------------ |
| // Copyright (c) 2005, 2007 IBM Corporation and others. |
| // 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: |
| // IBM Corporation - initial implementation |
| //------------------------------------------------------------------------------ |
| package org.eclipse.epf.authoring.ui.providers; |
| |
| import org.eclipse.core.resources.IMarker; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.IResourceStatus; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.ListenerList; |
| import org.eclipse.epf.authoring.ui.AuthoringUIImages; |
| import org.eclipse.epf.authoring.ui.AuthoringUIPlugin; |
| import org.eclipse.epf.authoring.ui.internal.IProblemChangedListener; |
| import org.eclipse.epf.authoring.ui.internal.ImageDescriptorRegistry; |
| import org.eclipse.epf.authoring.ui.internal.ImageImageDescriptor; |
| import org.eclipse.epf.authoring.ui.internal.MethodElementImageDescriptor; |
| import org.eclipse.epf.authoring.ui.util.LibraryValidationMarkerHelper; |
| import org.eclipse.epf.persistence.util.PersistenceUtil; |
| import org.eclipse.epf.uma.MethodElement; |
| import org.eclipse.jface.resource.ImageDescriptor; |
| import org.eclipse.jface.viewers.IBaseLabelProvider; |
| import org.eclipse.jface.viewers.IDecoration; |
| import org.eclipse.jface.viewers.ILabelDecorator; |
| import org.eclipse.jface.viewers.ILabelProviderListener; |
| import org.eclipse.jface.viewers.ILightweightLabelDecorator; |
| import org.eclipse.jface.viewers.LabelProviderChangedEvent; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.graphics.Point; |
| import org.eclipse.swt.graphics.Rectangle; |
| |
| /** |
| * Code taken from org.eclipse.jdt.ui.ProblemsLabelDecorator |
| * |
| */ |
| public class ProblemsLabelDecorator implements ILabelDecorator, ILightweightLabelDecorator { |
| |
| /** |
| * This is a special <code>LabelProviderChangedEvent</code> carrying additional |
| * information whether the event origins from a maker change. |
| * <p> |
| * <code>ProblemsLabelChangedEvent</code>s are only generated by <code> |
| * ProblemsLabelDecorator</code>s. |
| * </p> |
| */ |
| public static class ProblemsLabelChangedEvent extends LabelProviderChangedEvent { |
| |
| private static final long serialVersionUID= 1L; |
| |
| private boolean fMarkerChange; |
| |
| /** |
| * Note: This constructor is for internal use only. Clients should not call this constructor. |
| * |
| * @param eventSource the base label provider |
| * @param changedResource the changed resources |
| * @param isMarkerChange <code>true<code> if the change is a marker change; otherwise |
| * <code>false</code> |
| */ |
| public ProblemsLabelChangedEvent(IBaseLabelProvider eventSource, IResource[] changedResource, boolean isMarkerChange) { |
| super(eventSource, changedResource); |
| fMarkerChange= isMarkerChange; |
| } |
| |
| /** |
| * Returns whether this event origins from marker changes. If <code>false</code> an annotation |
| * model change is the origin. In this case viewers not displaying working copies can ignore these |
| * events. |
| * |
| * @return if this event origins from a marker change. |
| */ |
| public boolean isMarkerChange() { |
| return fMarkerChange; |
| } |
| |
| } |
| |
| private static final int ERRORTICK_ERROR= MethodElementImageDescriptor.ERROR; |
| |
| private ImageDescriptorRegistry fRegistry; |
| private boolean fUseNewRegistry= false; |
| private IProblemChangedListener fProblemChangedListener; |
| |
| private ListenerList fListeners; |
| |
| /** |
| * Creates a new <code>ProblemsLabelDecorator</code>. |
| */ |
| public ProblemsLabelDecorator() { |
| this(null); |
| fUseNewRegistry= true; |
| } |
| |
| /** |
| * Note: This constructor is for internal use only. Clients should not call this constructor. |
| * |
| * @param registry The registry to use or <code>null</code> to use the Java plugin's |
| * image registry |
| */ |
| public ProblemsLabelDecorator(ImageDescriptorRegistry registry) { |
| fRegistry= registry; |
| fProblemChangedListener= null; |
| } |
| |
| private ImageDescriptorRegistry getRegistry() { |
| if (fRegistry == null) { |
| fRegistry= fUseNewRegistry ? new ImageDescriptorRegistry() : AuthoringUIPlugin.getImageDescriptorRegistry(); |
| } |
| return fRegistry; |
| } |
| |
| |
| /* (non-Javadoc) |
| * @see ILabelDecorator#decorateText(String, Object) |
| */ |
| public String decorateText(String text, Object element) { |
| return text; |
| } |
| |
| /* (non-Javadoc) |
| * @see ILabelDecorator#decorateImage(Image, Object) |
| */ |
| public Image decorateImage(Image image, Object obj) { |
| int adornmentFlags= computeAdornmentFlags(obj); |
| if (adornmentFlags != 0) { |
| ImageDescriptor baseImage= new ImageImageDescriptor(image); |
| Rectangle bounds= image.getBounds(); |
| return getRegistry().get(new MethodElementImageDescriptor(baseImage, adornmentFlags, new Point(bounds.width, bounds.height))); |
| } |
| return image; |
| } |
| |
| /** |
| * Note: This method is for internal use only. Clients should not call this method. |
| * |
| * @param obj the element to compute the flags for |
| * |
| * @return the adornment flags |
| */ |
| protected int computeAdornmentFlags(Object obj) { |
| try { |
| if (obj instanceof MethodElement) { |
| return getErrorTicksFromMarkers((MethodElement) obj, PersistenceUtil.getWorkspaceResource(obj), IResource.DEPTH_INFINITE); |
| } else if (obj instanceof IResource) { |
| return getErrorTicksFromMarkers(null, (IResource) obj, IResource.DEPTH_INFINITE); |
| } |
| } catch (CoreException e) { |
| if (e.getStatus().getCode() == IResourceStatus.MARKER_NOT_FOUND) { |
| return 0; |
| } |
| |
| AuthoringUIPlugin.log(e); |
| } |
| return 0; |
| } |
| |
| private int getErrorTicksFromMarkers(MethodElement e, IResource res, |
| int depth) throws CoreException { |
| if (res == null || !res.isAccessible()) { |
| return 0; |
| } |
| int info = 0; |
| |
| IMarker[] markers = res.findMarkers(IMarker.PROBLEM, true, depth); |
| if (markers != null) { |
| for (int i = 0; i < markers.length && (info != ERRORTICK_ERROR); i++) { |
| IMarker curr = markers[i]; |
| int priority = curr.getAttribute(IMarker.SEVERITY, -1); |
| if (priority == IMarker.SEVERITY_ERROR |
| && (e == null || e |
| .getGuid() |
| .equals( |
| curr |
| .getAttribute(LibraryValidationMarkerHelper.GUID)))) { |
| info = ERRORTICK_ERROR; |
| } |
| } |
| } |
| return info; |
| } |
| |
| /* (non-Javadoc) |
| * @see IBaseLabelProvider#dispose() |
| */ |
| public void dispose() { |
| if (fProblemChangedListener != null) { |
| AuthoringUIPlugin.getDefault().getProblemMarkerManager().removeListener(fProblemChangedListener); |
| fProblemChangedListener= null; |
| } |
| if (fRegistry != null && fUseNewRegistry) { |
| fRegistry.dispose(); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see IBaseLabelProvider#isLabelProperty(Object, String) |
| */ |
| public boolean isLabelProperty(Object element, String property) { |
| return true; |
| } |
| |
| /* (non-Javadoc) |
| * @see IBaseLabelProvider#addListener(ILabelProviderListener) |
| */ |
| public void addListener(ILabelProviderListener listener) { |
| if (fListeners == null) { |
| fListeners= new ListenerList(); |
| } |
| fListeners.add(listener); |
| if (fProblemChangedListener == null) { |
| fProblemChangedListener= new IProblemChangedListener() { |
| public void problemsChanged(IResource[] changedResources, boolean isMarkerChange) { |
| fireProblemsChanged(changedResources, isMarkerChange); |
| } |
| }; |
| AuthoringUIPlugin.getDefault().getProblemMarkerManager().addListener(fProblemChangedListener); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see IBaseLabelProvider#removeListener(ILabelProviderListener) |
| */ |
| public void removeListener(ILabelProviderListener listener) { |
| if (fListeners != null) { |
| fListeners.remove(listener); |
| if (fListeners.isEmpty() && fProblemChangedListener != null) { |
| AuthoringUIPlugin.getDefault().getProblemMarkerManager().removeListener(fProblemChangedListener); |
| fProblemChangedListener= null; |
| } |
| } |
| } |
| |
| private void fireProblemsChanged(IResource[] changedResources, boolean isMarkerChange) { |
| if (fListeners != null && !fListeners.isEmpty()) { |
| LabelProviderChangedEvent event= new ProblemsLabelChangedEvent(this, changedResources, isMarkerChange); |
| Object[] listeners= fListeners.getListeners(); |
| for (int i= 0; i < listeners.length; i++) { |
| ((ILabelProviderListener) listeners[i]).labelProviderChanged(event); |
| } |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.viewers.ILightweightLabelDecorator#decorate(java.lang.Object, org.eclipse.jface.viewers.IDecoration) |
| */ |
| public void decorate(Object element, IDecoration decoration) { |
| int adornmentFlags= computeAdornmentFlags(element); |
| if (adornmentFlags == ERRORTICK_ERROR) { |
| decoration.addOverlay(AuthoringUIImages.IMG_DESC_OVR_ERROR); |
| } |
| } |
| |
| } |