/******************************************************************************* * Copyright (c) 2013, 2013 IBM Corporation 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: * DLTK team - * Bruno Medeiros - rewrote class to remove DLTK dependencies and cleanup/simplify code. *******************************************************************************/ package melnorme.lang.ide.ui.launch; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import melnorme.lang.ide.core.LangCore; import melnorme.lang.ide.core.launch.BuildTargetLaunchCreator; import melnorme.lang.ide.core.launch.BuildTargetSource; import melnorme.lang.ide.core.launch.CompositeBuildTargetSettings; import melnorme.lang.ide.core.launch.ProjectLaunchSettings; import melnorme.lang.ide.core.operations.ToolManager; import melnorme.lang.ide.core.operations.build.BuildManager; import melnorme.lang.ide.core.operations.build.BuildTarget; import melnorme.lang.ide.core.operations.build.BuildTargetData; import melnorme.lang.ide.core.operations.build.ProjectBuildInfo; import melnorme.lang.ide.core.utils.EclipseUtils; import melnorme.lang.ide.ui.LangUIMessages; import melnorme.lang.ide.ui.build.BuildTargetEditor; import melnorme.lang.tooling.commands.CommandInvocation; import melnorme.utilbox.collections.Collection2; import melnorme.utilbox.core.CommonException; import melnorme.utilbox.status.StatusException; /** * A main LaunchConfiguration with project selection field, * and build target editor (including program path selection field). */ public abstract class MainLaunchConfigurationTab extends ProjectBasedLaunchConfigurationTab { protected final BuildManager buildManager = LangCore.getBuildManager(); protected final BuildTargetSource buildTargetSource = init_buildTargetSource(); protected final BuildTargetField buildTargetField = init_createBuildTargetField(); protected final BuildTargetEditor buildTargetEditor = init_BuildTargetSettingsComponent(); public MainLaunchConfigurationTab() { this(true); } public MainLaunchConfigurationTab(boolean initialize) { if(initialize) { initBindings(); } } protected BuildTargetSource init_buildTargetSource() { return new BuildTargetSource() { @Override public String getProjectName() { return MainLaunchConfigurationTab.this.getProjectName(); } @Override public String getBuildTargetName() { return MainLaunchConfigurationTab.this.getBuildTargetName(); } }; } protected BuildTargetField init_createBuildTargetField() { return new BuildTargetField(); } protected BuildManager getBuildManager() { return buildManager; } protected ToolManager getToolManager() { return getBuildManager().getToolManager(); } protected String getProgramPathString() { return buildTargetEditor.programPathField.getFieldValue(); } protected String getBuildTargetName() { return buildTargetField.getFieldValue(); } protected boolean isDefaultProgramPath() { return buildTargetEditor.programPathField.isUseDefault(); } protected BuildTargetEditor init_BuildTargetSettingsComponent() { BuildTargetEditor component = new BuildTargetEditor( getBuildManager(), false, this::getDefaultBuildTargetBuildCommand, this::getDefaultProgramPath ); component.programPathField.setLabelText(LangUIMessages.LaunchTab_ProgramPathField_title); component.buildCommandField.getEnablementField().setLabelText( LangUIMessages.LaunchTab_Fields_useBuildTargetSettings); component.programPathField.getUseDefaultField().setLabelText( LangUIMessages.LaunchTab_Fields_useBuildTargetSettings); return component; } /* ----------------- ----------------- */ protected CommandInvocation getDefaultBuildTargetBuildCommand() throws CommonException { return buildTargetSource.getBuildTarget().getEffectiveBuildCommand2(); } protected String getDefaultProgramPath() throws CommonException { return buildTargetSource.getBuildTarget().getEffectiveValidExecutablePath(); } protected CompositeBuildTargetSettings getBuildTargetSettings() throws CommonException { return new CompositeBuildTargetSettings(buildTargetSource) { @Override public CommandInvocation getBuildCommand() { return buildTargetEditor.getEffectiveBuildCommand(); } @Override public String getExecutablePath() { return buildTargetEditor.getEffectiveProgramPathValue(); } }; } @Override protected void doValidate() throws StatusException { super.doValidate(); buildTargetField.validate(); buildTargetEditor.validate(); } /* ----------------- bindings ----------------- */ protected void initBindings() { projectField.addChangeListener(this::projectFieldChanged); buildTargetField.addChangeListener(this::buildTargetFieldChanged); buildTargetEditor.buildCommandField.field().addChangeListener(this::updateLaunchConfigurationDialog); buildTargetEditor.programPathField.addChangeListener(this::updateLaunchConfigurationDialog); } public void projectFieldChanged() { IProject project = getValidProjectOrNull(); if(project != null) { ProjectBuildInfo buildInfo = getBuildManager().getBuildInfo(project); if(buildInfo != null) { Collection2<BuildTarget> buildTargets = buildInfo.getBuildTargets(); buildTargetField.setFieldOptions( buildTargets.map((buildTarget) -> buildTarget.getTargetName())); } } updateLaunchConfigurationDialog(); } public void buildTargetFieldChanged() { IProject project = getValidProjectOrNull(); if(project != null) { buildTargetEditor.setInput(getBuildTargetData()); updateLaunchConfigurationDialog(); } } protected BuildTargetData getBuildTargetData() { return new BuildTargetData(getBuildTargetName(), true, true, buildTargetEditor.buildCommandField.getEffectiveFieldValue(), buildTargetEditor.programPathField.getEffectiveFieldValue()); } /* ----------------- Control creation ----------------- */ @Override protected void createCustomControls(Composite parent) { buildTargetField.createComponent(parent, new GridData(GridData.FILL_HORIZONTAL)); buildTargetEditor.createComponent(parent, new GridData(GridData.FILL_BOTH)); } /* ----------------- Apply/Revert/Defaults ----------------- */ @Override protected ProjectLaunchSettings getDefaultProjectLaunchSettings() { return new BuildTargetLaunchCreator(); } @Override protected BuildTargetLaunchCreator doInitializeFrom_createSettings(ILaunchConfiguration config) throws CommonException { try { return new BuildTargetLaunchCreator(config); } catch(CoreException e) { throw EclipseUtils.createCommonException(e); } } @Override public void doInitializeFrom(ILaunchConfiguration config) throws CommonException { BuildTargetLaunchCreator buildSettings = doInitializeFrom_createSettings(config); super.initializeFrom(buildSettings); initializeBuildTargetField(buildSettings); initializeBuildTargetSettings(buildSettings); } protected void initializeBuildTargetField(BuildTargetLaunchCreator btLaunchCreator) { buildTargetField.setFieldValue(btLaunchCreator.getTargetName()); } protected void initializeBuildTargetSettings(BuildTargetLaunchCreator btLaunchCreator) { buildTargetEditor.buildCommandField.setEffectiveFieldValue(btLaunchCreator.getBuildCommand()); buildTargetEditor.programPathField.setEffectiveFieldValue(btLaunchCreator.getExecutablePath()); } @Override protected ProjectLaunchSettings getLaunchSettingsFromTab() { BuildTargetData btData = getBuildTargetData(); return new BuildTargetLaunchCreator( getProjectName(), btData ); } }