/******************************************************************************* * Copyright (c) 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 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 * Zend Technologies *******************************************************************************/ package org.eclipse.php.internal.ui.wizards; import java.io.*; import java.lang.reflect.InvocationTargetException; import java.net.URI; import java.net.URISyntaxException; import java.util.Observable; import java.util.Observer; import org.eclipse.core.filesystem.EFS; import org.eclipse.core.filesystem.IFileStore; 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.*; import org.eclipse.dltk.core.DLTKCore; import org.eclipse.dltk.core.environment.EnvironmentManager; import org.eclipse.dltk.core.environment.IEnvironment; import org.eclipse.dltk.internal.corext.util.Messages; import org.eclipse.dltk.internal.ui.util.CoreUtility; import org.eclipse.dltk.internal.ui.wizards.NewWizardMessages; import org.eclipse.dltk.internal.ui.wizards.dialogfields.*; import org.eclipse.dltk.ui.DLTKUIPlugin; import org.eclipse.dltk.ui.environment.IEnvironmentUI; import org.eclipse.dltk.ui.util.ExceptionHandler; import org.eclipse.dltk.ui.wizards.NewElementWizard; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.php.core.PHPVersion; import org.eclipse.php.internal.ui.IPHPHelpContextIds; import org.eclipse.php.internal.ui.PHPUIMessages; import org.eclipse.php.internal.ui.PHPUiPlugin; import org.eclipse.php.internal.ui.preferences.*; import org.eclipse.php.internal.ui.workingset.IWorkingSetIds; import org.eclipse.php.ui.util.PHPProjectUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; 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.*; import org.eclipse.ui.IWorkingSet; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation; import org.eclipse.ui.dialogs.PreferencesUtil; import org.eclipse.ui.dialogs.WorkingSetConfigurationBlock; import org.eclipse.ui.internal.WorkbenchMessages; import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer; /** * The first page of the <code>SimpleProjectWizard</code>. */ public class PHPProjectWizardFirstPage extends WizardPage implements IPHPProjectCreateWizardPage { public PHPProjectWizardFirstPage() { super(PAGE_NAME); setPageComplete(false); setTitle(NewWizardMessages.ScriptProjectWizardFirstPage_page_title); setDescription(NewWizardMessages.ScriptProjectWizardFirstPage_page_description); fInitialName = ""; //$NON-NLS-1$ } private static final String FILENAME_PROJECT = ".project"; //$NON-NLS-1$ protected static final String FILENAME_BUILDPATH = ".buildpath"; //$NON-NLS-1$ protected URI fCurrProjectLocation; // null if location is platform location private boolean fKeepContent; private boolean fProjectCreated = false; private File fDotProjectBackup; private File fDotBuildpathBackup; private Boolean fIsAutobuild; private static final String PAGE_NAME = NewWizardMessages.ScriptProjectWizardFirstPage_page_title; public static final String ERROR_MESSAGE = "ErrorMessage"; //$NON-NLS-1$ protected Validator fPdtValidator; protected String fInitialName; protected NameGroup fNameGroup; protected DetectGroup fDetectGroup; protected VersionGroup fVersionGroup; protected JavaScriptSupportGroup fJavaScriptSupportGroup; protected LayoutGroup fLayoutGroup; protected LocationGroup fPHPLocationGroup; protected WorkingSetGroup fWorkingSetGroup; protected WizardFragment fragment; @Override public void createControl(Composite parent) { initializeDialogUnits(parent); Composite main = new Composite(parent, SWT.NONE); main.setLayout(new GridLayout()); ScrolledComposite sc = new ScrolledComposite(main, SWT.H_SCROLL | SWT.V_SCROLL); sc.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).hint(SWT.DEFAULT, SWT.DEFAULT).create()); final Composite composite = new Composite(sc, SWT.NULL); composite.setFont(parent.getFont()); composite.setLayout(new GridLayout(1, false)); composite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); // create UI elements fNameGroup = new NameGroup(composite, fInitialName, getShell()); fPHPLocationGroup = new LocationGroup(composite, fNameGroup, getShell()); CompositeData data = new CompositeData(); data.setParetnt(composite); data.setSettings(getDialogSettings()); data.setObserver(fPHPLocationGroup); fragment = (WizardFragment) Platform.getAdapterManager().loadAdapter(data, PHPProjectWizardFirstPage.class.getName()); fVersionGroup = new VersionGroup(this, composite, PHPVersion.PHP5) { @Override public IEnvironment getEnvironment() { return PHPProjectWizardFirstPage.this.getEnvironment(); } }; fLayoutGroup = new LayoutGroup(composite); fJavaScriptSupportGroup = new JavaScriptSupportGroup(composite, this); createWorkingSetGroup(composite, ((PHPProjectCreationWizard) getWizard()).getSelection(), new String[] { IWorkingSetIds.PHP_ID, IWorkingSetIds.RESOURCE_ID, IWorkingSetIds.TASK_ID }); sc.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT)); sc.setContent(composite); sc.setExpandHorizontal(true); sc.setExpandVertical(true); fDetectGroup = new DetectGroup(composite, fPHPLocationGroup, fNameGroup); // establish connections fNameGroup.addObserver(fPHPLocationGroup); fDetectGroup.addObserver(fLayoutGroup); fPHPLocationGroup.addObserver(fDetectGroup); // initialize all elements fNameGroup.notifyObservers(); // create and connect validator fPdtValidator = new Validator(); fNameGroup.addObserver(fPdtValidator); fPHPLocationGroup.addObserver(fPdtValidator); setControl(main); Dialog.applyDialogFont(composite); // set the focus to the project name fNameGroup.postSetFocus(); setHelpContext(composite); } public WorkingSetGroup createWorkingSetGroup(Composite composite, IStructuredSelection selection, String[] supportedWorkingSetTypes) { if (fWorkingSetGroup != null) return fWorkingSetGroup; fWorkingSetGroup = new WorkingSetGroup(composite, selection, supportedWorkingSetTypes); return fWorkingSetGroup; } public boolean isExistingLocation() { return fPHPLocationGroup.isExistingLocation(); } protected void setHelpContext(Composite parent) { PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IPHPHelpContextIds.CREATING_PHP_PROJECTS); } public URI getLocationURI() { IEnvironment environment = getEnvironment(); return environment.getURI(fPHPLocationGroup.getLocation()); } public IEnvironment getEnvironment() { return fPHPLocationGroup.getEnvironment(); } /** * 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 String getProjectName() { return fNameGroup.getName(); } public boolean isInWorkspace() { return fPHPLocationGroup.isInWorkspace(); } public boolean isInLocalServer() { return fPHPLocationGroup.isInLocalServer(); } public boolean getDetect() { return fDetectGroup.mustDetect(); } /** * returns whether this project layout is "detailed" - meaning tree * structure - one folder for source, one for resources * * @return */ public boolean hasPHPSourceFolder() { return fLayoutGroup != null && fLayoutGroup.isDetailedLayout(); } /** * Initialize a grid layout with the default Dialog settings. */ public GridLayout initGridLayout(GridLayout layout, boolean margins) { layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING); if (margins) { layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN); layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN); } else { layout.marginWidth = 0; layout.marginHeight = 0; } return layout; } /** * Validate this page and show appropriate warnings and error * NewWizardMessages. */ public final class Validator implements Observer { @Override public void update(Observable o, Object arg) { final IWorkspace workspace = DLTKUIPlugin.getWorkspace(); final String name = fNameGroup.getName(); // check whether the project name field is empty if (name.length() == 0) { setErrorMessage(null); setMessage(NewWizardMessages.ScriptProjectWizardFirstPage_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 (!isInLocalServer() && handle.exists()) { setErrorMessage(NewWizardMessages.ScriptProjectWizardFirstPage_Message_projectAlreadyExists); setPageComplete(false); return; } IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects(); String newProjectNameLowerCase = name.toLowerCase(); for (IProject currentProject : projects) { String existingProjectName = currentProject.getName(); if (existingProjectName.toLowerCase().equals(newProjectNameLowerCase)) { setErrorMessage(NewWizardMessages.ScriptProjectWizardFirstPage_Message_projectAlreadyExists); setPageComplete(false); return; } } final String location = fPHPLocationGroup.getLocation().toOSString(); // check whether location is empty if (location.length() == 0) { setErrorMessage(null); setMessage(NewWizardMessages.ScriptProjectWizardFirstPage_Message_enterLocation); setPageComplete(false); return; } // check whether the location is a syntactically correct path if (!Path.EMPTY.isValidPath(location)) { setErrorMessage(NewWizardMessages.ScriptProjectWizardFirstPage_Message_invalidDirectory); setPageComplete(false); return; } // check whether the location has the workspace as prefix IPath projectPath = Path.fromOSString(location); if (!fPHPLocationGroup.isInWorkspace() && Platform.getLocation().isPrefixOf(projectPath)) { setErrorMessage(NewWizardMessages.ScriptProjectWizardFirstPage_Message_cannotCreateInWorkspace); setPageComplete(false); return; } // If we do not place the contents in the workspace validate the // location. if (!fPHPLocationGroup.isInWorkspace()) { IEnvironment environment = getEnvironment(); if (EnvironmentManager.isLocal(environment)) { final IStatus locationStatus = workspace.validateProjectLocation(handle, projectPath); if (!locationStatus.isOK()) { setErrorMessage(locationStatus.getMessage()); setPageComplete(false); return; } if (!canCreate(projectPath.toFile())) { setErrorMessage(NewWizardMessages.ScriptProjectWizardFirstPage_Message_invalidDirectory); setPageComplete(false); return; } } } if (fragment != null) { fragment.getWizardModel().putObject("ProjectName", //$NON-NLS-1$ fNameGroup.getName()); if (!fragment.isComplete()) { setErrorMessage((String) fragment.getWizardModel().getObject(ERROR_MESSAGE)); 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(); } /** * GUI for controlling whether a new PHP project should include JavaScript * support or not * * @author alon * */ public class JavaScriptSupportGroup implements SelectionListener { private final Group fGroup; protected Button fEnableJavaScriptSupport; public boolean shouldSupportJavaScript() { return PHPUiPlugin.getDefault().getPreferenceStore() .getBoolean((PreferenceConstants.JavaScriptSupportEnable)); } public JavaScriptSupportGroup(Composite composite, WizardPage projectWizardFirstPage) { final int numColumns = 3; fGroup = new Group(composite, SWT.NONE); fGroup.setFont(composite.getFont()); fGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); fGroup.setLayout(new GridLayout(numColumns, false)); fGroup.setText(PHPUIMessages.JavaScriptSupportGroup_OptionBlockTitle); fEnableJavaScriptSupport = new Button(fGroup, SWT.CHECK | SWT.RIGHT); fEnableJavaScriptSupport.setText(PHPUIMessages.JavaScriptSupportGroup_EnableSupport); fEnableJavaScriptSupport.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false)); fEnableJavaScriptSupport.addSelectionListener(this); fEnableJavaScriptSupport.setSelection(PHPUiPlugin.getDefault().getPreferenceStore() .getBoolean((PreferenceConstants.JavaScriptSupportEnable))); } @Override public void widgetDefaultSelected(SelectionEvent e) { } @Override public void widgetSelected(SelectionEvent e) { } public boolean getSelection() { return fEnableJavaScriptSupport.getSelection(); } } /** * Request a project layout. */ public class LayoutGroup implements Observer, SelectionListener, IDialogFieldListener { private final SelectionButtonDialogField fStdRadio, fSrcBinRadio; private Group fGroup; private Link fPreferenceLink; public LayoutGroup(Composite composite) { final int numColumns = 3; fStdRadio = new SelectionButtonDialogField(SWT.RADIO); fStdRadio.setLabelText(PHPUIMessages.LayoutGroup_OptionBlock_ProjectSrc); fStdRadio.setDialogFieldListener(this); fSrcBinRadio = new SelectionButtonDialogField(SWT.RADIO); fSrcBinRadio.setLabelText(PHPUIMessages.LayoutGroup_OptionBlock_SrcResources); fSrcBinRadio.setDialogFieldListener(this); // getting Preferences default choice boolean useSrcBin = PreferenceConstants.getPreferenceStore() .getBoolean(PreferenceConstants.SRCBIN_FOLDERS_IN_NEWPROJ); fSrcBinRadio.setSelection(useSrcBin); fStdRadio.setSelection(!useSrcBin); // createContent fGroup = new Group(composite, SWT.NONE); fGroup.setFont(composite.getFont()); fGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); fGroup.setLayout(new GridLayout(numColumns, false)); fGroup.setText(PHPUIMessages.LayoutGroup_OptionBlock_Title); fStdRadio.doFillIntoGrid(fGroup, 3); LayoutUtil.setHorizontalGrabbing(fStdRadio.getSelectionButton(null)); fSrcBinRadio.doFillIntoGrid(fGroup, 2); fPreferenceLink = new Link(fGroup, SWT.NONE); fPreferenceLink.setText(PHPUIMessages.ToggleLinkingAction_link_description); fPreferenceLink.setLayoutData(new GridData(SWT.END, SWT.BEGINNING, true, false)); fPreferenceLink.addSelectionListener(this); fPreferenceLink.setEnabled(true); updateEnableState(); } /* * (non-Javadoc) * * @see java.util.Observer#update(java.util.Observable, * java.lang.Object) */ @Override public void update(Observable o, Object arg) { updateEnableState(); } private void updateEnableState() { if (fDetectGroup == null) return; final boolean detect = fDetectGroup.mustDetect(); fStdRadio.setEnabled(!detect); fSrcBinRadio.setEnabled(!detect); if (fGroup != null) { fGroup.setEnabled(!detect); } } /** * Return <code>true</code> if the user specified to create * 'application' and 'public' folders. * * @return returns <code>true</code> if the user specified to create * 'source' and 'bin' folders. */ public boolean isDetailedLayout() { return fSrcBinRadio.isSelected(); } /* * (non-Javadoc) * * @see * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse * .swt.events.SelectionEvent) */ @Override public void widgetSelected(SelectionEvent e) { widgetDefaultSelected(e); } /* * @see * org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener * #dialogFieldChanged(org.eclipse.jdt.internal.ui.wizards.dialogfields. * DialogField) * * @since 3.5 */ @Override public void dialogFieldChanged(DialogField field) { updateEnableState(); } @Override public void widgetDefaultSelected(SelectionEvent e) { String prefID = PHPProjectLayoutPreferencePage.PREF_ID; PreferencesUtil.createPreferenceDialogOn(getShell(), prefID, new String[] { prefID }, null).open(); } } /** * 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. */ public abstract static class VersionGroup extends Observable implements Observer, IStringButtonAdapter, IDialogFieldListener, SelectionListener { private WizardPage page; public final SelectionButtonDialogField fDefaultValues; protected final SelectionButtonDialogField fCustomValues; public PHPVersionConfigurationBlock fConfigurationBlock; private static final String DIALOGSTORE_LAST_EXTERNAL_LOC = DLTKUIPlugin.PLUGIN_ID + ".last.external.project"; //$NON-NLS-1$ public VersionGroup(WizardPage page, Composite composite, PHPVersion minimumVersion) { this.page = page; final int numColumns = 3; final Group group = new Group(composite, SWT.NONE); group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); group.setLayout(new GridLayout(numColumns, false)); group.setText(PHPUIMessages.VersionGroup_OptionBlock_Title); fDefaultValues = new SelectionButtonDialogField(SWT.RADIO); fDefaultValues.setDialogFieldListener(this); fDefaultValues.setLabelText(PHPUIMessages.VersionGroup_OptionBlock_fDefaultValues); fCustomValues = new SelectionButtonDialogField(SWT.RADIO); fCustomValues.setDialogFieldListener(this); fCustomValues.setLabelText(PHPUIMessages.VersionGroup_OptionBlock_fCustomValues); fDefaultValues.setSelection(true); fCustomValues.setSelection(false); fDefaultValues.doFillIntoGrid(group, numColumns); fCustomValues.doFillIntoGrid(group, 2); fConfigurationBlock = createConfigurationBlock(status -> { }, (IProject) null, null); fConfigurationBlock.setMinimumVersion(minimumVersion); fConfigurationBlock.createContents(group); fConfigurationBlock.setEnabled(false); } protected PHPVersionConfigurationBlock createConfigurationBlock(IStatusChangeListener listener, IProject project, IWorkbenchPreferenceContainer container) { return new PHPVersionConfigurationBlock(listener, project, container, true); } protected void fireEvent() { setChanged(); notifyObservers(); } // /* * (non-Javadoc) * * @see java.util.Observer#update(java.util.Observable, * java.lang.Object) */ @Override public void update(Observable o, Object arg) { fireEvent(); } @Override public void changeControlPressed(DialogField field) { IEnvironment environment = getEnvironment(); IEnvironmentUI environmentUI = (IEnvironmentUI) environment.getAdapter(IEnvironmentUI.class); if (environmentUI != null) { String selectedDirectory = environmentUI.selectFolder(page.getShell()); if (selectedDirectory != null) { DLTKUIPlugin.getDefault().getDialogSettings().put(DIALOGSTORE_LAST_EXTERNAL_LOC, selectedDirectory); } } } public abstract IEnvironment getEnvironment(); @Override public void dialogFieldChanged(DialogField field) { if (field == fDefaultValues) { final boolean checked = fDefaultValues.isSelected(); if (null != fConfigurationBlock) this.fConfigurationBlock.setEnabled(!checked); } fireEvent(); } @Override public void widgetSelected(SelectionEvent e) { widgetDefaultSelected(e); } @Override public void widgetDefaultSelected(SelectionEvent e) { String prefID = PHPInterpreterPreferencePage.PREF_ID; PreferencesUtil.createPreferenceDialogOn(page.getShell(), prefID, new String[] { prefID }, null).open(); if (!fCustomValues.isSelected()) { fConfigurationBlock.performRevert(); } } } private static final class WorkingSetGroup { private WorkingSetConfigurationBlock workingSetBlock; public WorkingSetGroup(Composite composite, IStructuredSelection currentSelection, String[] workingSetTypes) { Group workingSetGroup = new Group(composite, SWT.NONE); workingSetGroup.setFont(composite.getFont()); workingSetGroup.setText(WorkbenchMessages.WorkingSetGroup_WorkingSets_group); workingSetGroup.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); GridLayout layout = new GridLayout(1, false); layout.marginWidth = 0; layout.marginHeight = 0; workingSetGroup.setLayout(layout); workingSetBlock = new WorkingSetConfigurationBlock(workingSetTypes, PHPUiPlugin.getDefault().getDialogSettings()); workingSetBlock.setWorkingSets(workingSetBlock.findApplicableWorkingSets(currentSelection)); workingSetBlock.createContent(workingSetGroup); } public IWorkingSet[] getSelectedWorkingSets() { return workingSetBlock.getSelectedWorkingSets(); } } @Override public void setVisible(boolean visible) { super.setVisible(visible); fNameGroup.setFocus(); if (visible) { // if there is a project we are going from 2nd to 1st // remove the project removeProject(); } else { IWizardPage currentPage = getContainer().getCurrentPage(); if (currentPage instanceof IPHPProjectCreateWizardPage) { // going forward from 1st page to 2nd one changeToNewProject(); ((IPHPProjectCreateWizardPage) currentPage).initPage(); } } } private void removeProject() { if (fNameGroup == null || fNameGroup.getName() == null || fNameGroup.getName().length() == 0) { return; } if (getProjectHandle() == null || !getProjectHandle().exists()) { return; } IRunnableWithProgress op = new IRunnableWithProgress() { @Override public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { doRemoveProject(monitor); } }; try { getContainer().run(true, true, new WorkspaceModifyDelegatingOperation(op)); } catch (InvocationTargetException e) { final String title = NewWizardMessages.ScriptProjectWizardSecondPage_error_remove_title; final String message = NewWizardMessages.ScriptProjectWizardSecondPage_error_remove_message; ExceptionHandler.handle(e, getShell(), title, message); } catch (InterruptedException e) { // cancel pressed } } final void doRemoveProject(IProgressMonitor monitor) throws InvocationTargetException { final boolean noProgressMonitor = (fCurrProjectLocation == null); // inside // workspace if (monitor == null || noProgressMonitor) { monitor = new NullProgressMonitor(); } monitor.beginTask(NewWizardMessages.ScriptProjectWizardSecondPage_operation_remove, 3); try { try { boolean removeContent = !fKeepContent && getProjectHandle().isSynchronized(IResource.DEPTH_INFINITE); getProjectHandle().delete(removeContent, false, new SubProgressMonitor(monitor, 2)); } finally { CoreUtility.enableAutoBuild(fIsAutobuild.booleanValue()); // fIsAutobuild // must // be // set fIsAutobuild = null; } } catch (CoreException e) { throw new InvocationTargetException(e); } finally { monitor.done(); fKeepContent = false; } } private void changeToNewProject() { fKeepContent = this.getDetect(); final IRunnableWithProgress op = new IRunnableWithProgress() { @Override public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { try { if (fIsAutobuild == null) { fIsAutobuild = Boolean.valueOf(CoreUtility.enableAutoBuild(false)); } updateProject(monitor); } catch (CoreException e) { throw new InvocationTargetException(e); } catch (OperationCanceledException e) { throw new InterruptedException(); } finally { monitor.done(); } } }; try { getContainer().run(true, false, new WorkspaceModifyDelegatingOperation(op)); } catch (InvocationTargetException e) { final String title = NewWizardMessages.ScriptProjectWizardSecondPage_error_title; final String message = NewWizardMessages.ScriptProjectWizardSecondPage_error_message; ExceptionHandler.handle(e, getShell(), title, message); } catch (InterruptedException e) { // cancel pressed } } /** * Called from the wizard on cancel. */ public void performCancel() { if (fProjectCreated) { removeProject(); } } /** * 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 void createProject(IProject project, URI locationURI, IProgressMonitor monitor) throws CoreException { PHPProjectUtils.createProjectAt(project, locationURI, monitor); fProjectCreated = true; } protected void rememberExistingFiles(URI projectLocation) throws CoreException { fDotProjectBackup = null; fDotBuildpathBackup = null; IFileStore file = EFS.getStore(projectLocation); if (file.fetchInfo().exists()) { IFileStore projectFile = file.getChild(FILENAME_PROJECT); if (projectFile.fetchInfo().exists()) { fDotProjectBackup = createBackup(projectFile, "project-desc"); //$NON-NLS-1$ } IFileStore buildpathFile = file.getChild(FILENAME_BUILDPATH); if (buildpathFile.fetchInfo().exists()) { fDotBuildpathBackup = createBackup(buildpathFile, "buildpath-desc"); //$NON-NLS-1$ } } } private File createBackup(IFileStore source, String name) throws CoreException { try { File bak = File.createTempFile("eclipse-" + name, ".bak"); //$NON-NLS-1$ //$NON-NLS-2$ copyFile(source, bak); return bak; } catch (IOException e) { IStatus status = new Status(IStatus.ERROR, DLTKUIPlugin.PLUGIN_ID, IStatus.ERROR, Messages.format(NewWizardMessages.ScriptProjectWizardSecondPage_problem_backup, name), e); throw new CoreException(status); } } private void copyFile(IFileStore source, File target) throws IOException, CoreException { InputStream is = source.openInputStream(EFS.NONE, null); FileOutputStream os = new FileOutputStream(target); copyFile(is, os); } private void copyFile(InputStream is, OutputStream os) throws IOException { try { byte[] buffer = new byte[8192]; while (true) { int bytesRead = is.read(buffer); if (bytesRead == -1) break; os.write(buffer, 0, bytesRead); } } finally { try { is.close(); } finally { os.close(); } } } protected URI getProjectLocationURI() throws CoreException { if (this.isInWorkspace()) { return null; } return this.getLocationURI(); } protected void updateProject(IProgressMonitor monitor) throws CoreException, InterruptedException { IProject projectHandle = this.getProjectHandle(); DLTKCore.create(projectHandle); fCurrProjectLocation = getProjectLocationURI(); if (monitor == null) { monitor = new NullProgressMonitor(); } try { monitor.beginTask(NewWizardMessages.ScriptProjectWizardSecondPage_operation_initialize, 70); if (monitor.isCanceled()) { throw new OperationCanceledException(); } URI realLocation = fCurrProjectLocation; if (fCurrProjectLocation == null) { // inside workspace try { URI rootLocation = ResourcesPlugin.getWorkspace().getRoot().getLocationURI(); realLocation = new URI(rootLocation.getScheme(), null, Path.fromPortableString(rootLocation.getPath()).append(projectHandle.getName()).toString(), null); } catch (URISyntaxException e) { Assert.isTrue(false, "Can't happen"); //$NON-NLS-1$ } } rememberExistingFiles(realLocation); createProject(projectHandle, fCurrProjectLocation, new SubProgressMonitor(monitor, 20)); } finally { monitor.done(); } } @Override public void initPage() { } public WizardModel getWizardData() { if (fragment != null) { return fragment.getWizardModel(); } return null; } public void performFinish(IProgressMonitor monitor) { Display.getDefault().asyncExec(() -> { PHPUiPlugin.getDefault().getPreferenceStore().setValue((PreferenceConstants.JavaScriptSupportEnable), fJavaScriptSupportGroup.getSelection()); IWorkingSet[] workingSets = fWorkingSetGroup.getSelectedWorkingSets(); ((NewElementWizard) getWizard()).getWorkbench().getWorkingSetManager().addToWorkingSets(getProjectHandle(), workingSets); }); } public boolean shouldSupportJavaScript() { return fJavaScriptSupportGroup != null && fJavaScriptSupportGroup.shouldSupportJavaScript(); } public boolean isDefaultVersionSelected() { return fVersionGroup != null && fVersionGroup.fDefaultValues.isSelected(); } public boolean getUseAspTagsValue() { return fVersionGroup != null && fVersionGroup.fConfigurationBlock.getUseAspTagsValue(); } public PHPVersion getPHPVersionValue() { if (fVersionGroup != null) { return fVersionGroup.fConfigurationBlock.getPHPVersionValue(); } return null; } protected Boolean getIsAutobuild() { return fIsAutobuild; } }