package net.sf.eclipsefp.haskell.debug.core.internal.launch; import net.sf.eclipsefp.haskell.buildwrapper.BWFacade; import net.sf.eclipsefp.haskell.debug.core.internal.HaskellDebugCore; import net.sf.eclipsefp.haskell.debug.core.internal.util.CoreTexts; import net.sf.eclipsefp.haskell.util.FileUtil; import org.eclipse.core.resources.IFile; 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.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.debug.core.model.IProcess; /** * * @author JP Moresmau * */ public class CommandOnChangeListener implements IResourceChangeListener { private final IProcess p; private final String[] commands; private final String projectName; public CommandOnChangeListener( final IProcess p, final String projectName, final String... command ) { super(); this.p = p; this.commands = command; this.projectName=projectName; } @Override public void resourceChanged( final IResourceChangeEvent event ) { try { event.getDelta().accept( new IResourceDeltaVisitor() { @Override public boolean visit( final IResourceDelta delta ) throws CoreException { if (delta.getResource().getProject()==null || delta.getResource().getProject().getName().equals(projectName)){ //&& (delta.getFlags() & IResourceDelta.MARKERS)>0 if( delta.getKind() == IResourceDelta.REMOVED || (delta.getKind() == IResourceDelta.CHANGED && (delta.getFlags() & IResourceDelta.CONTENT)>0 )) { if( delta.getResource() instanceof IFile && FileUtil.hasHaskellExtension( delta.getResource() ) ) { IPath relPath = delta.getResource().getProjectRelativePath(); boolean skip = relPath.segmentCount() > 0 && relPath.segment( 0 ) == BWFacade.DIST_FOLDER; if (!skip){ runCommand(); } return false; } } return true; } return false; } }); } catch( CoreException ex ) { HaskellDebugCore.log(CoreTexts.commandonchange_failed, ex ); } } protected void runCommand() throws CoreException { for (String s:commands){ HaskellLaunchDelegate.commandToProcess( p, s ); } } }