package org.absmodels.abs.plugin.actions.runconfig.java; import static org.absmodels.abs.plugin.actions.runconfig.java.EclipseScheduler.HISTORY; import static org.absmodels.abs.plugin.actions.runconfig.java.EclipseScheduler.MANUAL; import static org.absmodels.abs.plugin.actions.runconfig.java.EclipseScheduler.RANDOM; import static org.absmodels.abs.plugin.util.UtilityFunctions.showErrorMessage; import static org.absmodels.abs.plugin.util.UtilityFunctions.standardExceptionHandling; import java.io.File; import org.absmodels.abs.plugin.actions.runconfig.AbstractTab; import org.absmodels.abs.plugin.util.Images; import org.absmodels.abs.plugin.util.UtilityFunctions; 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.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; 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.Composite; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; /** * tab for choosing a scheduler and scheduler options */ public class JavaTabSchedulerOptions extends AbstractTab { private Button manualSchedulerBtn; private Button randomSchedulerBtn; private Button historySchedulerBtn; private Button runAutomaticallyCheckbox; private Button useFifoSemanticsCheckbox; private Button useFixedSeed; private Text seedNumber; private Text historyFileName; private Button historyButton; @Override public void createControl(Composite parent) { TabListener myListener = new TabListener(this); Composite comp = new Composite(parent, SWT.NONE); setCompositeLayout(comp); createSchedulerSelection(comp, myListener); createOptions(comp, myListener); createFifoCheckbox(comp, myListener); setControl(comp); } private void createRunAutomaticallyCheckbox(Composite comp, TabListener myListener) { runAutomaticallyCheckbox = createCheckButton(comp, "Run automatically"); runAutomaticallyCheckbox.setImage(Images.DEBUGGER_RESUME); runAutomaticallyCheckbox.addListener(SWT.Selection, myListener); } private void createFifoCheckbox(Composite comp, TabListener myListener) { Group group = createGroup(comp, "Advanced", 1, 1, GridData.FILL_HORIZONTAL); GridLayout layout = (GridLayout) group.getLayout(); layout.verticalSpacing = 8; useFifoSemanticsCheckbox = createCheckButton(group, "Guarantee message ordering between two COGs"); useFifoSemanticsCheckbox.addListener(SWT.Selection, myListener); } private void setCompositeLayout(Composite comp) { GridLayout gridLayout = new GridLayout(1, false); gridLayout.verticalSpacing = 8; comp.setLayout(gridLayout); } private void createSchedulerSelection(Composite comp, TabListener myListener) { Group group = createGroup(comp, "Scheduler", 1, 1, GridData.FILL_HORIZONTAL); // manual scheduler: manualSchedulerBtn = createRadioButton(group, "Run with manual scheduler"); manualSchedulerBtn.setImage(Images.DEBUGGER_INTERACTIVE); manualSchedulerBtn.setSelection(true); manualSchedulerBtn.addListener(SWT.Selection, myListener); manualSchedulerBtn.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); // randomScheduler randomSchedulerBtn = createRadioButton(group, "Run with random scheduler"); randomSchedulerBtn.setImage(Images.DEBUGGER_RANDOM); randomSchedulerBtn.addListener(SWT.Selection, myListener); randomSchedulerBtn.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); // run history: historySchedulerBtn = createRadioButton(group, "Replay history"); historySchedulerBtn.setImage(Images.DEBUGGER_HISTORY); historySchedulerBtn.addListener(SWT.Selection, myListener); historySchedulerBtn.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); } private void createOptions(Composite comp, TabListener myListener) { Group group = createGroup(comp, "Options", 1, 1, GridData.FILL_HORIZONTAL); GridLayout layout = (GridLayout) group.getLayout(); layout.verticalSpacing = 8; createRunAutomaticallyCheckbox(group, myListener); createRandomSeedChooser(group, myListener); createHistorFileChooser(group, myListener); } private void createRandomSeedChooser(Group comp, TabListener myListener) { GridData gridData = new GridData(); gridData.widthHint = 100; gridData.verticalAlignment = SWT.TOP; Composite seedComp = new Composite(comp, SWT.NONE); GridLayout layout = new GridLayout(2, false); layout.marginWidth = 0; layout.marginHeight = 0; seedComp.setLayout(layout); useFixedSeed = createCheckButton(seedComp, "Use fixed seed:"); useFixedSeed.addListener(SWT.Selection, myListener); seedNumber = new Text(seedComp, SWT.SINGLE | SWT.BORDER); seedNumber.setText("0"); seedNumber.addListener(SWT.Modify, myListener); gridData.widthHint = 100; seedNumber.setLayoutData(gridData); } private void createHistorFileChooser(Composite comp, TabListener myListener) { Composite historyComp = new Composite(comp, SWT.FILL); GridData g = new GridData(); g.horizontalAlignment = SWT.FILL; g.grabExcessHorizontalSpace = true; historyComp.setLayoutData(g); GridLayout layout = new GridLayout(2, false); // layout.marginLeft = 0; layout.marginWidth = 0; layout.marginHeight = 0; layout.verticalSpacing = 0; Label historyLabel = new Label(historyComp, SWT.NONE); historyLabel.setText("History File:"); GridData gridData = new GridData(); gridData.horizontalSpan = 2; historyLabel.setLayoutData(gridData); historyComp.setLayout(layout); historyFileName = new Text(historyComp, SWT.SINGLE | SWT.BORDER); historyFileName.addListener(SWT.Modify, myListener); gridData = new GridData(); // gridData.verticalAlignment = SWT.TOP; gridData.widthHint = 100; gridData.horizontalAlignment = SWT.FILL; gridData.grabExcessHorizontalSpace = true; historyFileName.setLayoutData(gridData); historyButton = new Button(historyComp, SWT.PUSH); historyButton.setText("Browse"); gridData = new GridData(); //gridData.widthHint = 100; historyButton.setLayoutData(gridData); historyButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { FileDialog historyDialog = new FileDialog(getShell(), SWT.OPEN); String historyFile = historyDialog.open(); if (historyFile != null) { historyFileName.setText(historyFile); } } }); } @Override public void setDefaults(ILaunchConfigurationWorkingCopy configuration) { new JavaLaunchConfig(configuration).setDefaults(); } @Override public void initializeFrom(ILaunchConfiguration configuration) { JavaLaunchConfig cfg = new JavaLaunchConfig(configuration); try { EclipseScheduler scheduler = cfg.getScheduler(); selectScheduler(scheduler); seedNumber.setText(cfg.getRandomSeed() + ""); useFixedSeed.setSelection(cfg.hasFixedRandomSeed()); historyFileName.setText(cfg.getHistoryFile()); runAutomaticallyCheckbox.setSelection(cfg.getRunAutomatically()); useFifoSemanticsCheckbox.setSelection(cfg.getUseFifoSemantics()); } catch (CoreException e) { standardExceptionHandling(e); showErrorMessage("Fatal error!"); } updateUI(); } private void selectScheduler(EclipseScheduler scheduler) { historySchedulerBtn.setSelection(scheduler == HISTORY); manualSchedulerBtn.setSelection(scheduler == MANUAL); randomSchedulerBtn.setSelection(scheduler == RANDOM); } private EclipseScheduler getSelectedScheduler() { if (historySchedulerBtn.getSelection()) { return EclipseScheduler.HISTORY; } if (randomSchedulerBtn.getSelection()) { return EclipseScheduler.RANDOM; } return EclipseScheduler.MANUAL; } @Override public void performApply(ILaunchConfigurationWorkingCopy configuration) { JavaLaunchConfig cfg = new JavaLaunchConfig(configuration); cfg.setScheduler(getSelectedScheduler()); if (randomSchedulerBtn.getSelection() && useFixedSeed.getSelection()) { cfg.setRandomSeed(seedNumber.getText()); } else { cfg.unsetRandomSeed(); } if (historySchedulerBtn.getSelection()) { cfg.setHistoryFile(historyFileName.getText()); } else { cfg.setHistoryFile(""); } if (!manualSchedulerBtn.getSelection()) { cfg.setRunAutomatically(runAutomaticallyCheckbox.getSelection()); } else { cfg.setRunAutomatically(false); } cfg.setUseFifoSemantics(useFifoSemanticsCheckbox.getSelection()); } @Override public String getName() { return "Scheduler Options"; } @Override public boolean isValid(ILaunchConfiguration configuration) { JavaLaunchConfig cfg = new JavaLaunchConfig(configuration); try { // check if history file exists and has correct format if (cfg.getScheduler() == HISTORY) { if (!new File(cfg.getHistoryFile()).exists()) { setErrorMessage("Could not find history file."); return false; } } // check if seedNumber is a number if (cfg.hasFixedRandomSeed()) { if (!UtilityFunctions.isNumber(cfg.getRandomSeedString())) { setErrorMessage("Random seed must be a number."); return false; } } setErrorMessage(null); return true; } catch (CoreException e) { UtilityFunctions.standardExceptionHandling(e); setErrorMessage("Unexpected problem."); return false; } } @Override protected void updateLaunchConfigurationDialog() { super.updateLaunchConfigurationDialog(); updateUI(); } private void updateUI() { EclipseScheduler s = getSelectedScheduler(); useFixedSeed.setEnabled(s == RANDOM); seedNumber.setEnabled(s == RANDOM && useFixedSeed.getSelection()); historyFileName.setEnabled(s == HISTORY); historyButton.setEnabled(s == HISTORY); runAutomaticallyCheckbox.setEnabled(s != MANUAL); } @Override public String getId() { return "org.abs-models.abs.plugin.javaTab2"; } @Override public Image getImage() { return Images.DEBUGGER_RESUME; } }