net.sf.eclipsefp.haskell.ui.internal.backend.InstallExecutableDialog.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.eclipsefp.haskell.ui.internal.backend.InstallExecutableDialog.java

Source

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

}