/* * Copyright (c) 2010-2012 Research In Motion Limited. All rights reserved. * * This program and the accompanying materials are made available * under the terms of the Eclipse Public License, Version 1.0, * which accompanies this distribution and is available at * * http://www.eclipse.org/legal/epl-v10.html * */ package net.rim.ejde.internal.ui.wizards; import java.io.File; import java.io.IOException; import java.net.URI; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Observable; import java.util.Observer; import net.rim.ejde.internal.imports.LegacyImportHelper; import net.rim.ejde.internal.internalplugin.InternalFragmentReplaceable; import net.rim.ejde.internal.model.BlackBerryVMInstallType; import net.rim.ejde.internal.ui.widgets.dialog.DialogField; import net.rim.ejde.internal.ui.widgets.dialog.IDialogFieldListener; import net.rim.ejde.internal.ui.widgets.dialog.IStringButtonAdapter; import net.rim.ejde.internal.ui.widgets.dialog.SelectionButtonDialogField; import net.rim.ejde.internal.ui.widgets.dialog.StringButtonDialogField; import net.rim.ejde.internal.ui.widgets.dialog.StringDialogField; import net.rim.ejde.internal.util.ImportUtils; import net.rim.ejde.internal.util.Messages; import net.rim.ejde.internal.util.VMUtils; import org.eclipse.core.filesystem.URIUtil; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.internal.corext.util.JavaModelUtil; import org.eclipse.jdt.internal.ui.IJavaHelpContextIds; import org.eclipse.jdt.internal.ui.JavaPlugin; import org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart; import org.eclipse.jdt.internal.ui.preferences.CompliancePreferencePage; import org.eclipse.jdt.internal.ui.preferences.PropertyAndPreferencePage; import org.eclipse.jdt.internal.ui.viewsupport.BasicElementLabels; import org.eclipse.jdt.internal.ui.wizards.buildpaths.BuildPathSupport; import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil; import org.eclipse.jdt.internal.ui.workingsets.IWorkingSetIDs; import org.eclipse.jdt.launching.IVMInstall; import org.eclipse.jdt.launching.IVMInstall2; import org.eclipse.jdt.launching.IVMInstallType; import org.eclipse.jdt.launching.JavaRuntime; import org.eclipse.jdt.ui.JavaUI; import org.eclipse.jdt.ui.PreferenceConstants; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeSelection; import org.eclipse.jface.viewers.TreePath; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Link; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkingSet; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.PreferencesUtil; import org.eclipse.ui.dialogs.WorkingSetConfigurationBlock; /** * The first page of the New Java Project wizard. This page is typically used in combination with * {@link NewBlackBerryProjectWizardPageTwo}. Clients can extend this page to modify the UI: Add, remove or reorder sections. * * <p> * Clients may instantiate or subclass. * </p> * * @since 3.4 */ @InternalFragmentReplaceable public class BlackBerryProjectWizardPageOne extends AbstractBlackBerryWizardPage { private static final String PAGE_NAME = "NewBlackBerryProjectWizardPageOne"; //$NON-NLS-1$ private final NameGroup _nameGroup; private final LocationGroup _locationGroup; private final JRESelectionUI _JREGroup; private final DetectGroup _detectGroup; private final Validator _validator; private final WorkingSetGroup _workingSetGroup; private static final IWorkingSet[] EMPTY_WORKING_SET_ARRAY = new IWorkingSet[ 0 ]; /** * Default constructor. */ public BlackBerryProjectWizardPageOne() { super( PAGE_NAME ); setPageComplete( false ); setTitle( Messages.NewBlackBerryProjectWizardPageOne_page_title ); setDescription( Messages.NewBlackBerryProjectWizardPageOne_page_description ); _nameGroup = new NameGroup(); _locationGroup = new LocationGroup(); _JREGroup = new JRESelectionUI( this ); _workingSetGroup = new WorkingSetGroup(); _detectGroup = new DetectGroup(); // establish connections _nameGroup.addObserver( _locationGroup ); _locationGroup.addObserver( _detectGroup ); // initialize all elements _nameGroup.notifyObservers(); // create and connect validator _validator = new Validator(); _nameGroup.addObserver( _validator ); _locationGroup.addObserver( _validator ); _JREGroup.addObserver( _validator ); _detectGroup.addObserver( _validator ); // initialize defaults setProjectName( "" ); //$NON-NLS-1$ setProjectLocationURI( null ); setWorkingSets( new IWorkingSet[ 0 ] ); initializeDefaultVM(); } /** * Request a project name. Fires an event whenever the text field is changed, regardless of its content. */ private final class NameGroup extends Observable implements IDialogFieldListener { protected final StringDialogField _nameField; public NameGroup() { // text field for project name _nameField = new StringDialogField(); _nameField.setLabelText( Messages.NewBlackBerryProjectWizardPageOne_NameGroup_label_text ); _nameField.setDialogFieldListener( this ); } public Control createControl( Composite composite ) { Composite container = new Composite( composite, SWT.NONE ); container.setFont( composite.getFont() ); container.setLayout( initGridLayout( new GridLayout( 2, false ), false ) ); _nameField.doFillIntoGrid( container, 2 ); LayoutUtil.setHorizontalGrabbing( _nameField.getTextControl( null ) ); return container; } protected void fireEvent() { setChanged(); notifyObservers(); } public String getName() { return _nameField.getText().trim(); } public void postSetFocus() { _nameField.postSetFocusOnDialogField( getShell().getDisplay() ); } public void setName( String name ) { _nameField.setText( name ); } /* * (non-Javadoc) * * @see org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener * #dialogFieldChanged(org.eclipse.jdt.internal.ui.wizards.dialogfields. DialogField) */ public void dialogFieldChanged( DialogField field ) { fireEvent(); } } /** * Request a location. Fires an event whenever the checkbox or the location field is changed, regardless of whether the change * originates from the user or has been invoked programmatically. */ private final class LocationGroup extends Observable implements Observer, IStringButtonAdapter, IDialogFieldListener { protected final SelectionButtonDialogField fWorkspaceRadio; protected final SelectionButtonDialogField fExternalRadio; protected final StringButtonDialogField fLocation; private String fPreviousExternalLocation; private static final String DIALOGSTORE_LAST_EXTERNAL_LOC = JavaUI.ID_PLUGIN + ".last.external.project"; //$NON-NLS-1$ public LocationGroup() { fWorkspaceRadio = new SelectionButtonDialogField( SWT.RADIO ); fWorkspaceRadio.setDialogFieldListener( this ); fWorkspaceRadio.setLabelText( Messages.NewBlackBerryProjectWizardPageOne_LocationGroup_workspace_desc ); fExternalRadio = new SelectionButtonDialogField( SWT.RADIO ); fExternalRadio.setLabelText( Messages.NewBlackBerryProjectWizardPageOne_LocationGroup_external_desc ); fLocation = new StringButtonDialogField( this ); fLocation.setDialogFieldListener( this ); fLocation.setLabelText( Messages.NewBlackBerryProjectWizardPageOne_LocationGroup_locationLabel_desc ); fLocation.setButtonLabel( Messages.NewBlackBerryProjectWizardPageOne_LocationGroup_browseButton_desc ); fExternalRadio.attachDialogField( fLocation ); fWorkspaceRadio.setSelection( true ); fExternalRadio.setSelection( false ); fPreviousExternalLocation = ""; //$NON-NLS-1$ } public Control createControl( Composite composite ) { final int numColumns = 3; final Group group = new Group( composite, SWT.NONE ); group.setLayout( initGridLayout( new GridLayout( numColumns, false ), true ) ); group.setText( Messages.NewBlackBerryProjectWizardPageOne_LocationGroup_title ); fWorkspaceRadio.doFillIntoGrid( group, numColumns ); fExternalRadio.doFillIntoGrid( group, numColumns ); fLocation.doFillIntoGrid( group, numColumns ); LayoutUtil.setHorizontalGrabbing( fLocation.getTextControl( null ) ); return group; } protected void fireEvent() { setChanged(); notifyObservers(); } protected String getDefaultPath( String name ) { final IPath path = Platform.getLocation().append( name ); return path.toOSString(); } /* * (non-Javadoc) * * @see java.util.Observer#update(java.util.Observable, java.lang.Object) */ public void update( Observable o, Object arg ) { if( isWorkspaceRadioSelected() ) { fLocation.setText( getDefaultPath( _nameGroup.getName() ) ); } fireEvent(); } public IPath getLocation() { if( isWorkspaceRadioSelected() ) { return Platform.getLocation(); } return Path.fromOSString( fLocation.getText().trim() ); } public boolean isWorkspaceRadioSelected() { return fWorkspaceRadio.isSelected(); } /** * Returns <code>true</code> if the location is in the workspace * * @return <code>true</code> if the location is in the workspace */ public boolean isLocationInWorkspace() { final String location = _locationGroup.getLocation().toOSString(); IPath projectPath = Path.fromOSString( location ); return Platform.getLocation().isPrefixOf( projectPath ); } public void setLocation( IPath path ) { fWorkspaceRadio.setSelection( path == null ); if( path != null ) { fLocation.setText( path.toOSString() ); } else { fLocation.setText( getDefaultPath( _nameGroup.getName() ) ); } fireEvent(); } /* * (non-Javadoc) * * @see org.eclipse.jdt.internal.ui.wizards.dialogfields.IStringButtonAdapter # * changeControlPressed(org.eclipse.jdt.internal.ui.wizards.dialogfields .DialogField) */ public void changeControlPressed( DialogField field ) { final DirectoryDialog dialog = new DirectoryDialog( getShell() ); dialog.setMessage( Messages.NewBlackBerryProjectWizardPageOne_directory_message ); String directoryName = fLocation.getText().trim(); if( directoryName.length() == 0 ) { String prevLocation = JavaPlugin.getDefault().getDialogSettings().get( DIALOGSTORE_LAST_EXTERNAL_LOC ); if( prevLocation != null ) { directoryName = prevLocation; } } if( directoryName.length() > 0 ) { final File path = new File( directoryName ); if( path.exists() ) dialog.setFilterPath( directoryName ); } final String selectedDirectory = dialog.open(); if( selectedDirectory != null ) { String oldDirectory = new Path( fLocation.getText().trim() ).lastSegment(); fLocation.setText( selectedDirectory ); String lastSegment = new Path( selectedDirectory ).lastSegment(); if( lastSegment != null && ( _nameGroup.getName().length() == 0 || _nameGroup.getName().equals( oldDirectory ) ) ) { _nameGroup.setName( lastSegment ); } JavaPlugin.getDefault().getDialogSettings().put( DIALOGSTORE_LAST_EXTERNAL_LOC, selectedDirectory ); } } /* * (non-Javadoc) * * @see org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener * #dialogFieldChanged(org.eclipse.jdt.internal.ui.wizards.dialogfields. DialogField) */ public void dialogFieldChanged( DialogField field ) { if( field == fWorkspaceRadio ) { final boolean checked = fWorkspaceRadio.isSelected(); if( checked ) { fPreviousExternalLocation = fLocation.getText(); fLocation.setText( getDefaultPath( _nameGroup.getName() ) ); } else { fLocation.setText( fPreviousExternalLocation ); } } fireEvent(); } } private final class WorkingSetGroup { private WorkingSetConfigurationBlock fWorkingSetBlock; public WorkingSetGroup() { String[] workingSetIds = new String[] { IWorkingSetIDs.JAVA, IWorkingSetIDs.RESOURCE }; fWorkingSetBlock = new WorkingSetConfigurationBlock( workingSetIds, JavaPlugin.getDefault().getDialogSettings() ); // fWorkingSetBlock.setDialogMessage(NewWizardMessages.NewBlackBerryProjectWizardPageOne_WorkingSetSelection_message); } public Control createControl( Composite composite ) { Group workingSetGroup = new Group( composite, SWT.NONE ); workingSetGroup.setFont( composite.getFont() ); workingSetGroup.setText( Messages.NewBlackBerryProjectWizardPageOne_WorkingSets_group ); workingSetGroup.setLayout( new GridLayout( 1, false ) ); fWorkingSetBlock.createContent( workingSetGroup ); return workingSetGroup; } public void setWorkingSets( IWorkingSet[] workingSets ) { fWorkingSetBlock.setWorkingSets( workingSets ); } public IWorkingSet[] getSelectedWorkingSets() { return fWorkingSetBlock.getSelectedWorkingSets(); } } /** * Show a various warnings such as when the project location is existing directory; or the the compiler user selected does not * match the workspace default level etc. */ private final class DetectGroup extends Observable implements Observer, SelectionListener { private Link fHintText; private Label fIcon; private boolean _detectState; public DetectGroup() { _detectState = false; } public Control createControl( Composite parent ) { Composite composite = new Composite( parent, SWT.NONE ); composite.setLayoutData( new GridData( SWT.FILL, SWT.TOP, true, false ) ); GridLayout layout = new GridLayout( 2, false ); layout.horizontalSpacing = 10; composite.setLayout( layout ); fIcon = new Label( composite, SWT.LEFT ); fIcon.setImage( Dialog.getImage( Dialog.DLG_IMG_MESSAGE_WARNING ) ); GridData gridData = new GridData( SWT.LEFT, SWT.CENTER, false, false ); fIcon.setLayoutData( gridData ); fHintText = new Link( composite, SWT.WRAP ); fHintText.setFont( composite.getFont() ); fHintText.addSelectionListener( this ); gridData = new GridData( GridData.FILL, SWT.FILL, true, true ); gridData.widthHint = convertWidthInCharsToPixels( 50 ); gridData.heightHint = convertHeightInCharsToPixels( 3 ); fHintText.setLayoutData( gridData ); handlePossibleJVMChange(); return composite; } public void handlePossibleJVMChange() { // alert user if there is no default VM installed if( JavaRuntime.getDefaultVMInstall() == null ) { fHintText.setText( Messages.NewBlackBerryProjectWizardPageOne_NoJREFound_link ); fHintText.setVisible( true ); fIcon.setImage( Dialog.getImage( Dialog.DLG_IMG_MESSAGE_WARNING ) ); fIcon.setVisible( true ); return; } // alert user if user selected compiler compliance level is different from workspace default String selectedCompliance = _JREGroup.getSelectedCompilerCompliance(); if( selectedCompliance != null ) { String defaultCompliance = JavaCore.getOption( JavaCore.COMPILER_COMPLIANCE ); if( selectedCompliance.equals( defaultCompliance ) ) { fHintText.setVisible( false ); fIcon.setVisible( false ); } else { fHintText.setText( NLS.bind( Messages.NewBlackBerryProjectWizardPageOne_DetectGroup_differendWorkspaceCC_message, new String[] { BasicElementLabels.getVersionName( defaultCompliance ), BasicElementLabels.getVersionName( selectedCompliance ) } ) ); fHintText.setVisible( true ); fIcon.setImage( Dialog.getImage( Dialog.DLG_IMG_MESSAGE_INFO ) ); fIcon.setVisible( true ); } return; } // alert user if current JVM compliance level is different from workspace one selectedCompliance = JavaCore.getOption( JavaCore.COMPILER_COMPLIANCE ); IVMInstall selectedJVM = _JREGroup.getSelectedJVM(); // no BlackBerry JRE is installed if( selectedJVM == null ) { fHintText.setVisible( false ); fIcon.setVisible( false ); return; } String jvmCompliance = JavaCore.VERSION_1_4; if( selectedJVM instanceof IVMInstall2 ) { jvmCompliance = JavaModelUtil.getCompilerCompliance( (IVMInstall2) selectedJVM, JavaCore.VERSION_1_4 ); } if( !selectedCompliance.equals( jvmCompliance ) && ( JavaModelUtil.is50OrHigher( selectedCompliance ) || JavaModelUtil.is50OrHigher( jvmCompliance ) ) ) { if( selectedCompliance.equals( JavaCore.VERSION_1_5 ) ) selectedCompliance = "5.0"; //$NON-NLS-1$ else if( selectedCompliance.equals( JavaCore.VERSION_1_6 ) ) selectedCompliance = "6.0"; //$NON-NLS-1$ fHintText.setText( NLS.bind( Messages.NewBlackBerryProjectWizardPageOne_DetectGroup_jre_message, new String[] { BasicElementLabels.getVersionName( selectedCompliance ), BasicElementLabels.getVersionName( jvmCompliance ) } ) ); fHintText.setVisible( true ); fIcon.setImage( Dialog.getImage( Dialog.DLG_IMG_MESSAGE_WARNING ) ); fIcon.setVisible( true ); } else { fHintText.setVisible( false ); fIcon.setVisible( false ); } } /** * Detects if the project location is on existing directory. * * @return <code>true</code> if yes; otherwise return <code>false</code> */ private boolean computeDetectState() { if( _locationGroup.isWorkspaceRadioSelected() ) { String name = _nameGroup.getName(); if( name.length() == 0 || JavaPlugin.getWorkspace().getRoot().findMember( name ) != null ) { return false; } else { final File directory = _locationGroup.getLocation().append( name ).toFile(); return directory.isDirectory(); } } else { final File directory = _locationGroup.getLocation().toFile(); return directory.isDirectory(); } } /** * @see java.util.Observer#update(Observable, Object) */ public void update( Observable o, Object arg ) { if( o instanceof LocationGroup ) { boolean oldDetectState = _detectState; _detectState = computeDetectState(); if( oldDetectState != _detectState ) { setChanged(); notifyObservers(); if( _detectState ) { fHintText.setVisible( true ); fHintText.setText( Messages.NewBlackBerryProjectWizardPageOne_DetectGroup_message ); fIcon.setImage( Dialog.getImage( Dialog.DLG_IMG_MESSAGE_INFO ) ); fIcon.setVisible( true ); } else { handlePossibleJVMChange(); } } } } /** * Returns if the project is created on an existing directory. * * @return <code>true</code> if yes; otherwise return <code>false</code> */ public boolean isProjectCreatedOnExistingFolder() { return _detectState; } /** * Handle widget selection. * * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse .swt.events.SelectionEvent) */ public void widgetSelected( SelectionEvent e ) { widgetDefaultSelected( e ); } /** * Handle default widget selection. * * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org .eclipse.swt.events.SelectionEvent) */ public void widgetDefaultSelected( SelectionEvent e ) { String jreID = BuildPathSupport.JRE_PREF_PAGE_ID; String eeID = BuildPathSupport.EE_PREF_PAGE_ID; String complianceId = CompliancePreferencePage.PREF_ID; Map data = new HashMap(); data.put( PropertyAndPreferencePage.DATA_NO_LINK, Boolean.TRUE ); String id = "JRE".equals( e.text ) ? jreID : complianceId; //$NON-NLS-1$ PreferencesUtil.createPreferenceDialogOn( getShell(), id, new String[] { jreID, complianceId, eeID }, data ).open(); _JREGroup.handlePossibleJVMChange(); handlePossibleJVMChange(); } } /** * Validate this page and show appropriate warnings and error NewWizardMessages. */ private final class Validator implements Observer { public void update( Observable o, Object arg ) { final IWorkspace workspace = JavaPlugin.getWorkspace(); final String name = _nameGroup.getName(); // check whether the project name field is empty if( name.length() == 0 ) { setErrorMessage( null ); setMessage( Messages.NewBlackBerryProjectWizardPageOne_Message_enterProjectName ); setPageComplete( false ); return; } // check whether the project name is valid final IStatus nameStatus = workspace.validateName( name, IResource.PROJECT ); if( !nameStatus.isOK() ) { setErrorMessage( nameStatus.getMessage() ); setPageComplete( false ); return; } // check whether project already exists final IProject handle = workspace.getRoot().getProject( name ); if( handle.exists() ) { setErrorMessage( Messages.NewBlackBerryProjectWizardPageOne_Message_projectAlreadyExists ); setPageComplete( false ); return; } IPath projectLocation = ResourcesPlugin.getWorkspace().getRoot().getLocation().append( name ); if( projectLocation.toFile().exists() ) { try { // correct casing String canonicalPath = projectLocation.toFile().getCanonicalPath(); projectLocation = new Path( canonicalPath ); } catch( IOException e ) { JavaPlugin.log( e ); } String existingName = projectLocation.lastSegment(); if( !existingName.equals( _nameGroup.getName() ) ) { setErrorMessage( NLS.bind( Messages.NewBlackBerryProjectWizardPageOne_Message_invalidProjectNameForWorkspaceRoot, BasicElementLabels.getResourceName( existingName ) ) ); setPageComplete( false ); return; } } final String location = _locationGroup.getLocation().toOSString(); // check whether location is empty if( location.length() == 0 ) { setErrorMessage( null ); setMessage( Messages.NewBlackBerryProjectWizardPageOne_Message_enterLocation ); setPageComplete( false ); return; } // check whether the location is a syntactically correct path if( !Path.EMPTY.isValidPath( location ) ) { setErrorMessage( Messages.NewBlackBerryProjectWizardPageOne_Message_invalidDirectory ); setPageComplete( false ); return; } IPath projectPath = Path.fromOSString( location ); if( _locationGroup.isWorkspaceRadioSelected() ) projectPath = projectPath.append( _nameGroup.getName() ); if( projectPath.toFile().exists() ) {// create from existing source IPath sourcePath = Platform.getLocation(); if( sourcePath.isPrefixOf( projectPath ) ) { // create // from // existing // source // in // workspace if( !Platform.getLocation().equals( projectPath.removeLastSegments( 1 ) ) ) { setErrorMessage( Messages.NewBlackBerryProjectWizardPageOne_Message_notOnWorkspaceRoot ); setPageComplete( false ); return; } if( !projectPath.toFile().exists() ) { setErrorMessage( Messages.NewBlackBerryProjectWizardPageOne_Message_notExisingProjectOnWorkspaceRoot ); setPageComplete( false ); return; } } else if( projectPath.isPrefixOf( sourcePath ) ) { setErrorMessage( NLS.bind( Messages.NewBlackBerryProjectWizardPageOne_ExistingSrcLocOverlapsWSMsg, projectPath.toOSString(), sourcePath.toOSString() ) ); setPageComplete( false ); return; } } else if( !_locationGroup.isWorkspaceRadioSelected() ) {// create // at non // existing // external // location if( !canCreate( projectPath.toFile() ) ) { setErrorMessage( Messages.NewBlackBerryProjectWizardPageOne_Message_cannotCreateAtExternalLocation ); setPageComplete( false ); return; } // If we do not place the contents in the workspace validate the // location. final IStatus locationStatus = workspace.validateProjectLocation( handle, projectPath ); if( !locationStatus.isOK() ) { setErrorMessage( locationStatus.getMessage() ); setPageComplete( false ); return; } } // check whether there is BB-JRE installed if( VMUtils.getInstalledBBVMs().isEmpty() ) { setErrorMessage( Messages.NewBlackBerryProjectWizardPageOne_Message_noBBJREInstalled ); setPageComplete( false ); return; } // handle the case where project is created on existing source boolean onExistingFolder = _detectGroup.isProjectCreatedOnExistingFolder(); _JREGroup.setEnabled( !onExistingFolder ); // Start Fix for IDT 321272 if( !onExistingFolder ) { // check whether there is a valid BB-JRE selected IVMInstall vm = _JREGroup.getSelectedJVM(); if( vm == null ) { setErrorMessage( Messages.NewBlackBerryProjectWizardPageOne_Message_noJRESelected ); setPageComplete( false ); return; } // check if the JRE is BlackBerry JRE IVMInstallType vmType = vm.getVMInstallType(); if( !BlackBerryVMInstallType.VM_ID.equals( vmType.getId() ) ) { setErrorMessage( Messages.NewBlackBerryProjectWizardPageOne_Message_nonBBDefaultJRESelected ); setPageComplete( false ); return; } } // End Fix for IDT 321272 setPageComplete( true ); setErrorMessage( null ); setMessage( null ); } private boolean canCreate( File file ) { while( !file.exists() ) { file = file.getParentFile(); if( file == null ) return false; } return file.canWrite(); } } /** * The wizard owning this page can call this method to initialize the fields from the current selection and active part. * * @param selection * used to initialize the fields * @param activePart * the (typically active) part to initialize the fields or <code>null</code> */ public void init( IStructuredSelection selection, IWorkbenchPart activePart ) { setWorkingSets( getSelectedWorkingSet( selection, activePart ) ); } private void initializeDefaultVM() { JavaRuntime.getDefaultVMInstall(); } /** * Creates the control. * * @param parent * The parent composite * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets .Composite) */ public void createControl( Composite parent ) { initializeDialogUnits( parent ); final Composite container = new Composite( parent, SWT.NULL ); container.setFont( parent.getFont() ); container.setLayout( initGridLayout( new GridLayout( 1, false ), true ) ); container.setLayoutData( new GridData( GridData.HORIZONTAL_ALIGN_FILL ) ); // create UI elements Control nameControl = createNameControl( container ); nameControl.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) ); Control locationControl = createLocationControl( container ); locationControl.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) ); Control jreControl = createJRESelectionControl( container ); jreControl.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) ); Control workingSetControl = createWorkingSetControl( container ); workingSetControl.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) ); Control infoControl = createInfoControl( container ); infoControl.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) ); setControl( container ); } protected void setControl( Control newControl ) { Dialog.applyDialogFont( newControl ); PlatformUI.getWorkbench().getHelpSystem().setHelp( newControl, IJavaHelpContextIds.NEW_JAVAPROJECT_WIZARD_PAGE ); super.setControl( newControl ); } /** * Creates the controls for the name field. * * @param composite * the parent composite * @return the created control */ protected Control createNameControl( Composite composite ) { return _nameGroup.createControl( composite ); } /** * Creates the controls for the location field. * * @param composite * the parent composite * @return the created control */ protected Control createLocationControl( Composite composite ) { return _locationGroup.createControl( composite ); } /** * Creates the controls for the JRE selection * * @param composite * the parent composite * @return the created control */ protected Control createJRESelectionControl( Composite composite ) { return _JREGroup.createControl( composite ); } /** * Creates the controls for the working set selection. * * @param composite * the parent composite * @return the created control */ protected Control createWorkingSetControl( Composite composite ) { return _workingSetGroup.createControl( composite ); } /** * Creates the controls for the info section. * * @param composite * the parent composite * @return the created control */ protected Control createInfoControl( Composite composite ) { return _detectGroup.createControl( composite ); } /** * Gets a project name for the new project. * * @return the new project resource handle */ public String getProjectName() { return _nameGroup.getName(); } /** * Sets the name of the new project * * @param name * The new name */ public void setProjectName( String name ) { if( name == null ) throw new IllegalArgumentException(); _nameGroup.setName( name ); } /** * Returns the current project location path as entered by the user, or <code>null</code> if the project should be created in * the workspace. * * @return the project location path or its anticipated initial value. */ public URI getProjectLocationURI() { if( _locationGroup.isLocationInWorkspace() ) { return null; } return URIUtil.toURI( _locationGroup.getLocation() ); } /** * Sets the project location of the new project or <code>null</code> if the project should be created in the workspace * * @param uri * the new project location */ public void setProjectLocationURI( URI uri ) { IPath path = uri != null ? URIUtil.toPath( uri ) : null; _locationGroup.setLocation( path ); } public void setDefaultJRE() { _JREGroup.setDefaultJRESelected(); } /** * Returns the compiler compliance to be used for the project, or <code>null</code> to use the workspace compiler compliance. * * @return compiler compliance to be used for the project or <code>null</code> */ public String getCompilerCompliance() { return _JREGroup.getSelectedCompilerCompliance(); } /** * Returns the default class path entries to be added on new projects. By default this is the JRE container as selected by the * user. * * @return returns the default class path entries */ public IClasspathEntry[] getDefaultClasspathEntries() { IPath newPath = _JREGroup.getJREContainerPath(); if( newPath != null ) { return new IClasspathEntry[] { JavaCore.newContainerEntry( newPath ) }; } return PreferenceConstants.getDefaultJRELibrary(); } /** * Returns the source class path entries to be added on new projects. The underlying resources may not exist. All entries that * are returned must be of kind {@link IClasspathEntry#CPE_SOURCE}. * * @return returns the source class path entries for the new project */ public IClasspathEntry[] getSourceClasspathEntries() { List< IClasspathEntry > entries = new ArrayList< IClasspathEntry >(); IPath sourceFolderPath = new Path( getProjectName() ).makeAbsolute(); IPath srcPath = new Path( PreferenceConstants.getPreferenceStore().getString( PreferenceConstants.SRCBIN_SRCNAME ) ); sourceFolderPath = sourceFolderPath.append( srcPath ); entries.add( JavaCore.newSourceEntry( sourceFolderPath ) ); // create res folder String resFolderName = ImportUtils.getImportPref( LegacyImportHelper.PROJECT_RES_FOLDER_NAME_KEY ); if( resFolderName.length() > 0 ) { IPath resFolderPath = new Path( getProjectName() ).makeAbsolute(); IPath resPath = new Path( resFolderName ); resFolderPath = resFolderPath.append( resPath ); entries.add( JavaCore.newSourceEntry( resFolderPath ) ); } return entries.toArray( new IClasspathEntry[ 0 ] ); } /** * Returns the source class path entries to be added on new projects. The underlying resource may not exist. * * @return returns the default class path entries */ public IPath getOutputLocation() { IPath outputLocationPath = new Path( getProjectName() ).makeAbsolute(); IPath binPath = new Path( PreferenceConstants.getPreferenceStore().getString( PreferenceConstants.SRCBIN_BINNAME ) ); if( binPath.segmentCount() > 0 ) { outputLocationPath = outputLocationPath.append( binPath ); } return outputLocationPath; } /** * Returns the working sets to which the new project should be added. * * @return the selected working sets to which the new project should be added */ public IWorkingSet[] getWorkingSets() { return _workingSetGroup.getSelectedWorkingSets(); } /** * Sets the working sets to which the new project should be added. * * @param workingSets * The initial selected working sets */ public void setWorkingSets( IWorkingSet[] workingSets ) { if( workingSets == null ) { throw new IllegalArgumentException(); } _workingSetGroup.setWorkingSets( workingSets ); } /** * Set the visibility of the wizard page. * * @param visible * The visibility * @see org.eclipse.jface.dialogs.DialogPage#setVisible(boolean) */ public void setVisible( boolean visible ) { super.setVisible( visible ); if( visible ) { _nameGroup.postSetFocus(); } } private IWorkingSet[] getSelectedWorkingSet( IStructuredSelection selection, IWorkbenchPart activePart ) { IWorkingSet[] selected = getSelectedWorkingSet( selection ); if( selected != null && selected.length > 0 ) { for( int i = 0; i < selected.length; i++ ) { if( !isValidWorkingSet( selected[ i ] ) ) return EMPTY_WORKING_SET_ARRAY; } return selected; } if( !( activePart instanceof PackageExplorerPart ) ) return EMPTY_WORKING_SET_ARRAY; PackageExplorerPart explorerPart = (PackageExplorerPart) activePart; if( explorerPart.getRootMode() == PackageExplorerPart.PROJECTS_AS_ROOTS ) { // Get active filter IWorkingSet filterWorkingSet = explorerPart.getFilterWorkingSet(); if( filterWorkingSet == null ) return EMPTY_WORKING_SET_ARRAY; if( !isValidWorkingSet( filterWorkingSet ) ) return EMPTY_WORKING_SET_ARRAY; return new IWorkingSet[] { filterWorkingSet }; } else { // If we have been gone into a working set return the working set Object input = explorerPart.getViewPartInput(); if( !( input instanceof IWorkingSet ) ) return EMPTY_WORKING_SET_ARRAY; IWorkingSet workingSet = (IWorkingSet) input; if( !isValidWorkingSet( workingSet ) ) return EMPTY_WORKING_SET_ARRAY; return new IWorkingSet[] { workingSet }; } } private IWorkingSet[] getSelectedWorkingSet( IStructuredSelection selection ) { if( !( selection instanceof ITreeSelection ) ) return EMPTY_WORKING_SET_ARRAY; ITreeSelection treeSelection = (ITreeSelection) selection; if( treeSelection.isEmpty() ) return EMPTY_WORKING_SET_ARRAY; List elements = treeSelection.toList(); if( elements.size() == 1 ) { Object element = elements.get( 0 ); TreePath[] paths = treeSelection.getPathsFor( element ); if( paths.length != 1 ) return EMPTY_WORKING_SET_ARRAY; TreePath path = paths[ 0 ]; if( path.getSegmentCount() == 0 ) return EMPTY_WORKING_SET_ARRAY; Object candidate = path.getSegment( 0 ); if( !( candidate instanceof IWorkingSet ) ) return EMPTY_WORKING_SET_ARRAY; IWorkingSet workingSetCandidate = (IWorkingSet) candidate; if( isValidWorkingSet( workingSetCandidate ) ) return new IWorkingSet[] { workingSetCandidate }; return EMPTY_WORKING_SET_ARRAY; } ArrayList result = new ArrayList(); for( Iterator iterator = elements.iterator(); iterator.hasNext(); ) { Object element = iterator.next(); if( element instanceof IWorkingSet && isValidWorkingSet( (IWorkingSet) element ) ) { result.add( element ); } } return (IWorkingSet[]) result.toArray( new IWorkingSet[ result.size() ] ); } private static boolean isValidWorkingSet( IWorkingSet workingSet ) { String id = workingSet.getId(); if( !IWorkingSetIDs.JAVA.equals( id ) && !IWorkingSetIDs.RESOURCE.equals( id ) ) return false; if( workingSet.isAggregateWorkingSet() ) return false; return true; } }