/** * 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(); } }