[EMF-Databinding] Observe addition/removal changes in multi-value feature of a multi-value feature [message #902114] |
Wed, 15 August 2012 18:38  |
Eclipse User |
|
|
|
Me again... :S
We want to observe element additions/removals from a list of a list of objects (like a double-nested multi-value feature)
We have a Model instance, this one has a multi-value feature, the objects from this feature was shown in a table. They have another multi-value feature inside that I want to observe.
Wrong code:
WritableValue writable = new WritableValue();
writable.setValue(model);
IObservableList observableSubElementList = EMFProperties.list(ModelPackage.Literals.MODEL__SUBELEMENTS).observeDetail(writable);
ObservableListContentProvider ocp = new ObservableListContentProvider();
tableViewer.setContentProvider(ocp);
table.setInput(observableSubElementList);
//One wrong possibility to observe changes in the SubList:
IObservableList observableSubSubElementList = EMFProperties.value(ModelPackage.Literals.SUBELEMENT__SUBSUBELEMENTS).observeDetail(observableSubElementList);
observableSubSubElementList.addListChangeListener(new IListChangeListener() {
@Override
public void handleListChange(ListChangeEvent event) {
//Do something
}
});
//Another wrong possibility to observe changes in the SubList:
IObservableList observableSubSubElementMap = EMFProperties.value(ModelPackage.Literals.SUBELEMENT__SUBSUBELEMENTS).observeDetail(ocp.getKnownElements());
observablePermissionList.addMapChangeListener(new IMapChangeListener() {
@Override
public void handleListChange(ListChangeEvent event) {
//Do something
}
});
The wrong code only observe changes if one list is replaced by other list (other Java object). It does not observe to the subelement additions or removals in any list.
I think we have to use not ObservableList/Map.value but ObservableList/Map.list:
IObservableList observableSubSubElementList = EMFProperties.list(ModelPackage.Literals.SUBELEMENT__SUBSUBELEMENTS) -> xxxxx -> observableSubElementList
xxxxx can be a method or a group of methods that I cannot find.
Any idea? Or maybe is it not possible?
[Updated on: Wed, 15 August 2012 18:41] by Moderator
|
|
|
|
|
Re: [EMF-Databinding] Observe addition/removal changes in multi-value feature of a multi-value featu [message #902190 is a reply to message #902187] |
Thu, 16 August 2012 05:32  |
Eclipse User |
|
|
|
http://tomsondev.bestsolution.at/2011/05/06/interesting-new-feature-in-emf-databinding/
Tom
Am 16.08.12 11:26, schrieb Paco Blanco:
> Thank for your answer, Tom. Can you say to me how to do "you can observe
> an index inside a list but this would mean your first list is has a
> fixed amount of items"? (with simple code snippet is enough :p)
>
> BTW, my aprroach to this problem is:
>
>
> private Map<Object, IObservableList> observablePermissionMap = new
> HashMap<Object,IObservableList>();
>
> method:
> .... WritableValue writable = new WritableValue();
> writable.setValue(model);
> IObservableList observableSubElementList =
> EMFProperties.list(ModelPackage.Literals.MODEL__SUBELEMENTS).observeDetail(writable);
>
> ObservableListContentProvider ocp = new ObservableListContentProvider();
> tableViewer.setContentProvider(ocp);
> table.setInput(observableSubElementList);
>
> observableSubElementList.addListChangeListener(new IListChangeListener() {
> @Override
> public void handleListChange(ListChangeEvent event) {
> for(final ListDiffEntry entry : event.diff.getDifferences()) {
> if(entry.isAddition()) {
> addObserverToMap((MySubSubElementClass) entry.getElement());
> } else if(observablePermissionMap.containsKey(entry.getElement())){
> observableList observable =
> observablePermissionMap.get(entry.getElement());
> observable.dispose();
> observablePermissionMap.remove(entry.getElement());
> }
> }
> }
> });
> for(final Object objectToObserve : observableSubElementList) {
> if(!observablePermissionMap.containsKey(objectToObserve)) {
> addObserveToUserPermission((MySubSubElementClass) objectToObserve);
> }
> }
> ... end method
>
> private void addObserveToMap(final MySubSubElementClass objectToObserve) {
> IObservableList observable =
> EMFProperties.list(ModelPackage.Literals.SUBELEMENT__SUBSUBELEMENTS).observe(objectToObserve);
>
> observable.addChangeListener(new IChangeListener() {
> @Override
> public void handleChange(ChangeEvent event) {
> //Do something, in my case:
> table.getTableViewer().update(objectToObserve,
> columnProperties);
> }
> });
> observablePermissionMap.put(objectToObserve, observable);
> }
>
|
|
|
Powered by
FUDForum. Page generated in 0.03528 seconds