Java tutorial
/******************************************************************************* * Copyright (c) 2014 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: * steel - initial API and implementation * Bruno Medeiros - rewrite using lang code *******************************************************************************/ package com.googlecode.goclipse.ui.launch; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.dialogs.ElementListSelectionDialog; import com.googlecode.goclipse.core.GoProjectEnvironment; import com.googlecode.goclipse.core.operations.GoBuildManager; import com.googlecode.goclipse.tooling.GoPackageName; import com.googlecode.goclipse.tooling.env.GoEnvironment; import melnorme.lang.ide.core.launch.BuildTargetLaunchCreator; import melnorme.lang.ide.core.launch.ProjectLaunchSettings; import melnorme.lang.ide.ui.build.BuildTargetEditor; import melnorme.lang.ide.ui.launch.MainLaunchConfigurationTab; import melnorme.lang.ide.ui.utils.UIOperationsStatusHandler; import melnorme.lang.tooling.bundle.BuildTargetNameParser; import melnorme.util.swt.components.fields.ButtonTextField; import melnorme.util.swt.components.fields.ComboOptionsField; import melnorme.util.swt.components.fields.EnablementButtonTextField; import melnorme.utilbox.collections.ArrayList2; import melnorme.utilbox.collections.Collection2; import melnorme.utilbox.concurrency.OperationCancellation; import melnorme.utilbox.core.CommonException; import melnorme.utilbox.status.StatusException; /** * Go Launch config tab uses the BuildTarget field in a different way. * In Go, the available targets are not predetermined by the Build model, * rather the user can specify its own Go Package path as a build target. */ public class GoMainLaunchConfigurationTab extends MainLaunchConfigurationTab { protected final ButtonTextField goPackageField = init_createGoPackageField(); protected final ComboOptionsField buildTypeField = init_createBuildTypeField(); public GoMainLaunchConfigurationTab() { super(false); ArrayList2<String> fieldOptions = GoBuildManager.BUILD_TYPES_Names.toArrayList(); fieldOptions.remove(GoBuildManager.BUILD_TYPE_RunTests); buildTypeField.setFieldOptions(fieldOptions); initBindings(); } protected ButtonTextField init_createGoPackageField() { return new GoPackageField("Go package to build:", null, "Select..."); } protected ComboOptionsField init_createBuildTypeField() { return new ComboOptionsField("Build type:"); } @Override protected BuildTargetEditor init_BuildTargetSettingsComponent() { BuildTargetEditor component = super.init_BuildTargetSettingsComponent(); component.buildCommandField.getEnablementField().setLabelText(EnablementButtonTextField.LABEL_UseDefault); component.programPathField.getUseDefaultField().setLabelText(EnablementButtonTextField.LABEL_UseDefault); return component; } @Override protected String getBuildTargetName() { String buildType = buildTypeField.getFieldValue(); return getBuildTargetNameParser().getFullName(goPackageField.getFieldValue(), buildType); } protected BuildTargetNameParser getBuildTargetNameParser() { return getBuildManager().getBuildTargetNameParser(); } @Override protected void initBindings() { super.initBindings(); goPackageField.addChangeListener(this::buildTargetFieldChanged); buildTypeField.addChangeListener(this::buildTargetFieldChanged); } /* ----------------- Control creation ----------------- */ @Override protected void createCustomControls(Composite parent) { goPackageField.createComponent(parent, new GridData(GridData.FILL_HORIZONTAL)); // buildTargetField.createComponent(parent, new GridData(GridData.FILL_HORIZONTAL)); buildTargetEditor.createComponent(parent, new GridData(GridData.FILL_BOTH)); } protected class GoPackageField extends EnablementButtonTextField { public GoPackageField(String labelText, String useDefaultField_Label, String buttonlabel) { super(labelText, useDefaultField_Label, buttonlabel); } @Override protected String getDefaultFieldValue() throws CommonException { return null; } @Override protected void createContents_all(Composite topControl) { super.createContents_all(topControl); buildTypeField.createComponent(topControl, new GridData(GridData.FILL_HORIZONTAL)); } @Override protected String getNewValueFromButtonSelection() throws StatusException, OperationCancellation { return GoMainLaunchConfigurationTab.this.openProgramPathDialog(getValidProject()); } } protected String openProgramPathDialog(IProject project) throws OperationCancellation { // TODO: this should be refactored to show only main packages try { ElementListSelectionDialog dialog = new ElementListSelectionDialog(getShell(), new LabelProvider() { @Override public String getText(Object element) { GoPackageName goPackageName = (GoPackageName) element; return goPackageName.getFullNameAsString(); } }); dialog.setTitle("Select Go main package"); dialog.setMessage("Select Go main package"); GoEnvironment goEnv = GoProjectEnvironment.getGoEnvironment(project); Collection2<GoPackageName> sourcePackages = GoProjectEnvironment.findSourcePackages(project, goEnv); dialog.setElements(sourcePackages.toArray()); if (dialog.open() == IDialogConstants.OK_ID) { GoPackageName goPackageName = (GoPackageName) dialog.getFirstResult(); return goPackageName.getFullNameAsString(); } } catch (CommonException ce) { UIOperationsStatusHandler.handleStatus(false, "Error selecting package from dialog: ", ce); } throw new OperationCancellation(); } /* ----------------- save/apply ----------------- */ @Override protected ProjectLaunchSettings getDefaultProjectLaunchSettings() { return new BuildTargetLaunchCreator() { @Override public ProjectLaunchSettings initFrom(IResource contextualResource) { ProjectLaunchSettings initFrom = super.initFrom(contextualResource); data.targetName = ""; return initFrom; } }; } @Override protected void initializeBuildTargetField(BuildTargetLaunchCreator btLaunchCreator) { //super.initializeBuildTargetField(buildSettings); String buildTargetName = btLaunchCreator.data.targetName; String buildConfiguration = getBuildTargetNameParser().getBuildConfigName(buildTargetName); String buildTypeName = getBuildTargetNameParser().getBuildTypeName(buildTargetName); goPackageField.setFieldValue(buildConfiguration); buildTypeField.setFieldValue(buildTypeName); if (buildTypeField.getFieldValue() == null) { buildTypeField.setFieldValue(buildTypeField.getComboOptions().get(0)); } } }