blob: 2e6012d4cf35209f1fbf8beaa2f813380626b4a8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.ui.templates;
import org.eclipse.core.runtime.Assert;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
/**
* Implementation of the AbstractTemplateOption that allows users to choose a value from
* the fixed set of options using radio buttons.
*
* @since 3.2
*/
public class RadioChoiceOption extends AbstractChoiceOption {
private Button[] fButtons;
private Label fLabel;
/**
* Constructor for RadioChoiceOption.
* Number of choices must be 2, otherwise an assertion will fail.
*
* @param section
* the parent section.
* @param name
* the unique name
* @param label
* the presentable label
* @param choices
* the list of choices from which the value can be chosen. This
* list must be of size 2.
* Each array entry should be an array of size 2, where position 0
* will be interpeted as the choice unique name, and position 1
* as the choice presentable label.
*/
public RadioChoiceOption(BaseOptionTemplateSection section, String name, String label, String[][] choices) {
super(section, name, label, choices);
Assert.isTrue(choices.length == 2);
}
private Button createRadioButton(Composite parent, int span, String[] choice) {
Button button = new Button(parent, SWT.RADIO);
button.setData(choice[0]);
button.setText(choice[1]);
GridData gd = fill(button, span);
gd.horizontalIndent = 10;
return button;
}
public void createControl(Composite parent, int span) {
fLabel = createLabel(parent, 1);
fLabel.setEnabled(isEnabled());
fill(fLabel, span);
Composite radioComp = createComposite(parent, span);
GridData gd = fill(radioComp, span);
gd.horizontalIndent = 10;
GridLayout layout = new GridLayout(fChoices.length, true);
layout.marginWidth = layout.marginHeight = 0;
radioComp.setLayout(layout);
fButtons = new Button[fChoices.length];
SelectionListener listener = new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Button b = (Button) e.widget;
if (isBlocked())
return;
if (b.getSelection()) {
setValue(b.getData().toString());
getSection().validateOptions(RadioChoiceOption.this);
}
}
};
for (int i = 0; i < fChoices.length; i++) {
fButtons[i] = createRadioButton(radioComp, 1, fChoices[i]);
fButtons[i].addSelectionListener(listener);
fButtons[i].setEnabled(isEnabled());
}
if (getChoice() != null)
selectChoice(getChoice());
}
protected void setOptionValue(Object value) {
if (fButtons != null && value != null) {
selectChoice(value.toString());
}
}
protected void setOptionEnabled(boolean enabled) {
if (fLabel != null) {
fLabel.setEnabled(enabled);
for (int i = 0; i < fButtons.length; i++) {
fButtons[i].setEnabled(enabled);
}
}
}
protected void selectOptionChoice(String choice) {
for (int i = 0; i < fButtons.length; i++) {
Button button = fButtons[i];
String bname = button.getData().toString();
if (bname.equals(choice)) {
button.setSelection(true);
} else {
button.setSelection(false);
}
}
}
}