Хотя я не понимаю ваш аргумент о том, что вы не предоставляете клиенту упакованный виджет, здесь возможное решение.Виджет может предоставить WritableValue
, который может быть привязан напрямую через привязку данных клиентом.Это означает, что привязка проходит через 3 стороны: цель клиента, значение записи для переноса и источник SWT.Единственным недостатком является то, что у вас есть прямая зависимость от привязки данных в вашем виджете.Вот фрагмент кода.
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.observable.value.WritableValue;
import org.eclipse.jface.databinding.swt.ISWTObservableValue;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
public class SQLSegmentEditor extends Composite {
private final StyledText st;
private final WritableValue value = new WritableValue();
public SQLSegmentEditor(Composite parent, DataBindingContext ctx) {
super(parent, SWT.NONE);
assert ctx != null;
setLayout(new FillLayout());
st = new StyledText(this, SWT.WRAP | SWT.BORDER | SWT.V_SCROLL);
ISWTObservableValue swtBinding = WidgetProperties.text(SWT.Modify)
.observe(st);
ctx.bindValue(value, swtBinding);
}
public WritableValue getValue() {
return value;
}
}
Таким образом, код клиента будет выглядеть так:
DataBindingContext ctx = new DataBindingContext();
SQLSegmentEditor sqlSegmentEditor = new SQLSegmentEditor(getParent(), ctx);
IObservableValue modelObservable = //setup my model-observable
ctx.bindValue(modelObservable, sqlSegmentEditor.getValue());