blob: 97bf38e194e9fa17e769286b7b20664844e52123 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.uima.ruta.testing.preferences;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.util.Assert;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Font;
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.Control;
import org.eclipse.swt.widgets.Group;
public class DescriptionRadioGroupFieldEditor extends FieldEditor {
private IDescriptionChangedListener descriptionChangedListener;
/**
* List of radio button entries of the form [label,value].
*/
private String[][] labelsAndValues;
/**
* Number of columns into which to arrange the radio buttons.
*/
private int numColumns;
/**
* Indent used for the first column of the radion button matrix.
*/
private int indent = HORIZONTAL_GAP;
/**
* The current value, or <code>null</code> if none.
*/
private String value;
/**
* The box of radio buttons, or <code>null</code> if none (before creation and after disposal).
*/
private Composite radioBox;
/**
* The radio buttons, or <code>null</code> if none (before creation and after disposal).
*/
private Button[] radioButtons;
/**
* Whether to use a Group control.
*/
private boolean useGroup;
public DescriptionRadioGroupFieldEditor(String name, String labelText, int numColumns,
String[][] labelAndValues, Composite parent, boolean useGroup) {
init(name, labelText);
Assert.isTrue(checkArray(labelAndValues));
this.labelsAndValues = labelAndValues;
this.numColumns = numColumns;
this.useGroup = useGroup;
createControl(parent);
}
public DescriptionRadioGroupFieldEditor(String name, String labelText, int numColumns,
String[][] labelAndValues, Composite parent) {
this(name,labelText,numColumns,labelAndValues,parent,false);
}
@Override
protected void adjustForNumColumns(int numColumns) {
Control control = getLabelControl();
if (control != null) {
((GridData) control.getLayoutData()).horizontalSpan = numColumns;
}
((GridData) radioBox.getLayoutData()).horizontalSpan = numColumns;
}
/**
* Checks whether given <code>String[][]</code> is of "type"
* <code>String[][2]</code>.
* @param table
*
* @return <code>true</code> if it is ok, and <code>false</code> otherwise
*/
private boolean checkArray(String[][] table) {
if (table == null)
return false;
for (int i = 0; i < table.length; i++) {
String[] array = table[i];
if (array == null || array.length != 2)
return false;
}
return true;
}
/* (non-Javadoc)
* Method declared on FieldEditor.
*/
@Override
protected void doFillIntoGrid(Composite parent, int numColumns) {
if (useGroup) {
Control control = getRadioBoxControl(parent);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
control.setLayoutData(gd);
} else {
Control control = getLabelControl(parent);
GridData gd = new GridData();
gd.horizontalSpan = numColumns;
control.setLayoutData(gd);
control = getRadioBoxControl(parent);
gd = new GridData();
gd.horizontalSpan = numColumns;
gd.horizontalIndent = indent;
control.setLayoutData(gd);
}
}
/* (non-Javadoc)
* Method declared on FieldEditor.
*/
@Override
protected void doLoad() {
updateValue(getPreferenceStore().getString(getPreferenceName()));
}
/* (non-Javadoc)
* Method declared on FieldEditor.
*/
@Override
protected void doLoadDefault() {
updateValue(getPreferenceStore().getDefaultString(getPreferenceName()));
}
/* (non-Javadoc)
* Method declared on FieldEditor.
*/
@Override
protected void doStore() {
if (value == null) {
getPreferenceStore().setToDefault(getPreferenceName());
return;
}
getPreferenceStore().setValue(getPreferenceName(), value);
}
/* (non-Javadoc)
* Method declared on FieldEditor.
*/
@Override
public int getNumberOfControls() {
return 1;
}
/**
* Returns this field editor's radio group control.
* @param parent The parent to create the radioBox in
* @return the radio group control
*/
public Composite getRadioBoxControl(Composite parent) {
if (radioBox == null) {
Font font = parent.getFont();
if (useGroup) {
Group group = new Group(parent, SWT.NONE);
group.setFont(font);
String text = getLabelText();
if (text != null)
group.setText(text);
radioBox = group;
GridLayout layout = new GridLayout();
layout.horizontalSpacing = HORIZONTAL_GAP;
layout.numColumns = numColumns;
radioBox.setLayout(layout);
} else {
radioBox = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.marginWidth = 0;
layout.marginHeight = 0;
layout.horizontalSpacing = HORIZONTAL_GAP;
layout.numColumns = numColumns;
radioBox.setLayout(layout);
radioBox.setFont(font);
}
radioButtons = new Button[labelsAndValues.length];
for (int i = 0; i < labelsAndValues.length; i++) {
Button radio = new Button(radioBox, SWT.RADIO | SWT.LEFT);
radioButtons[i] = radio;
String[] labelAndValue = labelsAndValues[i];
radio.setText(labelAndValue[0]);
radio.setData(labelAndValue[1]);
radio.setFont(font);
radio.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
String oldValue = value;
value = (String) event.widget.getData();
setPresentsDefaultValue(false);
fireValueChanged(VALUE, oldValue, value);
if(descriptionChangedListener != null) {
descriptionChangedListener.descriptionChanged(value);
}
}
});
}
radioBox.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent event) {
radioBox = null;
radioButtons = null;
}
});
} else {
checkParent(radioBox, parent);
}
return radioBox;
}
/**
* Sets the indent used for the first column of the radion button matrix.
*
* @param indent the indent (in pixels)
*/
public void setIndent(int indent) {
if (indent < 0)
this.indent = 0;
else
this.indent = indent;
}
/**
* Select the radio button that conforms to the given value.
*
* @param selectedValue the selected value
*/
private void updateValue(String selectedValue) {
this.value = selectedValue;
if (radioButtons == null)
return;
if (this.value != null) {
boolean found = false;
for (int i = 0; i < radioButtons.length; i++) {
Button radio = radioButtons[i];
boolean selection = false;
if (((String) radio.getData()).equals(this.value)) {
selection = true;
found = true;
}
radio.setSelection(selection);
}
if (found)
return;
}
// We weren't able to find the value. So we select the first
// radio button as a default.
if (radioButtons.length > 0) {
radioButtons[0].setSelection(true);
this.value = (String) radioButtons[0].getData();
}
return;
}
/*
* @see FieldEditor.setEnabled(boolean,Composite).
*/
@Override
public void setEnabled(boolean enabled, Composite parent) {
if (!useGroup)
super.setEnabled(enabled, parent);
for (int i = 0; i < radioButtons.length; i++) {
radioButtons[i].setEnabled(enabled);
}
}
public void setDescriptionChangedListener (IDescriptionChangedListener listener) {
descriptionChangedListener = listener;
}
}