/******************************************************************************* * Copyright (c) 2012 - 2017 GoPivotal, Inc. * 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: * GoPivotal, Inc. - initial API and implementation * DISID Corporation, S.L - Spring Roo maintainer *******************************************************************************/ package org.springframework.ide.eclipse.roo.ui.internal.wizard; import java.io.File; import java.io.IOException; import java.net.URI; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Observable; import java.util.Observer; import java.util.Set; import org.eclipse.core.filesystem.URIUtil; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.jdt.core.JavaConventions; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.internal.corext.util.Messages; 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.viewsupport.BasicElementLabels; import org.eclipse.jdt.internal.ui.wizards.NewWizardMessages; 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.ui.JavaUI; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.layout.GridDataFactory; 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.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.ControlAdapter; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FillLayout; 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.Control; import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.Text; 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.springframework.ide.eclipse.roo.core.RooCoreActivator; import org.springframework.ide.eclipse.roo.core.model.IRooInstall; import org.springframework.ide.eclipse.roo.core.model.IRooInstallListener; import org.springframework.ide.eclipse.roo.ui.internal.RooUiUtil; import org.springframework.ide.eclipse.roo.ui.internal.wizard.NewRooProjectWizard.ProjectType; /** * @author Christian Dupuis * @author Steffen Pingel * @author Terry Denney * @author Leo Dos Santos * @author Juan Carlos GarcĂ­a */ @SuppressWarnings("restriction") public class NewRooProjectWizardPageOne 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; protected final StringDialogField fPackageField; protected final StringDialogField fdescriptionField; protected final ComboDialogField fTemplateField; public NameGroup() { // text field for project name fNameField = new StringDialogField(); fNameField.setLabelText(NewWizardMessages.NewJavaProjectWizardPageOne_NameGroup_label_text); fNameField.setDialogFieldListener(this); fPackageField = new StringDialogField(); fPackageField.setLabelText("Top level package name:"); fPackageField.setDialogFieldListener(this); fTemplateField = new ComboDialogField(SWT.READ_ONLY); fTemplateField.setLabelText("Project type:"); List<String> types = new ArrayList<String>(); for (ProjectType type : ProjectType.values()) { types.add(type.getDisplayString()); } fTemplateField.setItems(types.toArray(new String[types.size()])); fTemplateField.selectItem(0); fdescriptionField = new StringDialogField(); fdescriptionField.setLabelText("Description"); fdescriptionField.setDialogFieldListener(this); fdescriptionField.setEnabled(false); } public Control createControl(Composite composite) { Composite nameComposite = new Composite(composite, SWT.NONE); nameComposite.setFont(composite.getFont()); nameComposite.setLayout(initGridLayout(new GridLayout(2, false), false)); fNameField.doFillIntoGrid(nameComposite, 2); LayoutUtil.setHorizontalGrabbing(fNameField.getTextControl(null)); fPackageField.doFillIntoGrid(nameComposite, 2); LayoutUtil.setHorizontalGrabbing(fPackageField.getTextControl(null)); fTemplateField.doFillIntoGrid(nameComposite, 2); LayoutUtil.setHorizontalGrabbing(fTemplateField.getComboControl(null)); fTemplateField.getComboControl(null).addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { ProjectType type = getProjectType(); fdescriptionField.setEnabled(type != ProjectType.PROJECT && type != ProjectType.MULTIMODULE_BASIC && type != ProjectType.MULTIMODULE_STANDARD); if (packagingProviderGroup != null) { packagingProviderGroup.updateEnablement(); } } }); fdescriptionField.doFillIntoGrid(nameComposite, 2); LayoutUtil.setHorizontalGrabbing(fdescriptionField.getTextControl(null)); return nameComposite; } protected void fireEvent() { setChanged(); notifyObservers(); } public String getName() { return fNameField.getText().trim(); } public String getPackageName() { return fPackageField.getText().trim(); } public String getDescription() { return fdescriptionField.getText().trim(); } public ProjectType getProjectType() { return ProjectType.fromDisplayString(fTemplateField.getItems()[fTemplateField.getSelectionIndex()]); } public void postSetFocus() { fNameField.postSetFocusOnDialogField(getShell().getDisplay()); } public void setName(String name) { fNameField.setText(name); } public void dialogFieldChanged(DialogField field) { fireEvent(); } } private final class RooInstallGroup extends Observable { private Button useDefault; private Button useSpecific; private Combo rooInstallCombo; public Control createControl(Composite composite) { Group rooHomeGroup = new Group(composite, SWT.NONE); rooHomeGroup.setFont(composite.getFont()); rooHomeGroup.setText("Roo Installation"); rooHomeGroup.setLayout(initGridLayout(new GridLayout(1, false), true)); useDefault = new Button(rooHomeGroup, SWT.RADIO); IRooInstall defaultInstall = RooCoreActivator.getDefault().getInstallManager().getDefaultRooInstall(); if (defaultInstall != null) { useDefault.setText(NewRooWizardMessages.bind( NewRooWizardMessages.NewRooProjectWizardPageOne_useDefaultRooInstallation, defaultInstall.getName())); } else { setErrorMessage(NewRooWizardMessages.NewRooProjectWizardPageOne_noRooInstallationConfigured); setPageComplete(false); useDefault.setText(NewRooWizardMessages.NewRooProjectWizardPageOne_useDefaultRooInstallationNoCurrent); } useDefault.setSelection(true); useDefault.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { rooInstallCombo.setEnabled(false); fireEvent(); } }); useSpecific = new Button(rooHomeGroup, SWT.RADIO); useSpecific.setText("Use project specific Roo installation:"); useSpecific.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { rooInstallCombo.setEnabled(true); fireEvent(); } }); final Composite installComposite = new Composite(rooHomeGroup, SWT.NULL); installComposite.setFont(composite.getFont()); installComposite.setLayout(new GridLayout(3, false)); installComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Label options = new Label(installComposite, SWT.WRAP); options.setText(NewRooWizardMessages.NewRooProjectWizardPageOne_Install); options.setLayoutData(new GridData(GridData.BEGINNING)); rooInstallCombo = new Combo(installComposite, SWT.DROP_DOWN | SWT.READ_ONLY); rooInstallCombo.setItems(RooCoreActivator.getDefault().getInstallManager().getAllInstallNames()); rooInstallCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); rooInstallCombo.addSelectionListener(new SelectionAdapter() { @Override public void widgetDefaultSelected(SelectionEvent e) { fireEvent(); } @Override public void widgetSelected(SelectionEvent e) { fireEvent(); } }); String[] names = rooInstallCombo.getItems(); for (int i = 0; i < names.length; i++) { if (RooCoreActivator.getDefault().getInstallManager().getRooInstall(names[i]).isDefault()) { rooInstallCombo.select(i); break; } } rooInstallCombo.setEnabled(false); rooHomeGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Link link = new Link(installComposite, SWT.NONE); link.setFont(composite.getFont()); link.setText("<A>Configure Roo Installations....</A>"); //$NON-NLS-1$//$NON-NLS-2$ link.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END)); link.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { openPreferences(); } public void widgetDefaultSelected(SelectionEvent e) { openPreferences(); } }); return rooHomeGroup; } public void refresh() { IRooInstall defaultInstall = RooCoreActivator.getDefault().getInstallManager().getDefaultRooInstall(); if (defaultInstall != null) { useDefault.setText(NewRooWizardMessages.bind( NewRooWizardMessages.NewRooProjectWizardPageOne_useDefaultRooInstallation, defaultInstall.getName())); } else { setErrorMessage(NewRooWizardMessages.NewRooProjectWizardPageOne_noRooInstallationConfigured); setPageComplete(false); useDefault.setText(NewRooWizardMessages.NewRooProjectWizardPageOne_useDefaultRooInstallationNoCurrent); } rooInstallCombo.setItems(RooCoreActivator.getDefault().getInstallManager().getAllInstallNames()); String[] names = rooInstallCombo.getItems(); for (int i = 0; i < names.length; i++) { if (RooCoreActivator.getDefault().getInstallManager().getRooInstall(names[i]).isDefault()) { rooInstallCombo.select(i); break; } } fireEvent(); } private void openPreferences() { String id = "com.springsource.sts.roo.ui.preferencePage"; PreferencesUtil.createPreferenceDialogOn(getShell(), id, new String[] { id }, Collections.EMPTY_MAP).open(); } protected void fireEvent() { setChanged(); notifyObservers(); } } private final class DependencyManagementGroup extends Observable { private Combo dependencyManagementCombo; public Control createControl(Composite composite) { Group group = new Group(composite, SWT.NONE); group.setFont(composite.getFont()); group.setText("Maven Support"); group.setLayout(initGridLayout(new GridLayout(1, false), true)); final Composite installComposite = new Composite(group, SWT.NULL); installComposite.setFont(composite.getFont()); installComposite.setLayout(new GridLayout(2, false)); installComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Label options = new Label(installComposite, SWT.WRAP); options.setText("Provider: "); options.setLayoutData(new GridData(GridData.BEGINNING)); dependencyManagementCombo = new Combo(installComposite, SWT.DROP_DOWN | SWT.READ_ONLY); dependencyManagementCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); // get available dependency management providers List<String> provider = new ArrayList<String>(); dependencyManagementCombo.setEnabled(false); if (DependencyManagementUtils.IS_M2ECLIPSE_PRESENT) { provider.add("Full Maven build"); dependencyManagementCombo.setEnabled(true); } if (DependencyManagementUtils.IS_STS_MAVEN_PRESENT) { provider.add("Dependency management only"); dependencyManagementCombo.setEnabled(true); } dependencyManagementCombo.setItems(provider.toArray(new String[provider.size()])); if (dependencyManagementCombo.isEnabled()) { dependencyManagementCombo.select(0); } group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); return group; } } private final class PackagingProviderGroup extends Observable implements Observer { private Group packagingGroup; private Button builtinButton; private Combo packagingProviderCombo; private Button customButton; private Text packagingProviderText; public Control createControl(Composite composite) { packagingGroup = new Group(composite, SWT.NONE); packagingGroup.setFont(composite.getFont()); packagingGroup.setText("Packaging Provider"); packagingGroup.setLayout(initGridLayout(new GridLayout(2, false), true)); builtinButton = new Button(packagingGroup, SWT.RADIO); builtinButton.setText("Select a built-in provider"); builtinButton.setSelection(true); builtinButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { packagingProviderCombo.setEnabled(true); packagingProviderText.setEnabled(false); } }); GridDataFactory.fillDefaults().span(2, 1).applyTo(builtinButton); Label options = new Label(packagingGroup, SWT.WRAP); options.setText("Packaging: "); GridDataFactory.swtDefaults().indent(5, 0).applyTo(options); packagingProviderCombo = new Combo(packagingGroup, SWT.DROP_DOWN | SWT.READ_ONLY); packagingProviderCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); packagingProviderCombo.setEnabled(true); List<String> provider = new ArrayList<String>(); provider.add("JAR"); provider.add("BUNDLE"); provider.add("POM"); provider.add("WAR"); packagingProviderCombo.setItems(provider.toArray(new String[provider.size()])); packagingProviderCombo.select(0); customButton = new Button(packagingGroup, SWT.RADIO); customButton.setText("Specify a custom provider"); customButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { packagingProviderCombo.setEnabled(false); packagingProviderText.setEnabled(true); } }); GridDataFactory.fillDefaults().span(2, 1).applyTo(customButton); Label flag = new Label(packagingGroup, SWT.WRAP); flag.setText("--provider "); GridDataFactory.swtDefaults().indent(5, 0).applyTo(flag); packagingProviderText = new Text(packagingGroup, SWT.BORDER); packagingProviderText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); packagingProviderText.setEnabled(false); updateEnablement(); packagingGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); return packagingGroup; } protected void updateEnablement() { String version = null; if (getProjectType() != ProjectType.PROJECT) { packagingGroup.setEnabled(false); for (Control c : packagingGroup.getChildren()) { c.setEnabled(false); } } else { IRooInstall install = null; if (useDefaultRooInstall()) { install = RooCoreActivator.getDefault().getInstallManager().getDefaultRooInstall(); if(install != null){ version = install.getVersion(); } } else { String installName = getRooInstallName(); if (installName != null) { install = RooCoreActivator.getDefault().getInstallManager().getRooInstall(installName); if(install != null) { version = install.getVersion(); } } } boolean enableFlag = RooUiUtil.isRoo120OrGreater(install); packagingGroup.setEnabled(enableFlag); for (Control c : packagingGroup.getChildren()) { c.setEnabled(enableFlag); } } // Checks if Spring Roo 2.0+ version is selected // Roo Addon Suite generation is only available on Spring Roo 2.0+ version if(version != null && !version.startsWith("2") && getProjectType().equals(ProjectType.ADDON_SUITE)){ MessageDialog.openInformation(getShell(), "Spring Roo Alert", "You are trying to generate an Spring Roo Addon Suite, but this functionality is only available on Spring Roo 2.0+ versions." + " Please, install an Spring Roo 2.0+ distribution to continue."); fNameGroup.fTemplateField.selectItem(0); } // Multimodule generation is only available on Spring Roo 2.0+ version if (version != null && !version.startsWith("2") && (getProjectType().equals(ProjectType.MULTIMODULE_BASIC) || getProjectType().equals(ProjectType.MULTIMODULE_STANDARD))) { MessageDialog.openInformation(getShell(), "Spring Roo Alert", "You are trying to generate multimodule project, but this functionality is only available on Spring Roo 2.0+ versions." + " Please, install an Spring Roo 2.0+ distribution to continue."); fNameGroup.fTemplateField.selectItem(0); } } public void update(Observable o, Object arg) { if (o instanceof RooInstallGroup) { updateEnablement(); } } } /** * Request a location. Fires an event whenever the checkbox or the location * field is changed, regardless of whether the change originates from the * user or has been invoked programmatically. */ private final class LocationGroup extends Observable implements Observer, IStringButtonAdapter, IDialogFieldListener { protected final SelectionButtonDialogField fWorkspaceRadio; protected final SelectionButtonDialogField fExternalRadio; protected final StringButtonDialogField fLocation; private String fPreviousExternalLocation; private static final String DIALOGSTORE_LAST_EXTERNAL_LOC = JavaUI.ID_PLUGIN + ".last.external.project"; //$NON-NLS-1$ public LocationGroup() { fWorkspaceRadio = new SelectionButtonDialogField(SWT.RADIO); fWorkspaceRadio.setDialogFieldListener(this); fWorkspaceRadio.setLabelText("Use &default location"); fExternalRadio = new SelectionButtonDialogField(SWT.RADIO); fExternalRadio.setLabelText("Use &external location"); fLocation = new StringButtonDialogField(this); fLocation.setDialogFieldListener(this); fLocation.setLabelText(NewWizardMessages.NewJavaProjectWizardPageOne_LocationGroup_locationLabel_desc); fLocation.setButtonLabel(NewWizardMessages.NewJavaProjectWizardPageOne_LocationGroup_browseButton_desc); fExternalRadio.attachDialogField(fLocation); fWorkspaceRadio.setSelection(true); fExternalRadio.setSelection(false); fPreviousExternalLocation = ""; //$NON-NLS-1$ } public Control createControl(Composite composite) { final int numColumns = 3; final Group group = new Group(composite, SWT.NONE); group.setLayout(initGridLayout(new GridLayout(numColumns, false), true)); group.setText("Contents"); fWorkspaceRadio.doFillIntoGrid(group, numColumns); fExternalRadio.doFillIntoGrid(group, numColumns); fLocation.doFillIntoGrid(group, numColumns); LayoutUtil.setHorizontalGrabbing(fLocation.getTextControl(null)); return group; } protected void fireEvent() { setChanged(); notifyObservers(); } protected String getDefaultPath(String name) { final IPath path = Platform.getLocation().append(name); return path.toOSString(); } /* * (non-Javadoc) * * @see java.util.Observer#update(java.util.Observable, * java.lang.Object) */ public void update(Observable o, Object arg) { if (isWorkspaceRadioSelected()) { fLocation.setText(getDefaultPath(fNameGroup.getName())); } fireEvent(); } public IPath getLocation() { if (isWorkspaceRadioSelected()) { return Platform.getLocation(); } return Path.fromOSString(fLocation.getText().trim()); } public boolean isWorkspaceRadioSelected() { return fWorkspaceRadio.isSelected(); } /** * Returns <code>true</code> if the location is in the workspace * * @return <code>true</code> if the location is in the workspace */ public boolean isLocationInWorkspace() { final String location = fLocationGroup.getLocation().toOSString(); IPath projectPath = Path.fromOSString(location); return Platform.getLocation().isPrefixOf(projectPath); } public void setLocation(IPath path) { fWorkspaceRadio.setSelection(path == null); if (path != null) { fLocation.setText(path.toOSString()); } else { fLocation.setText(getDefaultPath(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 == fWorkspaceRadio) { final boolean checked = fWorkspaceRadio.isSelected(); if (checked) { fPreviousExternalLocation = fLocation.getText(); fLocation.setText(getDefaultPath(fNameGroup.getName())); } else { fLocation.setText(fPreviousExternalLocation); } } fireEvent(); } } // TODO e3.5 replace by IWorkingSetIDs.JAVA public static final String IWorkingSetIDs_JAVA = "org.eclipse.jdt.ui.JavaWorkingSetPage"; // TODO e3.5 replace by IWorkingSetIDs.RESOURCE public static final String IWorkingSetIDs_RESOURCE = "org.eclipse.ui.resourceWorkingSetPage"; 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(); } } /** * Validate this page and show appropriate warnings and error * NewWizardMessages. */ private final class Validator implements Observer { private boolean firstValidation = true; private IStatus installError = null; 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; } // check whether package name is valid final String packageName = fNameGroup.getPackageName(); if (packageName.length() == 0) { setErrorMessage(null); setMessage("Enter a top level package name."); setPageComplete(false); return; } if (JavaConventions.validatePackageName(packageName, JavaCore.VERSION_1_3, JavaCore.VERSION_1_3) .getSeverity() == IStatus.ERROR) { setErrorMessage(null); setMessage("The entered top level package name is not valid."); 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; } setErrorMessage("A project at specified location already exists."); 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 = Path.fromOSString(location); if (fLocationGroup.isWorkspaceRadioSelected()) projectPath = projectPath.append(fNameGroup.getName()); if (projectPath.toFile().exists()) {// create from existing source if (Platform.getLocation().isPrefixOf(projectPath)) { // create // from // existing // source // in // workspace if (!Platform.getLocation().equals(projectPath.removeLastSegments(1))) { setErrorMessage(NewRooWizardMessages.NewRooProjectWizardPageOne_Message_notOnWorkspaceRoot); setPageComplete(false); return; } if (!projectPath.toFile().exists()) { setErrorMessage(NewRooWizardMessages.NewRooProjectWizardPageOne_notExisingProjectOnWorkspaceRoot); setPageComplete(false); return; } } } else if (!fLocationGroup.isWorkspaceRadioSelected()) {// create at // non // existing // external // location if (!canCreate(projectPath.toFile())) { setErrorMessage(NewWizardMessages.NewJavaProjectWizardPageOne_Message_cannotCreateAtExternalLocation); setPageComplete(false); return; } // If we do not place the contents in the workspace validate the // location. final IStatus locationStatus = workspace.validateProjectLocation(handle, projectPath); if (!locationStatus.isOK()) { setErrorMessage(locationStatus.getMessage()); setPageComplete(false); return; } } if (firstValidation) { firstValidation = false; if (RooCoreActivator.getDefault().getInstallManager().getDefaultRooInstall() == null) { setErrorMessage("No Roo installation configured in workspace preferences."); setPageComplete(false); return; } } else { IRooInstall install = null; if (useDefaultRooInstall()) { install = RooCoreActivator.getDefault().getInstallManager().getDefaultRooInstall(); } else { String installName = getRooInstallName(); if (installName != null) { install = RooCoreActivator.getDefault().getInstallManager().getRooInstall(installName); } } if (install == null) { setErrorMessage("No Roo installation configured in workspace preferences."); setPageComplete(false); return; } else { installError = install.validate(); if (installError != null && !installError.isOK()) { setErrorMessage(installError.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 = "NewRooProjectWizardPageOne"; //$NON-NLS-1$ private final NameGroup fNameGroup; private final LocationGroup fLocationGroup; private final RooInstallGroup rooInstallGroup; private final DependencyManagementGroup dependencyManagementGroup; private final PackagingProviderGroup packagingProviderGroup; private final Validator fValidator; private final WorkingSetGroup fWorkingSetGroup; private final IRooInstallListener listener; /** * Creates a new {@link NewRooProjectWizardPageOne}. */ public NewRooProjectWizardPageOne() { super(PAGE_NAME); setPageComplete(false); setTitle("Create a new Roo Project"); setDescription("Create a Roo project in the workspace or in an external location."); fNameGroup = new NameGroup(); fLocationGroup = new LocationGroup(); fWorkingSetGroup = new WorkingSetGroup(); rooInstallGroup = new RooInstallGroup(); dependencyManagementGroup = new DependencyManagementGroup(); packagingProviderGroup = new PackagingProviderGroup(); listener = new InstallChangeListener(); RooCoreActivator.getDefault().getInstallManager().addRooInstallListener(listener); // establish connections fNameGroup.addObserver(fLocationGroup); // initialize all elements fNameGroup.notifyObservers(); // create and connect validator fValidator = new Validator(); fNameGroup.addObserver(fValidator); fLocationGroup.addObserver(fValidator); rooInstallGroup.addObserver(fValidator); rooInstallGroup.addObserver(packagingProviderGroup); // initialize defaults setProjectName(""); //$NON-NLS-1$ setProjectLocationURI(null); setWorkingSets(new IWorkingSet[0]); } @Override public void dispose() { RooCoreActivator.getDefault().getInstallManager().removeRooInstallListener(listener); super.dispose(); } /** * 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)); } /* * (non-Javadoc) * * @see * org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets * .Composite) */ public void createControl(Composite parent) { initializeDialogUnits(parent); final Composite container = new Composite(parent, SWT.NONE); container.setLayout(new FillLayout()); final ScrolledComposite scrolledComposite = new ScrolledComposite(container, SWT.BORDER | SWT.V_SCROLL); scrolledComposite.setLayout(new FillLayout()); scrolledComposite.setExpandHorizontal(true); scrolledComposite.setExpandVertical(true); scrolledComposite.setAlwaysShowScrollBars(true); final Composite subContainer = new Composite(scrolledComposite, SWT.NONE); subContainer.setFont(parent.getFont()); subContainer.setLayout(initGridLayout(new GridLayout(1, false), true)); subContainer.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); // create UI elements Control nameControl = createNameControl(subContainer); nameControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Control rooHomeControl = rooInstallGroup.createControl(subContainer); rooHomeControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); if (DependencyManagementUtils.IS_M2ECLIPSE_PRESENT || DependencyManagementUtils.IS_STS_MAVEN_PRESENT) { Control dependencyManagementControl = dependencyManagementGroup.createControl(subContainer); dependencyManagementControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); } Control providerControl = packagingProviderGroup.createControl(subContainer); providerControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Control locationControl = createLocationControl(subContainer); locationControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Control workingSetControl = createWorkingSetControl(subContainer); workingSetControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); scrolledComposite.setContent(subContainer); scrolledComposite.addControlListener(new ControlAdapter() { public void controlResized(ControlEvent e) { Rectangle r = scrolledComposite.getClientArea(); scrolledComposite.setMinSize(subContainer .computeSize(r.width, SWT.DEFAULT)); } }); setControl(container); } protected void setControl(Control newControl) { Dialog.applyDialogFont(newControl); PlatformUI.getWorkbench().getHelpSystem().setHelp(newControl, IJavaHelpContextIds.NEW_JAVAPROJECT_WIZARD_PAGE); super.setControl(newControl); } /** * Creates the controls for the name field. * * @param composite the parent composite * @return the created control */ protected Control createNameControl(Composite composite) { return 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 working set selection. * * @param composite the parent composite * @return the created control */ protected Control createWorkingSetControl(Composite composite) { return fWorkingSetGroup.createControl(composite); } /** * Gets a project name for the new project. * * @return the new project resource handle */ public String getProjectName() { return fNameGroup.getName(); } public String getPackageName() { return fNameGroup.getPackageName(); } public String getDescription() { return fNameGroup.getDescription(); } public ProjectType getProjectType() { return fNameGroup.getProjectType(); } /** * 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.isLocationInWorkspace()) { return null; } return URIUtil.toURI(fLocationGroup.getLocation()); } public boolean isExternalProject() { return fLocationGroup.fExternalRadio.isSelected(); } public String getRooInstallName() { if (rooInstallGroup.rooInstallCombo.getSelectionIndex() >= 0) { return rooInstallGroup.rooInstallCombo.getItem(rooInstallGroup.rooInstallCombo.getSelectionIndex()); } return null; } public boolean useDefaultRooInstall() { return rooInstallGroup.useDefault.getSelection(); } public DependencyManagement getDependencyManagement() { if (dependencyManagementGroup.dependencyManagementCombo != null && dependencyManagementGroup.dependencyManagementCombo.isEnabled()) { String dm = dependencyManagementGroup.dependencyManagementCombo .getItem(dependencyManagementGroup.dependencyManagementCombo.getSelectionIndex()); if ("Full Maven build".equals(dm)) { return DependencyManagement.M2ECLIPSE; } else if ("Dependency management only".equals(dm)) { return DependencyManagement.MAVEN_STS; } } return DependencyManagement.NONE; } public String getPackagingProvider() { if (packagingProviderGroup.packagingGroup != null && packagingProviderGroup.packagingGroup.isEnabled()) { if (packagingProviderGroup.builtinButton.getSelection()) { return packagingProviderGroup.packagingProviderCombo.getText(); } else if (packagingProviderGroup.customButton.getSelection()) { return packagingProviderGroup.packagingProviderText.getText(); } } return ""; } /** * 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 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) */ 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 }; } } @SuppressWarnings({ "unchecked", "rawtypes" }) private IWorkingSet[] getSelectedWorkingSet(IStructuredSelection selection) { if (!(selection instanceof ITreeSelection)) return EMPTY_WORKING_SET_ARRAY; ITreeSelection treeSelection = (ITreeSelection) selection; if (treeSelection.isEmpty()) return EMPTY_WORKING_SET_ARRAY; List elements = treeSelection.toList(); if (elements.size() == 1) { Object element = elements.get(0); TreePath[] paths = treeSelection.getPathsFor(element); if (paths.length != 1) return EMPTY_WORKING_SET_ARRAY; TreePath path = paths[0]; if (path.getSegmentCount() == 0) return EMPTY_WORKING_SET_ARRAY; Object candidate = path.getSegment(0); if (!(candidate instanceof IWorkingSet)) return EMPTY_WORKING_SET_ARRAY; IWorkingSet workingSetCandidate = (IWorkingSet) candidate; if (isValidWorkingSet(workingSetCandidate)) return new IWorkingSet[] { workingSetCandidate }; return EMPTY_WORKING_SET_ARRAY; } ArrayList result = new ArrayList(); for (Iterator iterator = elements.iterator(); iterator.hasNext();) { Object element = iterator.next(); if (element instanceof IWorkingSet && isValidWorkingSet((IWorkingSet) element)) { result.add(element); } } return (IWorkingSet[]) result.toArray(new IWorkingSet[result.size()]); } private static boolean isValidWorkingSet(IWorkingSet workingSet) { String id = workingSet.getId(); if (!IWorkingSetIDs_JAVA.equals(id) && !IWorkingSetIDs_RESOURCE.equals(id)) return false; if (workingSet.isAggregateWorkingSet()) return false; return true; } private class InstallChangeListener implements IRooInstallListener { public void installChanged(Set<IRooInstall> installs) { // Perform refresh from the UI thread if it's not already the current thread. if (Display.getCurrent() == null) { Display.getDefault().asyncExec(new Runnable() { public void run() { if (getShell() != null && !getShell().isDisposed()) { rooInstallGroup.refresh(); } } }); } else { rooInstallGroup.refresh(); } } } }