/*******************************************************************************
* 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 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.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import melnorme.lang.ide.core.LangCore;
import melnorme.lang.ide.core.launch.ILaunchConfigSerializer;
import melnorme.lang.ide.core.launch.ProjectLaunchSettings;
import melnorme.lang.ide.core.utils.EclipseUtils;
import melnorme.lang.ide.core.utils.ProjectValidator;
import melnorme.lang.ide.ui.LangImages;
import melnorme.lang.ide.ui.LangUIMessages;
import melnorme.lang.ide.ui.fields.ProjectField;
import melnorme.lang.ide.ui.utils.WorkbenchUtils;
import melnorme.util.swt.SWTFactoryUtil;
import melnorme.utilbox.core.CommonException;
import melnorme.utilbox.core.fntypes.CommonRunnable;
import melnorme.utilbox.status.Severity;
import melnorme.utilbox.status.StatusException;
public abstract class ProjectBasedLaunchConfigurationTab extends AbstractLaunchConfigurationTabExt {
protected final ProjectField projectField = new LaunchTabProjectField();
public ProjectBasedLaunchConfigurationTab() {
super();
projectField.addChangeListener(this::updateLaunchConfigurationDialog);
}
protected final String getProjectName() {
return projectField.getFieldValue();
}
protected IProject getValidProjectOrNull() {
try {
return getValidProject();
} catch(StatusException e) {
return null;
}
}
protected IProject getValidProject() throws StatusException {
return getProjectValidator().getProject(getProjectName());
}
protected ProjectValidator getProjectValidator() {
return new ProjectValidator(LangCore.NATURE_ID);
}
@Override
protected void doValidate() throws StatusException {
getValidProject();
}
/* ----------------- Control creation ----------------- */
@Override
public String getName() {
return LangUIMessages.mainLaunchTab_title;
}
@Override
public Image getImage() {
return LangImages.IMG_LAUNCHTAB_MAIN.getImage();
}
@Override
public void createControl(Composite parent) {
Composite topControl = SWTFactoryUtil.createComposite(parent);
setControl(topControl);
topControl.setLayout(GridLayoutFactory.swtDefaults().spacing(5, 0).create());
projectField.createComponent(topControl, new GridData(GridData.FILL_HORIZONTAL));
createVerticalSpacer(topControl, 1);
createCustomControls(topControl);
createVerticalSpacer(topControl, 1);
// PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
// IScriptDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_MAIN_TAB);
}
@SuppressWarnings("unused")
protected void createCustomControls(Composite composite) {
}
protected class LaunchTabProjectField extends ProjectField {
@Override
protected IProject[] getDialogChooseElements() throws CoreException {
return EclipseUtils.getOpenedProjects(LangCore.NATURE_ID);
}
}
/* ----------------- Bindings (Apply/Revert) ----------------- */
@Override
public void setDefaults(ILaunchConfigurationWorkingCopy config) {
IResource contextResource = WorkbenchUtils.getContextResource();
runOperation(
() -> getDefaultProjectSettings(contextResource).saveToConfig(config, true));
}
protected ILaunchConfigSerializer getDefaultProjectSettings(IResource contextResource) {
return getDefaultProjectLaunchSettings().initFrom(contextResource);
}
protected abstract ILaunchConfigSerializer getDefaultProjectLaunchSettings();
@Override
public void initializeFrom(ILaunchConfiguration config) {
runOperation(() -> doInitializeFrom(config));
}
public void doInitializeFrom(ILaunchConfiguration config) throws CommonException {
initializeFrom(doInitializeFrom_createSettings(config));
}
protected abstract ProjectLaunchSettings doInitializeFrom_createSettings(ILaunchConfiguration config)
throws CommonException;
protected void initializeFrom(ProjectLaunchSettings projectSettings) {
projectField.setFieldValue(projectSettings.projectName);
}
@Override
public final void performApply(ILaunchConfigurationWorkingCopy config) {
runOperation(
() -> getLaunchSettingsFromTab().saveToConfig(config));
}
public void runOperation(CommonRunnable op) {
try {
op.run();
} catch(CommonException e) {
LangCore.logStatusException(e.toStatusException(Severity.ERROR));
}
}
protected abstract ProjectLaunchSettings getLaunchSettingsFromTab();
}