package com.robotoworks.mechanoid.ui; import java.util.NoSuchElementException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IStorage; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.jdt.internal.core.JavaProject; import org.eclipse.xtext.EcoreUtil2; import org.eclipse.xtext.ui.refactoring.impl.ProjectUtil; import org.eclipse.xtext.ui.resource.IStorage2UriMapper; import org.eclipse.xtext.util.Pair; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.inject.Inject; import com.robotoworks.mechanoid.validation.MechanoidLibClasspathValidationHelper; public class MechanoidLibClasspathUiValidationHelper extends MechanoidLibClasspathValidationHelper { @Override public boolean shouldValidateMechanoidLibOnClassPath(EObject m) { // UNDONE: for some odd reason I am not being injected :( // URI resourceUri = EcoreUtil2.getPlatformResourceOrNormalizedURI(m); // IProject project = getProject(resourceUri); // // if(JavaProject.hasJavaNature(project)) { // return true; // } return true; } @Inject private IWorkspace workspace; @Inject private IStorage2UriMapper mapper; /** * @return null if there is no such project or the file is not accessible */ public IProject getProject(URI uri) { IFile file = findFileStorage(uri, false); if(file == null) return null; return file.getProject(); } /** * @return null if there is no such file or the file is not editable */ public IFile findFileStorage(final URI uri, final boolean validateEdit) { Iterable<Pair<IStorage, IProject>> storages = mapper.getStorages(uri); try { Pair<IStorage, IProject> fileStorage = Iterables.find(storages, new Predicate<Pair<IStorage, IProject>>() { public boolean apply(Pair<IStorage, IProject> input) { IStorage storage = input.getFirst(); if (storage instanceof IFile) { IFile file = (IFile) storage; return file.isAccessible() && (!validateEdit || !file.isReadOnly() || workspace.validateEdit(new IFile[] { file }, null).isOK()); } return false; } }); return (IFile) fileStorage.getFirst(); } catch (NoSuchElementException e) { return null; } } }