org.eclipse.php.internal.ui.wizards.PHPProjectWizardFirstPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.php.internal.ui.wizards.PHPProjectWizardFirstPage.java

Source

/*******************************************************************************
 * 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.Map;
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.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.php.internal.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.ui.util.PHPProjectUtils;
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.*;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation;
import org.eclipse.ui.dialogs.PreferencesUtil;
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 WizardFragment fragment;

    public void createControl(Composite parent) {
        initializeDialogUnits(parent);
        final Composite composite = new Composite(parent, SWT.NULL);
        composite.setFont(parent.getFont());
        composite.setLayout(initGridLayout(new GridLayout(1, false), 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(composite, PHPVersion.PHP5);
        fLayoutGroup = new LayoutGroup(composite);
        fJavaScriptSupportGroup = new JavaScriptSupportGroup(composite, this);

        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(composite);
        Dialog.applyDialogFont(composite);

        // set the focus to the project name
        fNameGroup.postSetFocus();

        setHelpContext(composite);
    }

    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 {
        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()) {
                if (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);
                    File file = projectPath.toFile();
                    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(initGridLayout(new GridLayout(numColumns, false), true));
            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)));
        }

        public void widgetDefaultSelected(SelectionEvent e) {
        }

        public void widgetSelected(SelectionEvent e) {
            // PHPUiPlugin.getDefault().getPreferenceStore().setValue(
            // (PreferenceConstants.JavaScriptSupportEnable),
            // fEnableJavaScriptSupport.getSelection());
        }

        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(initGridLayout(new GridLayout(numColumns, false), true));
            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)
         */
        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)
         */
        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
         */
        public void dialogFieldChanged(DialogField field) {
            updateEnableState();
        }

        public void widgetDefaultSelected(SelectionEvent e) {

            String prefID = PHPProjectLayoutPreferencePage.PREF_ID;

            Map data = null;
            PreferencesUtil.createPreferenceDialogOn(getShell(), prefID, new String[] { prefID }, data).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 class VersionGroup extends Observable
            implements Observer, IStringButtonAdapter, IDialogFieldListener, SelectionListener {
        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$ 
        private Link fPreferenceLink;

        public VersionGroup(Composite composite, PHPVersion minimumVersion) {
            final int numColumns = 3;
            final Group group = new Group(composite, SWT.NONE);
            group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
            group.setLayout(initGridLayout(new GridLayout(numColumns, false), true));
            group.setText(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(new IStatusChangeListener() {
                public void statusChanged(IStatus status) {
                }
            }, (IProject) null, null);
            fConfigurationBlock.setMinimumVersion(minimumVersion);
            fConfigurationBlock.createContents(group);
            fConfigurationBlock.setEnabled(false);
            // fPreferenceLink = new Link(fGroup, SWT.NONE);
            // fPreferenceLink.setText(PHPUIMessages.getString("ToggleLinkingAction_link_description"));
            // //fPreferenceLink.setLayoutData(new GridData(GridData.END,
            // GridData.END, false, false));
            // fPreferenceLink.setLayoutData(new GridData(SWT.END,
            // SWT.BEGINNING, true, false));
            // fPreferenceLink.addSelectionListener(this);
            // fPreferenceLink.setEnabled(true);

        }

        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)
         */
        public void update(Observable o, Object arg) {
            fireEvent();
        }

        public void changeControlPressed(DialogField field) {
            IEnvironment environment = getEnvironment();
            IEnvironmentUI environmentUI = (IEnvironmentUI) environment.getAdapter(IEnvironmentUI.class);
            if (environmentUI != null) {
                String selectedDirectory = environmentUI.selectFolder(getShell());

                if (selectedDirectory != null) {
                    // fLocation.setText(selectedDirectory);
                    DLTKUIPlugin.getDefault().getDialogSettings().put(DIALOGSTORE_LAST_EXTERNAL_LOC,
                            selectedDirectory);
                }
            }
        }

        public void dialogFieldChanged(DialogField field) {
            if (field == fDefaultValues) {
                final boolean checked = fDefaultValues.isSelected();
                if (null != fConfigurationBlock)
                    this.fConfigurationBlock.setEnabled(!checked);
            }

            fireEvent();
        }

        public void widgetSelected(SelectionEvent e) {
            widgetDefaultSelected(e);
        }

        public void widgetDefaultSelected(SelectionEvent e) {
            String prefID = PHPInterpreterPreferencePage.PREF_ID;
            Map data = null;
            PreferencesUtil.createPreferenceDialogOn(getShell(), prefID, new String[] { prefID }, data).open();
            if (!fCustomValues.isSelected()) {
                fConfigurationBlock.performRevert();
            }
        }

    }

    @Override
    public void setVisible(boolean visible) {
        super.setVisible(visible);

        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() {
            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 {
                URI projLoc = getProjectHandle().getLocationURI();

                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() {
            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 void restoreExistingFiles(URI projectLocation, IProgressMonitor monitor) throws CoreException {
        int ticks = ((fDotProjectBackup != null ? 1 : 0) + (fDotBuildpathBackup != null ? 1 : 0)) * 2;
        monitor.beginTask("", ticks); //$NON-NLS-1$ 
        try {
            if (fDotProjectBackup != null) {
                IFileStore projectFile = EFS.getStore(projectLocation).getChild(FILENAME_PROJECT);
                projectFile.delete(EFS.NONE, new SubProgressMonitor(monitor, 1));
                copyFile(fDotProjectBackup, projectFile, new SubProgressMonitor(monitor, 1));
            }
        } catch (IOException e) {
            IStatus status = new Status(IStatus.ERROR, DLTKUIPlugin.PLUGIN_ID, IStatus.ERROR,
                    NewWizardMessages.ScriptProjectWizardSecondPage_problem_restore_project, e);
            throw new CoreException(status);
        }
        try {
            if (fDotBuildpathBackup != null) {
                IFileStore buildpathFile = EFS.getStore(projectLocation).getChild(FILENAME_BUILDPATH);
                buildpathFile.delete(EFS.NONE, new SubProgressMonitor(monitor, 1));
                copyFile(fDotBuildpathBackup, buildpathFile, new SubProgressMonitor(monitor, 1));
            }
        } catch (IOException e) {
            IStatus status = new Status(IStatus.ERROR, DLTKUIPlugin.PLUGIN_ID, IStatus.ERROR,
                    NewWizardMessages.ScriptProjectWizardSecondPage_problem_restore_buildpath, e);
            throw new CoreException(status);
        }
    }

    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(File source, IFileStore target, IProgressMonitor monitor)
            throws IOException, CoreException {
        FileInputStream is = new FileInputStream(source);
        OutputStream os = target.openOutputStream(EFS.NONE, monitor);
        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();
        }
    }

    public void initPage() {
    }

    public WizardModel getWizardData() {
        if (fragment != null) {
            return fragment.getWizardModel();
        }
        return null;
    }

    public void performFinish(IProgressMonitor monitor) {
        Display.getDefault().asyncExec(new Runnable() {

            public void run() {
                PHPUiPlugin.getDefault().getPreferenceStore().setValue(
                        (PreferenceConstants.JavaScriptSupportEnable), fJavaScriptSupportGroup.getSelection());
            }
        });
    }

    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;
    }
}