/*******************************************************************************
 * Copyright (c) 2009, 2018 Red Hat, Inc.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Red Hat - initial API and implementation
 *******************************************************************************/

package org.eclipse.linuxtools.internal.callgraph.launch;

import java.io.File;
import java.util.ArrayList;

import org.eclipse.cdt.core.model.IBinary;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.debug.core.CDebugUtils;
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
import org.eclipse.cdt.launch.ui.CLaunchConfigurationTab;
import org.eclipse.cdt.ui.CElementLabelProvider;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Platform;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.window.Window;
import org.eclipse.linuxtools.internal.callgraph.core.LaunchConfigurationConstants;
import org.eclipse.linuxtools.internal.callgraph.core.PluginConstants;
import org.eclipse.linuxtools.internal.callgraph.core.SystemTapView;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionListener;
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.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ElementListSelectionDialog;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.dialogs.TwoPaneElementSelector;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.views.navigator.ResourceComparator;

/**
 * Options tab for SystemTap. Currently does NOT contain all possible options
 *
 */
public class SystemTapOptionsTab extends CLaunchConfigurationTab{

    //Controls
    private Text scriptFile;
    private Text binaryFile;
    private Text arguments;
    private Text outputFile;
    private Text button_D_text;
    private Text binaryArguments;
    private Text parser;
    private Text viewer;

    private Button fileBrowseButton;
    private Button workspaceBrowseButton;

    private Button button_k;
    private Button button_u;
    private Button button_w;
    private Button button_b;
    private Button button_g;
    private Button button_P;
    private Button button_t;
    private Button button_F;
    private Button buttonSkipBadvars;
    private Button buttonIgnoreDwarf;
    private Button button_q;
    private Button buttonGraphicsMode;


    private Spinner button_p_Spinner;
    private Spinner button_s_Spinner;
    private Spinner button_x_Spinner;
    private Spinner button_v_Spinner;

    private Button useColourButton;

    //Other variables
    private String workspacePath;
    private boolean outputFileHasChanged = false;
    private boolean needsOverwritePermission = false;
    private boolean overwritePermission = false;
    private boolean changeOverwrite = false;

    /**
     * The code below is very long, but it boils down to this.
     *
     * The main function is createControl. This function prepares
     * some space for the various tabs and calls the other create*Option
     * functions to create buttons, text fields and spinners.
     *
     * The create*Option functions create their respective sub-tabs.
     *
     * Each of the controls (button, text, spinner) needs to have a listener
     * attached so Eclipse knows what to do with them.
     *
     * There are a bunch of functions to update/set defaults/initialize,
     * and a final
     */

	private SelectionListener graphicsModeListener = SelectionListener.widgetSelectedAdapter(e -> {
		if (scriptFile.isEnabled()) {
			scriptFile.setEnabled(false);
			workspaceBrowseButton.setEnabled(false);
			fileBrowseButton.setEnabled(false);
			scriptFile.setText(PluginConstants.getPluginLocation() + "parse_function.stp"); //$NON-NLS-1$
		} else {
			scriptFile.setEnabled(true);
			workspaceBrowseButton.setEnabled(true);
			fileBrowseButton.setEnabled(true);
		}
		updateLaunchConfigurationDialog();
	});

	private SelectionListener selectListener = SelectionListener
			.widgetSelectedAdapter(e -> updateLaunchConfigurationDialog());

    private ModifyListener modifyListener = e -> updateLaunchConfigurationDialog();

    private ModifyListener modifyListenerOutput = e -> {
	    updateLaunchConfigurationDialog();
	    outputFileHasChanged = true;
	};

	private FocusListener focusListener = FocusListener.focusLostAdapter(e -> {

		if (outputFileHasChanged) {
			checkOverwrite();
		}
		outputFileHasChanged = false;

		updateLaunchConfigurationDialog();
	});

    /**
     * Convenience method to check if the overwrite permissions are consistent
     *
     * Helps ensure validity of configuration.
     */
    private void checkOverwrite() {
        File f = new File(outputFile.getText());
        changeOverwrite = true;
        if (f.exists()) {
            needsOverwritePermission = true;
            Shell sh = new Shell();
            if (MessageDialog.openConfirm(sh, Messages.getString("SystemTapOptionsTab.ConfirmOverwriteFileTitle"),   //$NON-NLS-1$
                    Messages.getString("SystemTapOptionsTab.ConfirmOverwriteFileMessage"))) {  //$NON-NLS-1$
                overwritePermission = true;
            } else {
                overwritePermission = false;
            }
        }
        else
            needsOverwritePermission = false;
    }

    /**
     * This function prepares some space for the various
     * tabs and calls and sets the other create*Option
     * functions to create buttons, text fields and spinners.
     */
    @Override
    public void createControl(Composite parent) {
        /*
         * File folder - tab for selecting binary/stp file
         */
        TabFolder fileFolder = new TabFolder(parent, SWT.BORDER);
        fileFolder.setLayoutData(new GridData(GridData.FILL_BOTH));
        setControl(fileFolder);

        TabItem fileTab = new TabItem(fileFolder, SWT.NONE);
        fileTab.setText(Messages.getString("SystemTapOptionsTab.FilesTab")); //$NON-NLS-1$

        Composite fileTop = new Composite(fileFolder, SWT.NONE);
        fileTop.setLayout(new GridLayout());
        fileTop.setLayoutData(new GridData(GridData.FILL_BOTH));

        createFileOption(fileTop);
        fileTab.setControl(fileTop);


        /*
         * Commands tab - tab for selecting SystemTap commands
         */

        TabItem commandTab = new TabItem(fileFolder, SWT.NONE);
        commandTab.setText(Messages.getString("SystemTapOptionsTab.CommandsTab")); //$NON-NLS-1$

        Composite commandTop = new Composite(fileFolder, SWT.NONE);
        commandTop.setLayout(new GridLayout());
        commandTop.setLayoutData(new GridData(GridData.FILL_BOTH));

        createCommandOption(commandTop);
        commandTab.setControl(commandTop);

        /*
         * Arguments tab - tab for selecting script arguments
         */
        TabItem argumentsTab = new TabItem(fileFolder, SWT.NONE);
        argumentsTab.setText(Messages.getString("SystemTapOptionsTab.Arguments")); //$NON-NLS-1$

        Composite argumentsTop = new Composite(fileFolder, SWT.NONE);
        argumentsTop.setLayout(new GridLayout());
        argumentsTop.setLayoutData(new GridData(GridData.FILL_BOTH));

        createArgumentsOption(argumentsTop);
        argumentsTab.setControl(argumentsTop);


        /*
         * Binary Argument tab - tab for supplying arguments for a binary
         */
        TabItem binaryArgumentsTab = new TabItem(fileFolder, SWT.NONE);
        binaryArgumentsTab.setText(Messages.getString("SystemTapOptionsTab.44")); //$NON-NLS-1$

        Composite binaryArgumentsTop = new Composite(fileFolder, SWT.NONE);
        binaryArgumentsTop.setLayout(new GridLayout());
        binaryArgumentsTop.setLayoutData(new GridData(GridData.FILL_BOTH));

        createBinaryArgumentsOption(binaryArgumentsTop);
        binaryArgumentsTab.setControl(binaryArgumentsTop);


        /*
         * Parser tab -- Tab for selecting a parser and viewer to use
         */
        TabItem parserTab = new TabItem(fileFolder, SWT.NONE);
        parserTab.setText("Parser"); //$NON-NLS-1$

        Composite parserTop = new Composite(fileFolder, SWT.NONE);
        parserTop.setLayout(new GridLayout());
        parserTop.setLayoutData(new GridData(GridData.FILL_BOTH));

        createParserOption(parserTop);
        parserTab.setControl(parserTop);
    }


    private void createBinaryArgumentsOption(Composite binaryArgumentsTop) {
        Composite browseTop = new Composite(binaryArgumentsTop, SWT.NONE);
        browseTop.setLayout(new GridLayout(1, false));
        GridData browseData = new GridData(GridData.FILL_HORIZONTAL);
        browseTop.setLayoutData(browseData);

        Label suppFileLabel = new Label(browseTop, SWT.NONE);
        suppFileLabel.setText(Messages.getString("SystemTapOptionsTab.45")); //$NON-NLS-1$

        binaryArguments = new Text(browseTop,SWT.MULTI | SWT.WRAP | SWT.BORDER | SWT.V_SCROLL);
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.heightHint = 200;
        binaryArguments.setLayoutData(gd);
        binaryArguments.addModifyListener(modifyListener);
    }

    private void createParserOption(Composite parserTop) {
        Composite browseTop = new Composite(parserTop, SWT.NONE);
        browseTop.setLayout(new GridLayout(1, false));
        GridData browseData = new GridData(GridData.FILL_HORIZONTAL);
        browseTop.setLayoutData(browseData);

        Label suppFileLabel = new Label(browseTop, SWT.NONE);
        suppFileLabel.setText("Parser"); //$NON-NLS-1$

        parser = new Text(browseTop, SWT.BORDER);
        parser.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        parser.addModifyListener(modifyListener);

        Button parserButton = createPushButton(browseTop,
                "Find parsers", null);  //$NON-NLS-1$
		parserButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
			ElementListSelectionDialog dialog = new ElementListSelectionDialog(getShell(), new ListLabelProvider());
			dialog.setTitle("Select parser"); //$NON-NLS-1$
			dialog.setMessage("Select parser to use."); //$NON-NLS-1$
			IExtensionRegistry reg = Platform.getExtensionRegistry();
			IConfigurationElement[] extensions = reg.getConfigurationElementsFor(PluginConstants.PARSER_RESOURCE,
					PluginConstants.PARSER_NAME);

			dialog.setElements(extensions);
			if (dialog.open() == IDialogConstants.OK_ID) {
				String arg = getUsefulLabel(dialog.getFirstResult());
				parser.setText(arg);
			}
		}));


        viewer = new Text(browseTop, SWT.BORDER);
        viewer.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        viewer.addModifyListener(modifyListener);

        Button viewerButton = createPushButton(browseTop,
                "Find viewers", null);  //$NON-NLS-1$
		viewerButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
			ElementListSelectionDialog dialog = new ElementListSelectionDialog(getShell(), new ListLabelProvider());
			dialog.setTitle("Select viewer"); //$NON-NLS-1$
			dialog.setMessage("Select viewer to use."); //$NON-NLS-1$
			IExtensionRegistry reg = Platform.getExtensionRegistry();
			IConfigurationElement[] extensions = reg.getConfigurationElementsFor(PluginConstants.VIEW_RESOURCE,
					PluginConstants.VIEW_NAME);
			ArrayList<IConfigurationElement> ext = new ArrayList<>();
			for (IConfigurationElement el : extensions) {
				if (!el.getNamespaceIdentifier().contains("org.eclipse.linuxtools")) //$NON-NLS-1$
					continue;
				// TODO: Rough hack to get all the objects. We restrict to id's containing
				// org.eclipse.linuxtools, then see if the class extends SystemTapView
				try {
					if (el.createExecutableExtension(PluginConstants.ATTR_CLASS) instanceof SystemTapView) {
						ext.add(el);
					}
				} catch (CoreException e1) {
				}
			}

			dialog.setElements(ext.toArray());
			if (dialog.open() == IDialogConstants.OK_ID) {
				String arg = getUsefulLabel(dialog.getFirstResult());
				viewer.setText(arg);
			}
		}));

    }

    private void createArgumentsOption(Composite argumentsTop) {
        Composite browseTop = new Composite(argumentsTop, SWT.NONE);
        browseTop.setLayout(new GridLayout(1, false));
        GridData browseData = new GridData(GridData.FILL_HORIZONTAL);
        browseTop.setLayoutData(browseData);


        Label suppFileLabel = new Label(browseTop, SWT.NONE);
        suppFileLabel.setText(Messages.getString("SystemTapOptionsTab.SelectArguments")); //$NON-NLS-1$

        arguments = new Text(browseTop,SWT.MULTI | SWT.WRAP | SWT.BORDER | SWT.V_SCROLL);

        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.heightHint = 200;
        arguments.setLayoutData(gd);
        arguments.addModifyListener(modifyListener);


        Button probeFunctionButton = createPushButton(browseTop, Messages.getString("SystemTapOptionsTab.ProbeFunction"), null);  //$NON-NLS-1$
		probeFunctionButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> arguments
				.setText(arguments.getText() + " process(\"" + binaryFile.getText() + "\").function(\"\")") //$NON-NLS-1$ //$NON-NLS-2$
		));
    }

    private void createFileOption(Composite top) {
        Composite browseTop = new Composite(top, SWT.NONE);
        browseTop.setLayout(new GridLayout(4, false));
        browseTop.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        Label suppFileLabel = new Label(browseTop, SWT.NONE);
        suppFileLabel.setText(Messages.getString("SystemTapOptionsTab.ScriptSelector")); //$NON-NLS-1$

        scriptFile = new Text(browseTop, SWT.BORDER);
        scriptFile.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        scriptFile.addModifyListener(modifyListener);

        workspaceBrowseButton = createPushButton(browseTop, Messages.getString("SystemTapOptionsTab.WorkspaceButton"), null);  //$NON-NLS-1$
		workspaceBrowseButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
			ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), new WorkbenchLabelProvider(),
					new WorkbenchContentProvider());
			dialog.setTitle(Messages.getString("SystemTapOptionsTab.ResourceButton")); //$NON-NLS-1$
			dialog.setMessage(Messages.getString("SystemTapOptionsTab.SuppresionsFile")); //$NON-NLS-1$
			dialog.setInput(ResourcesPlugin.getWorkspace().getRoot());
			dialog.setComparator(new ResourceComparator(ResourceComparator.NAME));
			if (dialog.open() == IDialogConstants.OK_ID) {
				IResource resource = (IResource) dialog.getFirstResult();
				String arg = resource.getFullPath().toString();
				scriptFile.setText(workspacePath + arg);
			}
		}));

        fileBrowseButton = createPushButton(browseTop, Messages.getString("SystemTapOptionsTab.FileSystem"), null); //$NON-NLS-1$
		fileBrowseButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
			String filePath = scriptFile.getText();
			FileDialog dialog = new FileDialog(getShell(), SWT.SAVE);
			filePath = dialog.open();
			if (filePath != null) {
				scriptFile.setText(filePath);
			}
		}));


        Label binaryFileLabel = new Label(browseTop, SWT.NONE);
        binaryFileLabel.setText(Messages.getString("SystemTapOptionsTab.SelectBinary")); //$NON-NLS-1$

        binaryFile = new Text(browseTop, SWT.BORDER);
        binaryFile.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        binaryFile.addModifyListener(modifyListener);


        Button workspaceBrowseButton2 = createPushButton(browseTop, Messages.getString("SystemTapOptionsTab.WorkspaceButton2"), null);  //$NON-NLS-1$
		workspaceBrowseButton2.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
			ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), new WorkbenchLabelProvider(),
					new WorkbenchContentProvider());
			dialog.setTitle(Messages.getString("SystemTapOptionsTab.SelectResource")); //$NON-NLS-1$
			dialog.setMessage(Messages.getString("SystemTapOptionsTab.SelectSuppressions")); //$NON-NLS-1$
			dialog.setInput(ResourcesPlugin.getWorkspace().getRoot());
			dialog.setComparator(new ResourceComparator(ResourceComparator.NAME));
			if (dialog.open() == IDialogConstants.OK_ID) {
				IResource resource = (IResource) dialog.getFirstResult();
				String arg = resource.getFullPath().toString();
				binaryFile.setText(workspacePath + arg);
			}
		}));


        Button fileBrowseButton2 = createPushButton(browseTop, Messages.getString("SystemTapOptionsTab.BrowseFiles"), null); //$NON-NLS-1$
		fileBrowseButton2.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
			String filePath = binaryFile.getText();
			FileDialog dialog = new FileDialog(getShell(), SWT.SAVE);
			filePath = dialog.open();
			if (filePath != null) {
				File file = new File(filePath);
				if (file.exists())
					binaryFile.setText(filePath);
			}
		}));


        Label outputFileLabel = new Label(browseTop, SWT.NONE);
        outputFileLabel.setText(Messages.getString("SystemTapOptionsTab.SelectOutput")); //$NON-NLS-1$

        outputFile = new Text(browseTop, SWT.BORDER);
        outputFile.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        outputFile.addModifyListener(modifyListenerOutput);
        outputFile.addFocusListener(focusListener);

        Button workspaceBrowseButton3 = createPushButton(browseTop, Messages.getString("SystemTapOptionsTab.WorkspaceButton2"), null);  //$NON-NLS-1$
		workspaceBrowseButton3.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
			ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), new WorkbenchLabelProvider(),
					new WorkbenchContentProvider());
			dialog.setTitle(Messages.getString("SystemTapOptionsTab.SelectResource")); //$NON-NLS-1$
			dialog.setMessage(Messages.getString("SystemTapOptionsTab.SelectSuppressions")); //$NON-NLS-1$
			dialog.setInput(ResourcesPlugin.getWorkspace().getRoot());
			dialog.setComparator(new ResourceComparator(ResourceComparator.NAME));
			if (dialog.open() == IDialogConstants.OK_ID) {
				IResource resource = (IResource) dialog.getFirstResult();
				String arg = resource.getFullPath().toString();
				outputFile.setText(workspacePath + arg);
				checkOverwrite();
				updateLaunchConfigurationDialog();

			}
		}));

        Button fileBrowseButton3 = createPushButton(browseTop, Messages.getString("SystemTapOptionsTab.BrowseFiles"), null); //$NON-NLS-1$
		fileBrowseButton3.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
			String filePath = outputFile.getText();
			FileDialog dialog = new FileDialog(getShell(), SWT.SAVE);
			filePath = dialog.open();
			if (filePath != null) {
				outputFile.setText(filePath);
				checkOverwrite();
				updateLaunchConfigurationDialog();
			}
		}));

        useColourButton = new Button(browseTop, SWT.CHECK);
        useColourButton.setText(Messages.getString("SystemTapOptionsTab.ColourCodes"));  //$NON-NLS-1$
        useColourButton.addSelectionListener(selectListener);
        useColourButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    }



    private void createCommandOption(Composite top) {
        Composite buttonsTop = new Composite(top, SWT.NONE);
        GridLayout gl = new GridLayout(2, true);
        buttonsTop.setLayout( gl );
        GridData buttonsData = new GridData(SWT.FILL, SWT.BEGINNING, true, true);
        buttonsTop.setLayoutData(buttonsData);

        button_k = new Button(buttonsTop, SWT.CHECK);
        button_k.setText(Messages.getString("SystemTapOptionsTab.KeepTemp")); //$NON-NLS-1$
        button_k.addSelectionListener(selectListener);
        button_k.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        button_k.setToolTipText(Messages.getString("SystemTapOptionsTab.KeepTempToolTip")); //$NON-NLS-1$

        button_g = new Button(buttonsTop, SWT.CHECK);
        button_g.setText(Messages.getString("SystemTapOptionsTab.Guru")); //$NON-NLS-1$
        button_g.addSelectionListener(selectListener);
        button_g.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        button_g.setToolTipText(Messages.getString("SystemTapOptionsTab.GuruToolTip")); //$NON-NLS-1$

        button_P = new Button(buttonsTop, SWT.CHECK);
        button_P.setText(Messages.getString("SystemTapOptionsTab.Prologue")); //$NON-NLS-1$
        button_P.addSelectionListener(selectListener);
        button_P.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        button_P.setToolTipText(Messages.getString("SystemTapOptionsTab.PrologueSearchToolTip")); //$NON-NLS-1$

        button_u = new Button(buttonsTop, SWT.CHECK);
        button_u.setText(Messages.getString("SystemTapOptionsTab.Unused")); //$NON-NLS-1$
        button_u.addSelectionListener(selectListener);
        button_u.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        button_u.setToolTipText(
                Messages.getString("SystemTapOptionsTab.12")); //$NON-NLS-1$

        button_w = new Button(buttonsTop, SWT.CHECK);
        button_w.setText(Messages.getString("SystemTapOptionsTab.Warnings")); //$NON-NLS-1$
        button_w.addSelectionListener(selectListener);
        button_w.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        button_w.setToolTipText(Messages.getString("SystemTapOptionsTab.DisableWarningsToolTip")); //$NON-NLS-1$

        button_b = new Button(buttonsTop, SWT.CHECK);
        button_b.setText(Messages.getString("SystemTapOptionsTab.Bulk")); //$NON-NLS-1$
        button_b.addSelectionListener(selectListener);
        button_b.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        button_b.setToolTipText(
                Messages.getString("SystemTapOptionsTab.15")); //$NON-NLS-1$

        button_t = new Button(buttonsTop, SWT.CHECK);
        button_t.setText(Messages.getString("SystemTapOptionsTab.Timing")); //$NON-NLS-1$
        button_t.addSelectionListener(selectListener);
        button_t.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        button_t.setToolTipText(Messages.getString("SystemTapOptionsTab.CollectTimingToolTip")); //$NON-NLS-1$

        button_F = new Button(buttonsTop, SWT.CHECK);
        button_F.setText(Messages.getString("SystemTapOptionsTab.LeaveProbesRunning")); //$NON-NLS-1$
        button_F.addSelectionListener(selectListener);
        button_F.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        button_F.setToolTipText(Messages.getString("SystemTapOptionsTab.LeaveProbesToolTip")); //$NON-NLS-1$

        buttonSkipBadvars = new Button(buttonsTop, SWT.CHECK);
        buttonSkipBadvars.setText(Messages.getString("SystemTapOptionsTab.IgnoreBadVars")); //$NON-NLS-1$
        buttonSkipBadvars.addSelectionListener(selectListener);
        buttonSkipBadvars.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        buttonSkipBadvars.setToolTipText(
                Messages.getString("SystemTapOptionsTab.30")); //$NON-NLS-1$

        buttonIgnoreDwarf = new Button(buttonsTop, SWT.CHECK);
        buttonIgnoreDwarf.setText(Messages.getString("SystemTapOptionsTab.ForTesting")); //$NON-NLS-1$
        buttonIgnoreDwarf.addSelectionListener(selectListener);
        buttonIgnoreDwarf.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        buttonIgnoreDwarf.setToolTipText(Messages.getString("SystemTapOptionsTab.IgnoreDebugToolTip")); //$NON-NLS-1$

        button_q = new Button(buttonsTop, SWT.CHECK);
        button_q.setText(Messages.getString("SystemTapOptionsTab.Button_qInfo")); //$NON-NLS-1$
        button_q.addSelectionListener(selectListener);
        button_q.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        button_q.setToolTipText(Messages.getString("SystemTapOptionsTab.33")); //$NON-NLS-1$

        buttonGraphicsMode = new Button(buttonsTop, SWT.CHECK);
        buttonGraphicsMode.setText(Messages.getString("SystemTapOptionsTab.3")); //$NON-NLS-1$
        buttonGraphicsMode.addSelectionListener(graphicsModeListener);
        buttonGraphicsMode.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        buttonGraphicsMode.setToolTipText(
                Messages.getString("SystemTapOptionsTab.41")); //$NON-NLS-1$

        Composite button_p_Spinner_Top = new Composite(buttonsTop, SWT.NONE);
        button_p_Spinner_Top.setLayout(new GridLayout(2, true));
        button_p_Spinner_Top.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        Label button_p_Spinner_Label = new Label(button_p_Spinner_Top, SWT.NONE);
        button_p_Spinner_Label.setText(Messages.getString("SystemTapOptionsTab.19")); //$NON-NLS-1$
        button_p_Spinner = new Spinner(button_p_Spinner_Top, SWT.BORDER);
        button_p_Spinner.setMaximum(Integer.MAX_VALUE);
        button_p_Spinner.addModifyListener(modifyListener);
        button_p_Spinner.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        button_p_Spinner_Label.setToolTipText(Messages.getString("SystemTapOptionsTab.StopAfterPassToolTip")); //$NON-NLS-1$

        Composite button_s_Spinner_Top = new Composite(buttonsTop, SWT.NONE);
        button_s_Spinner_Top.setLayout(new GridLayout(2, true));
        button_s_Spinner_Top.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        Label button_s_Spinner_Label = new Label(button_s_Spinner_Top, SWT.NONE);
        button_s_Spinner_Label.setText(Messages.getString("SystemTapOptionsTab.BufferWith")); //$NON-NLS-1$
        button_s_Spinner = new Spinner(button_s_Spinner_Top, SWT.BORDER);
        button_s_Spinner.setMaximum(Integer.MAX_VALUE);
        button_s_Spinner.addModifyListener(modifyListener);
        button_s_Spinner.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        button_s_Spinner_Label.setToolTipText(Messages.getString("SystemTapOptionsTab.BufferWithToolTip")); //$NON-NLS-1$

        Composite button_x_Spinner_Top = new Composite(buttonsTop, SWT.NONE);
        button_x_Spinner_Top.setLayout(new GridLayout(2, true));
        button_x_Spinner_Top.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        Label button_x_Spinner_Label = new Label(button_x_Spinner_Top, SWT.NONE);
        button_x_Spinner_Label.setText(Messages.getString("SystemTapOptionsTab.TargetPID")); //$NON-NLS-1$
        button_x_Spinner = new Spinner(button_x_Spinner_Top, SWT.BORDER);
        button_x_Spinner.setMaximum(Integer.MAX_VALUE);
        button_x_Spinner.addModifyListener(modifyListener);
        button_x_Spinner.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        button_x_Spinner_Label.setToolTipText(Messages.getString("SystemTapOptionsTab.TargetPIDToolTip")); //$NON-NLS-1$

        Composite button_v_Spinner_Top = new Composite(buttonsTop, SWT.NONE);
        button_v_Spinner_Top.setLayout(new GridLayout(2, true));
        button_v_Spinner_Top.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        Label button_v_Spinner_Label = new Label(button_v_Spinner_Top, SWT.NONE);
        button_v_Spinner_Label.setText(Messages.getString("SystemTapOptionsTab.18")); //$NON-NLS-1$
        button_v_Spinner = new Spinner(button_v_Spinner_Top, SWT.BORDER);
        button_v_Spinner.setMaximum(3);
        button_v_Spinner.addModifyListener(modifyListener);
        button_v_Spinner.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        button_v_Spinner_Label.setToolTipText(Messages.getString("SystemTapOptionsTab.TargetPIDToolTip")); //$NON-NLS-1$


        Label button_D_label = new Label(buttonsTop, SWT.NONE);
        button_D_label.setText(Messages.getString("SystemTapOptionsTab.PreprocessorDirective")); //$NON-NLS-1$
        button_D_text = new Text(buttonsTop, SWT.BORDER);
        button_D_text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        button_D_text.addModifyListener(modifyListener);
        button_D_label.setToolTipText(
                      Messages.getString("SystemTapOptionsTab.PreprocessorToolTip")); //$NON-NLS-1$
    }

    @Override
    public String getName() {
        return Messages.getString("SystemTapOptionsTab.MainTabName"); //$NON-NLS-1$
    }

    private Shell getActiveWorkbenchShell() {
        return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
    }

    private IBinary chooseBinary(IBinary[] binaries) {
        ILabelProvider programLabelProvider = new CElementLabelProvider() {
            @Override
            public String getText(Object element) {
                if (element instanceof IBinary) {
                    IBinary bin = (IBinary)element;
                    StringBuilder name = new StringBuilder();
                    name.append(bin.getPath().lastSegment());
                    return name.toString();
                }
                return super.getText(element);
            }
        };

        ILabelProvider qualifierLabelProvider = new CElementLabelProvider() {
            @Override
            public String getText(Object element) {
                if (element instanceof IBinary) {
                    IBinary bin = (IBinary)element;
                    StringBuilder name = new StringBuilder();
                    name.append(bin.getCPU() + (bin.isLittleEndian() ? "le" : "be")); //$NON-NLS-1$ //$NON-NLS-2$
                    name.append(" - "); //$NON-NLS-1$
                    name.append(bin.getPath().toString());
                    return name.toString();
                }
                return super.getText(element);
            }
        };

        TwoPaneElementSelector dialog = new TwoPaneElementSelector(getActiveWorkbenchShell(), programLabelProvider, qualifierLabelProvider);
        dialog.setElements(binaries);
        dialog.setTitle(Messages.getString("SystemtTapOptionsTab.Callgraph")); //$NON-NLS-1$
        dialog.setMessage(Messages.getString("SystemtTapOptionsTab.Choose_a_local_application")); //$NON-NLS-1$
        dialog.setUpperListLabel(Messages.getString("SystemtTapOptionsTab.Binaries")); //$NON-NLS-1$
        dialog.setLowerListLabel(Messages.getString("SystemtTapOptionsTab.Qualifier")); //$NON-NLS-1$
        dialog.setMultipleSelection(false);
        if (dialog.open() == Window.OK) {
            return (IBinary) dialog.getFirstResult();
        }

        return null;
    }

    private IBinary getBinary(ILaunchConfiguration config) {
        try {
            ICProject project =  CDebugUtils.verifyCProject(config);
            IBinary[] binaries = project.getBinaryContainer().getBinaries();
            if (binaries != null && binaries.length > 0) {
                if (binaries.length == 1 && binaries[0] != null) {
                    return binaries[0];
                } else
                    return chooseBinary(binaries);
            }
            return null;
        } catch (CoreException e) {
            return null;
        }
    }

    @Override
    public void initializeFrom(ILaunchConfiguration configuration) {

        IWorkspace workspace = ResourcesPlugin.getWorkspace();
        IWorkspaceRoot root = workspace.getRoot();
        IPath location = root.getLocation();
        workspacePath = location.toString();

        try {
            button_k.setSelection(configuration.getAttribute(LaunchConfigurationConstants.COMMAND_KEEP_TEMPORARY, LaunchConfigurationConstants.DEFAULT_COMMAND_KEEP_TEMPORARY));
            button_u.setSelection(configuration.getAttribute(LaunchConfigurationConstants.COMMAND_NO_CODE_ELISION, LaunchConfigurationConstants.DEFAULT_COMMAND_NO_CODE_ELISION));
            button_w.setSelection(configuration.getAttribute(LaunchConfigurationConstants.COMMAND_DISABLE_WARNINGS, LaunchConfigurationConstants.DEFAULT_COMMAND_DISABLE_WARNINGS));
            button_b.setSelection(configuration.getAttribute(LaunchConfigurationConstants.COMMAND_BULK_MODE, LaunchConfigurationConstants.DEFAULT_COMMAND_BULK_MODE));
            button_g.setSelection(configuration.getAttribute(LaunchConfigurationConstants.COMMAND_GURU, LaunchConfigurationConstants.DEFAULT_COMMAND_GURU));
            button_P.setSelection(configuration.getAttribute(LaunchConfigurationConstants.COMMAND_PROLOGUE_SEARCH, LaunchConfigurationConstants.DEFAULT_COMMAND_PROLOGUE_SEARCH));
            button_t.setSelection(configuration.getAttribute(LaunchConfigurationConstants.COMMAND_TIMING_INFO, LaunchConfigurationConstants.DEFAULT_COMMAND_TIMING_INFO));
            buttonSkipBadvars.setSelection(configuration.getAttribute(LaunchConfigurationConstants.COMMAND_SKIP_BADVARS, LaunchConfigurationConstants.DEFAULT_COMMAND_SKIP_BADVARS));
            buttonIgnoreDwarf.setSelection(configuration.getAttribute(LaunchConfigurationConstants.COMMAND_IGNORE_DWARF, LaunchConfigurationConstants.DEFAULT_COMMAND_IGNORE_DWARF));
            button_q.setSelection(configuration.getAttribute(LaunchConfigurationConstants.COMMAND_TAPSET_COVERAGE, LaunchConfigurationConstants.DEFAULT_COMMAND_TAPSET_COVERAGE));
            button_F.setSelection(configuration.getAttribute(LaunchConfigurationConstants.COMMAND_LEAVE_RUNNING, LaunchConfigurationConstants.DEFAULT_COMMAND_LEAVE_RUNNING));
            button_s_Spinner.setSelection(configuration.getAttribute(LaunchConfigurationConstants.COMMAND_BUFFER_BYTES, LaunchConfigurationConstants.DEFAULT_COMMAND_BUFFER_BYTES));
            button_x_Spinner.setSelection(configuration.getAttribute(LaunchConfigurationConstants.COMMAND_TARGET_PID, LaunchConfigurationConstants.DEFAULT_COMMAND_TARGET_PID));
            button_v_Spinner.setSelection(configuration.getAttribute(LaunchConfigurationConstants.COMMAND_VERBOSE, LaunchConfigurationConstants.DEFAULT_COMMAND_VERBOSE));
            button_p_Spinner.setSelection(configuration.getAttribute(LaunchConfigurationConstants.COMMAND_PASS, LaunchConfigurationConstants.DEFAULT_COMMAND_PASS));

            button_D_text.setText(configuration.getAttribute(LaunchConfigurationConstants.COMMAND_C_DIRECTIVES, LaunchConfigurationConstants.DEFAULT_COMMAND_C_DIRECTIVES));
            binaryFile.setText(configuration.getAttribute(LaunchConfigurationConstants.BINARY_PATH, LaunchConfigurationConstants.DEFAULT_BINARY_PATH));
            scriptFile.setText(configuration.getAttribute(LaunchConfigurationConstants.SCRIPT_PATH, LaunchConfigurationConstants.DEFAULT_SCRIPT_PATH));
            outputFile.setText(configuration.getAttribute(LaunchConfigurationConstants.OUTPUT_PATH, LaunchConfigurationConstants.DEFAULT_OUTPUT_PATH));
            arguments.setText(configuration.getAttribute(LaunchConfigurationConstants.ARGUMENTS, LaunchConfigurationConstants.DEFAULT_ARGUMENTS));
            binaryArguments.setText(configuration.getAttribute(LaunchConfigurationConstants.BINARY_ARGUMENTS, LaunchConfigurationConstants.DEFAULT_BINARY_ARGUMENTS));

            parser.setText(configuration.getAttribute(LaunchConfigurationConstants.PARSER_CLASS, LaunchConfigurationConstants.DEFAULT_PARSER_CLASS));
            viewer.setText(configuration.getAttribute(LaunchConfigurationConstants.VIEW_CLASS, LaunchConfigurationConstants.DEFAULT_VIEW_CLASS));

            useColourButton.setSelection(configuration.getAttribute(LaunchConfigurationConstants.USE_COLOUR, LaunchConfigurationConstants.DEFAULT_USE_COLOUR));

        } catch (CoreException e) {
            e.printStackTrace();
        }


    }

    @Override
    public void performApply(ILaunchConfigurationWorkingCopy configuration) {

        getControl().setRedraw(false);

        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_KEEP_TEMPORARY, button_k.getSelection());
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_GURU, button_g.getSelection());
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_PROLOGUE_SEARCH, button_P.getSelection());
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_NO_CODE_ELISION, button_u.getSelection());
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_DISABLE_WARNINGS, button_w.getSelection());
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_BULK_MODE, button_b.getSelection());
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_TIMING_INFO, button_t.getSelection());
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_SKIP_BADVARS, buttonSkipBadvars.getSelection());
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_IGNORE_DWARF, buttonIgnoreDwarf.getSelection());
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_TAPSET_COVERAGE, button_q.getSelection());
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_LEAVE_RUNNING, button_F.getSelection());
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_PASS, button_p_Spinner.getSelection());
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_BUFFER_BYTES, button_s_Spinner.getSelection());
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_TARGET_PID, button_x_Spinner.getSelection());
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_VERBOSE, button_v_Spinner.getSelection());

        configuration.setAttribute(LaunchConfigurationConstants.PARSER_CLASS, parser.getText());
        configuration.setAttribute(LaunchConfigurationConstants.VIEW_CLASS, viewer.getText());

        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_C_DIRECTIVES, button_D_text.getText());
        configuration.setAttribute(LaunchConfigurationConstants.BINARY_PATH, binaryFile.getText());
        configuration.setAttribute(LaunchConfigurationConstants.SCRIPT_PATH, scriptFile.getText());
        configuration.setAttribute(LaunchConfigurationConstants.ARGUMENTS, arguments.getText());
        configuration.setAttribute(LaunchConfigurationConstants.BINARY_ARGUMENTS, binaryArguments.getText());
        configuration.setAttribute(LaunchConfigurationConstants.OUTPUT_PATH, outputFile.getText());

        configuration.setAttribute(LaunchConfigurationConstants.USE_COLOUR, useColourButton.getSelection());

        if (buttonGraphicsMode.getSelection()){
            scriptFile.setEnabled(false);
            workspaceBrowseButton.setEnabled(false);
            fileBrowseButton.setEnabled(false);

        }else{
            scriptFile.setEnabled(true);
            workspaceBrowseButton.setEnabled(true);
            fileBrowseButton.setEnabled(true);
        }

        if (changeOverwrite) {
            if (needsOverwritePermission && overwritePermission || !needsOverwritePermission) {
                configuration.setAttribute(LaunchConfigurationConstants.OVERWRITE, true);
            } else {
                configuration.setAttribute(LaunchConfigurationConstants.OVERWRITE, false);
            }
            changeOverwrite = false;
        }

        getControl().setRedraw(true);
    }

    @Override
    public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_VERBOSE,LaunchConfigurationConstants.DEFAULT_COMMAND_VERBOSE);
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_KEEP_TEMPORARY,LaunchConfigurationConstants.DEFAULT_COMMAND_KEEP_TEMPORARY);
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_GURU,LaunchConfigurationConstants.DEFAULT_COMMAND_GURU);
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_PROLOGUE_SEARCH,LaunchConfigurationConstants.DEFAULT_COMMAND_PROLOGUE_SEARCH);
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_NO_CODE_ELISION,LaunchConfigurationConstants.DEFAULT_COMMAND_NO_CODE_ELISION);
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_DISABLE_WARNINGS,LaunchConfigurationConstants.DEFAULT_COMMAND_DISABLE_WARNINGS);
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_BULK_MODE,LaunchConfigurationConstants.DEFAULT_COMMAND_BULK_MODE);
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_TIMING_INFO,LaunchConfigurationConstants.DEFAULT_COMMAND_TIMING_INFO);
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_SKIP_BADVARS,LaunchConfigurationConstants.DEFAULT_COMMAND_SKIP_BADVARS);
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_IGNORE_DWARF,LaunchConfigurationConstants.DEFAULT_COMMAND_IGNORE_DWARF);
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_TAPSET_COVERAGE,LaunchConfigurationConstants.DEFAULT_COMMAND_TAPSET_COVERAGE);
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_LEAVE_RUNNING,LaunchConfigurationConstants.DEFAULT_COMMAND_LEAVE_RUNNING);
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_PASS,LaunchConfigurationConstants.DEFAULT_COMMAND_PASS);
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_BUFFER_BYTES,LaunchConfigurationConstants.DEFAULT_COMMAND_BUFFER_BYTES);
        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_TARGET_PID,LaunchConfigurationConstants.DEFAULT_COMMAND_TARGET_PID);

        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_C_DIRECTIVES,LaunchConfigurationConstants.DEFAULT_COMMAND_C_DIRECTIVES);
        configuration.setAttribute(LaunchConfigurationConstants.BINARY_PATH,LaunchConfigurationConstants.DEFAULT_BINARY_PATH);
        configuration.setAttribute(LaunchConfigurationConstants.SCRIPT_PATH,LaunchConfigurationConstants.DEFAULT_SCRIPT_PATH);
        configuration.setAttribute(LaunchConfigurationConstants.OUTPUT_PATH,LaunchConfigurationConstants.DEFAULT_OUTPUT_PATH);
        configuration.setAttribute(LaunchConfigurationConstants.ARGUMENTS,LaunchConfigurationConstants.DEFAULT_ARGUMENTS);
        configuration.setAttribute(LaunchConfigurationConstants.BINARY_ARGUMENTS,LaunchConfigurationConstants.DEFAULT_BINARY_ARGUMENTS);

        configuration.setAttribute(LaunchConfigurationConstants.GENERATED_SCRIPT, LaunchConfigurationConstants.DEFAULT_GENERATED_SCRIPT);
        configuration.setAttribute(LaunchConfigurationConstants.NEED_TO_GENERATE, LaunchConfigurationConstants.DEFAULT_NEED_TO_GENERATE);
        configuration.setAttribute(LaunchConfigurationConstants.PARSER_CLASS, LaunchConfigurationConstants.DEFAULT_PARSER_CLASS);
        configuration.setAttribute(LaunchConfigurationConstants.VIEW_CLASS, LaunchConfigurationConstants.DEFAULT_VIEW_CLASS);

        configuration.setAttribute(LaunchConfigurationConstants.USE_COLOUR, LaunchConfigurationConstants.DEFAULT_USE_COLOUR);

        configuration.setAttribute(LaunchConfigurationConstants.COMMAND_LIST, ConfigurationOptionsSetter.setOptions(configuration));

        ICElement cElement = null;
        cElement = getContext(configuration, getPlatform(configuration));
        if (cElement != null) {
            initializeCProject(cElement, configuration);
        } else {
            // don't want to remember the interim value from before
            configuration.setMappedResources(null);
        }

        IBinary bin = getBinary(configuration);
        if (bin != null) {
            String programName = bin.getResource().getProjectRelativePath().toString();
            configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, programName);
            configuration.setAttribute(ICDTLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY, (String) null);

            LaunchStapGraph launch = new LaunchStapGraph();
            launch.setTestMode(true); //Do not run callgraph
            launch.launch(bin, "", configuration); //$NON-NLS-1$
        }
    }


    @Override
    public boolean isValid(ILaunchConfiguration launchConfig) {
        // Check that the major options are sane
        boolean valid = true;
        try {
            String sPath = launchConfig.getAttribute(
                    LaunchConfigurationConstants.SCRIPT_PATH,
                    LaunchConfigurationConstants.DEFAULT_SCRIPT_PATH);

            File script = new File(sPath);

            if (sPath.equals(LaunchConfigurationConstants.DEFAULT_SCRIPT_PATH) || !script.exists()) {
                //No script path specified or no such script exists
                valid = false;
            }

        } catch (CoreException e) {
            e.printStackTrace();
        }

        return valid;
    }

    private String getUsefulLabel(Object element) {
        if (element instanceof IConfigurationElement) {
            Object o = ((IConfigurationElement) element).getParent();
            if (o instanceof IExtension) {
                IExtension e = (IExtension) ((IConfigurationElement) element).getParent();
                return e.getUniqueIdentifier();
            }
    }
    return Messages.getString("SystemTapOptionsTab.1"); //$NON-NLS-1$
    }

    private static class ListLabelProvider extends LabelProvider {

        @Override
        public Image getImage(Object element) {
            return null;
        }

        @Override
        public String getText(Object element) {
            if (element instanceof IConfigurationElement) {
                Object o = ((IConfigurationElement) element).getParent();
                if (o instanceof IExtension) {
                    IExtension e = (IExtension) ((IConfigurationElement) element).getParent();
                    return e.getLabel();
                }
                else if (o instanceof IConfigurationElement) {
                    IConfigurationElement e = (IConfigurationElement) ((IConfigurationElement) element).getParent();
                    return e.getName();
                }

        }
        return Messages.getString("SystemTapOptionsTab.46"); //$NON-NLS-1$
        }


        @Override
        public boolean isLabelProperty(Object element, String property) {
            return false;
        }
    }
}
