/**
* 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.backend;
import java.util.ArrayList;
import java.util.List;
import net.sf.eclipsefp.haskell.ui.HaskellUIPlugin;
import net.sf.eclipsefp.haskell.ui.internal.preferences.IPreferenceConstants;
import net.sf.eclipsefp.haskell.ui.internal.util.UITexts;
import net.sf.eclipsefp.haskell.ui.util.HaskellUIImages;
import net.sf.eclipsefp.haskell.ui.util.IImageNames;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
/**
* The dialog telling the user that she's missing some executables, and giving the option to install them
* @author JP Moresmau
*
*/
public class InstallExecutableDialog extends Dialog {
protected boolean buildWrapper=true;
protected boolean scionBrowser=true;
protected String buildWrapperMinVersion="";
protected String scionBrowserMinVersion="";
private Button bUser;
private Button bIgnore;
private Button bExtras;
public InstallExecutableDialog( final Shell parentShell,final boolean buildWrapper, final String buildWrapperMinVersion,
final boolean scionBrowser, final String scionBrowserMinVersion) {
super( parentShell );
this.buildWrapper=buildWrapper;
this.scionBrowser=scionBrowser;
this.buildWrapperMinVersion = buildWrapperMinVersion;
this.scionBrowserMinVersion = scionBrowserMinVersion;
}
@Override
protected void createButtonsForButtonBar( final Composite parent ) {
super.createButtonsForButtonBar( parent );
getButton( OK ).setText( UITexts.executablesmissing_install );
}
protected String getTitle(){
return UITexts.executablesmissing_title;
}
protected String getMessage1(){
return UITexts.executablesmissing_message1;
}
protected String getMessage2(){
return UITexts.executablesmissing_message2;
}
protected String getMessageText(){
if (buildWrapper){
if (scionBrowser){
String[] bindings = {"buildwrapper", buildWrapperMinVersion, "scion-browser", scionBrowserMinVersion};
return NLS.bind( getMessage2(), bindings );
} else {
return NLS.bind( getMessage1(), "buildwrapper", buildWrapperMinVersion);
}
} else {
return NLS.bind( getMessage1(), "scion-browser", scionBrowserMinVersion);
}
}
@Override
protected void configureShell( final Shell newShell ) {
super.configureShell( newShell );
newShell.setText( getTitle() );
newShell.setImage( HaskellUIImages.getImage( IImageNames.HASKELL_MISC ) );
}
@Override
protected Control createDialogArea( final Composite parent ) {
Composite c=(Composite)super.createDialogArea( parent );
((GridLayout)c.getLayout()).numColumns=2;
Label l=new Label(c,SWT.NONE);
l.setText( getMessageText() );
GridData gd=new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan=2;
l.setLayoutData( gd );
bExtras=new Button(c,SWT.CHECK);
bExtras.setText( NLS.bind( UITexts.executables_extra, getExtraNames()) );
bExtras.setSelection( true );
gd=new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan=2;
bExtras.setLayoutData( gd );
bUser=new Button(c,SWT.CHECK);
bUser.setText( UITexts.executablesmissing_user );
bUser.setSelection( true );
bIgnore=new Button(c,SWT.CHECK);
bIgnore.setText( UITexts.executablesmissing_ignore);
return c;
}
protected String getIgnorePreference(){
return IPreferenceConstants.IGNORE_MISSING_EXECUTABLE;
}
private void setIgnoreFlag(){
IPreferenceStore prefs = HaskellUIPlugin.getDefault().getPreferenceStore();
prefs.setValue( getIgnorePreference(), bIgnore.getSelection() );
}
@Override
public boolean close() {
setIgnoreFlag();
return super.close();
}
private String getExtraNames(){
StringBuilder sb=new StringBuilder();
String sep="";
for(InstallExecutableRunnable.Package p:getExtras()){
sb.append( sep );
sep=", ";
sb.append(StringUtils.capitalize( p.getPkgName()));
}
return sb.toString();
}
public static List<InstallExecutableRunnable.Package> getExtras(){
List<InstallExecutableRunnable.Package> pkgs=new ArrayList<>();
pkgs.add( new InstallExecutableRunnable.Package( "hoogle", IPreferenceConstants.SCION_BROWSER_EXTRA_HOOGLE_PATH) );
pkgs.add( new InstallExecutableRunnable.Package( "hlint", IPreferenceConstants.HLINT_EXECUTABLE) );
pkgs.add( new InstallExecutableRunnable.Package( "stylish-haskell",IPreferenceConstants.STYLISHHASKELL_EXECUTABLE) );
// causes too many issues during install
//pkgs.add( new InstallExecutableRunnable.Package( "SourceGraph",IPreferenceConstants.SOURCEGRAPH_EXECUTABLE) );
return pkgs;
}
@Override
protected void okPressed() {
final InstallExecutableRunnable j=new InstallExecutableRunnable();
if (buildWrapper){
j.getPackages().add( new InstallExecutableRunnable.Package( "buildwrapper", IPreferenceConstants.BUILDWRAPPER_EXECUTABLE) );
}
if (scionBrowser){
j.getPackages().add( new InstallExecutableRunnable.Package( "scion-browser", IPreferenceConstants.SCION_BROWSER_SERVER_EXECUTABLE) );
}
if (bExtras.getSelection()){
j.getPackages().addAll( getExtras() );
}
//j.setBuildWrapper( buildWrapper );
j.setCabalUpdate( true );
j.setGlobal( !bUser.getSelection() );
//j.setScionBrowser( scionBrowser );
new Thread(j).start();
super.okPressed();
}
}