package com.github.jarlakxen.scala.sbt.listener;
import static java.util.Arrays.*;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import com.github.jarlakxen.scala.sbt.SbtPlugin;
import com.github.jarlakxen.scala.sbt.jobs.UpdateProjectJob;
import com.github.jarlakxen.scala.sbt.util.UIUtil;
public class SbtProjectFilesChangeListener implements IResourceChangeListener {
private static final List<String> SBT_PROJECT_FILES = asList("build.sbt", "project/plugins.sbt", "project/build.properties", "project/Build.scala");
public static void register() {
ResourcesPlugin.getWorkspace().addResourceChangeListener(new SbtProjectFilesChangeListener(), IResourceChangeEvent.POST_CHANGE);
}
private SbtProjectFilesChangeListener() {
}
@Override
public void resourceChanged(IResourceChangeEvent event) {
List<IProject> projects = getProjects(event.getDelta());
for(IProject project : projects){
new UpdateProjectJob(project).schedule();
}
}
private List<IProject> getProjects(IResourceDelta delta) {
final List<IProject> projects = new ArrayList<IProject>();
try {
delta.accept(new IResourceDeltaVisitor() {
public boolean visit(IResourceDelta delta) throws CoreException {
// only interested in changed resources (not added or
// removed)
if (delta.getKind() != IResourceDelta.CHANGED) {
return true;
}
// only interested in content changes
if ((delta.getFlags() & IResourceDelta.CONTENT) == 0) {
return true;
}
IResource resource = delta.getResource();
if (resource.getType() == IResource.FILE && isProjectFile(resource) && !projects.contains(resource.getProject())) {
projects.add(resource.getProject());
}
return true;
}
});
} catch (CoreException ex) {
UIUtil.showErrorDialog(ex.toString());
SbtPlugin.logException(ex);
}
return projects;
}
private boolean isProjectFile(IResource resource){
String resourcePath = resource.getProjectRelativePath().toString();
for(String projectFile : SBT_PROJECT_FILES){
if(projectFile.equals(resourcePath)){
return true;
}
}
return false;
}
}