package net.sf.eclipsefp.haskell.ui.wizards.cabal;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import net.sf.eclipsefp.haskell.buildwrapper.BWFacade;
import net.sf.eclipsefp.haskell.buildwrapper.BuildWrapperPlugin;
import net.sf.eclipsefp.haskell.core.cabal.CabalImplementationManager;
import net.sf.eclipsefp.haskell.debug.core.internal.launch.AbstractHaskellLaunchDelegate;
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.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.osgi.util.NLS;
/**
* <p>Wizard to run cabal install on a project</p>
*
* @author JP Moresmau
*/
public class CabalInstallWizard extends Wizard {
private final Set<IProject> projects;
private CabalInstallOptionsPage optionsPage;
public CabalInstallWizard(final Set<IProject> projects) {
super();
this.projects=projects;
setWindowTitle( Platform.getResourceBundle( Platform.getBundle( HaskellUIPlugin.getPluginId() )).getString( "cabalInstallWizard.name" ));
setDialogSettings( HaskellUIPlugin.getDefault().getDialogSettings() );
}
@Override
public void addPages() {
optionsPage=new CabalInstallOptionsPage(projects) ;
addPage(optionsPage );
}
@Override
public boolean performFinish() {
final String cabalExecutable=CabalImplementationManager.getCabalExecutable();
if (cabalExecutable!=null){
final List<String> commands = new ArrayList<>();
commands.add( cabalExecutable );
commands.add("install");
// options
commands.add("--builddir="+optionsPage.getFolder());
if (optionsPage.isGlobal()){
commands.add( "--global" );
} else {
commands.add( "--user" );
}
BackendManager.addCabalInstallOptions( commands );
// force reinstall since we're probably reinstalling our development version
commands.add( "--reinstall" );
for (final IProject p:projects){
try {
List<String> prjCommands = new ArrayList<>(commands);
BWFacade bf=BuildWrapperPlugin.getFacade( p );
// need to provide user supplied info
if(bf!=null){
String f=bf.getFlags();
if (f!=null && f.length()>0){
prjCommands.add("--flags="+f);
}
List<String> extraOpts=bf.getExtraOpts();
if (extraOpts!=null){
for (String eo:extraOpts){
prjCommands.add(eo);
}
}
}
AbstractHaskellLaunchDelegate.runInConsole(p, prjCommands, new File(p.getLocation().toOSString()), NLS.bind( UITexts.install_job, p.getName() ),true );
} catch (Exception ioe){
HaskellUIPlugin.log(ioe);
final IStatus st=new Status( IStatus.ERROR, HaskellUIPlugin.getPluginId(),ioe.getLocalizedMessage(),ioe);
ErrorDialog.openError( getShell(), UITexts.install_error, UITexts.install_error_text, st);
}
}
}
return true;
}
}