net.rim.ejde.internal.ui.wizards.BlackBerryProjectWizardPageOne.java Source code

Java tutorial

Introduction

Here is the source code for net.rim.ejde.internal.ui.wizards.BlackBerryProjectWizardPageOne.java

Source

/*
* Copyright (c) 2010-2012 Research In Motion Limited. All rights reserved.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License, Version 1.0,
* which accompanies this distribution and is available at
*
* http://www.eclipse.org/legal/epl-v10.html
*
*/
package net.rim.ejde.internal.ui.wizards;

import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Observable;
import java.util.Observer;

import net.rim.ejde.internal.imports.LegacyImportHelper;
import net.rim.ejde.internal.internalplugin.InternalFragmentReplaceable;
import net.rim.ejde.internal.model.BlackBerryVMInstallType;
import net.rim.ejde.internal.ui.widgets.dialog.DialogField;
import net.rim.ejde.internal.ui.widgets.dialog.IDialogFieldListener;
import net.rim.ejde.internal.ui.widgets.dialog.IStringButtonAdapter;
import net.rim.ejde.internal.ui.widgets.dialog.SelectionButtonDialogField;
import net.rim.ejde.internal.ui.widgets.dialog.StringButtonDialogField;
import net.rim.ejde.internal.ui.widgets.dialog.StringDialogField;
import net.rim.ejde.internal.util.ImportUtils;
import net.rim.ejde.internal.util.Messages;
import net.rim.ejde.internal.util.VMUtils;

import org.eclipse.core.filesystem.URIUtil;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart;
import org.eclipse.jdt.internal.ui.preferences.CompliancePreferencePage;
import org.eclipse.jdt.internal.ui.preferences.PropertyAndPreferencePage;
import org.eclipse.jdt.internal.ui.viewsupport.BasicElementLabels;
import org.eclipse.jdt.internal.ui.wizards.buildpaths.BuildPathSupport;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
import org.eclipse.jdt.internal.ui.workingsets.IWorkingSetIDs;
import org.eclipse.jdt.launching.IVMInstall;
import org.eclipse.jdt.launching.IVMInstall2;
import org.eclipse.jdt.launching.IVMInstallType;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jdt.ui.PreferenceConstants;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeSelection;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.PreferencesUtil;
import org.eclipse.ui.dialogs.WorkingSetConfigurationBlock;

/**
 * The first page of the New Java Project wizard. This page is typically used in combination with
 * {@link NewBlackBerryProjectWizardPageTwo}. Clients can extend this page to modify the UI: Add, remove or reorder sections.
 *
 * <p>
 * Clients may instantiate or subclass.
 * </p>
 *
 * @since 3.4
 */
@InternalFragmentReplaceable
public class BlackBerryProjectWizardPageOne extends AbstractBlackBerryWizardPage {

    private static final String PAGE_NAME = "NewBlackBerryProjectWizardPageOne"; //$NON-NLS-1$

    private final NameGroup _nameGroup;
    private final LocationGroup _locationGroup;
    private final JRESelectionUI _JREGroup;
    private final DetectGroup _detectGroup;
    private final Validator _validator;
    private final WorkingSetGroup _workingSetGroup;
    private static final IWorkingSet[] EMPTY_WORKING_SET_ARRAY = new IWorkingSet[0];

    /**
     * Default constructor.
     */
    public BlackBerryProjectWizardPageOne() {
        super(PAGE_NAME);
        setPageComplete(false);
        setTitle(Messages.NewBlackBerryProjectWizardPageOne_page_title);
        setDescription(Messages.NewBlackBerryProjectWizardPageOne_page_description);

        _nameGroup = new NameGroup();
        _locationGroup = new LocationGroup();
        _JREGroup = new JRESelectionUI(this);
        _workingSetGroup = new WorkingSetGroup();
        _detectGroup = new DetectGroup();

        // establish connections
        _nameGroup.addObserver(_locationGroup);
        _locationGroup.addObserver(_detectGroup);

        // initialize all elements
        _nameGroup.notifyObservers();

        // create and connect validator
        _validator = new Validator();
        _nameGroup.addObserver(_validator);
        _locationGroup.addObserver(_validator);
        _JREGroup.addObserver(_validator);
        _detectGroup.addObserver(_validator);

        // initialize defaults
        setProjectName(""); //$NON-NLS-1$
        setProjectLocationURI(null);
        setWorkingSets(new IWorkingSet[0]);

        initializeDefaultVM();
    }

    /**
     * Request a project name. Fires an event whenever the text field is changed, regardless of its content.
     */
    private final class NameGroup extends Observable implements IDialogFieldListener {

        protected final StringDialogField _nameField;

        public NameGroup() {
            // text field for project name
            _nameField = new StringDialogField();
            _nameField.setLabelText(Messages.NewBlackBerryProjectWizardPageOne_NameGroup_label_text);
            _nameField.setDialogFieldListener(this);
        }

        public Control createControl(Composite composite) {
            Composite container = new Composite(composite, SWT.NONE);
            container.setFont(composite.getFont());
            container.setLayout(initGridLayout(new GridLayout(2, false), false));

            _nameField.doFillIntoGrid(container, 2);
            LayoutUtil.setHorizontalGrabbing(_nameField.getTextControl(null));

            return container;
        }

        protected void fireEvent() {
            setChanged();
            notifyObservers();
        }

        public String getName() {
            return _nameField.getText().trim();
        }

        public void postSetFocus() {
            _nameField.postSetFocusOnDialogField(getShell().getDisplay());
        }

        public void setName(String name) {
            _nameField.setText(name);
        }

        /*
         * (non-Javadoc)
         *
         * @see org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener
         * #dialogFieldChanged(org.eclipse.jdt.internal.ui.wizards.dialogfields. DialogField)
         */
        public void dialogFieldChanged(DialogField field) {
            fireEvent();
        }
    }

    /**
     * Request a location. Fires an event whenever the checkbox or the location field is changed, regardless of whether the change
     * originates from the user or has been invoked programmatically.
     */
    private final class LocationGroup extends Observable
            implements Observer, IStringButtonAdapter, IDialogFieldListener {

        protected final SelectionButtonDialogField fWorkspaceRadio;
        protected final SelectionButtonDialogField fExternalRadio;
        protected final StringButtonDialogField fLocation;

        private String fPreviousExternalLocation;

        private static final String DIALOGSTORE_LAST_EXTERNAL_LOC = JavaUI.ID_PLUGIN + ".last.external.project"; //$NON-NLS-1$

        public LocationGroup() {
            fWorkspaceRadio = new SelectionButtonDialogField(SWT.RADIO);
            fWorkspaceRadio.setDialogFieldListener(this);
            fWorkspaceRadio.setLabelText(Messages.NewBlackBerryProjectWizardPageOne_LocationGroup_workspace_desc);

            fExternalRadio = new SelectionButtonDialogField(SWT.RADIO);
            fExternalRadio.setLabelText(Messages.NewBlackBerryProjectWizardPageOne_LocationGroup_external_desc);

            fLocation = new StringButtonDialogField(this);
            fLocation.setDialogFieldListener(this);
            fLocation.setLabelText(Messages.NewBlackBerryProjectWizardPageOne_LocationGroup_locationLabel_desc);
            fLocation.setButtonLabel(Messages.NewBlackBerryProjectWizardPageOne_LocationGroup_browseButton_desc);

            fExternalRadio.attachDialogField(fLocation);

            fWorkspaceRadio.setSelection(true);
            fExternalRadio.setSelection(false);

            fPreviousExternalLocation = ""; //$NON-NLS-1$
        }

        public Control createControl(Composite composite) {
            final int numColumns = 3;

            final Group group = new Group(composite, SWT.NONE);
            group.setLayout(initGridLayout(new GridLayout(numColumns, false), true));
            group.setText(Messages.NewBlackBerryProjectWizardPageOne_LocationGroup_title);

            fWorkspaceRadio.doFillIntoGrid(group, numColumns);
            fExternalRadio.doFillIntoGrid(group, numColumns);
            fLocation.doFillIntoGrid(group, numColumns);
            LayoutUtil.setHorizontalGrabbing(fLocation.getTextControl(null));

            return group;
        }

        protected void fireEvent() {
            setChanged();
            notifyObservers();
        }

        protected String getDefaultPath(String name) {
            final IPath path = Platform.getLocation().append(name);
            return path.toOSString();
        }

        /*
         * (non-Javadoc)
         *
         * @see java.util.Observer#update(java.util.Observable, java.lang.Object)
         */
        public void update(Observable o, Object arg) {
            if (isWorkspaceRadioSelected()) {
                fLocation.setText(getDefaultPath(_nameGroup.getName()));
            }
            fireEvent();
        }

        public IPath getLocation() {
            if (isWorkspaceRadioSelected()) {
                return Platform.getLocation();
            }
            return Path.fromOSString(fLocation.getText().trim());
        }

        public boolean isWorkspaceRadioSelected() {
            return fWorkspaceRadio.isSelected();
        }

        /**
         * Returns <code>true</code> if the location is in the workspace
         *
         * @return <code>true</code> if the location is in the workspace
         */
        public boolean isLocationInWorkspace() {
            final String location = _locationGroup.getLocation().toOSString();
            IPath projectPath = Path.fromOSString(location);
            return Platform.getLocation().isPrefixOf(projectPath);
        }

        public void setLocation(IPath path) {
            fWorkspaceRadio.setSelection(path == null);
            if (path != null) {
                fLocation.setText(path.toOSString());
            } else {
                fLocation.setText(getDefaultPath(_nameGroup.getName()));
            }
            fireEvent();
        }

        /*
         * (non-Javadoc)
         *
         * @see org.eclipse.jdt.internal.ui.wizards.dialogfields.IStringButtonAdapter #
         * changeControlPressed(org.eclipse.jdt.internal.ui.wizards.dialogfields .DialogField)
         */
        public void changeControlPressed(DialogField field) {
            final DirectoryDialog dialog = new DirectoryDialog(getShell());
            dialog.setMessage(Messages.NewBlackBerryProjectWizardPageOne_directory_message);
            String directoryName = fLocation.getText().trim();
            if (directoryName.length() == 0) {
                String prevLocation = JavaPlugin.getDefault().getDialogSettings()
                        .get(DIALOGSTORE_LAST_EXTERNAL_LOC);
                if (prevLocation != null) {
                    directoryName = prevLocation;
                }
            }

            if (directoryName.length() > 0) {
                final File path = new File(directoryName);
                if (path.exists())
                    dialog.setFilterPath(directoryName);
            }
            final String selectedDirectory = dialog.open();
            if (selectedDirectory != null) {
                String oldDirectory = new Path(fLocation.getText().trim()).lastSegment();
                fLocation.setText(selectedDirectory);
                String lastSegment = new Path(selectedDirectory).lastSegment();
                if (lastSegment != null
                        && (_nameGroup.getName().length() == 0 || _nameGroup.getName().equals(oldDirectory))) {
                    _nameGroup.setName(lastSegment);
                }
                JavaPlugin.getDefault().getDialogSettings().put(DIALOGSTORE_LAST_EXTERNAL_LOC, selectedDirectory);
            }
        }

        /*
         * (non-Javadoc)
         *
         * @see org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener
         * #dialogFieldChanged(org.eclipse.jdt.internal.ui.wizards.dialogfields. DialogField)
         */
        public void dialogFieldChanged(DialogField field) {
            if (field == fWorkspaceRadio) {
                final boolean checked = fWorkspaceRadio.isSelected();
                if (checked) {
                    fPreviousExternalLocation = fLocation.getText();
                    fLocation.setText(getDefaultPath(_nameGroup.getName()));
                } else {
                    fLocation.setText(fPreviousExternalLocation);
                }
            }
            fireEvent();
        }
    }

    private final class WorkingSetGroup {

        private WorkingSetConfigurationBlock fWorkingSetBlock;

        public WorkingSetGroup() {
            String[] workingSetIds = new String[] { IWorkingSetIDs.JAVA, IWorkingSetIDs.RESOURCE };
            fWorkingSetBlock = new WorkingSetConfigurationBlock(workingSetIds,
                    JavaPlugin.getDefault().getDialogSettings());
            // fWorkingSetBlock.setDialogMessage(NewWizardMessages.NewBlackBerryProjectWizardPageOne_WorkingSetSelection_message);
        }

        public Control createControl(Composite composite) {
            Group workingSetGroup = new Group(composite, SWT.NONE);
            workingSetGroup.setFont(composite.getFont());
            workingSetGroup.setText(Messages.NewBlackBerryProjectWizardPageOne_WorkingSets_group);
            workingSetGroup.setLayout(new GridLayout(1, false));

            fWorkingSetBlock.createContent(workingSetGroup);

            return workingSetGroup;
        }

        public void setWorkingSets(IWorkingSet[] workingSets) {
            fWorkingSetBlock.setWorkingSets(workingSets);
        }

        public IWorkingSet[] getSelectedWorkingSets() {
            return fWorkingSetBlock.getSelectedWorkingSets();
        }
    }

    /**
     * Show a various warnings such as when the project location is existing directory; or the the compiler user selected does not
     * match the workspace default level etc.
     */
    private final class DetectGroup extends Observable implements Observer, SelectionListener {

        private Link fHintText;
        private Label fIcon;
        private boolean _detectState;

        public DetectGroup() {
            _detectState = false;
        }

        public Control createControl(Composite parent) {

            Composite composite = new Composite(parent, SWT.NONE);
            composite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
            GridLayout layout = new GridLayout(2, false);
            layout.horizontalSpacing = 10;
            composite.setLayout(layout);

            fIcon = new Label(composite, SWT.LEFT);
            fIcon.setImage(Dialog.getImage(Dialog.DLG_IMG_MESSAGE_WARNING));
            GridData gridData = new GridData(SWT.LEFT, SWT.CENTER, false, false);
            fIcon.setLayoutData(gridData);

            fHintText = new Link(composite, SWT.WRAP);
            fHintText.setFont(composite.getFont());
            fHintText.addSelectionListener(this);
            gridData = new GridData(GridData.FILL, SWT.FILL, true, true);
            gridData.widthHint = convertWidthInCharsToPixels(50);
            gridData.heightHint = convertHeightInCharsToPixels(3);
            fHintText.setLayoutData(gridData);

            handlePossibleJVMChange();
            return composite;
        }

        public void handlePossibleJVMChange() {

            // alert user if there is no default VM installed
            if (JavaRuntime.getDefaultVMInstall() == null) {
                fHintText.setText(Messages.NewBlackBerryProjectWizardPageOne_NoJREFound_link);
                fHintText.setVisible(true);
                fIcon.setImage(Dialog.getImage(Dialog.DLG_IMG_MESSAGE_WARNING));
                fIcon.setVisible(true);
                return;
            }

            // alert user if user selected compiler compliance level is different from workspace default
            String selectedCompliance = _JREGroup.getSelectedCompilerCompliance();
            if (selectedCompliance != null) {
                String defaultCompliance = JavaCore.getOption(JavaCore.COMPILER_COMPLIANCE);
                if (selectedCompliance.equals(defaultCompliance)) {
                    fHintText.setVisible(false);
                    fIcon.setVisible(false);
                } else {
                    fHintText.setText(NLS.bind(
                            Messages.NewBlackBerryProjectWizardPageOne_DetectGroup_differendWorkspaceCC_message,
                            new String[] { BasicElementLabels.getVersionName(defaultCompliance),
                                    BasicElementLabels.getVersionName(selectedCompliance) }));
                    fHintText.setVisible(true);
                    fIcon.setImage(Dialog.getImage(Dialog.DLG_IMG_MESSAGE_INFO));
                    fIcon.setVisible(true);
                }
                return;
            }

            // alert user if current JVM compliance level is different from workspace one
            selectedCompliance = JavaCore.getOption(JavaCore.COMPILER_COMPLIANCE);
            IVMInstall selectedJVM = _JREGroup.getSelectedJVM();
            // no BlackBerry JRE is installed
            if (selectedJVM == null) {
                fHintText.setVisible(false);
                fIcon.setVisible(false);
                return;
            }

            String jvmCompliance = JavaCore.VERSION_1_4;
            if (selectedJVM instanceof IVMInstall2) {
                jvmCompliance = JavaModelUtil.getCompilerCompliance((IVMInstall2) selectedJVM,
                        JavaCore.VERSION_1_4);
            }
            if (!selectedCompliance.equals(jvmCompliance) && (JavaModelUtil.is50OrHigher(selectedCompliance)
                    || JavaModelUtil.is50OrHigher(jvmCompliance))) {
                if (selectedCompliance.equals(JavaCore.VERSION_1_5))
                    selectedCompliance = "5.0"; //$NON-NLS-1$
                else if (selectedCompliance.equals(JavaCore.VERSION_1_6))
                    selectedCompliance = "6.0"; //$NON-NLS-1$

                fHintText.setText(NLS.bind(Messages.NewBlackBerryProjectWizardPageOne_DetectGroup_jre_message,
                        new String[] { BasicElementLabels.getVersionName(selectedCompliance),
                                BasicElementLabels.getVersionName(jvmCompliance) }));
                fHintText.setVisible(true);
                fIcon.setImage(Dialog.getImage(Dialog.DLG_IMG_MESSAGE_WARNING));
                fIcon.setVisible(true);
            } else {
                fHintText.setVisible(false);
                fIcon.setVisible(false);
            }
        }

        /**
         * Detects if the project location is on existing directory.
         *
         * @return <code>true</code> if yes; otherwise return <code>false</code>
         */
        private boolean computeDetectState() {
            if (_locationGroup.isWorkspaceRadioSelected()) {
                String name = _nameGroup.getName();
                if (name.length() == 0 || JavaPlugin.getWorkspace().getRoot().findMember(name) != null) {
                    return false;
                } else {
                    final File directory = _locationGroup.getLocation().append(name).toFile();
                    return directory.isDirectory();
                }
            } else {
                final File directory = _locationGroup.getLocation().toFile();
                return directory.isDirectory();
            }
        }

        /**
         * @see java.util.Observer#update(Observable, Object)
         */
        public void update(Observable o, Object arg) {
            if (o instanceof LocationGroup) {
                boolean oldDetectState = _detectState;
                _detectState = computeDetectState();

                if (oldDetectState != _detectState) {
                    setChanged();
                    notifyObservers();

                    if (_detectState) {
                        fHintText.setVisible(true);
                        fHintText.setText(Messages.NewBlackBerryProjectWizardPageOne_DetectGroup_message);
                        fIcon.setImage(Dialog.getImage(Dialog.DLG_IMG_MESSAGE_INFO));
                        fIcon.setVisible(true);
                    } else {
                        handlePossibleJVMChange();
                    }
                }
            }
        }

        /**
         * Returns if the project is created on an existing directory.
         *
         * @return <code>true</code> if yes; otherwise return <code>false</code>
         */
        public boolean isProjectCreatedOnExistingFolder() {
            return _detectState;
        }

        /**
         * Handle widget selection.
         *
         * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse .swt.events.SelectionEvent)
         */
        public void widgetSelected(SelectionEvent e) {
            widgetDefaultSelected(e);
        }

        /**
         * Handle default widget selection.
         *
         * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org .eclipse.swt.events.SelectionEvent)
         */
        public void widgetDefaultSelected(SelectionEvent e) {
            String jreID = BuildPathSupport.JRE_PREF_PAGE_ID;
            String eeID = BuildPathSupport.EE_PREF_PAGE_ID;
            String complianceId = CompliancePreferencePage.PREF_ID;
            Map data = new HashMap();
            data.put(PropertyAndPreferencePage.DATA_NO_LINK, Boolean.TRUE);
            String id = "JRE".equals(e.text) ? jreID : complianceId; //$NON-NLS-1$
            PreferencesUtil
                    .createPreferenceDialogOn(getShell(), id, new String[] { jreID, complianceId, eeID }, data)
                    .open();

            _JREGroup.handlePossibleJVMChange();
            handlePossibleJVMChange();
        }
    }

    /**
     * Validate this page and show appropriate warnings and error NewWizardMessages.
     */
    private final class Validator implements Observer {

        public void update(Observable o, Object arg) {

            final IWorkspace workspace = JavaPlugin.getWorkspace();

            final String name = _nameGroup.getName();

            // check whether the project name field is empty
            if (name.length() == 0) {
                setErrorMessage(null);
                setMessage(Messages.NewBlackBerryProjectWizardPageOne_Message_enterProjectName);
                setPageComplete(false);
                return;
            }

            // check whether the project name is valid
            final IStatus nameStatus = workspace.validateName(name, IResource.PROJECT);
            if (!nameStatus.isOK()) {
                setErrorMessage(nameStatus.getMessage());
                setPageComplete(false);
                return;
            }

            // check whether project already exists
            final IProject handle = workspace.getRoot().getProject(name);
            if (handle.exists()) {
                setErrorMessage(Messages.NewBlackBerryProjectWizardPageOne_Message_projectAlreadyExists);
                setPageComplete(false);
                return;
            }

            IPath projectLocation = ResourcesPlugin.getWorkspace().getRoot().getLocation().append(name);
            if (projectLocation.toFile().exists()) {
                try {
                    // correct casing
                    String canonicalPath = projectLocation.toFile().getCanonicalPath();
                    projectLocation = new Path(canonicalPath);
                } catch (IOException e) {
                    JavaPlugin.log(e);
                }

                String existingName = projectLocation.lastSegment();
                if (!existingName.equals(_nameGroup.getName())) {
                    setErrorMessage(NLS.bind(
                            Messages.NewBlackBerryProjectWizardPageOne_Message_invalidProjectNameForWorkspaceRoot,
                            BasicElementLabels.getResourceName(existingName)));
                    setPageComplete(false);
                    return;
                }

            }

            final String location = _locationGroup.getLocation().toOSString();

            // check whether location is empty
            if (location.length() == 0) {
                setErrorMessage(null);
                setMessage(Messages.NewBlackBerryProjectWizardPageOne_Message_enterLocation);
                setPageComplete(false);
                return;
            }

            // check whether the location is a syntactically correct path
            if (!Path.EMPTY.isValidPath(location)) {
                setErrorMessage(Messages.NewBlackBerryProjectWizardPageOne_Message_invalidDirectory);
                setPageComplete(false);
                return;
            }

            IPath projectPath = Path.fromOSString(location);

            if (_locationGroup.isWorkspaceRadioSelected())
                projectPath = projectPath.append(_nameGroup.getName());

            if (projectPath.toFile().exists()) {// create from existing source
                IPath sourcePath = Platform.getLocation();
                if (sourcePath.isPrefixOf(projectPath)) { // create
                    // from
                    // existing
                    // source
                    // in
                    // workspace
                    if (!Platform.getLocation().equals(projectPath.removeLastSegments(1))) {
                        setErrorMessage(Messages.NewBlackBerryProjectWizardPageOne_Message_notOnWorkspaceRoot);
                        setPageComplete(false);
                        return;
                    }

                    if (!projectPath.toFile().exists()) {
                        setErrorMessage(
                                Messages.NewBlackBerryProjectWizardPageOne_Message_notExisingProjectOnWorkspaceRoot);
                        setPageComplete(false);
                        return;
                    }
                } else if (projectPath.isPrefixOf(sourcePath)) {
                    setErrorMessage(NLS.bind(Messages.NewBlackBerryProjectWizardPageOne_ExistingSrcLocOverlapsWSMsg,
                            projectPath.toOSString(), sourcePath.toOSString()));
                    setPageComplete(false);
                    return;
                }
            } else if (!_locationGroup.isWorkspaceRadioSelected()) {// create
                // at non
                // existing
                // external
                // location
                if (!canCreate(projectPath.toFile())) {
                    setErrorMessage(
                            Messages.NewBlackBerryProjectWizardPageOne_Message_cannotCreateAtExternalLocation);
                    setPageComplete(false);
                    return;
                }

                // If we do not place the contents in the workspace validate the
                // location.
                final IStatus locationStatus = workspace.validateProjectLocation(handle, projectPath);
                if (!locationStatus.isOK()) {
                    setErrorMessage(locationStatus.getMessage());
                    setPageComplete(false);
                    return;
                }
            }

            // check whether there is BB-JRE installed
            if (VMUtils.getInstalledBBVMs().isEmpty()) {
                setErrorMessage(Messages.NewBlackBerryProjectWizardPageOne_Message_noBBJREInstalled);
                setPageComplete(false);
                return;
            }

            // handle the case where project is created on existing source
            boolean onExistingFolder = _detectGroup.isProjectCreatedOnExistingFolder();
            _JREGroup.setEnabled(!onExistingFolder);

            // Start Fix for IDT 321272
            if (!onExistingFolder) {
                // check whether there is a valid BB-JRE selected
                IVMInstall vm = _JREGroup.getSelectedJVM();
                if (vm == null) {
                    setErrorMessage(Messages.NewBlackBerryProjectWizardPageOne_Message_noJRESelected);
                    setPageComplete(false);
                    return;
                }

                // check if the JRE is BlackBerry JRE
                IVMInstallType vmType = vm.getVMInstallType();
                if (!BlackBerryVMInstallType.VM_ID.equals(vmType.getId())) {
                    setErrorMessage(Messages.NewBlackBerryProjectWizardPageOne_Message_nonBBDefaultJRESelected);
                    setPageComplete(false);
                    return;
                }
            }
            // End Fix for IDT 321272

            setPageComplete(true);
            setErrorMessage(null);
            setMessage(null);
        }

        private boolean canCreate(File file) {
            while (!file.exists()) {
                file = file.getParentFile();
                if (file == null)
                    return false;
            }

            return file.canWrite();
        }
    }

    /**
     * The wizard owning this page can call this method to initialize the fields from the current selection and active part.
     *
     * @param selection
     *            used to initialize the fields
     * @param activePart
     *            the (typically active) part to initialize the fields or <code>null</code>
     */
    public void init(IStructuredSelection selection, IWorkbenchPart activePart) {
        setWorkingSets(getSelectedWorkingSet(selection, activePart));
    }

    private void initializeDefaultVM() {
        JavaRuntime.getDefaultVMInstall();
    }

    /**
     * Creates the control.
     *
     * @param parent
     *            The parent composite
     * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets .Composite)
     */
    public void createControl(Composite parent) {
        initializeDialogUnits(parent);

        final Composite container = new Composite(parent, SWT.NULL);
        container.setFont(parent.getFont());
        container.setLayout(initGridLayout(new GridLayout(1, false), true));
        container.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));

        // create UI elements
        Control nameControl = createNameControl(container);
        nameControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        Control locationControl = createLocationControl(container);
        locationControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        Control jreControl = createJRESelectionControl(container);
        jreControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        Control workingSetControl = createWorkingSetControl(container);
        workingSetControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        Control infoControl = createInfoControl(container);
        infoControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        setControl(container);
    }

    protected void setControl(Control newControl) {
        Dialog.applyDialogFont(newControl);

        PlatformUI.getWorkbench().getHelpSystem().setHelp(newControl,
                IJavaHelpContextIds.NEW_JAVAPROJECT_WIZARD_PAGE);

        super.setControl(newControl);
    }

    /**
     * Creates the controls for the name field.
     *
     * @param composite
     *            the parent composite
     * @return the created control
     */
    protected Control createNameControl(Composite composite) {
        return _nameGroup.createControl(composite);
    }

    /**
     * Creates the controls for the location field.
     *
     * @param composite
     *            the parent composite
     * @return the created control
     */
    protected Control createLocationControl(Composite composite) {
        return _locationGroup.createControl(composite);
    }

    /**
     * Creates the controls for the JRE selection
     *
     * @param composite
     *            the parent composite
     * @return the created control
     */
    protected Control createJRESelectionControl(Composite composite) {
        return _JREGroup.createControl(composite);
    }

    /**
     * Creates the controls for the working set selection.
     *
     * @param composite
     *            the parent composite
     * @return the created control
     */
    protected Control createWorkingSetControl(Composite composite) {
        return _workingSetGroup.createControl(composite);
    }

    /**
     * Creates the controls for the info section.
     *
     * @param composite
     *            the parent composite
     * @return the created control
     */
    protected Control createInfoControl(Composite composite) {
        return _detectGroup.createControl(composite);
    }

    /**
     * Gets a project name for the new project.
     *
     * @return the new project resource handle
     */
    public String getProjectName() {
        return _nameGroup.getName();
    }

    /**
     * Sets the name of the new project
     *
     * @param name
     *            The new name
     */
    public void setProjectName(String name) {
        if (name == null)
            throw new IllegalArgumentException();

        _nameGroup.setName(name);
    }

    /**
     * Returns the current project location path as entered by the user, or <code>null</code> if the project should be created in
     * the workspace.
     *
     * @return the project location path or its anticipated initial value.
     */
    public URI getProjectLocationURI() {
        if (_locationGroup.isLocationInWorkspace()) {
            return null;
        }
        return URIUtil.toURI(_locationGroup.getLocation());
    }

    /**
     * Sets the project location of the new project or <code>null</code> if the project should be created in the workspace
     *
     * @param uri
     *            the new project location
     */
    public void setProjectLocationURI(URI uri) {
        IPath path = uri != null ? URIUtil.toPath(uri) : null;
        _locationGroup.setLocation(path);
    }

    public void setDefaultJRE() {
        _JREGroup.setDefaultJRESelected();
    }

    /**
     * Returns the compiler compliance to be used for the project, or <code>null</code> to use the workspace compiler compliance.
     *
     * @return compiler compliance to be used for the project or <code>null</code>
     */
    public String getCompilerCompliance() {
        return _JREGroup.getSelectedCompilerCompliance();
    }

    /**
     * Returns the default class path entries to be added on new projects. By default this is the JRE container as selected by the
     * user.
     *
     * @return returns the default class path entries
     */
    public IClasspathEntry[] getDefaultClasspathEntries() {
        IPath newPath = _JREGroup.getJREContainerPath();
        if (newPath != null) {
            return new IClasspathEntry[] { JavaCore.newContainerEntry(newPath) };
        }
        return PreferenceConstants.getDefaultJRELibrary();
    }

    /**
     * Returns the source class path entries to be added on new projects. The underlying resources may not exist. All entries that
     * are returned must be of kind {@link IClasspathEntry#CPE_SOURCE}.
     *
     * @return returns the source class path entries for the new project
     */
    public IClasspathEntry[] getSourceClasspathEntries() {
        List<IClasspathEntry> entries = new ArrayList<IClasspathEntry>();
        IPath sourceFolderPath = new Path(getProjectName()).makeAbsolute();
        IPath srcPath = new Path(
                PreferenceConstants.getPreferenceStore().getString(PreferenceConstants.SRCBIN_SRCNAME));
        sourceFolderPath = sourceFolderPath.append(srcPath);
        entries.add(JavaCore.newSourceEntry(sourceFolderPath));

        // create res folder
        String resFolderName = ImportUtils.getImportPref(LegacyImportHelper.PROJECT_RES_FOLDER_NAME_KEY);
        if (resFolderName.length() > 0) {
            IPath resFolderPath = new Path(getProjectName()).makeAbsolute();
            IPath resPath = new Path(resFolderName);
            resFolderPath = resFolderPath.append(resPath);
            entries.add(JavaCore.newSourceEntry(resFolderPath));
        }

        return entries.toArray(new IClasspathEntry[0]);
    }

    /**
     * Returns the source class path entries to be added on new projects. The underlying resource may not exist.
     *
     * @return returns the default class path entries
     */
    public IPath getOutputLocation() {
        IPath outputLocationPath = new Path(getProjectName()).makeAbsolute();
        IPath binPath = new Path(
                PreferenceConstants.getPreferenceStore().getString(PreferenceConstants.SRCBIN_BINNAME));
        if (binPath.segmentCount() > 0) {
            outputLocationPath = outputLocationPath.append(binPath);
        }
        return outputLocationPath;
    }

    /**
     * Returns the working sets to which the new project should be added.
     *
     * @return the selected working sets to which the new project should be added
     */
    public IWorkingSet[] getWorkingSets() {
        return _workingSetGroup.getSelectedWorkingSets();
    }

    /**
     * Sets the working sets to which the new project should be added.
     *
     * @param workingSets
     *            The initial selected working sets
     */
    public void setWorkingSets(IWorkingSet[] workingSets) {
        if (workingSets == null) {
            throw new IllegalArgumentException();
        }
        _workingSetGroup.setWorkingSets(workingSets);
    }

    /**
     * Set the visibility of the wizard page.
     *
     * @param visible
     *            The visibility
     * @see org.eclipse.jface.dialogs.DialogPage#setVisible(boolean)
     */
    public void setVisible(boolean visible) {
        super.setVisible(visible);
        if (visible) {
            _nameGroup.postSetFocus();
        }
    }

    private IWorkingSet[] getSelectedWorkingSet(IStructuredSelection selection, IWorkbenchPart activePart) {
        IWorkingSet[] selected = getSelectedWorkingSet(selection);
        if (selected != null && selected.length > 0) {
            for (int i = 0; i < selected.length; i++) {
                if (!isValidWorkingSet(selected[i]))
                    return EMPTY_WORKING_SET_ARRAY;
            }
            return selected;
        }

        if (!(activePart instanceof PackageExplorerPart))
            return EMPTY_WORKING_SET_ARRAY;

        PackageExplorerPart explorerPart = (PackageExplorerPart) activePart;
        if (explorerPart.getRootMode() == PackageExplorerPart.PROJECTS_AS_ROOTS) {
            // Get active filter
            IWorkingSet filterWorkingSet = explorerPart.getFilterWorkingSet();
            if (filterWorkingSet == null)
                return EMPTY_WORKING_SET_ARRAY;

            if (!isValidWorkingSet(filterWorkingSet))
                return EMPTY_WORKING_SET_ARRAY;

            return new IWorkingSet[] { filterWorkingSet };
        } else {
            // If we have been gone into a working set return the working set
            Object input = explorerPart.getViewPartInput();
            if (!(input instanceof IWorkingSet))
                return EMPTY_WORKING_SET_ARRAY;

            IWorkingSet workingSet = (IWorkingSet) input;
            if (!isValidWorkingSet(workingSet))
                return EMPTY_WORKING_SET_ARRAY;

            return new IWorkingSet[] { workingSet };
        }
    }

    private IWorkingSet[] getSelectedWorkingSet(IStructuredSelection selection) {
        if (!(selection instanceof ITreeSelection))
            return EMPTY_WORKING_SET_ARRAY;

        ITreeSelection treeSelection = (ITreeSelection) selection;
        if (treeSelection.isEmpty())
            return EMPTY_WORKING_SET_ARRAY;

        List elements = treeSelection.toList();
        if (elements.size() == 1) {
            Object element = elements.get(0);
            TreePath[] paths = treeSelection.getPathsFor(element);
            if (paths.length != 1)
                return EMPTY_WORKING_SET_ARRAY;

            TreePath path = paths[0];
            if (path.getSegmentCount() == 0)
                return EMPTY_WORKING_SET_ARRAY;

            Object candidate = path.getSegment(0);
            if (!(candidate instanceof IWorkingSet))
                return EMPTY_WORKING_SET_ARRAY;

            IWorkingSet workingSetCandidate = (IWorkingSet) candidate;
            if (isValidWorkingSet(workingSetCandidate))
                return new IWorkingSet[] { workingSetCandidate };

            return EMPTY_WORKING_SET_ARRAY;
        }

        ArrayList result = new ArrayList();
        for (Iterator iterator = elements.iterator(); iterator.hasNext();) {
            Object element = iterator.next();
            if (element instanceof IWorkingSet && isValidWorkingSet((IWorkingSet) element)) {
                result.add(element);
            }
        }
        return (IWorkingSet[]) result.toArray(new IWorkingSet[result.size()]);
    }

    private static boolean isValidWorkingSet(IWorkingSet workingSet) {
        String id = workingSet.getId();
        if (!IWorkingSetIDs.JAVA.equals(id) && !IWorkingSetIDs.RESOURCE.equals(id))
            return false;

        if (workingSet.isAggregateWorkingSet())
            return false;

        return true;
    }
}