/*******************************************************************************
* 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.launch;
import static melnorme.utilbox.core.Assert.AssertNamespace.assertNotNull;
import static melnorme.utilbox.core.CoreUtil.areEqual;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.ui.ILaunchShortcut;
import melnorme.lang.ide.core.launch.BuildTargetLaunchCreator;
import melnorme.lang.ide.core.operations.build.BuildTargetData;
import melnorme.lang.ide.core.utils.EclipseUtils;
import melnorme.lang.tooling.common.ops.IOperationMonitor;
import melnorme.utilbox.concurrency.OperationCancellation;
import melnorme.utilbox.core.CommonException;
public abstract class LangLaunchShortcut extends BaseLaunchShortcut implements ILaunchShortcut {
public String getLaunchNameForSubTarget(String subTargetName) {
return "[" + subTargetName + "]";
}
@Override
protected ILaunchable getLaunchTargetForElement(Object element, IOperationMonitor om)
throws CommonException, OperationCancellation {
IProject project = getAssociatedProject(element);
if(project == null) {
return null;
}
BuildTargetLaunchCreator btLaunchCreator = new BuildTargetLaunchCreator();
btLaunchCreator.initFromProject(project);
return getLaunchableForElement(element, project, btLaunchCreator, om);
}
@SuppressWarnings("unused")
protected BuildTargetLaunchable getLaunchableForElement(Object element, IProject project,
BuildTargetLaunchCreator btLaunchCreator, IOperationMonitor om)
throws CommonException, OperationCancellation
{
return new BuildTargetLaunchable(project, btLaunchCreator);
}
protected IProject getAssociatedProject(Object element) {
IResource resource;
if(element instanceof IResource) {
resource = (IResource) element;
} else {
resource = EclipseUtils.getAdapter(element, IResource.class);
}
return resource == null ? null : resource.getProject();
}
public class BuildTargetLaunchable implements ILaunchable {
protected final IProject project;
protected final BuildTargetLaunchCreator btLaunchCreator;
public BuildTargetLaunchable(IProject project, BuildTargetLaunchCreator btLaunchCreator) {
this.project = project;
this.btLaunchCreator = btLaunchCreator;
assertNotNull(btLaunchCreator.getTargetName());
}
@Override
public IProject getProject() {
return project;
}
@Override
public String getFullLabel() {
return btLaunchCreator.getSuggestedConfigName();
}
public String getBuildTargetName() {
return btLaunchCreator.getTargetName();
}
@Override
public boolean matchesLaunchConfiguration(ILaunchConfiguration config) throws CoreException {
BuildTargetLaunchCreator otherLaunchSettings = EclipseUtils.callCore(
() -> new BuildTargetLaunchCreator(config));
BuildTargetData data = btLaunchCreator.data;
BuildTargetData otherData = otherLaunchSettings.data;
return
areEqual(getProjectName(), otherLaunchSettings.projectName) &&
areEqual(data.targetName, otherData.targetName) &&
areEqual(data.buildCommand, otherData.buildCommand) &&
areEqual(data.executablePath, otherData.executablePath)
;
}
@Override
public ILaunchConfiguration createNewConfiguration() throws CoreException {
return EclipseUtils.callCore(
() -> btLaunchCreator.createNewConfiguration(getLaunchConfigType()));
}
}
}