TableViewer с привязкой данных EMF и редактированием ячеек - близко, но не совсем

Я просматриваю инструкции Тома Шиндла по как добавить привязку данных EMF к таблицам, вот мой код для привязки данных:

protected DataBindingContext initDataBindings() {

    //going to use this person instead
    Person p = ProjectFactory.eINSTANCE.createPerson();
    p.setFirstName("tony");

    Committership c = ProjectFactory.eINSTANCE.createCommittership();
    c.setName("HELP");

    Committership anotherC = ProjectFactory.eINSTANCE.createCommittership();
    anotherC.setName("PELASE");

    Committership yetAnotherC = ProjectFactory.eINSTANCE.createCommittership();
    yetAnotherC.setName("EMERGENCY");

    p.getCommittership().add(c);
    p.getCommittership().add(anotherC);
    p.getCommittership().add(yetAnotherC);

    CommandStack cs = new BasicCommandStack();
    AdapterFactory af = new ProjectItemProviderAdapterFactory();
    EditingDomain editingDomain = new AdapterFactoryEditingDomain(af, cs);

    //data binding context
    DataBindingContext bindingContext = new DataBindingContext();
    //
    ObservableListContentProvider listContentProvider = new ObservableListContentProvider();
    IObservableMap[] attributeMap = new IObservableMap[1];
    attributeMap[0] = EMFEditProperties.value(
              editingDomain,
              FeaturePath.fromList(ProjectPackage.Literals.COMMITTERSHIP__NAME)
            ).observeDetail(listContentProvider.getKnownElements());

    TableViewerColumn column = new TableViewerColumn(tableViewer, SWT.NONE);
    column.getColumn().setText("First Name");
    column.getColumn().setWidth(200);
    column.setLabelProvider(new GenericMapCellLabelProvider("{0}", attributeMap));
    //tableViewer.setLabelProvider(new ObservableMapLabelProvider(attributeMap)); -- no need for this anymore
    tableViewer.setContentProvider(listContentProvider);

    //instead of giving it this list and doing it the non-EMF way
    IObservableList selfList = Properties.selfList(Person.class).observe(p.getCommittership());

    //property that you are looking for
    IListProperty prop = EMFEditProperties.list(editingDomain, ProjectPackage.Literals.PERSON__COMMITTERSHIP);
    IObservableValue master = EMFEditProperties.value(editingDomain, ProjectPackage.Literals.COMMITTERSHIP__NAME)
            .observe(p);

    /**this should not be returning null, instead it should be a
     *  list of the values from the person committership EList
     */
    IObservableList someList = prop.observeDetail(master);

    //set input requires and IObservableList!!
    tableViewer.setInput(someList);
    //
    return bindingContext;
}

Хорошо, теперь просто поговорим о том, что происходит и где я застрял.

эта строка здесь будет работать для привязки данных JFace: IObservableList selfList = Properties.selfList(Person.class).observe(p.getCommittership());

он счастливо заполняет таблицу, это список, содержащий трех человек, которых я добавил, хорошо.

теперь, когда он работает с привязкой данных EMF, я пытаюсь сделать это:

// свойство, которое вы ищете

IListProperty prop = EMFEditProperties.list(editingDomain, ProjectPackage.Literals.PERSON__COMMITTERSHIP);
IObservableValue master = EMFEditProperties.value(editingDomain, ProjectPackage.Literals.COMMITTERSHIP__NAME)
        .observe(p);

/**this should not be returning null, instead it should be a
 *  list of the values from the person committership EList
 */
IObservableList someList = prop.observeDetail(master);

проблема в том, что someList пуст и, следовательно, таблица не будет заполняться, может кто-нибудь объяснить, почему? Это определенно те три строки, которые имеют некоторые логические проблемы. Что мне действительно нужно, так это IObservableList наблюдаемых объектов EMF...

помощь будет очень признательна, так как учебник Шиндла не объясняет, откуда он взял мастера... Я думал, что создам мастера:

IObservableValue master = EMFEditProperties.value(editingDomain, ProjectPackage.Literals.COMMITTERSHIP__NAME)
                .observe(p);

и сделать prop.observeDetail(master)

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


person user2405469    schedule 24.10.2014    source источник


Ответы (1)


IObservableList listObservable = prop.observe(p);
tableViewer.setInput(listObservable);

Это исправило это для меня с точки зрения просмотра данных.

Что касается редактирования ячеек, то в итоге я сделал так:

public class CommittershipNameEditingSupport extends EditingSupport {

    private static TableViewer tableViewer;
    private final CellEditor editor;

    public CommittershipNameEditingSupport(TableViewer tableViewer) {
        super(tableViewer);
        this.tableViewer = tableViewer;
        this.editor = new TextCellEditor(tableViewer.getTable());
    }

    @Override
    protected CellEditor getCellEditor(Object element) {
        return editor;
    }

    @Override
    protected boolean canEdit(Object element) {
        return true;
    }

    @Override
    protected Object getValue(Object element) {
        return ((Committership) element).getName();
    }

    @Override
    protected void setValue(Object element, Object value) {
        ((Committership) element).setName(String.valueOf(value));
        tableViewer.update(element, null);
    }



}

и в главном представлении, где я создал столбец, я только что добавил метод поддержки редактирования ячеек... теперь он прекрасно работает :)

person user2405469    schedule 24.10.2014