具有EMF数据绑定和单元格编辑的TableViewer - 关闭但不完全

时间:2014-10-24 09:53:38

标签: eclipse-plugin eclipse-rcp eclipse-emf tableviewer eclipse-databinding

我正在通过Tom Shindl's instructions了解如何在表格中添加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对象......

帮助将非常感激,因为Shindl的教程没有解释他从哪里开始掌握...我想我会创建一个大师:

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

并执行prop.observeDetail(master)

但它正在返回一个空列表,如上所述...如果我至少可以让它显示数据,我最接近的就是有三个单元格而不是数据。

1 个答案:

答案 0 :(得分:0)

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);
    }



}

并且在主视图中,我只是添加了用于单元格编辑支持的方法,我刚刚添加了用于单元格编辑的方法...现在可以很好地工作了:)

相关问题