/*******************************************************************************
* Copyright (c) 2009 University of Edinburgh.
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the BSD Licence, which accompanies this feature
* and can be downloaded from http://groups.inf.ed.ac.uk/pepa/update/licence.txt
******************************************************************************/
package uk.ac.ed.inf.biopepa.ui.wizards.timeseries;
import java.util.*;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import uk.ac.ed.inf.biopepa.core.interfaces.Solver;
import uk.ac.ed.inf.biopepa.core.interfaces.Solver.SolverResponse;
import uk.ac.ed.inf.biopepa.core.interfaces.Solver.SolverResponse.Suitability;
import uk.ac.ed.inf.biopepa.core.sba.Parameters;
import uk.ac.ed.inf.biopepa.core.sba.SBAModel;
import uk.ac.ed.inf.biopepa.core.sba.Solvers;
import uk.ac.ed.inf.biopepa.core.sba.Parameters.Parameter;
import uk.ac.ed.inf.biopepa.ui.interfaces.BioPEPAModel;
/**
*
* @author ajduguid
*
*/
public class AlgorithmWizardPage extends WizardPage {
public static final String name = "Algorithm";
Listener controlListener;
HashMap<Control, Parameter> controlMap;
boolean firstUse = true;
HashSet<Parameter> invalidParameters;
BioPEPAModel model;
Group optionsGroup;
Combo solverCombo;
Composite solverComposite;
Solver solver;
Map<Parameter, Object> uParameters;
Parameters parameters;
protected AlgorithmWizardPage(BioPEPAModel model, Map<Parameter, Object> parameters) {
super(name);
this.model = model;
controlMap = new HashMap<Control, Parameter>();
invalidParameters = new HashSet<Parameter>();
setTitle("Solver selection and Parameter input");
uParameters = parameters;
setPageComplete(solver != null);
}
public void algorithmChanged() {
controlMap.clear();
invalidParameters.clear();
for (Control child : optionsGroup.getChildren())
if (!child.isDisposed())
child.dispose();
// Save all values
/*
if(parameters != null) {
for(Parameter p : parameters.arrayOfKeys())
uParameters.put(p, parameters.getValue(p));
}*/
solver = Solvers.getSolverInstance(solverCombo.getItem(solverCombo.getSelectionIndex()));
((TimeSeriesAnalysisWizard) getWizard()).solver = solver;
SolverResponse sr = solver.getResponse(model.getSBAModel());
if(sr.getSuitability().equals(Suitability.WARNING)) {
setMessage(sr.getMessage(), INFORMATION);
} else {
setMessage(null, NONE);
setDescription("Parameters required for the " + solver.getDescriptiveName());
}
parameters = solver.getRequiredParameters();
((TimeSeriesAnalysisWizard) getWizard()).parameters = parameters;
Label label;
Control control;
String s;
for (Parameter parameter : parameters.arrayOfKeys()) {
// ignore these parameters (taken care of elsewhere)
if (parameter.equals(Parameter.Components))
continue;
label = new Label(optionsGroup, SWT.LEFT);
label.setText(parameter.toString());
Class<?> c = parameter.getType();
if (Number.class.isAssignableFrom(c)) {
control = new Text(optionsGroup, SWT.RIGHT | SWT.SINGLE);
if(uParameters.containsKey(parameter)) {
s = uParameters.get(parameter).toString();
parameters.setValue(parameter, uParameters.get(parameter));
}
else
s = parameter.getDefault().toString();
((Text) control).setText(s);
control.addListener(SWT.Modify, controlListener);
control.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
controlMap.put(control, parameter);
}
}
optionsGroup.layout();
solverComposite.layout();
validatePage();
}
public void createControl(Composite parent) {
solverComposite = new Composite(parent, SWT.NONE);
solverComposite.setLayout(new FormLayout());
solverCombo = new Combo(solverComposite, SWT.READ_ONLY);
String[] sArray = Solvers.getSolverList();
ArrayList<String> tArrayList = new ArrayList<String>();
SBAModel sbaModel = model.getSBAModel();
Solver solver;
Map<String, Set<String>> disallowed = new HashMap<String, Set<String>>();
String message;
Set<String> tSet;
for(String s : sArray) {
solver = Solvers.getSolverInstance(s);
SolverResponse sr = solver.getResponse(sbaModel);
if(!sr.getSuitability().equals(Suitability.UNSUITABLE))
tArrayList.add(s);
else {
message = sr.getMessage();
if(disallowed.containsKey(message))
disallowed.get(message).add(s);
else {
tSet = new HashSet<String>();
tSet.add(s);
disallowed.put(message, tSet);
}
}
}
sArray = tArrayList.toArray(new String[] {});
solverCombo.setItems(sArray);
solver = ((TimeSeriesAnalysisWizard) getWizard()).solver;
if(solver != null) {
for(int i = 0; i < sArray.length; i++)
if(sArray[i].equals(solver.getDescriptiveName())) {
solverCombo.select(i);
break;
}
} else
solverCombo.select(0);
solverCombo.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
if (solverCombo.getSelectionIndex() != -1)
algorithmChanged();
}
});
optionsGroup = new Group(solverComposite, SWT.NONE);
optionsGroup.setText("Solver Parameters");
GridLayout layout = new GridLayout();
layout.numColumns = 2;
optionsGroup.setLayout(layout);
controlListener = new Listener() {
public void handleEvent(Event event) {
Control control = (Control) event.widget;
Parameter parameter = controlMap.get(control);
try {
if (control instanceof Text) {
parameters.setValue(parameter, ((Text) control).getText());
uParameters.put(parameter, parameters.getValue(parameter));
}
// no error thrown so valid type
invalidParameters.remove(parameter);
} catch (IllegalArgumentException e) {
invalidParameters.add(parameter);
}
validatePage();
}
};
Label text = new Label(solverComposite, SWT.WRAP);
if(!disallowed.isEmpty()) {
StringBuilder sb = new StringBuilder();
String term = System.getProperty("line.separator");
sb.append("Certain solvers are not available due to certain features used within the model.");
sb.append(" The following are not available:").append(term).append(term);
for(String s : disallowed.keySet()) {
sb.append("Reason : ").append(s).append(term);
tSet = disallowed.get(s);
if(tSet.size() > 1) {
sb.append("Solvers :").append(term);
for(String s2 : tSet)
sb.append("\t\t").append(s2).append(term);
} else
sb.append("Solver : ").append(tSet.iterator().next()).append(term);
}
sb.delete(sb.length() - term.length(), sb.length());
text.setText(sb.toString());
}
// setImageDescriptor(ImageDescriptor.createFromImage(JFaceResources.getImage(org.eclipse.jface.dialogs.Dialog.DLG_IMG_MESSAGE_INFO)));
setMessage("test message", INFORMATION);
// Layout composites
FormData formData = new FormData();
formData.top = new FormAttachment(0);
formData.left = new FormAttachment(0);
solverCombo.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(solverCombo);
formData.left = new FormAttachment(0);
formData.right = new FormAttachment(100);
optionsGroup.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(optionsGroup);
formData.left = new FormAttachment(0);
formData.right = new FormAttachment(100);
text.setLayoutData(formData);
setControl(solverComposite);
algorithmChanged();
}
private void validatePage() {
if (invalidParameters.isEmpty()) {
setPageComplete(true);
setErrorMessage(null);
} else { // ergo there is at least one Parameter in the set
setPageComplete(false);
setErrorMessage("Invalid value entered for "
+ invalidParameters.iterator().next().toString());
}
}
}