package org.absmodels.abs.plugin.actions.runconfig.java;
import static org.absmodels.abs.plugin.util.UtilityFunctions.showErrorMessage;
import static org.absmodels.abs.plugin.util.UtilityFunctions.standardExceptionHandling;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.absmodels.abs.plugin.actions.runconfig.AbstractTab;
import org.absmodels.abs.plugin.builder.AbsNature;
import org.absmodels.abs.plugin.util.Images;
import org.absmodels.abs.plugin.util.UtilityFunctions;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
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.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Listener;
import abs.backend.tests.ABSTestRunnerGenerator;
import abs.frontend.ast.CompilationUnit;
import abs.frontend.ast.Model;
import abs.frontend.ast.ModuleDecl;
/**
* The first Tab for the java launch configuration
*/
public class JavaTabMain extends AbstractTab {
private Combo runTargetDropDown;
private Button sequenceDiagramCheckbox;
private List<RunTarget> runTargets;
@Override
public void createControl(Composite parent) {
TabListener myListener = new TabListener(this);
Composite comp = new Composite(parent, SWT.NONE);
setCompositeLayout(comp);
createProjectDropDownMenu(myListener, comp);
createProductDropDownMenu(myListener, comp);
createRunTargetDropDownMenu(myListener, comp);
createSequenceDiagramCheckbox(myListener, comp);
setControl(comp);
}
protected void createProjectDropDownMenu(TabListener myListener, Composite comp) {
super.createProjectDropDownMenu(myListener, comp);
// add listener to change the run target selection
projectDropDown.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
fillRunTargetMenu(null);
}
});
}
private void createSequenceDiagramCheckbox(TabListener myListener, Composite comp) {
sequenceDiagramCheckbox = createCheckButton(comp, "Draw sequence diagram");
sequenceDiagramCheckbox.addListener(SWT.Selection, myListener);
}
private String getSelectedItem(Combo combo) {
int index = combo.getSelectionIndex();
if (index >= 0) {
return combo.getItem(index);
} else {
return "";
}
}
private RunTarget getSelectedRunTarget() {
int index = runTargetDropDown.getSelectionIndex();
if (index >= 0) {
return runTargets.get(index);
} else {
return null;
}
}
private void fillRunTargetMenu(String preSelected) {
int selected = runTargetDropDown.getSelectionIndex();
if (preSelected != null) {
selected = 0;
}
runTargetDropDown.removeAll();
IProject proj = getSelectedProject();
runTargets = getRunTargets(proj);
int i = 0;
for (RunTarget runTarget : runTargets) {
runTargetDropDown.add(runTarget.toString());
if (runTarget.toString().equals(preSelected)) {
selected = i;
}
i++;
}
runTargetDropDown.select(selected);
runTargetDropDown.setEnabled(runTargets.size() > 0);
}
private List<RunTarget> getRunTargets(IProject proj) {
AbsNature n = UtilityFunctions.getAbsNature(proj);
if (n == null) {
return Collections.emptyList();
}
Model m = n.getCompleteModel();
if (m == null) {
return Collections.emptyList();
}
List<RunTarget> result = new ArrayList<RunTarget>();
for (CompilationUnit cu : m.getCompilationUnits()) {
for (ModuleDecl module : cu.getModuleDecls()) {
if (module.getBlockOpt().hasChildren()) {
if (module.getName().equals(ABSTestRunnerGenerator.RUNNER_MAIN)) {
// do not show generated unit test file
continue;
}
result.add(new RunTargetModule(module));
}
// TODO add unit test classes
// for (Decl d : module.getDecls()) {
// if (d.isInterface()) {
// InterfaceDecl i = (InterfaceDecl) d;
// for (Annotation annotation : i.getAnnotations()) {
// if (annotation.getValue() )
// }
// }
// }
}
}
result.add(new RunTargetUnitTests());
return result;
}
private void createRunTargetDropDownMenu(TabListener myListener, Composite comp) {
Group group = createGroup(comp, "Run Target", 1, 1, GridData.FILL_HORIZONTAL);
runTargetDropDown = new Combo(group, SWT.DROP_DOWN | SWT.BORDER | SWT.READ_ONLY);
GridData gridData = new GridData();
gridData.widthHint = 200;
runTargetDropDown.setLayoutData(gridData);
runTargetDropDown.addListener(SWT.Selection, myListener);
}
@Override
public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
new JavaLaunchConfig(configuration).setDefaults();
}
@Override
public void initializeFrom(ILaunchConfiguration configuration) {
JavaLaunchConfig cfg = new JavaLaunchConfig(configuration);
try {
fillProjectDropDownMenue(cfg.getProjectName());
fillProductDropDownMenue(cfg.getProductName());
fillRunTargetMenu(cfg.getRunTarget());
sequenceDiagramCheckbox.setSelection(cfg.getDrawSequenceDiagram());
initProject(configuration);
} catch (CoreException e) {
standardExceptionHandling(e);
showErrorMessage("Fatal error!");
}
}
@Override
public void performApply(ILaunchConfigurationWorkingCopy configuration) {
JavaLaunchConfig cfg = new JavaLaunchConfig(configuration);
try {
cfg.setProjectName(getSelectedItem(projectDropDown));
cfg.setProductName(getSelectedProductName());
cfg.setRunTarget(getSelectedItem(runTargetDropDown));
RunTarget runTarget = getSelectedRunTarget();
if (runTarget != null) {
runTarget.setConfig(cfg);
}
cfg.setDrawSequenceDiagram(sequenceDiagramCheckbox.getSelection());
} catch (CoreException e) {
standardExceptionHandling(e);
showErrorMessage("Fatal error!");
}
}
@Override
public String getName() {
return "ABS Java Backend";
}
@Override
public boolean isValid(ILaunchConfiguration launchConfig) {
boolean res = super.isValid(launchConfig);
if (res) {
setErrorMessage(null);
} else {
if (getSelectedRunTarget() == null) {
setErrorMessage("No run target selected");
return false;
}
}
return res;
}
private void setCompositeLayout(Composite comp) {
GridLayout gridLayout = new GridLayout(1, false);
gridLayout.verticalSpacing = 8;
comp.setLayout(gridLayout);
}
@Override
public String getId() {
return "org.abs-models.abs.plugin.javaTab1";
}
@Override
public Image getImage() {
return Images.MODULE_IMAGE;
}
}