Сделать настраиваемый виджет заметным? - PullRequest
1 голос
/ 23 сентября 2011

Я создал простой редактор выделения ключевых слов, он просто обернул виджет StyledText:

public class SQLSegmentEditor extends Composite {

    private StyledText st;

    public SQLSegmentEditor(Composite parent) {
        super(parent, SWT.NONE);
        this.setLayout(new FillLayout());
        st = new StyledText(this, SWT.WRAP | SWT.BORDER | SWT.V_SCROLL);
        st.addLineStyleListener(new SQLSegmentLineStyleListener());
    }

}

Как сделать так, чтобы его можно было использовать при привязке данных? Я ищу правильный путь, а не только тот, который заставляет его работать.

Я хочу наблюдать за содержимым внутреннего StyledText.

Например: я могу просто добавить метод getStyledText, чтобы вернуть упакованный виджет StyledText для использования его в привязке данных. Но это рискнет. Для правильного поведения редактора я должен оставить виджет StyledText невидимым для клиентского кода.

1 Ответ

3 голосов
/ 23 сентября 2011

Хотя я не понимаю ваш аргумент о том, что вы не предоставляете клиенту упакованный виджет, здесь возможное решение.Виджет может предоставить 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());
...