org.eclipse.cdt.internal.ui.preferences.PathEntryVariableDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.cdt.internal.ui.preferences.PathEntryVariableDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2002, 2008 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:
 *     IBM Corporation - initial API and implementation
 *     QNX Software Systems - Initial API and implementation
 *******************************************************************************/

package org.eclipse.cdt.internal.ui.preferences;

import java.io.File;
import java.util.Set;

import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.swt.SWT;
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.graphics.Font;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
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.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

/**
 * @deprecated in CDT 8.0. This class appears to be never used.
 */
@Deprecated
public class PathEntryVariableDialog extends TitleAreaDialog {

    // UI widgets
    private Button okButton;

    private Label variableNameLabel;

    private Label variableValueLabel;

    private Text variableNameField;

    private Text variableValueField;

    private Button fileButton;

    private Button folderButton;

    /**
     * This dialog type: <code>NEW_VARIABLE</code> or
     * <code>EXISTING_VARIABLE</code>.
     */
    private int type;

    /**
     * The type of variable that can be edited in this dialog.
     * <code>IResource.FILE</code> or <code>IResource.FOLDER</code>
     */
    private int variableType;

    /**
     * The name of the variable being edited.
     */
    private String variableName;

    /**
     * The value of the variable being edited.
     */
    private String variableValue;

    /**
     * The original name of the variable being edited. It is used when testing
     * if the current variable's name is already in use.
     */
    private String originalName;

    /**
     * Used to select the proper message depending on the current mode
     * (new/existing variable).
     */
    private boolean newVariable;

    /**
     * Set of variable names currently in use. Used when warning the user that
     * the currently selected name is already in use by another variable.
     */
    private Set<String> namesInUse;

    /**
     * The current validation status. Its value can be one of the following:<ul>
     * <li><code>IMessageProvider.NONE</code> (default);</li>
     * <li><code>IMessageProvider.WARNING</code>;</li>
     * <li><code>IMessageProvider.ERROR</code>;</li>
     * </ul>
     * Used when validating the user input.
     */
    private int validationStatus;

    /**
     * The current validation message generated by the last
     * call to a <code>validate</code> method.
     */
    private String validationMessage;

    /**
     * Whether a variable name has been entered.  
     */
    private boolean nameEntered = false;

    /**
     * Whether a variable location has been entered.  
     */
    private boolean locationEntered = false;

    /**
     * The standard message to be shown when there are no problems being
     * reported.
     */
    final private String standardMessage;

    /**
     * Constant for defining this dialog as intended to create a new variable
     * (value = 1).
     */
    public final static int NEW_VARIABLE = 1;

    /**
     * Constant for defining this dialog as intended to edit an existing
     * variable (value = 2).
     */
    public final static int EXISTING_VARIABLE = 2;

    /**
     * Constructs a dialog for editing a new/existing path variable.
     * 
     * @param parentShell the parent shell
     * @param type the dialog type: <code>NEW_VARIABLE</code> or
     *    <code>EXISTING_VARIABLE</code>
     * @param variableType the type of variable that can be edited in 
     *    this dialog. <code>IResource.FILE</code> or <code>IResource.FOLDER</code>
     * @param namesInUse a set of variable names currently in use 
     */
    public PathEntryVariableDialog(Shell parentShell, int type, int variableType, Set<String> namesInUse) {
        super(parentShell);
        this.type = type;
        this.newVariable = type == NEW_VARIABLE;
        this.variableName = ""; //$NON-NLS-1$
        this.variableValue = ""; //$NON-NLS-1$
        this.variableType = variableType;
        this.namesInUse = namesInUse;

        if (newVariable)
            this.standardMessage = PreferencesMessages.PathEntryVariableDialog_message_newVariable;
        else
            this.standardMessage = PreferencesMessages.PathEntryVariableDialog_message_existingVariable;
    }

    /**
     * Configures this dialog's shell, setting the shell's text.
     * 
     * @see org.eclipse.jface.window.Window#configureShell(Shell)
     */
    @Override
    protected void configureShell(Shell shell) {
        super.configureShell(shell);
        if (newVariable)
            shell.setText(PreferencesMessages.PathEntryVariableDialog_shellTitle_newVariable);
        else
            shell.setText(PreferencesMessages.PathEntryVariableDialog_shellTitle_existingVariable);
    }

    /**
     * Creates and returns the contents of this dialog (except for the button bar).
     * 
     * @see org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea
     */
    @Override
    protected Control createDialogArea(Composite parent) {
        // top level composite
        Composite parentComposite = (Composite) super.createDialogArea(parent);

        // creates dialog area composite
        Composite contents = createComposite(parentComposite);

        // creates and lay outs dialog area widgets 
        createWidgets(contents, parent.getFont());

        // validate possibly already incorrect variable definitions
        if (type == EXISTING_VARIABLE) {
            nameEntered = locationEntered = true;
            validateVariableValue();
        }

        return contents;
    }

    /**
     * Creates and configures this dialog's main composite.
     * 
     * @param parentComposite parent's composite
     * @return this dialog's main composite
     */
    private Composite createComposite(Composite parentComposite) {
        // creates a composite with standard margins and spacing
        Composite contents = new Composite(parentComposite, SWT.NONE);

        FormLayout layout = new FormLayout();

        layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
        layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);

        contents.setLayout(layout);
        contents.setFont(parentComposite.getFont());

        if (newVariable)
            setTitle(PreferencesMessages.PathEntryVariableDialog_dialogTitle_newVariable);
        else
            setTitle(PreferencesMessages.PathEntryVariableDialog_dialogTitle_existingVariable);
        setMessage(standardMessage);
        return contents;
    }

    /**
     * Creates widgets for this dialog.
     * 
     * @param parent the parent composite where to create widgets
     * @param contents 
     */
    private void createWidgets(Composite contents, Font font) {
        FormData data;

        String nameLabelText = PreferencesMessages.PathEntryVariableDialog_variableName;
        String valueLabelText = PreferencesMessages.PathEntryVariableDialog_variableValue;

        // variable name label
        variableNameLabel = new Label(contents, SWT.LEFT);
        variableNameLabel.setText(nameLabelText);

        data = new FormData();
        variableNameLabel.setLayoutData(data);
        variableNameLabel.setFont(font);

        // variable value label
        variableValueLabel = new Label(contents, SWT.LEFT);
        variableValueLabel.setText(valueLabelText);

        data = new FormData();
        data.top = new FormAttachment(variableNameLabel, convertVerticalDLUsToPixels(10));
        variableValueLabel.setLayoutData(data);
        variableValueLabel.setFont(font);

        // the larger label will be used in the left attachments for the fields  
        Label largerLabel = nameLabelText.length() > valueLabelText.length() ? variableNameLabel
                : variableValueLabel;

        // variable name field
        variableNameField = new Text(contents, SWT.SINGLE | SWT.BORDER);
        variableNameField.setText(variableName);

        data = new FormData();
        data.width = convertWidthInCharsToPixels(50);
        data.left = new FormAttachment(largerLabel, convertHorizontalDLUsToPixels(5));
        variableNameField.setLayoutData(data);
        variableNameField.setFont(font);
        variableNameField.setFocus();

        variableNameField.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent event) {
                variableNameModified();
            }
        });

        // variable value field
        variableValueField = new Text(contents, SWT.SINGLE | SWT.BORDER);
        variableValueField.setText(variableValue);

        data = new FormData();
        data.width = convertWidthInCharsToPixels(50);
        data.left = new FormAttachment(largerLabel, convertHorizontalDLUsToPixels(5));
        data.top = new FormAttachment(variableNameLabel, convertVerticalDLUsToPixels(10));
        variableValueField.setLayoutData(data);
        variableValueField.setFont(font);

        variableValueField.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent event) {
                variableValueModified();
            }
        });

        // select file path button
        fileButton = new Button(contents, SWT.PUSH);
        fileButton.setText(PreferencesMessages.PathEntryVariableDialog_file);
        if ((variableType & IResource.FILE) == 0)
            fileButton.setEnabled(false);

        data = setButtonFormLayoutData(fileButton);
        data.top = new FormAttachment(variableNameLabel, convertVerticalDLUsToPixels(10));
        data.left = new FormAttachment(variableValueField, convertHorizontalDLUsToPixels(10));
        data.right = new FormAttachment(100, -5);
        fileButton.setLayoutData(data);
        fileButton.setFont(font);

        fileButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                selectFile();
            }
        });

        // select folder path button
        folderButton = new Button(contents, SWT.PUSH);
        folderButton.setText(PreferencesMessages.PathEntryVariableDialog_folder);
        if ((variableType & IResource.FOLDER) == 0)
            folderButton.setEnabled(false);

        data = setButtonFormLayoutData(folderButton);
        data.top = new FormAttachment(variableValueLabel, convertVerticalDLUsToPixels(10));
        data.left = new FormAttachment(variableValueField, convertHorizontalDLUsToPixels(10));
        data.right = new FormAttachment(100, -5);
        folderButton.setLayoutData(data);
        folderButton.setFont(font);

        folderButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                selectFolder();
            }
        });
    }

    /**
     * Sets the <code>FormData</code> on the specified button to be one that is
     * spaced for the current dialog page units. The method
     * <code>initializeDialogUnits</code> must be called once before calling this
     * method for the first time.
     * 
     * @param button the button to set the <code>FormData</code>
     * @return the <code>FormData</code> set on the specified button
     */
    private FormData setButtonFormLayoutData(Button button) {
        FormData data = new FormData();
        int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
        data.width = Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
        button.setLayoutData(data);
        return data;
    }

    /**
     * Fires validations (variable name first) and updates enabled state for the
     * "Ok" button accordingly.
     */
    protected void variableNameModified() {
        // updates and validates the variable name
        variableName = variableNameField.getText().trim();
        validationStatus = IMessageProvider.NONE;
        okButton.setEnabled(validateVariableName() && validateVariableValue());
        nameEntered = true;
    }

    /**
     * Fires validations (variable value first) and updates enabled state for the
     * "Ok" button accordingly.
     */
    protected void variableValueModified() {
        // updates and validates the variable value
        variableValue = variableValueField.getText().trim();
        validationStatus = IMessageProvider.NONE;
        okButton.setEnabled(validateVariableValue() && validateVariableName());
        locationEntered = true;
    }

    /**
     * Opens a dialog where the user can select a folder path.
     */
    protected void selectFolder() {
        DirectoryDialog dialog = new DirectoryDialog(getShell());
        dialog.setText(PreferencesMessages.PathEntryVariableDialog_selectFolderTitle);
        dialog.setMessage(PreferencesMessages.PathEntryVariableDialog_selectFolderMessage);
        dialog.setFilterPath(variableValue);
        String res = dialog.open();
        if (res != null) {
            variableValue = new Path(res).makeAbsolute().toOSString();
            variableValueField.setText(variableValue);
        }
    }

    /**
     * Opens a dialog where the user can select a file path.
     */
    protected void selectFile() {
        FileDialog dialog = new FileDialog(getShell());
        dialog.setText(PreferencesMessages.PathEntryVariableDialog_selectFileTitle);
        dialog.setFilterPath(variableValue);
        String res = dialog.open();
        if (res != null) {
            variableValue = new Path(res).makeAbsolute().toOSString();
            variableValueField.setText(variableValue);
        }
    }

    /**
     * Adds buttons to this dialog's button bar.
     * 
     * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar
     */
    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
        okButton.setEnabled(type == EXISTING_VARIABLE);

        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
    }

    /**
     * Validates the current variable name, and updates this dialog's message.
     * 
     * @return true if the name is valid, false otherwise
     */
    private boolean validateVariableName() {
        boolean allowFinish = false;

        // if the current validationStatus is ERROR, no additional validation applies
        if (validationStatus == IMessageProvider.ERROR)
            return false;

        // assumes everything will be ok
        String message = standardMessage;
        int newValidationStatus = IMessageProvider.NONE;

        if (variableName.length() == 0) {
            // the variable name is empty
            if (nameEntered) {
                // a name was entered before and is now empty
                newValidationStatus = IMessageProvider.ERROR;
                message = PreferencesMessages.PathEntryVariableDialog_variableNameEmptyMessage;
            }
        } else {
            if (namesInUse.contains(variableName) && !variableName.equals(originalName)) {
                // the variable name is already in use
                message = PreferencesMessages.PathEntryVariableDialog_variableAlreadyExistsMessage;
                newValidationStatus = IMessageProvider.ERROR;
            } else {
                allowFinish = true;
            }
        }

        // overwrite the current validation status / message only if everything is ok (clearing them)
        // or if we have a more serious problem than the current one
        if (validationStatus == IMessageProvider.NONE || newValidationStatus == IMessageProvider.ERROR) {
            validationStatus = newValidationStatus;
            validationMessage = message;
        }
        // only set the message here if it is not going to be set in 
        // validateVariableValue to avoid flashing.
        if (allowFinish == false)
            setMessage(validationMessage, validationStatus);
        return allowFinish;
    }

    /**
     * Validates the current variable value, and updates this dialog's message.
     * 
     * @return true if the value is valid, false otherwise
     */
    private boolean validateVariableValue() {
        boolean allowFinish = false;

        // if the current validationStatus is ERROR, no additional validation applies
        if (validationStatus == IMessageProvider.ERROR)
            return false;

        // assumes everything will be ok
        String message = standardMessage;
        int newValidationStatus = IMessageProvider.NONE;

        if (variableValue.length() == 0) {
            // the variable value is empty
            if (locationEntered) {
                // a location value was entered before and is now empty
                newValidationStatus = IMessageProvider.ERROR;
                message = PreferencesMessages.PathEntryVariableDialog_variableValueEmptyMessage;
            }
        } else if (!Path.EMPTY.isValidPath(variableValue)) {
            // the variable value is an invalid path
            message = PreferencesMessages.PathEntryVariableDialog_variableValueInvalidMessage;
            newValidationStatus = IMessageProvider.ERROR;
        } else if (!new Path(variableValue).isAbsolute()) {
            // the variable value is a relative path
            message = PreferencesMessages.PathEntryVariableDialog_pathIsRelativeMessage;
            newValidationStatus = IMessageProvider.ERROR;
        } else if (!new File(variableValue).exists()) {
            // the path does not exist (warning)
            message = PreferencesMessages.PathEntryVariableDialog_pathDoesNotExistMessage;
            newValidationStatus = IMessageProvider.WARNING;
            allowFinish = true;
        } else {
            allowFinish = true;
        }

        // overwrite the current validation status / message only if everything is ok (clearing them)
        // or if we have a more serious problem than the current one
        if (validationStatus == IMessageProvider.NONE || newValidationStatus > validationStatus) {
            validationStatus = newValidationStatus;
            validationMessage = message;
        }
        setMessage(validationMessage, validationStatus);
        return allowFinish;
    }

    /**
     * Returns the variable name.
     * 
     * @return the variable name
     */
    public String getVariableName() {
        return variableName;
    }

    /**
     * Returns the variable value.
     * 
     * @return the variable value
     */
    public String getVariableValue() {
        return variableValue;
    }

    /**
     * Sets the variable name.
     * 
     * @param variableName the new variable name
     */
    public void setVariableName(String variableName) {
        this.variableName = variableName.trim();
        this.originalName = this.variableName;
    }

    /**
     * Sets the variable value.
     * 
     * @param variableValue the new variable value
     */
    public void setVariableValue(String variableValue) {
        this.variableValue = variableValue;
    }

}