0

I am going through Tom Shindl's instructions on how to add EMF databinding on to tables, here is my code for the data binding:

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

ok, now just to talk through what is happening and where I am stuck.

this line here would work for JFace data binding: IObservableList selfList = Properties.selfList(Person.class).observe(p.getCommittership());

it populates the table happily, it is a list containing the three people I added, nice.

now making it work with EMF databinding, I am trying this:

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

the problem is that someList is empty and hence he table won't populate, could someone explain why? It is definitely those three line that have some logic problem in there. What I really want is an IObservableList of observed EMF objects...

help would be really appreciated, since Shindl's tutorial doesn't explain where he go the master from...I thought I would create a master:

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

and do prop.observeDetail(master)

but it is returning an empty list as I mentioned above...if only I could at least get it do display the data, the closest I have come is having three cells but not data in them.

greg-449
  • 102,836
  • 220
  • 90
  • 127
user2405469
  • 1,663
  • 1
  • 19
  • 41

1 Answers1

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

That fixed it for me in terms of viewing the data.

As for editing the cells, I did this in the end:

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



}

and in the main view where I craeted the column I just added the method for cell editing support...it works nicely now :)

user2405469
  • 1,663
  • 1
  • 19
  • 41