package org.eclipse.dltk.tcl.internal.testing;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.debug.ui.messages.DLTKLaunchConfigurationsMessages;
import org.eclipse.dltk.tcl.internal.debug.ui.launchConfigurations.TclMainLaunchConfigurationTab;
import org.eclipse.dltk.tcl.testing.ITclTestingEngine;
import org.eclipse.dltk.testing.DLTKTestingConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
public class TclTestingMainLaunchConfigurationTab extends TclMainLaunchConfigurationTab {
private Button detect;
private Combo engineType;
private Map nameToId = new HashMap();
public TclTestingMainLaunchConfigurationTab(String mode) {
super(mode);
}
@Override
protected void doCreateControl(Composite composite) {
createMainModuleEditor(composite, DLTKLaunchConfigurationsMessages.mainTab_mainModule);
createVerticalSpacer(composite, 1);
createTestEngineEditor(composite, "Tcl Testing engine");
}
protected void createTestEngineEditor(Composite parent, String text) {
Font font = parent.getFont();
Group mainGroup = new Group(parent, SWT.NONE);
mainGroup.setText(text);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
mainGroup.setLayoutData(gd);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
mainGroup.setLayout(layout);
mainGroup.setFont(font);
engineType = new Combo(mainGroup, SWT.SINGLE | SWT.BORDER | SWT.DROP_DOWN);
gd = new GridData(GridData.FILL_HORIZONTAL);
engineType.setLayoutData(gd);
engineType.setFont(font);
engineType.addModifyListener(e -> updateLaunchConfigurationDialog());
detect = createPushButton(mainGroup, "Detect", null);
ITclTestingEngine[] engines = TclTestingEngineManager.getEngines();
for (int i = 0; i < engines.length; i++) {
String name = engines[i].getName();
this.engineType.add(name);
nameToId.put(name, engines[i].getId());
}
detect.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleDetectButtonSelected();
}
});
handleDetectButtonSelected();
}
private void handleDetectButtonSelected() {
ITclTestingEngine[] engines = TclTestingEngineManager.getEngines();
// this.engineType.select(0);
ISourceModule module = getSourceModule();
if (module != null && module.exists()) {
for (int i = 0; i < engines.length; i++) {
if (engines[i].isValidModule(module)) {
this.engineType.select(i);
}
}
}
}
@Override
protected boolean validate() {
return super.validate() && validateEngine();
}
private boolean validateEngine() {
ISourceModule module = getSourceModule();
if (module != null) {
ITclTestingEngine[] engines = TclTestingEngineManager.getEngines();
for (int i = 0; i < engines.length; i++) {
String selectedEngine = this.getEngineId();
if (engines[i].getId().equals(selectedEngine) && engines[i].isValidModule(module)) {
return true;
}
}
}
setErrorMessage("Testing engine not support specified script");
return true;
}
@Override
protected void doPerformApply(ILaunchConfigurationWorkingCopy config) {
super.doPerformApply(config);
config.setAttribute(DLTKTestingConstants.ATTR_ENGINE_ID, getEngineId());
}
private String getEngineId() {
return (String) this.nameToId.get(this.engineType.getText());
}
@Override
protected void doInitializeForm(ILaunchConfiguration config) {
super.doInitializeForm(config);
ITclTestingEngine[] engines = TclTestingEngineManager.getEngines();
String id = null;
try {
id = config.getAttribute(DLTKTestingConstants.ATTR_ENGINE_ID, "");
} catch (CoreException e) {
if (DLTKCore.DEBUG) {
e.printStackTrace();
}
}
if (id == null || id.length() == 0) {
handleDetectButtonSelected();
} else {
// this.engineType.select(0);
for (int i = 0; i < engines.length; i++) {
if (engines[i].getId().equals(id)) {
this.engineType.select(i);
}
}
}
// handleDetectButtonSelected();
}
}