]> git.uio.no Git - ifi-stolz-refaktor.git/blobdiff - case-study/jdt-before/ui/org/eclipse/jdt/ui/wizards/NewJavaProjectWizardPageOne.java
Case Study: adding data and statistics
[ifi-stolz-refaktor.git] / case-study / jdt-before / ui / org / eclipse / jdt / ui / wizards / NewJavaProjectWizardPageOne.java
diff --git a/case-study/jdt-before/ui/org/eclipse/jdt/ui/wizards/NewJavaProjectWizardPageOne.java b/case-study/jdt-before/ui/org/eclipse/jdt/ui/wizards/NewJavaProjectWizardPageOne.java
new file mode 100644 (file)
index 0000000..7f1c222
--- /dev/null
@@ -0,0 +1,1461 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2012 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.ui.wizards;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+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 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.Combo;
+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.core.filesystem.URIUtil;
+
+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.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.util.Policy;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeSelection;
+import org.eclipse.jface.viewers.TreePath;
+import org.eclipse.jface.wizard.WizardPage;
+
+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;
+
+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.corext.util.Messages;
+
+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.launching.VMStandin;
+import org.eclipse.jdt.launching.environments.IExecutionEnvironment;
+
+import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.jdt.ui.PreferenceConstants;
+
+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.NewJavaProjectPreferencePage;
+import org.eclipse.jdt.internal.ui.preferences.PropertyAndPreferencePage;
+import org.eclipse.jdt.internal.ui.viewsupport.BasicElementLabels;
+import org.eclipse.jdt.internal.ui.wizards.NewWizardMessages;
+import org.eclipse.jdt.internal.ui.wizards.buildpaths.BuildPathSupport;
+import org.eclipse.jdt.internal.ui.wizards.dialogfields.ComboDialogField;
+import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
+import org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
+import org.eclipse.jdt.internal.ui.wizards.dialogfields.IStringButtonAdapter;
+import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
+import org.eclipse.jdt.internal.ui.wizards.dialogfields.SelectionButtonDialogField;
+import org.eclipse.jdt.internal.ui.wizards.dialogfields.StringButtonDialogField;
+import org.eclipse.jdt.internal.ui.wizards.dialogfields.StringDialogField;
+import org.eclipse.jdt.internal.ui.workingsets.IWorkingSetIDs;
+
+/**
+ * The first page of the New Java Project wizard. This page is typically used in combination with
+ * {@link NewJavaProjectWizardPageTwo}. Clients can extend this page to modify the UI: Add, remove
+ * or reorder sections.
+ *
+ * <p>
+ * Clients may instantiate or subclass.
+ * </p>
+ *
+ * @since 3.4
+ */
+public class NewJavaProjectWizardPageOne extends WizardPage {
+
+       /**
+        * 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 fNameField;
+
+               public NameGroup() {
+                       // text field for project name
+                       fNameField= new StringDialogField();
+                       fNameField.setLabelText(NewWizardMessages.NewJavaProjectWizardPageOne_NameGroup_label_text);
+                       fNameField.setDialogFieldListener(this);
+               }
+
+               public Control createControl(Composite composite) {
+                       Composite nameComposite= new Composite(composite, SWT.NONE);
+                       nameComposite.setFont(composite.getFont());
+                       nameComposite.setLayout(new GridLayout(2, false));
+
+                       fNameField.doFillIntoGrid(nameComposite, 2);
+                       LayoutUtil.setHorizontalGrabbing(fNameField.getTextControl(null));
+
+                       return nameComposite;
+               }
+
+               protected void fireEvent() {
+                       setChanged();
+                       notifyObservers();
+               }
+
+               public String getName() {
+                       return fNameField.getText().trim();
+               }
+
+               public void postSetFocus() {
+                       fNameField.postSetFocusOnDialogField(getShell().getDisplay());
+               }
+
+               public void setName(String name) {
+                       fNameField.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 fUseDefaults;
+               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() {
+                       fUseDefaults= new SelectionButtonDialogField(SWT.CHECK);
+                       fUseDefaults.setDialogFieldListener(this);
+                       fUseDefaults.setLabelText(NewWizardMessages.NewJavaProjectWizardPageOne_LocationGroup_location_desc);
+
+                       fLocation= new StringButtonDialogField(this);
+                       fLocation.setDialogFieldListener(this);
+                       fLocation.setLabelText(NewWizardMessages.NewJavaProjectWizardPageOne_LocationGroup_locationLabel_desc);
+                       fLocation.setButtonLabel(NewWizardMessages.NewJavaProjectWizardPageOne_LocationGroup_browseButton_desc);
+
+                       fUseDefaults.setSelection(true);
+
+                       fPreviousExternalLocation= ""; //$NON-NLS-1$
+               }
+
+               public Control createControl(Composite composite) {
+                       final int numColumns= 4;
+
+                       final Composite locationComposite= new Composite(composite, SWT.NONE);
+                       locationComposite.setLayout(new GridLayout(numColumns, false));
+
+                       fUseDefaults.doFillIntoGrid(locationComposite, numColumns);
+                       fLocation.doFillIntoGrid(locationComposite, numColumns);
+                       LayoutUtil.setHorizontalGrabbing(fLocation.getTextControl(null));
+
+                       return locationComposite;
+               }
+
+               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 (isUseDefaultSelected()) {
+                               fLocation.setText(getDefaultPath(fNameGroup.getName()));
+                       }
+                       fireEvent();
+               }
+
+               public IPath getLocation() {
+                       if (isUseDefaultSelected()) {
+                               return Platform.getLocation();
+                       }
+                       return Path.fromOSString(fLocation.getText().trim());
+               }
+
+               public boolean isUseDefaultSelected() {
+                       return fUseDefaults.isSelected();
+               }
+
+               public void setLocation(IPath path) {
+                       fUseDefaults.setSelection(path == null);
+                       if (path != null) {
+                               fLocation.setText(path.toOSString());
+                       } else {
+                               fLocation.setText(getDefaultPath(fNameGroup.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(NewWizardMessages.NewJavaProjectWizardPageOne_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 && (fNameGroup.getName().length() == 0 || fNameGroup.getName().equals(oldDirectory))) {
+                                       fNameGroup.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 == fUseDefaults) {
+                               final boolean checked= fUseDefaults.isSelected();
+                               if (checked) {
+                                       fPreviousExternalLocation= fLocation.getText();
+                                       fLocation.setText(getDefaultPath(fNameGroup.getName()));
+                                       fLocation.setEnabled(false);
+                               } else {
+                                       fLocation.setText(fPreviousExternalLocation);
+                                       fLocation.setEnabled(true);
+                               }
+                       }
+                       fireEvent();
+               }
+       }
+
+       /**
+        * Request a project layout.
+        */
+       private final class LayoutGroup implements Observer, SelectionListener {
+
+               private final SelectionButtonDialogField fStdRadio, fSrcBinRadio;
+               private Group fGroup;
+               private Link fPreferenceLink;
+
+               public LayoutGroup() {
+                       fStdRadio= new SelectionButtonDialogField(SWT.RADIO);
+                       fStdRadio.setLabelText(NewWizardMessages.NewJavaProjectWizardPageOne_LayoutGroup_option_oneFolder);
+
+                       fSrcBinRadio= new SelectionButtonDialogField(SWT.RADIO);
+                       fSrcBinRadio.setLabelText(NewWizardMessages.NewJavaProjectWizardPageOne_LayoutGroup_option_separateFolders);
+
+                       boolean useSrcBin= PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.SRCBIN_FOLDERS_IN_NEWPROJ);
+                       fSrcBinRadio.setSelection(useSrcBin);
+                       fStdRadio.setSelection(!useSrcBin);
+               }
+
+
+               public Control createContent(Composite composite) {
+                       fGroup= new Group(composite, SWT.NONE);
+                       fGroup.setFont(composite.getFont());
+                       fGroup.setLayout(initGridLayout(new GridLayout(3, false), true));
+                       fGroup.setText(NewWizardMessages.NewJavaProjectWizardPageOne_LayoutGroup_title);
+
+                       fStdRadio.doFillIntoGrid(fGroup, 3);
+                       LayoutUtil.setHorizontalGrabbing(fStdRadio.getSelectionButton(null));
+
+                       fSrcBinRadio.doFillIntoGrid(fGroup, 2);
+
+                       fPreferenceLink= new Link(fGroup, SWT.NONE);
+                       fPreferenceLink.setText(NewWizardMessages.NewJavaProjectWizardPageOne_LayoutGroup_link_description);
+                       fPreferenceLink.setLayoutData(new GridData(GridData.END, GridData.END, false, false));
+                       fPreferenceLink.addSelectionListener(this);
+
+                       updateEnableState();
+                       return fGroup;
+               }
+
+
+               /* (non-Javadoc)
+                * @see java.util.Observer#update(java.util.Observable, java.lang.Object)
+                */
+               public void update(Observable o, Object arg) {
+                       updateEnableState();
+               }
+
+               private void updateEnableState() {
+                       if (fDetectGroup == null)
+                               return;
+                       
+                       final boolean detect= fDetectGroup.mustDetect();
+                       fStdRadio.setEnabled(!detect);
+                       fSrcBinRadio.setEnabled(!detect);
+                       if (fPreferenceLink != null) {
+                               fPreferenceLink.setEnabled(!detect);
+                       }
+                       if (fGroup != null) {
+                               fGroup.setEnabled(!detect);
+                       }
+               }
+
+               /**
+                * Return <code>true</code> if the user specified to create 'source' and 'bin' folders.
+                *
+                * @return returns <code>true</code> if the user specified to create 'source' and 'bin' folders.
+                */
+               public boolean isSrcBin() {
+                       return fSrcBinRadio.isSelected();
+               }
+
+               /* (non-Javadoc)
+                * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+                */
+               public void widgetSelected(SelectionEvent e) {
+                       widgetDefaultSelected(e);
+               }
+
+               /* (non-Javadoc)
+                * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+                */
+               public void widgetDefaultSelected(SelectionEvent e) {
+                       String id= NewJavaProjectPreferencePage.ID;
+                       PreferencesUtil.createPreferenceDialogOn(getShell(), id, new String[] { id }, null).open();
+                       fDetectGroup.handlePossibleJVMChange();
+                       fJREGroup.handlePossibleJVMChange();
+               }
+       }
+
+       private final class JREGroup implements Observer, SelectionListener, IDialogFieldListener {
+
+               private static final String LAST_SELECTED_EE_SETTINGS_KEY= JavaUI.ID_PLUGIN + ".last.selected.execution.enviroment"; //$NON-NLS-1$
+               private static final String LAST_SELECTED_JRE_SETTINGS_KEY= JavaUI.ID_PLUGIN + ".last.selected.project.jre"; //$NON-NLS-1$
+//             private static final String LAST_SELECTED_JRE_KIND= JavaUI.ID_PLUGIN + ".last.selected.jre.kind"; // used before EE became default
+               private static final String LAST_SELECTED_JRE_KIND2= JavaUI.ID_PLUGIN + ".last.selected.jre.kind2"; //$NON-NLS-1$
+
+               private static final int DEFAULT_JRE= 0;
+               private static final int PROJECT_JRE= 1;
+               private static final int EE_JRE= 2;
+
+               private final SelectionButtonDialogField fUseDefaultJRE, fUseProjectJRE, fUseEEJRE;
+               private final ComboDialogField fJRECombo;
+               private final ComboDialogField fEECombo;
+               private Group fGroup;
+               private Link fPreferenceLink;
+               private IVMInstall[] fInstalledJVMs;
+               private String[] fJRECompliance;
+               private IExecutionEnvironment[] fInstalledEEs;
+               private String[] fEECompliance;
+
+               public JREGroup() {
+                       fUseDefaultJRE= new SelectionButtonDialogField(SWT.RADIO);
+                       fUseDefaultJRE.setLabelText(getDefaultJVMLabel());
+
+                       fUseProjectJRE= new SelectionButtonDialogField(SWT.RADIO);
+                       fUseProjectJRE.setLabelText(NewWizardMessages.NewJavaProjectWizardPageOne_JREGroup_specific_compliance);
+
+                       fJRECombo= new ComboDialogField(SWT.READ_ONLY);
+                       fillInstalledJREs(fJRECombo);
+                       fJRECombo.setDialogFieldListener(this);
+
+                       fUseEEJRE= new SelectionButtonDialogField(SWT.RADIO);
+                       fUseEEJRE.setLabelText(NewWizardMessages.NewJavaProjectWizardPageOne_JREGroup_specific_EE);
+
+                       fEECombo= new ComboDialogField(SWT.READ_ONLY);
+                       fillExecutionEnvironments(fEECombo);
+                       fEECombo.setDialogFieldListener(this);
+
+                       switch (getLastSelectedJREKind()) {
+                               case DEFAULT_JRE:
+                                       fUseDefaultJRE.setSelection(true);
+                                       break;
+                               case PROJECT_JRE:
+                                       fUseProjectJRE.setSelection(true);
+                                       break;
+                               case EE_JRE:
+                                       fUseEEJRE.setSelection(true);
+                                       break;
+                       }
+
+                       fJRECombo.setEnabled(fUseProjectJRE.isSelected());
+                       fEECombo.setEnabled(fUseEEJRE.isSelected());
+
+                       fUseDefaultJRE.setDialogFieldListener(this);
+                       fUseProjectJRE.setDialogFieldListener(this);
+                       fUseEEJRE.setDialogFieldListener(this);
+               }
+
+               public Control createControl(Composite composite) {
+                       fGroup= new Group(composite, SWT.NONE);
+                       fGroup.setFont(composite.getFont());
+                       fGroup.setLayout(initGridLayout(new GridLayout(2, false), true));
+                       fGroup.setText(NewWizardMessages.NewJavaProjectWizardPageOne_JREGroup_title);
+
+                       fUseEEJRE.doFillIntoGrid(fGroup, 1);
+                       Combo eeComboControl= fEECombo.getComboControl(fGroup);
+                       eeComboControl.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
+                       
+                       fUseProjectJRE.doFillIntoGrid(fGroup, 1);
+                       Combo comboControl= fJRECombo.getComboControl(fGroup);
+                       comboControl.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
+
+                       fUseDefaultJRE.doFillIntoGrid(fGroup, 1);
+
+                       fPreferenceLink= new Link(fGroup, SWT.NONE);
+                       fPreferenceLink.setFont(fGroup.getFont());
+                       fPreferenceLink.setText(NewWizardMessages.NewJavaProjectWizardPageOne_JREGroup_link_description);
+                       fPreferenceLink.setLayoutData(new GridData(GridData.END, GridData.CENTER, false, false));
+                       fPreferenceLink.addSelectionListener(this);
+
+                       updateEnableState();
+                       return fGroup;
+               }
+
+
+               private void fillInstalledJREs(ComboDialogField comboField) {
+                       String selectedItem= getLastSelectedJRE();
+                       int selectionIndex= -1;
+                       if (fUseProjectJRE.isSelected()) {
+                               selectionIndex= comboField.getSelectionIndex();
+                               if (selectionIndex != -1) {//paranoia
+                                       selectedItem= comboField.getItems()[selectionIndex];
+                               }
+                       }
+
+                       fInstalledJVMs= getWorkspaceJREs();
+                       Arrays.sort(fInstalledJVMs, new Comparator<IVMInstall>() {
+
+                               public int compare(IVMInstall i0, IVMInstall i1) {
+                                       if (i1 instanceof IVMInstall2 && i0 instanceof IVMInstall2) {
+                                               String cc0= JavaModelUtil.getCompilerCompliance((IVMInstall2) i0, JavaCore.VERSION_1_4);
+                                               String cc1= JavaModelUtil.getCompilerCompliance((IVMInstall2) i1, JavaCore.VERSION_1_4);
+                                               int result= cc1.compareTo(cc0);
+                                               if (result != 0)
+                                                       return result;
+                                       }
+                                       return Policy.getComparator().compare(i0.getName(), i1.getName());
+                               }
+
+                       });
+                       selectionIndex= -1;//find new index
+                       String[] jreLabels= new String[fInstalledJVMs.length];
+                       fJRECompliance= new String[fInstalledJVMs.length];
+                       for (int i= 0; i < fInstalledJVMs.length; i++) {
+                               jreLabels[i]= fInstalledJVMs[i].getName();
+                               if (selectedItem != null && jreLabels[i].equals(selectedItem)) {
+                                       selectionIndex= i;
+                               }
+                               if (fInstalledJVMs[i] instanceof IVMInstall2) {
+                                       fJRECompliance[i]= JavaModelUtil.getCompilerCompliance((IVMInstall2) fInstalledJVMs[i], JavaCore.VERSION_1_4);
+                               } else {
+                                       fJRECompliance[i]= JavaCore.VERSION_1_4;
+                               }
+                       }
+                       comboField.setItems(jreLabels);
+                       if (selectionIndex == -1) {
+                               comboField.selectItem(getDefaultJVMName());
+                       } else {
+                               comboField.selectItem(selectedItem);
+                       }
+               }
+
+               private void fillExecutionEnvironments(ComboDialogField comboField) {
+                       String selectedItem= getLastSelectedEE();
+                       int selectionIndex= -1;
+                       if (fUseEEJRE.isSelected()) {
+                               selectionIndex= comboField.getSelectionIndex();
+                               if (selectionIndex != -1) {// paranoia
+                                       selectedItem= comboField.getItems()[selectionIndex];
+                               }
+                       }
+
+                       fInstalledEEs= JavaRuntime.getExecutionEnvironmentsManager().getExecutionEnvironments();
+                       Arrays.sort(fInstalledEEs, new Comparator<IExecutionEnvironment>() {
+                               public int compare(IExecutionEnvironment arg0, IExecutionEnvironment arg1) {
+                                       return Policy.getComparator().compare(arg0.getId(), arg1.getId());
+                               }
+                       });
+                       selectionIndex= -1;//find new index
+                       String[] eeLabels= new String[fInstalledEEs.length];
+                       fEECompliance= new String[fInstalledEEs.length];
+                       for (int i= 0; i < fInstalledEEs.length; i++) {
+                               eeLabels[i]= fInstalledEEs[i].getId();
+                               if (selectedItem != null && eeLabels[i].equals(selectedItem)) {
+                                       selectionIndex= i;
+                               }
+                               fEECompliance[i]= JavaModelUtil.getExecutionEnvironmentCompliance(fInstalledEEs[i]);
+                       }
+                       comboField.setItems(eeLabels);
+                       if (selectionIndex == -1) {
+                               comboField.selectItem(getDefaultEEName());
+                       } else {
+                               comboField.selectItem(selectedItem);
+                       }
+               }
+
+               private IVMInstall[] getWorkspaceJREs() {
+                       List<VMStandin> standins = new ArrayList<VMStandin>();
+                       IVMInstallType[] types = JavaRuntime.getVMInstallTypes();
+                       for (int i = 0; i < types.length; i++) {
+                               IVMInstallType type = types[i];
+                               IVMInstall[] installs = type.getVMInstalls();
+                               for (int j = 0; j < installs.length; j++) {
+                                       IVMInstall install = installs[j];
+                                       standins.add(new VMStandin(install));
+                               }
+                       }
+                       return standins.toArray(new IVMInstall[standins.size()]);
+               }
+
+               private String getDefaultJVMName() {
+                       IVMInstall install= JavaRuntime.getDefaultVMInstall();
+                       if (install != null) {
+                               return install.getName();
+                       } else {
+                               return NewWizardMessages.NewJavaProjectWizardPageOne_UnknownDefaultJRE_name;
+                       }
+               }
+
+               private String getDefaultEEName() {
+                       IVMInstall defaultVM= JavaRuntime.getDefaultVMInstall();
+
+                       IExecutionEnvironment[] environments= JavaRuntime.getExecutionEnvironmentsManager().getExecutionEnvironments();
+                       if (defaultVM != null) {
+                               for (int i= 0; i < environments.length; i++) {
+                                       IVMInstall eeDefaultVM= environments[i].getDefaultVM();
+                                       if (eeDefaultVM != null && defaultVM.getId().equals(eeDefaultVM.getId()))
+                                               return environments[i].getId();
+                               }
+                       }
+
+                       String defaultCC;
+                       if (defaultVM instanceof IVMInstall2) {
+                               defaultCC= JavaModelUtil.getCompilerCompliance((IVMInstall2)defaultVM, JavaCore.VERSION_1_4);
+                       } else {
+                               defaultCC= JavaCore.VERSION_1_4;
+                       }
+
+                       for (int i= 0; i < environments.length; i++) {
+                               String eeCompliance= JavaModelUtil.getExecutionEnvironmentCompliance(environments[i]);
+                               if (defaultCC.endsWith(eeCompliance))
+                                       return environments[i].getId();
+                       }
+
+                       return "JavaSE-1.6"; //$NON-NLS-1$
+               }
+
+               private String getDefaultJVMLabel() {
+                       return Messages.format(NewWizardMessages.NewJavaProjectWizardPageOne_JREGroup_default_compliance, getDefaultJVMName());
+               }
+
+               public void update(Observable o, Object arg) {
+                       updateEnableState();
+               }
+
+               private void updateEnableState() {
+                       final boolean detect= fDetectGroup.mustDetect();
+                       fUseDefaultJRE.setEnabled(!detect);
+                       fUseProjectJRE.setEnabled(!detect);
+                       fUseEEJRE.setEnabled(!detect);
+                       fJRECombo.setEnabled(!detect && fUseProjectJRE.isSelected());
+                       fEECombo.setEnabled(!detect && fUseEEJRE.isSelected());
+                       if (fPreferenceLink != null) {
+                               fPreferenceLink.setEnabled(!detect);
+                       }
+                       if (fGroup != null) {
+                               fGroup.setEnabled(!detect);
+                       }
+               }
+
+               /* (non-Javadoc)
+                * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+                */
+               public void widgetSelected(SelectionEvent e) {
+                       widgetDefaultSelected(e);
+               }
+
+               /* (non-Javadoc)
+                * @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<String, Boolean> data= new HashMap<String, Boolean>();
+                       data.put(PropertyAndPreferencePage.DATA_NO_LINK, Boolean.TRUE);
+                       PreferencesUtil.createPreferenceDialogOn(getShell(), jreID, new String[] { jreID, complianceId , eeID }, data).open();
+
+                       handlePossibleJVMChange();
+                       fDetectGroup.handlePossibleJVMChange();
+               }
+
+               public void handlePossibleJVMChange() {
+                       fUseDefaultJRE.setLabelText(getDefaultJVMLabel());
+                       fillInstalledJREs(fJRECombo);
+                       fillExecutionEnvironments(fEECombo);
+               }
+
+               /* (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) {
+                       updateEnableState();
+                       fDetectGroup.handlePossibleJVMChange();
+                       if (field == fJRECombo) {
+                               if (fUseProjectJRE.isSelected()) {
+                                       storeSelectionValue(fJRECombo, LAST_SELECTED_JRE_SETTINGS_KEY);
+                               }
+                       } else if (field == fEECombo) {
+                               if (fUseEEJRE.isSelected()) {
+                                       storeSelectionValue(fEECombo, LAST_SELECTED_EE_SETTINGS_KEY);
+                               }
+                       } else if (field == fUseDefaultJRE) {
+                               if (fUseDefaultJRE.isSelected()) {
+                                       JavaPlugin.getDefault().getDialogSettings().put(LAST_SELECTED_JRE_KIND2, DEFAULT_JRE);
+                                       fUseProjectJRE.setSelection(false);
+                                       fUseEEJRE.setSelection(false);
+                               }
+                       } else if (field == fUseProjectJRE) {
+                               if (fUseProjectJRE.isSelected()) {
+                                       JavaPlugin.getDefault().getDialogSettings().put(LAST_SELECTED_JRE_KIND2, PROJECT_JRE);
+                                       fUseDefaultJRE.setSelection(false);
+                                       fUseEEJRE.setSelection(false);
+                               }
+                       } else if (field == fUseEEJRE) {
+                               if (fUseEEJRE.isSelected()) {
+                                       JavaPlugin.getDefault().getDialogSettings().put(LAST_SELECTED_JRE_KIND2, EE_JRE);
+                                       fUseDefaultJRE.setSelection(false);
+                                       fUseProjectJRE.setSelection(false);
+                               }
+                       }
+               }
+
+               private void storeSelectionValue(ComboDialogField combo, String preferenceKey) {
+                       int index= combo.getSelectionIndex();
+                       if (index == -1)
+                               return;
+
+                       String item= combo.getItems()[index];
+                       JavaPlugin.getDefault().getDialogSettings().put(preferenceKey, item);
+               }
+
+               private int getLastSelectedJREKind() {
+                       IDialogSettings settings= JavaPlugin.getDefault().getDialogSettings();
+                       if (settings.get(LAST_SELECTED_JRE_KIND2) == null)
+                               return EE_JRE;
+
+                       return settings.getInt(LAST_SELECTED_JRE_KIND2);
+               }
+
+               private String getLastSelectedEE() {
+                       IDialogSettings settings= JavaPlugin.getDefault().getDialogSettings();
+                       return settings.get(LAST_SELECTED_EE_SETTINGS_KEY);
+               }
+
+               private String getLastSelectedJRE() {
+                       IDialogSettings settings= JavaPlugin.getDefault().getDialogSettings();
+                       return settings.get(LAST_SELECTED_JRE_SETTINGS_KEY);
+               }
+
+               public IVMInstall getSelectedJVM() {
+                       if (fUseProjectJRE.isSelected()) {
+                               int index= fJRECombo.getSelectionIndex();
+                               if (index >= 0 && index < fInstalledJVMs.length) { // paranoia
+                                       return fInstalledJVMs[index];
+                               }
+                       } else if (fUseEEJRE.isSelected()) {
+
+                       }
+                       return null;
+               }
+
+               public IPath getJREContainerPath() {
+                       if (fUseProjectJRE.isSelected()) {
+                               int index= fJRECombo.getSelectionIndex();
+                               if (index >= 0 && index < fInstalledJVMs.length) { // paranoia
+                                       return JavaRuntime.newJREContainerPath(fInstalledJVMs[index]);
+                               }
+                       } else if (fUseEEJRE.isSelected()) {
+                               int index= fEECombo.getSelectionIndex();
+                               if (index >= 0 && index < fInstalledEEs.length) { // paranoia
+                                       return JavaRuntime.newJREContainerPath(fInstalledEEs[index]);
+                               }
+                       }
+                       return null;
+               }
+
+               public String getSelectedCompilerCompliance() {
+                       if (fUseProjectJRE.isSelected()) {
+                               int index= fJRECombo.getSelectionIndex();
+                               if (index >= 0 && index < fJRECompliance.length) { // paranoia
+                                       return fJRECompliance[index];
+                               }
+                       } else if (fUseEEJRE.isSelected()) {
+                               int index= fEECombo.getSelectionIndex();
+                               if (index >= 0 && index < fEECompliance.length) { // paranoia
+                                       return fEECompliance[index];
+                               }
+                       }
+                       return null;
+               }
+       }
+
+       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.NewJavaProjectWizardPageOne_WorkingSetSelection_message);
+               }
+
+               public Control createControl(Composite composite) {
+                       Group workingSetGroup= new Group(composite, SWT.NONE);
+                       workingSetGroup.setFont(composite.getFont());
+                       workingSetGroup.setText(NewWizardMessages.NewJavaProjectWizardPageOne_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 warning when the project location contains files.
+        */
+       private final class DetectGroup extends Observable implements Observer, SelectionListener {
+
+               private Link fHintText;
+               private Label fIcon;
+               private boolean fDetect;
+
+               public DetectGroup() {
+                       fDetect= 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.TOP, 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() {
+
+                       if (JavaRuntime.getDefaultVMInstall() == null) {
+                               fHintText.setText(NewWizardMessages.NewJavaProjectWizardPageOne_NoJREFound_link);
+                               fHintText.setVisible(true);
+                               fIcon.setImage(Dialog.getImage(Dialog.DLG_IMG_MESSAGE_WARNING));
+                               fIcon.setVisible(true);
+                               return;
+                       }
+
+                       String selectedCompliance= fJREGroup.getSelectedCompilerCompliance();
+                       if (selectedCompliance != null) {
+                               String defaultCompliance= JavaCore.getOption(JavaCore.COMPILER_COMPLIANCE);
+                               if (selectedCompliance.equals(defaultCompliance)) {
+                                       fHintText.setVisible(false);
+                                       fIcon.setVisible(false);
+                               } else {
+                                       fHintText.setText(Messages.format(NewWizardMessages.NewJavaProjectWizardPageOne_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;
+                       }
+
+                       selectedCompliance= JavaCore.getOption(JavaCore.COMPILER_COMPLIANCE);
+                       IVMInstall selectedJVM= fJREGroup.getSelectedJVM();
+                       if (selectedJVM == null) {
+                               selectedJVM= JavaRuntime.getDefaultVMInstall();
+                       }
+                       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))) {
+                               fHintText.setText(Messages.format(NewWizardMessages.NewJavaProjectWizardPageOne_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);
+                       }
+
+               }
+
+               private boolean computeDetectState() {
+                       if (fLocationGroup.isUseDefaultSelected()) {
+                               String name= fNameGroup.getName();
+                               if (name.length() == 0 || JavaPlugin.getWorkspace().getRoot().findMember(name) != null) {
+                                       return false;
+                               } else {
+                                       final File directory= fLocationGroup.getLocation().append(name).toFile();
+                                       return directory.isDirectory();
+                               }
+                       } else {
+                               final File directory= fLocationGroup.getLocation().toFile();
+                               return directory.isDirectory();
+                       }
+               }
+
+               public void update(Observable o, Object arg) {
+                       if (o instanceof LocationGroup) {
+                               boolean oldDetectState= fDetect;
+                               fDetect= computeDetectState();
+
+                               if (oldDetectState != fDetect) {
+                                       setChanged();
+                                       notifyObservers();
+
+                                       if (fDetect) {
+                                               fHintText.setVisible(true);
+                                               fHintText.setText(NewWizardMessages.NewJavaProjectWizardPageOne_DetectGroup_message);
+                                               fIcon.setImage(Dialog.getImage(Dialog.DLG_IMG_MESSAGE_INFO));
+                                               fIcon.setVisible(true);
+                                       } else {
+                                               handlePossibleJVMChange();
+                                       }
+                               }
+                       }
+               }
+
+               public boolean mustDetect() {
+                       return fDetect;
+               }
+
+               /* (non-Javadoc)
+                * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+                */
+               public void widgetSelected(SelectionEvent e) {
+                       widgetDefaultSelected(e);
+               }
+
+               /* (non-Javadoc)
+                * @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<String, Boolean> data= new HashMap<String, Boolean>();
+                       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();
+
+                       fJREGroup.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= fNameGroup.getName();
+
+                       // check whether the project name field is empty
+                       if (name.length() == 0) {
+                               setErrorMessage(null);
+                               setMessage(NewWizardMessages.NewJavaProjectWizardPageOne_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(NewWizardMessages.NewJavaProjectWizardPageOne_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(fNameGroup.getName())) {
+                                       setErrorMessage(Messages.format(NewWizardMessages.NewJavaProjectWizardPageOne_Message_invalidProjectNameForWorkspaceRoot, BasicElementLabels.getResourceName(existingName)));
+                                       setPageComplete(false);
+                                       return;
+                               }
+
+                       }
+
+                       final String location= fLocationGroup.getLocation().toOSString();
+
+                       // check whether location is empty
+                       if (location.length() == 0) {
+                               setErrorMessage(null);
+                               setMessage(NewWizardMessages.NewJavaProjectWizardPageOne_Message_enterLocation);
+                               setPageComplete(false);
+                               return;
+                       }
+
+                       // check whether the location is a syntactically correct path
+                       if (!Path.EMPTY.isValidPath(location)) {
+                               setErrorMessage(NewWizardMessages.NewJavaProjectWizardPageOne_Message_invalidDirectory);
+                               setPageComplete(false);
+                               return;
+                       }
+
+                       IPath projectPath= null;
+                       if (!fLocationGroup.isUseDefaultSelected()) {
+                               projectPath= Path.fromOSString(location);
+                               if (!projectPath.toFile().exists()) {
+                                       // check non-existing external location
+                                       if (!canCreate(projectPath.toFile())) {
+                                               setErrorMessage(NewWizardMessages.NewJavaProjectWizardPageOne_Message_cannotCreateAtExternalLocation);
+                                               setPageComplete(false);
+                                               return;
+                                       }
+                               }
+                       }
+                       
+                       // validate the location
+                       final IStatus locationStatus= workspace.validateProjectLocation(handle, projectPath);
+                       if (!locationStatus.isOK()) {
+                               setErrorMessage(locationStatus.getMessage());
+                               setPageComplete(false);
+                               return;
+                       }
+
+                       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();
+               }
+       }
+
+       private static final String PAGE_NAME= "NewJavaProjectWizardPageOne"; //$NON-NLS-1$
+
+       private final NameGroup fNameGroup;
+       private final LocationGroup fLocationGroup;
+       private final LayoutGroup fLayoutGroup;
+       private final JREGroup fJREGroup;
+       private final DetectGroup fDetectGroup;
+       private final Validator fValidator;
+       private final WorkingSetGroup fWorkingSetGroup;
+
+       /**
+        * Creates a new {@link NewJavaProjectWizardPageOne}.
+        */
+       public NewJavaProjectWizardPageOne() {
+               super(PAGE_NAME);
+               setPageComplete(false);
+               setTitle(NewWizardMessages.NewJavaProjectWizardPageOne_page_title);
+               setDescription(NewWizardMessages.NewJavaProjectWizardPageOne_page_description);
+
+               fNameGroup= new NameGroup();
+               fLocationGroup= new LocationGroup();
+               fJREGroup= new JREGroup();
+               fLayoutGroup= new LayoutGroup();
+               fWorkingSetGroup= new WorkingSetGroup();
+               fDetectGroup= new DetectGroup();
+
+               // establish connections
+               fNameGroup.addObserver(fLocationGroup);
+               fDetectGroup.addObserver(fLayoutGroup);
+               fDetectGroup.addObserver(fJREGroup);
+               fLocationGroup.addObserver(fDetectGroup);
+
+               // initialize all elements
+               fNameGroup.notifyObservers();
+
+               // create and connect validator
+               fValidator= new Validator();
+               fNameGroup.addObserver(fValidator);
+               fLocationGroup.addObserver(fValidator);
+
+               // initialize defaults
+               setProjectName(""); //$NON-NLS-1$
+               setProjectLocationURI(null);
+               setWorkingSets(new IWorkingSet[0]);
+
+               initializeDefaultVM();
+       }
+
+       /**
+        * 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();
+       }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+        */
+       public void createControl(Composite parent) {
+               initializeDialogUnits(parent);
+
+               final Composite composite= new Composite(parent, SWT.NULL);
+               composite.setFont(parent.getFont());
+               composite.setLayout(initGridLayout(new GridLayout(1, false), true));
+               composite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+
+               // create UI elements
+               Control nameControl= createNameControl(composite);
+               nameControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+               Control locationControl= createLocationControl(composite);
+               locationControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+               Control jreControl= createJRESelectionControl(composite);
+               jreControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+               Control layoutControl= createProjectLayoutControl(composite);
+               layoutControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+               Control workingSetControl= createWorkingSetControl(composite);
+               workingSetControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+               Control infoControl= createInfoControl(composite);
+               infoControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+               setControl(composite);
+       }
+
+       @Override
+       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 fNameGroup.createControl(composite);
+       }
+
+       /**
+        * Creates the controls for the location field.
+        *
+        * @param composite the parent composite
+        * @return the created control
+        */
+       protected Control createLocationControl(Composite composite) {
+               return fLocationGroup.createControl(composite);
+       }
+
+       /**
+        * Creates the controls for the JRE selection
+        *
+        * @param composite the parent composite
+        * @return the created control
+        */
+       protected Control createJRESelectionControl(Composite composite) {
+               return fJREGroup.createControl(composite);
+       }
+
+       /**
+        * Creates the controls for the project layout selection.
+        *
+        * @param composite the parent composite
+        * @return the created control
+        */
+       protected Control createProjectLayoutControl(Composite composite) {
+               return fLayoutGroup.createContent(composite);
+       }
+
+       /**
+        * Creates the controls for the working set selection.
+        *
+        * @param composite the parent composite
+        * @return the created control
+        */
+       protected Control createWorkingSetControl(Composite composite) {
+               return fWorkingSetGroup.createControl(composite);
+       }
+
+       /**
+        * Creates the controls for the info section.
+        *
+        * @param composite the parent composite
+        * @return the created control
+        */
+       protected Control createInfoControl(Composite composite) {
+               return fDetectGroup.createControl(composite);
+       }
+
+       /**
+        * Gets a project name for the new project.
+        *
+        * @return the new project resource handle
+        */
+       public String getProjectName() {
+               return fNameGroup.getName();
+       }
+
+       /**
+        * Sets the name of the new project
+        *
+        * @param name the new name
+        */
+       public void setProjectName(String name) {
+               if (name == null)
+                       throw new IllegalArgumentException();
+
+               fNameGroup.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 (fLocationGroup.isUseDefaultSelected()) {
+                       return null;
+               }
+               return URIUtil.toURI(fLocationGroup.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;
+               fLocationGroup.setLocation(path);
+       }
+
+       /**
+        * 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 fJREGroup.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= fJREGroup.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() {
+               IPath sourceFolderPath= new Path(getProjectName()).makeAbsolute();
+
+               if (fLayoutGroup.isSrcBin()) {
+                       IPath srcPath= new Path(PreferenceConstants.getPreferenceStore().getString(PreferenceConstants.SRCBIN_SRCNAME));
+                       if (srcPath.segmentCount() > 0) {
+                               sourceFolderPath= sourceFolderPath.append(srcPath);
+                       }
+               }
+               return new IClasspathEntry[] {  JavaCore.newSourceEntry(sourceFolderPath) };
+       }
+
+       /**
+        * 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();
+               if (fLayoutGroup.isSrcBin()) {
+                       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 fWorkingSetGroup.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();
+               }
+               fWorkingSetGroup.setWorkingSets(workingSets);
+       }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.jface.dialogs.DialogPage#setVisible(boolean)
+        */
+       @Override
+       public void setVisible(boolean visible) {
+               super.setVisible(visible);
+               if (visible) {
+                       fNameGroup.postSetFocus();
+               }
+       }
+
+       private GridLayout initGridLayout(GridLayout layout, boolean margins) {
+               layout.horizontalSpacing= convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+               layout.verticalSpacing= convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
+               if (margins) {
+                       layout.marginWidth= convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
+                       layout.marginHeight= convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
+               } else {
+                       layout.marginWidth= 0;
+                       layout.marginHeight= 0;
+               }
+               return layout;
+       }
+
+       private static final IWorkingSet[] EMPTY_WORKING_SET_ARRAY = new IWorkingSet[0];
+
+       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<IWorkingSet> result= new ArrayList<IWorkingSet>();
+               for (Iterator<?> iterator= elements.iterator(); iterator.hasNext();) {
+                       Object element= iterator.next();
+                       if (element instanceof IWorkingSet && isValidWorkingSet((IWorkingSet) element)) {
+                               result.add((IWorkingSet) element);
+                       }
+               }
+               return 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;
+       }
+
+
+}