sc.ndt.ui.externaltools.internal.launchConfigurations.ExternalToolsMainTab.java Source code

Java tutorial

Introduction

Here is the source code for sc.ndt.ui.externaltools.internal.launchConfigurations.ExternalToolsMainTab.java

Source

/*******************************************************************************
 * Copyright (c) 2000, 2011 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package sc.ndt.ui.externaltools.internal.launchConfigurations;

import java.io.File;
import java.util.Map;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.variables.IStringVariableManager;
import org.eclipse.core.variables.VariablesPlugin;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.internal.ui.SWTFactory;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
import org.eclipse.debug.ui.ILaunchConfigurationTab;
import org.eclipse.debug.ui.StringVariableSelectionDialog;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.accessibility.AccessibleAdapter;
import org.eclipse.swt.accessibility.AccessibleEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
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.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ContainerSelectionDialog;
import org.eclipse.ui.dialogs.ResourceSelectionDialog;

import sc.ndt.core.externaltools.internal.IExternalToolConstants;
import sc.nrel.nwtc.fast.internal.debug.FREIDebugUIPlugin;
import sc.nrel.nwtc.fast.internal.debug.ui.LauncherMessages;
import sc.nrel.nwtc.fast.internal.debug.ui.fres.FREDescriptor;
import sc.nrel.nwtc.fast.internal.debug.ui.fres.FREsComboBlock;
import sc.nrel.nwtc.fast.launching.FASTRuntime;
import sc.nrel.nwtc.fast.launching.IFASTInstall;
import sc.nrel.nwtc.fast.launching.IFASTLaunchConfigurationConstants;

//import sc.ndt.ui.externaltools.internal.model.IExternalToolConstants;

/**
 * The external tools main tab allows the user to configure primary attributes
 * of external tool launch configurations such as the location, working
 * directory, and arguments.
 */
public abstract class ExternalToolsMainTab extends AbstractLaunchConfigurationTab {

    public final static String FIRST_EDIT = "editedByExternalToolsMainTab"; //$NON-NLS-1$

    protected Text locationField;
    protected Text workDirectoryField;
    protected Button fileLocationButton;
    protected Button workspaceLocationButton;
    protected Button variablesLocationButton;
    protected Button fileWorkingDirectoryButton;
    protected Button workspaceWorkingDirectoryButton;
    protected Button variablesWorkingDirectoryButton;

    protected Text argumentField;
    protected Button argumentVariablesButton;

    protected SelectionAdapter selectionAdapter;

    protected boolean fInitializing = false;
    private boolean userEdited = false;

    protected WidgetListener fListener = new WidgetListener();

    // FRE Block
    protected FREsComboBlock fJREBlock;

    // Dynamic FRE UI widgets
    protected ILaunchConfigurationTab fDynamicTab;
    protected Composite fDynamicTabHolder;
    protected boolean fUseDynamicArea = true;

    protected ILaunchConfigurationWorkingCopy fWorkingCopy;
    protected ILaunchConfiguration fLaunchConfiguration;

    // State
    //protected boolean fIsInitializing = false;

    // Selection changed listener (checked JRE)
    private IPropertyChangeListener fCheckListener = new IPropertyChangeListener() {
        public void propertyChange(PropertyChangeEvent event) {
            setDirty(true);
            userEdited = true;
            handleSelectedJREChanged();
        }
    };

    protected void handleSelectedJREChanged() {

        loadDynamicJREArea();

        // always set the newly created area with defaults
        ILaunchConfigurationWorkingCopy wc = getLaunchConfigurationWorkingCopy();
        if (getDynamicTab() == null) {
            // remove any VM specific arguments from the config
            if (wc == null) {
                if (getLaunchConfiguration().isWorkingCopy()) {
                    wc = (ILaunchConfigurationWorkingCopy) getLaunchConfiguration();
                }
            }
            if (!fInitializing) {
                if (wc != null) {
                    wc.setAttribute(IFASTLaunchConfigurationConstants.ATTR_VM_INSTALL_TYPE_SPECIFIC_ATTRS_MAP,
                            (Map<String, String>) null);
                }

            }
        } else {
            if (wc == null) {
                try {
                    ILaunchConfiguration config = getLaunchConfiguration();
                    if (config.isWorkingCopy()) {
                        // get a fresh copy to work on, only if there is an
                        // original to do so
                        wc = (ILaunchConfigurationWorkingCopy) config;
                        if (wc.getOriginal() != null) {
                            wc.getOriginal().getWorkingCopy();
                        }
                    } else {
                        wc = getLaunchConfiguration().getWorkingCopy();
                    }
                } catch (CoreException e) {
                    IStatus status = e.getStatus();
                    // TODO FREIDebugUIPlugin.statusDialog(status);
                    // TODO JDIDebugUIPlugin.log(status);
                    return;
                }
            }
            if (!fInitializing) {
                getDynamicTab().setDefaults(wc);
                getDynamicTab().initializeFrom(wc);

            }
        }

        updateLaunchConfigurationDialog();

    }

    protected ILaunchConfigurationWorkingCopy getLaunchConfigurationWorkingCopy() {
        return fWorkingCopy;
    }

    /**
     * Return the class that implements <code>ILaunchConfigurationTab</code>
     * that is registered against the install type of the currently selected VM.
     * 
     * @return the backing {@link ILaunchConfigurationTab}
     */
    protected ILaunchConfigurationTab getTabForCurrentJRE() {
        if (!fJREBlock.isDefaultJRE()) {
            IPath path = fJREBlock.getPath();
            FASTRuntime.getExecutionEnvironmentId(path);
            if (path != null && FASTRuntime.getExecutionEnvironmentId(path) == null) {
                IFASTInstall vm = fJREBlock.getFRE();
                if (vm != null) {
                    String vmInstallTypeID = vm.getFASTInstallType().getId();
                    return FREIDebugUIPlugin.getDefault().getVMInstallTypePage(vmInstallTypeID);
                }
            }
        }
        return null;
    }

    /**
     * Show the contributed piece of UI that was registered for the install type
     * of the currently selected VM.
     */
    protected void loadDynamicJREArea() {

        // Dispose of any current child widgets in the tab holder area
        Control[] children = getDynamicTabHolder().getChildren();
        for (int i = 0; i < children.length; i++) {
            children[i].dispose();
        }

        if (isUseDynamicJREArea()) {
            // Retrieve the dynamic UI for the current JRE
            ILaunchConfigurationTab lct = getTabForCurrentJRE();
            setDynamicTab(lct);
            if (getDynamicTab() == null) {
                return;
            }

            // Ask the dynamic UI to create its Control
            getDynamicTab().setLaunchConfigurationDialog(getLaunchConfigurationDialog());
            getDynamicTab().createControl(getDynamicTabHolder());
            getDynamicTabHolder().layout();
        }

    }

    protected boolean isUseDynamicJREArea() {
        return fUseDynamicArea;
    }

    protected Composite getDynamicTabHolder() {
        return fDynamicTabHolder;
    }

    protected void setDynamicTabHolder(Composite tabHolder) {
        this.fDynamicTabHolder = tabHolder;
    }

    protected void setDynamicTab(ILaunchConfigurationTab tab) {
        fDynamicTab = tab;
    }

    protected ILaunchConfigurationTab getDynamicTab() {
        return fDynamicTab;
    }

    /**
     * A listener to update for text modification and widget selection.
     */
    protected class WidgetListener extends SelectionAdapter implements ModifyListener {
        public void modifyText(ModifyEvent e) {
            if (!fInitializing) {
                setDirty(true);
                userEdited = true;
                updateLaunchConfigurationDialog();
            }
        }

        public void widgetSelected(SelectionEvent e) {
            setDirty(true);
            Object source = e.getSource();
            if (source == workspaceLocationButton) {
                handleWorkspaceLocationButtonSelected();
            } else if (source == fileLocationButton) {
                handleFileLocationButtonSelected();
            } else if (source == workspaceWorkingDirectoryButton) {
                handleWorkspaceWorkingDirectoryButtonSelected();
            } else if (source == fileWorkingDirectoryButton) {
                handleFileWorkingDirectoryButtonSelected();
            } else if (source == argumentVariablesButton) {
                handleVariablesButtonSelected(argumentField);
            } else if (source == variablesLocationButton) {
                handleVariablesButtonSelected(locationField);
            } else if (source == variablesWorkingDirectoryButton) {
                handleVariablesButtonSelected(workDirectoryField);
            }
        }

    }

    @Override
    public void dispose() {
        super.dispose();
        if (fJREBlock != null) {
            fJREBlock.removePropertyChangeListener(fCheckListener);
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse
     * .swt.widgets.Composite)
     */
    public void createControl(Composite parent) {

        Font font = parent.getFont();

        Composite topComp = SWTFactory.createComposite(parent, font, 1, 1, GridData.FILL_HORIZONTAL, 0, 0);

        fJREBlock = new FREsComboBlock(true);
        fJREBlock.setDefaultFREDescriptor(getDefaultFREDescriptor());
        fJREBlock.setSpecificFREDescriptor(getSpecificFREDescriptor());
        fJREBlock.createControl(topComp);
        Control control = fJREBlock.getControl();
        fJREBlock.addPropertyChangeListener(fCheckListener);
        control.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        setDynamicTabHolder(SWTFactory.createComposite(topComp, font, 1, 1, GridData.FILL_HORIZONTAL, 0, 0));
        setControl(topComp);

        //
        // PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
        // getHelpContextId());

        createLocationComponent(topComp);

        createWorkDirectoryComponent(topComp);
        createArgumentComponent(topComp);
        createVerticalSpacer(topComp, 1);

        Dialog.applyDialogFont(parent);
    }

    protected FREDescriptor getSpecificFREDescriptor() {
        return null;
    }

    /**
     * Creates the controls needed to edit the location attribute of an external
     * tool
     * 
     * @param parent
     *            the composite to create the controls in
     */
    protected void createLocationComponent(Composite parent) {
        Group group = new Group(parent, SWT.NONE);
        String locationLabel = getLocationLabel();
        group.setText(locationLabel);
        GridLayout layout = new GridLayout();
        layout.numColumns = 1;
        GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
        group.setLayout(layout);
        group.setLayoutData(gridData);

        locationField = new Text(group, SWT.BORDER);
        gridData = new GridData(GridData.FILL_HORIZONTAL);
        gridData.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
        locationField.setLayoutData(gridData);
        locationField.addModifyListener(fListener);
        addControlAccessibleListener(locationField, group.getText());

        Composite buttonComposite = new Composite(group, SWT.NONE);
        layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        layout.numColumns = 3;
        gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
        buttonComposite.setLayout(layout);
        buttonComposite.setLayoutData(gridData);
        buttonComposite.setFont(parent.getFont());

        workspaceLocationButton = createPushButton(buttonComposite,
                ExternalToolsLaunchConfigurationMessages.ExternalToolsMainTab__Browse_Workspace____3, null);
        workspaceLocationButton.addSelectionListener(fListener);
        addControlAccessibleListener(workspaceLocationButton,
                group.getText() + " " + workspaceLocationButton.getText()); //$NON-NLS-1$

        fileLocationButton = createPushButton(buttonComposite,
                ExternalToolsLaunchConfigurationMessages.ExternalToolsMainTab_Brows_e_File_System____4, null);
        fileLocationButton.addSelectionListener(fListener);
        addControlAccessibleListener(fileLocationButton, group.getText() + " " + fileLocationButton.getText()); //$NON-NLS-1$

        variablesLocationButton = createPushButton(buttonComposite,
                ExternalToolsLaunchConfigurationMessages.ExternalToolsMainTab_31, null);
        variablesLocationButton.addSelectionListener(fListener);
        addControlAccessibleListener(variablesLocationButton,
                group.getText() + " " + variablesLocationButton.getText()); //$NON-NLS-1$
    }

    /**
     * Returns the label used for the location widgets. Subclasses may wish to
     * override.
     */
    protected String getLocationLabel() {
        return ExternalToolsLaunchConfigurationMessages.ExternalToolsMainTab__Location___2;
    }

    /**
     * Creates the controls needed to edit the working directory attribute of an
     * external tool
     * 
     * @param parent
     *            the composite to create the controls in
     */
    protected void createWorkDirectoryComponent(Composite parent) {
        Group group = new Group(parent, SWT.NONE);
        String groupName = getWorkingDirectoryLabel();
        group.setText(groupName);
        GridLayout layout = new GridLayout();
        layout.numColumns = 1;
        GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
        group.setLayout(layout);
        group.setLayoutData(gridData);

        workDirectoryField = new Text(group, SWT.BORDER);
        GridData data = new GridData(GridData.FILL_HORIZONTAL);
        data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
        workDirectoryField.setLayoutData(data);
        workDirectoryField.addModifyListener(fListener);
        addControlAccessibleListener(workDirectoryField, group.getText());

        Composite buttonComposite = new Composite(group, SWT.NONE);
        layout = new GridLayout();
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        layout.numColumns = 3;
        gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
        buttonComposite.setLayout(layout);
        buttonComposite.setLayoutData(gridData);
        buttonComposite.setFont(parent.getFont());

        workspaceWorkingDirectoryButton = createPushButton(buttonComposite,
                ExternalToolsLaunchConfigurationMessages.ExternalToolsMainTab_Browse_Wor_kspace____6, null);
        workspaceWorkingDirectoryButton.addSelectionListener(fListener);
        addControlAccessibleListener(workspaceWorkingDirectoryButton,
                group.getText() + " " + workspaceWorkingDirectoryButton.getText()); //$NON-NLS-1$

        fileWorkingDirectoryButton = createPushButton(buttonComposite,
                ExternalToolsLaunchConfigurationMessages.ExternalToolsMainTab_Browse_F_ile_System____7, null);
        fileWorkingDirectoryButton.addSelectionListener(fListener);
        addControlAccessibleListener(fileWorkingDirectoryButton,
                group.getText() + " " + fileWorkingDirectoryButton.getText()); //$NON-NLS-1$

        variablesWorkingDirectoryButton = createPushButton(buttonComposite,
                ExternalToolsLaunchConfigurationMessages.ExternalToolsMainTab_32, null);
        variablesWorkingDirectoryButton.addSelectionListener(fListener);
        addControlAccessibleListener(variablesWorkingDirectoryButton,
                group.getText() + " " + variablesWorkingDirectoryButton.getText()); //$NON-NLS-1$
    }

    /**
     * Return the String to use as the label for the working directory field.
     * Subclasses may wish to override.
     */
    protected String getWorkingDirectoryLabel() {
        return ExternalToolsLaunchConfigurationMessages.ExternalToolsMainTab_Working__Directory__5;
    }

    /**
     * Creates the controls needed to edit the argument and prompt for argument
     * attributes of an external tool
     * 
     * @param parent
     *            the composite to create the controls in
     */
    protected void createArgumentComponent(Composite parent) {
        Group group = new Group(parent, SWT.NONE);
        String groupName = ExternalToolsLaunchConfigurationMessages.ExternalToolsMainTab__Arguments___1;
        group.setText(groupName);
        GridLayout layout = new GridLayout();
        layout.numColumns = 1;
        GridData gridData = new GridData(GridData.FILL_BOTH);
        group.setLayout(layout);
        group.setLayoutData(gridData);
        group.setFont(parent.getFont());

        argumentField = new Text(group, SWT.MULTI | SWT.WRAP | SWT.BORDER | SWT.V_SCROLL);
        argumentField.addTraverseListener(new TraverseListener() {
            public void keyTraversed(TraverseEvent event) {
                if (event.detail == SWT.TRAVERSE_RETURN && (event.stateMask & SWT.MODIFIER_MASK) != 0) {
                    event.doit = true;
                }
            }
        });

        gridData = new GridData(GridData.FILL_BOTH);
        gridData.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
        gridData.heightHint = 30;
        argumentField.setLayoutData(gridData);
        argumentField.addModifyListener(fListener);
        addControlAccessibleListener(argumentField, group.getText());

        Composite composite = new Composite(group, SWT.NONE);
        layout = new GridLayout();
        layout.numColumns = 1;
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
        composite.setLayout(layout);
        composite.setLayoutData(gridData);
        composite.setFont(parent.getFont());

        argumentVariablesButton = createPushButton(composite,
                ExternalToolsLaunchConfigurationMessages.ExternalToolsMainTab_Varia_bles____2, null);
        argumentVariablesButton.addSelectionListener(fListener);
        addControlAccessibleListener(argumentVariablesButton, argumentVariablesButton.getText()); // need to strip the
        // mnemonic from buttons

        Label instruction = new Label(group, SWT.NONE);
        instruction.setText(ExternalToolsLaunchConfigurationMessages.ExternalToolsMainTab_3);
        gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
        gridData.horizontalSpan = 2;
        instruction.setLayoutData(gridData);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.
     * debug.core.ILaunchConfigurationWorkingCopy)
     */
    public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
        configuration.setAttribute(FIRST_EDIT, true);

        // FRE
        setLaunchConfigurationWorkingCopy(configuration);
        ILaunchConfigurationTab dynamicTab = getDynamicTab();
        if (dynamicTab != null) {
            dynamicTab.setDefaults(configuration);
        }
    }

    protected void setLaunchConfigurationWorkingCopy(ILaunchConfigurationWorkingCopy workingCopy) {
        fWorkingCopy = workingCopy;
    }

    protected void setLaunchConfiguration(ILaunchConfiguration launchConfiguration) {
        fLaunchConfiguration = launchConfiguration;
    }

    @SuppressWarnings("deprecation")
    protected void updateJREFromConfig(ILaunchConfiguration config) {
        try {
            String path = config.getAttribute(/*
                                              * IExternalToolConstants.ATTR_LOCATION
                                              */
                    IFASTLaunchConfigurationConstants.ATTR_JRE_CONTAINER_PATH, (String) null);
            if (path != null) {
                fJREBlock.setPath(Path.fromPortableString(path));
                return;
            }
        } catch (CoreException e) {
            // TODO FREIDebugUIPlugin.log(e);
        }
        String vmName = null;
        String vmTypeID = null;
        try {
            vmTypeID = config.getAttribute(IFASTLaunchConfigurationConstants.ATTR_VM_INSTALL_TYPE, (String) null);
            vmName = config.getAttribute(IFASTLaunchConfigurationConstants.ATTR_VM_INSTALL_NAME, (String) null);
        } catch (CoreException ce) {
            // TODO FREIDebugUIPlugin.log(ce);
        }
        selectFRE(vmTypeID, vmName);
    }

    protected void selectFRE(String typeID, String vmName) {
        if (typeID == null) {
            fJREBlock.setPath(FASTRuntime.newDefaultJREContainerPath());
        } else {
            fJREBlock.setPath(FASTRuntime.newJREContainerPath(typeID, vmName));
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse
     * .debug.core.ILaunchConfiguration)
     */
    public void initializeFrom(ILaunchConfiguration configuration) {

        fInitializing = true;
        updateLocation(configuration);
        updateWorkingDirectory(configuration);
        updateArgument(configuration);

        // FRE //fIsInitializing = true;
        getControl().setRedraw(false);
        setLaunchConfiguration(configuration);
        // TODO
        updateJREFromConfig(configuration);
        fJREBlock.setDefaultFREDescriptor(getDefaultFREDescriptor());
        ILaunchConfigurationTab dynamicTab = getDynamicTab();
        if (dynamicTab != null) {
            dynamicTab.initializeFrom(configuration);
        }
        getControl().setRedraw(true);
        fInitializing = false;
        setDirty(false);

        //fIsInitializing = false;

    }

    protected FREDescriptor getDefaultFREDescriptor() {
        return new FREDescriptor() {

            /*
             * (non-Javadoc)
             * 
             * @see org.eclipse.jdt.internal.debug.ui.jres.DefaultJREDescriptor#
             * getDescription()
             */
            @Override
            public String getDescription() {
                /* IFASTProject */IProject project = getJavaProject();
                String name = LauncherMessages.JavaJRETab_7;
                if (project == null) {
                    IFASTInstall vm = FASTRuntime.getDefaultFASTInstall();
                    if (vm != null) {
                        name = vm.getName();
                    }
                    return NLS.bind(LauncherMessages.JavaJRETab_8, new String[] { name });
                }
                /*
                 * TODO try { String eeName = null; IClasspathEntry[] classpath
                 * = project.getRawClasspath(); for (int i = 0; i <
                 * classpath.length; i++) { IClasspathEntry entry =
                 * classpath[i]; if (entry.getEntryKind() ==
                 * IClasspathEntry.CPE_CONTAINER) { if
                 * (JavaRuntime.JRE_CONTAINER
                 * .equals(entry.getPath().segment(0))) { String id =
                 * JavaRuntime.getExecutionEnvironmentId(entry.getPath()); if
                 * (id != null) { IExecutionEnvironment env =
                 * JavaRuntime.getExecutionEnvironmentsManager
                 * ().getEnvironment(id); if (env != null) { eeName =
                 * env.getId(); break; } } } } } IFASTInstall vm =
                 * FASTRuntime.getFASTInstall(project); if (vm != null) { name =
                 * vm.getName(); } if (eeName != null) { return
                 * NLS.bind(LauncherMessages.JavaJRETab_5, new String[]{eeName,
                 * name}); } } catch (CoreException e) { }
                 */
                return NLS.bind(LauncherMessages.JavaJRETab_9, new String[] { name });
            }
        };
    }

    protected/* IFASTProject */IProject getJavaProject() {
        if (getLaunchConfiguration() != null) {
            try {
                String name = getLaunchConfiguration()
                        .getAttribute(IFASTLaunchConfigurationConstants.ATTR_PROJECT_NAME, (String) null);
                if (name != null && name.length() > 0) {
                    IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
                    if (project.exists()) {
                        return null;// TODO JavaCore.create(project);
                    }
                }
            } catch (CoreException e) {
                // TODO FREIDebugUIPlugin.log(e);
            }
        }
        return null;
    }

    protected ILaunchConfiguration getLaunchConfiguration() {
        return fLaunchConfiguration;
    }

    /**
     * Updates the working directory widgets to match the state of the given
     * launch configuration.
     */
    protected void updateWorkingDirectory(ILaunchConfiguration configuration) {
        String workingDir = IExternalToolConstants.EMPTY_STRING;
        try {
            workingDir = configuration.getAttribute(IExternalToolConstants.ATTR_WORKING_DIRECTORY,
                    IExternalToolConstants.EMPTY_STRING);
        } catch (CoreException ce) {
            // TODO
            // ExternalToolsPlugin.getDefault().log(ExternalToolsLaunchConfigurationMessages.ExternalToolsMainTab_Error_reading_configuration_10,
            // ce);
        }
        workDirectoryField.setText(workingDir);
    }

    /**
     * Updates the location widgets to match the state of the given launch
     * configuration.
     */
    protected void updateLocation(ILaunchConfiguration configuration) {
        String location = IExternalToolConstants.EMPTY_STRING;
        try {
            location = configuration.getAttribute(IExternalToolConstants.ATTR_LOCATION,
                    IExternalToolConstants.EMPTY_STRING);
        } catch (CoreException ce) {
            // TODO
            // ExternalToolsPlugin.getDefault().log(ExternalToolsLaunchConfigurationMessages.ExternalToolsMainTab_Error_reading_configuration_10,
            // ce);
        }
        locationField.setText(location);
    }

    /**
     * Updates the argument widgets to match the state of the given launch
     * configuration.
     */
    protected void updateArgument(ILaunchConfiguration configuration) {
        String arguments = IExternalToolConstants.EMPTY_STRING;
        try {
            arguments = configuration.getAttribute(IExternalToolConstants.ATTR_TOOL_ARGUMENTS,
                    IExternalToolConstants.EMPTY_STRING);
        } catch (CoreException ce) {
            // TODO
            // ExternalToolsPlugin.getDefault().log(ExternalToolsLaunchConfigurationMessages.ExternalToolsMainTab_Error_reading_configuration_7,
            // ce);
        }
        argumentField.setText(arguments);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse
     * .debug.core.ILaunchConfigurationWorkingCopy)
     */
    public void performApply(ILaunchConfigurationWorkingCopy configuration) {

        String location = locationField.getText().trim();
        if (location.length() == 0) {
            configuration.setAttribute(IExternalToolConstants.ATTR_LOCATION, (String) null);
        } else {
            configuration.setAttribute(IExternalToolConstants.ATTR_LOCATION, location);
        }

        if (fJREBlock.isDefaultJRE()) {
            configuration.setAttribute(IFASTLaunchConfigurationConstants.ATTR_JRE_CONTAINER_PATH, (String) null);
        } else {
            IPath containerPath = fJREBlock.getPath();
            String portablePath = null;
            if (containerPath != null) {
                portablePath = containerPath.toPortableString();
            }
            configuration.setAttribute(IFASTLaunchConfigurationConstants.ATTR_JRE_CONTAINER_PATH, portablePath);
        }

        String workingDirectory = workDirectoryField.getText().trim();
        if (workingDirectory.length() == 0) {
            configuration.setAttribute(IExternalToolConstants.ATTR_WORKING_DIRECTORY, (String) null);
        } else {
            configuration.setAttribute(IExternalToolConstants.ATTR_WORKING_DIRECTORY, workingDirectory);
        }

        String arguments = argumentField.getText().trim();
        if (arguments.length() == 0) {
            configuration.setAttribute(IExternalToolConstants.ATTR_TOOL_ARGUMENTS, (String) null);
        } else {
            configuration.setAttribute(IExternalToolConstants.ATTR_TOOL_ARGUMENTS, arguments);
        }

        if (userEdited) {
            configuration.setAttribute(FIRST_EDIT, (String) null);
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
     */
    public String getName() {
        return ExternalToolsLaunchConfigurationMessages.ExternalToolsMainTab__Main_17;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.debug.ui.ILaunchConfigurationTab#isValid(org.eclipse.debug
     * .core.ILaunchConfiguration)
     */
    public boolean isValid(ILaunchConfiguration launchConfig) {
        setErrorMessage(null);
        setMessage(null);
        boolean newConfig = false;
        try {
            newConfig = launchConfig.getAttribute(FIRST_EDIT, false);
        } catch (CoreException e) {
            // assume false is correct
        }
        return /* validateLocation(newConfig) && */validateWorkDirectory();
    }

    /**
     * Validates the content of the location field.
     */
    protected boolean validateLocation(boolean newConfig) {
        String location = locationField.getText().trim();
        if (location.length() < 1) {
            if (newConfig) {
                setErrorMessage(null);
                setMessage(ExternalToolsLaunchConfigurationMessages.ExternalToolsMainTab_30);
            } else {
                setErrorMessage(
                        ExternalToolsLaunchConfigurationMessages.ExternalToolsMainTab_External_tool_location_cannot_be_empty_18);
                setMessage(null);
            }
            return false;
        }

        String expandedLocation = null;
        try {
            expandedLocation = resolveValue(location);
            if (expandedLocation == null) { // a variable that needs to be
                // resolved at runtime
                return true;
            }
        } catch (CoreException e) {
            setErrorMessage(e.getStatus().getMessage());
            return false;
        }

        File file = new File(expandedLocation);
        if (!file.exists()) { // The file does not exist.
            if (!newConfig) {
                setErrorMessage(
                        ExternalToolsLaunchConfigurationMessages.ExternalToolsMainTab_External_tool_location_does_not_exist_19);
            }
            return false;
        }
        if (!file.isFile()) {
            if (!newConfig) {
                setErrorMessage(
                        ExternalToolsLaunchConfigurationMessages.ExternalToolsMainTab_External_tool_location_specified_is_not_a_file_20);
            }
            return false;
        }
        return true;
    }

    /**
     * Validates the variables of the given string to determine if all variables
     * are valid
     * 
     * @param expression
     *            expression with variables
     * @exception CoreException
     *                if a variable is specified that does not exist
     */
    private void validateVaribles(String expression) throws CoreException {
        IStringVariableManager manager = VariablesPlugin.getDefault().getStringVariableManager();
        manager.validateStringVariables(expression);
    }

    private String resolveValue(String expression) throws CoreException {
        String expanded = null;
        try {
            expanded = getValue(expression);
        } catch (CoreException e) { // possibly just a variable that needs to be
            // resolved at runtime
            validateVaribles(expression);
            return null;
        }
        return expanded;
    }

    /**
     * Validates the value of the given string to determine if any/all variables
     * are valid
     * 
     * @param expression
     *            expression with variables
     * @return whether the expression contained any variable values
     * @exception CoreException
     *                if variable resolution fails
     */
    private String getValue(String expression) throws CoreException {
        IStringVariableManager manager = VariablesPlugin.getDefault().getStringVariableManager();
        return manager.performStringSubstitution(expression);
    }

    /**
     * Validates the content of the working directory field.
     */
    protected boolean validateWorkDirectory() {
        String dir = workDirectoryField.getText().trim();
        if (dir.length() <= 0) {
            return true;
        }

        String expandedDir = null;
        try {
            expandedDir = resolveValue(dir);
            if (expandedDir == null) { // a variable that needs to be resolved
                // at runtime
                return true;
            }
        } catch (CoreException e) {
            setErrorMessage(e.getStatus().getMessage());
            return false;
        }

        File file = new File(expandedDir);
        if (!file.exists()) { // The directory does not exist.
            setErrorMessage(
                    ExternalToolsLaunchConfigurationMessages.ExternalToolsMainTab_External_tool_working_directory_does_not_exist_or_is_invalid_21);
            return false;
        }
        if (!file.isDirectory()) {
            setErrorMessage(ExternalToolsLaunchConfigurationMessages.ExternalToolsMainTab_Not_a_directory);
            return false;
        }
        return true;
    }

    /**
     * Prompts the user to choose a location from the filesystem and sets the
     * location as the full path of the selected file.
     */
    protected void handleFileLocationButtonSelected() {
        FileDialog fileDialog = new FileDialog(getShell(), SWT.NONE);
        fileDialog.setFileName(locationField.getText());
        String text = fileDialog.open();
        if (text != null) {
            locationField.setText(text);
        }
    }

    /**
     * Prompts the user for a workspace location within the workspace and sets
     * the location as a String containing the workspace_loc variable or
     * <code>null</code> if no location was obtained from the user.
     */
    protected void handleWorkspaceLocationButtonSelected() {
        ResourceSelectionDialog dialog;
        dialog = new ResourceSelectionDialog(getShell(), ResourcesPlugin.getWorkspace().getRoot(),
                ExternalToolsLaunchConfigurationMessages.ExternalToolsMainTab_Select_a_resource_22);
        dialog.open();
        Object[] results = dialog.getResult();
        if (results == null || results.length < 1) {
            return;
        }
        IResource resource = (IResource) results[0];
        locationField.setText(newVariableExpression("workspace_loc", resource.getFullPath().toString())); //$NON-NLS-1$
    }

    /**
     * Prompts the user for a working directory location within the workspace
     * and sets the working directory as a String containing the workspace_loc
     * variable or <code>null</code> if no location was obtained from the user.
     */
    protected void handleWorkspaceWorkingDirectoryButtonSelected() {
        ContainerSelectionDialog containerDialog;
        containerDialog = new ContainerSelectionDialog(getShell(), ResourcesPlugin.getWorkspace().getRoot(), false,
                ExternalToolsLaunchConfigurationMessages.ExternalToolsMainTab_23);
        containerDialog.open();
        Object[] resource = containerDialog.getResult();
        String text = null;
        if (resource != null && resource.length > 0) {
            text = newVariableExpression("workspace_loc", ((IPath) resource[0]).toString()); //$NON-NLS-1$
        }
        if (text != null) {
            workDirectoryField.setText(text);
        }
    }

    /**
     * Returns a new variable expression with the given variable and the given
     * argument.
     * 
     * @see IStringVariableManager#generateVariableExpression(String, String)
     */
    protected String newVariableExpression(String varName, String arg) {
        return VariablesPlugin.getDefault().getStringVariableManager().generateVariableExpression(varName, arg);
    }

    /**
     * Prompts the user to choose a working directory from the filesystem.
     */
    protected void handleFileWorkingDirectoryButtonSelected() {
        DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.SAVE);
        dialog.setMessage(ExternalToolsLaunchConfigurationMessages.ExternalToolsMainTab_23);
        dialog.setFilterPath(workDirectoryField.getText());
        String text = dialog.open();
        if (text != null) {
            workDirectoryField.setText(text);
        }
    }

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

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage()
     */
    public Image getImage() {
        return null; // ExternalToolsImages.getImage(org.eclipse.ui.externaltools.internal.model.IExternalToolConstants.IMG_TAB_MAIN);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.debug.ui.ILaunchConfigurationTab#deactivated(org.eclipse.
     * debug.core.ILaunchConfigurationWorkingCopy)
     */
    public void deactivated(ILaunchConfigurationWorkingCopy workingCopy) {
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.debug.ui.ILaunchConfigurationTab#activated(org.eclipse.debug
     * .core.ILaunchConfigurationWorkingCopy)
     */
    public void activated(ILaunchConfigurationWorkingCopy workingCopy) {
    }

    /*
     * Fix for Bug 60163 Accessibility: New Builder Dialog missing object info
     * for textInput controls
     */
    public void addControlAccessibleListener(Control control, String controlName) {
        // strip mnemonic (&)
        String[] strs = controlName.split("&"); //$NON-NLS-1$
        StringBuffer stripped = new StringBuffer();
        for (int i = 0; i < strs.length; i++) {
            stripped.append(strs[i]);
        }
        control.getAccessible().addAccessibleListener(new ControlAccessibleListener(stripped.toString()));
    }

    private class ControlAccessibleListener extends AccessibleAdapter {
        private String controlName;

        ControlAccessibleListener(String name) {
            controlName = name;
        }

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

    }
}