/**
* 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.internal.resolve;
import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
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.backend.CabalFileChangeListenerManager;
import net.sf.eclipsefp.haskell.ui.internal.util.UITexts;
import net.sf.eclipsefp.haskell.ui.util.CabalFileChangeListener;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.text.contentassist.IContextInformation;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Display;
/**
* Install missing package(s) via cabal
* @author JP Moresmau
*
*/
public class InstallMissingPackage extends MarkerCompletion {
private Set<String> packages=new HashSet<>();
public InstallMissingPackage( final Set<String> packages ) {
super();
this.packages = packages;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IMarkerResolution#getLabel()
*/
@Override
public String getLabel() {
if (packages.size()==1){
return NLS.bind( UITexts.resolve_install_one,packages.iterator().next());
} else {
return UITexts.resolve_install_all;
}
}
/* (non-Javadoc)
* @see net.sf.eclipsefp.haskell.ui.internal.resolve.MarkerCompletion#getCompletionProposal(org.eclipse.core.resources.IMarker, org.eclipse.jface.text.IDocument)
*/
@Override
public ICompletionProposal getCompletionProposal( final IMarker marker,
final IDocument document ) {
return new ICompletionProposal() {
@Override
public Point getSelection( final IDocument arg0 ) {
return null;
}
@Override
public Image getImage() {
return null;
}
@Override
public String getDisplayString() {
return getLabel();
}
@Override
public IContextInformation getContextInformation() {
return null;
}
@Override
public String getAdditionalProposalInfo() {
return null;
}
@Override
public void apply( final IDocument arg0 ) {
final String cabalExecutable=CabalImplementationManager.getCabalExecutable();
if (cabalExecutable==null){
HaskellUIPlugin.log( UITexts.noCabalImplementationForInstall_error, IStatus.ERROR );
return;
}
final List<String> commands = new ArrayList<>();
commands.add( cabalExecutable );
commands.add("install");
BackendManager.addCabalInstallOptions( commands );
for (String s:packages){
commands.add("\""+s+"\"");
}
try {
final IProject project=marker.getResource().getProject();
AbstractHaskellLaunchDelegate.runInConsole( project, commands, new File(""), getLabel(), true , new Runnable(){
/* (non-Javadoc)
* @see java.lang.Runnable#run()
*/
@Override
public void run() {
IFile cabalF = BuildWrapperPlugin.getCabalFile( project );
BWFacade bwf=BuildWrapperPlugin.getFacade( project );
if (bwf!=null){
bwf.cabalFileChanged();
}
for (CabalFileChangeListener l:CabalFileChangeListenerManager.getListeners()){
l.cabalFileChanged( cabalF );
}
}
});
} catch (Exception ioe){
HaskellUIPlugin.log(ioe);
if (Display.getCurrent()!=null){
final IStatus st=new Status( IStatus.ERROR, HaskellUIPlugin.getPluginId(),ioe.getLocalizedMessage(),ioe);
ErrorDialog.openError( Display.getCurrent().getActiveShell(), UITexts.install_error, UITexts.install_error_text, st);
}
}
}
};
}
}