blob: 21302016506ea80354662796b70bd59a55393aa2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 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.internal.ui.wizards;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Observable;
import java.util.Observer;
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.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.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Link;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.PreferencesUtil;
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.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.preferences.CompliancePreferencePage;
import org.eclipse.jdt.internal.ui.preferences.NewJavaProjectPreferencePage;
import org.eclipse.jdt.internal.ui.preferences.PropertyAndPreferencePage;
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;
/**
* The first page of the <code>SimpleProjectWizard</code>.
*/
public class JavaProjectWizardFirstPage 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(Composite composite, String initialName) {
final Composite nameComposite= new Composite(composite, SWT.NONE);
nameComposite.setFont(composite.getFont());
nameComposite.setLayout(initGridLayout(new GridLayout(2, false), false));
nameComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
// text field for project name
fNameField= new StringDialogField();
fNameField.setLabelText(NewWizardMessages.JavaProjectWizardFirstPage_NameGroup_label_text);
fNameField.setDialogFieldListener(this);
setName(initialName);
fNameField.doFillIntoGrid(nameComposite, 2);
LayoutUtil.setHorizontalGrabbing(fNameField.getTextControl(null));
}
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 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(Composite composite) {
final int numColumns= 3;
final Group group= new Group(composite, SWT.NONE);
group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
group.setLayout(initGridLayout(new GridLayout(numColumns, false), true));
group.setText(NewWizardMessages.JavaProjectWizardFirstPage_LocationGroup_title);
fWorkspaceRadio= new SelectionButtonDialogField(SWT.RADIO);
fWorkspaceRadio.setDialogFieldListener(this);
fWorkspaceRadio.setLabelText(NewWizardMessages.JavaProjectWizardFirstPage_LocationGroup_workspace_desc);
fExternalRadio= new SelectionButtonDialogField(SWT.RADIO);
fExternalRadio.setLabelText(NewWizardMessages.JavaProjectWizardFirstPage_LocationGroup_external_desc);
fLocation= new StringButtonDialogField(this);
fLocation.setDialogFieldListener(this);
fLocation.setLabelText(NewWizardMessages.JavaProjectWizardFirstPage_LocationGroup_locationLabel_desc);
fLocation.setButtonLabel(NewWizardMessages.JavaProjectWizardFirstPage_LocationGroup_browseButton_desc);
fExternalRadio.attachDialogField(fLocation);
fWorkspaceRadio.setSelection(true);
fExternalRadio.setSelection(false);
fPreviousExternalLocation= ""; //$NON-NLS-1$
fWorkspaceRadio.doFillIntoGrid(group, numColumns);
fExternalRadio.doFillIntoGrid(group, numColumns);
fLocation.doFillIntoGrid(group, numColumns);
LayoutUtil.setHorizontalGrabbing(fLocation.getTextControl(null));
}
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 (isInWorkspace()) {
fLocation.setText(getDefaultPath(fNameGroup.getName()));
}
fireEvent();
}
public IPath getLocation() {
if (isInWorkspace()) {
return Platform.getLocation();
}
return Path.fromOSString(fLocation.getText().trim());
}
public boolean isInWorkspace() {
return fWorkspaceRadio.isSelected();
}
/* (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.JavaProjectWizardFirstPage_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) {
fLocation.setText(selectedDirectory);
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(fNameGroup.getName()));
} else {
fLocation.setText(fPreviousExternalLocation);
}
}
fireEvent();
}
}
/**
* Request a project layout.
*/
private final class LayoutGroup implements Observer, SelectionListener {
private final SelectionButtonDialogField fStdRadio, fSrcBinRadio;
private final Group fGroup;
private final Link fPreferenceLink;
public LayoutGroup(Composite composite) {
fGroup= new Group(composite, SWT.NONE);
fGroup.setFont(composite.getFont());
fGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
fGroup.setLayout(initGridLayout(new GridLayout(3, false), true));
fGroup.setText(NewWizardMessages.JavaProjectWizardFirstPage_LayoutGroup_title);
fStdRadio= new SelectionButtonDialogField(SWT.RADIO);
fStdRadio.setLabelText(NewWizardMessages.JavaProjectWizardFirstPage_LayoutGroup_option_oneFolder);
fSrcBinRadio= new SelectionButtonDialogField(SWT.RADIO);
fSrcBinRadio.setLabelText(NewWizardMessages.JavaProjectWizardFirstPage_LayoutGroup_option_separateFolders);
fStdRadio.doFillIntoGrid(fGroup, 3);
LayoutUtil.setHorizontalGrabbing(fStdRadio.getSelectionButton(null));
fSrcBinRadio.doFillIntoGrid(fGroup, 2);
fPreferenceLink= new Link(fGroup, SWT.NONE);
fPreferenceLink.setText(NewWizardMessages.JavaProjectWizardFirstPage_LayoutGroup_link_description);
fPreferenceLink.setLayoutData(new GridData(GridData.END, GridData.END, false, false));
fPreferenceLink.addSelectionListener(this);
boolean useSrcBin= PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.SRCBIN_FOLDERS_IN_NEWPROJ);
fSrcBinRadio.setSelection(useSrcBin);
fStdRadio.setSelection(!useSrcBin);
}
public void update(Observable o, Object arg) {
final boolean detect= fDetectGroup.mustDetect();
fStdRadio.setEnabled(!detect);
fSrcBinRadio.setEnabled(!detect);
fPreferenceLink.setEnabled(!detect);
fGroup.setEnabled(!detect);
}
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 final SelectionButtonDialogField fUseDefaultJRE, fUseProjectJRE;
private final ComboDialogField fJRECombo;
private final Group fGroup;
private String[] fComplianceLabels;
private String[] fComplianceData;
private final Link fPreferenceLink;
private IVMInstall[] fInstalledJVMs;
public JREGroup(Composite composite) {
fGroup= new Group(composite, SWT.NONE);
fGroup.setFont(composite.getFont());
fGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
fGroup.setLayout(initGridLayout(new GridLayout(3, false), true));
fGroup.setText(NewWizardMessages.JavaProjectWizardFirstPage_JREGroup_title);
fUseDefaultJRE= new SelectionButtonDialogField(SWT.RADIO);
fUseDefaultJRE.setLabelText(getDefaultJVMLabel());
fUseDefaultJRE.doFillIntoGrid(fGroup, 2);
fPreferenceLink= new Link(fGroup, SWT.NONE);
fPreferenceLink.setFont(fGroup.getFont());
fPreferenceLink.setText(NewWizardMessages.JavaProjectWizardFirstPage_JREGroup_link_description);
fPreferenceLink.setLayoutData(new GridData(GridData.END, GridData.CENTER, false, false));
fPreferenceLink.addSelectionListener(this);
fUseProjectJRE= new SelectionButtonDialogField(SWT.RADIO);
fUseProjectJRE.setLabelText(NewWizardMessages.JavaProjectWizardFirstPage_JREGroup_specific_compliance);
fUseProjectJRE.doFillIntoGrid(fGroup, 1);
fUseProjectJRE.setDialogFieldListener(this);
fJRECombo= new ComboDialogField(SWT.READ_ONLY);
fillInstalledJREs(fJRECombo);
fJRECombo.setDialogFieldListener(this);
Combo comboControl= fJRECombo.getComboControl(fGroup);
comboControl.setLayoutData(new GridData(GridData.BEGINNING, GridData.CENTER, true, false)); // make sure column 2 is grabing (but no fill)
comboControl.setVisibleItemCount(20);
DialogField.createEmptySpace(fGroup);
fUseDefaultJRE.setSelection(true);
fJRECombo.setEnabled(fUseProjectJRE.isSelected());
}
private void fillInstalledJREs(ComboDialogField comboField) {
String selectedItem= null;
int selectionIndex= -1;
if (fUseProjectJRE.isSelected()) {
selectionIndex= comboField.getSelectionIndex();
if (selectionIndex != -1) {//paranoia
selectedItem= comboField.getItems()[selectionIndex];
}
}
fInstalledJVMs= getWorkspaceJREs();
Arrays.sort(fInstalledJVMs, new Comparator() {
public int compare(Object arg0, Object arg1) {
IVMInstall i0= (IVMInstall)arg0;
IVMInstall i1= (IVMInstall)arg1;
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)
result= i0.getName().compareTo(i1.getName());
return result;
} else {
return i0.getName().compareTo(i1.getName());
}
}
});
selectionIndex= -1;//find new index
fComplianceLabels= new String[fInstalledJVMs.length];
fComplianceData= new String[fInstalledJVMs.length];
for (int i= 0; i < fInstalledJVMs.length; i++) {
fComplianceLabels[i]= fInstalledJVMs[i].getName();
if (selectedItem != null && fComplianceLabels[i].equals(selectedItem)) {
selectionIndex= i;
}
if (fInstalledJVMs[i] instanceof IVMInstall2) {
fComplianceData[i]= JavaModelUtil.getCompilerCompliance((IVMInstall2) fInstalledJVMs[i], JavaCore.VERSION_1_4);
} else {
fComplianceData[i]= JavaCore.VERSION_1_4;
}
}
comboField.setItems(fComplianceLabels);
if (selectionIndex == -1) {
fJRECombo.selectItem(getDefaultJVMName());
} else {
fJRECombo.selectItem(selectedItem);
}
}
private IVMInstall[] getWorkspaceJREs() {
List standins = new ArrayList();
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 ((IVMInstall[])standins.toArray(new IVMInstall[standins.size()]));
}
private String getDefaultJVMName() {
return JavaRuntime.getDefaultVMInstall().getName();
}
private String getDefaultJVMLabel() {
return Messages.format(NewWizardMessages.JavaProjectWizardFirstPage_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);
fJRECombo.setEnabled(!detect && fUseProjectJRE.isSelected());
fPreferenceLink.setEnabled(!detect);
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 complianceId= CompliancePreferencePage.PREF_ID;
Map data= new HashMap();
data.put(PropertyAndPreferencePage.DATA_NO_LINK, Boolean.TRUE);
PreferencesUtil.createPreferenceDialogOn(getShell(), jreID, new String[] { jreID, complianceId }, data).open();
handlePossibleJVMChange();
fDetectGroup.handlePossibleJVMChange();
}
public void handlePossibleJVMChange() {
fUseDefaultJRE.setLabelText(getDefaultJVMLabel());
fillInstalledJREs(fJRECombo);
}
/* (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();
}
public boolean isUseSpecific() {
return fUseProjectJRE.isSelected();
}
public IVMInstall getSelectedJVM() {
if (fUseProjectJRE.isSelected()) {
int index= fJRECombo.getSelectionIndex();
if (index >= 0 && index < fComplianceData.length) { // paranoia
return fInstalledJVMs[index];
}
}
return null;
}
public String getSelectedCompilerCompliance() {
if (fUseProjectJRE.isSelected()) {
int index= fJRECombo.getSelectionIndex();
if (index >= 0 && index < fComplianceData.length) { // paranoia
return fComplianceData[index];
}
}
return null;
}
}
/**
* Show a warning when the project location contains files.
*/
private final class DetectGroup extends Observable implements Observer, SelectionListener {
private final Link fHintText;
private boolean fDetect;
public DetectGroup(Composite composite) {
Link jre50Text= new Link(composite, SWT.WRAP);
jre50Text.setFont(composite.getFont());
jre50Text.addSelectionListener(this);
GridData gridData= new GridData(GridData.FILL, SWT.FILL, true, true);
gridData.widthHint= convertWidthInCharsToPixels(50);
jre50Text.setLayoutData(gridData);
fHintText= jre50Text;
handlePossibleJVMChange();
}
public void handlePossibleJVMChange() {
String selectedCompliance= fJREGroup.getSelectedCompilerCompliance();
if (selectedCompliance == null) {
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))) {
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(Messages.format(NewWizardMessages.JavaProjectWizardFirstPage_DetectGroup_jre_message, new String[] {selectedCompliance, jvmCompliance}));
fHintText.setVisible(true);
} else {
fHintText.setVisible(false);
}
}
public void update(Observable o, Object arg) {
if (o instanceof LocationGroup) {
boolean oldDetectState= fDetect;
if (fLocationGroup.isInWorkspace()) {
String name= getProjectName();
if (name.length() == 0 || JavaPlugin.getWorkspace().getRoot().findMember(name) != null) {
fDetect= false;
} else {
final File directory= fLocationGroup.getLocation().append(getProjectName()).toFile();
fDetect= directory.isDirectory();
}
} else {
final File directory= fLocationGroup.getLocation().toFile();
fDetect= directory.isDirectory();
}
if (oldDetectState != fDetect) {
setChanged();
notifyObservers();
if (fDetect) {
fHintText.setVisible(true);
fHintText.setText(NewWizardMessages.JavaProjectWizardFirstPage_DetectGroup_message);
} 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 complianceId= CompliancePreferencePage.PREF_ID;
Map data= new HashMap();
data.put(PropertyAndPreferencePage.DATA_NO_LINK, Boolean.TRUE);
PreferencesUtil.createPreferenceDialogOn(getShell(), complianceId, new String[] { jreID, complianceId }, 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.JavaProjectWizardFirstPage_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= getProjectHandle();
if (handle.exists()) {
setErrorMessage(NewWizardMessages.JavaProjectWizardFirstPage_Message_projectAlreadyExists);
setPageComplete(false);
return;
}
final String location= fLocationGroup.getLocation().toOSString();
// check whether location is empty
if (location.length() == 0) {
setErrorMessage(null);
setMessage(NewWizardMessages.JavaProjectWizardFirstPage_Message_enterLocation);
setPageComplete(false);
return;
}
// check whether the location is a syntactically correct path
if (!Path.EMPTY.isValidPath(location)) {
setErrorMessage(NewWizardMessages.JavaProjectWizardFirstPage_Message_invalidDirectory);
setPageComplete(false);
return;
}
// check whether the location has the workspace as prefix
IPath projectPath= Path.fromOSString(location);
if (!fLocationGroup.isInWorkspace() && Platform.getLocation().isPrefixOf(projectPath)) {
setErrorMessage(NewWizardMessages.JavaProjectWizardFirstPage_Message_cannotCreateInWorkspace);
setPageComplete(false);
return;
}
// If we do not place the contents in the workspace validate the
// location.
if (!fLocationGroup.isInWorkspace()) {
final IStatus locationStatus= workspace.validateProjectLocation(handle, projectPath);
if (!locationStatus.isOK()) {
setErrorMessage(locationStatus.getMessage());
setPageComplete(false);
return;
}
}
setPageComplete(true);
setErrorMessage(null);
setMessage(null);
}
}
private NameGroup fNameGroup;
private LocationGroup fLocationGroup;
private LayoutGroup fLayoutGroup;
private JREGroup fJREGroup;
private DetectGroup fDetectGroup;
private Validator fValidator;
private String fInitialName;
private static final String PAGE_NAME= NewWizardMessages.JavaProjectWizardFirstPage_page_pageName;
/**
* Create a new <code>SimpleProjectFirstPage</code>.
*/
public JavaProjectWizardFirstPage() {
super(PAGE_NAME);
setPageComplete(false);
setTitle(NewWizardMessages.JavaProjectWizardFirstPage_page_title);
setDescription(NewWizardMessages.JavaProjectWizardFirstPage_page_description);
fInitialName= ""; //$NON-NLS-1$
initializeDefaultVM();
}
private void initializeDefaultVM() {
JavaRuntime.getDefaultVMInstall();
}
public void setName(String name) {
fInitialName= name;
if (fNameGroup != null) {
fNameGroup.setName(name);
}
}
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
fNameGroup= new NameGroup(composite, fInitialName);
fLocationGroup= new LocationGroup(composite);
fJREGroup= new JREGroup(composite);
fLayoutGroup= new LayoutGroup(composite);
fDetectGroup= new DetectGroup(composite);
// 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);
setControl(composite);
Dialog.applyDialogFont(composite);
PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IJavaHelpContextIds.NEW_JAVAPROJECT_WIZARD_PAGE);
}
/**
* Returns the current project location path as entered by the user, or its
* anticipated initial value. Note that if the default has been returned
* the path in a project description used to create a project should not be
* set.
* <p>
* TODO At some point this method has to be converted to return an URI instead
* of an path. However, this first requires support from Platform/UI to specify
* a project location different than in a local file system.
* </p>
* @return the project location path or its anticipated initial value.
*/
public IPath getLocationPath() {
return fLocationGroup.getLocation();
}
/**
* Creates a project resource handle for the current project name field
* value.
* <p>
* This method does not create the project resource; this is the
* responsibility of <code>IProject::create</code> invoked by the new
* project resource wizard.
* </p>
*
* @return the new project resource handle
*/
public IProject getProjectHandle() {
return ResourcesPlugin.getWorkspace().getRoot().getProject(fNameGroup.getName());
}
public boolean isInWorkspace() {
return fLocationGroup.isInWorkspace();
}
public String getProjectName() {
return fNameGroup.getName();
}
public boolean getDetect() {
return fDetectGroup.mustDetect();
}
public boolean isSrcBin() {
return fLayoutGroup.isSrcBin();
}
/**
* @return the selected JVM, or <code>null</code> iff the default JVM should be used
*/
public IVMInstall getJVM() {
return fJREGroup.getSelectedJVM();
}
/**
* @return the selected Compiler Compliance, or <code>null</code> iff the default Compiler Compliance should be used
*/
public String getCompilerCompliance() {
return fJREGroup.getSelectedCompilerCompliance();
}
/*
* see @DialogPage.setVisible(boolean)
*/
public void setVisible(boolean visible) {
super.setVisible(visible);
if (visible) {
fNameGroup.postSetFocus();
}
}
/**
* Initialize a grid layout with the default Dialog settings.
*/
protected 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;
}
/**
* Set the layout data for a button.
*/
protected GridData setButtonLayoutData(Button button) {
return super.setButtonLayoutData(button);
}
}