| /******************************************************************************* |
| * Copyright (c) 2000, 2009 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v2.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.wst.jsdt.ui.wizards; |
| |
| import java.lang.reflect.InvocationTargetException; |
| import java.net.URI; |
| |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.NullProgressMonitor; |
| import org.eclipse.core.runtime.OperationCanceledException; |
| import org.eclipse.core.runtime.SubProgressMonitor; |
| import org.eclipse.jface.dialogs.Dialog; |
| import org.eclipse.jface.operation.IRunnableWithProgress; |
| import org.eclipse.swt.SWT; |
| 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.ui.PlatformUI; |
| import org.eclipse.wst.jsdt.core.IIncludePathEntry; |
| import org.eclipse.wst.jsdt.core.IJavaScriptProject; |
| import org.eclipse.wst.jsdt.internal.ui.IJavaHelpContextIds; |
| import org.eclipse.wst.jsdt.internal.ui.util.BusyIndicatorRunnableContext; |
| import org.eclipse.wst.jsdt.internal.ui.wizards.IStatusChangeListener; |
| import org.eclipse.wst.jsdt.internal.ui.wizards.NewWizardMessages; |
| import org.eclipse.wst.jsdt.internal.ui.wizards.buildpaths.BuildPathsBlock; |
| |
| /** |
| * Standard wizard page for creating new JavaScript projects. This page can be used in |
| * project creation wizards. The page shows UI to configure the project with a JavaScript |
| * build path and output location. On finish the page will also configure the JavaScript nature. |
| * <p> |
| * This is a replacement for <code>NewJavaProjectWizardPage</code> with a cleaner API. |
| * </p> |
| * <p> |
| * Clients may instantiate or subclass. |
| * </p> |
| * |
| * |
| * Provisional API: This class/interface is part of an interim API that is still under development and expected to |
| * change significantly before reaching stability. It is being made available at this early stage to solicit feedback |
| * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken |
| * (repeatedly) as the API evolves. */ |
| public class JavaCapabilityConfigurationPage extends NewElementWizardPage { |
| |
| private static final String PAGE_NAME= "JavaScriptCapabilityConfigurationPage"; //$NON-NLS-1$ |
| |
| private IJavaScriptProject fJavaScriptProject; |
| private BuildPathsBlock fBuildPathsBlock; |
| |
| /** |
| * Creates a wizard page that can be used in a JavaScript project creation wizard. |
| * It contains UI to configure a the classpath. |
| * |
| * <p> |
| * After constructing, a call to {@link #init(IJavaScriptProject, IPath, IIncludePathEntry[], boolean)} is required. |
| * </p> |
| */ |
| public JavaCapabilityConfigurationPage() { |
| super(PAGE_NAME); |
| fJavaScriptProject= null; |
| |
| setTitle(NewWizardMessages.JavaCapabilityConfigurationPage_title); |
| setDescription(NewWizardMessages.JavaCapabilityConfigurationPage_description); |
| } |
| |
| protected BuildPathsBlock getBuildPathsBlock() { |
| if (fBuildPathsBlock == null) { |
| IStatusChangeListener listener= new IStatusChangeListener() { |
| public void statusChanged(IStatus status) { |
| updateStatus(status); |
| } |
| }; |
| fBuildPathsBlock= new BuildPathsBlock(new BusyIndicatorRunnableContext(), listener, 0, useNewSourcePage(), null); |
| } |
| return fBuildPathsBlock; |
| } |
| |
| /* |
| * @see org.eclipse.jface.dialogs.DialogPage#dispose() |
| * |
| */ |
| public void dispose() { |
| try { |
| super.dispose(); |
| } finally { |
| if (fBuildPathsBlock != null) { |
| fBuildPathsBlock.dispose(); |
| fBuildPathsBlock= null; |
| } |
| } |
| } |
| |
| /** |
| * Clients can override this method to choose if the new source page is used. The new source page |
| * requires that the project is already created as JavaScript project. The page will directly manipulate the classpath. |
| * By default <code>false</code> is returned. |
| * @return Returns <code>true</code> if the new source page should be used. |
| * |
| */ |
| protected boolean useNewSourcePage() { |
| return false; |
| } |
| |
| /** |
| * Initializes the page with the project and default classpath. |
| * <p> |
| * The default classpath entries must correspond the given project. |
| * </p> |
| * <p> |
| * The caller of this method is responsible for creating the underlying project. The page will create the output, |
| * source and library folders if required. |
| * </p> |
| * <p> |
| * The project does not have to exist at the time of initialization, but must exist when executing the runnable |
| * obtained by <code>getRunnable()</code>. |
| * </p> |
| * @param jproject The JavaScript project. |
| * @param defaultOutputLocation The default classpath entries or <code>null</code> to let the page choose the default |
| * @param defaultEntries The folder to be taken as the default output path or <code>null</code> to let the page choose the default |
| * @param defaultsOverrideExistingClasspath If set to <code>true</code>, an existing '.classpath' file is ignored. If set to <code>false</code> |
| * the given default classpath and output location is only used if no '.classpath' exists. |
| */ |
| public void init(IJavaScriptProject jproject, IIncludePathEntry[] defaultEntries, boolean defaultsOverrideExistingClasspath) { |
| if (!defaultsOverrideExistingClasspath && jproject.exists() && jproject.getJSDTScopeFile().exists()) { //$NON-NLS-1$ |
| |
| defaultEntries= null; |
| } |
| getBuildPathsBlock().init(jproject, defaultEntries); |
| fJavaScriptProject= jproject; |
| } |
| |
| /* (non-Javadoc) |
| * @see WizardPage#createControl |
| */ |
| public void createControl(Composite parent) { |
| Composite composite= new Composite(parent, SWT.NONE); |
| composite.setFont(parent.getFont()); |
| composite.setLayout(new GridLayout(1, false)); |
| Control control= getBuildPathsBlock().createControl(composite); |
| control.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); |
| Dialog.applyDialogFont(composite); |
| PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IJavaHelpContextIds.NEW_JAVAPROJECT_WIZARD_PAGE); |
| setControl(composite); |
| } |
| |
| /** |
| * Returns the currently configured output location. Note that the returned path |
| * might not be a valid path. |
| * |
| * @return the currently configured output location |
| */ |
| public IPath getOutputLocation() { |
| return getBuildPathsBlock().getOutputLocation(); |
| } |
| |
| /** |
| * Returns the currently configured classpath. Note that the classpath might |
| * not be valid. |
| * |
| * @return the currently configured classpath |
| */ |
| public IIncludePathEntry[] getRawClassPath() { |
| return getBuildPathsBlock().getRawClassPath(); |
| } |
| |
| /** |
| * Returns the JavaScript project that was passed in {@link #init(IJavaScriptProject, IPath, IIncludePathEntry[], boolean)} or <code>null</code> if the |
| * page has not been initialized yet. |
| * |
| * @return the managed JavaScript project or <code>null</code> |
| */ |
| public IJavaScriptProject getJavaProject() { |
| return fJavaScriptProject; |
| } |
| |
| |
| /** |
| * Returns the runnable that will create the JavaScript project or <code>null</code> if the page has |
| * not been initialized. The runnable sets the project's classpath and output location to the values |
| * configured in the page and adds the JavaScript nature if not set yet. The method requires that the |
| * project is created and opened. |
| * |
| * @return the runnable that creates the new JavaScript project |
| */ |
| public IRunnableWithProgress getRunnable() { |
| if (getJavaProject() != null) { |
| return new IRunnableWithProgress() { |
| public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { |
| try { |
| configureJavaProject(monitor); |
| } catch (CoreException e) { |
| throw new InvocationTargetException(e); |
| } |
| } |
| }; |
| } |
| return null; |
| } |
| |
| /** |
| * Helper method to create and open a IProject. The project location |
| * is configured. No natures are added. |
| * |
| * @param project The handle of the project to create. |
| * @param locationURI The location of the project or <code>null</code> to create the project in the workspace |
| * @param monitor a progress monitor to report progress or <code>null</code> if |
| * progress reporting is not desired |
| * @throws CoreException if the project couldn't be created |
| * @see org.eclipse.core.resources.IProjectDescription#setLocationURI(java.net.URI) |
| * |
| */ |
| public static void createProject(IProject project, URI locationURI, IProgressMonitor monitor) throws CoreException { |
| BuildPathsBlock.createProject(project, locationURI, monitor); |
| } |
| |
| /** |
| * Adds the JavaScript nature to the project (if not set yet) and configures the build classpath. |
| * |
| * @param monitor a progress monitor to report progress or <code>null</code> if |
| * progress reporting is not desired |
| * @throws CoreException Thrown when the configuring the JavaScript project failed. |
| * @throws InterruptedException Thrown when the operation has been canceled. |
| */ |
| public void configureJavaProject(IProgressMonitor monitor) throws CoreException, InterruptedException { |
| if (monitor == null) { |
| monitor= new NullProgressMonitor(); |
| } |
| |
| int nSteps= 6; |
| monitor.beginTask(NewWizardMessages.JavaCapabilityConfigurationPage_op_desc_java, nSteps); |
| |
| try { |
| IProject project= getJavaProject().getProject(); |
| BuildPathsBlock.addJavaNature(project, new SubProgressMonitor(monitor, 1)); |
| getBuildPathsBlock().configureJavaProject(new SubProgressMonitor(monitor, 5)); |
| } catch (OperationCanceledException e) { |
| throw new InterruptedException(); |
| } finally { |
| monitor.done(); |
| } |
| } |
| |
| /** |
| * Transfers the focus into this page. |
| * |
| * |
| */ |
| protected void setFocus() { |
| getBuildPathsBlock().setFocus(); |
| } |
| } |