package org.objectstyle.wolips.wizards.template;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.widgets.Text;
import org.objectstyle.wolips.templateengine.ProjectInput;
import org.objectstyle.wolips.templateengine.ProjectTemplate;
public class TemplateInputsWizardPage extends WizardPage implements SelectionListener, ModifyListener {
private List<ProjectInput> _inputs;
private Map<ProjectInput, Label> _questionLabels;
private Map<ProjectInput, Control> _questionControls;
private ProjectTemplate _projectTemplate;
private boolean _projectTemplateChanged;
public TemplateInputsWizardPage() {
super("Template Variables");
setTitle("Template Variables");
_questionLabels = new HashMap<ProjectInput, Label>();
_questionControls = new HashMap<ProjectInput, Control>();
}
public void setProjectTemplate(ProjectTemplate projectTemplate) {
if (_projectTemplate != projectTemplate) {
_projectTemplateChanged = true;
_projectTemplate = projectTemplate;
if (_projectTemplate != null) {
setTitle(_projectTemplate.getName());
setMessage("This template has the following configuration options.");
}
}
}
public ProjectTemplate getProjectTemplate() {
return _projectTemplate;
}
public void createControl(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setFont(parent.getFont());
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
composite.setLayout(new GridLayout(2, false));
initializeDialogUnits(parent);
setControl(composite);
}
@Override
public void setVisible(boolean visible) {
super.setVisible(visible);
Composite composite = (Composite) getControl();
if (visible && _projectTemplateChanged) {
createTemplateInputFields(composite);
}
composite.layout(true, true);
}
protected void createTemplateInputFields(Composite parent) {
if (_inputs != null) {
for (ProjectInput input : _inputs) {
Label label = _questionLabels.get(input);
Control control = _questionControls.get(input);
if (label != null) {
label.dispose();
}
if (control != null) {
control.dispose();
}
}
_questionLabels.clear();
_questionControls.clear();
}
if (_projectTemplate != null) {
_inputs = _projectTemplate.getInputs();
} else {
_inputs = null;
}
_projectTemplateChanged = false;
if (_inputs != null) {
for (ProjectInput input : _inputs) {
input.setValue(null);
Label label = new Label(parent, SWT.NONE);
label.setText(input.getQuestion());
_questionLabels.put(input, label);
Control control = createControlForInput(input, parent);
_questionControls.put(input, control);
}
}
}
protected Control createControlForInput(ProjectInput input, Composite parent) {
Object value = input.getValue();
Control control;
ProjectInput.Type type = input.getType();
if (input.hasOptions()) {
Combo combo = new Combo(parent, SWT.READ_ONLY);
for (ProjectInput.Option option : input.getOptions()) {
combo.add(option.getName());
}
ProjectInput.Option selectedOption = input.getSelectedOption();
if (selectedOption != null) {
combo.select(input.getOptions().indexOf(selectedOption));
}
combo.addModifyListener(this);
control = combo;
} else {
if (type == ProjectInput.Type.String) {
control = new Text(parent, SWT.BORDER | SWT.SINGLE);
((Text) control).setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
((Text) control).setText((String) value);
((Text) control).addModifyListener(this);
} else if (type == ProjectInput.Type.Package) {
control = new Text(parent, SWT.BORDER | SWT.SINGLE);
((Text) control).setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
((Text) control).setText((String) value);
((Text) control).addModifyListener(this);
} else if (type == ProjectInput.Type.Integer) {
control = new Spinner(parent, SWT.NONE);
if (value != null) {
((Spinner) control).setSelection(((Integer) value).intValue());
control.setLayoutData(new GridData());
}
((Spinner) control).addModifyListener(this);
} else if (type == ProjectInput.Type.Boolean) {
control = new Button(parent, SWT.CHECK);
if (value != null) {
((Button) control).setSelection(((Boolean) value).booleanValue());
control.setLayoutData(new GridData());
}
((Button) control).addSelectionListener(this);
} else {
throw new IllegalArgumentException("Unknown type " + type + ".");
}
}
return control;
}
public void updateModel() {
if (_inputs != null) {
for (ProjectInput input : _inputs) {
Control control = _questionControls.get(input);
if (input.hasOptions()) {
int selectedOptionIndex = ((Combo) control).getSelectionIndex();
ProjectInput.Option selectedOption = input.getOptions().get(selectedOptionIndex);
input.setSelectedOption(selectedOption);
} else {
ProjectInput.Type type = input.getType();
if (type == ProjectInput.Type.String) {
input.setValue(((Text) control).getText());
} else if (type == ProjectInput.Type.Package) {
input.setValue(((Text) control).getText());
} else if (type == ProjectInput.Type.Integer) {
input.setValue(Integer.valueOf(((Spinner) control).getSelection()));
} else if (type == ProjectInput.Type.Boolean) {
input.setValue(Boolean.valueOf(((Button) control).getSelection()));
} else {
throw new IllegalArgumentException("Unknown type " + type + ".");
}
}
}
}
}
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
public void widgetSelected(SelectionEvent e) {
updateModel();
}
public void modifyText(ModifyEvent e) {
updateModel();
}
}