/** * Copyright (c) 2012 by JP Moresmau * This code is made available under the terms of the Eclipse Public License, * version 1.0 (EPL). See http://www.eclipse.org/legal/epl-v10.html */ package net.sf.eclipsefp.haskell.ui.actions; import java.util.List; import net.sf.eclipsefp.haskell.buildwrapper.JobFacade; import net.sf.eclipsefp.haskell.buildwrapper.types.CabalImplDetails; import net.sf.eclipsefp.haskell.buildwrapper.util.BWText; import net.sf.eclipsefp.haskell.ui.HaskellUIPlugin; import net.sf.eclipsefp.haskell.ui.internal.backend.BackendManager; import net.sf.eclipsefp.haskell.ui.internal.util.UITexts; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.action.IAction; import org.eclipse.osgi.util.NLS; /** * Install only the project dependencies * @author JP Moresmau * */ public class CabalInstallDependenciesAction extends CabalInstallAction { /* (non-Javadoc) * @see net.sf.eclipsefp.haskell.ui.actions.CabalInstallAction#getJobName() */ @Override protected String getJobName() { return UITexts.install_dependencies_job; } /* (non-Javadoc) * @see net.sf.eclipsefp.haskell.ui.actions.CabalInstallAction#addExtraParameters(java.util.List) */ @Override protected void addExtraParameters( final List<String> commands ) { commands.add("--only-dependencies"); /** ensure test libraries are downloaded too **/ commands.add("--enable-tests"); } @Override protected String getCabalDevCommand() { return "install-deps"; } @Override protected String getSandboxWarningMessage() { return UITexts.install_sandbox_dependencies_text; } /* (non-Javadoc) * @see net.sf.eclipsefp.haskell.ui.actions.CabalInstallAction#run(org.eclipse.jface.action.IAction) */ @Override public void run( final IAction arg0 ) { CabalImplDetails cid=BackendManager.getCabalImplDetails(); // install via sandboxhelper that will install deps of top level projects to keep consistency if (cid.isSandboxed()){ JobFacade.installDeps( projects ); HaskellUIPlugin.getDefault().getBackendManager().rebuildBrowser(); for(IProject p:projects){ Runnable r=getAfter( p ); if (r!=null){ r.run(); } } return; } super.run( arg0 ); } /* (non-Javadoc) * @see net.sf.eclipsefp.haskell.ui.actions.CabalInstallAction#getAfter(org.eclipse.core.resources.IProject) */ @Override protected Runnable getAfter(final IProject p ) { final Runnable rs=super.getAfter( p ); // once we've downloaded the dependencies, we clean the project and rebuild if we're in auto build mode Runnable r=new Runnable(){ @Override public void run() { if (rs!=null){ rs.run(); } final String jobName = NLS.bind(BWText.job_clean, p.getName()); Job j=new Job(jobName) { @Override protected IStatus run( final IProgressMonitor mon ) { try { afterDependencies(p,mon); } catch (CoreException ce){ return new Status( IStatus.ERROR, HaskellUIPlugin.getPluginId(), ce.getLocalizedMessage(),ce); } return Status.OK_STATUS; } }; j.setPriority( Job.BUILD ); j.schedule(); } }; return r; } public static void afterDependencies(final IProject p,final IProgressMonitor mon ) throws CoreException { p.build( IncrementalProjectBuilder.CLEAN_BUILD , mon ); if (ResourcesPlugin.getWorkspace().isAutoBuilding()){ if (mon!=null){ mon.setTaskName( NLS.bind(BWText.job_build, p.getName()) ); } p.build( IncrementalProjectBuilder.FULL_BUILD , mon ); } HaskellUIPlugin.getDefault().getBackendManager().rebuildBrowser(); } }