/*******************************************************************************
* Copyright (c) 2004 Eric Merritt 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: Eric Merritt Vlad Dumitrescu
*******************************************************************************/
package org.erlide.ui.wizards;
import java.net.URI;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.dialogs.WizardNewProjectReferencePage;
import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
import org.eclipse.ui.part.ISetSelectionTarget;
import org.erlide.engine.NewProjectData;
import org.erlide.engine.model.builder.BuilderTool;
import org.erlide.engine.model.root.ErlangProjectProperties;
import org.erlide.engine.model.root.ProjectConfigType;
import org.erlide.ui.ErlideUIConstants;
import org.erlide.ui.internal.ErlideUIPlugin;
import org.erlide.util.ErlLogger;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
/**
* Creates a new erlang project in the Eclipse workbench.
*
* @author Eric Merritt [cyberlync at yahoo dot com]
* @author Vlad Dumitrescu
*/
public class NewErlangProjectWizard extends Wizard implements INewWizard {
private IWorkbench workbench;
private NewProjectData info;
private Map<ProjectConfigType, ProjectPreferencesWizardPage> buildPages;
private ErlangNewProjectCreationPage mainPage;
private ErlangProjectBuilderPage builderPage;
private WizardNewProjectReferencePage referencePage;
private IWizardPage prevPage;
@Override
public void init(final IWorkbench aWorkbench, final IStructuredSelection selection) {
workbench = aWorkbench;
setNeedsProgressMonitor(true);
}
@Override
public void addPages() {
try {
super.addPages();
info = new NewProjectData();
info.copyFrom(ErlangProjectProperties.DEFAULT);
buildPages = Maps.newEnumMap(ProjectConfigType.class);
mainPage = new ErlangNewProjectCreationPage("mainPage", info);
mainPage.setTitle(
ErlideUIPlugin.getResourceString("wizards.titles.newproject"));
mainPage.setDescription(
ErlideUIPlugin.getResourceString("wizards.descs.newproject"));
mainPage.setImageDescriptor(ErlideUIPlugin.getDefault()
.getImageDescriptor(ErlideUIConstants.IMG_NEW_PROJECT_WIZARD));
addPage(mainPage);
builderPage = new ErlangProjectBuilderPage("builderPage", info);
builderPage.setTitle(
ErlideUIPlugin.getResourceString("wizards.titles.builderprefs"));
builderPage.setDescription(
ErlideUIPlugin.getResourceString("wizards.descs.builderprefs"));
builderPage.setImageDescriptor(ErlideUIPlugin.getDefault()
.getImageDescriptor(ErlideUIConstants.IMG_NEW_PROJECT_WIZARD));
addPage(builderPage);
for (final ProjectConfigType builder : ProjectConfigType.values()) {
final ProjectPreferencesWizardPage buildPage = ProjectPreferencesWizardPageFactory
.create(builder, info);
buildPages.put(builder, buildPage);
buildPage.setImageDescriptor(ErlideUIPlugin.getDefault()
.getImageDescriptor(ErlideUIConstants.IMG_NEW_PROJECT_WIZARD));
addPage(buildPage);
}
// only add page if there are already projects in the workspace
if (ResourcesPlugin.getWorkspace().getRoot().getProjects().length > 0) {
referencePage = new WizardNewProjectReferencePage(
"basicReferenceProjectPage");//$NON-NLS-1$
referencePage.setTitle(WizardMessages.NewProject_referenceTitle);
referencePage
.setDescription(WizardMessages.NewProject_referenceDescription);
addPage(referencePage);
}
} catch (final Exception x) {
reportError(x);
}
}
@Override
public boolean performFinish() {
System.out.println("CREATE " + info);
IProject newProject;
try {
newProject = createNewProject();
} catch (final CoreException e) {
System.out.println(">>> project exists!");
return false;
}
if (newProject == null) {
return false;
}
updatePerspective();
selectAndReveal(newProject);
return true;
}
private IProject createNewProject() throws CoreException {
URI location = null;
if (!mainPage.useDefaults()) {
location = mainPage.getLocationURI();
}
IProject[] refProjects = null;
if (referencePage != null) {
refProjects = referencePage.getReferencedProjects();
}
final ProjectCreator creator = new ProjectCreator(mainPage.getProjectName(),
location, refProjects, info, getContainer(),
WorkspaceUndoUtil.getUIInfoAdapter(getShell()));
return creator.createProject();
}
private void reportError(final Exception x) {
ErlLogger.error(x);
final String description = ErlideUIPlugin
.getResourceString("wizards.errors.projecterrordesc");
final String title = ErlideUIPlugin
.getResourceString("wizards.errors.projecterrortitle");
ErrorDialog.openError(getShell(), description, title, new Status(IStatus.ERROR,
ErlideUIPlugin.PLUGIN_ID, 0, x.getMessage(), x));
}
@Override
public IWizardPage getNextPage(final IWizardPage page) {
if (page == mainPage) {
return builderPage;
}
if (page == builderPage) {
final ProjectConfigType config;
if (info.getBuilder().equals(BuilderTool.MAKE)
|| info.getBuilder().equals(BuilderTool.INTERNAL)) {
config = info.getConfigType();
} else {
config = info.getBuilder().getMatchingConfigs().iterator().next();
}
return buildPages.get(config);
}
if (buildPages.containsValue(page)) {
prevPage = page;
return referencePage;
}
return null;
}
@Override
public IWizardPage getPreviousPage(final IWizardPage page) {
if (page == builderPage) {
return mainPage;
}
if (page == referencePage) {
return prevPage;
}
if (buildPages.containsValue(page)) {
return builderPage;
}
return null;
}
/**
* Selects and reveals the newly added resource in all parts of the active workbench
* window's active page.
*
* @see ISetSelectionTarget
*/
protected void selectAndReveal(final IResource newResource) {
selectAndReveal(newResource, getWorkbench().getActiveWorkbenchWindow());
}
/**
* Attempts to select and reveal the specified resource in all parts within the
* supplied workbench window's active page.
* <p>
* Checks all parts in the active page to see if they implement
* <code>ISetSelectionTarget</code>, either directly or as an adapter. If so, tells
* the part to select and reveal the specified resource.
* </p>
*
* @param resource
* the resource to be selected and revealed
* @param window
* the workbench window to select and reveal the resource
*
* @see ISetSelectionTarget
*/
public static void selectAndReveal(final IResource resource,
final IWorkbenchWindow window) {
// validate the input
if (window == null || resource == null) {
return;
}
final IWorkbenchPage page = window.getActivePage();
if (page == null) {
return;
}
// get all the view and editor parts
final List<IWorkbenchPart> parts = Lists.newArrayList();
IWorkbenchPartReference refs[] = page.getViewReferences();
for (int i = 0; i < refs.length; i++) {
final IWorkbenchPart part = refs[i].getPart(false);
if (part != null) {
parts.add(part);
}
}
refs = page.getEditorReferences();
for (int i = 0; i < refs.length; i++) {
if (refs[i].getPart(false) != null) {
parts.add(refs[i].getPart(false));
}
}
final ISelection selection = new StructuredSelection(resource);
final Iterator<IWorkbenchPart> itr = parts.iterator();
while (itr.hasNext()) {
final IWorkbenchPart part = itr.next();
// get the part's ISetSelectionTarget implementation
ISetSelectionTarget target = null;
if (part instanceof ISetSelectionTarget) {
target = (ISetSelectionTarget) part;
} else {
target = (ISetSelectionTarget) part.getAdapter(ISetSelectionTarget.class);
}
if (target != null) {
// select and reveal resource
final ISetSelectionTarget finalTarget = target;
window.getShell().getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
finalTarget.selectReveal(selection);
}
});
}
}
}
public IWorkbench getWorkbench() {
return workbench;
}
protected void updatePerspective() {
ErlideUIPlugin.getDefault().showErlangPerspective();
}
}