/*******************************************************************************
* This file is protected by Copyright.
* Please refer to the COPYRIGHT file distributed with this source distribution.
*
* This file is part of REDHAWK IDE.
*
* 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
*******************************************************************************/
package gov.redhawk.ide.internal.ui.templates.handlers;
import gov.redhawk.ide.internal.ui.templates.ResourceControlPanelTemplateSection;
import gov.redhawk.ide.internal.ui.templates.ResourceControlPanelWizard;
import gov.redhawk.ide.internal.ui.templates.ScaTemplateSection;
import gov.redhawk.ide.ui.templates.TemplatesActivator;
import gov.redhawk.model.sca.util.ModelUtil;
import gov.redhawk.ui.editor.SCAFormEditor;
import java.lang.reflect.InvocationTargetException;
import java.util.Locale;
import mil.jpeojtrs.sca.dcd.DeviceConfiguration;
import mil.jpeojtrs.sca.dcd.util.DcdResourceImpl;
import mil.jpeojtrs.sca.sad.SoftwareAssembly;
import mil.jpeojtrs.sca.sad.util.SadResourceImpl;
import mil.jpeojtrs.sca.spd.SoftPkg;
import mil.jpeojtrs.sca.spd.util.SpdResourceImpl;
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.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jdt.launching.IVMInstall;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.jdt.launching.environments.IExecutionEnvironment;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.pde.internal.core.ICoreConstants;
import org.eclipse.pde.internal.core.util.VMUtil;
import org.eclipse.pde.internal.ui.wizards.IProjectProvider;
import org.eclipse.pde.internal.ui.wizards.plugin.NewProjectCreationOperation;
import org.eclipse.pde.internal.ui.wizards.plugin.PluginFieldData;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.part.ISetSelectionTarget;
import org.eclipse.ui.statushandlers.StatusManager;
public class NewControlPanelProject extends AbstractHandler {
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
ProgressMonitorDialog dialog = new ProgressMonitorDialog(HandlerUtil.getActiveShell(event));
final IEditorPart editor = HandlerUtil.getActiveEditor(event);
if (!(editor instanceof SCAFormEditor)) {
return null;
}
SCAFormEditor scaEditor = (SCAFormEditor) editor;
EObject eObj = null;
String name = null;
Resource resource = scaEditor.getMainResource();
if (resource instanceof SpdResourceImpl) {
SoftPkg spd = SoftPkg.Util.getSoftPkg(resource);
name = spd.getName();
eObj = spd;
} else if (resource instanceof SadResourceImpl) {
SoftwareAssembly sad = SoftwareAssembly.Util.getSoftwareAssembly(resource);
name = sad.getName();
eObj = sad;
} else if (resource instanceof DcdResourceImpl) {
DeviceConfiguration dcd = DeviceConfiguration.Util.getDeviceConfiguration(resource);
name = dcd.getName();
eObj = dcd;
}
if (eObj == null) {
return null;
}
IProject spdProject = ModelUtil.getProject(eObj);
// Confirm creation of new project
String msg = String.format("Create a new control panel project for %s?", name);
if (!MessageDialog.openConfirm(HandlerUtil.getActiveShell(event), "Create control panel", msg)) {
return null;
}
String baseName = null;
if (spdProject != null) {
baseName = spdProject.getName();
} else {
if (name != null) {
baseName = ScaTemplateSection.makeNameSafe(name);
}
}
String tmpProjectName = baseName + ".ui";
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(tmpProjectName);
if (project.exists()) {
InputDialog inputDialog = new InputDialog(HandlerUtil.getActiveShell(event), "Name Conflict", "Enter a name for the project:", baseName + "2.ui",
new IInputValidator() {
@Override
public String isValid(String newText) {
if (newText.trim().isEmpty()) {
return "Must enter a value.";
} else if (ResourcesPlugin.getWorkspace().getRoot().getProject(newText).exists()) {
return "Project '" + newText + "' already exists.";
}
return null;
}
});
if (inputDialog.open() == Window.OK) {
tmpProjectName = inputDialog.getValue();
} else {
return null;
}
}
final String projectName = tmpProjectName;
final String pluginName = name;
ResourceControlPanelWizard contentWizard = new ResourceControlPanelWizard();
contentWizard.setResource(eObj);
ResourceControlPanelTemplateSection resourceTemplate = contentWizard.getResourceControlPanelTemplateSection();
String packageName = ScaTemplateSection.makeNameSafe(projectName).toLowerCase(Locale.ENGLISH);
PluginFieldData fPluginData = new PluginFieldData();
updateData(fPluginData, pluginName, projectName, packageName);
IProjectProvider fProjectProvider = new IProjectProvider() {
@Override
public String getProjectName() {
return projectName;
}
@Override
public IProject getProject() {
return ResourcesPlugin.getWorkspace().getRoot().getProject(getProjectName());
}
@Override
public IPath getLocationPath() {
// return null for in workspace
return null;
}
};
try {
dialog.run(false, true, new NewProjectCreationOperation(fPluginData, fProjectProvider, contentWizard));
final IFile file = project.getFile(new Path("src/" + packageName.replace(".", "/") + "/" + resourceTemplate.getCompositeClassName() + ".java"));
final IWorkbenchWindow ww = HandlerUtil.getActiveWorkbenchWindow(event);
final IWorkbenchPage page = ww.getActivePage();
IWorkbenchPart focusPart = page.getActivePart();
if (focusPart instanceof ISetSelectionTarget) {
ISelection selection = new StructuredSelection(file);
((ISetSelectionTarget) focusPart).selectReveal(selection);
}
try {
try {
file.getProject().refreshLocal(IResource.DEPTH_INFINITE, null);
} catch (CoreException e) {
StatusManager.getManager().handle(e, TemplatesActivator.getPluginId());
}
IDE.openEditor(page, file, true);
} catch (PartInitException e) {
StatusManager.getManager().handle(new Status(IStatus.ERROR, TemplatesActivator.getPluginId(), "Failed to open Control Panel Project editor", e));
}
} catch (InvocationTargetException e) {
StatusManager.getManager().handle(
new Status(IStatus.ERROR, TemplatesActivator.getPluginId(), "Failed to generate Control Panel Project.", e.getCause()));
} catch (InterruptedException e) {
// PASS
}
return null;
}
/**
* @param fPluginData
*/
protected void updateData(PluginFieldData fData, String pluginName, String projectName, String packageName) {
fData.setSimple(false);
fData.setSourceFolderName("src");
fData.setOutputFolderName("bin");
fData.setLegacy(false);
// No project structure changes since 3.5, mark as latest version (though using any constant 3.5 or greater is
// equivalent)
fData.setTargetVersion(ICoreConstants.TARGET_VERSION_LATEST);
// No longer support 3.0 non-osgi bundles in wizard
fData.setHasBundleStructure(true);
fData.setOSGiFramework(null);
fData.setWorkingSets(new IWorkingSet[0]);
fData.setId(projectName);
fData.setVersion("1.0.0.qualifier");
fData.setName(pluginName);
fData.setProvider("");
PluginFieldData data = fData;
data.setClassname(packageName + ".Activator");
data.setUIPlugin(true);
data.setDoGenerateClass(true);
data.setRCPApplicationPlugin(false);
// Don't turn on API analysis if disabled (no java project available)
data.setEnableAPITooling(false);
fData.setExecutionEnvironment(getDefaultExecutionEnvirornment());
}
/**
*
*/
private String getDefaultExecutionEnvirornment() {
// Gather EEs
IExecutionEnvironment[] exeEnvs = VMUtil.getExecutionEnvironments();
// Set default EE based on strict match to default VM
IVMInstall defaultVM = JavaRuntime.getDefaultVMInstall();
for (int i = 0; i < exeEnvs.length; i++) {
if (VMUtil.getExecutionEnvironment(exeEnvs[i].getId()).isStrictlyCompatible(defaultVM)) {
return exeEnvs[i].getId();
}
}
return null;
}
}