package org.zend.php.zendserver.deployment.ui.commands;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.part.FileEditorInput;
import org.zend.php.zendserver.deployment.core.DeploymentNature;
import org.zend.php.zendserver.deployment.core.descriptor.DescriptorContainerManager;
import org.zend.php.zendserver.deployment.ui.Activator;
import org.zend.php.zendserver.deployment.ui.Messages;
import org.zend.php.zendserver.deployment.ui.editors.DeploymentDescriptorEditor;
public class EnableDeploymentSupport extends AbstractHandler {
public Object execute(ExecutionEvent event) throws ExecutionException {
ISelection selection = HandlerUtil.getCurrentSelection(event);
if (selection.isEmpty())
return null;
Object element = null;
if (selection instanceof IStructuredSelection) {
element = ((IStructuredSelection)selection).getFirstElement();
}
if (element instanceof IAdaptable) {
IResource res = (IResource) ((IAdaptable) element).getAdapter(IResource.class);
final IProject project = res.getProject();
Job job = new Job(Messages.EnableDeploymentSupport_EnableDeploymentSupport) {
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
addNature(project, DeploymentNature.ID, monitor);
} catch (CoreException e) {
return e.getStatus();
}
return Status.OK_STATUS;
}
};
job.setUser(true);
job.schedule();
job.addJobChangeListener(new JobChangeAdapter() {
@Override
public void done(IJobChangeEvent event) {
if (event.getResult().getSeverity() == IStatus.OK) {
openDescriptorEditor(project);
}
}
});
}
return null;
}
private void addNature(IProject project, String id, IProgressMonitor monitor) throws CoreException {
IProjectDescription description = project.getDescription();
List<String> natures = new ArrayList<String>(Arrays.asList(description.getNatureIds()));
if (natures.contains(id)) {
// de-configure nature
natures.remove(id);
description.setNatureIds(natures.toArray(new String[natures.size()]));
project.setDescription(description, monitor);
}
// configure project
natures.add(id);
description.setNatureIds(natures.toArray(new String[natures.size()]));
project.setDescription(description, monitor);
}
private void openDescriptorEditor(final IProject project) {
IWorkbench wb = PlatformUI.getWorkbench();
wb.getDisplay().asyncExec(new Runnable() {
public void run() {
IWorkbench wb = PlatformUI.getWorkbench();
IWorkbenchWindow window = wb.getActiveWorkbenchWindow();
if (window != null) {
IFile descriptorFile = project.getFile(DescriptorContainerManager.DESCRIPTOR_PATH);
try {
window.getActivePage().openEditor(new FileEditorInput(descriptorFile), DeploymentDescriptorEditor.ID);
} catch (PartInitException e) {
Activator.log(e);
}
}
}
});
}
}