org.eclipse.cdt.make.ui.dialogs.SettingsBlock.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.cdt.make.ui.dialogs.SettingsBlock.java

Source

/*******************************************************************************
 * Copyright (c) 2000, 2012 QNX Software Systems and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     QNX Software Systems - initial API and implementation
 *     Tianchao Li (tianchao.li@gmail.com) - arbitrary build directory (bug #136136)
 *******************************************************************************/
package org.eclipse.cdt.make.ui.dialogs;

import org.eclipse.cdt.make.core.IMakeBuilderInfo;
import org.eclipse.cdt.make.core.IMakeCommonBuildInfo;
import org.eclipse.cdt.make.core.MakeCorePlugin;
import org.eclipse.cdt.make.internal.ui.MakeUIPlugin;
import org.eclipse.cdt.make.ui.IMakeHelpContextIds;
import org.eclipse.cdt.ui.dialogs.AbstractCOptionPage;
import org.eclipse.cdt.ui.dialogs.ICOptionContainer;
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.debug.ui.StringVariableSelectionDialog;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.accessibility.AccessibleAdapter;
import org.eclipse.swt.accessibility.AccessibleEvent;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Font;
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.DirectoryDialog;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.ContainerSelectionDialog;

/**
 * @deprecated as of CDT 4.0. This tab was used to set preferences/properties
 * for 3.X style projects.
 *
 * @noextend This class is not intended to be subclassed by clients.
 * @noinstantiate This class is not intended to be instantiated by clients.
 */
@Deprecated
public class SettingsBlock extends AbstractCOptionPage {

    private static final String PREFIX = "SettingsBlock"; //$NON-NLS-1$
    private static final String MAKE_LABEL = PREFIX + ".label"; //$NON-NLS-1$
    private static final String MAKE_MESSAGE = PREFIX + ".message"; //$NON-NLS-1$

    private static final String MAKE_SETTING_GROUP = PREFIX + ".makeSetting.group_label"; //$NON-NLS-1$
    private static final String MAKE_SETTING_STOP_ERROR = PREFIX + ".makeSetting.stopOnError"; //$NON-NLS-1$

    private static final String MAKE_CMD_GROUP = PREFIX + ".makeCmd.group_label"; //$NON-NLS-1$
    private static final String MAKE_CMD_USE_DEFAULT = PREFIX + ".makeCmd.use_default"; //$NON-NLS-1$
    private static final String MAKE_CMD_LABEL = PREFIX + ".makeCmd.label"; //$NON-NLS-1$

    private static final String MAKE_WORKBENCH_BUILD_GROUP = PREFIX + ".makeWorkbench.group_label"; //$NON-NLS-1$
    private static final String MAKE_WORKBENCH_BUILD_TYPE = PREFIX + ".makeWorkbench.type"; //$NON-NLS-1$
    private static final String MAKE_WORKBENCH_BUILD_TARGET = PREFIX + ".makeWorkbench.target"; //$NON-NLS-1$
    private static final String MAKE_WORKBENCH_BUILD_AUTO = PREFIX + ".makeWorkbench.auto"; //$NON-NLS-1$
    private static final String MAKE_WORKBENCH_BUILD_INCR = PREFIX + ".makeWorkbench.incremental"; //$NON-NLS-1$
    //   private static final String MAKE_WORKBENCH_BUILD_FULL = PREFIX + ".makeWorkbench.full"; //$NON-NLS-1$
    private static final String MAKE_WORKBENCH_BUILD_CLEAN = PREFIX + ".makeWorkbench.clean"; //$NON-NLS-1$

    private static final String MAKE_BUILD_DIR_GROUP = PREFIX + ".makeLoc.group_label"; //$NON-NLS-1$
    private static final String MAKE_BUILD_DIR_LABEL = PREFIX + ".makeDir.label"; //$NON-NLS-1$
    private static final String MAKE_BUILD_DIR_BROWSE_FILESYSTEM = PREFIX + ".makeDir.browseFilesystem"; //$NON-NLS-1$
    private static final String MAKE_BUILD_DIR_BROWSE_WORKSPACE = PREFIX + ".makeDir.browseWorkspace"; //$NON-NLS-1$

    private static final String MAKE_BUILD_AUTO_TARGET = PREFIX + ".makeWorkbench.autoBuildTarget"; //$NON-NLS-1$
    private static final String MAKE_BUILD_INCREMENTAL_TARGET = PREFIX + ".makeWorkbench.incrementalBuildTarget"; //$NON-NLS-1$
    //   private static final String MAKE_BUILD_FULL_TARGET = PREFIX + ".makeWorkbench.fullBuildTarget"; //$NON-NLS-1$
    private static final String MAKE_BUILD_CLEAN_TARGET = PREFIX + ".makeWorkbench.cleanTarget"; //$NON-NLS-1$

    Button stopOnErrorButton;
    Button defButton;
    Text buildCommand;
    Button argumentVariablesButton;

    Text buildLocation;
    Button locationVariablesButton;

    Text targetIncr;
    Text targetAuto;
    Text targetClean;

    Button incrButton;
    Button autoButton;
    Button cleanButton;

    Button incrVariableButton;
    Button autoVariableButton;
    Button cleanVariableButton;

    IMakeBuilderInfo fBuildInfo;
    Preferences fPrefs;
    String fBuilderID;

    public SettingsBlock(Preferences prefs, String builderID) {
        super(MakeUIPlugin.getResourceString(MAKE_LABEL));
        setDescription(MakeUIPlugin.getResourceString(MAKE_MESSAGE));
        fPrefs = prefs;
        fBuilderID = builderID;
    }

    protected void createSettingControls(Composite parent) {
        Group group = ControlFactory.createGroup(parent, MakeUIPlugin.getResourceString(MAKE_SETTING_GROUP), 1);
        stopOnErrorButton = new Button(group, SWT.CHECK);
        stopOnErrorButton.setText(MakeUIPlugin.getResourceString(MAKE_SETTING_STOP_ERROR));
        if (fBuildInfo.isStopOnError()) {
            stopOnErrorButton.setSelection(true);
        }
        stopOnErrorButton.setEnabled(fBuildInfo.isDefaultBuildCmd());
    }

    protected void createBuildCmdControls(Composite parent) {
        Group group = ControlFactory.createGroup(parent, MakeUIPlugin.getResourceString(MAKE_CMD_GROUP), 1);
        GridLayout layout = new GridLayout();
        layout.numColumns = 3;
        layout.makeColumnsEqualWidth = false;
        group.setLayout(layout);
        group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        defButton = ControlFactory.createCheckBox(group, MakeUIPlugin.getResourceString(MAKE_CMD_USE_DEFAULT));
        defButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                if (defButton.getSelection() == true) {
                    buildCommand.setEnabled(false);
                    argumentVariablesButton.setEnabled(false);
                    stopOnErrorButton.setEnabled(true);
                    getContainer().updateContainer();
                } else {
                    buildCommand.setEnabled(true);
                    argumentVariablesButton.setEnabled(true);
                    stopOnErrorButton.setEnabled(false);
                    getContainer().updateContainer();
                }
            }
        });
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.horizontalSpan = 3;
        defButton.setLayoutData(gd);
        Label label = ControlFactory.createLabel(group, MakeUIPlugin.getResourceString(MAKE_CMD_LABEL));
        ((GridData) (label.getLayoutData())).horizontalAlignment = GridData.BEGINNING;
        ((GridData) (label.getLayoutData())).grabExcessHorizontalSpace = false;
        buildCommand = ControlFactory.createTextField(group, SWT.SINGLE | SWT.BORDER);

        ((GridData) (buildCommand.getLayoutData())).horizontalAlignment = GridData.FILL;
        ((GridData) (buildCommand.getLayoutData())).grabExcessHorizontalSpace = true;
        buildCommand.addListener(SWT.Modify, new Listener() {

            @Override
            public void handleEvent(Event e) {
                getContainer().updateContainer();
            }
        });
        if (fBuildInfo.getBuildAttribute(IMakeCommonBuildInfo.BUILD_COMMAND, null) != null) {
            StringBuffer cmd = new StringBuffer(
                    fBuildInfo.getBuildAttribute(IMakeCommonBuildInfo.BUILD_COMMAND, "")); //$NON-NLS-1$
            if (!fBuildInfo.isDefaultBuildCmd()) {
                String args = fBuildInfo.getBuildAttribute(IMakeCommonBuildInfo.BUILD_ARGUMENTS, ""); //$NON-NLS-1$
                if (args != null && !args.equals("")) { //$NON-NLS-1$
                    cmd.append(" "); //$NON-NLS-1$
                    cmd.append(args);
                }
            }
            buildCommand.setText(cmd.toString());
        }
        argumentVariablesButton = addVariablesButton(group, buildCommand);
        if (fBuildInfo.isDefaultBuildCmd()) {
            buildCommand.setEnabled(false);
            argumentVariablesButton.setEnabled(false);
        }
        defButton.setSelection(fBuildInfo.isDefaultBuildCmd());
    }

    protected void createWorkBenchBuildControls(Composite parent) {
        SelectionAdapter selectionAdapter = new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                targetAuto.setEnabled(autoButton.getSelection());
                autoVariableButton.setEnabled(autoButton.getSelection());
                targetIncr.setEnabled(incrButton.getSelection());
                incrVariableButton.setEnabled(incrButton.getSelection());
                targetClean.setEnabled(cleanButton.getSelection());
                cleanVariableButton.setEnabled(cleanButton.getSelection());
                getContainer().updateContainer();
            }

        };
        Group group = ControlFactory.createGroup(parent, MakeUIPlugin.getResourceString(MAKE_WORKBENCH_BUILD_GROUP),
                1);
        GridLayout layout = new GridLayout();
        layout.numColumns = 3;
        layout.makeColumnsEqualWidth = false;
        group.setLayout(layout);
        group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        Label label = new Label(group, SWT.NONE);
        label.setText(MakeUIPlugin.getResourceString(MAKE_WORKBENCH_BUILD_TYPE));
        label = new Label(group, SWT.NONE);
        label.setText(MakeUIPlugin.getResourceString(MAKE_WORKBENCH_BUILD_TARGET));
        GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
        gd.horizontalSpan = 2;
        label.setLayoutData(gd);
        autoButton = ControlFactory.createCheckBox(group,
                MakeUIPlugin.getResourceString(MAKE_WORKBENCH_BUILD_AUTO));
        autoButton.addSelectionListener(selectionAdapter);
        autoButton.setSelection(fBuildInfo.isAutoBuildEnable());
        targetAuto = ControlFactory.createTextField(group, SWT.SINGLE | SWT.BORDER);
        targetAuto.setText(fBuildInfo.getBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_AUTO, "")); //$NON-NLS-1$
        ((GridData) (targetAuto.getLayoutData())).horizontalAlignment = GridData.FILL;
        ((GridData) (targetAuto.getLayoutData())).grabExcessHorizontalSpace = true;
        addControlAccessibleListener(targetAuto, MakeUIPlugin.getResourceString(MAKE_BUILD_AUTO_TARGET));
        autoVariableButton = addVariablesButton(group, targetAuto);
        String noteTitle = MakeUIPlugin.getResourceString("SettingsBlock.makeWorkbench.note"); //$NON-NLS-1$
        String noteMessage = MakeUIPlugin.getResourceString("SettingsBlock.makeWorkbench.autobuildMessage"); //$NON-NLS-1$
        Composite noteControl = createNoteComposite(JFaceResources.getDialogFont(), group, noteTitle, noteMessage);
        gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
        gd.horizontalSpan = 3;
        noteControl.setLayoutData(gd);
        incrButton = ControlFactory.createCheckBox(group,
                MakeUIPlugin.getResourceString(MAKE_WORKBENCH_BUILD_INCR));
        incrButton.addSelectionListener(selectionAdapter);
        incrButton.setSelection(fBuildInfo.isIncrementalBuildEnabled());
        targetIncr = ControlFactory.createTextField(group, SWT.SINGLE | SWT.BORDER);
        targetIncr.setText(fBuildInfo.getBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_INCREMENTAL, "")); //$NON-NLS-1$
        ((GridData) (targetIncr.getLayoutData())).horizontalAlignment = GridData.FILL;
        ((GridData) (targetIncr.getLayoutData())).grabExcessHorizontalSpace = true;
        addControlAccessibleListener(targetIncr, MakeUIPlugin.getResourceString(MAKE_BUILD_INCREMENTAL_TARGET));
        incrVariableButton = addVariablesButton(group, targetIncr);
        cleanButton = ControlFactory.createCheckBox(group,
                MakeUIPlugin.getResourceString(MAKE_WORKBENCH_BUILD_CLEAN));
        cleanButton.addSelectionListener(selectionAdapter);
        cleanButton.setSelection(fBuildInfo.isCleanBuildEnabled());
        targetClean = ControlFactory.createTextField(group, SWT.SINGLE | SWT.BORDER);
        targetClean.setText(fBuildInfo.getBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_CLEAN, "")); //$NON-NLS-1$
        ((GridData) (targetClean.getLayoutData())).horizontalAlignment = GridData.FILL;
        ((GridData) (targetClean.getLayoutData())).grabExcessHorizontalSpace = true;
        addControlAccessibleListener(targetClean, MakeUIPlugin.getResourceString(MAKE_BUILD_CLEAN_TARGET));
        cleanVariableButton = addVariablesButton(group, targetClean);
        selectionAdapter.widgetSelected(null);
    }

    private Button addVariablesButton(Composite parent, final Text control) {
        String variablesTitle = MakeUIPlugin.getResourceString("SettingsBlock.variables"); //$NON-NLS-1$
        Button variablesButton = createPushButton(parent, variablesTitle, null);
        GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
        variablesButton.setLayoutData(gd);
        variablesButton.addSelectionListener(new SelectionAdapter() {

            /*
             * (non-Javadoc)
             *
             * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
             */
            @Override
            public void widgetSelected(SelectionEvent arg0) {
                handleVariablesButtonSelected(control);
            }
        });
        return variablesButton;
    }

    protected Composite createNoteComposite(Font font, Composite composite, String title, String message) {
        Composite messageComposite = new Composite(composite, SWT.NONE);
        GridLayout messageLayout = new GridLayout();
        messageLayout.numColumns = 2;
        messageLayout.marginWidth = 0;
        messageLayout.marginHeight = 0;
        messageComposite.setLayout(messageLayout);
        messageComposite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
        messageComposite.setFont(font);

        final Label noteLabel = new Label(messageComposite, SWT.BOLD);
        noteLabel.setText(title);
        noteLabel.setFont(JFaceResources.getBannerFont());
        noteLabel.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));

        final IPropertyChangeListener fontListener = new IPropertyChangeListener() {

            @Override
            public void propertyChange(PropertyChangeEvent event) {
                if (JFaceResources.BANNER_FONT.equals(event.getProperty())) {
                    noteLabel.setFont(JFaceResources.getFont(JFaceResources.BANNER_FONT));
                }
            }
        };
        JFaceResources.getFontRegistry().addListener(fontListener);
        noteLabel.addDisposeListener(new DisposeListener() {

            @Override
            public void widgetDisposed(DisposeEvent event) {
                JFaceResources.getFontRegistry().removeListener(fontListener);
            }
        });

        Label messageLabel = new Label(messageComposite, SWT.WRAP);
        messageLabel.setText(message);
        messageLabel.setFont(font);
        return messageComposite;
    }

    public void addControlAccessibleListener(Control control, String controlName) {
        control.getAccessible().addAccessibleListener(new ControlAccessibleListener(controlName));
    }

    private class ControlAccessibleListener extends AccessibleAdapter {

        private String controlName;

        ControlAccessibleListener(String name) {
            controlName = name;
        }

        @Override
        public void getName(AccessibleEvent e) {
            e.result = controlName;
        }
    }

    protected void createBuilderWorkingDirControls(Composite parent) {
        Group group = ControlFactory.createGroup(parent, MakeUIPlugin.getResourceString(MAKE_BUILD_DIR_GROUP), 1);
        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        layout.makeColumnsEqualWidth = false;
        group.setLayout(layout);
        group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        Label label = ControlFactory.createLabel(group, MakeUIPlugin.getResourceString(MAKE_BUILD_DIR_LABEL));
        ((GridData) (label.getLayoutData())).horizontalAlignment = GridData.BEGINNING;
        ((GridData) (label.getLayoutData())).grabExcessHorizontalSpace = false;
        buildLocation = ControlFactory.createTextField(group, SWT.SINGLE | SWT.BORDER);
        ((GridData) (buildLocation.getLayoutData())).horizontalAlignment = GridData.FILL;
        ((GridData) (buildLocation.getLayoutData())).grabExcessHorizontalSpace = true;
        buildLocation.addListener(SWT.Modify, new Listener() {

            @Override
            public void handleEvent(Event e) {
                getContainer().updateContainer();
            }
        });

        Composite buttons = ControlFactory.createComposite(group, 4);
        layout = new GridLayout(4, false);
        layout.marginHeight = layout.marginWidth = 0;
        buttons.setLayout(layout);
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.horizontalSpan = 2;
        buttons.setLayoutData(gd);

        Label emptyLabel = ControlFactory.createLabel(buttons, ""); //$NON-NLS-1$
        emptyLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        Button browseWorkspace = new Button(buttons, SWT.NONE);
        browseWorkspace.setText(MakeUIPlugin.getResourceString(MAKE_BUILD_DIR_BROWSE_WORKSPACE));
        browseWorkspace.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                ContainerSelectionDialog dialog = new ContainerSelectionDialog(getShell(),
                        getContainer().getProject(), true,
                        MakeUIPlugin.getResourceString("SettingsBlock.title.selectLocationToBuildFrom")); //$NON-NLS-1$
                if (dialog.open() == Window.OK) {
                    Object[] selection = dialog.getResult();
                    if (selection.length > 0) {
                        buildLocation.setText(((IPath) selection[0]).toOSString());
                    }
                }
            }
        });

        Button browseFilesystem = new Button(buttons, SWT.NONE);
        browseFilesystem.setText(MakeUIPlugin.getResourceString(MAKE_BUILD_DIR_BROWSE_FILESYSTEM));
        browseFilesystem.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.NONE);
                dialog.setText(MakeUIPlugin.getResourceString("SettingsBlock.title.selectLocationToBuildFrom")); //$NON-NLS-1$
                dialog.setFilterPath(getContainer().getProject().toString());
                String directory = dialog.open();
                if (directory != null) {
                    if (directory.trim().length() > 0) {
                        buildLocation.setText(directory);
                    }
                }
            }
        });

        buildLocation.setText(fBuildInfo.getBuildAttribute(IMakeCommonBuildInfo.BUILD_LOCATION, "")); //$NON-NLS-1$
        locationVariablesButton = addVariablesButton(buttons, buildLocation);
    }

    /**
     * A variable entry button has been pressed for the given text field. Prompt
     * the user for a variable and enter the result in the given field.
     */
    private void handleVariablesButtonSelected(Text textField) {
        String variable = getVariable();
        if (variable != null) {
            textField.insert(variable);
        }
    }

    /**
     * Prompts the user to choose and configure a variable and returns the
     * resulting string, suitable to be used as an attribute.
     */
    private String getVariable() {
        StringVariableSelectionDialog dialog = new StringVariableSelectionDialog(getShell());
        dialog.open();
        return dialog.getVariableExpression();
    }

    @Override
    public void createControl(Composite parent) {
        Composite composite = ControlFactory.createComposite(parent, 1);
        setControl(composite);

        MakeUIPlugin.getDefault().getWorkbench().getHelpSystem().setHelp(getControl(),
                IMakeHelpContextIds.MAKE_BUILDER_SETTINGS);

        if (fBuildInfo == null) {
            ControlFactory.createEmptySpace(composite);
            ControlFactory.createLabel(composite,
                    MakeUIPlugin.getResourceString("SettingsBlock.label.missingBuilderInformation")); //$NON-NLS-1$
            return;
        }

        createBuildCmdControls(composite);
        createSettingControls(composite);
        createWorkBenchBuildControls(composite);

        if (getContainer().getProject() != null) {
            createBuilderWorkingDirControls(composite);
        }
    }

    @Override
    public boolean isValid() {
        if (defButton != null && defButton.getSelection() != true) {
            String cmd = getBuildLine();
            if (cmd == null || cmd.length() == 0) {
                return false;
            }
        }
        return true;
    }

    @Override
    public void performApply(IProgressMonitor monitor) throws CoreException {
        // Missing builder info
        if (fBuildInfo == null) {
            return;
        }
        if (monitor == null) {
            monitor = new NullProgressMonitor();
        }
        IWorkspace workspace = MakeUIPlugin.getWorkspace();
        // To avoid multi-build
        IWorkspaceRunnable operation = new IWorkspaceRunnable() {

            @Override
            public void run(IProgressMonitor monitor) throws CoreException {
                monitor.beginTask(MakeUIPlugin.getResourceString("SettingsBlock.monitor.applyingSettings"), 1); //$NON-NLS-1$
                IMakeBuilderInfo info = null;
                if (getContainer().getProject() != null) {
                    try {
                        info = MakeCorePlugin.createBuildInfo(getContainer().getProject(), fBuilderID);
                    } catch (CoreException e) {
                        // disabled builder... just log it
                        MakeCorePlugin.log(e);
                        return;
                    }
                } else {
                    info = MakeCorePlugin.createBuildInfo(fPrefs, fBuilderID, false);
                }
                info.setStopOnError(isStopOnError());
                info.setUseDefaultBuildCmd(useDefaultBuildCmd());
                if (!useDefaultBuildCmd()) {
                    String bldLine = getBuildLine();
                    int start = 0;
                    int end = -1;
                    if (!bldLine.startsWith("\"")) { //$NON-NLS-1$
                        end = bldLine.indexOf(' ');
                    } else {
                        start = 1;
                        end = bldLine.indexOf('"', 1);
                    }
                    String path;
                    if (end == -1) {
                        path = bldLine;
                    } else {
                        path = bldLine.substring(start, end);
                    }
                    info.setBuildAttribute(IMakeBuilderInfo.BUILD_COMMAND, path);
                    String args = ""; //$NON-NLS-1$
                    if (end != -1) {
                        args = bldLine.substring(end + 1);
                    }
                    info.setBuildAttribute(IMakeBuilderInfo.BUILD_ARGUMENTS, args);
                }
                info.setAutoBuildEnable(autoButton.getSelection());
                info.setBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_AUTO, targetAuto.getText().trim());
                info.setIncrementalBuildEnable(incrButton.getSelection());
                info.setBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_INCREMENTAL, targetIncr.getText().trim());
                info.setFullBuildEnable(incrButton.getSelection());
                info.setCleanBuildEnable(cleanButton.getSelection());
                info.setBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_CLEAN, targetClean.getText().trim());
                if (buildLocation != null) {
                    info.setBuildAttribute(IMakeBuilderInfo.BUILD_LOCATION, buildLocation.getText().trim());
                }
            }
        };
        if (getContainer().getProject() != null) {
            workspace.run(operation, monitor);
        } else {
            operation.run(monitor);
        }
    }

    @Override
    public void performDefaults() {
        // Missing builder info
        if (fBuildInfo == null) {
            return;
        }
        IMakeBuilderInfo info;
        if (getContainer().getProject() != null) {
            info = MakeCorePlugin.createBuildInfo(fPrefs, fBuilderID, false);
        } else {
            info = MakeCorePlugin.createBuildInfo(fPrefs, fBuilderID, true);
        }
        if (info.isStopOnError())
            stopOnErrorButton.setSelection(true);
        else
            stopOnErrorButton.setSelection(false);
        if (info.getBuildCommand() != null) {
            StringBuffer cmd = new StringBuffer(info.getBuildCommand().toOSString());
            if (!info.isDefaultBuildCmd()) {
                String args = info.getBuildArguments();
                if (args != null && !args.equals("")) { //$NON-NLS-1$
                    cmd.append(" "); //$NON-NLS-1$
                    cmd.append(args);
                }
            }
            buildCommand.setText(cmd.toString());
        }
        if (info.isDefaultBuildCmd()) {
            buildCommand.setEnabled(false);
            argumentVariablesButton.setEnabled(false);
            stopOnErrorButton.setEnabled(true);
        } else {
            buildCommand.setEnabled(true);
            argumentVariablesButton.setEnabled(true);
            stopOnErrorButton.setEnabled(false);
        }

        defButton.setSelection(info.isDefaultBuildCmd());

        autoButton.setSelection(info.isAutoBuildEnable());
        autoVariableButton.setEnabled(info.isAutoBuildEnable());
        targetAuto.setEnabled(info.isAutoBuildEnable());
        targetAuto.setText(info.getAutoBuildTarget());
        incrButton.setSelection(info.isIncrementalBuildEnabled());
        incrVariableButton.setEnabled(info.isIncrementalBuildEnabled());
        targetIncr.setText(info.getIncrementalBuildTarget());
        targetIncr.setEnabled(info.isIncrementalBuildEnabled());
        cleanButton.setSelection(info.isCleanBuildEnabled());
        cleanVariableButton.setEnabled(info.isCleanBuildEnabled());
        targetClean.setText(info.getCleanBuildTarget());
        targetClean.setEnabled(info.isCleanBuildEnabled());
    }

    boolean isStopOnError() {
        return stopOnErrorButton.getSelection();
    }

    boolean useDefaultBuildCmd() {
        return defButton.getSelection();
    }

    String getBuildLine() {
        if (buildCommand != null) {
            String cmd = buildCommand.getText();
            if (cmd != null)
                return cmd.trim();
        }
        return null;
    }

    @Override
    public void setContainer(ICOptionContainer container) {
        super.setContainer(container);
        if (getContainer().getProject() != null) {
            try {
                fBuildInfo = MakeCorePlugin.createBuildInfo(getContainer().getProject(), fBuilderID);
            } catch (CoreException e) {
            }
        } else {
            fBuildInfo = MakeCorePlugin.createBuildInfo(fPrefs, fBuilderID, false);
        }
    }

    @Override
    public String getErrorMessage() {
        if (!useDefaultBuildCmd()) {
            String cmd = getBuildLine();
            if (cmd == null || cmd.length() == 0) {
                return MakeUIPlugin.getResourceString("SettingsBlock.message.mustEnterBuildCommand"); //$NON-NLS-1$
            }
        }
        return null;
    }
}