/*
* This software is Copyright 2005,2006,2007,2008 Langdale Consultants.
* Langdale Consultants can be contacted at: http://www.langdale.com.au
*/
package au.com.langdale.ui.binding;
import org.eclipse.swt.widgets.Text;
import au.com.langdale.ui.builder.Assembly;
import au.com.langdale.ui.plumbing.Binding;
/**
* A text model and binding to a text control.
*/
public class TextBinding implements Binding, TextModel, AnyModel {
private String value;
private Validator validator;
private Text control;
private AnyModel parent;
private String lastSuggestion = "";
public TextBinding(Validator validator, String initial) {
this.validator = validator;
value = initial;
}
public TextBinding(Validator validator) {
this(validator, "");
}
public TextBinding() {
this(Validators.NONE);
}
public void bind(String name, Assembly plumbing, AnyModel parent) {
this.parent = parent;
bindAfter(name, plumbing, parent);
}
public void bindAfter(String name, Assembly plumbing, Object parent) {
control = (Text) plumbing.getControl(name);
plumbing.addBinding(this, parent);
}
public void bind(String name, Assembly plumbing) {
bind(name, plumbing, null);
}
public void setEnabled(boolean enabled) {
control.setEnabled(enabled);
}
private void applySuggestion() {
String suggestion = createSuggestion();
if( suggestion != null && ! suggestion.equals(lastSuggestion)) {
lastSuggestion = suggestion;
value = suggestion;
}
}
protected String createSuggestion() {
return lastSuggestion;
}
public String parentText() {
AnyModel parent = getParent();
Object parentRawValue = parent != null? parent.getValue(): "";
return parentRawValue != null? parentRawValue.toString(): "";
}
public AnyModel getParent() {
return parent;
}
public void refresh() {
if( !control.getText().equals(value))
control.setText(value);
}
public void reset() {
control.setText(createSuggestion());
}
public void update() {
value = control.getText().trim();
applySuggestion();
}
public String validate() {
if(control.isEnabled())
return validator.validate(value);
return null;
}
public String getText() {
return value;
}
public void setText(String value) {
this.value = value != null? value.trim(): "";
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
setText(value != null? value.toString(): null);
}
}