/******************************************************************************* * Copyright (c) 2015 Bruno Medeiros and other Contributors. * 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: * Bruno Medeiros - initial API and implementation *******************************************************************************/ package melnorme.lang.ide.ui.dialogs; import static melnorme.utilbox.core.Assert.AssertNamespace.assertNotNull; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExecutableExtension; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.IPageChangingListener; import org.eclipse.jface.dialogs.PageChangingEvent; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.IWizardContainer; import org.eclipse.jface.wizard.Wizard; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.ui.INewWizard; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard; import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard; import melnorme.lang.ide.core.EclipseCore; import melnorme.lang.ide.core.LangCore; import melnorme.lang.ide.core.utils.ResourceUtils; import melnorme.lang.ide.ui.LangUIPlugin; import melnorme.utilbox.concurrency.OperationCancellation; import melnorme.utilbox.core.CommonException; public abstract class LangNewProjectWizard extends Wizard implements INewWizard, IExecutableExtension, IPageChangingListener { public static final String WIZARD_ID = LangUIPlugin.PLUGIN_ID + ".wizards.NewProjectWizard"; protected IWorkbench workbench; protected IStructuredSelection selection; protected IConfigurationElement fConfigElement; public LangNewProjectWizard() { setWindowTitle(WizardMessages.LangNewProject_wizardTitle); setDialogSettings(LangUIPlugin.getInstance().getDialogSettings()); setNeedsProgressMonitor(true); } public abstract LangProjectWizardFirstPage getFirstPage(); /** @return the second page of the wizard. Can be null if wizard has no second page. */ public abstract WizardPage getSecondPage(); public IProject getProject() throws CoreException { try { return getFirstPage().nameGroup.getProjectHandle2(); } catch(CommonException ce) { throw EclipseCore.createCoreException(ce); } } public IPath getProjectLocation2() { return getFirstPage().getProjectLocation(); } /** * Stores the configuration for the wizard. * this will be be used in {@link #performFinish()} to possible change the perspective after wizard completion. */ @Override public void setInitializationData(IConfigurationElement cfig, String propertyName, Object data) { fConfigElement = cfig; } @Override public void init(IWorkbench workbench, IStructuredSelection selection) { this.workbench = workbench; this.selection = selection; if(selection != null && selection.getFirstElement() instanceof IProject) { IProject selectedProject = (IProject) selection.getFirstElement(); getFirstPage().getNameGroup().nameField().setFieldValue(selectedProject.getName()); } } public IWorkbench getWorkbench() { return workbench; } public IStructuredSelection getSelection() { return selection; } @Override public void setContainer(IWizardContainer wizardContainer) { super.setContainer(wizardContainer); // if(wizardContainer != null) { // WizardDialog wizardDialog = assertInstance(wizardContainer, WizardDialog.class); // wizardDialog.addPageChangingListener(this); // } } /* ----------------- ----------------- */ @Override public void addPages() { super.addPages(); } @Override public void handlePageChanging(PageChangingEvent event) { Object currentPage = event.getCurrentPage(); Object nextPage = event.getTargetPage(); if(currentPage == getFirstPage() && nextPage == getSecondPage()) { event.doit = changeToNewProject(); } else if(currentPage == getSecondPage() && nextPage == getFirstPage()) { removeProject(); } } protected boolean changeToNewProject() { return getProjectCreator().performCreateProject(); } public void removeProject() { getProjectCreator().revertProjectCreation(); } private ProjectCreationOperation projectCreationOperation; public ProjectCreationOperation getProjectCreator() { if(projectCreationOperation == null) { projectCreationOperation = createProjectCreator(); } return projectCreationOperation; } protected ProjectCreator_ForWizard createProjectCreator() { return new ProjectCreator_ForWizard(); } protected class ProjectCreator_ForWizard extends ProjectCreationOperation { public ProjectCreator_ForWizard() { super(LangNewProjectWizard.this.getContainer()); } @Override public IProject getProject() throws CoreException { return LangNewProjectWizard.this.getProject(); } @Override public IPath getProjectLocation2() { return LangNewProjectWizard.this.getProjectLocation2(); } @Override protected void configureCreatedProject(IProgressMonitor monitor) throws CoreException, CommonException, OperationCancellation { LangNewProjectWizard.this.configureCreatedProject(this, monitor); } /** @return whether the folder was created or not. (it's not created if it exists already. */ public boolean createFolder(IContainer container, IProgressMonitor monitor) throws CoreException { if(container.exists() || !(container instanceof IFolder)) { return false; } createFolder(container.getParent(), monitor); IFolder folder = (IFolder) container; ResourceUtils.createFolder(folder, true, true, monitor); revertActions.add(new IRevertAction() { @Override public void run(IProgressMonitor monitor) throws CoreException { if(folder.members().length == 0) { folder.delete(false, monitor); } } }); return true; } /** @return whether the file was created or not. (it's not created if it exists already. */ public boolean createFile(IFile file, String contents, boolean openEditor, IProgressMonitor monitor) throws CoreException { assertNotNull(contents); if(file.exists()) { return false; } createFolder(file.getParent(), monitor); ResourceUtils.writeStringToFile(file, contents, monitor); Runnable openEditorRunnable = new Runnable() { @Override public void run() { selectAndReveal(file); openEditorOnFile(file); } }; revertActions.add(new IRevertAction() { @Override public void run(IProgressMonitor monitor) throws CoreException { finishActions.remove(openEditorRunnable); file.delete(false, monitor); } }); if(openEditor) { finishActions.add(openEditorRunnable); } return true; } } protected abstract void configureCreatedProject(ProjectCreator_ForWizard projectCreator, IProgressMonitor monitor) throws OperationCancellation, CommonException, CoreException; /* ----------------- ----------------- */ @Override public boolean performFinish() { ProjectCreationOperation projectCreator = getProjectCreator(); boolean success = projectCreator.performCreateProject(); if(success) { BasicNewProjectResourceWizard.updatePerspective(fConfigElement); selectAndReveal(projectCreator.getCreatedProject()); projectCreator.performFinishActions(); } return success; } protected void selectAndReveal(IResource newResource) { BasicNewResourceWizard.selectAndReveal(newResource, workbench.getActiveWorkbenchWindow()); } @Override public boolean performCancel() { return getProjectCreator().revertProjectCreation(); } /* ----------------- util: ----------------- */ protected void openEditorOnFile(IFile file) { IWorkbenchPage page = workbench.getActiveWorkbenchWindow().getActivePage(); try { IDE.openEditor(page, file, true); } catch(PartInitException e) { LangCore.logInternalError(e); } } }