Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » EMF » [EMF Databinding] ObservableMapCellLabelProvider doesn't work well with unsettable features
[EMF Databinding] ObservableMapCellLabelProvider doesn't work well with unsettable features [message #557339] Mon, 06 September 2010 21:44 Go to next message
Michal Tkacz is currently offline Michal TkaczFriend
Messages: 105
Registered: July 2009
Senior Member
Hi,

I'm using ObservableListContentProvider together with
ObservableMapCellLabelProvider to populate a table with a list of
EObjects. E.g.:

ObservableListContentProvider contentProvider
= new ObservableListContentProvider();
viewer.setContentProvider(contentProvider);

TableViewerColumn nameColumn
= new TableViewerColumn(viewer, SWT.NONE);
nameColumn.getColumn().setText("Name");
nameColumn.setLabelProvider(
new ObservableMapCellLabelProvider(
EMFProperties.value(MyPackage.Literals.OBJECT__NAME)
.observeDetail(contentProvider.getKnownElements())));

TableViewerColumn typeColumn
= new TableViewerColumn(viewer, SWT.NONE);
typeColumn.getColumn().setText("Type");
typeColumn.setLabelProvider(
new ObservableMapCellLabelProvider(
EMFProperties.value(MyPackage.Literals.OBJECT__TYPE)
.observeDetail(contentProvider.getKnownElements())));

Problems begin when a primitive feature (including enums) is declared
unsettable. In that case I would expect the label provider to return ""
if the feature is unset. Instead it returns default value.

From what I understood returning default value from eGet when the
feature is unset is an expected behaviour (see "[EMF] Dynamic eGet for
unsettable attributes" thread). Also EMFValueProperty (which is returned
by EMFProperties.value() after being wrapped) simply follows this rule,
so probably I shouldn't expect it to return null if feature is unset,
should I? On the other hand the problem is not in
ObservableMapCellLabelProvider either, which doesn't know anything about
EMF.

I ended up wrapping the result of observeDetail() method like this:

TableViewerColumn typeColumn
= new TableViewerColumn(viewer, SWT.NONE);
typeColumn.getColumn().setText("Type");
typeColumn.setLabelProvider(
new ObservableMapCellLabelProvider(
new UnsettableObservableMap(MyPackage.Literals.OBJECT__TYPE,
EMFProperties.value(MyPackage.Literals.OBJECT__TYPE)
..observeDetail(contentProvider.getKnownElements()))));

where UnsettableObservableMap is defined as follows:

public class UnsettableObservableMap extends DecoratingObservableMap {

private final EStructuralFeature feature;

public UnsettableObservableMap(EStructuralFeature feature,
IObservableMap decorated) {
super(decorated, true);
this.feature = feature;
}

@Override
public Object get(Object key) {
if (!feature.isUnsettable() || ((EObject) key).eIsSet(feature))
return super.get(key);
else
return null;
}

}

But maybe there's a better way, what do you think?

Michal
Re: [EMF Databinding] ObservableMapCellLabelProvider doesn't work well with unsettable features [message #557485 is a reply to message #557339] Tue, 07 September 2010 16:13 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33237
Registered: July 2009
Senior Member
Michał,

Comments below.


Michał Tkacz wrote:
> Hi,
>
> I'm using ObservableListContentProvider together with
> ObservableMapCellLabelProvider to populate a table with a list of
> EObjects. E.g.:
>
> ObservableListContentProvider contentProvider
> = new ObservableListContentProvider();
> viewer.setContentProvider(contentProvider);
>
> TableViewerColumn nameColumn
> = new TableViewerColumn(viewer, SWT.NONE);
> nameColumn.getColumn().setText("Name");
> nameColumn.setLabelProvider(
> new ObservableMapCellLabelProvider(
> EMFProperties.value(MyPackage.Literals.OBJECT__NAME)
> .observeDetail(contentProvider.getKnownElements())));
>
> TableViewerColumn typeColumn
> = new TableViewerColumn(viewer, SWT.NONE);
> typeColumn.getColumn().setText("Type");
> typeColumn.setLabelProvider(
> new ObservableMapCellLabelProvider(
> EMFProperties.value(MyPackage.Literals.OBJECT__TYPE)
> .observeDetail(contentProvider.getKnownElements())));
>
> Problems begin when a primitive feature (including enums) is declared
> unsettable. In that case I would expect the label provider to return
> "" if the feature is unset. Instead it returns default value.
The label provider always returns a value based on what eGet returns...
>
> From what I understood returning default value from eGet when the
> feature is unset is an expected behaviour (see "[EMF] Dynamic eGet for
> unsettable attributes" thread).
No, a value is always returned.
> Also EMFValueProperty (which is returned by EMFProperties.value()
> after being wrapped) simply follows this rule, so probably I shouldn't
> expect it to return null if feature is unset, should I?
No.
> On the other hand the problem is not in ObservableMapCellLabelProvider
> either, which doesn't know anything about EMF.
>
> I ended up wrapping the result of observeDetail() method like this:
>
> TableViewerColumn typeColumn
> = new TableViewerColumn(viewer, SWT.NONE);
> typeColumn.getColumn().setText("Type");
> typeColumn.setLabelProvider(
> new ObservableMapCellLabelProvider(
> new UnsettableObservableMap(MyPackage.Literals.OBJECT__TYPE,
> EMFProperties.value(MyPackage.Literals.OBJECT__TYPE)
> .observeDetail(contentProvider.getKnownElements()))));
>
> where UnsettableObservableMap is defined as follows:
>
> public class UnsettableObservableMap extends DecoratingObservableMap {
>
> private final EStructuralFeature feature;
>
> public UnsettableObservableMap(EStructuralFeature feature,
> IObservableMap decorated) {
> super(decorated, true);
> this.feature = feature;
> }
>
> @Override
> public Object get(Object key) {
> if (!feature.isUnsettable() || ((EObject) key).eIsSet(feature))
> return super.get(key);
> else
> return null;
> }
>
> }
>
> But maybe there's a better way, what do you think?
Not really. Note that it's possible for an unsettable non-primitive
feature to be set to null so in that case you still won't be able to
distinguish the full state from just the value.
>
> Michal


Ed Merks
Professional Support: https://www.macromodeling.com/
Re: [EMF Databinding] ObservableMapCellLabelProvider doesn't work well with unsettable features [message #557600 is a reply to message #557485] Wed, 08 September 2010 09:10 Go to previous messageGo to next message
Michal Tkacz is currently offline Michal TkaczFriend
Messages: 105
Registered: July 2009
Senior Member
Thanks for the comments Ed. Actually I use unsettable only for enum
features. For other primitive types I simply use the non-primitive
counterpart, which gives me expected behaviour. Unfortunately there's no
such counterpart for enums.

Michal

On 09/07/2010 06:13 PM, Ed Merks wrote:
> Michał,
>
> Comments below.
>
>
> Michał Tkacz wrote:
>> Hi,
>>
>> I'm using ObservableListContentProvider together with
>> ObservableMapCellLabelProvider to populate a table with a list of
>> EObjects. E.g.:
>>
>> ObservableListContentProvider contentProvider
>> = new ObservableListContentProvider();
>> viewer.setContentProvider(contentProvider);
>>
>> TableViewerColumn nameColumn
>> = new TableViewerColumn(viewer, SWT.NONE);
>> nameColumn.getColumn().setText("Name");
>> nameColumn.setLabelProvider(
>> new ObservableMapCellLabelProvider(
>> EMFProperties.value(MyPackage.Literals.OBJECT__NAME)
>> .observeDetail(contentProvider.getKnownElements())));
>>
>> TableViewerColumn typeColumn
>> = new TableViewerColumn(viewer, SWT.NONE);
>> typeColumn.getColumn().setText("Type");
>> typeColumn.setLabelProvider(
>> new ObservableMapCellLabelProvider(
>> EMFProperties.value(MyPackage.Literals.OBJECT__TYPE)
>> .observeDetail(contentProvider.getKnownElements())));
>>
>> Problems begin when a primitive feature (including enums) is declared
>> unsettable. In that case I would expect the label provider to return
>> "" if the feature is unset. Instead it returns default value.
> The label provider always returns a value based on what eGet returns...
>>
>> From what I understood returning default value from eGet when the
>> feature is unset is an expected behaviour (see "[EMF] Dynamic eGet for
>> unsettable attributes" thread).
> No, a value is always returned.
>> Also EMFValueProperty (which is returned by EMFProperties.value()
>> after being wrapped) simply follows this rule, so probably I shouldn't
>> expect it to return null if feature is unset, should I?
> No.
>> On the other hand the problem is not in ObservableMapCellLabelProvider
>> either, which doesn't know anything about EMF.
>>
>> I ended up wrapping the result of observeDetail() method like this:
>>
>> TableViewerColumn typeColumn
>> = new TableViewerColumn(viewer, SWT.NONE);
>> typeColumn.getColumn().setText("Type");
>> typeColumn.setLabelProvider(
>> new ObservableMapCellLabelProvider(
>> new UnsettableObservableMap(MyPackage.Literals.OBJECT__TYPE,
>> EMFProperties.value(MyPackage.Literals.OBJECT__TYPE)
>> .observeDetail(contentProvider.getKnownElements()))));
>>
>> where UnsettableObservableMap is defined as follows:
>>
>> public class UnsettableObservableMap extends DecoratingObservableMap {
>>
>> private final EStructuralFeature feature;
>>
>> public UnsettableObservableMap(EStructuralFeature feature,
>> IObservableMap decorated) {
>> super(decorated, true);
>> this.feature = feature;
>> }
>> @Override
>> public Object get(Object key) {
>> if (!feature.isUnsettable() || ((EObject) key).eIsSet(feature))
>> return super.get(key);
>> else
>> return null;
>> }
>> }
>>
>> But maybe there's a better way, what do you think?
> Not really. Note that it's possible for an unsettable non-primitive
> feature to be set to null so in that case you still won't be able to
> distinguish the full state from just the value.
>>
>> Michal
Re: [EMF Databinding] ObservableMapCellLabelProvider doesn't work well with unsettable features [message #557680 is a reply to message #557600] Wed, 08 September 2010 13:52 Go to previous message
Ed Merks is currently offline Ed MerksFriend
Messages: 33237
Registered: July 2009
Senior Member
Michał,

You can define an EDataType with the generated enum's instance class
name and use that instead of the EEnum. The Java API will look the
same, but you'll be able to have null values.


Michał Tkacz wrote:
> Thanks for the comments Ed. Actually I use unsettable only for enum
> features. For other primitive types I simply use the non-primitive
> counterpart, which gives me expected behaviour. Unfortunately there's
> no such counterpart for enums.
>
> Michal
>
> On 09/07/2010 06:13 PM, Ed Merks wrote:
>> Michał,
>>
>> Comments below.
>>
>>
>> Michał Tkacz wrote:
>>> Hi,
>>>
>>> I'm using ObservableListContentProvider together with
>>> ObservableMapCellLabelProvider to populate a table with a list of
>>> EObjects. E.g.:
>>>
>>> ObservableListContentProvider contentProvider
>>> = new ObservableListContentProvider();
>>> viewer.setContentProvider(contentProvider);
>>>
>>> TableViewerColumn nameColumn
>>> = new TableViewerColumn(viewer, SWT.NONE);
>>> nameColumn.getColumn().setText("Name");
>>> nameColumn.setLabelProvider(
>>> new ObservableMapCellLabelProvider(
>>> EMFProperties.value(MyPackage.Literals.OBJECT__NAME)
>>> .observeDetail(contentProvider.getKnownElements())));
>>>
>>> TableViewerColumn typeColumn
>>> = new TableViewerColumn(viewer, SWT.NONE);
>>> typeColumn.getColumn().setText("Type");
>>> typeColumn.setLabelProvider(
>>> new ObservableMapCellLabelProvider(
>>> EMFProperties.value(MyPackage.Literals.OBJECT__TYPE)
>>> .observeDetail(contentProvider.getKnownElements())));
>>>
>>> Problems begin when a primitive feature (including enums) is declared
>>> unsettable. In that case I would expect the label provider to return
>>> "" if the feature is unset. Instead it returns default value.
>> The label provider always returns a value based on what eGet returns...
>>>
>>> From what I understood returning default value from eGet when the
>>> feature is unset is an expected behaviour (see "[EMF] Dynamic eGet for
>>> unsettable attributes" thread).
>> No, a value is always returned.
>>> Also EMFValueProperty (which is returned by EMFProperties.value()
>>> after being wrapped) simply follows this rule, so probably I shouldn't
>>> expect it to return null if feature is unset, should I?
>> No.
>>> On the other hand the problem is not in ObservableMapCellLabelProvider
>>> either, which doesn't know anything about EMF.
>>>
>>> I ended up wrapping the result of observeDetail() method like this:
>>>
>>> TableViewerColumn typeColumn
>>> = new TableViewerColumn(viewer, SWT.NONE);
>>> typeColumn.getColumn().setText("Type");
>>> typeColumn.setLabelProvider(
>>> new ObservableMapCellLabelProvider(
>>> new UnsettableObservableMap(MyPackage.Literals.OBJECT__TYPE,
>>> EMFProperties.value(MyPackage.Literals.OBJECT__TYPE)
>>> .observeDetail(contentProvider.getKnownElements()))));
>>>
>>> where UnsettableObservableMap is defined as follows:
>>>
>>> public class UnsettableObservableMap extends DecoratingObservableMap {
>>>
>>> private final EStructuralFeature feature;
>>>
>>> public UnsettableObservableMap(EStructuralFeature feature,
>>> IObservableMap decorated) {
>>> super(decorated, true);
>>> this.feature = feature;
>>> }
>>> @Override
>>> public Object get(Object key) {
>>> if (!feature.isUnsettable() || ((EObject) key).eIsSet(feature))
>>> return super.get(key);
>>> else
>>> return null;
>>> }
>>> }
>>>
>>> But maybe there's a better way, what do you think?
>> Not really. Note that it's possible for an unsettable non-primitive
>> feature to be set to null so in that case you still won't be able to
>> distinguish the full state from just the value.
>>>
>>> Michal
>


Ed Merks
Professional Support: https://www.macromodeling.com/
Previous Topic:[Teneo/CDO] install instructions
Next Topic:Using EMF reflective APIs to add to a list of Objects
Goto Forum:
  


Current Time: Mon Oct 21 10:16:48 GMT 2024

Powered by FUDForum. Page generated in 0.04827 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top