/*******************************************************************************
* Copyright (c) 2014 Bruno Medeiros and other Contributors.
* 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:
* Bruno Medeiros - initial API and implementation
*******************************************************************************/
package melnorme.util.swt.components.fields;
import static melnorme.utilbox.core.Assert.AssertNamespace.assertTrue;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import melnorme.util.swt.SWTLayoutUtil;
import melnorme.util.swt.SWTUtil;
import melnorme.util.swt.components.FieldWidget;
import melnorme.util.swt.components.LabelledFieldWidget;
import melnorme.utilbox.fields.IProperty;
public class ComboBoxField extends LabelledFieldWidget<Integer> {
protected final String[] valueLabels;
protected final String[] values;
protected Combo combo;
public ComboBoxField(String labelText, String[] labels, String[] values) {
super(labelText, Option_AllowNull.NO, 0);
this.valueLabels = labels;
this.values = values;
assertTrue(labels != null && values != null && labels.length == values.length);
assertTrue(labels.length > 0);
}
@Override
public int getPreferredLayoutColumns() {
return 2;
}
@Override
protected void createContents_all(Composite topControl) {
createContents_Label(topControl);
createContents_Combo(topControl);
}
@Override
protected void createContents_layout() {
SWTLayoutUtil.layout2Controls_spanLast(label, combo);
}
protected void createContents_Combo(Composite topControl) {
combo = createFieldCombo(this, topControl, SWT.SINGLE | SWT.READ_ONLY);
combo.setFont(topControl.getFont());
combo.setItems(valueLabels);
}
@Override
public Combo getFieldControl() {
return combo;
}
@Override
protected void doUpdateWidgetFromValue() {
int indexValue = getFieldValue();
if(indexValue == -1) {
return;
}
String label = valueLabels[indexValue];
combo.setText(label);
assertTrue(combo.getSelectionIndex() == indexValue);
}
public String getFieldStringValue() {
int indexValue = getFieldValue();
return getPrefValueFromIndex(indexValue);
}
protected String getPrefValueFromIndex(int index) {
return index == -1 ? "" : values[index];
}
public void setFieldStringValue(String stringValue) {
int indexValue = findIndexForStringValue(stringValue);
setFieldValue(indexValue);
}
protected int findIndexForStringValue(String stringValue) {
int index;
for (index = 0; index < values.length; index++) {
if(values[index].equals(stringValue)) {
return index;
}
}
return -1;
}
protected final IProperty<String> stringProperty = new IProperty<String>() {
@Override
public String get() {
return getFieldStringValue();
}
@Override
public void set(String value) {
setFieldStringValue(value);
}
};
public IProperty<String> asStringProperty() {
return stringProperty;
}
/* ----------------- ----------------- */
public static Combo createFieldCombo(final FieldWidget<Integer> field, Composite parent, int style) {
final Combo combo = new Combo(parent, style);
combo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
int selectionIndex = combo.getSelectionIndex();
field.setFieldValueFromControl(selectionIndex);
}
});
return combo;
}
@Override
protected void doSetEnabled(boolean enabled) {
SWTUtil.setEnabledIfOk(combo, enabled);
}
}