| //------------------------------------------------------------------------------ |
| // 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.util; |
| |
| import java.util.Collection; |
| import java.util.HashMap; |
| import java.util.Iterator; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IMarker; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.emf.common.util.Diagnostic; |
| import org.eclipse.emf.common.util.URI; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.edit.provider.ItemProviderAdapter; |
| import org.eclipse.emf.edit.ui.action.ValidateAction.EclipseResourcesUtil; |
| import org.eclipse.epf.library.LibraryService; |
| import org.eclipse.epf.library.LibraryServiceListener; |
| import org.eclipse.epf.library.edit.element.TransientContentPackageItemProvider; |
| import org.eclipse.epf.library.edit.navigator.ContentItemProvider; |
| import org.eclipse.epf.library.edit.navigator.MethodPackagesItemProvider; |
| import org.eclipse.epf.library.edit.navigator.ProcessesItemProvider; |
| import org.eclipse.epf.library.edit.util.TngUtil; |
| import org.eclipse.epf.library.project.MethodLibraryProject; |
| import org.eclipse.epf.persistence.FileManager; |
| import org.eclipse.epf.uma.MethodElement; |
| import org.eclipse.epf.uma.MethodLibrary; |
| import org.eclipse.ui.ide.IDE; |
| |
| /** |
| * based on org.eclipse.epf.authoring.ui.util.LibraryValidationMarkerHelper |
| * @author Jeff Hardy |
| * |
| */ |
| public class MethodRichTextMarkerHelper extends EclipseResourcesUtil { |
| public static final MethodRichTextMarkerHelper INSTANCE = new MethodRichTextMarkerHelper(); |
| public static final String GUID = "guid"; //$NON-NLS-1$ |
| |
| // marker ID |
| public static final String MARKER_ID = "org.eclipse.epf.authoring.ui.methodRichText"; //$NON-NLS-1$ |
| |
| // marker attribute |
| private static String METHOD_FIELDNAME = "MethodFieldName"; //$NON-NLS-1$ |
| |
| // private constructor |
| private MethodRichTextMarkerHelper() { |
| } |
| |
| private static class ContainerMap extends HashMap<Object, Integer> { |
| /** |
| * |
| */ |
| private static final long serialVersionUID = 1L; |
| |
| public ContainerMap() { |
| super(); |
| initMap(); |
| LibraryService.getInstance().addListener(new LibraryServiceListener() { |
| public void libraryOpened(MethodLibrary library) { |
| initMap(); |
| } |
| |
| public void libraryClosed(MethodLibrary library) { |
| clear(); |
| } |
| |
| public void libraryReopened(MethodLibrary library) { |
| initMap(); |
| } |
| }); |
| } |
| |
| private void initMap() { |
| clear(); |
| |
| // fill this set with containers of marked objects |
| // |
| // MethodLibrary lib = LibraryService.getInstance().getCurrentMethodLibrary(); |
| // if(lib != null) { |
| // IProject prj = MethodLibraryProject.findProject(lib); |
| // if(prj != null) { |
| // try { |
| // IMarker[] markers = prj.findMarkers(INSTANCE.getMarkerID(), false, IResource.DEPTH_INFINITE); |
| // for (int i = 0; i < markers.length; i++) { |
| // IMarker marker = markers[i]; |
| // String guid = (String) marker.getAttribute(GUID); |
| // MethodElement e = LibraryService.getInstance().getCurrentLibraryManager().getMethodElement(guid); |
| // if(e != null) { |
| // // remove its containers from containersOfMarkedObjects |
| // // |
| // markContainers(e); |
| // } |
| // } |
| // } catch (CoreException e) { |
| // } |
| // } |
| // } |
| } |
| |
| private void increment(Object object) { |
| Integer count; |
| if (containsKey(object)) { |
| count = get(object); |
| } else { |
| count = new Integer(0); |
| } |
| count++; |
| put(object, count); |
| } |
| |
| private void decrement(Object object) { |
| if (containsKey(object)) { |
| Integer count = get(object); |
| if (count == 1) { |
| // remove object |
| remove(object); |
| } else { |
| count--; |
| put(object, count); |
| } |
| } |
| } |
| |
| private void markContainers(MethodElement e) { |
| for(EObject container = e.eContainer(); container != null; container = container.eContainer()) { |
| increment(container); |
| } |
| } |
| |
| private void unmarkContainers(MethodElement e) { |
| for(EObject container = e.eContainer(); container != null; container = container.eContainer()) { |
| decrement(container); |
| } |
| } |
| } |
| |
| private static ContainerMap containersOfMarkedObjects = new ContainerMap(); |
| |
| |
| protected String getMarkerID() { |
| return MARKER_ID; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.emf.common.ui.MarkerHelper#getFile(org.eclipse.emf.common.util.URI) |
| */ |
| protected IFile getFile(URI uri) { |
| if(uri.isFile()) { |
| return (IFile) FileManager.getResourceForLocation(uri.toFileString()); |
| } |
| return super.getFile(uri); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.emf.edit.ui.util.EditUIMarkerHelper#adjustMarker(org.eclipse.core.resources.IMarker, org.eclipse.emf.common.util.Diagnostic) |
| */ |
| protected boolean adjustMarker(IMarker marker, Diagnostic diagnostic) throws CoreException { |
| boolean ret = super.adjustMarker(marker, diagnostic); |
| if(!diagnostic.getData().isEmpty()) { |
| Object o = diagnostic.getData().get(0); |
| Object str = diagnostic.getData().get(1); |
| if(o instanceof MethodElement) { |
| marker.setAttribute(GUID, ((MethodElement)o).getGuid()); |
| marker.setAttribute(IMarker.LOCATION, TngUtil.getLabel(o) + ", " + str); //$NON-NLS-1$ |
| marker.setAttribute(IDE.EDITOR_ID_ATTR, "org.eclipse.epf.authoring.ui.editors.MethodElementEditor"); //$NON-NLS-1$ |
| } |
| if (str instanceof String) { |
| marker.setAttribute(METHOD_FIELDNAME, (String)str); |
| } |
| |
| } |
| return ret; |
| } |
| |
| public static boolean isInvalid(Object object) { |
| if(object instanceof ProcessesItemProvider) { |
| // this is an UI object: Processes |
| // |
| ProcessesItemProvider ip = (ProcessesItemProvider) object; |
| Object o; |
| return ((o = ip.getCapabilityPatternPackage()) != null && containersOfMarkedObjects.containsKey(o)) |
| || ((o = ip.getDeliveryProcessPackage()) != null && containersOfMarkedObjects.containsKey(o)); |
| } |
| else if(object instanceof MethodPackagesItemProvider |
| || object instanceof ContentItemProvider) { |
| // this is an UI object |
| // |
| object = ((ItemProviderAdapter)object).getTarget(); |
| } |
| else if(object instanceof TransientContentPackageItemProvider) { |
| // this is an UI object: either Tasks, Roles, Work Products, or Guidance |
| // |
| Collection children = ((TransientContentPackageItemProvider)object).getChildren(object); |
| for (Iterator iter = children.iterator(); iter.hasNext();) { |
| Object obj = iter.next(); |
| if(containersOfMarkedObjects.containsKey(obj) || INSTANCE.hasMarkers(obj)) { |
| return true; |
| } |
| } |
| return false; |
| } |
| return containersOfMarkedObjects.containsKey(object) || INSTANCE.hasMarkers(object); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.emf.common.ui.MarkerHelper#hasMarkers(java.lang.Object) |
| */ |
| public boolean hasMarkers(Object object) { |
| if(object instanceof MethodElement) { |
| IResource resource = getFile(object); |
| if (resource != null && resource.exists()) |
| { |
| try |
| { |
| String guid = ((MethodElement)object).getGuid(); |
| IMarker[] markers = resource.findMarkers(getMarkerID(), false, IResource.DEPTH_ZERO); |
| for (int i = 0; i < markers.length; i++) { |
| IMarker marker = markers[i]; |
| if(guid.equals(marker.getAttribute(GUID))) { |
| return true; |
| } |
| } |
| } |
| catch (CoreException e) |
| { |
| } |
| } |
| return false; |
| } |
| |
| return super.hasMarkers(object); |
| } |
| |
| /** |
| * Overrided to handle exception that is thrown if the object already has been unloaded |
| * |
| * @see org.eclipse.emf.edit.ui.util.EditUIMarkerHelper#getFile(java.lang.Object) |
| */ |
| @Override |
| protected IFile getFile(Object datum) { |
| try { |
| return super.getFile(datum); |
| } |
| catch(Exception e) { |
| return null; |
| } |
| } |
| |
| public void deleteMarkers(Object object, String fieldName) { |
| if(object instanceof MethodElement) { |
| IResource resource = getFile(object); |
| if (resource != null) |
| { |
| try |
| { |
| String guid = ((MethodElement)object).getGuid(); |
| IMarker[] markers = resource.findMarkers(getMarkerID(), false, IResource.DEPTH_ZERO); |
| for (int i = 0; i < markers.length; i++) { |
| IMarker marker = markers[i]; |
| if(guid.equals(marker.getAttribute(GUID)) && (fieldName == null || |
| fieldName.equals(marker.getAttribute(METHOD_FIELDNAME)))) { |
| marker.delete(); |
| // MethodElement e = LibraryService.getInstance().getCurrentLibraryManager().getMethodElement(guid); |
| // if(e != null) { |
| // // remove its containers from containersOfMarkedObjects |
| // // |
| // containersOfMarkedObjects.unmarkContainers(e); |
| // } |
| } |
| } |
| } |
| catch (CoreException e) |
| { |
| } |
| } |
| return; |
| } |
| |
| super.deleteMarkers(object); |
| } |
| |
| protected void deleteMarkers(IResource resource, boolean includeSubtypes, int depth) { |
| // if (resource != null) { |
| // try { |
| // IMarker[] markers = resource.findMarkers(getMarkerID(), false, IResource.DEPTH_ZERO); |
| // for (int i = 0; i < markers.length; i++) { |
| // IMarker marker = markers[i]; |
| // String guid = (String) marker.getAttribute(GUID); |
| // MethodElement e = LibraryService.getInstance().getCurrentLibraryManager().getMethodElement(guid); |
| // if(e != null) { |
| // // remove its containers from containersOfMarkedObjects |
| // // |
| // containersOfMarkedObjects.unmarkContainers(e); |
| // } |
| // } |
| // |
| // } catch (CoreException e) { |
| // |
| // } |
| // } |
| |
| super.deleteMarkers(resource, includeSubtypes, depth); |
| } |
| |
| protected void createMarkers(IResource resource, Diagnostic diagnostic, Diagnostic parentDiagnostic) throws CoreException { |
| super.createMarkers(resource, diagnostic, parentDiagnostic); |
| // String fieldName = null; |
| // if(!diagnostic.getData().isEmpty() && diagnostic.getData().size() > 1) { |
| // fieldName = (String)diagnostic.getData().get(1); |
| // } |
| // if (resource != null && fieldName != null) { |
| // try { |
| // IMarker[] markers = resource.findMarkers(getMarkerID(), false, IResource.DEPTH_ZERO); |
| // for (int i = 0; i < markers.length; i++) { |
| // IMarker marker = markers[i]; |
| // String guid = (String) marker.getAttribute(GUID); |
| // if(fieldName.equals(marker.getAttribute(METHOD_FIELDNAME))) { |
| // MethodElement e = LibraryService.getInstance().getCurrentLibraryManager().getMethodElement(guid); |
| // if(e != null) { |
| // // add its containers to containersOfMarkedObjects |
| // // |
| // containersOfMarkedObjects.markContainers(e); |
| // } |
| // } |
| // } |
| // |
| // } catch (CoreException e) { |
| // |
| // } |
| // } |
| |
| } |
| |
| protected String composeMessage(Diagnostic diagnostic, Diagnostic parentDiagnostic) |
| { |
| String message = diagnostic.getMessage(); |
| if (parentDiagnostic != null) |
| { |
| String parentMessage = parentDiagnostic.getMessage(); |
| if (parentMessage != null) |
| { |
| message = message != null ? parentMessage + " " + message : parentMessage; //$NON-NLS-1$ |
| } |
| } |
| return message; |
| } |
| } |